diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java
index 7874aa606d6ae9120f1b1999a45083b751c7576b..c41c41a4e360645e71021f2338ddcc60bbbb37c5 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java
@@ -309,7 +309,7 @@ class HTTPResponseOutputStream extends FilterOutputStream {
             } catch (OutOfMemoryError oom) {
                 _log.error("OOM in HTTP Decompressor", oom);
             } finally {
-                if (_log.shouldLog(Log.INFO) && (_in != null))
+                if (_log.shouldInfo())
                     _log.info("After decompression, written=" + written + 
                                 " read=" + _in.getTotalRead() 
                                 + ", expanded=" + _in.getTotalExpanded() + ", remaining=" + _in.getRemaining() 
@@ -319,19 +319,20 @@ class HTTPResponseOutputStream extends FilterOutputStream {
                 if (_out != null) try { 
                     _out.close(); 
                 } catch (IOException ioe) {}
+                try { 
+                    _in.close(); 
+                } catch (IOException ioe) {}
             }
 
-            if (_in != null) {
-                double compressed = _in.getTotalRead();
-                double expanded = _in.getTotalExpanded();
-                ReusableGZIPInputStream.release(_in);
-                if (compressed > 0 && expanded > 0) {
-                    // only update the stats if we did something
-                    double ratio = compressed/expanded;
-                    _context.statManager().addRateData("i2ptunnel.httpCompressionRatio", (int)(100d*ratio));
-                    _context.statManager().addRateData("i2ptunnel.httpCompressed", (long)compressed);
-                    _context.statManager().addRateData("i2ptunnel.httpExpanded", (long)expanded);
-                }
+            double compressed = _in.getTotalRead();
+            double expanded = _in.getTotalExpanded();
+            ReusableGZIPInputStream.release(_in);
+            if (compressed > 0 && expanded > 0) {
+                // only update the stats if we did something
+                double ratio = compressed/expanded;
+                _context.statManager().addRateData("i2ptunnel.httpCompressionRatio", (int)(100d*ratio));
+                _context.statManager().addRateData("i2ptunnel.httpCompressed", (long)compressed);
+                _context.statManager().addRateData("i2ptunnel.httpExpanded", (long)expanded);
             }
         }
     }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
index 8b322d45a04db3e78e564790c56c927c683ca1d2..621e11a294973b2f865f487f92fd5fd5adada674 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
@@ -1517,7 +1517,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
         if (tasks.isEmpty()) {
             System.exit(0);
         }
-        l.log("There are running tasks. Try 'list'.");
+        l.log("There are running tasks. Try 'list' or 'close all'.");
         //notifyEvent("quitResult", "error");
     }
 
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketFull.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketFull.java
index 5d3bec526e9526d1c26aca23bd79bb2459d8a291..173190e8c0bd9534a3158ba25eacd1203e260bcc 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketFull.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/I2PSocketFull.java
@@ -52,7 +52,7 @@ class I2PSocketFull implements I2PSocket {
         Connection c = _connection;
         if (c == null) return;
         if (log.shouldLog(Log.INFO))
-            log.info("close() called, connected? " + c.getIsConnected() + " : " + c);
+            log.info("close() called, connected? " + c.getIsConnected() + " : " + c, new Exception());
         if (c.getIsConnected()) {
             MessageInputStream in = c.getInputStream();
             in.close();
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/impl/MessageInputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/impl/MessageInputStream.java
index fdf3d397b1e1a0e584fd7b7692e834700293ffc3..3897b28093d7b739a78c9a3f2fe5053c6801a26e 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/impl/MessageInputStream.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/impl/MessageInputStream.java
@@ -61,6 +61,9 @@ class MessageInputStream extends InputStream {
     private final int _maxBufferSize;
     private final byte[] _oneByte = new byte[1];
     private final Object _dataLock;
+
+    /** only in _notYetReadyBlocks, never in _readyDataBlocks */
+    private static final ByteArray DUMMY_BA = new ByteArray(null);
     
     private static final int MIN_READY_BUFFERS = 16;
 
@@ -320,9 +323,9 @@ class MessageInputStream extends InputStream {
                 _highestReadyBlockId = messageId;
                 long cur = _highestReadyBlockId + 1;
                 // now pull in any previously pending blocks
-                while (_notYetReadyBlocks.containsKey(Long.valueOf(cur))) {
-                    ByteArray ba = _notYetReadyBlocks.remove(Long.valueOf(cur));
-                    if ( (ba != null) && (ba.getData() != null) && (ba.getValid() > 0) ) {
+                ByteArray ba;
+                while ((ba = _notYetReadyBlocks.remove(Long.valueOf(cur))) != null) {
+                    if (ba.getData() != null && ba.getValid() > 0) {
                         _readyDataBlocks.add(ba);
                     }
                     
@@ -336,13 +339,17 @@ class MessageInputStream extends InputStream {
                                         // Java throws a SocketTimeoutException.
                                         // We do neither.
             } else {
-                if (_log.shouldLog(Log.INFO))
-                    _log.info("Message is out of order: " + messageId);
-                // _notYetReadyBlocks size is limited in ConnectionPacketHandler.
-                if (_locallyClosed) // dont need the payload, just the msgId in order
-                    _notYetReadyBlocks.put(Long.valueOf(messageId), new ByteArray(null));
-                else
+                // _notYetReadyBlocks size is limited in canAccept()
+                if (_locallyClosed) {
+                    if (_log.shouldInfo())
+                        _log.info("Message received on closed stream: " + messageId);
+                    // dont need the payload, just the msgId in order
+                    _notYetReadyBlocks.put(Long.valueOf(messageId), DUMMY_BA);
+                } else {
+                    if (_log.shouldInfo())
+                        _log.info("Message is out of order: " + messageId);
                     _notYetReadyBlocks.put(Long.valueOf(messageId), payload);
+                }
             }
             _dataLock.notifyAll();
         }