diff --git a/history.txt b/history.txt
index a7a8368282b1e2ea065cecd5e7f7073130f6a2f1..78eb5f9fcf046c91624ed356ff9bb3fff68b5fd3 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,6 @@
+2014-01-28 zzz
+ * I2CP: Use client tunnels for b32 lookups (ticket #1166)
+
 2014-01-27 zzz
 Prop from i2p.i2p.zzz.i2cp:
  * I2CP:
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index c10128fe6223a59f4fa2320e38c3309487438a87..fecba78d6973d87e9930d631de787e05fec2a510 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 6;
+    public final static long BUILD = 7;
 
     /** for example "-test" */
     public final static String EXTRA = "";
diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index 9b4dbed3ba82bc9c2b0a220d9431ac343e5f5e9e..5fa987de5bba554aacd1954e865509e7564a2892 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -182,7 +182,10 @@ class ClientConnectionRunner {
         //_manager = null;
     }
     
-    /** current client's config */
+    /**
+     *  Current client's config,
+     *  will be null before session is established
+     */
     public SessionConfig getConfig() { return _config; }
 
     /**
@@ -209,6 +212,10 @@ class ClientConnectionRunner {
     public LeaseSet getLeaseSet() { return _currentLeaseSet; }
     void setLeaseSet(LeaseSet ls) { _currentLeaseSet = ls; }
 
+    /**
+     *  Equivalent to getConfig().getDestination().calculateHash();
+     *  will be null before session is established
+     */
     public Hash getDestHash() { return _destHashCache; }
     
     /** current client's sessionId */
diff --git a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
index 9518a21934acd4cd40c2a06751f2665dfdbe6720..7707813a3702849328bb155b5ec2341ac34ce4f8 100644
--- a/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
+++ b/router/java/src/net/i2p/router/client/ClientMessageEventListener.java
@@ -222,7 +222,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         _runner.sessionEstablished(cfg);
 
         if (_log.shouldLog(Log.DEBUG))
-            _log.debug("after sessionEstablished for " + message.getSessionConfig().getDestination().calculateHash().toBase64());
+            _log.debug("after sessionEstablished for " + _runner.getDestHash());
         startCreateSessionJob();
     }
     
@@ -355,7 +355,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
         }
         if (_log.shouldLog(Log.INFO))
             _log.info("New lease set granted for destination " 
-                      + message.getLeaseSet().getDestination().calculateHash().toBase64());
+                      + _runner.getDestHash());
 
         // leaseSetCreated takes care of all the LeaseRequestState stuff (including firing any jobs)
         _runner.leaseSetCreated(message.getLeaseSet());
@@ -363,7 +363,8 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
 
     /** override for testing */
     protected void handleDestLookup(DestLookupMessage message) {
-        _context.jobQueue().addJob(new LookupDestJob(_context, _runner, message.getHash()));
+        _context.jobQueue().addJob(new LookupDestJob(_context, _runner, message.getHash(),
+                                                     _runner.getDestHash()));
     }
 
     /**
@@ -373,7 +374,8 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
     protected void handleHostLookup(HostLookupMessage message) {
         _context.jobQueue().addJob(new LookupDestJob(_context, _runner, message.getReqID(),
                                                      message.getTimeout(), message.getSessionId(),
-                                                     message.getHash(), message.getHostname()));
+                                                     message.getHash(), message.getHostname(),
+                                                     _runner.getDestHash()));
     }
 
     /**
@@ -394,7 +396,7 @@ class ClientMessageEventListener implements I2CPMessageReader.I2CPMessageEventLi
             return;
         }
         _runner.getConfig().getOptions().putAll(message.getSessionConfig().getOptions());
-        Hash dest = _runner.getConfig().getDestination().calculateHash();
+        Hash dest = _runner.getDestHash();
         ClientTunnelSettings settings = new ClientTunnelSettings(dest);
         Properties props = new Properties();
         props.putAll(_runner.getConfig().getOptions());
diff --git a/router/java/src/net/i2p/router/client/LookupDestJob.java b/router/java/src/net/i2p/router/client/LookupDestJob.java
index d5ab0877509d121844fdbcf9598609b09f35785f..be08388ba2c195dc4fc89e364819ba1b12307968 100644
--- a/router/java/src/net/i2p/router/client/LookupDestJob.java
+++ b/router/java/src/net/i2p/router/client/LookupDestJob.java
@@ -29,21 +29,24 @@ class LookupDestJob extends JobImpl {
     private final Hash _hash;
     private final String _name;
     private final SessionId _sessID;
+    private final Hash _fromLocalDest;
 
     private static final long DEFAULT_TIMEOUT = 15*1000;
 
-    public LookupDestJob(RouterContext context, ClientConnectionRunner runner, Hash h) {
-        this(context, runner, -1, DEFAULT_TIMEOUT, null, h, null);
+    public LookupDestJob(RouterContext context, ClientConnectionRunner runner, Hash h, Hash fromLocalDest) {
+        this(context, runner, -1, DEFAULT_TIMEOUT, null, h, null, fromLocalDest);
     }
 
     /**
      *  One of h or name non-null
      *  @param reqID must be >= 0 if name != null
      *  @param sessID must non-null if reqID >= 0
+     *  @param fromLocalDest use these tunnels for the lookup, or null for exploratory
      *  @since 0.9.11
      */
     public LookupDestJob(RouterContext context, ClientConnectionRunner runner,
-                         long reqID, long timeout, SessionId sessID, Hash h, String name) {
+                         long reqID, long timeout, SessionId sessID, Hash h, String name,
+                         Hash fromLocalDest) {
         super(context);
         if ((h == null && name == null) ||
             (h != null && name != null) ||
@@ -54,6 +57,7 @@ class LookupDestJob extends JobImpl {
         _reqID = reqID;
         _timeout = timeout;
         _sessID = sessID;
+        _fromLocalDest = fromLocalDest;
         if (name != null && name.length() == 60) {
             // convert a b32 lookup to a hash lookup
             String nlc = name.toLowerCase(Locale.US);
@@ -84,7 +88,7 @@ class LookupDestJob extends JobImpl {
                 returnFail();
         } else {
             DoneJob done = new DoneJob(getContext());
-            getContext().netDb().lookupLeaseSet(_hash, done, done, _timeout);
+            getContext().netDb().lookupLeaseSet(_hash, done, done, _timeout, _fromLocalDest);
         }
     }