diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
index 7e666e7dd219babd1e9304ed6564d308eef5bdf1..5c69959adee60df464c1a72ced733e1a01b9aadf 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
@@ -3,6 +3,7 @@
  */
 package net.i2p.i2ptunnel;
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.IOException;
 import java.io.InputStream;
@@ -219,6 +220,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
         // shadows _log in super()
         private final Log _log;
 
+        private static final int BUF_SIZE = 16*1024;
+
         public CompressedRequestor(Socket webserver, I2PSocket browser, String headers, I2PAppContext ctx, Log log) {
             _webserver = webserver;
             _browser = browser;
@@ -259,7 +262,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
                 //     at java.lang.Thread.run(Thread.java:619)
                 //     at net.i2p.util.I2PThread.run(I2PThread.java:71)
                 try {
-                    serverin = _webserver.getInputStream();
+                    serverin = new BufferedInputStream(_webserver.getInputStream(), BUF_SIZE);
                 } catch (NullPointerException npe) {
                     throw new IOException("getInputStream NPE");
                 }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
index b9540f416429c28976f18300df0a1ef06ab43caa..81b92484b1d19cbd7f0a607d3af27f255171111a 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
@@ -3,6 +3,7 @@
  */
 package net.i2p.i2ptunnel;
 
+import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.InterruptedIOException;
@@ -17,6 +18,7 @@ import net.i2p.data.ByteArray;
 import net.i2p.util.ByteCache;
 import net.i2p.util.Clock;
 import net.i2p.util.I2PAppThread;
+import net.i2p.util.InternalSocket;
 import net.i2p.util.Log;
 
 public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErrorListener {
@@ -167,6 +169,8 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
                 _log.debug("Initial data " + (initialI2PData != null ? initialI2PData.length : 0) 
                            + " written to I2P, " + (initialSocketData != null ? initialSocketData.length : 0)
                            + " written to the socket, starting forwarders");
+            if (!(s instanceof InternalSocket))
+                in = new BufferedInputStream(in, 2*NETWORK_BUFFER_SIZE);
             Thread t1 = new StreamForwarder(in, i2pout, true);
             Thread t2 = new StreamForwarder(i2pin, out, false);
             synchronized (finishLock) {
diff --git a/core/java/src/net/i2p/client/I2PSessionImpl.java b/core/java/src/net/i2p/client/I2PSessionImpl.java
index 8eeaad05f963ae59bc64849f412ff5832d6a7605..ed670149f5050fd7ff0ace47cced15b54ff6260b 100644
--- a/core/java/src/net/i2p/client/I2PSessionImpl.java
+++ b/core/java/src/net/i2p/client/I2PSessionImpl.java
@@ -9,6 +9,7 @@ package net.i2p.client;
  *
  */
 
+import java.io.BufferedInputStream;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.InputStream;
@@ -116,7 +117,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
     protected volatile boolean _closing;
 
     /** have we received the current date from the router yet? */
-    private boolean _dateReceived;
+    private volatile boolean _dateReceived;
     /** lock that we wait upon, that the SetDateMessageHandler notifies */
     private final Object _dateReceivedLock = new Object();
 
@@ -154,6 +155,8 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
     }
 
     public static final int LISTEN_PORT = 7654;
+
+    private static final int BUF_SIZE = 32*1024;
     
     /** for extension */
     protected I2PSessionImpl(I2PAppContext context, Properties options) {
@@ -353,7 +356,7 @@ abstract class I2PSessionImpl implements I2PSession, I2CPMessageReader.I2CPMessa
                 _out.write(I2PClient.PROTOCOL_BYTE);
                 _out.flush();
                 _writer = new ClientWriterRunner(_out, this);
-                InputStream in = _socket.getInputStream();
+                InputStream in = new BufferedInputStream(_socket.getInputStream(), BUF_SIZE);
                 _reader = new I2CPMessageReader(in, this);
             }
             Thread notifier = new I2PAppThread(_availabilityNotifier, "ClientNotifier " + getPrefix(), true);
diff --git a/core/java/src/net/i2p/client/I2PSimpleSession.java b/core/java/src/net/i2p/client/I2PSimpleSession.java
index 2881f80689d111aaa68d47ad6c4597a334564feb..2ada1c26f4c591628ca5de45b171af534b503e78 100644
--- a/core/java/src/net/i2p/client/I2PSimpleSession.java
+++ b/core/java/src/net/i2p/client/I2PSimpleSession.java
@@ -5,6 +5,7 @@ package net.i2p.client;
  * with no warranty of any kind, either expressed or implied.  
  */
 
+import java.io.BufferedInputStream;
 import java.io.IOException;
 import java.io.InputStream;
 import java.net.Socket;
@@ -28,6 +29,8 @@ import net.i2p.internal.QueuedI2CPMessageReader;
  */
 class I2PSimpleSession extends I2PSessionImpl2 {
 
+    private static final int BUF_SIZE = 1024;
+
     /**
      * Create a new session for doing naming and bandwidth queries only. Do not create a destination.
      *
@@ -68,7 +71,7 @@ class I2PSimpleSession extends I2PSessionImpl2 {
                 _out.write(I2PClient.PROTOCOL_BYTE);
                 _out.flush();
                 _writer = new ClientWriterRunner(_out, this);
-                InputStream in = _socket.getInputStream();
+                InputStream in = new BufferedInputStream(_socket.getInputStream(), BUF_SIZE);
                 _reader = new I2CPMessageReader(in, this);
             }
             // we do not receive payload messages, so we do not need an AvailabilityNotifier
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index af6055129673c8e66a724c52695dc621a6854d39..30f969381af2dc50eaa54764e88183b8899d0cd3 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -1,5 +1,6 @@
 package net.i2p.util;
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
@@ -1057,6 +1058,8 @@ public class EepGet {
             //}
         }
         _proxyIn = _proxy.getInputStream();
+        if (!(_proxy instanceof InternalSocket))
+              _proxyIn = new BufferedInputStream(_proxyIn);
         _proxyOut = _proxy.getOutputStream();
         
         if (timeout != null)
diff --git a/core/java/src/net/i2p/util/InternalServerSocket.java b/core/java/src/net/i2p/util/InternalServerSocket.java
index c5a43a493c7d7641043969497e34775ae6c2b466..a5b1230631645951e7e2bb93ecee6eaef547b192 100644
--- a/core/java/src/net/i2p/util/InternalServerSocket.java
+++ b/core/java/src/net/i2p/util/InternalServerSocket.java
@@ -27,7 +27,7 @@ public class InternalServerSocket extends ServerSocket {
     private static final ConcurrentHashMap<Integer, InternalServerSocket> _sockets = new ConcurrentHashMap(4);
     private final BlockingQueue<InternalSocket> _acceptQueue;
     private final Integer _port;
-    private boolean _running;
+    private volatile boolean _running;
     //private static Log _log = I2PAppContext.getGlobalContext().logManager().getLog(InternalServerSocket.class);
 
     /**
diff --git a/core/java/src/net/i2p/util/SSLEepGet.java b/core/java/src/net/i2p/util/SSLEepGet.java
index 2e58d61638dc6246f86ec81f38977dbc7fde0b35..ab552cabeb63063940181726563c658fd8d7ff2d 100644
--- a/core/java/src/net/i2p/util/SSLEepGet.java
+++ b/core/java/src/net/i2p/util/SSLEepGet.java
@@ -37,6 +37,7 @@ package net.i2p.util;
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  */
 
+import java.io.BufferedInputStream;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
@@ -675,6 +676,8 @@ public class SSLEepGet extends EepGet {
             // this is an IOE
             throw sslhe;
         }
+
+        _proxyIn = new BufferedInputStream(_proxyIn);
         
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Request flushed");
diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index c635b3c13a0bdc532db45f2a5956dc675c26ce1a..600539a5c1150caef149f169ef3b144092d9aa18 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -8,6 +8,7 @@ package net.i2p.router.client;
  *
  */
 
+import java.io.BufferedInputStream;
 import java.io.EOFException;
 import java.io.IOException;
 import java.io.OutputStream;
@@ -96,6 +97,8 @@ class ClientConnectionRunner {
     // e.g. on local access
     private static final int MAX_MESSAGE_ID = 0x4000000;
 
+    private static final int BUF_SIZE = 32*1024;
+
     /** @since 0.9.2 */
     private static final String PROP_TAGS = "crypto.tagsToSend";
     private static final String PROP_THRESH = "crypto.lowTagThreshold";
@@ -124,7 +127,8 @@ class ClientConnectionRunner {
      */
     public void startRunning() {
         try {
-            _reader = new I2CPMessageReader(_socket.getInputStream(), new ClientMessageEventListener(_context, this, true));
+            _reader = new I2CPMessageReader(new BufferedInputStream(_socket.getInputStream(), BUF_SIZE),
+                                            new ClientMessageEventListener(_context, this, true));
             _writer = new ClientWriterRunner(_context, this);
             I2PThread t = new I2PThread(_writer);
             t.setName("I2CP Writer " + ++__id);