diff --git a/namesys/routing.go b/namesys/routing.go
index 67d96f1f631a7c807a18496dcbfdff5701eab48f..4a9756d00e0046d5b1b92c03edcea1a9a80861af 100644
--- a/namesys/routing.go
+++ b/namesys/routing.go
@@ -7,8 +7,6 @@ import (
 	mh "github.com/ipfs/go-ipfs/Godeps/_workspace/src/github.com/jbenet/go-multihash"
 	"github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
 	pb "github.com/ipfs/go-ipfs/namesys/internal/pb"
-	ci "github.com/ipfs/go-ipfs/p2p/crypto"
-	peer "github.com/ipfs/go-ipfs/p2p/peer"
 	routing "github.com/ipfs/go-ipfs/routing"
 	u "github.com/ipfs/go-ipfs/util"
 )
@@ -65,31 +63,9 @@ func (r *routingResolver) Resolve(ctx context.Context, name string) (u.Key, erro
 	}
 
 	// name should be a public key retrievable from ipfs
-	// /ipfs/<name>
-	var pubkey ci.PubKey
-	if dht, ok := r.routing.(routing.PubKeyFetcher); ok {
-		// If we have a DHT as our routing system, use optimized fetcher
-		pk, err := dht.GetPublicKey(ctx, peer.ID(hash))
-		if err != nil {
-			log.Warning("RoutingResolve PubKey Get failed.")
-			return "", err
-		}
-		pubkey = pk
-	} else {
-		key := u.Key("/pk/" + string(hash))
-		pkval, err := r.routing.GetValue(ctx, key)
-		if err != nil {
-			log.Warning("RoutingResolve PubKey Get failed.")
-			return "", err
-		}
-
-		// get PublicKey from node.Data
-		pk, err := ci.UnmarshalPublicKey(pkval)
-		if err != nil {
-			return "", err
-		}
-
-		pubkey = pk
+	pubkey, err := routing.GetPublicKey(r.routing, ctx, hash)
+	if err != nil {
+		return "", err
 	}
 
 	hsh, _ := pubkey.Hash()
diff --git a/routing/dht/records.go b/routing/dht/records.go
index 3d563ab57255df6c16fae457f88724941d41a7fe..973ceca96b94faf1cc9d55253de86bf0f59b80bd 100644
--- a/routing/dht/records.go
+++ b/routing/dht/records.go
@@ -6,18 +6,12 @@ import (
 	"github.com/ipfs/go-ipfs/Godeps/_workspace/src/golang.org/x/net/context"
 	ci "github.com/ipfs/go-ipfs/p2p/crypto"
 	peer "github.com/ipfs/go-ipfs/p2p/peer"
+	routing "github.com/ipfs/go-ipfs/routing"
 	pb "github.com/ipfs/go-ipfs/routing/dht/pb"
 	record "github.com/ipfs/go-ipfs/routing/record"
-	u "github.com/ipfs/go-ipfs/util"
 	ctxutil "github.com/ipfs/go-ipfs/util/ctx"
 )
 
-// KeyForPublicKey returns the key used to retrieve public keys
-// from the dht.
-func KeyForPublicKey(id peer.ID) u.Key {
-	return u.Key("/pk/" + string(id))
-}
-
 func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, error) {
 	log.Debugf("getPublicKey for: %s", p)
 
@@ -40,7 +34,7 @@ func (dht *IpfsDHT) GetPublicKey(ctx context.Context, p peer.ID) (ci.PubKey, err
 
 	// last ditch effort: let's try the dht.
 	log.Debugf("pk for %s not in peerstore, and peer failed. trying dht.", p)
-	pkkey := KeyForPublicKey(p)
+	pkkey := routing.KeyForPublicKey(p)
 
 	val, err := dht.GetValue(ctxT, pkkey)
 	if err != nil {
@@ -65,7 +59,7 @@ func (dht *IpfsDHT) getPublicKeyFromNode(ctx context.Context, p peer.ID) (ci.Pub
 		return pk, nil
 	}
 
-	pkkey := KeyForPublicKey(p)
+	pkkey := routing.KeyForPublicKey(p)
 	pmes, err := dht.getValueSingle(ctx, p, pkkey)
 	if err != nil {
 		return nil, err
diff --git a/routing/routing.go b/routing/routing.go
index b85b25e2247a0b9160e3387774fca1a806b1c811..c94d813ae7af510d07d57e4c4fddc5227cd5c4d5 100644
--- a/routing/routing.go
+++ b/routing/routing.go
@@ -51,3 +51,25 @@ type IpfsRouting interface {
 type PubKeyFetcher interface {
 	GetPublicKey(context.Context, peer.ID) (ci.PubKey, error)
 }
+
+// KeyForPublicKey returns the key used to retrieve public keys
+// from the dht.
+func KeyForPublicKey(id peer.ID) u.Key {
+	return u.Key("/pk/" + string(id))
+}
+
+func GetPublicKey(r IpfsRouting, ctx context.Context, pkhash []byte) (ci.PubKey, error) {
+	if dht, ok := r.(PubKeyFetcher); ok {
+		// If we have a DHT as our routing system, use optimized fetcher
+		return dht.GetPublicKey(ctx, peer.ID(pkhash))
+	} else {
+		key := u.Key("/pk/" + string(pkhash))
+		pkval, err := r.GetValue(ctx, key)
+		if err != nil {
+			return nil, err
+		}
+
+		// get PublicKey from node.Data
+		return ci.UnmarshalPublicKey(pkval)
+	}
+}