diff --git a/cmd/ipfs/daemon.go b/cmd/ipfs/daemon.go
index c1a4dd1df78ba48ef28c8adb238c2e7f0dedf1c6..7f13278636d0fb7d9fa970359c8e4e1a35d0a961 100644
--- a/cmd/ipfs/daemon.go
+++ b/cmd/ipfs/daemon.go
@@ -43,6 +43,7 @@ const (
 	offlineKwd                = "offline"
 	routingOptionKwd          = "routing"
 	routingOptionSupernodeKwd = "supernode"
+	routingOptionDHTClientKwd = "dhtclient"
 	unencryptTransportKwd     = "disable-transport-encryption"
 	unrestrictedApiAccessKwd  = "unrestricted-api"
 	writableKwd               = "writable"
@@ -120,6 +121,17 @@ environment variable:
 
     export IPFS_PATH=/path/to/ipfsrepo
 
+Routing
+
+IPFS by default will use a DHT for content routing. There is a highly
+experimental alternative that operates the DHT in a 'client only' mode that can
+be enabled by running the daemon as:
+
+    ipfs daemon --routing=dhtclient
+
+This will later be transitioned into a config option once it gets out of the
+'experimental' stage.
+
 DEPRECATION NOTICE
 
 Previously, IPFS used an environment variable as seen below:
@@ -286,7 +298,8 @@ func daemonFunc(req cmds.Request, res cmds.Response) {
 		res.SetError(err, cmds.ErrNormal)
 		return
 	}
-	if routingOption == routingOptionSupernodeKwd {
+	switch routingOption {
+	case routingOptionSupernodeKwd:
 		servers, err := cfg.SupernodeRouting.ServerIPFSAddrs()
 		if err != nil {
 			res.SetError(err, cmds.ErrNormal)
@@ -302,6 +315,8 @@ func daemonFunc(req cmds.Request, res cmds.Response) {
 		}
 
 		ncfg.Routing = corerouting.SupernodeClient(infos...)
+	case routingOptionDHTClientKwd:
+		ncfg.Routing = core.DHTClientOption
 	}
 
 	node, err := core.NewNode(req.Context(), ncfg)
diff --git a/core/core.go b/core/core.go
index 95c2c98eb5a080c0f6018e9730f76f5e0630b572..13d743742a46c616fe62b83bd7be9202c01c685c 100644
--- a/core/core.go
+++ b/core/core.go
@@ -646,9 +646,17 @@ func constructDHTRouting(ctx context.Context, host p2phost.Host, dstore repo.Dat
 	return dhtRouting, nil
 }
 
+func constructClientDHTRouting(ctx context.Context, host p2phost.Host, dstore repo.Datastore) (routing.IpfsRouting, error) {
+	dhtRouting := dht.NewDHTClient(ctx, host, dstore)
+	dhtRouting.Validator[IpnsValidatorTag] = namesys.IpnsRecordValidator
+	dhtRouting.Selector[IpnsValidatorTag] = namesys.IpnsSelectorFunc
+	return dhtRouting, nil
+}
+
 type RoutingOption func(context.Context, p2phost.Host, repo.Datastore) (routing.IpfsRouting, error)
 
 type DiscoveryOption func(context.Context, p2phost.Host) (discovery.Service, error)
 
 var DHTOption RoutingOption = constructDHTRouting
+var DHTClientOption RoutingOption = constructClientDHTRouting
 var NilRouterOption RoutingOption = nilrouting.ConstructNilRouting
diff --git a/package.json b/package.json
index ceaa596f3a30cf1b5ce88ecc6488991557215b64..2af68a31bc7ca4d502bac769cd88858ec54d1a64 100644
--- a/package.json
+++ b/package.json
@@ -52,9 +52,9 @@
       "version": "0.1.0"
     },
     {
-      "hash": "Qma1FrGRasghpuETfCtsKdFtXKQffpNnakv3wG3QaMwCVi",
+      "hash": "QmPxBCkNrrtx5cmg62TxiE3JUM2zTqTpps3diQ9PgNrcgn",
       "name": "iptb",
-      "version": "1.0.0"
+      "version": "1.1.0"
     },
     {
       "hash": "QmYf7ng2hG5XBtJA3tN34DQ2GUN5HNksEw1rLDkmr6vGku",
diff --git a/test/sharness/t0131-multinode-client-routing.sh b/test/sharness/t0131-multinode-client-routing.sh
new file mode 100755
index 0000000000000000000000000000000000000000..255bc9e33071d69b19f4078a32ebda68e9bd3d47
--- /dev/null
+++ b/test/sharness/t0131-multinode-client-routing.sh
@@ -0,0 +1,73 @@
+#!/bin/sh
+#
+# Copyright (c) 2015 Jeromy Johnson
+# MIT Licensed; see the LICENSE file in this repository.
+#
+
+test_description="Test client mode dht"
+
+. lib/test-lib.sh
+
+check_file_fetch() {
+	node=$1
+	fhash=$2
+	fname=$3
+
+	test_expect_success "can fetch file" '
+		ipfsi $node cat $fhash > fetch_out
+	'
+
+	test_expect_success "file looks good" '
+		test_cmp $fname fetch_out
+	'
+}
+
+run_single_file_test() {
+	test_expect_success "add a file on node1" '
+		random 1000000 > filea &&
+		FILEA_HASH=$(ipfsi 1 add -q filea)
+	'
+
+	check_file_fetch 9 $FILEA_HASH filea
+	check_file_fetch 8 $FILEA_HASH filea
+	check_file_fetch 7 $FILEA_HASH filea
+	check_file_fetch 6 $FILEA_HASH filea
+	check_file_fetch 5 $FILEA_HASH filea
+	check_file_fetch 4 $FILEA_HASH filea
+	check_file_fetch 3 $FILEA_HASH filea
+	check_file_fetch 2 $FILEA_HASH filea
+	check_file_fetch 1 $FILEA_HASH filea
+	check_file_fetch 0 $FILEA_HASH filea
+}
+
+NNODES=10
+
+test_expect_success "set up testbed" '
+	iptb init -n $NNODES -p 0 -f --bootstrap=none
+'
+
+test_expect_success "start up nodes" '
+	iptb start [0-7] &&
+	iptb start [8-9] --args="--routing=dhtclient"
+'
+
+test_expect_success "connect up nodes" '
+	iptb connect [1-9] 0
+'
+
+test_expect_success "add a file on a node in client mode" '
+	random 1000000 > filea &&
+	FILE_HASH=$(ipfsi 8 add -q filea)
+'
+
+test_expect_success "retrieve that file on a client mode node" '
+	check_file_fetch 9 $FILE_HASH filea
+'
+
+run_single_file_test
+
+test_expect_success "shut down nodes" '
+	iptb stop
+'
+
+test_done