diff --git a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
index fab0c6d99dc3e250ea34b72e97c2a3c01a2b74e9..703f43ef296b29363dea8501dd7be1e2eebbd800 100644
--- a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
+++ b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
@@ -160,61 +160,14 @@ public class DeliveryInstructions extends DataStructureImpl {
      */
     @Deprecated
     public void setDelaySeconds(long seconds) { _delaySeconds = seconds; }
-    
+
     /**
      * @deprecated unused
+     * @throws UnsupportedOperationException always
      */
     @Deprecated
-    public void readBytes(InputStream in) throws DataFormatException, IOException {
-        long flags = DataHelper.readLong(in, 1);
-        //if (_log.shouldLog(Log.DEBUG))
-        //    _log.debug("Read flags: " + flags + " mode: " +  flagMode(flags));
-        
-     /****
-        if (flagEncrypted(flags)) {
-            SessionKey k = new SessionKey();
-            k.readBytes(in);
-            setEncryptionKey(k);
-            setEncrypted(true);
-        } else {
-            setEncrypted(false);
-        }
-      ****/
-        
-        setDeliveryMode(flagMode(flags));
-        switch (flagMode(flags)) {
-            case FLAG_MODE_LOCAL:
-                break;
-            case FLAG_MODE_DESTINATION:
-                //Hash destHash = new Hash();
-                //destHash.readBytes(in);
-                Hash destHash = Hash.create(in);
-                setDestination(destHash);
-                break;
-            case FLAG_MODE_ROUTER:
-                //Hash routerHash = new Hash();
-                //routerHash.readBytes(in);
-                Hash routerHash = Hash.create(in);
-                setRouter(routerHash);
-                break;
-            case FLAG_MODE_TUNNEL:
-                //Hash tunnelRouterHash = new Hash();
-                //tunnelRouterHash.readBytes(in);
-                Hash tunnelRouterHash = Hash.create(in);
-                setRouter(tunnelRouterHash);
-                TunnelId id = new TunnelId();
-                id.readBytes(in);
-                setTunnelId(id);
-                break;
-        }
-        
-        if (flagDelay(flags)) {
-            long delay = DataHelper.readLong(in, 4);
-            setDelayRequested(true);
-            setDelaySeconds(delay);
-        } else {
-            setDelayRequested(false);
-        }
+    public void readBytes(InputStream in) {
+        throw new UnsupportedOperationException();
     }
     
     public int readBytes(byte data[], int offset) throws DataFormatException {
@@ -576,11 +529,6 @@ public class DeliveryInstructions extends DataStructureImpl {
             throw new RuntimeException("immutable");
         }
 
-        @Override
-        public void readBytes(InputStream in) throws DataFormatException, IOException {
-            throw new RuntimeException("immutable");
-        }
-
         @Override
         public int readBytes(byte data[], int offset) throws DataFormatException {
             throw new RuntimeException("immutable");
diff --git a/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java
index 5c8ef354628b0b7b72f7b9f746a3fffe58441813..63e64fa65c2e1faadb9d54809648e6c5a4e7aef4 100644
--- a/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java
+++ b/router/java/src/net/i2p/data/i2np/FastI2NPMessageImpl.java
@@ -9,7 +9,6 @@ package net.i2p.data.i2np;
  */
 
 import java.io.IOException;
-import java.io.InputStream;
 import java.io.OutputStream;
 
 import net.i2p.I2PAppContext;
@@ -49,26 +48,6 @@ public abstract class FastI2NPMessageImpl extends I2NPMessageImpl {
         super(context);
     }
     
-    /**
-     *  @deprecated unused
-     *  @throws UnsupportedOperationException
-     */
-    @Deprecated
-    @Override
-    public void readBytes(InputStream in) throws DataFormatException, IOException {
-        throw new UnsupportedOperationException();
-    }
-
-    /**
-     *  @deprecated unused
-     *  @throws UnsupportedOperationException
-     */
-    @Deprecated
-    @Override
-    public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException {
-        throw new UnsupportedOperationException();
-    }
-
     /**
      *  Ignore, but save, the checksum, to be used later if necessary.
      *
diff --git a/router/java/src/net/i2p/data/i2np/GarlicClove.java b/router/java/src/net/i2p/data/i2np/GarlicClove.java
index 0d73ccf309ae4f57b3503b22dd8db721916847d2..ddbe535483c023001932f8e6054c253e16a7b223 100644
--- a/router/java/src/net/i2p/data/i2np/GarlicClove.java
+++ b/router/java/src/net/i2p/data/i2np/GarlicClove.java
@@ -61,28 +61,8 @@ public class GarlicClove extends DataStructureImpl {
      *  @throws UnsupportedOperationException always
      */
     @Deprecated
-    public void readBytes(InputStream in) throws DataFormatException, IOException {
+    public void readBytes(InputStream in) {
         throw new UnsupportedOperationException();
-/****
-        _instructions = new DeliveryInstructions();
-        _instructions.readBytes(in);
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Read instructions: " + _instructions);
-        try {
-            _msg = _handler.readMessage(in);
-        } catch (I2NPMessageException ime) {
-            throw new DataFormatException("Unable to read the message from a garlic clove", ime);
-        }
-        _cloveId = DataHelper.readLong(in, 4);
-        _expiration = DataHelper.readDate(in);
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("CloveID read: " + _cloveId + " expiration read: " + _expiration);
-        //_certificate = new Certificate();
-        //_certificate.readBytes(in);
-        _certificate = Certificate.create(in);
-        if (_log.shouldLog(Log.DEBUG))
-            _log.debug("Read cert: " + _certificate);
-****/
     }
 
     /**
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessage.java b/router/java/src/net/i2p/data/i2np/I2NPMessage.java
index 4580476bc42c5a8c661a3615a7db242e480e4817..167a8c3588e80954be54a2a2a25e64ab12586d35 100644
--- a/router/java/src/net/i2p/data/i2np/I2NPMessage.java
+++ b/router/java/src/net/i2p/data/i2np/I2NPMessage.java
@@ -9,7 +9,6 @@ package net.i2p.data.i2np;
  */
 
 import java.io.IOException;
-import java.io.InputStream;
 
 import net.i2p.data.DataStructure;
 
@@ -31,26 +30,6 @@ public interface I2NPMessage extends DataStructure {
      */
     public static final int MAX_SIZE = 64*1024;
     
-    /**
-     * Read the body into the data structures, after the initial type byte, using
-     * the current class's format as defined by the I2NP specification
-     *
-     * Unused - All transports provide encapsulation and so we have byte arrays available.
-     *
-     * @param in stream to read from
-     *           starting at type if type is < 0 (16 byte header)
-     *           starting at ID if type is >= 0 (15 byte header)
-     * @param type I2NP message type. If less than zero, read the type from data
-     * @param buffer scratch buffer to be used when reading and parsing
-     * @return size of the message read (including headers)
-     * @throws I2NPMessageException if the stream doesn't contain a valid message
-     *          that this class can read.
-     * @throws IOException if there is a problem reading from the stream
-     * @deprecated unused
-     */
-    @Deprecated
-    public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException;
-
     /**
      * Read the body into the data structures, after the initial type byte, using
      * the current class's format as defined by the I2NP specification
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java b/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java
index 69a7418c21e10e40fb737168dcd055e2ee81e5ae..51235dccc166e253aacd823bf6bf2e835abc75f2 100644
--- a/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java
+++ b/router/java/src/net/i2p/data/i2np/I2NPMessageHandler.java
@@ -9,7 +9,6 @@ package net.i2p.data.i2np;
  */
 
 import java.io.IOException;
-import java.io.InputStream;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataFormatException;
@@ -35,40 +34,6 @@ public class I2NPMessageHandler {
         _lastSize = -1;
     }
     
-    /**
-     * Read an I2NPMessage from the stream and return the fully populated object.
-     *
-     * This is only called by I2NPMessageReader which is unused.
-     * All transports provide encapsulation and so we have byte arrays available.
-     *
-     * @deprecated use the byte array method to avoid an extra copy if you have it
-     *
-     * @throws I2NPMessageException if there is a problem handling the particular
-     *          message - if it is an unknown type or has improper formatting, etc.
-     */
-    @Deprecated
-    public I2NPMessage readMessage(InputStream in) throws IOException, I2NPMessageException {
-        if (_messageBuffer == null) _messageBuffer = new byte[38*1024]; // more than necessary
-        try {
-            int type = (int)DataHelper.readLong(in, 1);
-            _lastReadBegin = System.currentTimeMillis();
-            I2NPMessage msg = I2NPMessageImpl.createMessage(_context, type);
-            try {
-                _lastSize = msg.readBytes(in, type, _messageBuffer);
-            } catch (I2NPMessageException ime) {
-                throw ime;
-            } catch (RuntimeException e) {
-                if (_log.shouldLog(Log.WARN))
-                    _log.warn("Error reading the stream", e);
-                throw new I2NPMessageException("Unknown error reading the " + msg.getClass().getSimpleName(), e); 
-            }
-            _lastReadEnd = System.currentTimeMillis();
-            return msg;
-        } catch (DataFormatException dfe) {
-            throw new I2NPMessageException("Error reading the message", dfe);
-        }
-    }
-    
     /** clear the last message read from a byte array with an offset */
     public I2NPMessage lastRead() { 
         I2NPMessage rv = _lastRead;
@@ -129,14 +94,4 @@ public class I2NPMessageHandler {
     public long getLastReadTime() { return _lastReadEnd - _lastReadBegin; }
     public int getLastSize() { return _lastSize; }
     
-/****
-    public static void main(String args[]) {
-        try {
-            I2NPMessage msg = new I2NPMessageHandler(I2PAppContext.getGlobalContext()).readMessage(new FileInputStream(args[0]));
-            System.out.println(msg);
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-****/
 }
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
index 78e20922f99474b537551054962b45c568a1aa6d..ba20bf27158d7e2243143fcc14bc234aa58db290 100644
--- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
+++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
@@ -72,91 +72,15 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
     }
 
     /**
-     *  Read the whole message but only if it's exactly 1024 bytes.
+     *  Read the whole message.
      *  Unused - All transports provide encapsulation and so we have byte arrays available.
      *
      *  @deprecated unused
+     *  @throws UnsupportedOperationException always
      */
     @Deprecated
-    public void readBytes(InputStream in) throws DataFormatException, IOException {
-        try {
-            readBytes(in, -1, new byte[1024]);
-        } catch (I2NPMessageException ime) {
-            throw new DataFormatException("Bad bytes", ime);
-        }
-    }
-
-    /**
-     *  Read the header, then read the rest into buffer, then call
-     *  readMessage in the implemented message type
-     *
-     *  This does a copy from the stream to the buffer, so if you already
-     *  have a byte array, use the other readBytes() instead.
-     *
-     *<pre>
-     *  Specifically:
-     *    1 byte type (if caller didn't read already, as specified by the type param
-     *    4 byte ID
-     *    8 byte expiration
-     *    2 byte size
-     *    1 byte checksum
-     *    size bytes of payload (read by readMessage() in implementation)
-     *</pre>
-     *
-     *  Unused - All transports provide encapsulation and so we have byte arrays available.
-     *
-     *  @param type the message type or -1 if we should read it here
-     *  @param buffer temp buffer to use
-     *  @return total length of the message
-     *  @deprecated unused
-     */
-    @Deprecated
-    public int readBytes(InputStream in, int type, byte buffer[]) throws I2NPMessageException, IOException {
-        try {
-            if (type < 0)
-                type = (int)DataHelper.readLong(in, 1);
-            _uniqueId = DataHelper.readLong(in, 4);
-            _expiration = DataHelper.readLong(in, DataHelper.DATE_LENGTH);
-            int size = (int)DataHelper.readLong(in, 2);
-            byte checksum[] = new byte[CHECKSUM_LENGTH];
-            int read = DataHelper.read(in, checksum);
-            if (read != CHECKSUM_LENGTH)
-                throw new I2NPMessageException("checksum is too small [" + read + "]");
-            //Hash h = new Hash();
-            //h.readBytes(in);
-            if (buffer.length < size) {
-                if (size > MAX_SIZE) throw new I2NPMessageException("size=" + size);
-                buffer = new byte[size];
-            }
-
-            int cur = 0;
-            while (cur < size) {
-                int numRead = in.read(buffer, cur, size- cur);
-                if (numRead == -1) {
-                    throw new I2NPMessageException("Payload is too short [" + numRead + ", wanted " + size + "]");
-                }
-                cur += numRead;
-            }
-
-            byte[] calc = SimpleByteCache.acquire(Hash.HASH_LENGTH);
-            _context.sha().calculateHash(buffer, 0, size, calc, 0);
-            //boolean eq = calc.equals(h);
-            boolean eq = DataHelper.eq(checksum, 0, calc, 0, CHECKSUM_LENGTH);
-            SimpleByteCache.release(calc);
-            if (!eq)
-                throw new I2NPMessageException("Bad checksum on " + size + " byte I2NP " + getClass().getSimpleName());
-
-            //long start = _context.clock().now();
-            if (_log.shouldLog(Log.DEBUG))
-                _log.debug("Reading bytes: type = " + type + " / uniqueId : " + _uniqueId + " / expiration : " + _expiration);
-            readMessage(buffer, 0, size, type);
-            //long time = _context.clock().now() - start;
-            //if (time > 50)
-            //    _context.statManager().addRateData("i2np.readTime", time, time);
-            return CHECKSUM_LENGTH + 1 + 2 + 4 + DataHelper.DATE_LENGTH + size;
-        } catch (DataFormatException dfe) {
-            throw new I2NPMessageException("Error reading the message header", dfe);
-        }
+    public void readBytes(InputStream in) {
+        throw new UnsupportedOperationException();
     }
 
     /**
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageReader.java b/router/java/src/net/i2p/data/i2np/I2NPMessageReader.java
deleted file mode 100644
index 05134f70746635fc59e20ee2fd1a48957633ada2..0000000000000000000000000000000000000000
--- a/router/java/src/net/i2p/data/i2np/I2NPMessageReader.java
+++ /dev/null
@@ -1,213 +0,0 @@
-package net.i2p.data.i2np;
-/*
- * free (adj.): unencumbered; not under the control of others
- * Written by jrandom in 2003 and released into the public domain
- * with no warranty of any kind, either expressed or implied.
- * It probably won't make your computer catch on fire, or eat
- * your children, but it might.  Use at your own risk.
- *
- */
-
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InterruptedIOException;
-
-import net.i2p.router.RouterContext;
-import net.i2p.util.I2PThread;
-import net.i2p.util.Log;
-
-/**
- * The I2NPMessageReader reads an InputStream (using
- * {@link I2NPMessageHandler I2NPMessageHandler}) and passes out events to a registered
- * listener, where events are either messages being received, exceptions being
- * thrown, or the connection being closed.  Routers should use this rather
- * than read from the stream themselves.
- *
- * Deprecated - unused.
- * This was used by the old TCP transport.
- * Both the NTCP and SSU transports provide encapsulation
- * of I2NP messages, so they use I2NPMessageHandlers directly.
- * If we ever add a transport that does not provide encapsulation,
- * this will be useful again.
- *
- * @deprecated unused
- *
- * @author jrandom
- */
-@Deprecated
-public class I2NPMessageReader {
-    private Log _log;
-    private RouterContext _context;
-    private InputStream _stream;
-    private I2NPMessageEventListener _listener;
-    private I2NPMessageReaderRunner _reader;
-    private Thread _readerThread;
-    
-    public I2NPMessageReader(RouterContext context, InputStream stream, I2NPMessageEventListener lsnr) {
-        this(context, stream, lsnr, "I2NP Reader");
-    }
-    
-    public I2NPMessageReader(RouterContext context, InputStream stream, I2NPMessageEventListener lsnr, String name) {
-        _context = context;
-        _log = context.logManager().getLog(I2NPMessageReader.class);
-        _stream = stream;
-        setListener(lsnr);
-        _reader = new I2NPMessageReaderRunner();
-        _readerThread = new I2PThread(_reader);
-        _readerThread.setName(name);
-        _readerThread.setDaemon(true);
-    }
-    
-    public void setListener(I2NPMessageEventListener lsnr) { _listener = lsnr; }
-    public I2NPMessageEventListener getListener() { return _listener; }
-    
-    /**
-     * Instruct the reader to begin reading messages off the stream
-     *
-     */
-    public void startReading() { _readerThread.start(); }
-
-    /**
-     * Have the already started reader pause its reading indefinitely
-     * @deprecated unused
-     */
-    @Deprecated
-    public void pauseReading() { _reader.pauseRunner(); }
-
-    /**
-     * Resume reading after a pause
-     * @deprecated unused
-     */
-    @Deprecated
-    public void resumeReading() { _reader.resumeRunner(); }
-
-    /**
-     * Cancel reading.
-     *
-     */
-    public void stopReading() { _reader.cancelRunner(); }
-    
-    /**
-     * Defines the different events the reader produces while reading the stream
-     *
-     */
-    public static interface I2NPMessageEventListener {
-        /**
-         * Notify the listener that a message has been received from the given
-         * reader
-         *
-         */
-        public void messageReceived(I2NPMessageReader reader, I2NPMessage message, long msToRead, int bytesRead);
-        /**
-         * Notify the listener that an exception was thrown while reading from the given
-         * reader
-         *
-         */
-        public void readError(I2NPMessageReader reader, Exception error);
-        /**
-         * Notify the listener that the stream the given reader was running off
-         * closed
-         *
-         */
-        public void disconnected(I2NPMessageReader reader);
-    }
-    
-    private class I2NPMessageReaderRunner implements Runnable {
-        private boolean _doRun;
-        private boolean _stayAlive;
-        private I2NPMessageHandler _handler;
-        public I2NPMessageReaderRunner() {
-            _doRun = true;
-            _stayAlive = true;
-            _handler = new I2NPMessageHandler(_context);
-        }
-
-        /** deprecated unused */
-        public void pauseRunner() { _doRun = false; }
-
-        /** deprecated unused */
-        public void resumeRunner() { _doRun = true; }
-
-        public void cancelRunner() {
-            _doRun = false;
-            _stayAlive = false;
-        }
-        public void run() {
-            while (_stayAlive) {
-                while (_doRun) {
-                    while (!_context.throttle().acceptNetworkMessage()) {
-                        try { Thread.sleep(500 + _context.random().nextInt(512)); } catch (InterruptedException ie) {}
-                    }
-                    
-                    // do read
-                    try {
-                        I2NPMessage msg = _handler.readMessage(_stream);
-                        if (msg != null) {
-                            long msToRead = _handler.getLastReadTime();
-                            int bytesRead = _handler.getLastSize();
-                            //msToRead += injectLag(bytesRead);
-                            _listener.messageReceived(I2NPMessageReader.this, msg, msToRead, bytesRead);
-                        }
-                    } catch (I2NPMessageException ime) {
-                        if (_log.shouldLog(Log.WARN))
-                            _log.warn("Error handling message", ime);
-                        _listener.readError(I2NPMessageReader.this, ime);
-                        _listener.disconnected(I2NPMessageReader.this);
-                        cancelRunner();
-                    } catch (InterruptedIOException iioe) { 
-                        // not all I2NPMessageReaders support this, but some run off sockets which throw
-                        // SocketTimeoutExceptions or InterruptedIOExceptions
-                        if (_log.shouldLog(Log.INFO))
-                            _log.info("Disconnecting due to inactivity", iioe);
-                        _listener.disconnected(I2NPMessageReader.this);
-                        cancelRunner();
-                    } catch (IOException ioe) {
-                        if (_log.shouldLog(Log.WARN))
-                            _log.warn("IO Error handling message", ioe);
-                        _listener.disconnected(I2NPMessageReader.this);
-                        cancelRunner();
-                    } catch (RuntimeException e) {
-                        _log.log(Log.CRIT, "error reading msg!", e);
-                        _listener.readError(I2NPMessageReader.this, e);
-                        _listener.disconnected(I2NPMessageReader.this);
-                        cancelRunner();
-                    }
-                }
-                // ??? unused
-                if (_stayAlive && !_doRun) {
-                    // pause .5 secs when we're paused
-                    try { Thread.sleep(500); } catch (InterruptedException ie) {}
-                }
-            }
-            // boom bye bye bad bwoy
-        }
-        
-     /****
-        private final long injectLag(int size) {
-            if (true) { 
-                return 0;
-            } else {
-                boolean shouldLag = _context.random().nextInt(1000) > size;
-                if (!shouldLag) return 0;
-                
-                long readLag = getReadLag();
-                if (readLag > 0) {
-                    long lag = _context.random().nextLong(readLag);
-                    if (lag > 0) {
-                        try { Thread.sleep(lag); } catch (InterruptedException ie) {}
-                        return lag;
-                    } else {
-                        return 0;
-                    }
-                } else {
-                    return 0;
-                }
-            }
-        }
-        
-        private final long getReadLag() {
-            return _context.getProperty("router.injectLagMs", 0L); 
-        }
-     ****/
-    }
-}