diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index 3acdfdadc96eb8d2d0c18ffd804d129b119e7978..100fe8f764215af9501431ac500173123e9a3fe6 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -698,6 +698,8 @@ class ClientConnectionRunner {
      *
      * Note that no failure indication is available.
      * Fails silently on e.g. queue overflow to client, client dead, etc.
+     *
+     * @param toDest non-null
      * @param fromDest generally null when from remote, non-null if from local
      */ 
     void receiveMessage(Destination toDest, Destination fromDest, Payload payload) {
@@ -708,6 +710,26 @@ class ClientConnectionRunner {
         j.runJob();
     }
     
+    /**
+     * Asynchronously deliver the message to the current runner
+     *
+     * Note that no failure indication is available.
+     * Fails silently on e.g. queue overflow to client, client dead, etc.
+     *
+     * @param toHash non-null
+     * @param fromDest generally null when from remote, non-null if from local
+     * @since 0.9.20
+     */ 
+    void receiveMessage(Hash toHash, Destination fromDest, Payload payload) {
+        SessionParams sp = _sessions.get(toHash);
+        if (sp == null) {
+            if (_log.shouldLog(Log.WARN))
+                _log.warn("No session found for receiveMessage()");
+            return;
+        }
+        receiveMessage(sp.dest, fromDest, payload);
+    }
+    
     /**
      * Send async abuse message to the client
      *
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index 6174973e4690ddf4be3f43dae1d3b85498489db7..f8fc2bb8e35a1e9e0e065f361eebca2ce5fcbee6 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -627,7 +627,10 @@ class ClientManager {
             if (runner != null) {
                 //_ctx.statManager().addRateData("client.receiveMessageSize", 
                 //                                   _msg.getPayload().getSize(), 0);
-                runner.receiveMessage(dest, null, _msg.getPayload());
+                if (dest != null)
+                    runner.receiveMessage(dest, null, _msg.getPayload());
+                else
+                    runner.receiveMessage(_msg.getDestinationHash(), null, _msg.getPayload());
             } else {
                 // no client connection...
                 // we should pool these somewhere...
diff --git a/router/java/src/net/i2p/router/client/MessageReceivedJob.java b/router/java/src/net/i2p/router/client/MessageReceivedJob.java
index 7ce5f5cbaeb35b61d25e275147f5d6ebeed98ece..3614d1693077e06f699c8ba194ab71d6d0e75da4 100644
--- a/router/java/src/net/i2p/router/client/MessageReceivedJob.java
+++ b/router/java/src/net/i2p/router/client/MessageReceivedJob.java
@@ -32,7 +32,7 @@ class MessageReceivedJob extends JobImpl {
     private final boolean _sendDirect;
 
     /**
-     *  @param toDest requred to pick session
+     *  @param toDest non-null, required to pick session
      *  @param fromDest ignored, generally null
      */
     public MessageReceivedJob(RouterContext ctx, ClientConnectionRunner runner, Destination toDest,