diff --git a/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java b/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java
index f0201c4e8a9398c076f2884e84ada1baadffe264..c8b7c96309e414a9b14954f1bf090fd3e3b5aa19 100644
--- a/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java
+++ b/router/java/src/net/i2p/router/transport/udp/ACKBitfield.java
@@ -4,7 +4,7 @@ package net.i2p.router.transport.udp;
  * Generic means of SACK/NACK transmission for partially or fully 
  * received messages
  */
-public interface ACKBitfield {
+interface ACKBitfield {
     /** what message is this partially ACKing? */
     public long getMessageId(); 
     /** how many fragments are covered in this bitfield? */
diff --git a/router/java/src/net/i2p/router/transport/udp/ACKSender.java b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
index 180232d6f24046c835b6fd0ab82f5c0c3099dfba..d6035766db1410fbf757b842ce3e52ce6bca2b02 100644
--- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
@@ -15,7 +15,7 @@ import net.i2p.util.Log;
  * any outstanding ACKs.  
  *
  */
-public class ACKSender implements Runnable {
+class ACKSender implements Runnable {
     private RouterContext _context;
     private Log _log;
     private UDPTransport _transport;
diff --git a/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java b/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java
index 383f807c5965eba299b1a2fa970ea2c919f428ca..d2cb73934cca7533353949eda435bfdd217319ab 100644
--- a/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java
+++ b/router/java/src/net/i2p/router/transport/udp/DummyThrottle.java
@@ -14,7 +14,7 @@ import net.i2p.router.OutNetMessage;
  *
  * @since 0.7.12
  */
-public class DummyThrottle implements OutboundMessageFragments.ActiveThrottle {
+class DummyThrottle implements OutboundMessageFragments.ActiveThrottle {
 
     public DummyThrottle() {
     }
diff --git a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
index 2e1fea71f4816e6ee86b23b7da9d92b6e955b3ca..275c200c2af420d186dfa08d64e0525da1180944 100644
--- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
@@ -33,7 +33,7 @@ import net.i2p.util.SimpleTimer;
  * as well as to drop any failed establishment attempts.
  *
  */
-public class EstablishmentManager {
+class EstablishmentManager {
     private final RouterContext _context;
     private final Log _log;
     private final UDPTransport _transport;
diff --git a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java
index 829f62ee00321d6656ccfacfb78e4691c961d79b..6f4f5398098a457f33a3839c7e2546901cc4acd2 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java
@@ -20,7 +20,7 @@ import net.i2p.util.Log;
  * we are Bob.
  *
  */
-public class InboundEstablishState {
+class InboundEstablishState {
     private final RouterContext _context;
     private final Log _log;
     // SessionRequest message
diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
index ddd44b1436c4852a60b249adb7890442c7824e93..bc0ddc5f5e1fdc0fabec9c8a0d520028b05e2617 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageFragments.java
@@ -17,7 +17,7 @@ import net.i2p.util.Log;
  * basic line of defense here).
  *
  */
-public class InboundMessageFragments /*implements UDPTransport.PartialACKSource */{
+class InboundMessageFragments /*implements UDPTransport.PartialACKSource */{
     private RouterContext _context;
     private Log _log;
     /** list of message IDs recently received, so we can ignore in flight dups */
diff --git a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
index 3159cad8734bbd4a4d3c126ceae7678d7e4df99b..9261dc70a383a681fbb236fdd59da2808169fe85 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
@@ -11,7 +11,7 @@ import net.i2p.util.Log;
  * Hold the raw data fragments of an inbound message
  *
  */
-public class InboundMessageState {
+class InboundMessageState {
     private RouterContext _context;
     private Log _log;
     private long _messageId;
diff --git a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
index 6a2707f6080d1683f359d3d97de4fdc7bf19da95..c59668866b31a66ae145c5c8496b36aee86f931f 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -20,7 +20,7 @@ import net.i2p.util.Log;
 /**
  *
  */
-public class IntroductionManager {
+class IntroductionManager {
     private RouterContext _context;
     private Log _log;
     private UDPTransport _transport;
diff --git a/router/java/src/net/i2p/router/transport/udp/MessageQueue.java b/router/java/src/net/i2p/router/transport/udp/MessageQueue.java
index cc38ebbafec279bca630c800643bc32c2177e144..3d51055ca87a4da76f8d8e0679282285a1db8309 100644
--- a/router/java/src/net/i2p/router/transport/udp/MessageQueue.java
+++ b/router/java/src/net/i2p/router/transport/udp/MessageQueue.java
@@ -5,7 +5,7 @@ import net.i2p.router.OutNetMessage;
 /**
  * Base queue for messages not yet packetized
  */
-public interface MessageQueue {
+interface MessageQueue {
     /**
      * Get the next message, blocking until one is found or the expiration
      * reached.
diff --git a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
index 1a95c227fe6d42a29cfc3bf61a6f04e150692980..08b6088c4ffbd01295121adbed5559037ca30ca9 100644
--- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
@@ -19,7 +19,7 @@ import net.i2p.util.Log;
  * parse 'em into I2NPMessages, and stick them on the 
  * {@link net.i2p.router.InNetMessagePool} by way of the {@link UDPTransport}.
  */
-public class MessageReceiver {
+class MessageReceiver {
     private RouterContext _context;
     private Log _log;
     private UDPTransport _transport;
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
index 6e3738f306d117fec298375bdbcbf93f415526c8..1e23a210c5bf33dad9ee794006eafa23512a534f 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
@@ -21,7 +21,7 @@ import net.i2p.util.Log;
  * they are Bob.
  *
  */
-public class OutboundEstablishState {
+class OutboundEstablishState {
     private final RouterContext _context;
     private final Log _log;
     // SessionRequest message
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java
index 2d4f272929e9e098433f131799b854cbe66f8b64..e25ab036915dcb28ccd19d7a26e59ef62d4dcb24 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageFragments.java
@@ -22,7 +22,7 @@ import net.i2p.util.Log;
  * message.
  *
  */
-public class OutboundMessageFragments {
+class OutboundMessageFragments {
     private RouterContext _context;
     private Log _log;
     private UDPTransport _transport;
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
index 877ad10b174ab43c7591ec1856c8c906d383e5e2..a545cfb06258d7a3e2a4bb9e8d48015f8c708335 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
@@ -15,7 +15,7 @@ import net.i2p.util.Log;
  * Maintain the outbound fragmentation for resending
  *
  */
-public class OutboundMessageState {
+class OutboundMessageState {
     private I2PAppContext _context;
     private Log _log;
     /** may be null if we are part of the establishment */
diff --git a/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java b/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java
index 841588ee4548491c2eb1551d79d2c3a3523f82a4..078105a4a7b1c00a471c9c758167879cdd1c7f37 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundRefiller.java
@@ -12,7 +12,7 @@ import net.i2p.util.Log;
  * WARNING - UNUSED since 0.6.1.11
  *
  */
-public class OutboundRefiller implements Runnable {
+class OutboundRefiller implements Runnable {
     private RouterContext _context;
     private Log _log;
     private OutboundMessageFragments _fragments;
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
index c0d9e22f3f5e55a3e502380cbc02e234e6210953..672744444e23eca495ce4f8cadbfba35b19ebeed 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
@@ -22,8 +22,80 @@ import net.i2p.util.Log;
  * Big ol' class to do all our packet formatting.  The UDPPackets generated are
  * fully authenticated, encrypted, and configured for delivery to the peer. 
  *
+ * The following is from udp.html on the website:
+
+<p>
+All UDP datagrams begin with a 16 byte MAC (Message Authentication Code)
+and a 16 byte IV (Initialization Vector
+followed by a variable
+size payload encrypted with the appropriate key.  The MAC used is 
+HMAC-MD5, truncated to 16 bytes, while the key is a full 32 byte AES256 
+key.  The specific construct of the MAC is the first 16 bytes from:</p>
+<pre>
+  HMAC-MD5(payload || IV || (payloadLength ^ protocolVersion), macKey)
+</pre>
+
+<p>The protocol version is currently 0.</p>
+
+<p>The payload itself is AES256/CBC encrypted with the IV and the 
+sessionKey, with replay prevention addressed within its body, 
+explained below.  The payloadLength in the MAC is a 2 byte unsigned 
+integer in 2s complement.</p>
+  
+<p>The protocolVersion is a 2 byte unsigned integer in 2s complement,
+and currently set to 0.  Peers using a different protocol version will
+not be able to communicate with this peer, though earlier versions not
+using this flag are.</p>
+
+<h2><a name="payload">Payload</a></h2>
+
+<p>Within the AES encrypted payload, there is a minimal common structure
+to the various messages - a one byte flag and a four byte sending 
+timestamp (*seconds* since the unix epoch).  The flag byte contains 
+the following bitfields:</p>
+<pre>
+  bits 0-3: payload type
+     bit 4: rekey?
+     bit 5: extended options included
+  bits 6-7: reserved
+</pre>
+
+<p>If the rekey flag is set, 64 bytes of keying material follow the 
+timestamp.  If the extended options flag is set, a one byte option 
+size value is appended to, followed by that many extended option 
+bytes, which are currently uninterpreted.</p>
+
+<p>When rekeying, the first 32 bytes of the keying material is fed 
+into a SHA256 to produce the new MAC key, and the next 32 bytes are
+fed into a SHA256 to produce the new session key, though the keys are
+not immediately used.  The other side should also reply with the 
+rekey flag set and that same keying material.  Once both sides have 
+sent and received those values, the new keys should be used and the 
+previous keys discarded.  It may be useful to keep the old keys 
+around briefly, to address packet loss and reordering.</p>
+
+<p>NOTE: Rekeying is currently unimplemented.</p>
+
+<pre>
+ Header: 37+ bytes
+ +----+----+----+----+----+----+----+----+
+ |                  MAC                  |
+ |                                       |
+ +----+----+----+----+----+----+----+----+
+ |                   IV                  |
+ |                                       |
+ +----+----+----+----+----+----+----+----+
+ |flag|        time       | (optionally  |
+ +----+----+----+----+----+              |
+ | this may have 64 byte keying material |
+ | and/or a one+N byte extended options) |
+ +---------------------------------------|
+</pre>
+
+ *
+ *
  */
-public class PacketBuilder {
+class PacketBuilder {
     private I2PAppContext _context;
     private Log _log;
     private UDPTransport _transport;
@@ -62,10 +134,16 @@ public class PacketBuilder {
         _context.statManager().createRateStat("udp.packetAuthTimeSlow", "How long it takes to encrypt and MAC a packet for sending (when its slow)", "udp", UDPTransport.RATES);
     }
     
+/****
     public UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState peer) {
         return buildPacket(state, fragment, peer, null, null);
     }
+****/
+
     /**
+     * This builds a data packet (PAYLOAD_TYPE_DATA).
+     * See the methods below for the other message types.
+     *
      * @param ackIdsRemaining list of messageIds (Long) that should be acked by this packet.  
      *                        The list itself is passed by reference, and if a messageId is
      *                        transmitted and the sender does not want the ID to be included
@@ -231,8 +309,10 @@ public class PacketBuilder {
         return packet;
     }
     
-    // We use this for keepalive purposes.
-    // It doesn't generate a reply, but that's ok.
+    /**
+     * We use this for keepalive purposes.
+     * It doesn't generate a reply, but that's ok.
+     */
     public UDPPacket buildPing(PeerState peer) {
         return buildACK(peer, Collections.EMPTY_LIST);
     }
@@ -1018,6 +1098,9 @@ public class PacketBuilder {
         return packet;
     }
     
+    /**
+     *  Sends an empty unauthenticated packet for hole punching
+     */
     public UDPPacket buildHolePunch(UDPPacketReader reader) {
         UDPPacket packet = UDPPacket.acquire(_context, false);
         byte data[] = packet.getPacket().getData();
@@ -1051,7 +1134,7 @@ public class PacketBuilder {
         return packet;
     }
     
-    private void setTo(UDPPacket packet, InetAddress ip, int port) {
+    private static void setTo(UDPPacket packet, InetAddress ip, int port) {
         packet.getPacket().setAddress(ip);
         packet.getPacket().setPort(port);
     }
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
index 1a35c5d195741dc298b0f73968848080d86d285e..15dc164578eb016bf0dcf193a6ee8716a627f5a5 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
@@ -19,7 +19,7 @@ import net.i2p.util.Log;
  * receiver's queue and pushing them as necessary.
  *
  */
-public class PacketHandler {
+class PacketHandler {
     private RouterContext _context;
     private Log _log;
     private UDPTransport _transport;
@@ -525,6 +525,10 @@ public class PacketHandler {
                     _establisher.receiveRelayResponse(from, reader);
                     _context.statManager().addRateData("udp.receivePacketSize.relayResponse", packet.getPacket().getLength(), packet.getLifetime());
                     break;
+                case UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY:
+                    _state = 53;
+                    //_TODO
+                    break;
                 default:
                     _state = 52;
                     if (_log.shouldLog(Log.WARN))
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java
index 271e83597c3435af227841eb072ac02067c48ba1..50b8d3ba780b50ce6035aa0e08d047e69b791ca1 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketPusher.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketPusher.java
@@ -9,7 +9,7 @@ import net.i2p.util.Log;
  * pool and toss 'em onto the outbound packet queue
  *
  */
-public class PacketPusher implements Runnable {
+class PacketPusher implements Runnable {
     // private RouterContext _context;
     private Log _log;
     private OutboundMessageFragments _fragments;
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerState.java b/router/java/src/net/i2p/router/transport/udp/PeerState.java
index 65fb1c0147caea54f2ea5300b29c108ce957967e..6c1dec3e4563de374ca5cb820c437fe98e0d6886 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -23,7 +23,7 @@ import net.i2p.util.ConcurrentHashSet;
  * Contain all of the state about a UDP connection to a peer.
  *
  */
-public class PeerState {
+class PeerState {
     private RouterContext _context;
     private Log _log;
     /**
diff --git a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java
index acd0bd0b532dde527703d37d13e99e25ca5d0844..9721f22cce5ec39bf6f58ab83fcfeebe5d7e2030 100644
--- a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java
+++ b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java
@@ -20,7 +20,7 @@ import net.i2p.util.Log;
  * See comments in DQAT.java and mtn history ca. 2006-02-19
  *
  */
-public class TimedWeightedPriorityMessageQueue implements MessageQueue, OutboundMessageFragments.ActiveThrottle {
+class TimedWeightedPriorityMessageQueue implements MessageQueue, OutboundMessageFragments.ActiveThrottle {
     private RouterContext _context;
     private Log _log;
     /** FIFO queue of messages in a particular priority */
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java
index ac9369d8eb7a059a7cf314d44c1bafece9d3e55c..fc2426700e5e52ba00832b75ee34615268544b82 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPEndpoint.java
@@ -11,7 +11,7 @@ import net.i2p.util.Log;
  * Coordinate the low level datagram socket, managing the UDPSender and
  * UDPReceiver
  */
-public class UDPEndpoint {
+class UDPEndpoint {
     private RouterContext _context;
     private Log _log;
     private int _listenPort;
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
index 5dc001e18f0efad6d5c77f138a19618960c27975..1548e6036f547d018fa64c193ef812b2081922d5 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
@@ -16,7 +16,7 @@ import net.i2p.util.Log;
  * of object instances to allow rapid reuse.
  *
  */
-public class UDPPacket {
+class UDPPacket {
     private I2PAppContext _context;
     private static Log _log;
     private volatile DatagramPacket _packet;
@@ -63,6 +63,8 @@ public class UDPPacket {
     public static final int PAYLOAD_TYPE_RELAY_INTRO = 5;
     public static final int PAYLOAD_TYPE_DATA = 6;
     public static final int PAYLOAD_TYPE_TEST = 7;
+    /** @since 0.8.1 */
+    public static final int PAYLOAD_TYPE_SESSION_DESTROY = 8;
     
     // various flag fields for use in the data packets
     public static final byte DATA_FLAG_EXPLICIT_ACK = (byte)(1 << 7);
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
index 395a2fcf0e6a560c026d3902837667c158f4c0a6..0b65b2d47e7bc259ad3bf2c2c9a8f94dfbfa1e2a 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
@@ -15,7 +15,7 @@ import net.i2p.util.Log;
  * elements, grab the appropriate subreader.
  *
  */
-public class UDPPacketReader {
+class UDPPacketReader {
     private I2PAppContext _context;
     private Log _log;
     private byte _message[];
@@ -125,6 +125,8 @@ public class UDPPacketReader {
                 return "Relay request packet";
             case UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE:
                 return "Relay response packet";
+            case UDPPacket.PAYLOAD_TYPE_SESSION_DESTROY:
+                return "Session destroyed packet";
             default:
                 return "Other packet type...";
         }
@@ -135,6 +137,8 @@ public class UDPPacketReader {
             buf.append(Base64.encode(_message, _payloadBeginOffset, _payloadLength));
     }
     
+    /* ------- Begin Reader Classes ------- */
+
     /** Help read the SessionRequest payload */
     public class SessionRequestReader {
         public static final int X_LENGTH = 256;
@@ -747,6 +751,7 @@ public class UDPPacketReader {
         }
     }
     
+    /* ------- End Reader Classes ------- */
     
     public static void main(String args[]) {
         I2PAppContext ctx = I2PAppContext.getGlobalContext();
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
index 88cb207791269b7c3b2784f797cb20ea7f6c7b80..0a1937db10d8c7c59e9c21da37b49536e6e7a563 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
@@ -19,7 +19,7 @@ import net.i2p.util.SimpleTimer;
  * from the queue ASAP by a {@link PacketHandler}
  *
  */
-public class UDPReceiver {
+class UDPReceiver {
     private RouterContext _context;
     private Log _log;
     private DatagramSocket _socket;
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPSender.java b/router/java/src/net/i2p/router/transport/udp/UDPSender.java
index 745b50df4b57b35ae11686cdc2048e782b9cb91e..01d10ed1c5c17e4b6019fcc358a6c9c6f70219c5 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPSender.java
@@ -15,7 +15,7 @@ import net.i2p.util.Log;
  * Lowest level packet sender, pushes anything on its queue ASAP.
  *
  */
-public class UDPSender {
+class UDPSender {
     private RouterContext _context;
     private Log _log;
     private DatagramSocket _socket;