| Index: service/datastore/pls_impl.go
 | 
| diff --git a/service/datastore/pls_impl.go b/service/datastore/pls_impl.go
 | 
| index 6e2f2b651ec749616584736db01a8d46078831e7..fb39abcf167945f0cf348db29d85bf61d2e42eac 100644
 | 
| --- a/service/datastore/pls_impl.go
 | 
| +++ b/service/datastore/pls_impl.go
 | 
| @@ -142,9 +142,6 @@ func loadInner(codec *structCodec, structValue reflect.Value, index int, name st
 | 
|  		}
 | 
|  	} else {
 | 
|  		knd := v.Kind()
 | 
| -		if v.Type().Implements(typeOfKey) {
 | 
| -			knd = reflect.Interface
 | 
| -		}
 | 
|  
 | 
|  		project := PTNull
 | 
|  		overflow := (func(interface{}) bool)(nil)
 | 
| @@ -165,10 +162,10 @@ func loadInner(codec *structCodec, structValue reflect.Value, index int, name st
 | 
|  			project = PTFloat
 | 
|  			overflow = func(x interface{}) bool { return v.OverflowFloat(x.(float64)) }
 | 
|  			set = func(x interface{}) { v.SetFloat(x.(float64)) }
 | 
| -		case reflect.Interface:
 | 
| +		case reflect.Ptr:
 | 
|  			project = PTKey
 | 
|  			set = func(x interface{}) {
 | 
| -				if k, ok := x.(Key); ok {
 | 
| +				if k, ok := x.(*Key); ok {
 | 
|  					v.Set(reflect.ValueOf(k))
 | 
|  				}
 | 
|  			}
 | 
| @@ -488,11 +485,9 @@ func getStructCodecLocked(t reflect.Type) (c *structCodec) {
 | 
|  				st.isSlice = ft.Elem().Kind() != reflect.Uint8
 | 
|  				c.hasSlice = c.hasSlice || st.isSlice
 | 
|  			case reflect.Interface:
 | 
| -				if ft != typeOfKey {
 | 
| -					c.problem = me("field %q has non-concrete interface type %s",
 | 
| -						f.Name, f.Type)
 | 
| -					return
 | 
| -				}
 | 
| +				c.problem = me("field %q has non-concrete interface type %s",
 | 
| +					f.Name, f.Type)
 | 
| +				return
 | 
|  			}
 | 
|  		}
 | 
|  
 | 
| 
 |