diff --git a/worker/export.go b/worker/export.go
index b8a25875b88f8885ffa384766e2d72b9e15f8ee7..b9a5468ed952219e5560ff76b623327d849fdfeb 100644
--- a/worker/export.go
+++ b/worker/export.go
@@ -163,6 +163,12 @@ func toSchema(buf *bytes.Buffer, s *skv) {
 	if s.schema.Count {
 		buf.WriteString(" @count")
 	}
+	if s.schema.Lang {
+		buf.WriteString(" @lang")
+	}
+	if s.schema.Upsert {
+		buf.WriteString(" @upsert")
+	}
 	buf.WriteString(" . \n")
 }
 
diff --git a/worker/export_test.go b/worker/export_test.go
index 9dcf34540fa4510e42f6243d92ad0c3d19714a27..e85231505d69b257c2b6168fabee2d6ce9ace36c 100644
--- a/worker/export_test.go
+++ b/worker/export_test.go
@@ -9,6 +9,7 @@ package worker
 
 import (
 	"bufio"
+	"bytes"
 	"compress/gzip"
 	"io/ioutil"
 	"math"
@@ -220,6 +221,49 @@ func TestExport(t *testing.T) {
 	require.Equal(t, 1, count)
 }
 
+func TestToSchema(t *testing.T) {
+	testCases := []struct {
+		skv      *skv
+		expected string
+	}{
+		{
+			skv: &skv{
+				attr: "Alice",
+				schema: &intern.SchemaUpdate{
+					Predicate: "mother",
+					ValueType: intern.Posting_STRING,
+					Directive: intern.SchemaUpdate_REVERSE,
+					List:      false,
+					Count:     true,
+					Upsert:    true,
+					Lang:      true,
+				},
+			},
+			expected: "Alice:string @reverse @count @lang @upsert . \n",
+		},
+		{
+			skv: &skv{
+				attr: "Alice:best",
+				schema: &intern.SchemaUpdate{
+					Predicate: "mother",
+					ValueType: intern.Posting_STRING,
+					Directive: intern.SchemaUpdate_REVERSE,
+					List:      false,
+					Count:     false,
+					Upsert:    false,
+					Lang:      true,
+				},
+			},
+			expected: "<Alice:best>:string @reverse @lang . \n",
+		},
+	}
+	for _, testCase := range testCases {
+		buf := new(bytes.Buffer)
+		toSchema(buf, testCase.skv)
+		require.Equal(t, testCase.expected, buf.String())
+	}
+}
+
 // func generateBenchValues() []kv {
 // 	byteInt := make([]byte, 4)
 // 	binary.LittleEndian.PutUint32(byteInt, 123)