diff --git a/core/datastore.go b/core/datastore.go
index 30f92c8e8b31113af64694dd324f52eca0162b68..da73285f1ea29af2f096fc96cd3bccf4a0eadfc0 100644
--- a/core/datastore.go
+++ b/core/datastore.go
@@ -5,9 +5,12 @@ import (
 
 	ds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go"
 	fsds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/fs"
+	ktds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/keytransform"
 	lds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/leveldb"
 	syncds "github.com/jbenet/go-ipfs/Godeps/_workspace/src/github.com/jbenet/datastore.go/sync"
+
 	config "github.com/jbenet/go-ipfs/config"
+	u "github.com/jbenet/go-ipfs/util"
 )
 
 func makeDatastore(cfg config.Datastore) (ds.ThreadSafeDatastore, error) {
@@ -28,7 +31,8 @@ func makeDatastore(cfg config.Datastore) (ds.ThreadSafeDatastore, error) {
 		if err != nil {
 			return nil, err
 		}
-		return syncds.MutexWrap(d), nil
+		ktd := ktds.WrapDatastore(d, u.DsKeyB58Encode)
+		return syncds.MutexWrap(ktd), nil
 	}
 
 	return nil, fmt.Errorf("Unknown datastore type: %s", cfg.Type)
diff --git a/util/util.go b/util/util.go
index a22488372f10201a5affd81dcf82eed84708507e..767f05d409a2820ad5bbb612fb0b216497cf3e3a 100644
--- a/util/util.go
+++ b/util/util.go
@@ -55,14 +55,34 @@ func (k Key) Pretty() string {
 
 // DsKey returns a Datastore key
 func (k Key) DsKey() ds.Key {
-	return ds.NewKey(k.Pretty())
+	return ds.NewKey(string(k))
 }
 
 // KeyFromDsKey returns a Datastore key
 func KeyFromDsKey(dsk ds.Key) Key {
-	l := dsk.List()
-	enc := l[len(l)-1]
-	return Key(b58.Decode(enc))
+	return Key(dsk.BaseNamespace())
+}
+
+// DsKeyB58Encode returns a B58 encoded Datastore key
+// TODO: this is hacky because it encodes every path component. some
+// path components may be proper strings already...
+func DsKeyB58Encode(dsk ds.Key) ds.Key {
+	k := ds.NewKey("/")
+	for _, n := range dsk.Namespaces() {
+		k = k.Child(b58.Encode([]byte(n)))
+	}
+	return k
+}
+
+// DsKeyB58Decode returns a b58 decoded Datastore key
+// TODO: this is hacky because it encodes every path component. some
+// path components may be proper strings already...
+func DsKeyB58Decode(dsk ds.Key) ds.Key {
+	k := ds.NewKey("/")
+	for _, n := range dsk.Namespaces() {
+		k = k.Child(string(b58.Decode(n)))
+	}
+	return k
 }
 
 // Hash is the global IPFS hash function. uses multihash SHA2_256, 256 bits