diff --git a/blockservice/test/mock.go b/blockservice/test/mock.go
index c76c4d025..06d8e65ad 100644
--- a/blockservice/test/mock.go
+++ b/blockservice/test/mock.go
@@ -4,9 +4,9 @@ import (
 	. "github.com/ipfs/go-ipfs/blockservice"
 	bitswap "github.com/ipfs/go-ipfs/exchange/bitswap"
 	tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
 
 	delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 )
 
 // Mocks returns |n| connected mock Blockservices
diff --git a/core/commands/ipns.go b/core/commands/ipns.go
index f84ffbfb6..82837e522 100644
--- a/core/commands/ipns.go
+++ b/core/commands/ipns.go
@@ -8,8 +8,8 @@ import (
 	cmds "github.com/ipfs/go-ipfs/commands"
 	e "github.com/ipfs/go-ipfs/core/commands/e"
 	namesys "github.com/ipfs/go-ipfs/namesys"
-	offline "github.com/ipfs/go-ipfs/routing/offline"
 
+	offline "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline"
 	"gx/ipfs/QmceUdzxkimdYsgtX733uNgzf1DLHyBKN6ehGSp85ayppM/go-ipfs-cmdkit"
 )
 
diff --git a/core/core.go b/core/core.go
index 5f240243b..cd3b7adee 100644
--- a/core/core.go
+++ b/core/core.go
@@ -38,8 +38,6 @@ import (
 	pin "github.com/ipfs/go-ipfs/pin"
 	repo "github.com/ipfs/go-ipfs/repo"
 	config "github.com/ipfs/go-ipfs/repo/config"
-	nilrouting "github.com/ipfs/go-ipfs/routing/none"
-	offroute "github.com/ipfs/go-ipfs/routing/offline"
 	ft "github.com/ipfs/go-ipfs/unixfs"
 
 	addrutil "gx/ipfs/QmNSWW3Sb4eju4o2djPQ1L1c2Zj9XN9sMYJL8r1cbxdc6b/go-addr-util"
@@ -66,6 +64,8 @@ import (
 	smux "gx/ipfs/QmY9JXR3FupnYAYJWK9aMr9bCpqWKcToQ1tz8DVGTrHpHw/go-stream-muxer"
 	connmgr "gx/ipfs/QmZ1R2LxRZTUaeuMFEtQigzHfFCv3hLYBi5316aZ7YUeyf/go-libp2p-connmgr"
 	ipnet "gx/ipfs/QmZPrWxuM8GHr4cGKbyF5CCT11sFUP9hgqpeUHALvx2nUr/go-libp2p-interface-pnet"
+	nilrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/none"
+	offroute "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 	ic "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
 	ifconnmgr "gx/ipfs/Qmax8X1Kfahf5WfSB68EWDG3d3qyS3Sqs1v412fjPTfRwx/go-libp2p-interface-connmgr"
@@ -947,21 +947,21 @@ func startListening(ctx context.Context, host p2phost.Host, cfg *config.Config)
 	return nil
 }
 
-func constructDHTRouting(ctx context.Context, host p2phost.Host, dstore repo.Datastore) (routing.IpfsRouting, error) {
+func constructDHTRouting(ctx context.Context, host p2phost.Host, dstore ds.Batching) (routing.IpfsRouting, error) {
 	dhtRouting := dht.NewDHT(ctx, host, dstore)
 	dhtRouting.Validator[IpnsValidatorTag] = namesys.NewIpnsRecordValidator(host.Peerstore())
 	dhtRouting.Selector[IpnsValidatorTag] = namesys.IpnsSelectorFunc
 	return dhtRouting, nil
 }
 
-func constructClientDHTRouting(ctx context.Context, host p2phost.Host, dstore repo.Datastore) (routing.IpfsRouting, error) {
+func constructClientDHTRouting(ctx context.Context, host p2phost.Host, dstore ds.Batching) (routing.IpfsRouting, error) {
 	dhtRouting := dht.NewDHTClient(ctx, host, dstore)
 	dhtRouting.Validator[IpnsValidatorTag] = namesys.NewIpnsRecordValidator(host.Peerstore())
 	dhtRouting.Selector[IpnsValidatorTag] = namesys.IpnsSelectorFunc
 	return dhtRouting, nil
 }
 
-type RoutingOption func(context.Context, p2phost.Host, repo.Datastore) (routing.IpfsRouting, error)
+type RoutingOption func(context.Context, p2phost.Host, ds.Batching) (routing.IpfsRouting, error)
 
 type DiscoveryOption func(context.Context, p2phost.Host) (discovery.Service, error)
 
diff --git a/core/coreapi/name.go b/core/coreapi/name.go
index 8475d08fd..e99545acd 100644
--- a/core/coreapi/name.go
+++ b/core/coreapi/name.go
@@ -13,8 +13,8 @@ import (
 	keystore "github.com/ipfs/go-ipfs/keystore"
 	namesys "github.com/ipfs/go-ipfs/namesys"
 	ipath "github.com/ipfs/go-ipfs/path"
-	offline "github.com/ipfs/go-ipfs/routing/offline"
 
+	offline "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 	crypto "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
 )
diff --git a/exchange/bitswap/bitswap_test.go b/exchange/bitswap/bitswap_test.go
index 26fed27d1..854661670 100644
--- a/exchange/bitswap/bitswap_test.go
+++ b/exchange/bitswap/bitswap_test.go
@@ -12,12 +12,12 @@ import (
 	blocksutil "github.com/ipfs/go-ipfs/blocks/blocksutil"
 	decision "github.com/ipfs/go-ipfs/exchange/bitswap/decision"
 	tn "github.com/ipfs/go-ipfs/exchange/bitswap/testnet"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
 
 	delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay"
 	tu "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
 	travis "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil/ci/travis"
 	p2ptestutil "gx/ipfs/QmYVR3C8DWPHdHxvLtNFYfjsXgaRAdh6hPMNH3KiwCgu4o/go-libp2p-netutil"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
 	blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format"
 	detectrace "gx/ipfs/Qmf7HqcW7LtCi1W8y2bdx2eJpze74jkbKqpByxgXikdbLF/go-detect-race"
diff --git a/exchange/bitswap/testnet/network_test.go b/exchange/bitswap/testnet/network_test.go
index 4cb7551db..27f7edc69 100644
--- a/exchange/bitswap/testnet/network_test.go
+++ b/exchange/bitswap/testnet/network_test.go
@@ -7,10 +7,10 @@ import (
 
 	bsmsg "github.com/ipfs/go-ipfs/exchange/bitswap/message"
 	bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
 
 	delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay"
 	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 	blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format"
 )
diff --git a/exchange/bitswap/testnet/peernet.go b/exchange/bitswap/testnet/peernet.go
index effe1bfac..9997c4403 100644
--- a/exchange/bitswap/testnet/peernet.go
+++ b/exchange/bitswap/testnet/peernet.go
@@ -4,10 +4,11 @@ import (
 	"context"
 
 	bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
+
 	mockpeernet "gx/ipfs/QmNh1kGFFdsPu79KNSaL4NUKUPb4Eiz4KHdMtFY6664RDp/go-libp2p/p2p/net/mock"
 	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
 	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 )
 
diff --git a/exchange/bitswap/testnet/virtual.go b/exchange/bitswap/testnet/virtual.go
index 7e7ee185c..b8237a1b6 100644
--- a/exchange/bitswap/testnet/virtual.go
+++ b/exchange/bitswap/testnet/virtual.go
@@ -8,12 +8,12 @@ import (
 
 	bsmsg "github.com/ipfs/go-ipfs/exchange/bitswap/message"
 	bsnet "github.com/ipfs/go-ipfs/exchange/bitswap/network"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
 
 	delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay"
 	logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log"
 	routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing"
 	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 	ifconnmgr "gx/ipfs/Qmax8X1Kfahf5WfSB68EWDG3d3qyS3Sqs1v412fjPTfRwx/go-libp2p-interface-connmgr"
 	cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
diff --git a/exchange/reprovide/reprovide_test.go b/exchange/reprovide/reprovide_test.go
index 06c5c12aa..8a9b0c886 100644
--- a/exchange/reprovide/reprovide_test.go
+++ b/exchange/reprovide/reprovide_test.go
@@ -5,11 +5,12 @@ import (
 	"testing"
 
 	blockstore "github.com/ipfs/go-ipfs/blocks/blockstore"
-	mock "github.com/ipfs/go-ipfs/routing/mock"
+
 	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
 	dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync"
 	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
 	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
+	mock "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	blocks "gx/ipfs/Qmej7nf81hi2x2tvjRBF3mcp74sQyuDH4VMYDGd1YtXjb2/go-block-format"
 
 	. "github.com/ipfs/go-ipfs/exchange/reprovide"
diff --git a/fuse/ipns/ipns_test.go b/fuse/ipns/ipns_test.go
index f8faeb19e..ab1ba5aed 100644
--- a/fuse/ipns/ipns_test.go
+++ b/fuse/ipns/ipns_test.go
@@ -14,12 +14,12 @@ import (
 
 	core "github.com/ipfs/go-ipfs/core"
 	namesys "github.com/ipfs/go-ipfs/namesys"
-	offroute "github.com/ipfs/go-ipfs/routing/offline"
 
-	ci "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil/ci"
-	racedet "gx/ipfs/Qmf7HqcW7LtCi1W8y2bdx2eJpze74jkbKqpByxgXikdbLF/go-detect-race"
 	u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
+	ci "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil/ci"
+	offroute "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline"
 	fstest "gx/ipfs/QmaFNtBAXX4nVMQWbUqNysXyhevUj1k4B1y5uS45LC7Vw9/fuse/fs/fstestutil"
+	racedet "gx/ipfs/Qmf7HqcW7LtCi1W8y2bdx2eJpze74jkbKqpByxgXikdbLF/go-detect-race"
 )
 
 func maybeSkipFuseTests(t *testing.T) {
diff --git a/fuse/node/mount_test.go b/fuse/node/mount_test.go
index 7efb7cdc5..15a7bccc6 100644
--- a/fuse/node/mount_test.go
+++ b/fuse/node/mount_test.go
@@ -15,8 +15,9 @@ import (
 	ipns "github.com/ipfs/go-ipfs/fuse/ipns"
 	mount "github.com/ipfs/go-ipfs/fuse/mount"
 	namesys "github.com/ipfs/go-ipfs/namesys"
-	offroute "github.com/ipfs/go-ipfs/routing/offline"
+
 	ci "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil/ci"
+	offroute "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline"
 )
 
 func maybeSkipFuseTests(t *testing.T) {
diff --git a/namesys/ipns_validate_test.go b/namesys/ipns_validate_test.go
index 262b0711d..559a1b78a 100644
--- a/namesys/ipns_validate_test.go
+++ b/namesys/ipns_validate_test.go
@@ -7,7 +7,6 @@ import (
 	"time"
 
 	path "github.com/ipfs/go-ipfs/path"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
 
 	u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
 	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
@@ -18,6 +17,7 @@ import (
 	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
 	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
 	proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 	ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
 )
diff --git a/namesys/namesys_test.go b/namesys/namesys_test.go
index 2cd91c79f..e4f7af196 100644
--- a/namesys/namesys_test.go
+++ b/namesys/namesys_test.go
@@ -7,11 +7,11 @@ import (
 	context "context"
 
 	path "github.com/ipfs/go-ipfs/path"
-	offroute "github.com/ipfs/go-ipfs/routing/offline"
 	"github.com/ipfs/go-ipfs/unixfs"
 
 	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
 	dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync"
+	offroute "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/offline"
 	ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
 )
 
diff --git a/namesys/publisher_test.go b/namesys/publisher_test.go
index 7e28179bf..e7d2dd686 100644
--- a/namesys/publisher_test.go
+++ b/namesys/publisher_test.go
@@ -7,12 +7,12 @@ import (
 	"time"
 
 	path "github.com/ipfs/go-ipfs/path"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
 
 	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
 	dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync"
 	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
 	ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 	ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
 	dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help"
diff --git a/namesys/pubsub_test.go b/namesys/pubsub_test.go
index b8e6dbec3..e2cf15b5d 100644
--- a/namesys/pubsub_test.go
+++ b/namesys/pubsub_test.go
@@ -7,7 +7,6 @@ import (
 	"time"
 
 	path "github.com/ipfs/go-ipfs/path"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
 
 	p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host"
 	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
@@ -17,6 +16,7 @@ import (
 	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
 	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
 	netutil "gx/ipfs/QmYVR3C8DWPHdHxvLtNFYfjsXgaRAdh6hPMNH3KiwCgu4o/go-libp2p-netutil"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 	ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
 )
diff --git a/namesys/resolve_test.go b/namesys/resolve_test.go
index 17dab14af..a55d5a4d4 100644
--- a/namesys/resolve_test.go
+++ b/namesys/resolve_test.go
@@ -7,11 +7,11 @@ import (
 	"time"
 
 	path "github.com/ipfs/go-ipfs/path"
-	mockrouting "github.com/ipfs/go-ipfs/routing/mock"
-	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
 
 	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
 	dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync"
+	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
+	mockrouting "gx/ipfs/QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb/go-ipfs-routing/mock"
 	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
 )
 
diff --git a/package.json b/package.json
index 1657fc738..34d75d959 100644
--- a/package.json
+++ b/package.json
@@ -551,6 +551,12 @@
       "hash": "QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn",
       "name": "go-ipfs-ds-help",
       "version": "0.0.1"
+    },
+    {
+      "author": "hsanjuan",
+      "hash": "QmZRcGYvxdauCd7hHnMYLYqcZRaDjv24c7eUNyJojAcdBb",
+      "name": "go-ipfs-routing",
+      "version": "0.0.1"
     }
   ],
   "gxVersion": "0.10.0",
diff --git a/routing/mock/centralized_client.go b/routing/mock/centralized_client.go
deleted file mode 100644
index 985eb2814..000000000
--- a/routing/mock/centralized_client.go
+++ /dev/null
@@ -1,125 +0,0 @@
-package mockrouting
-
-import (
-	"context"
-	"errors"
-	"time"
-
-	u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
-	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
-	logging "gx/ipfs/QmRb5jh8z2E8hMGN2tkvs1yHynUanqnZ3UeKwgN1i9P1F8/go-log"
-	routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing"
-	dhtpb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb"
-	"gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
-	ma "gx/ipfs/QmWWQ2Txc2c6tqjsBpzg5Ar652cHPGNsQQp2SejkNmkUMb/go-multiaddr"
-	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
-	proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto"
-	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
-	cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
-	dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help"
-)
-
-var log = logging.Logger("mockrouter")
-
-type client struct {
-	datastore ds.Datastore
-	server    server
-	peer      testutil.Identity
-}
-
-// FIXME(brian): is this method meant to simulate putting a value into the network?
-func (c *client) PutValue(ctx context.Context, key string, val []byte) error {
-	log.Debugf("PutValue: %s", key)
-	rec := new(dhtpb.Record)
-	rec.Value = val
-	rec.Key = proto.String(string(key))
-	rec.TimeReceived = proto.String(u.FormatRFC3339(time.Now()))
-	data, err := proto.Marshal(rec)
-	if err != nil {
-		return err
-	}
-
-	return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data)
-}
-
-// FIXME(brian): is this method meant to simulate getting a value from the network?
-func (c *client) GetValue(ctx context.Context, key string) ([]byte, error) {
-	log.Debugf("GetValue: %s", key)
-	v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key)))
-	if err != nil {
-		return nil, err
-	}
-
-	data, ok := v.([]byte)
-	if !ok {
-		return nil, errors.New("could not cast value from datastore")
-	}
-
-	rec := new(dhtpb.Record)
-	err = proto.Unmarshal(data, rec)
-	if err != nil {
-		return nil, err
-	}
-
-	return rec.GetValue(), nil
-}
-
-func (c *client) GetValues(ctx context.Context, key string, count int) ([]routing.RecvdVal, error) {
-	log.Debugf("GetValues: %s", key)
-	data, err := c.GetValue(ctx, key)
-	if err != nil {
-		return nil, err
-	}
-
-	return []routing.RecvdVal{{Val: data, From: c.peer.ID()}}, nil
-}
-
-func (c *client) FindProviders(ctx context.Context, key *cid.Cid) ([]pstore.PeerInfo, error) {
-	return c.server.Providers(key), nil
-}
-
-func (c *client) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) {
-	log.Debugf("FindPeer: %s", pid)
-	return pstore.PeerInfo{}, nil
-}
-
-func (c *client) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo {
-	out := make(chan pstore.PeerInfo)
-	go func() {
-		defer close(out)
-		for i, p := range c.server.Providers(k) {
-			if max <= i {
-				return
-			}
-			select {
-			case out <- p:
-			case <-ctx.Done():
-				return
-			}
-		}
-	}()
-	return out
-}
-
-// Provide returns once the message is on the network. Value is not necessarily
-// visible yet.
-func (c *client) Provide(_ context.Context, key *cid.Cid, brd bool) error {
-	if !brd {
-		return nil
-	}
-	info := pstore.PeerInfo{
-		ID:    c.peer.ID(),
-		Addrs: []ma.Multiaddr{c.peer.Address()},
-	}
-	return c.server.Announce(info, key)
-}
-
-func (c *client) Ping(ctx context.Context, p peer.ID) (time.Duration, error) {
-	return 0, nil
-}
-
-func (c *client) Bootstrap(context.Context) error {
-	return nil
-}
-
-var _ routing.IpfsRouting = &client{}
diff --git a/routing/mock/centralized_server.go b/routing/mock/centralized_server.go
deleted file mode 100644
index b4263d1d2..000000000
--- a/routing/mock/centralized_server.go
+++ /dev/null
@@ -1,92 +0,0 @@
-package mockrouting
-
-import (
-	"context"
-	"math/rand"
-	"sync"
-	"time"
-
-	"gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
-
-	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
-	dssync "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore/sync"
-	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
-	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
-	cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
-)
-
-// server is the mockrouting.Client's private interface to the routing server
-type server interface {
-	Announce(pstore.PeerInfo, *cid.Cid) error
-	Providers(*cid.Cid) []pstore.PeerInfo
-
-	Server
-}
-
-// s is an implementation of the private server interface
-type s struct {
-	delayConf DelayConfig
-
-	lock      sync.RWMutex
-	providers map[string]map[peer.ID]providerRecord
-}
-
-type providerRecord struct {
-	Peer    pstore.PeerInfo
-	Created time.Time
-}
-
-func (rs *s) Announce(p pstore.PeerInfo, c *cid.Cid) error {
-	rs.lock.Lock()
-	defer rs.lock.Unlock()
-
-	k := c.KeyString()
-
-	_, ok := rs.providers[k]
-	if !ok {
-		rs.providers[k] = make(map[peer.ID]providerRecord)
-	}
-	rs.providers[k][p.ID] = providerRecord{
-		Created: time.Now(),
-		Peer:    p,
-	}
-	return nil
-}
-
-func (rs *s) Providers(c *cid.Cid) []pstore.PeerInfo {
-	rs.delayConf.Query.Wait() // before locking
-
-	rs.lock.RLock()
-	defer rs.lock.RUnlock()
-	k := c.KeyString()
-
-	var ret []pstore.PeerInfo
-	records, ok := rs.providers[k]
-	if !ok {
-		return ret
-	}
-	for _, r := range records {
-		if time.Since(r.Created) > rs.delayConf.ValueVisibility.Get() {
-			ret = append(ret, r.Peer)
-		}
-	}
-
-	for i := range ret {
-		j := rand.Intn(i + 1)
-		ret[i], ret[j] = ret[j], ret[i]
-	}
-
-	return ret
-}
-
-func (rs *s) Client(p testutil.Identity) Client {
-	return rs.ClientWithDatastore(context.Background(), p, dssync.MutexWrap(ds.NewMapDatastore()))
-}
-
-func (rs *s) ClientWithDatastore(_ context.Context, p testutil.Identity, datastore ds.Datastore) Client {
-	return &client{
-		peer:      p,
-		datastore: datastore,
-		server:    rs,
-	}
-}
diff --git a/routing/mock/centralized_test.go b/routing/mock/centralized_test.go
deleted file mode 100644
index b3f6c2926..000000000
--- a/routing/mock/centralized_test.go
+++ /dev/null
@@ -1,176 +0,0 @@
-package mockrouting
-
-import (
-	"context"
-	"testing"
-	"time"
-
-	u "gx/ipfs/QmNiJuT8Ja3hMVpBHXv3Q6dwmperaQ6JjLtpMQgMCD7xvx/go-ipfs-util"
-	delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay"
-	testutil "gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
-	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
-	cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
-)
-
-func TestKeyNotFound(t *testing.T) {
-
-	var pi = testutil.RandIdentityOrFatal(t)
-	var key = cid.NewCidV0(u.Hash([]byte("mock key")))
-	var ctx = context.Background()
-
-	rs := NewServer()
-	providers := rs.Client(pi).FindProvidersAsync(ctx, key, 10)
-	_, ok := <-providers
-	if ok {
-		t.Fatal("should be closed")
-	}
-}
-
-func TestClientFindProviders(t *testing.T) {
-	pi := testutil.RandIdentityOrFatal(t)
-	rs := NewServer()
-	client := rs.Client(pi)
-
-	k := cid.NewCidV0(u.Hash([]byte("hello")))
-	err := client.Provide(context.Background(), k, true)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	// This is bad... but simulating networks is hard
-	time.Sleep(time.Millisecond * 300)
-	max := 100
-
-	providersFromClient := client.FindProvidersAsync(context.Background(), k, max)
-	isInClient := false
-	for pi := range providersFromClient {
-		if pi.ID == pi.ID { // <-- typo?
-			isInClient = true
-		}
-	}
-	if !isInClient {
-		t.Fatal("Despite client providing key, client didn't receive peer when finding providers")
-	}
-}
-
-func TestClientOverMax(t *testing.T) {
-	rs := NewServer()
-	k := cid.NewCidV0(u.Hash([]byte("hello")))
-	numProvidersForHelloKey := 100
-	for i := 0; i < numProvidersForHelloKey; i++ {
-		pi := testutil.RandIdentityOrFatal(t)
-		err := rs.Client(pi).Provide(context.Background(), k, true)
-		if err != nil {
-			t.Fatal(err)
-		}
-	}
-
-	max := 10
-	pi := testutil.RandIdentityOrFatal(t)
-	client := rs.Client(pi)
-
-	providersFromClient := client.FindProvidersAsync(context.Background(), k, max)
-	i := 0
-	for range providersFromClient {
-		i++
-	}
-	if i != max {
-		t.Fatal("Too many providers returned")
-	}
-}
-
-// TODO does dht ensure won't receive self as a provider? probably not.
-func TestCanceledContext(t *testing.T) {
-	rs := NewServer()
-	k := cid.NewCidV0(u.Hash([]byte("hello")))
-
-	// avoid leaking goroutine, without using the context to signal
-	// (we want the goroutine to keep trying to publish on a
-	// cancelled context until we've tested it doesnt do anything.)
-	done := make(chan struct{})
-	defer func() { done <- struct{}{} }()
-
-	t.Log("async'ly announce infinite stream of providers for key")
-	i := 0
-	go func() { // infinite stream
-		for {
-			select {
-			case <-done:
-				t.Log("exiting async worker")
-				return
-			default:
-			}
-
-			pi, err := testutil.RandIdentity()
-			if err != nil {
-				t.Error(err)
-			}
-			err = rs.Client(pi).Provide(context.Background(), k, true)
-			if err != nil {
-				t.Error(err)
-			}
-			i++
-		}
-	}()
-
-	local := testutil.RandIdentityOrFatal(t)
-	client := rs.Client(local)
-
-	t.Log("warning: max is finite so this test is non-deterministic")
-	t.Log("context cancellation could simply take lower priority")
-	t.Log("and result in receiving the max number of results")
-	max := 1000
-
-	t.Log("cancel the context before consuming")
-	ctx, cancelFunc := context.WithCancel(context.Background())
-	cancelFunc()
-	providers := client.FindProvidersAsync(ctx, k, max)
-
-	numProvidersReturned := 0
-	for range providers {
-		numProvidersReturned++
-	}
-	t.Log(numProvidersReturned)
-
-	if numProvidersReturned == max {
-		t.Fatal("Context cancel had no effect")
-	}
-}
-
-func TestValidAfter(t *testing.T) {
-	ctx, cancel := context.WithCancel(context.Background())
-	defer cancel()
-
-	pi := testutil.RandIdentityOrFatal(t)
-	key := cid.NewCidV0(u.Hash([]byte("mock key")))
-	conf := DelayConfig{
-		ValueVisibility: delay.Fixed(1 * time.Hour),
-		Query:           delay.Fixed(0),
-	}
-
-	rs := NewServerWithDelay(conf)
-
-	rs.Client(pi).Provide(ctx, key, true)
-
-	var providers []pstore.PeerInfo
-	max := 100
-	providersChan := rs.Client(pi).FindProvidersAsync(ctx, key, max)
-	for p := range providersChan {
-		providers = append(providers, p)
-	}
-	if len(providers) > 0 {
-		t.Fail()
-	}
-
-	conf.ValueVisibility.Set(0)
-	time.Sleep(100 * time.Millisecond)
-
-	providersChan = rs.Client(pi).FindProvidersAsync(ctx, key, max)
-	t.Log("providers", providers)
-	for p := range providersChan {
-		providers = append(providers, p)
-	}
-	if len(providers) != 1 {
-		t.Fail()
-	}
-}
diff --git a/routing/mock/interface.go b/routing/mock/interface.go
deleted file mode 100644
index a4b198115..000000000
--- a/routing/mock/interface.go
+++ /dev/null
@@ -1,53 +0,0 @@
-// Package mockrouting provides a virtual routing server. To use it,
-// create a virtual routing server and use the Client() method to get a
-// routing client (IpfsRouting). The server quacks like a DHT but is
-// really a local in-memory hash table.
-package mockrouting
-
-import (
-	"context"
-
-	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
-	delay "gx/ipfs/QmRJVNatYJwTAHgdSM1Xef9QVQ1Ch3XHdmcrykjP5Y4soL/go-ipfs-delay"
-	routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing"
-	"gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
-	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
-)
-
-// Server provides mockrouting Clients
-type Server interface {
-	Client(p testutil.Identity) Client
-	ClientWithDatastore(context.Context, testutil.Identity, ds.Datastore) Client
-}
-
-// Client implements IpfsRouting
-type Client interface {
-	routing.IpfsRouting
-}
-
-// NewServer returns a mockrouting Server
-func NewServer() Server {
-	return NewServerWithDelay(DelayConfig{
-		ValueVisibility: delay.Fixed(0),
-		Query:           delay.Fixed(0),
-	})
-}
-
-// NewServerWithDelay returns a mockrouting Server with a delay!
-func NewServerWithDelay(conf DelayConfig) Server {
-	return &s{
-		providers: make(map[string]map[peer.ID]providerRecord),
-		delayConf: conf,
-	}
-}
-
-// DelayConfig can be used to configured the fake delays of a mock server.
-// Use with NewServerWithDelay().
-type DelayConfig struct {
-	// ValueVisibility is the time it takes for a value to be visible in the network
-	// FIXME there _must_ be a better term for this
-	ValueVisibility delay.D
-
-	// Query is the time it takes to receive a response from a routing query
-	Query delay.D
-}
diff --git a/routing/none/none_client.go b/routing/none/none_client.go
deleted file mode 100644
index aee2b281b..000000000
--- a/routing/none/none_client.go
+++ /dev/null
@@ -1,56 +0,0 @@
-// Package nilrouting implements a routing client that does nothing.
-package nilrouting
-
-import (
-	"context"
-	"errors"
-
-	repo "github.com/ipfs/go-ipfs/repo"
-
-	p2phost "gx/ipfs/QmNmJZL7FQySMtE2BQuLMuZg2EB2CLEunJJUSVSc9YnnbV/go-libp2p-host"
-	routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing"
-	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
-	peer "gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
-	cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
-)
-
-type nilclient struct {
-}
-
-func (c *nilclient) PutValue(_ context.Context, _ string, _ []byte) error {
-	return nil
-}
-
-func (c *nilclient) GetValue(_ context.Context, _ string) ([]byte, error) {
-	return nil, errors.New("tried GetValue from nil routing")
-}
-
-func (c *nilclient) GetValues(_ context.Context, _ string, _ int) ([]routing.RecvdVal, error) {
-	return nil, errors.New("tried GetValues from nil routing")
-}
-
-func (c *nilclient) FindPeer(_ context.Context, _ peer.ID) (pstore.PeerInfo, error) {
-	return pstore.PeerInfo{}, nil
-}
-
-func (c *nilclient) FindProvidersAsync(_ context.Context, _ *cid.Cid, _ int) <-chan pstore.PeerInfo {
-	out := make(chan pstore.PeerInfo)
-	defer close(out)
-	return out
-}
-
-func (c *nilclient) Provide(_ context.Context, _ *cid.Cid, _ bool) error {
-	return nil
-}
-
-func (c *nilclient) Bootstrap(_ context.Context) error {
-	return nil
-}
-
-// ConstructNilRouting creates an IpfsRouting client which does nothing.
-func ConstructNilRouting(_ context.Context, _ p2phost.Host, _ repo.Datastore) (routing.IpfsRouting, error) {
-	return &nilclient{}, nil
-}
-
-//  ensure nilclient satisfies interface
-var _ routing.IpfsRouting = &nilclient{}
diff --git a/routing/offline/offline.go b/routing/offline/offline.go
deleted file mode 100644
index cc525a06d..000000000
--- a/routing/offline/offline.go
+++ /dev/null
@@ -1,120 +0,0 @@
-// Package offline implements IpfsRouting with a client which
-// is only able to perform offline operations.
-package offline
-
-import (
-	"context"
-	"errors"
-	"time"
-
-	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
-	routing "gx/ipfs/QmTiWLZ6Fo5j4KcTVutZJ5KWRRJrbxzmxA4td8NfEdrPh7/go-libp2p-routing"
-	record "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record"
-	pb "gx/ipfs/QmUpttFinNDmNPgFwKN8sZK6BUtBmA68Y4KdSBDXa8t9sJ/go-libp2p-record/pb"
-	pstore "gx/ipfs/QmXauCuJzmzapetmC6W4TuDJLL1yFFrVzSHoWv8YdbmnxH/go-libp2p-peerstore"
-	proto "gx/ipfs/QmZ4Qi3GaRbjcx28Sme5eMH7RQjGkt8wHxt2a65oLaeFEV/gogo-protobuf/proto"
-	"gx/ipfs/QmZoWKhxUmZ2seW4BzX6fJkNR8hh9PsGModr7q171yq2SS/go-libp2p-peer"
-	ci "gx/ipfs/QmaPbCnUMBohSGo3KnxEa2bHqyJVVeEEcwtqJAYxerieBo/go-libp2p-crypto"
-	cid "gx/ipfs/QmcZfnkapfECQGcLZaf9B79NRg7cRa9EnZh4LSbkCzwNvY/go-cid"
-	dshelp "gx/ipfs/QmdQTPWduSeyveSxeCAte33M592isSW5Z979g81aJphrgn/go-ipfs-ds-help"
-)
-
-// ErrOffline is returned when trying to perform operations that
-// require connectivity.
-var ErrOffline = errors.New("routing system in offline mode")
-
-// NewOfflineRouter returns an IpfsRouting implementation which only performs
-// offline operations. It allows to Put and Get signed dht
-// records to and from the local datastore.
-func NewOfflineRouter(dstore ds.Datastore, privkey ci.PrivKey) routing.IpfsRouting {
-	return &offlineRouting{
-		datastore: dstore,
-		sk:        privkey,
-	}
-}
-
-// offlineRouting implements the IpfsRouting interface,
-// but only provides the capability to Put and Get signed dht
-// records to and from the local datastore.
-type offlineRouting struct {
-	datastore ds.Datastore
-	sk        ci.PrivKey
-}
-
-func (c *offlineRouting) PutValue(ctx context.Context, key string, val []byte) error {
-	rec, err := record.MakePutRecord(c.sk, key, val, false)
-	if err != nil {
-		return err
-	}
-	data, err := proto.Marshal(rec)
-	if err != nil {
-		return err
-	}
-
-	return c.datastore.Put(dshelp.NewKeyFromBinary([]byte(key)), data)
-}
-
-func (c *offlineRouting) GetValue(ctx context.Context, key string) ([]byte, error) {
-	v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key)))
-	if err != nil {
-		return nil, err
-	}
-
-	byt, ok := v.([]byte)
-	if !ok {
-		return nil, errors.New("value stored in datastore not []byte")
-	}
-	rec := new(pb.Record)
-	err = proto.Unmarshal(byt, rec)
-	if err != nil {
-		return nil, err
-	}
-
-	return rec.GetValue(), nil
-}
-
-func (c *offlineRouting) GetValues(ctx context.Context, key string, _ int) ([]routing.RecvdVal, error) {
-	v, err := c.datastore.Get(dshelp.NewKeyFromBinary([]byte(key)))
-	if err != nil {
-		return nil, err
-	}
-
-	byt, ok := v.([]byte)
-	if !ok {
-		return nil, errors.New("value stored in datastore not []byte")
-	}
-	rec := new(pb.Record)
-	err = proto.Unmarshal(byt, rec)
-	if err != nil {
-		return nil, err
-	}
-
-	return []routing.RecvdVal{
-		{Val: rec.GetValue()},
-	}, nil
-}
-
-func (c *offlineRouting) FindPeer(ctx context.Context, pid peer.ID) (pstore.PeerInfo, error) {
-	return pstore.PeerInfo{}, ErrOffline
-}
-
-func (c *offlineRouting) FindProvidersAsync(ctx context.Context, k *cid.Cid, max int) <-chan pstore.PeerInfo {
-	out := make(chan pstore.PeerInfo)
-	close(out)
-	return out
-}
-
-func (c *offlineRouting) Provide(_ context.Context, k *cid.Cid, _ bool) error {
-	return ErrOffline
-}
-
-func (c *offlineRouting) Ping(ctx context.Context, p peer.ID) (time.Duration, error) {
-	return 0, ErrOffline
-}
-
-func (c *offlineRouting) Bootstrap(context.Context) error {
-	return nil
-}
-
-// ensure offlineRouting matches the IpfsRouting interface
-var _ routing.IpfsRouting = &offlineRouting{}
diff --git a/routing/offline/offline_test.go b/routing/offline/offline_test.go
deleted file mode 100644
index 66d851700..000000000
--- a/routing/offline/offline_test.go
+++ /dev/null
@@ -1,82 +0,0 @@
-package offline
-
-import (
-	"bytes"
-	"context"
-	"testing"
-
-	ds "gx/ipfs/QmPpegoMqhAEqjncrzArm7KVWAkCm78rqL2DPuNjhPrshg/go-datastore"
-	"gx/ipfs/QmVvkK7s5imCiq3JVbL3pGfnhcCnf3LrFJPF4GE2sAoGZf/go-testutil"
-)
-
-func TestOfflineRouterStorage(t *testing.T) {
-	ctx := context.Background()
-
-	nds := ds.NewMapDatastore()
-	privkey, _, _ := testutil.RandTestKeyPair(128)
-	offline := NewOfflineRouter(nds, privkey)
-
-	if err := offline.PutValue(ctx, "key", []byte("testing 1 2 3")); err != nil {
-		t.Fatal(err)
-	}
-
-	val, err := offline.GetValue(ctx, "key")
-	if err != nil {
-		t.Fatal(err)
-	}
-	if !bytes.Equal([]byte("testing 1 2 3"), val) {
-		t.Fatal("OfflineRouter does not properly store")
-	}
-
-	_, err = offline.GetValue(ctx, "notHere")
-	if err == nil {
-		t.Fatal("Router should throw errors for unfound records")
-	}
-
-	recVal, err := offline.GetValues(ctx, "key", 0)
-	if err != nil {
-		t.Fatal(err)
-	}
-
-	_, err = offline.GetValues(ctx, "notHere", 0)
-	if err == nil {
-		t.Fatal("Router should throw errors for unfound records")
-	}
-
-	local := recVal[0].Val
-	if !bytes.Equal([]byte("testing 1 2 3"), local) {
-		t.Fatal("OfflineRouter does not properly store")
-	}
-}
-
-func TestOfflineRouterLocal(t *testing.T) {
-	ctx := context.Background()
-
-	nds := ds.NewMapDatastore()
-	privkey, _, _ := testutil.RandTestKeyPair(128)
-	offline := NewOfflineRouter(nds, privkey)
-
-	id, _ := testutil.RandPeerID()
-	_, err := offline.FindPeer(ctx, id)
-	if err != ErrOffline {
-		t.Fatal("OfflineRouting should alert that its offline")
-	}
-
-	cid, _ := testutil.RandCidV0()
-	pChan := offline.FindProvidersAsync(ctx, cid, 1)
-	p, ok := <-pChan
-	if ok {
-		t.Fatalf("FindProvidersAsync did not return a closed channel. Instead we got %+v !", p)
-	}
-
-	cid, _ = testutil.RandCidV0()
-	err = offline.Provide(ctx, cid, true)
-	if err != ErrOffline {
-		t.Fatal("OfflineRouting should alert that its offline")
-	}
-
-	err = offline.Bootstrap(ctx)
-	if err != nil {
-		t.Fatal("You shouldn't be able to bootstrap offline routing.")
-	}
-}