diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketLocal.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketLocal.java
index d820338910015f665e6cc1bc9dc3ba1730341695..542de8f2f8634e24d14415016e9622b291472761 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketLocal.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/PacketLocal.java
@@ -207,8 +207,6 @@ class PacketLocal extends Packet implements MessageOutputStream.WriteStatus {
      *
      * @param buffer data to be written
      * @param offset starting point in the buffer
-     * @param ctx Application Context
-     * @param key signing key
      * @return Count of bytes written
      * @throws IllegalStateException if there is data missing or otherwise b0rked
      * @since 0.9.20 moved from Packet
diff --git a/core/java/src/net/i2p/client/I2PClientFactory.java b/core/java/src/net/i2p/client/I2PClientFactory.java
index 86fbdaa8cede51d439c66f99efc76ec87bbc50d9..01a37b599f78597e24db30f99c709f6796bc9dd6 100644
--- a/core/java/src/net/i2p/client/I2PClientFactory.java
+++ b/core/java/src/net/i2p/client/I2PClientFactory.java
@@ -9,6 +9,8 @@ package net.i2p.client;
  *
  */
 
+import net.i2p.client.impl.I2PClientImpl;
+
 /**
  * Provide a means of hooking into an appropriate I2PClient implementation
  *
@@ -21,4 +23,4 @@ public class I2PClientFactory {
     public static I2PClient createClient() {
         return new I2PClientImpl();
     }
-}
\ No newline at end of file
+}
diff --git a/core/java/src/net/i2p/client/I2PSession.java b/core/java/src/net/i2p/client/I2PSession.java
index 016293ea7f3f22df7e6fede9a7677f260a898d34..458b9a892dea8a5480a4cdaf70bca768f633ca3d 100644
--- a/core/java/src/net/i2p/client/I2PSession.java
+++ b/core/java/src/net/i2p/client/I2PSession.java
@@ -260,7 +260,6 @@ public interface I2PSession {
     public I2PSession addSubsession(InputStream privateKeyStream, Properties opts) throws I2PSessionException;
     
     /**
-     *  @return a list of subsessions, non-null, does not include the primary session
      *  @since 0.9.21
      */
     public void removeSubsession(I2PSession session);
diff --git a/core/java/src/net/i2p/client/I2PSimpleClient.java b/core/java/src/net/i2p/client/I2PSimpleClient.java
index 38286f2b1ba9f05654f138be63efa786fb99aa73..c8b1fdcf450de25dd5092d9de26a242845636c39 100644
--- a/core/java/src/net/i2p/client/I2PSimpleClient.java
+++ b/core/java/src/net/i2p/client/I2PSimpleClient.java
@@ -12,6 +12,7 @@ import java.util.Properties;
 
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
+import net.i2p.client.impl.I2PSimpleSession;
 import net.i2p.crypto.SigType;
 import net.i2p.data.Certificate;
 import net.i2p.data.Destination;
diff --git a/core/java/src/net/i2p/client/BWLimitsMessageHandler.java b/core/java/src/net/i2p/client/impl/BWLimitsMessageHandler.java
similarity index 96%
rename from core/java/src/net/i2p/client/BWLimitsMessageHandler.java
rename to core/java/src/net/i2p/client/impl/BWLimitsMessageHandler.java
index 34fa81ec8ecd4489691d195370b77704de63c6bb..6e199af46afa1f1c1e43ef6e190503be6a70feaf 100644
--- a/core/java/src/net/i2p/client/BWLimitsMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/BWLimitsMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * Released into the public domain 
diff --git a/core/java/src/net/i2p/client/ClientWriterRunner.java b/core/java/src/net/i2p/client/impl/ClientWriterRunner.java
similarity index 98%
rename from core/java/src/net/i2p/client/ClientWriterRunner.java
rename to core/java/src/net/i2p/client/impl/ClientWriterRunner.java
index 35ecce19d4f5bc1daf4ec196f3f3c8e64798a230..dfe20bc1def34b5d1e8bff81f0b2e94408ff3ee4 100644
--- a/core/java/src/net/i2p/client/ClientWriterRunner.java
+++ b/core/java/src/net/i2p/client/impl/ClientWriterRunner.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 import java.io.BufferedOutputStream;
 import java.io.IOException;
@@ -9,6 +9,7 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.atomic.AtomicLong;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.i2cp.I2CPMessage;
 import net.i2p.data.i2cp.I2CPMessageException;
 import net.i2p.internal.PoisonI2CPMessage;
diff --git a/core/java/src/net/i2p/client/DestReplyMessageHandler.java b/core/java/src/net/i2p/client/impl/DestReplyMessageHandler.java
similarity index 97%
rename from core/java/src/net/i2p/client/DestReplyMessageHandler.java
rename to core/java/src/net/i2p/client/impl/DestReplyMessageHandler.java
index 2207a56c514af61b858968272432efdd410ca903..e15a55779d59c06a4175befa8ccda9656d5f48f6 100644
--- a/core/java/src/net/i2p/client/DestReplyMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/DestReplyMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * Released into the public domain 
diff --git a/core/java/src/net/i2p/client/DisconnectMessageHandler.java b/core/java/src/net/i2p/client/impl/DisconnectMessageHandler.java
similarity index 95%
rename from core/java/src/net/i2p/client/DisconnectMessageHandler.java
rename to core/java/src/net/i2p/client/impl/DisconnectMessageHandler.java
index 8dd47f10b2e5b8990da0f39bd8eeb85355424bc3..20582ddcb203d4697808e25ebb9e68efba752a9a 100644
--- a/core/java/src/net/i2p/client/DisconnectMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/DisconnectMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -10,6 +10,7 @@ package net.i2p.client;
  */
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.i2cp.DisconnectMessage;
 import net.i2p.data.i2cp.I2CPMessage;
 import net.i2p.util.I2PAppThread;
diff --git a/core/java/src/net/i2p/client/HandlerImpl.java b/core/java/src/net/i2p/client/impl/HandlerImpl.java
similarity index 96%
rename from core/java/src/net/i2p/client/HandlerImpl.java
rename to core/java/src/net/i2p/client/impl/HandlerImpl.java
index d1b5100e2754af29f51fc6656068d19227e98cd0..081d8e0c420152a47eea2457753e62b342e24509 100644
--- a/core/java/src/net/i2p/client/HandlerImpl.java
+++ b/core/java/src/net/i2p/client/impl/HandlerImpl.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
diff --git a/core/java/src/net/i2p/client/HostReplyMessageHandler.java b/core/java/src/net/i2p/client/impl/HostReplyMessageHandler.java
similarity index 97%
rename from core/java/src/net/i2p/client/HostReplyMessageHandler.java
rename to core/java/src/net/i2p/client/impl/HostReplyMessageHandler.java
index 94cce4758cdb322b67311873079c920ddb1b7491..4cce11ab916a6afbbe1fd6f47fef913f3f0b0cf4 100644
--- a/core/java/src/net/i2p/client/HostReplyMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/HostReplyMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * Released into the public domain 
diff --git a/core/java/src/net/i2p/client/I2CPMessageHandler.java b/core/java/src/net/i2p/client/impl/I2CPMessageHandler.java
similarity index 95%
rename from core/java/src/net/i2p/client/I2CPMessageHandler.java
rename to core/java/src/net/i2p/client/impl/I2CPMessageHandler.java
index a0f14f8378af01bbbcc97874b26dca94acb9b8c3..a0a60d69dacd4778da0248c341482fc905105eef 100644
--- a/core/java/src/net/i2p/client/I2CPMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/I2CPMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
diff --git a/core/java/src/net/i2p/client/I2CPMessageProducer.java b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
similarity index 99%
rename from core/java/src/net/i2p/client/I2CPMessageProducer.java
rename to core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
index bbabc3a11fbaae755c115e9e1522cbbde1eaf179..f44b897a3b3d2399269f289250fdd26bdd68c7e2 100644
--- a/core/java/src/net/i2p/client/I2CPMessageProducer.java
+++ b/core/java/src/net/i2p/client/impl/I2CPMessageProducer.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -15,6 +15,8 @@ import java.util.concurrent.TimeUnit;
 import java.util.concurrent.locks.ReentrantLock;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
+import net.i2p.client.SendMessageOptions;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
 import net.i2p.data.LeaseSet;
diff --git a/core/java/src/net/i2p/client/I2PClientImpl.java b/core/java/src/net/i2p/client/impl/I2PClientImpl.java
similarity index 97%
rename from core/java/src/net/i2p/client/I2PClientImpl.java
rename to core/java/src/net/i2p/client/impl/I2PClientImpl.java
index e0c7feea9ff7f025df66542feba73081897f0ed4..0bda34daa48da6b1c22376ef4be2da2e6f6a5e5d 100644
--- a/core/java/src/net/i2p/client/I2PClientImpl.java
+++ b/core/java/src/net/i2p/client/impl/I2PClientImpl.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -17,6 +17,9 @@ import java.util.Properties;
 
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
+import net.i2p.client.I2PClient;
+import net.i2p.client.I2PSession;
+import net.i2p.client.I2PSessionException;
 import net.i2p.crypto.KeyGenerator;
 import net.i2p.crypto.SigType;
 import net.i2p.data.Certificate;
@@ -36,7 +39,7 @@ import net.i2p.util.RandomSource;
  *
  * @author jrandom
  */
-class I2PClientImpl implements I2PClient {
+public class I2PClientImpl implements I2PClient {
 
     /**
      * Create a destination with a DSA 1024/160 signature type and a null certificate.
diff --git a/core/java/src/net/i2p/client/I2PClientMessageHandlerMap.java b/core/java/src/net/i2p/client/impl/I2PClientMessageHandlerMap.java
similarity index 99%
rename from core/java/src/net/i2p/client/I2PClientMessageHandlerMap.java
rename to core/java/src/net/i2p/client/impl/I2PClientMessageHandlerMap.java
index bd2de83d6343d436fe9e04432ecb2ac14455776c..4cea850b79d25a25cd886ecafac74dc1a920ca74 100644
--- a/core/java/src/net/i2p/client/I2PClientMessageHandlerMap.java
+++ b/core/java/src/net/i2p/client/impl/I2PClientMessageHandlerMap.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
diff --git a/core/java/src/net/i2p/client/I2PSessionDemultiplexer.java b/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java
similarity index 96%
rename from core/java/src/net/i2p/client/I2PSessionDemultiplexer.java
rename to core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java
index ea1ef2437fa6d3e3ca4d402fd2ee0fa2e447cc36..5b29e8018014b67553b3a6f55607dec3a70bdaf6 100644
--- a/core/java/src/net/i2p/client/I2PSessionDemultiplexer.java
+++ b/core/java/src/net/i2p/client/impl/I2PSessionDemultiplexer.java
@@ -1,9 +1,13 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.Map;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSession;
+import net.i2p.client.I2PSessionException;
+import net.i2p.client.I2PSessionListener;
+import net.i2p.client.I2PSessionMuxedListener;
 import net.i2p.util.Log;
 
 /*
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/impl/I2PSessionImpl.java
similarity index 99%
rename from core/java/src/net/i2p/client/I2PSessionImpl.java
rename to core/java/src/net/i2p/client/impl/I2PSessionImpl.java
index 6532b1f9f048ef9cb136d78d5fa5e29765cc2efd..0be40f87f5e13de30c1a07ae567984e0683408d6 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl.java
+++ b/core/java/src/net/i2p/client/impl/I2PSessionImpl.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -29,6 +29,11 @@ import java.util.concurrent.atomic.AtomicInteger;
 
 import net.i2p.CoreVersion;
 import net.i2p.I2PAppContext;
+import net.i2p.client.DomainSocketFactory;
+import net.i2p.client.I2PClient;
+import net.i2p.client.I2PSession;
+import net.i2p.client.I2PSessionException;
+import net.i2p.client.I2PSessionListener;
 import net.i2p.data.Base32;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl2.java b/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java
similarity index 98%
rename from core/java/src/net/i2p/client/I2PSessionImpl2.java
rename to core/java/src/net/i2p/client/impl/I2PSessionImpl2.java
index d6fe3ad3652e1bae3d789d06cd46550e7791ffc3..4eddcc30ec85f3dbd91a9387e4244713150caec3 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl2.java
+++ b/core/java/src/net/i2p/client/impl/I2PSessionImpl2.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -20,6 +20,12 @@ import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicLong;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PClient;
+import net.i2p.client.I2PSessionException;
+import net.i2p.client.I2PSessionListener;
+import net.i2p.client.I2PSessionMuxedListener;
+import net.i2p.client.SendMessageOptions;
+import net.i2p.client.SendMessageStatusListener;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
 import net.i2p.data.SessionKey;
diff --git a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java b/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java
similarity index 98%
rename from core/java/src/net/i2p/client/I2PSessionMuxedImpl.java
rename to core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java
index 653fddc9ac7e683d374f7c8d13239de66eddf80c..46e551e495a5919e19bc0283ff4c8705a04abc75 100644
--- a/core/java/src/net/i2p/client/I2PSessionMuxedImpl.java
+++ b/core/java/src/net/i2p/client/impl/I2PSessionMuxedImpl.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * public domain
@@ -8,9 +8,14 @@ import java.io.InputStream;
 import java.util.concurrent.LinkedBlockingQueue;
 import java.util.Properties;
 import java.util.Set;
-
 import java.util.concurrent.atomic.AtomicBoolean;
+
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
+import net.i2p.client.I2PSessionListener;
+import net.i2p.client.I2PSessionMuxedListener;
+import net.i2p.client.SendMessageOptions;
+import net.i2p.client.SendMessageStatusListener;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
 import net.i2p.data.SessionKey;
diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/impl/I2PSimpleSession.java
similarity index 97%
rename from core/java/src/net/i2p/client/I2PSimpleSession.java
rename to core/java/src/net/i2p/client/impl/I2PSimpleSession.java
index ce0ef254f3ce60810c35e3c730f279a7ec687228..dd59ea463c6b43db4c0f915ce0ba58da8be3437c 100644
--- a/core/java/src/net/i2p/client/I2PSimpleSession.java
+++ b/core/java/src/net/i2p/client/impl/I2PSimpleSession.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * Released into the public domain 
@@ -16,6 +16,8 @@ import java.util.Properties;
 
 import net.i2p.CoreVersion;
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PClient;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.i2cp.BandwidthLimitsMessage;
 import net.i2p.data.i2cp.DestReplyMessage;
 import net.i2p.data.i2cp.DisconnectMessage;
@@ -37,7 +39,7 @@ import net.i2p.util.OrderedProperties;
  *
  * @author zzz
  */
-class I2PSimpleSession extends I2PSessionImpl2 {
+public class I2PSimpleSession extends I2PSessionImpl2 {
 
     private static final int BUF_SIZE = 1024;
 
diff --git a/core/java/src/net/i2p/client/MessagePayloadMessageHandler.java b/core/java/src/net/i2p/client/impl/MessagePayloadMessageHandler.java
similarity index 97%
rename from core/java/src/net/i2p/client/MessagePayloadMessageHandler.java
rename to core/java/src/net/i2p/client/impl/MessagePayloadMessageHandler.java
index 39dc99403ee592537a73288a372069baa2c734cb..47beb2101e48ed201eeba354a5a7df7c1770712c 100644
--- a/core/java/src/net/i2p/client/MessagePayloadMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/MessagePayloadMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -10,6 +10,7 @@ package net.i2p.client;
  */
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Payload;
 import net.i2p.data.i2cp.I2CPMessage;
diff --git a/core/java/src/net/i2p/client/MessageState.java b/core/java/src/net/i2p/client/impl/MessageState.java
similarity index 98%
rename from core/java/src/net/i2p/client/MessageState.java
rename to core/java/src/net/i2p/client/impl/MessageState.java
index e56eb9a8a324d9a0167447ad36073f26b62484e0..267a9cb19e98329382487a10b1bf4c03ad995755 100644
--- a/core/java/src/net/i2p/client/MessageState.java
+++ b/core/java/src/net/i2p/client/impl/MessageState.java
@@ -1,8 +1,10 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 import java.util.concurrent.atomic.AtomicLong;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSession;
+import net.i2p.client.SendMessageStatusListener;
 import net.i2p.data.i2cp.MessageId;
 import net.i2p.data.i2cp.MessageStatusMessage;
 import net.i2p.util.Log;
diff --git a/core/java/src/net/i2p/client/MessageStatusMessageHandler.java b/core/java/src/net/i2p/client/impl/MessageStatusMessageHandler.java
similarity index 97%
rename from core/java/src/net/i2p/client/MessageStatusMessageHandler.java
rename to core/java/src/net/i2p/client/impl/MessageStatusMessageHandler.java
index f967ad9568bdc3d8816e4b0d5fdece61b6730a86..4654eafa385e65a767e80d7a887bf3fdefd0befe 100644
--- a/core/java/src/net/i2p/client/MessageStatusMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/MessageStatusMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -10,6 +10,7 @@ package net.i2p.client;
  */
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.i2cp.I2CPMessage;
 import net.i2p.data.i2cp.MessageStatusMessage;
 import net.i2p.data.i2cp.ReceiveMessageBeginMessage;
diff --git a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
similarity index 99%
rename from core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
rename to core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
index 68f8f07b8e275901a7cee06bbeb751f558c6169d..09dab72ff429486a5456a615a47c64ce3ff58354 100644
--- a/core/java/src/net/i2p/client/RequestLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -14,6 +14,7 @@ import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
 import net.i2p.crypto.KeyGenerator;
 import net.i2p.crypto.SigType;
 import net.i2p.data.DataFormatException;
diff --git a/core/java/src/net/i2p/client/RequestVariableLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java
similarity index 97%
rename from core/java/src/net/i2p/client/RequestVariableLeaseSetMessageHandler.java
rename to core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java
index 6ba03d8f69a1640a4e6e232db61d21142dbe947e..41cc9eb9319714061dc3a469faf5140d170bd48e 100644
--- a/core/java/src/net/i2p/client/RequestVariableLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
diff --git a/core/java/src/net/i2p/client/SessionIdleTimer.java b/core/java/src/net/i2p/client/impl/SessionIdleTimer.java
similarity index 98%
rename from core/java/src/net/i2p/client/SessionIdleTimer.java
rename to core/java/src/net/i2p/client/impl/SessionIdleTimer.java
index 444f73167fffac2818e6bfc4e1c943a29242990d..5b4fa513e1b72f9774fa1f86e84c3016cdcec69d 100644
--- a/core/java/src/net/i2p/client/SessionIdleTimer.java
+++ b/core/java/src/net/i2p/client/impl/SessionIdleTimer.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -8,6 +8,7 @@ package net.i2p.client;
 import java.util.Properties;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.DataHelper;
 import net.i2p.util.Log;
 import net.i2p.util.SimpleTimer;
diff --git a/core/java/src/net/i2p/client/SessionStatusMessageHandler.java b/core/java/src/net/i2p/client/impl/SessionStatusMessageHandler.java
similarity index 96%
rename from core/java/src/net/i2p/client/SessionStatusMessageHandler.java
rename to core/java/src/net/i2p/client/impl/SessionStatusMessageHandler.java
index 92bd7db82a8a8c43d0ac3fa9e077c1dc064b4d49..ec0b0d67411cf25666c420d9c23cc230906bb475 100644
--- a/core/java/src/net/i2p/client/SessionStatusMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/SessionStatusMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
@@ -10,6 +10,7 @@ package net.i2p.client;
  */
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.i2cp.I2CPMessage;
 import net.i2p.data.i2cp.SessionStatusMessage;
 import net.i2p.util.Log;
diff --git a/core/java/src/net/i2p/client/SetDateMessageHandler.java b/core/java/src/net/i2p/client/impl/SetDateMessageHandler.java
similarity index 97%
rename from core/java/src/net/i2p/client/SetDateMessageHandler.java
rename to core/java/src/net/i2p/client/impl/SetDateMessageHandler.java
index 68adb2d60e5d6cfec93f5de42584ea25314276ca..723bb7e2fea58116ad081da6926cc6795b96ef46 100644
--- a/core/java/src/net/i2p/client/SetDateMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/SetDateMessageHandler.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 /*
  * free (adj.): unencumbered; not under the control of others
diff --git a/core/java/src/net/i2p/client/SubSession.java b/core/java/src/net/i2p/client/impl/SubSession.java
similarity index 98%
rename from core/java/src/net/i2p/client/SubSession.java
rename to core/java/src/net/i2p/client/impl/SubSession.java
index 0e2fca90b683ca20ca695130eeb8ddc4953ef624..51c5f0b1645eb66bdba513c680e79d9de774564d 100644
--- a/core/java/src/net/i2p/client/SubSession.java
+++ b/core/java/src/net/i2p/client/impl/SubSession.java
@@ -1,4 +1,4 @@
-package net.i2p.client;
+package net.i2p.client.impl;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -9,6 +9,8 @@ import java.util.Map;
 import java.util.Properties;
 
 import net.i2p.I2PAppContext;
+import net.i2p.client.I2PSession;
+import net.i2p.client.I2PSessionException;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
 import net.i2p.data.PrivateKey;
diff --git a/core/java/src/net/i2p/client/impl/package.html b/core/java/src/net/i2p/client/impl/package.html
new file mode 100644
index 0000000000000000000000000000000000000000..393014d7b81e0a42770bebf9ac5b9db029f9a3dc
--- /dev/null
+++ b/core/java/src/net/i2p/client/impl/package.html
@@ -0,0 +1,11 @@
+<html><body>
+<p>Implements the base I2P SDK for developing applications that communicate 
+through I2P.</p>
+
+<p>
+These classes are for implementing the client side of I2CP
+and are not to be used externally.
+Subject to change and not part of the public API.
+Moved from net.i2p.client in 0.9.21.
+</p>
+</body></html>
diff --git a/core/java/src/net/i2p/client/package.html b/core/java/src/net/i2p/client/package.html
index f7287d5ac01b2ed1ce5bde01bcbc18159d2eb5e6..9d250b4dfb556bf9c8cbff73aa94e7edfa16f240 100644
--- a/core/java/src/net/i2p/client/package.html
+++ b/core/java/src/net/i2p/client/package.html
@@ -1,6 +1,13 @@
 <html><body>
-<p>Implements the base I2P SDK for developing applications that communicate 
-through I2P.</p>
+<p>
+Interfaces and factories for
+the base I2P SDK used to develop applications that communicate 
+through I2P.
+</p>
+
+<p>
+Implementation moved to net.i2p.client.impl in 0.9.21.
+</p>
 
 <p>When a client application wants to communicate over I2P, the first thing it 
 needs to do is get a {@link net.i2p.client.I2PClient} from the 
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 364648ce6d2021085582f75aa18adc18ea89dbb2..c2994666e5ebc7d537d81ded2aead0612de0c653 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -20,7 +20,7 @@ import java.util.concurrent.ConcurrentHashMap;
 
 import gnu.getopt.Getopt;
 
-import net.i2p.client.I2PSessionImpl;
+import net.i2p.client.impl.I2PSessionImpl;
 import net.i2p.crypto.SigUtil;
 import net.i2p.data.Base64;
 import net.i2p.data.Certificate;
diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
index cc82592d5a067b524d5e071793a97b709d084f5c..385d3bd2bef8e07431415d25565e39206cc5c581 100644
--- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
+++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
@@ -132,7 +132,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade implements Inte
      * LeaseSet.
      *
      * @param dest Destination from which the LeaseSet's authorization should be requested
-     * @param ls  LeaseSet with requested leases - this object must be updated to contain the 
+     * @param set LeaseSet with requested leases - this object must be updated to contain the 
      *            signed version (as well as any changed/added/removed Leases).
      *            The LeaseSet contains Leases only; it is unsigned and does not have the destination set.
      */