| Index: service/datastore/serialize/serialize.go | 
| diff --git a/service/datastore/serialize/serialize.go b/service/datastore/serialize/serialize.go | 
| index 88c887fc281cd8acd328b59337f909529e71b5c4..0c58fcae712ce249acf633e5d0b7d089c7d8a415 100644 | 
| --- a/service/datastore/serialize/serialize.go | 
| +++ b/service/datastore/serialize/serialize.go | 
| @@ -13,7 +13,6 @@ import ( | 
|  | 
| "github.com/luci/gae/service/blobstore" | 
| ds "github.com/luci/gae/service/datastore" | 
| -	"github.com/luci/gae/service/datastore/dskey" | 
| "github.com/luci/luci-go/common/cmpbin" | 
| ) | 
|  | 
| @@ -51,10 +50,10 @@ const ( | 
|  | 
| // WriteKey encodes a key to the buffer. If context is WithContext, then this | 
| // encoded value will include the appid and namespace of the key. | 
| -func WriteKey(buf Buffer, context KeyContext, k ds.Key) (err error) { | 
| +func WriteKey(buf Buffer, context KeyContext, k *ds.Key) (err error) { | 
| // [appid ++ namespace]? ++ [1 ++ token]* ++ NULL | 
| defer recoverTo(&err) | 
| -	appid, namespace, toks := dskey.Split(k) | 
| +	appid, namespace, toks := k.Split() | 
| if context == WithContext { | 
| panicIf(buf.WriteByte(1)) | 
| _, e := cmpbin.WriteString(buf, appid) | 
| @@ -75,7 +74,7 @@ func WriteKey(buf Buffer, context KeyContext, k ds.Key) (err error) { | 
| // the value of context that was passed to WriteKey when the key was encoded. | 
| // If context == WithoutContext, then the appid and namespace parameters are | 
| // used in the decoded Key. Otherwise they're ignored. | 
| -func ReadKey(buf Buffer, context KeyContext, appid, namespace string) (ret ds.Key, err error) { | 
| +func ReadKey(buf Buffer, context KeyContext, appid, namespace string) (ret *ds.Key, err error) { | 
| defer recoverTo(&err) | 
| actualCtx, e := buf.ReadByte() | 
| panicIf(e) | 
| @@ -117,7 +116,7 @@ func ReadKey(buf Buffer, context KeyContext, appid, namespace string) (ret ds.Ke | 
| toks = append(toks, tok) | 
| } | 
|  | 
| -	return dskey.NewToks(actualAid, actualNS, toks), nil | 
| +	return ds.NewKeyToks(actualAid, actualNS, toks), nil | 
| } | 
|  | 
| // WriteKeyTok writes a KeyTok to the buffer. You usually want WriteKey | 
| @@ -243,7 +242,7 @@ func WriteProperty(buf Buffer, context KeyContext, p ds.Property) (err error) { | 
| case ds.PTGeoPoint: | 
| err = WriteGeoPoint(buf, p.Value().(ds.GeoPoint)) | 
| case ds.PTKey: | 
| -		err = WriteKey(buf, context, p.Value().(ds.Key)) | 
| +		err = WriteKey(buf, context, p.Value().(*ds.Key)) | 
| case ds.PTBlobKey: | 
| _, err = cmpbin.WriteString(buf, string(p.Value().(blobstore.Key))) | 
| } | 
| @@ -375,7 +374,7 @@ func ReadPropertyMap(buf Buffer, context KeyContext, appid, namespace string) (p | 
| func WriteIndexColumn(buf Buffer, c ds.IndexColumn) (err error) { | 
| defer recoverTo(&err) | 
|  | 
| -	if c.Direction == ds.ASCENDING { | 
| +	if !c.Descending { | 
| panicIf(buf.WriteByte(0)) | 
| } else { | 
| panicIf(buf.WriteByte(1)) | 
| @@ -391,12 +390,7 @@ func ReadIndexColumn(buf Buffer) (c ds.IndexColumn, err error) { | 
| dir, err := buf.ReadByte() | 
| panicIf(err) | 
|  | 
| -	switch dir { | 
| -	case 0: | 
| -		c.Direction = ds.ASCENDING | 
| -	default: | 
| -		c.Direction = ds.DESCENDING | 
| -	} | 
| +	c.Descending = dir != 0 | 
| c.Property, _, err = cmpbin.ReadString(buf) | 
| return | 
| } | 
| @@ -464,7 +458,7 @@ func toBytesErr(i interface{}, ctx KeyContext) (ret []byte, err error) { | 
| case ds.IndexDefinition: | 
| err = WriteIndexDefinition(buf, x) | 
|  | 
| -	case ds.Key: | 
| +	case *ds.Key: | 
| err = WriteKey(buf, ctx, x) | 
|  | 
| case ds.KeyTok: | 
|  |