diff --git a/history.txt b/history.txt
index 6bcfd655869d3a6221615b4bd22c0c5b449e19e6..50315edcd199ca59741c0f48c30d5bc4525d01c7 100644
--- a/history.txt
+++ b/history.txt
@@ -1,3 +1,8 @@
+2009-04-21 sponge
+    * Code janator work, basic corrections involving @Override, and
+      appling final where it is important. Also fixed some equals methods
+      and commented places that need fixing.
+
 2009-04-18 Complication
     * Fix typo in "news.xml", no build number increase.
 
diff --git a/router/java/src/net/i2p/data/i2np/DataMessage.java b/router/java/src/net/i2p/data/i2np/DataMessage.java
index 7e839117fa040ddadb4aa0bb85d1f789f3134b20..8ba6b13460e579a88e5898e44859a49242574595 100644
--- a/router/java/src/net/i2p/data/i2np/DataMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DataMessage.java
@@ -12,7 +12,7 @@ import java.io.IOException;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataHelper;
-import net.i2p.util.Log;
+// import net.i2p.util.Log;
 
 /**
  * Defines a message containing arbitrary bytes of data
@@ -20,11 +20,11 @@ import net.i2p.util.Log;
  * @author jrandom
  */
 public class DataMessage extends I2NPMessageImpl {
-    private final static Log _log = new Log(DataMessage.class);
+    // private final static Log _log = new Log(DataMessage.class);
     public final static int MESSAGE_TYPE = 20;
     private byte _data[];
     
-    private static final int MAX_SIZE = 64*1024;
+    // private static final int MAX_SIZE = 64*1024;  // LINT -- field hides another field, and not used
     
     public DataMessage(I2PAppContext context) {
         super(context);
@@ -81,6 +81,7 @@ public class DataMessage extends I2NPMessageImpl {
         return curIndex;
     }
     
+    @Override
     protected void written() {
         super.written();
         _data = null;
@@ -88,10 +89,12 @@ public class DataMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getData());
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof DataMessage) ) {
             DataMessage msg = (DataMessage)object;
@@ -101,6 +104,7 @@ public class DataMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[DataMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java
index 4a6da92e3f148ad1342cca30131e6fed4a8e6b28..79dec2ee9b41d0ba257e3d2fbf0b9d2e934fdfee 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java
@@ -215,6 +215,7 @@ public class DatabaseLookupMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getSearchKey()) +
                DataHelper.hashCode(getFrom()) +
@@ -222,6 +223,7 @@ public class DatabaseLookupMessage extends I2NPMessageImpl {
                DataHelper.hashCode(_dontIncludePeers);
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof DatabaseLookupMessage) ) {
             DatabaseLookupMessage msg = (DatabaseLookupMessage)object;
@@ -234,6 +236,7 @@ public class DatabaseLookupMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[DatabaseLookupMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
index 2f1bc87e708f9253a97b0926bbcedbaeae490652..c8dc9aa901bc651814ce1124e2318a136e8cb5cf 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
@@ -110,6 +110,7 @@ public class DatabaseSearchReplyMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof DatabaseSearchReplyMessage) ) {
             DatabaseSearchReplyMessage msg = (DatabaseSearchReplyMessage)object;
@@ -121,12 +122,14 @@ public class DatabaseSearchReplyMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getSearchKey()) +
         DataHelper.hashCode(getFromHash()) +
         DataHelper.hashCode(_peerHashes);
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[DatabaseSearchReplyMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
index cb838daca3d6898ecdaa34fd6ea6e56c37059442..04ef417d3adfc776afcd465daa0f10452b83d378 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
@@ -231,6 +231,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getKey()) +
                DataHelper.hashCode(getLeaseSet()) +
@@ -241,6 +242,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
                DataHelper.hashCode(getReplyGateway());
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof DatabaseStoreMessage) ) {
             DatabaseStoreMessage msg = (DatabaseStoreMessage)object;
@@ -256,6 +258,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[DatabaseStoreMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/DateMessage.java b/router/java/src/net/i2p/data/i2np/DateMessage.java
index 554c31ef29c040cf604b2ebf02de3bb639a45ce3..b5388eda5ae8373d0e6c8607125511d4fd99b8f0 100644
--- a/router/java/src/net/i2p/data/i2np/DateMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DateMessage.java
@@ -53,10 +53,12 @@ public class DateMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return (int)getNow();
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof DateMessage) ) {
             DateMessage msg = (DateMessage)object;
@@ -66,6 +68,7 @@ public class DateMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[DateMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
index 3e46fc8fe5b3fa95f6397fe019b416463d3b0c77..8ad3ddff28c269a48c07b605acf182d2c84d926f 100644
--- a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
+++ b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
@@ -350,6 +350,7 @@ public class DeliveryInstructions extends DataStructureImpl {
                + getAdditionalInfoSize();
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof DeliveryInstructions))
             return false;
@@ -364,6 +365,7 @@ public class DeliveryInstructions extends DataStructureImpl {
                DataHelper.eq(getTunnelId(), instr.getTunnelId());
     }
     
+    @Override
     public int hashCode() {
         return (int)getDelaySeconds() +
                     getDeliveryMode() +
@@ -373,6 +375,7 @@ public class DeliveryInstructions extends DataStructureImpl {
                     DataHelper.hashCode(getTunnelId());
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(128);
         buf.append("[DeliveryInstructions: ");
diff --git a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
index 9f1d61b45acef64443bb8a4695be1deb14470582..ff8ad12cbdc4da0f3997379a6b8e552d481d116e 100644
--- a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
@@ -64,10 +64,12 @@ public class DeliveryStatusMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return (int)getMessageId() + (int)getArrival();
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof DeliveryStatusMessage) ) {
             DeliveryStatusMessage msg = (DeliveryStatusMessage)object;
@@ -78,6 +80,7 @@ public class DeliveryStatusMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[DeliveryStatusMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java b/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java
index 8f5763ae4819af4c7e30715ee8d001abd4d6cf67..4b3f919c84d9a8ed1839f9240ee315558f1162c7 100644
--- a/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java
+++ b/router/java/src/net/i2p/data/i2np/EndPointPrivateKey.java
@@ -44,17 +44,20 @@ public class EndPointPrivateKey extends DataStructureImpl {
 	_key.writeBytes(out);
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof EndPointPublicKey))
             return false;
 	return DataHelper.eq(getKey(), ((EndPointPublicKey)obj).getKey());
     }
     
+    @Override
     public int hashCode() {
 	if (_key == null) return 0;
         return getKey().hashCode(); 
     }
     
+    @Override
     public String toString() {
         return "[EndPointPrivateKey: " + getKey() + "]";
     }
diff --git a/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java b/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java
index 3920d0bda2ae6a3dedb5eb21efd2853dab6085a4..a366bf73bf83943741ae31dfd9c3b682f4c4df68 100644
--- a/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java
+++ b/router/java/src/net/i2p/data/i2np/EndPointPublicKey.java
@@ -44,17 +44,20 @@ public class EndPointPublicKey extends DataStructureImpl {
 	_key.writeBytes(out);
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof EndPointPublicKey))
             return false;
 	return DataHelper.eq(getKey(), ((EndPointPublicKey)obj).getKey());
     }
     
+    @Override
     public int hashCode() {
 	if (_key == null) return 0;
         return getKey().hashCode(); 
     }
     
+    @Override
     public String toString() {
         return "[EndPointPublicKey: " + getKey() + "]";
     }
diff --git a/router/java/src/net/i2p/data/i2np/GarlicClove.java b/router/java/src/net/i2p/data/i2np/GarlicClove.java
index cb6808756fc3a5b4129ddd5aa7930d121cebf393..aa37994a07fe0539bbc26a6ad12b3beff4048a54 100644
--- a/router/java/src/net/i2p/data/i2np/GarlicClove.java
+++ b/router/java/src/net/i2p/data/i2np/GarlicClove.java
@@ -156,6 +156,7 @@ public class GarlicClove extends DataStructureImpl {
             _log.debug("Written cert: " + _certificate);
     }
 
+    @Override
     public byte[] toByteArray() {
         byte rv[] = new byte[estimateSize()];
         int offset = 0;
@@ -186,6 +187,7 @@ public class GarlicClove extends DataStructureImpl {
                + _certificate.size(); // certificate
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof GarlicClove))
             return false;
@@ -197,6 +199,7 @@ public class GarlicClove extends DataStructureImpl {
                DataHelper.eq(getInstructions(),  clove.getInstructions());
     }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getCertificate()) +
                (int)getCloveId() +
@@ -205,6 +208,7 @@ public class GarlicClove extends DataStructureImpl {
                DataHelper.hashCode(getInstructions());
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(128);
         buf.append("[GarlicClove: ");
diff --git a/router/java/src/net/i2p/data/i2np/GarlicMessage.java b/router/java/src/net/i2p/data/i2np/GarlicMessage.java
index 5d76a2b224b3dbecdf5d885f0c263a6616ac9d04..357e7d2f5ee0603db1853e22155063ddf5b2c03c 100644
--- a/router/java/src/net/i2p/data/i2np/GarlicMessage.java
+++ b/router/java/src/net/i2p/data/i2np/GarlicMessage.java
@@ -67,15 +67,18 @@ public class GarlicMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getData());
     }
     
+    @Override
     protected void written() {
         super.written();
         _data = null;
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof GarlicMessage) ) {
             GarlicMessage msg = (GarlicMessage)object;
@@ -85,6 +88,7 @@ public class GarlicMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[GarlicMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
index b745db9c0dd423f243c62ed63e98a93678e06739..e241ff1f4a349b294d8cdbad5ad94939faef186f 100644
--- a/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
+++ b/router/java/src/net/i2p/data/i2np/I2NPMessageImpl.java
@@ -187,6 +187,7 @@ public abstract class I2NPMessageImpl extends DataStructureImpl implements I2NPM
             return calculateWrittenLength()+5;
     }
     
+    @Override
     public byte[] toByteArray() {
         byte data[] = new byte[getMessageSize()];
         int written = toByteArray(data);
diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java b/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java
index f89e4b8989796b5443e48ee8a09f67197faf694d..b611f46728173e34c2b49f1b05972859b83ad2e1 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java
@@ -232,6 +232,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl {
     }
     
     
+    @Override
     public byte[] toByteArray() {
         byte rv[] = super.toByteArray();
         if (rv == null)
@@ -239,6 +240,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl {
         return rv;
     }
 
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getNextRouter()) +
                DataHelper.hashCode(getNextTunnelId()) +
@@ -246,6 +248,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl {
                DataHelper.hashCode(getReplyTunnel());
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof TunnelCreateMessage) ) {
             TunnelCreateMessage msg = (TunnelCreateMessage)object;
@@ -258,6 +261,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[TunnelCreateMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java b/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java
index a5994f26de70308922e2faac825331862b479006..515436f5dd019e13fd606465ba9281812ef94983 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java
@@ -87,12 +87,14 @@ public class TunnelCreateStatusMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getReceiveTunnelId()) +
                getStatus() +
                (int)getNonce();
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof TunnelCreateStatusMessage) ) {
             TunnelCreateStatusMessage msg = (TunnelCreateStatusMessage)object;
@@ -104,6 +106,7 @@ public class TunnelCreateStatusMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[TunnelCreateStatusMessage: ");
diff --git a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
index a07b99069a0cce3a70aa40ac37149f3ec1e3918d..77c967f5871a3d19d772c479b9dab842033ab4b3 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
@@ -112,11 +112,13 @@ public class TunnelDataMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return (int)_tunnelId +
                DataHelper.hashCode(_data);
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof TunnelDataMessage) ) {
             TunnelDataMessage msg = (TunnelDataMessage)object;
@@ -127,6 +129,7 @@ public class TunnelDataMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public byte[] toByteArray() {
         byte rv[] = super.toByteArray();
         if (rv == null)
@@ -134,6 +137,7 @@ public class TunnelDataMessage extends I2NPMessageImpl {
         return rv;
     }
 
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[TunnelDataMessage:");
diff --git a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java
index 8fc7c9fd9e947c196ae771181396ad4682e76259..a436472e4319d679d1ff9d5ba3021a95cbb10d77 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java
@@ -90,6 +90,7 @@ public class TunnelGatewayMessage extends I2NPMessageImpl {
         I2NPMessageHandler h = new I2NPMessageHandler(_context);
         readMessage(data, offset, dataSize, type, h);
     }
+    @Override
     public void readMessage(byte data[], int offset, int dataSize, int type, I2NPMessageHandler handler) throws I2NPMessageException, IOException {
         if (type != MESSAGE_TYPE) throw new I2NPMessageException("Message type is incorrect for this message");
         int curIndex = offset;
@@ -110,11 +111,13 @@ public class TunnelGatewayMessage extends I2NPMessageImpl {
     
     public int getType() { return MESSAGE_TYPE; }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(getTunnelId()) +
                DataHelper.hashCode(_msg);
     }
     
+    @Override
     public boolean equals(Object object) {
         if ( (object != null) && (object instanceof TunnelGatewayMessage) ) {
             TunnelGatewayMessage msg = (TunnelGatewayMessage)object;
@@ -126,6 +129,7 @@ public class TunnelGatewayMessage extends I2NPMessageImpl {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("[TunnelGatewayMessage:");
diff --git a/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java b/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java
index b73cbfa792037ad9d7154ed8b78522fcd6f21f22..c4effc3034ced8c3ea10419b6a9c1ccf1c058330 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelSessionKey.java
@@ -44,17 +44,20 @@ public class TunnelSessionKey extends DataStructureImpl {
 	_key.writeBytes(out);
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof TunnelSessionKey))
             return false;
 	return DataHelper.eq(getKey(), ((TunnelSessionKey)obj).getKey());
     }
     
+    @Override
     public int hashCode() {
 	if (_key == null) return 0;
         return getKey().hashCode(); 
     }
     
+    @Override
     public String toString() {
         return "[TunnelSessionKey: " + getKey() + "]";
     }
diff --git a/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java b/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java
index ec1f887465b7dccac4a65a842e8e699ed2f769d0..03d017915f8b242ddafd659ce412e0ed781a472b 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelSigningPrivateKey.java
@@ -45,17 +45,20 @@ public class TunnelSigningPrivateKey extends DataStructureImpl {
 	_key.writeBytes(out);
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof TunnelSigningPrivateKey))
             return false;
 	return DataHelper.eq(getKey(), ((TunnelSigningPrivateKey)obj).getKey());
     }
     
+    @Override
     public int hashCode() {
 	if (_key == null) return 0;
         return getKey().hashCode(); 
     }
     
+    @Override
     public String toString() {
         return "[EndPointPrivateKey: " + getKey() + "]";
     }
diff --git a/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java b/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java
index 9ce7e79adecc30fc5805b6f1cb121e66237e95e3..1f3530949226645b2d532685b39b92103ce7998d 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelSigningPublicKey.java
@@ -44,17 +44,20 @@ public class TunnelSigningPublicKey extends DataStructureImpl {
 	_key.writeBytes(out);
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof TunnelSigningPublicKey))
             return false;
 	return DataHelper.eq(getKey(), ((TunnelSigningPublicKey)obj).getKey());
     }
     
+    @Override
     public int hashCode() {
 	if (_key == null) return 0;
         return getKey().hashCode(); 
     }
     
+    @Override
     public String toString() {
         return "[TunnelSigningPublicKey: " + getKey() + "]";
     }
diff --git a/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java b/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java
index aec62c93eb03b4970bb66353c112c35b211dce9f..7c2e4f00168a394b4cd295f8e350eb0ef22fadc1 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelVerificationStructure.java
@@ -69,6 +69,7 @@ public class TunnelVerificationStructure extends DataStructureImpl {
         _authSignature.writeBytes(out);
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || !(obj instanceof TunnelVerificationStructure))
             return false;
@@ -77,11 +78,13 @@ public class TunnelVerificationStructure extends DataStructureImpl {
         DataHelper.eq(getAuthorizationSignature(), str.getAuthorizationSignature());
     }
     
+    @Override
     public int hashCode() {
         if ( (_msgHash == null) || (_authSignature == null) ) return 0;
         return getMessageHash().hashCode() + getAuthorizationSignature().hashCode();
     }
     
+    @Override
     public String toString() {
         return "[TunnelVerificationStructure: " + getMessageHash() + " " + getAuthorizationSignature() + "]";
     }
diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java
index 4e94d77095aeaebaf4b02947503e1f6cea5c7ad4..791cc333c0189cbda314d0b7b52e9046b031263a 100644
--- a/router/java/src/net/i2p/router/Blocklist.java
+++ b/router/java/src/net/i2p/router/Blocklist.java
@@ -13,14 +13,12 @@ import java.net.InetAddress;
 import java.net.UnknownHostException;
 import java.util.*;
 
-import net.i2p.I2PAppContext;
 import net.i2p.data.Base64;
 import net.i2p.data.DataHelper;
 import net.i2p.data.Hash;
 import net.i2p.data.RouterAddress;
 import net.i2p.data.RouterInfo;
 import net.i2p.router.networkdb.kademlia.FloodfillNetworkDatabaseFacade;
-import net.i2p.util.HexDump;
 import net.i2p.util.Log;
 
 /**
@@ -55,22 +53,22 @@ public class Blocklist {
     private RouterContext _context;
     private long _blocklist[];
     private int _blocklistSize;
-    private Object _lock;
+    private final Object _lock = new Object();
     private Entry _wrapSave;
-    private Set _inProcess;
-    private Map _peerBlocklist;
-    private Set _singleIPBlocklist;
+    private final Set _inProcess = new HashSet(0);
+    private Map _peerBlocklist = new HashMap(0);
+    private final Set _singleIPBlocklist = new HashSet(0);
     
     public Blocklist(RouterContext context) {
         _context = context;
         _log = context.logManager().getLog(Blocklist.class);
         _blocklist = null;
         _blocklistSize = 0;
-        _lock = new Object();
+        // _lock = new Object();
         _wrapSave = null;
-        _inProcess = new HashSet(0);
-        _peerBlocklist = new HashMap(0);
-        _singleIPBlocklist = new HashSet(0);
+        // _inProcess = new HashSet(0);
+        // _peerBlocklist = new HashMap(0);
+        // _singleIPBlocklist = new HashSet(0);
     }
     
     public Blocklist() {
diff --git a/router/java/src/net/i2p/router/ClientTunnelSettings.java b/router/java/src/net/i2p/router/ClientTunnelSettings.java
index e0f95e611bc3e19ec2b22ebb6ec5069816c69bce..6cd3981954c642a23d53395f4b649dd98fe8f15b 100644
--- a/router/java/src/net/i2p/router/ClientTunnelSettings.java
+++ b/router/java/src/net/i2p/router/ClientTunnelSettings.java
@@ -44,6 +44,7 @@ public class ClientTunnelSettings {
         _outboundSettings.writeToProperties("outbound.", props);
     }
 
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         Properties p = new Properties();
diff --git a/router/java/src/net/i2p/router/InNetMessagePool.java b/router/java/src/net/i2p/router/InNetMessagePool.java
index 4ab5c77b41d1d190e99e04bf2bcce80e8d15f1f7..802aedec0a6903aa2b15dc2fbd837073a00cdb62 100644
--- a/router/java/src/net/i2p/router/InNetMessagePool.java
+++ b/router/java/src/net/i2p/router/InNetMessagePool.java
@@ -35,9 +35,9 @@ public class InNetMessagePool implements Service {
     private Log _log;
     private RouterContext _context;
     private HandlerJobBuilder _handlerJobBuilders[];
-    private List _pendingDataMessages;
-    private List _pendingDataMessagesFrom;
-    private List _pendingGatewayMessages;
+    private final List _pendingDataMessages;
+    private final List _pendingDataMessagesFrom;
+    private final List _pendingGatewayMessages;
     private SharedShortCircuitDataJob _shortCircuitDataJob;
     private SharedShortCircuitGatewayJob _shortCircuitGatewayJob;
     private boolean _alive;
diff --git a/router/java/src/net/i2p/router/JobImpl.java b/router/java/src/net/i2p/router/JobImpl.java
index 84190940bbbea99ae9273ea36535452ba433bcdd..a72f852967f3053345d2ba8b811a36787a1baae9 100644
--- a/router/java/src/net/i2p/router/JobImpl.java
+++ b/router/java/src/net/i2p/router/JobImpl.java
@@ -33,6 +33,7 @@ public abstract class JobImpl implements Job {
     
     public final RouterContext getContext() { return _context; }
     
+    @Override
     public String toString() { 
         StringBuffer buf = new StringBuffer(128);
         buf.append(super.toString());
diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java
index 915288cc667899c9afcf415302b96da26833beab..8ec40f56e51d7c3243274fc145cf627879d88869 100644
--- a/router/java/src/net/i2p/router/JobQueue.java
+++ b/router/java/src/net/i2p/router/JobQueue.java
@@ -33,7 +33,7 @@ public class JobQueue {
     private RouterContext _context;
     
     /** Integer (runnerId) to JobQueueRunner for created runners */
-    private HashMap _queueRunners;
+    private final HashMap _queueRunners;
     /** a counter to identify a job runner */
     private volatile static int _runnerId = 0;
     /** list of jobs that are ready to run ASAP */
@@ -41,7 +41,7 @@ public class JobQueue {
     /** list of jobs that are scheduled for running in the future */
     private ArrayList _timedJobs;
     /** job name to JobStat for that job */
-    private SortedMap _jobStats;
+    private final SortedMap _jobStats;
     /** how many job queue runners can go concurrently */
     private int _maxRunners = 1; 
     private QueuePumper _pumper;
@@ -50,7 +50,7 @@ public class JobQueue {
     /** have we been killed or are we alive? */
     private boolean _alive;
     
-    private Object _jobLock;
+    private final Object _jobLock;
     
     /** default max # job queue runners operating */
     private final static int DEFAULT_MAX_RUNNERS = 1;
@@ -94,7 +94,7 @@ public class JobQueue {
      * queue runners wait on this whenever they're not doing anything, and 
      * this gets notified *once* whenever there are ready jobs
      */
-    private Object _runnerLock = new Object();
+    private final Object _runnerLock = new Object();
     
     public JobQueue(RouterContext context) {
         _context = context;
diff --git a/router/java/src/net/i2p/router/JobStats.java b/router/java/src/net/i2p/router/JobStats.java
index d3cf345d0253eeb08a5600df8375958099d9dbdd..ec571299311603df7e0e13c74999b8e1d6019931 100644
--- a/router/java/src/net/i2p/router/JobStats.java
+++ b/router/java/src/net/i2p/router/JobStats.java
@@ -59,7 +59,9 @@ class JobStats {
             return 0; 
     }
     
+    @Override
     public int hashCode() { return _job.hashCode(); }
+    @Override
     public boolean equals(Object obj) {
         if ( (obj != null) && (obj instanceof JobStats) ) {
             JobStats stats = (JobStats)obj;
@@ -73,6 +75,7 @@ class JobStats {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("Over ").append(getRuns()).append(" runs, job <b>").append(getName()).append("</b> took ");
diff --git a/router/java/src/net/i2p/router/KeyManager.java b/router/java/src/net/i2p/router/KeyManager.java
index 4e2ed2c51891800665b5dbda10a52113538bcb37..9fc62a70f29a0213f450a8109faa26d13cd80e3d 100644
--- a/router/java/src/net/i2p/router/KeyManager.java
+++ b/router/java/src/net/i2p/router/KeyManager.java
@@ -41,7 +41,7 @@ public class KeyManager {
     private PublicKey _publicKey;
     private SigningPrivateKey _signingPrivateKey;
     private SigningPublicKey _signingPublicKey;
-    private Map _leaseSetKeys; // Destination --> LeaseSetKeys
+    private final Map _leaseSetKeys; // Destination --> LeaseSetKeys
     private SynchronizeKeysJob _synchronizeJob;
     
     public final static String PROP_KEYDIR = "router.keyBackupDir";
diff --git a/router/java/src/net/i2p/router/LeaseSetKeys.java b/router/java/src/net/i2p/router/LeaseSetKeys.java
index c88b0808afed3650f338c4b556d4b86fbc095af3..1017ab43db5c322d7b6e47488a40bad0013ae6fd 100644
--- a/router/java/src/net/i2p/router/LeaseSetKeys.java
+++ b/router/java/src/net/i2p/router/LeaseSetKeys.java
@@ -73,6 +73,7 @@ public class LeaseSetKeys extends DataStructureImpl {
 	_revocationKey.writeBytes(out);
     }
     
+    @Override
     public int hashCode() {
 	int rv = 0;
 	rv += DataHelper.hashCode(_dest);
@@ -81,6 +82,7 @@ public class LeaseSetKeys extends DataStructureImpl {
 	return rv;
     }
     
+    @Override
     public boolean equals(Object obj) {
 	if ( (obj != null) && (obj instanceof LeaseSetKeys) ) {
 	    LeaseSetKeys keys = (LeaseSetKeys)obj;
diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java
index d88d653de03ff70c24e358f5931d82c5edac73d2..cafbadd1cd5bb0cb23ce3725d9536c29c47e522c 100644
--- a/router/java/src/net/i2p/router/MessageHistory.java
+++ b/router/java/src/net/i2p/router/MessageHistory.java
@@ -26,7 +26,7 @@ import net.i2p.util.Log;
 public class MessageHistory {
     private Log _log;
     private RouterContext _context;
-    private List _unwrittenEntries; // list of raw entries (strings) yet to be written
+    private final List _unwrittenEntries = new ArrayList(64); // list of raw entries (strings) yet to be written
     private String _historyFile; // where to write 
     private String _localIdent; // placed in each entry to uniquely identify the local router
     private boolean _doLog; // true == we want to log
@@ -104,7 +104,7 @@ public class MessageHistory {
             _doLog = DEFAULT_KEEP_MESSAGE_HISTORY;
             _historyFile = filename;
             _localIdent = getName(_context.routerHash());
-            _unwrittenEntries = new ArrayList(64);
+            // _unwrittenEntries = new ArrayList(64);
             updateSettings();
             // clear the history file on startup
             if (_firstPass) {
diff --git a/router/java/src/net/i2p/router/MultiRouter.java b/router/java/src/net/i2p/router/MultiRouter.java
index 144c4e1db8a9059f9d92d66ded03f5c306e2d1ea..d8d316ae8aa0291d51e3ce370f0fb7aea4d553b6 100644
--- a/router/java/src/net/i2p/router/MultiRouter.java
+++ b/router/java/src/net/i2p/router/MultiRouter.java
@@ -58,6 +58,7 @@ public class MultiRouter {
         _defaultContext.clock().setOffset(0);
         
         Runtime.getRuntime().addShutdownHook(new Thread() {
+            @Override
             public void run() {
                 Thread.currentThread().setName("Router* Shutdown");
                 try { Thread.sleep(120*1000); } catch (InterruptedException ie) {}
diff --git a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
index e4a5ce08b663a7da1c9fc9752104dc33875bae0a..e1169b455a29aac32d8d54a5884e26001b8116c2 100644
--- a/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/NetworkDatabaseFacade.java
@@ -10,10 +10,6 @@ package net.i2p.router;
 
 import java.io.IOException;
 import java.io.Writer;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.Map;
 import java.util.Set;
 
 import net.i2p.data.Hash;
diff --git a/router/java/src/net/i2p/router/OutNetMessage.java b/router/java/src/net/i2p/router/OutNetMessage.java
index 2240af423c2465094b244823441be641b505b4ff..e1cd2a896622d6aa3489375315f843f36ec725b5 100644
--- a/router/java/src/net/i2p/router/OutNetMessage.java
+++ b/router/java/src/net/i2p/router/OutNetMessage.java
@@ -302,6 +302,7 @@ public class OutNetMessage {
         super.finalize();
     }
     */
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(128);
         buf.append("[OutNetMessage contains ");
@@ -365,6 +366,7 @@ public class OutNetMessage {
         }
     }
     
+    @Override
     public int hashCode() {
         int rv = 0;
         rv += DataHelper.hashCode(_message);
@@ -373,7 +375,10 @@ public class OutNetMessage {
         return rv;
     }
     
+    @Override
     public boolean equals(Object obj) {
+        if(obj == null) return false;
+        if(obj.getClass() != OutNetMessage.class) return false;
         return obj == this; // two OutNetMessages are different even if they contain the same message
     }
 }
diff --git a/router/java/src/net/i2p/router/PeerManagerFacade.java b/router/java/src/net/i2p/router/PeerManagerFacade.java
index 791b77616a5600e669af4a103bd37bf92e2a4efc..61b1d3799e5d56a9c2d5d10cb09c609bb85e9605 100644
--- a/router/java/src/net/i2p/router/PeerManagerFacade.java
+++ b/router/java/src/net/i2p/router/PeerManagerFacade.java
@@ -8,7 +8,6 @@ package net.i2p.router;
  *
  */
 
-import java.io.Writer;
 import java.util.List;
 
 import net.i2p.data.Hash;
diff --git a/router/java/src/net/i2p/router/PersistentKeyRing.java b/router/java/src/net/i2p/router/PersistentKeyRing.java
index d02275ea20c72bbb045269d74e52ac1d494ff1df..f1f4fe55a117bfb0fb09714b14f41c8aad871b68 100644
--- a/router/java/src/net/i2p/router/PersistentKeyRing.java
+++ b/router/java/src/net/i2p/router/PersistentKeyRing.java
@@ -4,16 +4,12 @@ import java.io.IOException;
 import java.io.Writer;
 
 import java.util.Iterator;
-import java.util.Map;
-import java.util.TreeMap;
 
-import net.i2p.data.Base64;
 import net.i2p.data.DataFormatException;
 import net.i2p.data.Destination;
 import net.i2p.data.Hash;
 import net.i2p.data.LeaseSet;
 import net.i2p.data.SessionKey;
-import net.i2p.router.TunnelPoolSettings;
 import net.i2p.util.KeyRing;
 
 /**
@@ -31,6 +27,7 @@ public class PersistentKeyRing extends KeyRing {
         addFromProperties();
     }
 
+    @Override
     public SessionKey put(Hash h, SessionKey sk) {
         SessionKey old = super.put(h, sk);
         if (!sk.equals(old)) {
@@ -67,6 +64,7 @@ public class PersistentKeyRing extends KeyRing {
         }
     }
 
+    @Override
     public void renderStatusHTML(Writer out) throws IOException {
         StringBuffer buf = new StringBuffer(1024);
         buf.append("\n<table border=\"1\"><tr><th align=\"left\">Destination Hash<th align=\"left\">Name or Dest.<th align=\"left\">Session Key</tr>");
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 37215f6c4b579129da3ee6ea784ebd72820a74e9..a4a707926efd30e64a14545c4d94e39e02fe73bd 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -9,7 +9,6 @@ package net.i2p.router;
  */
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.Writer;
@@ -53,7 +52,7 @@ import net.i2p.util.SimpleTimer;
 public class Router {
     private Log _log;
     private RouterContext _context;
-    private Properties _config;
+    private final Properties _config;
     private String _configFilename;
     private RouterInfo _routerInfo;
     private long _started;
@@ -64,7 +63,7 @@ public class Router {
     private int _gracefulExitCode;
     private I2PThread.OOMEventListener _oomListener;
     private ShutdownHook _shutdownHook;
-    private I2PThread _gracefulShutdownDetector;
+    private final I2PThread _gracefulShutdownDetector;
     
     public final static String PROP_CONFIG_FILE = "router.configLocation";
     
@@ -1350,6 +1349,7 @@ private static class ShutdownHook extends Thread {
         _context = ctx;
         _id = ++__id;
     }
+        @Override
     public void run() {
         setName("Router " + _id + " shutdown");
         Log l = _context.logManager().getLog(Router.class);
diff --git a/router/java/src/net/i2p/router/RouterClock.java b/router/java/src/net/i2p/router/RouterClock.java
index 3174e60276db72a52c40fedd1bf9d140d306dd99..d071013b2d3b13d0553f30560bd97c67b5a4bfbe 100644
--- a/router/java/src/net/i2p/router/RouterClock.java
+++ b/router/java/src/net/i2p/router/RouterClock.java
@@ -15,11 +15,11 @@ import net.i2p.util.Log;
  */
 public class RouterClock extends Clock {
 
-    RouterContext _context;
+    RouterContext _contextRC; // LINT field hides another field
 
     public RouterClock(RouterContext context) {
         super(context);
-        _context = context;
+        _contextRC = context;
     }
 
     /**
@@ -27,6 +27,7 @@ public class RouterClock extends Clock {
      * value means that we are slow, while a negative value means we are fast.
      *
      */
+    @Override
     public void setOffset(long offsetMs, boolean force) {
 
         if (false) return;
@@ -53,10 +54,10 @@ public class RouterClock extends Clock {
             }
 
             // If so configured, check sanity of proposed clock offset
-            if (Boolean.valueOf(_context.getProperty("router.clockOffsetSanityCheck","true")).booleanValue() == true) {
+            if (Boolean.valueOf(_contextRC.getProperty("router.clockOffsetSanityCheck","true")).booleanValue() == true) {
 
                 // Try calculating peer clock skew
-                Long peerClockSkew = _context.commSystem().getFramedAveragePeerClockSkew(50);
+                Long peerClockSkew = _contextRC.commSystem().getFramedAveragePeerClockSkew(50);
 
                 if (peerClockSkew != null) {
 
@@ -88,9 +89,9 @@ public class RouterClock extends Clock {
                 getLog().info("Updating clock offset to " + offsetMs + "ms from " + _offset + "ms");
             
             if (!_statCreated)
-                _context.statManager().createRateStat("clock.skew", "How far is the already adjusted clock being skewed?", "Clock", new long[] { 10*60*1000, 3*60*60*1000, 24*60*60*60 });
+                _contextRC.statManager().createRateStat("clock.skew", "How far is the already adjusted clock being skewed?", "Clock", new long[] { 10*60*1000, 3*60*60*1000, 24*60*60*60 });
                 _statCreated = true;
-            _context.statManager().addRateData("clock.skew", delta, 0);
+            _contextRC.statManager().addRateData("clock.skew", delta, 0);
         } else {
             getLog().log(Log.INFO, "Initializing clock offset to " + offsetMs + "ms from " + _offset + "ms");
         }
diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java
index ba82fb839365677049205a9b15c7231037903dcc..782bc8a87550fffd01b3620a64e587a4aae36f12 100644
--- a/router/java/src/net/i2p/router/RouterContext.java
+++ b/router/java/src/net/i2p/router/RouterContext.java
@@ -58,7 +58,7 @@ public class RouterContext extends I2PAppContext {
     private MessageValidator _messageValidator;
     private MessageStateMonitor _messageStateMonitor;
     private RouterThrottle _throttle;
-    private RouterClock _clock;
+    private RouterClock _clockX;  // LINT field hides another field, hope rename won't break anything.
     private Calculator _integrationCalc;
     private Calculator _speedCalc;
     private Calculator _capacityCalc;
@@ -262,6 +262,7 @@ public class RouterContext extends I2PAppContext {
     /** how do we rank the capacity of profiles? */
     public Calculator capacityCalculator() { return _capacityCalc; }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(512);
         buf.append("RouterContext: ").append(super.toString()).append('\n');
@@ -294,6 +295,7 @@ public class RouterContext extends I2PAppContext {
      * I2PAppContext says.
      *
      */
+    @Override
     public String getProperty(String propName) {
         if (_router != null) {
             String val = _router.getConfigSetting(propName);
@@ -306,6 +308,7 @@ public class RouterContext extends I2PAppContext {
      * I2PAppContext says.
      *
      */
+    @Override
     public String getProperty(String propName, String defaultVal) {
         if (_router != null) {
             String val = _router.getConfigSetting(propName);
@@ -317,6 +320,7 @@ public class RouterContext extends I2PAppContext {
     /**
      * Return an int with an int default
      */
+    @Override
     public int getProperty(String propName, int defaultVal) {
         if (_router != null) {
             String val = _router.getConfigSetting(propName);
@@ -339,14 +343,16 @@ public class RouterContext extends I2PAppContext {
      * that it triggers initializeClock() of which we definitely
      * need the local version to run.
      */
+    @Override
     public Clock clock() {
         if (!_clockInitialized) initializeClock();
-        return _clock;
+        return _clockX;
     }
+    @Override
     protected void initializeClock() {
         synchronized (this) {
-            if (_clock == null)
-                _clock = new RouterClock(this);
+            if (_clockX == null)
+                _clockX = new RouterClock(this);
             _clockInitialized = true;
         }
     }
diff --git a/router/java/src/net/i2p/router/RouterDoSThrottle.java b/router/java/src/net/i2p/router/RouterDoSThrottle.java
index c161ddda584547957b42f5e30b0440afbde5ff7e..79471627a24996782fc018d6d0a5616812c7a887 100644
--- a/router/java/src/net/i2p/router/RouterDoSThrottle.java
+++ b/router/java/src/net/i2p/router/RouterDoSThrottle.java
@@ -19,6 +19,7 @@ class RouterDoSThrottle extends RouterThrottleImpl {
     private static final long LOOKUP_THROTTLE_PERIOD = 10*1000;
     private static final long LOOKUP_THROTTLE_MAX = 20;
     
+    @Override
     public boolean acceptNetDbLookupRequest(Hash key) { 
         // if we were going to refuse it anyway, drop it
         boolean shouldAccept = super.acceptNetDbLookupRequest(key);
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 450adcf28995877df39879b32a562c700c4a4985..1d4797d6fc46971d6b640b96122df2e67994299a 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -17,7 +17,7 @@ import net.i2p.CoreVersion;
 public class RouterVersion {
     public final static String ID = "$Revision: 1.548 $ $Date: 2008-06-07 23:00:00 $";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 0;
+    public final static long BUILD = 1;
     public static void main(String args[]) {
         System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
         System.out.println("Router ID: " + RouterVersion.ID);
diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java
index 29d384de90acc327720d158a3e145bfe443f7a05..1416cc9fe4dc5dda858680187d4a3e16c951341b 100644
--- a/router/java/src/net/i2p/router/Shitlist.java
+++ b/router/java/src/net/i2p/router/Shitlist.java
@@ -13,8 +13,6 @@ import java.io.Writer;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.ArrayList;
 import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
diff --git a/router/java/src/net/i2p/router/TunnelManagerFacade.java b/router/java/src/net/i2p/router/TunnelManagerFacade.java
index da0482e6ffd4072eac1416e95e3397cf0222fd20..8ddc1e060f59ea9fdcafb1488024b1374a749ce1 100644
--- a/router/java/src/net/i2p/router/TunnelManagerFacade.java
+++ b/router/java/src/net/i2p/router/TunnelManagerFacade.java
@@ -8,8 +8,6 @@ package net.i2p.router;
  *
  */
 
-import java.io.IOException;
-import java.io.Writer;
 import java.util.Set;
 
 import net.i2p.data.Destination;
diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java
index a92470d2ee14114fd8095016a7fece2558bc2ee1..fab33d919a077b1d5af69126aca2e734f66fcc2b 100644
--- a/router/java/src/net/i2p/router/TunnelPoolSettings.java
+++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java
@@ -185,6 +185,7 @@ public class TunnelPoolSettings {
         }
     }
 
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         Properties p = new Properties();
diff --git a/router/java/src/net/i2p/router/TunnelSettings.java b/router/java/src/net/i2p/router/TunnelSettings.java
index 3ea8baa5671fe87e4846a47f69919bcad2a22c7c..99249f7c75f3c7042349711874b7e54b81e26ba3 100644
--- a/router/java/src/net/i2p/router/TunnelSettings.java
+++ b/router/java/src/net/i2p/router/TunnelSettings.java
@@ -105,6 +105,7 @@ public class TunnelSettings extends DataStructureImpl {
     }
     
     
+    @Override
     public int hashCode() {
         int rv = 0;
         rv += _includeDummy ? 100 : 0;
@@ -118,6 +119,7 @@ public class TunnelSettings extends DataStructureImpl {
         return rv;
     }
     
+    @Override
     public boolean equals(Object obj) {
         if ( (obj != null) && (obj instanceof TunnelSettings) ) {
             TunnelSettings settings = (TunnelSettings)obj;
diff --git a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
index 4f979c5c937a28a5638ebbf46a3398e1a33d3e80..5611f13774680f50cbf22d1743f6e6e3b6d5d78a 100644
--- a/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
+++ b/router/java/src/net/i2p/router/client/ClientConnectionRunner.java
@@ -13,7 +13,6 @@ import java.io.OutputStream;
 import java.net.Socket;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.ArrayList;
-import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -73,7 +72,7 @@ public class ClientConnectionRunner {
      * This contains the last 10 MessageIds that have had their (non-ack) status 
      * delivered to the client (so that we can be sure only to update when necessary)
      */
-    private List _alreadyProcessed;
+    private final List _alreadyProcessed;
     private ClientWriterRunner _writer;
     private Hash _destHashCache;
     /** are we, uh, dead */
@@ -111,7 +110,7 @@ public class ClientConnectionRunner {
             t.setDaemon(true);
             t.setPriority(I2PThread.MAX_PRIORITY);
             t.start();
-            _out = _socket.getOutputStream();
+            _out = _socket.getOutputStream(); // LINT -- OWCH! needs a better way so it can be final.
             _reader.startReading();
         } catch (IOException ioe) {
             _log.error("Error starting up the runner", ioe);
@@ -412,7 +411,7 @@ public class ClientConnectionRunner {
             }
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("after writeMessage("+ msg.getClass().getName() + "): " 
-                           + (_context.clock().now()-before) + "ms");;
+                           + (_context.clock().now()-before) + "ms");
         } catch (I2CPMessageException ime) {
             _log.error("Message exception sending I2CP message: " + ime);
             stopRunning();
@@ -464,7 +463,7 @@ public class ClientConnectionRunner {
     // this *should* be mod 65536, but UnsignedInteger is still b0rked.  FIXME
     private final static int MAX_MESSAGE_ID = 32767;
     private static volatile int _messageId = RandomSource.getInstance().nextInt(MAX_MESSAGE_ID); // messageId counter
-    private static Object _messageIdLock = new Object();
+    private final static Object _messageIdLock = new Object();
     
     static int getNextMessageId() { 
         synchronized (_messageIdLock) {
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index 9b5eb7c4ccbe24886646d0c011f1aeceba41ee6d..85e7d9ec76c0bd7cf8dea1608af4b35d89e72a31 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -41,8 +41,8 @@ import net.i2p.util.Log;
 public class ClientManager {
     private Log _log;
     private ClientListenerRunner _listener;
-    private HashMap _runners;        // Destination --> ClientConnectionRunner
-    private Set _pendingRunners; // ClientConnectionRunner for clients w/out a Dest yet
+    private final HashMap _runners;        // Destination --> ClientConnectionRunner
+    private final Set _pendingRunners; // ClientConnectionRunner for clients w/out a Dest yet
     private RouterContext _ctx;
 
     /** ms to wait before rechecking for inbound messages to deliver to clients */
diff --git a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
index 51b8b4cb2513a67ba24cd2b44fb41f42af5102c8..eddf13dd8e8d672e31cc5679811f390e3d2e8fef 100644
--- a/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
+++ b/router/java/src/net/i2p/router/client/ClientManagerFacadeImpl.java
@@ -74,9 +74,11 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade {
             startup();
     }
     
+    @Override
     public boolean isAlive() { return _manager != null && _manager.isAlive(); }
 
     private static final long MAX_TIME_TO_REBUILD = 10*60*1000;
+    @Override
     public boolean verifyClientLiveliness() {
         if (_manager == null) return true;
         boolean lively = true;
@@ -167,6 +169,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade {
         }
     }
 
+    @Override
     public boolean shouldPublishLeaseSet(Hash destinationHash) { return _manager.shouldPublishLeaseSet(destinationHash); }
     
     public void messageDeliveryStatusUpdate(Destination fromDest, MessageId id, boolean delivered) {
@@ -196,6 +199,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade {
         }
     }
     
+    @Override
     public void renderStatusHTML(Writer out) throws IOException { 
         if (_manager != null)
             _manager.renderStatusHTML(out); 
@@ -206,6 +210,7 @@ public class ClientManagerFacadeImpl extends ClientManagerFacade {
      *
      * @return set of Destination objects
      */
+    @Override
     public Set listClients() {
         if (_manager != null)
             return _manager.listClients();
diff --git a/router/java/src/net/i2p/router/message/CloveSet.java b/router/java/src/net/i2p/router/message/CloveSet.java
index 1774c9be02a6640cc8da59615e5f644ed524caed..d18aa55b44baed89829747cf5e0b0b4475ec8784 100644
--- a/router/java/src/net/i2p/router/message/CloveSet.java
+++ b/router/java/src/net/i2p/router/message/CloveSet.java
@@ -42,6 +42,7 @@ public class CloveSet {
     public long getExpiration() { return _expiration; }
     public void setExpiration(long expiration) { _expiration = expiration; }
     
+    @Override
     public String toString() { 
 	StringBuffer buf = new StringBuffer(128);
 	buf.append("{");
diff --git a/router/java/src/net/i2p/router/message/GarlicConfig.java b/router/java/src/net/i2p/router/message/GarlicConfig.java
index 3b6359a89d4c2b72955ebf0c7a086da536902c04..ead346e0067f239af6f7caca0acdab0f66f549e9 100644
--- a/router/java/src/net/i2p/router/message/GarlicConfig.java
+++ b/router/java/src/net/i2p/router/message/GarlicConfig.java
@@ -156,6 +156,7 @@ public class GarlicConfig {
     
     protected String getSubData() { return ""; }
     private final static String NL = System.getProperty("line.separator");
+    @Override
     public String toString() {
 	StringBuffer buf = new StringBuffer();
 	buf.append("<garlicConfig>").append(NL);
diff --git a/router/java/src/net/i2p/router/message/GarlicMessageParser.java b/router/java/src/net/i2p/router/message/GarlicMessageParser.java
index 3e99e0731688dba7b279126ac3825f600ae9b5e6..84ed50b2c56baf9b41cd6642dc759d2df31bf1f9 100644
--- a/router/java/src/net/i2p/router/message/GarlicMessageParser.java
+++ b/router/java/src/net/i2p/router/message/GarlicMessageParser.java
@@ -9,8 +9,6 @@ package net.i2p.router.message;
  */
 
 import java.util.Date;
-import java.util.HashSet;
-import java.util.Set;
 
 import net.i2p.data.Certificate;
 import net.i2p.data.DataFormatException;
diff --git a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java
index a114764f6a0286e0d30aff5e5bf95c3319c03303..05aecfb89b4ab0980a81831d0023b6f6bdd56949 100644
--- a/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java
+++ b/router/java/src/net/i2p/router/message/HandleGarlicMessageJob.java
@@ -106,6 +106,7 @@ public class HandleGarlicMessageJob extends JobImpl implements GarlicMessageRece
         }
     }
     
+    @Override
     public void dropped() {
         getContext().messageHistory().messageProcessingError(_message.getUniqueId(), 
                                                          _message.getClass().getName(), 
diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java b/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java
index b24154d6f63ec475fdc6e60b9a045adde3608c50..3d15ce07cd6179475a405bb9990287d0430c4109 100644
--- a/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java
+++ b/router/java/src/net/i2p/router/message/OutboundClientMessageStatus.java
@@ -20,7 +20,7 @@ class OutboundClientMessageStatus {
     private ClientMessage _msg;
     private PayloadGarlicConfig _clove;
     private LeaseSet _leaseSet;
-    private Set _sent;
+    private final Set _sent;
     private int _numLookups;
     private boolean _success;
     private boolean _failure;
@@ -114,6 +114,7 @@ class OutboundClientMessageStatus {
         public Hash getGateway() { return _gateway; }
         public TunnelId getTunnel() { return _tunnel; }
 
+        @Override
         public int hashCode() {
             int rv = 0;
             if (_gateway != null)
@@ -123,6 +124,7 @@ class OutboundClientMessageStatus {
             return rv;
         }
 
+        @Override
         public boolean equals(Object o) {
             if (o == null) return false;
             if (o.getClass() != Tunnel.class) return false;
diff --git a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
index eb2c0488634cd8c3a88672a1bf3d12037689dafa..2b2a8f9c88741c865d0a6640bf2e0e7d6d9d45a5 100644
--- a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
+++ b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
@@ -33,6 +33,7 @@ public class PayloadGarlicConfig extends GarlicConfig {
     }
     public I2NPMessage getPayload() { return _payload; }
  
+    @Override
     protected String getSubData() { 
 	StringBuffer buf = new StringBuffer();
 	buf.append("<payloadMessage>").append(_payload).append("</payloadMessage>");
diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
index a953bd59595d65fb7887ac690334a187c0cc2dbb..76bc897ed149d6acb7329284fad17b52417e0565 100644
--- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseLookupMessageJob.java
@@ -262,6 +262,7 @@ public class HandleDatabaseLookupMessageJob extends JobImpl {
     
     public String getName() { return "Handle Database Lookup Message"; }
 
+    @Override
     public void dropped() {
         getContext().messageHistory().messageProcessingError(_message.getUniqueId(), 
                                                          _message.getClass().getName(), 
diff --git a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java
index 3a395db0ace649c6a49d1c0041f0bbba6eaab899..c4a0b9f451af4ecc04515fae490be2ab43d266c4 100644
--- a/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/HandleDatabaseStoreMessageJob.java
@@ -132,6 +132,7 @@ public class HandleDatabaseStoreMessageJob extends JobImpl {
  
     public String getName() { return "Handle Database Store Message"; }
     
+    @Override
     public void dropped() {
         getContext().messageHistory().messageProcessingError(_message.getUniqueId(), _message.getClass().getName(), "Dropped due to overload");
     }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java
index 388afa8869627306fbbc7c0f47b6d1cfb720e175..e8e0a01f102212832cd5ba92f5fe17dc8cbf6476 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/ExploreJob.java
@@ -11,7 +11,6 @@ package net.i2p.router.networkdb.kademlia;
 import java.util.List;
 
 import net.i2p.data.Hash;
-import net.i2p.data.RouterInfo;
 import net.i2p.data.TunnelId;
 import net.i2p.data.i2np.DatabaseLookupMessage;
 import net.i2p.router.RouterContext;
@@ -41,11 +40,11 @@ class ExploreJob extends SearchJob {
     /** only send the closest "dont tell me about" refs...
      *  Override to make this bigger because we want to include both the
      *  floodfills and the previously-queried peers */
-    static final int MAX_CLOSEST = 20;
+    static final int MAX_CLOSEST = 20; // LINT -- field hides another field, this isn't an override.
     
     /** Override to make this shorter, since we don't sort out the
      *  unresponsive ff peers like we do in FloodOnlySearchJob */
-    static final int PER_FLOODFILL_PEER_TIMEOUT = 5*1000;
+    static final int PER_FLOODFILL_PEER_TIMEOUT = 5*1000; // LINT -- field hides another field, this isn't an override.
 
     /**
      * Create a new search for the routingKey specified
@@ -78,6 +77,7 @@ class ExploreJob extends SearchJob {
      * @param replyGateway gateway for the reply tunnel
      * @param expiration when the search should stop
      */
+    @Override
     protected DatabaseLookupMessage buildMessage(TunnelId replyTunnelId, Hash replyGateway, long expiration) {
         DatabaseLookupMessage msg = new DatabaseLookupMessage(getContext(), true);
         msg.setSearchKey(getState().getTarget());
@@ -112,11 +112,13 @@ class ExploreJob extends SearchJob {
      * replies sent back to us directly).  This uses the similar overrides as the other buildMessage above.
      *
      */
+    @Override
     protected DatabaseLookupMessage buildMessage(long expiration) {
         return buildMessage(null, getContext().router().getRouterInfo().getIdentity().getHash(), expiration);
     }
     
     /** max # of concurrent searches */
+    @Override
     protected int getBredth() { return EXPLORE_BREDTH; }
     
     
@@ -125,6 +127,7 @@ class ExploreJob extends SearchJob {
      * number of peers that we didn't know about before.
      *
      */
+    @Override
     protected void newPeersFound(int numNewPeers) {
         // who cares about how many new peers.  well, maybe we do.  but for now,
         // we'll do the simplest thing that could possibly work.
@@ -139,5 +142,6 @@ class ExploreJob extends SearchJob {
      *
      */
     
+    @Override
     public String getName() { return "Kademlia NetDb Explore"; }
 }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java
index b8c46fc33eecf366c8b523a438e1c697c6bdc5be..ff98d1429b5233a2f29870bc9d4782d5de706b43 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlyLookupSelector.java
@@ -3,7 +3,6 @@ package net.i2p.router.networkdb.kademlia;
 import net.i2p.data.i2np.DatabaseSearchReplyMessage;
 import net.i2p.data.i2np.DatabaseStoreMessage;
 import net.i2p.data.i2np.I2NPMessage;
-import net.i2p.router.JobImpl;
 import net.i2p.router.MessageSelector;
 import net.i2p.router.RouterContext;
 import net.i2p.util.Log;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java
index 5e68863026152c5ba58561df3759bfb06fc6c6ee..e5b5e962d6b076a2bde7f651b3f8ca08aef6661f 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodOnlySearchJob.java
@@ -8,11 +8,7 @@ import java.util.List;
 
 import net.i2p.data.Hash;
 import net.i2p.data.i2np.DatabaseLookupMessage;
-import net.i2p.data.i2np.DatabaseSearchReplyMessage;
-import net.i2p.data.i2np.DatabaseStoreMessage;
-import net.i2p.data.i2np.I2NPMessage;
 import net.i2p.router.Job;
-import net.i2p.router.JobImpl;
 import net.i2p.router.MessageSelector;
 import net.i2p.router.OutNetMessage;
 import net.i2p.router.ReplyJob;
@@ -44,8 +40,8 @@ class FloodOnlySearchJob extends FloodSearchJob {
     protected Log _log;
     private FloodfillNetworkDatabaseFacade _facade;
     protected Hash _key;
-    private List _onFind;
-    private List _onFailed;
+    private final List _onFind;
+    private final List _onFailed;
     private long _expiration;
     protected int _timeoutMs;
     private long _origExpiration;
@@ -54,9 +50,9 @@ class FloodOnlySearchJob extends FloodSearchJob {
     private volatile boolean _dead;
     private long _created;
     private boolean _shouldProcessDSRM;
-    private HashSet _unheardFrom;
+    private final HashSet _unheardFrom;
     
-    protected List _out;
+    protected final List _out;
     protected MessageSelector _replySelector;
     protected ReplyJob _onReply;
     protected Job _onTimeout;
@@ -83,6 +79,7 @@ class FloodOnlySearchJob extends FloodSearchJob {
         _created = System.currentTimeMillis();
         _shouldProcessDSRM = false;
     }
+    @Override
     void addDeferred(Job onFind, Job onFailed, long timeoutMs, boolean isLease) {
         if (_dead) {
             getContext().jobQueue().addJob(onFailed);
@@ -91,10 +88,12 @@ class FloodOnlySearchJob extends FloodSearchJob {
             if (onFailed != null) synchronized (_onFailed) { _onFailed.add(onFailed); }
         }
     }
+    @Override
     public long getExpiration() { return _expiration; }
     public long getCreated() { return _created; }
     public boolean shouldProcessDSRM() { return _shouldProcessDSRM; }
     private static final int CONCURRENT_SEARCHES = 2;
+    @Override
     public void runJob() {
         // pick some floodfill peers and send out the searches
         List floodfillPeers = _facade.getFloodfillPeers();
@@ -184,10 +183,14 @@ class FloodOnlySearchJob extends FloodSearchJob {
             failed();
         }
     }
+    @Override
     public String getName() { return "NetDb flood search (phase 1)"; }
     
+    @Override
     Hash getKey() { return _key; }
+    @Override
     void decrementRemaining() { if (_lookupsRemaining > 0) _lookupsRemaining--; }
+    @Override
     int getLookupsRemaining() { return _lookupsRemaining; }
     /** Note that we heard from the peer */
     void decrementRemaining(Hash peer) {
@@ -197,6 +200,7 @@ class FloodOnlySearchJob extends FloodSearchJob {
         }
     }
     
+    @Override
     void failed() {
         synchronized (this) {
             if (_dead) return;
@@ -224,6 +228,7 @@ class FloodOnlySearchJob extends FloodSearchJob {
             }
         }
     }
+    @Override
     void success() {
         synchronized (this) {
             if (_dead) return;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
index 575de5e7b356fc37e94ff5f77660576d0490900a..3772b18d1ee2694f0e542ac20f2b462d73c3cc4f 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillNetworkDatabaseFacade.java
@@ -31,7 +31,7 @@ import net.i2p.util.Log;
  */
 public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacade {
     public static final char CAPACITY_FLOODFILL = 'f';
-    private Map _activeFloodQueries;
+    private final Map _activeFloodQueries;
     private boolean _floodfillEnabled;
     /** for testing, see isFloodfill() below */
     private static String _alwaysQuery;
@@ -55,11 +55,13 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         _context.statManager().createRateStat("netDb.republishQuantity", "How many peers do we need to send a found leaseSet to?", "NetworkDatabase", new long[] { 10*60*1000l, 60*60*1000l, 3*60*60*1000l, 24*60*60*1000l });
     }
 
+    @Override
     public void startup() {
         super.startup();
         _context.jobQueue().addJob(new FloodfillMonitorJob(_context, this));
     }
 
+    @Override
     protected void createHandlers() {
         _context.inNetMessagePool().registerHandlerJobBuilder(DatabaseLookupMessage.MESSAGE_TYPE, new FloodfillDatabaseLookupMessageHandler(_context));
         _context.inNetMessagePool().registerHandlerJobBuilder(DatabaseStoreMessage.MESSAGE_TYPE, new FloodfillDatabaseStoreMessageHandler(_context, this));
@@ -70,6 +72,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
     /**
      * @throws IllegalArgumentException if the local router info is invalid
      */
+    @Override
     public void publish(RouterInfo localRouterInfo) throws IllegalArgumentException {
         if (localRouterInfo == null) throw new IllegalArgumentException("wtf, null localRouterInfo?");
         if (_context.router().isHidden()) return; // DE-nied!
@@ -77,6 +80,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
         sendStore(localRouterInfo.getIdentity().calculateHash(), localRouterInfo, null, null, PUBLISH_TIMEOUT, null);
     }
     
+    @Override
     public void sendStore(Hash key, DataStructure ds, Job onSuccess, Job onFailure, long sendTimeout, Set toIgnore) {
         // if we are a part of the floodfill netDb, don't send out our own leaseSets as part 
         // of the flooding - instead, send them to a random floodfill peer so *they* can flood 'em out.
@@ -131,6 +135,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
     private static final int FLOOD_PRIORITY = 200;
     private static final int FLOOD_TIMEOUT = 30*1000;
     
+    @Override
     protected PeerSelector createPeerSelector() { return new FloodfillPeerSelector(_context); }
     
     public void setFloodfillEnabled(boolean yes) { _floodfillEnabled = yes; }
@@ -183,6 +188,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
      * without any match)
      *
      */
+    @Override
     SearchJob search(Hash key, Job onFindJob, Job onFailedLookupJob, long timeoutMs, boolean isLease) {
         //if (true) return super.search(key, onFindJob, onFailedLookupJob, timeoutMs, isLease);
         if (key == null) throw new IllegalArgumentException("searchin for nothin, eh?");
@@ -282,6 +288,7 @@ public class FloodfillNetworkDatabaseFacade extends KademliaNetworkDatabaseFacad
       * Search for a newer router info, drop it from the db if the search fails,
       * unless just started up or have bigger problems.
       */
+    @Override
     protected void lookupBeforeDropping(Hash peer, RouterInfo info) {
         // following are some special situations, we don't want to
         // drop the peer in these cases
@@ -356,8 +363,8 @@ class FloodSearchJob extends JobImpl {
     private Log _log;
     private FloodfillNetworkDatabaseFacade _facade;
     private Hash _key;
-    private List _onFind;
-    private List _onFailed;
+    private final List _onFind;
+    private final List _onFailed;
     private long _expiration;
     private int _timeoutMs;
     private long _origExpiration;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
index 7504e660a02070e18b284bc779709b9ddbcf73b9..049140397fc4127a8cbe7adc501a2475ea89f68e 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillPeerSelector.java
@@ -31,10 +31,12 @@ class FloodfillPeerSelector extends PeerSelector {
      *
      * @return List of Hash for the peers selected
      */
+    @Override
     public List selectMostReliablePeers(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { 
         return selectNearestExplicitThin(key, maxNumRouters, peersToIgnore, kbuckets, true);
     }
 
+    @Override
     public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { 
         return selectNearestExplicitThin(key, maxNumRouters, peersToIgnore, kbuckets, false);
     }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java
index f3880597d8334de33014b199d9758255dcb311f4..7c37cfc18ee1ab1d8d189a7138a12889233ef5aa 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillStoreJob.java
@@ -34,17 +34,21 @@ class FloodfillStoreJob extends StoreJob {
         _facade = facade;
     }
 
+    @Override
     protected int getParallelization() { return 1; }
+    @Override
     protected int getRedundancy() { return 1; }
 
     /**
      * Send was totally successful
      */
+    @Override
     protected void succeed() {
         super.succeed();
         if (_state != null)
             getContext().jobQueue().addJob(new FloodfillVerifyStoreJob(getContext(), _state.getTarget(), _facade));
     }
     
+    @Override
     public String getName() { return "Floodfill netDb store"; }
 }
\ No newline at end of file
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java
index e3a6b6df9d372192c2118b1c5c63440a01d446aa..f8c7adf42492e52ad45f3393bf30531003cbd8ae 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseLookupMessageJob.java
@@ -30,6 +30,7 @@ public class HandleFloodfillDatabaseLookupMessageJob extends HandleDatabaseLooku
         super(ctx, receivedMessage, from, fromHash);    
     }
     
+    @Override
     protected boolean answerAllQueries() {
         if (!FloodfillNetworkDatabaseFacade.floodfillEnabled(getContext())) return false;
         return FloodfillNetworkDatabaseFacade.isFloodfill(getContext().router().getRouterInfo());
@@ -40,6 +41,7 @@ public class HandleFloodfillDatabaseLookupMessageJob extends HandleDatabaseLooku
      * This gets the word out to routers that we are no longer floodfill, so they
      * will stop bugging us.
      */
+    @Override
     protected void sendClosest(Hash key, Set routerInfoSet, Hash toPeer, TunnelId replyTunnel) {
         super.sendClosest(key, routerInfoSet, toPeer, replyTunnel);
 
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
index 1b00a1b251373fdc084e0357b2c3173491951327..505638ecbdb31246eec5110d01c4d80c5cc9a8a4 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/HandleFloodfillDatabaseStoreMessageJob.java
@@ -184,6 +184,7 @@ public class HandleFloodfillDatabaseStoreMessageJob extends JobImpl {
  
     public String getName() { return "Handle Database Store Message"; }
     
+    @Override
     public void dropped() {
         getContext().messageHistory().messageProcessingError(_message.getUniqueId(), _message.getClass().getName(), "Dropped due to overload");
     }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
index 5d8e186f50728db534008019467733dab36e6705..c6668a41e4fcefd5527dce2c5f0682228202cb2e 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
@@ -26,7 +26,7 @@ import net.i2p.util.RandomSource;
 class KBucketImpl implements KBucket {
     private Log _log;
     /** set of Hash objects for the peers in the kbucket */
-    private List _entries;
+    private final List _entries;
     /** we center the kbucket set on the given hash, and derive distances from this */
     private Hash _local;
     /** include if any bits equal or higher to this bit (in big endian order) */
@@ -328,6 +328,7 @@ class KBucketImpl implements KBucket {
             return BigInteger.ZERO.setBit(_begin);
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(1024);
         buf.append("KBucketImpl: ");
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
index 6b3ca79d6c3544a63139ce72fa673b820ea38c61..ddbfb06f7f176a35a51fb976aafa8877c32426f2 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
@@ -138,6 +138,7 @@ class KBucketSet {
         _log.info(toString());
     }
     
+    @Override
     public String toString() {
         BigInteger us = new BigInteger(1, _us.getData());
         StringBuffer buf = new StringBuffer(1024);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
index 6ff82c6a415f66aeab9dabb9dfb3892f37106f61..9b1a1c7acdc4901b41801364b923d177a808e470 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -53,7 +53,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
     private DataStore _ds; // hash to DataStructure mapping, persisted when necessary
     /** where the data store is pushing the data */
     private String _dbDir;
-    private Set _exploreKeys; // set of Hash objects that we should search on (to fill up a bucket, not to get data)
+    private final Set _exploreKeys = new HashSet(64); // set of Hash objects that we should search on (to fill up a bucket, not to get data)
     private boolean _initialized;
     /** Clock independent time of when we started up */
     private long _started;
@@ -69,7 +69,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
      * removed when the job decides to stop running.
      *
      */
-    private Map _publishingLeaseSets;   
+    private final Map _publishingLeaseSets;
     
     /** 
      * Hash of the key currently being searched for, pointing the SearchJob that
@@ -77,7 +77,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
      * added on to the list of jobs fired on success/failure
      *
      */
-    private Map _activeRequests;
+    private final Map _activeRequests;
     
     /**
      * The search for the given key is no longer active
@@ -176,7 +176,8 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         _initialized = false;
         _kb = null;
         _ds = null;
-        _exploreKeys = null;
+        _exploreKeys.clear(); // hope this doesn't cause an explosion, it shouldn't.
+        // _exploreKeys = null;
     }
     
     public void restart() {
@@ -218,7 +219,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         _kb = new KBucketSet(_context, ri.getIdentity().getHash());
         _ds = new PersistentDataStore(_context, dbDir, this);
         //_ds = new TransientDataStore();
-        _exploreKeys = new HashSet(64);
+//        _exploreKeys = new HashSet(64);
         _dbDir = dbDir;
         
         createHandlers();
@@ -331,6 +332,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         return rv;
     }
     
+    @Override
     public int getKnownRouters() { 
         if (_kb == null) return 0;
         CountRouters count = new CountRouters();
@@ -349,11 +351,13 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         }
     }
     
+    @Override
     public int getKnownLeaseSets() {  
         if (_ds == null) return 0;
         return _ds.countLeaseSets();
     }
-    
+
+    /* aparently, not used?? should be public if used elsewhere. */
     private class CountLeaseSets implements SelectionCollector {
         private int _count;
         public int size() { return _count; }
@@ -364,7 +368,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
                 _count++;
         }
     }
-    
+
     /**
      *  This is fast and doesn't use synchronization,
      *  but it includes both routerinfos and leasesets.
@@ -868,6 +872,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         }
     }
 
+    @Override
     public void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException {
         StringBuffer buf = new StringBuffer(4*1024);
         buf.append("<h2>Network Database RouterInfo Lookup</h2>\n");
@@ -895,6 +900,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         renderStatusHTML(out, true);
     }
 
+    @Override
     public void renderStatusHTML(Writer out, boolean full) throws IOException {
         int size = getKnownRouters() * 512;
         if (full)
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
index 26c1799a36e044655d21915d293eb694802b66fd..c88897a127031dcc818d5d5302ca5ef1e19cdaaa 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/PeerSelector.java
@@ -42,7 +42,7 @@ public class PeerSelector {
      *
      * @return ordered list of Hash objects
      */
-    public List selectMostReliablePeers(Hash key, int numClosest, Set alreadyChecked, KBucketSet kbuckets) {
+    public List selectMostReliablePeers(Hash key, int numClosest, Set alreadyChecked, KBucketSet kbuckets) {// LINT -- Exporting non-public type through public API
         // get the peers closest to the key
         List nearest = selectNearestExplicit(key, numClosest, alreadyChecked, kbuckets);
         return nearest;
@@ -55,7 +55,7 @@ public class PeerSelector {
      *
      * @return List of Hash for the peers selected, ordered by bucket (but intra bucket order is not defined)
      */
-    public List selectNearestExplicit(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { 
+    public List selectNearestExplicit(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) {// LINT -- Exporting non-public type through public API
         if (true)
             return selectNearestExplicitThin(key, maxNumRouters, peersToIgnore, kbuckets);
         
@@ -91,7 +91,7 @@ public class PeerSelector {
      *
      * @return List of Hash for the peers selected, ordered by bucket (but intra bucket order is not defined)
      */
-    public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { 
+    public List selectNearestExplicitThin(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { // LINT -- Exporting non-public type through public API
         if (peersToIgnore == null)
             peersToIgnore = new HashSet(1);
         peersToIgnore.add(_context.router().getRouterInfo().getIdentity().getHash());
@@ -195,7 +195,7 @@ public class PeerSelector {
      *
      * @return List of Hash for the peers selected, ordered by bucket (but intra bucket order is not defined)
      */
-    public List selectNearest(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { 
+    public List selectNearest(Hash key, int maxNumRouters, Set peersToIgnore, KBucketSet kbuckets) { // LINT -- Exporting non-public type through public API
         // sure, this may not be exactly correct per kademlia (peers on the border of a kbucket in strict kademlia
         // would behave differently) but I can see no reason to keep around an /additional/ more complicated algorithm.
         // later if/when selectNearestExplicit gets costly, we may revisit this (since kbuckets let us cache the distance()
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
index 5d0d219dbe6fe125bbb698d0bcb49724f783b114..0186bd922529992315586b6649f40c1be397d5f3 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/PersistentDataStore.java
@@ -56,15 +56,18 @@ class PersistentDataStore extends TransientDataStore {
         writer.start();
     }
     
+    @Override
     public void restart() {
         _dbDir = _facade.getDbDir();
     }
     
+    @Override
     public DataStructure remove(Hash key) {
         _context.jobQueue().addJob(new RemoveJob(key));
         return super.remove(key);
     }
     
+    @Override
     public void put(Hash key, DataStructure data) {
         if ( (data == null) || (key == null) ) return;
         super.put(key, data);
@@ -105,7 +108,7 @@ class PersistentDataStore extends TransientDataStore {
      * Queue up writes, write up to 600 files every 10 minutes
      */
     private class Writer implements Runnable {
-        private Map _keys;
+        private final Map _keys;
         private List _keyOrder;
         public Writer() { 
             _keys = new HashMap(64);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java
index ac191a96c745d7495c77371a543828bde144d703..95af13a4322fa493abc30a702f592a76e946bfd8 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/RepublishLeaseSetJob.java
@@ -23,7 +23,7 @@ import net.i2p.util.Log;
 public class RepublishLeaseSetJob extends JobImpl {
     private Log _log;
     private final static long REPUBLISH_LEASESET_DELAY = 5*60*1000;
-    public final static long REPUBLISH_LEASESET_TIMEOUT = 60*1000;
+    public final /* static */ long REPUBLISH_LEASESET_TIMEOUT = 60*1000;
     private Hash _dest;
     private KademliaNetworkDatabaseFacade _facade;
     /** this is actually last attempted publish */
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
index 868c6b1084cc7c776e60e1a7d12fbb937511ea63..161f2900128e32e9c6c92a9675535b2445a7ab95 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchJob.java
@@ -47,7 +47,7 @@ class SearchJob extends JobImpl {
     private boolean _isLease;
     private Job _pendingRequeueJob;
     private PeerSelector _peerSelector;
-    private List _deferredSearches;
+    private final List _deferredSearches;
     private boolean _deferredCleared;
     private long _startedOn;
     private boolean _floodfillPeersExhausted;
@@ -780,6 +780,7 @@ class SearchJob extends JobImpl {
     
     public String getName() { return "Kademlia NetDb Search"; }
     
+    @Override
     public String toString() { 
         return super.toString() + " started " 
                + DataHelper.formatDuration((getContext().clock().now() - _startedOn)) + " ago";
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java
index 4f3869072fef05e5568bea99325e6f7f0c131461..73b3ddf24ece64c6c882e342a5e12abe5ea08a7b 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchMessageSelector.java
@@ -36,6 +36,7 @@ class SearchMessageSelector implements MessageSelector {
             _log.debug("[" + _id + "] Created: " + toString());
     }
     
+    @Override
     public String toString() { 
         return "Search selector [" + _id + "] looking for a reply from " + _peer 
                + " with regards to " + _state.getTarget(); 
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
index da00483ab4cca89f05d8679c0ba24ca698010da4..a12f58fd74e5f377f5a620ae7b15dc72eb589ec8 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
@@ -17,12 +17,12 @@ import net.i2p.router.RouterContext;
  */
 class SearchState {
     private RouterContext _context;
-    private HashSet _pendingPeers;
+    private final HashSet _pendingPeers;
     private HashMap _pendingPeerTimes;
-    private HashSet _attemptedPeers;
-    private HashSet _failedPeers;
-    private HashSet _successfulPeers;
-    private HashSet _repliedPeers;
+    private final HashSet _attemptedPeers;
+    private final HashSet _failedPeers;
+    private final HashSet _successfulPeers;
+    private final HashSet _repliedPeers;
     private Hash _searchKey;
     private volatile long _completed;
     private volatile long _started;
@@ -166,6 +166,7 @@ class SearchState {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(256);
         buf.append("Searching for ").append(_searchKey);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java
index 3ec005ec5ede2de0629d45ad2624468b83ae2435..74c75cb5a3a5fead94240739b3cfdc31d540b463 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SingleSearchJob.java
@@ -2,7 +2,6 @@ package net.i2p.router.networkdb.kademlia;
 
 import net.i2p.data.Hash;
 import net.i2p.data.i2np.DatabaseLookupMessage;
-import net.i2p.router.JobImpl;
 import net.i2p.router.RouterContext;
 import net.i2p.router.OutNetMessage;
 import net.i2p.router.TunnelInfo;
@@ -23,8 +22,11 @@ class SingleSearchJob extends FloodOnlySearchJob {
         super(ctx, null, key, null, null, 5*1000, false);
         _to = to;
     }
+    @Override
     public String getName() { return "NetDb search key from DSRM"; }
+    @Override
     public boolean shouldProcessDSRM() { return false; } // don't loop
+    @Override
     public void runJob() {
         _onm = getContext().messageRegistry().registerPending(_replySelector, _onReply, _onTimeout, _timeoutMs);
         DatabaseLookupMessage dlm = new DatabaseLookupMessage(getContext(), true);
@@ -44,8 +46,10 @@ class SingleSearchJob extends FloodOnlySearchJob {
         getContext().tunnelDispatcher().dispatchOutbound(dlm, outTunnel.getSendTunnelId(0), _to);
         _lookupsRemaining = 1;
     }
+    @Override
     void failed() {
         getContext().messageRegistry().unregisterPending(_onm);
     }
+    @Override
     void success() {}
 }
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java
index 26d4fda1317a9770f9fca79f94521c18efe91fa1..e8f0eca7ea290d66d5e21ee10a1ea1db2f9e34d2 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java
@@ -55,6 +55,7 @@ class StoreMessageSelector implements MessageSelector {
         }
     }
 
+    @Override
     public String toString() {
         StringBuffer rv = new StringBuffer(64);
         rv.append("Waiting for netDb confirm from ").append(_peer.toBase64()).append(", found? ");
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
index e7bfe3292620ee119396511f88ca1344839ee8fe..184c337a9bc587436a37842ea35b2be1ad273514 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
@@ -15,12 +15,12 @@ class StoreState {
     private RouterContext _context;
     private Hash _key;
     private DataStructure _data;
-    private HashSet _pendingPeers;
+    private final HashSet _pendingPeers;
     private HashMap _pendingPeerTimes;
-    private HashSet _successfulPeers;
-    private HashSet _successfulExploratoryPeers;
-    private HashSet _failedPeers;
-    private HashSet _attemptedPeers;
+    private final HashSet _successfulPeers;
+    private final HashSet _successfulExploratoryPeers;
+    private final HashSet _failedPeers;
+    private final HashSet _attemptedPeers;
     private int _completeCount;
     private volatile long _completed;
     private volatile long _started;
@@ -147,6 +147,7 @@ class StoreState {
         }
     }
 
+    @Override
     public String toString() { 
         StringBuffer buf = new StringBuffer(256);
         buf.append("Storing ").append(_key);
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
index d2114146827258c172ed19cf1a8f9f838795317b..5fd28cebff279c4336ece63f39dc1c1fa49d2490 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
@@ -10,9 +10,7 @@ package net.i2p.router.networkdb.kademlia;
 
 import java.util.Date;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.Map;
 import java.util.Set;
 
@@ -119,14 +117,17 @@ class TransientDataStore implements DataStore {
         }
     }
     
+    @Override
     public int hashCode() {
         return DataHelper.hashCode(_data);
     }
+    @Override
     public boolean equals(Object obj) {
         if ( (obj == null) || (obj.getClass() != getClass()) ) return false;
         TransientDataStore ds = (TransientDataStore)obj;
         return DataHelper.eq(ds._data, _data);
     }
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer();
         buf.append("Transient DataStore: ").append(_data.size()).append("\nKeys: ");
diff --git a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java
index 87d13c16e2f03e65aab4920d29d0cf1b80400538..a1b9d7c2b14dc98503722452b618fe94f00e9185 100644
--- a/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java
+++ b/router/java/src/net/i2p/router/peermanager/CapacityCalculator.java
@@ -44,6 +44,7 @@ public class CapacityCalculator extends Calculator {
     /** the calculator estimates over a 1 hour period */
     private static long ESTIMATE_PERIOD = 60*60*1000;
     
+    @Override
     public double calc(PeerProfile profile) {
         RateStat acceptStat = profile.getTunnelCreateResponseTime();
         RateStat rejectStat = profile.getTunnelHistory().getRejectionRate();
diff --git a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java
index 26aa2b911b1da99ca0f316bc1e7ee62408018a0f..7fdc5fbce21aed41be4a5181fb74f0221aabba66 100644
--- a/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java
+++ b/router/java/src/net/i2p/router/peermanager/IntegrationCalculator.java
@@ -17,6 +17,7 @@ public class IntegrationCalculator extends Calculator {
         _log = context.logManager().getLog(IntegrationCalculator.class);
     }
     
+    @Override
     public double calc(PeerProfile profile) {
         // give more weight to recent counts
         long val = profile.getDbIntroduction().getRate(24*60*60*1000l).getCurrentEventCount();
diff --git a/router/java/src/net/i2p/router/peermanager/PeerManager.java b/router/java/src/net/i2p/router/peermanager/PeerManager.java
index 1c265ee6768e49bb6f22fffb7f54000d26f144fc..146e6a3f9b05e7622a605d1bb970f9d9225205f2 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerManager.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerManager.java
@@ -37,7 +37,7 @@ class PeerManager {
     private ProfileOrganizer _organizer;
     private ProfilePersistenceHelper _persistenceHelper;
     private List _peersByCapability[];
-    private Map _capabilitiesByPeer;
+    private final Map _capabilitiesByPeer;
     
     public PeerManager(RouterContext context) {
         _context = context;
diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
index 2f311b52f90f0cdbeb30b1c937b9b2149180b2b0..ec05f69f61e09e5f881ec8adf7b9f79f6a546179 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
@@ -445,7 +445,9 @@ public class PeerProfile {
     private boolean calculateIsFailing() { return false; }
     void setIsFailing(boolean val) { _isFailing = val; }
     
+    @Override
     public int hashCode() { return (_peer == null ? 0 : _peer.hashCode()); }
+    @Override
     public boolean equals(Object obj) {
         if (obj == null) return false;
         if (obj.getClass() != PeerProfile.class) return false;
@@ -453,6 +455,7 @@ public class PeerProfile {
         PeerProfile prof = (PeerProfile)obj;
         return _peer.equals(prof.getPeer());
     }
+    @Override
     public String toString() { return "Profile: " + getPeer().toBase64(); }
     
     /**
diff --git a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
index 6c7aef92721b024bdde34485753d04eabaf5ccbc..c4ba39db59447f63971753d99313809c25e5419c 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
@@ -50,7 +50,7 @@ public class PeerTestJob extends JobImpl {
     /** number of peers to test each round */
     private int getTestConcurrency() { return 1; }
     
-    public void startTesting(PeerManager manager) { 
+    public void startTesting(PeerManager manager) { // LINT -- Exporting non-public type through public API
         _manager = manager;
         _keepTesting = true;
         getContext().jobQueue().addJob(this); 
@@ -222,6 +222,7 @@ public class PeerTestJob extends JobImpl {
             return false;
         }
         public boolean matchFound() { return _matchFound; }
+        @Override
         public String toString() {
             StringBuffer buf = new StringBuffer(64);
             buf.append("Test peer ").append(_peer.toBase64().substring(0,4));
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index 1a42a244c6c1a459c19fbda3cdff133ec430ce01..089d5f1e7b4109104f255781735621ace530df07 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -84,7 +84,7 @@ public class ProfileOrganizer {
     public static final int DEFAULT_MINIMUM_HIGH_CAPACITY_PEERS = 10;
     
     /** synchronized against this lock when updating the tier that peers are located in (and when fetching them from a peer) */
-    private Object _reorganizeLock = new Object();
+    private final Object _reorganizeLock = new Object();
     
     /** incredibly weak PRNG, just used for shuffling peers.  no need to waste the real PRNG on this */
     private Random _random = new Random();
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
index 2671c8be05ad8e72927bc983d97d7feaba383c49..b665f495c156d4e0c18378ff515dbf0eeff0e225 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
@@ -3,10 +3,8 @@ package net.i2p.router.peermanager;
 import java.io.IOException;
 import java.io.Writer;
 import java.text.DecimalFormat;
-import java.text.DecimalFormatSymbols;
 import java.util.Comparator;
 import java.util.Iterator;
-import java.util.Locale;
 import java.util.Set;
 import java.util.TreeSet;
 
diff --git a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java
index a7fc9334778883cfadcbff336fc59137b9c970ca..c5ac1c3c56d26871dc33beec002063983fd5c70b 100644
--- a/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java
+++ b/router/java/src/net/i2p/router/peermanager/SpeedCalculator.java
@@ -18,6 +18,7 @@ public class SpeedCalculator extends Calculator {
     public SpeedCalculator(RouterContext context) {
     }
     
+    @Override
     public double calc(PeerProfile profile) {
         // measures 1 minute throughput of individual tunnels
         double d = (profile.getPeakTunnel1mThroughputKBps()*1024d) + profile.getSpeedBonus();
diff --git a/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java b/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java
index ffd041019108e6ce92b4bd7ce942e56543fdd547..f47394eff1e764932c59a137ae760ade310e72f4 100644
--- a/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java
+++ b/router/java/src/net/i2p/router/transport/BandwidthLimitedInputStream.java
@@ -41,6 +41,7 @@ public class BandwidthLimitedInputStream extends FilterInputStream {
         _log = context.logManager().getLog(BandwidthLimitedInputStream.class);
     }
     
+    @Override
     public int read() throws IOException {
         if (_pullFromOutbound)
             _currentRequest = _context.bandwidthLimiter().requestOutbound(1, _peerSource);
@@ -56,10 +57,12 @@ public class BandwidthLimitedInputStream extends FilterInputStream {
         return in.read();
     }
     
+    @Override
     public int read(byte dest[]) throws IOException {
         return read(dest, 0, dest.length);
     }
     
+    @Override
     public int read(byte dest[], int off, int len) throws IOException {
         int read = in.read(dest, off, len);
         if (read == -1) return -1;
@@ -84,6 +87,7 @@ public class BandwidthLimitedInputStream extends FilterInputStream {
         }
         return read;
     }
+    @Override
     public long skip(long numBytes) throws IOException {
         long skip = in.skip(numBytes);
         
@@ -105,6 +109,7 @@ public class BandwidthLimitedInputStream extends FilterInputStream {
         return skip;
     }
     
+    @Override
     public void close() throws IOException {
         synchronized (this) {
             if (_currentRequest != null)
diff --git a/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java b/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java
index df37d951416303c7c57d0cfc4c434d0ab19b3831..0327fd25ed3cdd9346816304c68bb5530f778da8 100644
--- a/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java
+++ b/router/java/src/net/i2p/router/transport/BandwidthLimitedOutputStream.java
@@ -37,6 +37,7 @@ public class BandwidthLimitedOutputStream extends FilterOutputStream {
     
     public FIFOBandwidthLimiter.Request getCurrentRequest() { return _currentRequest; }
     
+    @Override
     public void write(int val) throws IOException {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Writing a single byte!", new Exception("Single byte from..."));
@@ -49,9 +50,11 @@ public class BandwidthLimitedOutputStream extends FilterOutputStream {
             _log.warn("Waiting to write a byte took too long [" + waited + "ms");
         out.write(val);
     }
+    @Override
     public void write(byte src[]) throws IOException {
         write(src, 0, src.length);
     }
+    @Override
     public void write(byte src[], int off, int len) throws IOException {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("Writing " + len + " bytes");
@@ -83,6 +86,7 @@ public class BandwidthLimitedOutputStream extends FilterOutputStream {
         }
     }
     
+    @Override
     public void close() throws IOException {
         synchronized (this) {
             if (_currentRequest != null)
diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index 0eafb8fa9755da49cfbad97329af462a56d0011b..371ab7d2fdd3e61e2803ddad604bd0ff74450bdc 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -58,14 +58,18 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
             _manager.restart();
     }
     
+    @Override
     public int countActivePeers() { return (_manager == null ? 0 : _manager.countActivePeers()); }
+    @Override
     public int countActiveSendPeers() { return (_manager == null ? 0 : _manager.countActiveSendPeers()); } 
+    @Override
     public boolean haveCapacity() { return (_manager == null ? false : _manager.haveCapacity()); } 
     
     /**
      * Framed average clock skew of connected peers in seconds, or null if we cannot answer.
      * Average is calculated over the middle "percentToInclude" peers.
      */
+    @Override
     public Long getFramedAveragePeerClockSkew(int percentToInclude) {
         if (_manager == null) {
             if (_log.shouldLog(Log.INFO))
@@ -121,14 +125,17 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         GetBidsJob.getBids(_context, this, msg);
     }
     
+    @Override
     public boolean isBacklogged(Hash dest) { 
         return _manager.isBacklogged(dest); 
     }
     
+    @Override
     public boolean isEstablished(Hash dest) { 
         return _manager.isEstablished(dest); 
     }
     
+    @Override
     public boolean wasUnreachable(Hash dest) { 
         return _manager.wasUnreachable(dest); 
     }
@@ -137,21 +144,26 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         return _manager.getIP(dest); 
     }
     
+    @Override
     public List getMostRecentErrorMessages() { 
         return _manager.getMostRecentErrorMessages(); 
     }
 
+    @Override
     public short getReachabilityStatus() { 
         if (_manager == null) return CommSystemFacade.STATUS_UNKNOWN;
         if (_context.router().isHidden()) return CommSystemFacade.STATUS_OK;
         return _manager.getReachabilityStatus(); 
     }
+    @Override
     public void recheckReachability() { _manager.recheckReachability(); }
 
+    @Override
     public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException { 
         _manager.renderStatusHTML(out, urlBase, sortFlags); 
     }
     
+    @Override
     public Set createAddresses() {
         Map addresses = null;
         boolean newCreated = false;
@@ -225,6 +237,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
     /**
      * UDP changed addresses, tell NTCP and restart
      */
+    @Override
     public void notifyReplaceAddress(RouterAddress UDPAddr) {
         if (UDPAddr == null)
             return;
diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
index 86ba394e4b27f7436fd81f4dca39bb3d75384795..b1b1b24a0dc3ce6c6bb4a8a4ba11736874f6bcba 100644
--- a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
+++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
@@ -12,8 +12,8 @@ import net.i2p.util.Log;
 public class FIFOBandwidthLimiter {
     private Log _log;
     private I2PAppContext _context;
-    private List _pendingInboundRequests;
-    private List _pendingOutboundRequests;
+    private final List _pendingInboundRequests;
+    private final List _pendingOutboundRequests;
     /** how many bytes we can consume for inbound transmission immediately */
     private volatile int _availableInbound;
     /** how many bytes we can consume for outbound transmission immediately */
@@ -54,7 +54,7 @@ public class FIFOBandwidthLimiter {
     
     private static int __id = 0;
     
-    static long now() { 
+    public /* static */ long now() {
         // dont use the clock().now(), since that may jump
         return System.currentTimeMillis(); 
     }
@@ -769,6 +769,7 @@ public class FIFOBandwidthLimiter {
         }
         public void attach(Object obj) { _attachment = obj; }
         public Object attachment() { return _attachment; }
+        @Override
         public String toString() { return getRequestName(); }
     }
 
diff --git a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java
index c5ca48f57acf64b5e5f7fe462e49be2177bbb583..17108a8e87c2cf67dd28d8f6c4f10af24dafad0a 100644
--- a/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java
+++ b/router/java/src/net/i2p/router/transport/OutboundMessageRegistry.java
@@ -30,11 +30,11 @@ import net.i2p.util.SimpleTimer;
 public class OutboundMessageRegistry {
     private Log _log;
     /** list of currently active MessageSelector instances */
-    private List _selectors;
+    private final List _selectors;
     /** map of active MessageSelector to either an OutNetMessage or a List of OutNetMessages causing it (for quick removal) */
-    private Map _selectorToMessage;
+    private final Map _selectorToMessage;
     /** set of active OutNetMessage (for quick removal and selector fetching) */
-    private Set _activeMessages;
+    private final Set _activeMessages;
     private CleanupTask _cleanupTask;
     private RouterContext _context;
     
diff --git a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
index 0c062fa6cf2330a47f11dcd091a0638f51e8b936..24ac63c6b28bfde33a0b98eb85306bbf9c9ea5a1 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EventPumper.java
@@ -33,11 +33,11 @@ public class EventPumper implements Runnable {
     private Log _log;
     private boolean _alive;
     private Selector _selector;
-    private List _bufCache;
-    private List _wantsRead;
-    private List _wantsWrite;
-    private List _wantsRegister;
-    private List _wantsConRegister;
+    private final List _bufCache;
+    private final List _wantsRead = new ArrayList(16);
+    private final List _wantsWrite = new ArrayList(4);
+    private final List _wantsRegister = new ArrayList(1);
+    private final List _wantsConRegister = new ArrayList(4);
     private NTCPTransport _transport;
     private long _expireIdleWriteTime;
     
@@ -66,10 +66,10 @@ public class EventPumper implements Runnable {
     public void startPumping() {
         if (_log.shouldLog(Log.INFO))
             _log.info("Starting pumper");
-        _wantsRead = new ArrayList(16);
-        _wantsWrite = new ArrayList(4);
-        _wantsRegister = new ArrayList(1);
-        _wantsConRegister = new ArrayList(4);
+//        _wantsRead = new ArrayList(16);
+//        _wantsWrite = new ArrayList(4);
+//        _wantsRegister = new ArrayList(1);
+//        _wantsConRegister = new ArrayList(4);
         try {
             _selector = Selector.open();
             _alive = true;
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java
index 71d395e5f0b9b0b94622c4c5ad2c91419fcae415..860634d8f5620d47b9809b27afd40ea66c36f870 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPAddress.java
@@ -124,8 +124,10 @@ public class NTCPAddress {
         }
     }
     
+    @Override
     public String toString() { return _host + ":" + _port; }
     
+    @Override
     public int hashCode() {
         int rv = 0;
         rv += _port;
@@ -136,6 +138,7 @@ public class NTCPAddress {
         return rv;
     }
     
+    @Override
     public boolean equals(Object val) {
         if ( (val != null) && (val instanceof NTCPAddress) ) {
             NTCPAddress addr = (NTCPAddress)val;
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
index 070caae84c9cda31c058b3f9c85ed53674c34c3d..95152c6a07519c3c00f302bb384619835c495deb 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPConnection.java
@@ -56,13 +56,13 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     private SocketChannel _chan;
     private SelectionKey _conKey;
     /** list of ByteBuffer containing data we have read and are ready to process, oldest first */
-    private List _readBufs;
+    private final List _readBufs;
     /**
      * list of ByteBuffers containing fully populated and encrypted data, ready to write,
      * and already cleared through the bandwidth limiter.
      */
-    private List _writeBufs;
-    private List _bwRequests;
+    private final List _writeBufs;
+    private final List _bwRequests;
     private boolean _established;
     private long _establishedOn;
     private EstablishState _establishState;
@@ -75,7 +75,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     /**
      * pending unprepared OutNetMessage instances
      */
-    private List _outbound;
+    private final List _outbound;
     /** current prepared OutNetMessage, or null */
     private OutNetMessage _currentOutbound;
     private SessionKey _sessionKey;
@@ -96,7 +96,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     private long _created;
     private long _nextMetaTime;
     /** unencrypted outbound metadata buffer */
-    private byte _meta[] = new byte[16];
+    private final byte _meta[] = new byte[16];
     private boolean _sendingMeta;
     /** how many consecutive sends were failed due to (estimated) send queue time */
     private int _consecutiveBacklog;
@@ -704,7 +704,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     private static int NUM_PREP_BUFS = 5;
     private static int __liveBufs = 0;
     private static int __consecutiveExtra;
-    private static List _bufs = new ArrayList(NUM_PREP_BUFS);
+    private final static List _bufs = new ArrayList(NUM_PREP_BUFS);
     private PrepBuffer acquireBuf() {
         synchronized (_bufs) {
             if (_bufs.size() > 0) {
@@ -1093,11 +1093,17 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         // enqueueInfoMessage(); // this often?
     }
     
+    @Override
     public int hashCode() { return System.identityHashCode(this); }
-    public boolean equals(Object obj) { return obj == this; }
+    @Override
+    public boolean equals(Object obj) {
+        if(obj == null) return false;
+        if(obj.getClass() != NTCPConnection.class) return false;
+        return obj == this;
+    }
 
-    private static List _i2npHandlers = new ArrayList(4);
-    private static I2NPMessageHandler acquireHandler(RouterContext ctx) {
+    private final static List _i2npHandlers = new ArrayList(4);
+    private final static I2NPMessageHandler acquireHandler(RouterContext ctx) {
         I2NPMessageHandler rv = null;
         synchronized (_i2npHandlers) {
             if (_i2npHandlers.size() > 0)
@@ -1127,7 +1133,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
     }
     
     private static int MAX_DATA_READ_BUFS = 16;
-    private static List _dataReadBufs = new ArrayList(16);
+    private final static List _dataReadBufs = new ArrayList(16);
     private static DataBuf acquireReadBuf() {
         synchronized (_dataReadBufs) {
             if (_dataReadBufs.size() > 0)
@@ -1289,6 +1295,7 @@ public class NTCPConnection implements FIFOBandwidthLimiter.CompleteListener {
         }
     }
 
+    @Override
     public String toString() {
         return "NTCP Connection to " +
                (_remotePeer == null ? "unknown " : _remotePeer.calculateHash().toBase64().substring(0,6)) +
diff --git a/router/java/src/net/i2p/router/transport/ntcp/Reader.java b/router/java/src/net/i2p/router/transport/ntcp/Reader.java
index 4b4dc3db1224551d3c1e06815ae07493eec917cb..2c017b5b6df696238ed16734d08ff375bbd593d7 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/Reader.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/Reader.java
@@ -17,7 +17,7 @@ import net.i2p.util.Log;
 class Reader {
     private RouterContext _context;
     private Log _log;
-    private List _pendingConnections;
+    private final List _pendingConnections;
     private List _liveReads;
     private List _readAfterLive;
     private List _runners;
diff --git a/router/java/src/net/i2p/router/transport/ntcp/Writer.java b/router/java/src/net/i2p/router/transport/ntcp/Writer.java
index 29b7258167a046cef4baaeeedfaeb0942be23497..97823313bc281ac21da7fa74c3811c66a0358201 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/Writer.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/Writer.java
@@ -16,7 +16,7 @@ import net.i2p.util.Log;
 class Writer {
     private RouterContext _context;
     private Log _log;
-    private List _pendingConnections;
+    private final List _pendingConnections;
     private List _liveWrites;
     private List _writeAfterLive;
     private List _runners;
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 66aad6f4d092e211af2c99b627ec708057fc9ab7..e2a21ca4a981dcbde735e92806edb6fbbdaf0456 100644
--- a/router/java/src/net/i2p/router/transport/udp/ACKSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/ACKSender.java
@@ -18,7 +18,7 @@ public class ACKSender implements Runnable {
     private UDPTransport _transport;
     private PacketBuilder _builder;
     /** list of peers (PeerState) who we have received data from but not yet ACKed to */
-    private List _peersToACK;
+    private final List _peersToACK;
     private boolean _alive;
     
     /** how frequently do we want to send ACKs to a peer? */
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 e8731da05f0dcdfd981f5a1f8403261173e49f92..d36a3053d25e879da61e64ac6e8597fd4baa4a6a 100644
--- a/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/EstablishmentManager.java
@@ -670,7 +670,7 @@ public class EstablishmentManager {
         }
     }
     
-    public void receiveRelayResponse(RemoteHostId bob, UDPPacketReader reader) {
+    public void receiveRelayResponse(RemoteHostId bob, UDPPacketReader reader) {// LINT -- Exporting non-public type through public API
         long nonce = reader.getRelayResponseReader().readNonce();
         OutboundEstablishState state = null;
         synchronized (_liveIntroductions) {
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 ababfa7c4cc4e33ecd9765d84afc13283b75acb3..290a5139b060c81018be0cc21b735b26e4bae32a 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java
@@ -210,7 +210,7 @@ public class InboundEstablishState {
     public synchronized void setNextSendTime(long when) { _nextSend = when; }
 
     /** RemoteHostId, uniquely identifies an attempt */
-    public RemoteHostId getRemoteHostId() { return _remoteHostId; }
+    public RemoteHostId getRemoteHostId() { return _remoteHostId; }// LINT -- Exporting non-public type through public API
 
     public synchronized void receiveSessionConfirmed(UDPPacketReader.SessionConfirmedReader conf) {
         if (_receivedIdentity == null)
@@ -331,6 +331,7 @@ public class InboundEstablishState {
         _nextSend = _lastReceive;
     }
     
+    @Override
     public String toString() {            
         StringBuffer buf = new StringBuffer(128);
         buf.append(super.toString());
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 a99929f40f6437ed201310c7e67fc79b8caf7823..6c85b9fb72960a1cb394cd1cc8c279dde43eb517 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
@@ -138,6 +138,7 @@ public class InboundMessageState {
         }
         public boolean receivedComplete() { return false; }
         
+        @Override
         public String toString() { 
             StringBuffer buf = new StringBuffer(64);
             buf.append("Partial ACK of ");
@@ -162,6 +163,7 @@ public class InboundMessageState {
     }
     public int getFragmentCount() { return _lastFragment+1; }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(32);
         buf.append("Message: ").append(_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 bbbc35caba65b430c75a4b5687078f3f53662f34..25ab9ab6a1a01b033cece91c3a2deca9a7021410 100644
--- a/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/IntroductionManager.java
@@ -25,7 +25,7 @@ public class IntroductionManager {
     /** map of relay tag to PeerState that should receive the introduction */
     private Map _outbound;
     /** list of peers (PeerState) who have given us introduction tags */
-    private List _inbound;
+    private final List _inbound;
 
     public IntroductionManager(RouterContext ctx, UDPTransport transport) {
         _context = ctx;
@@ -157,7 +157,7 @@ public class IntroductionManager {
         return found;
     }
     
-    public void receiveRelayIntro(RemoteHostId bob, UDPPacketReader reader) {
+    public void receiveRelayIntro(RemoteHostId bob, UDPPacketReader reader) {// LINT -- Exporting non-public type through public API
         if (_context.router().isHidden())
             return;
         if (_log.shouldLog(Log.INFO))
@@ -166,7 +166,7 @@ public class IntroductionManager {
         _transport.send(_builder.buildHolePunch(reader));
     }
     
-    public void receiveRelayRequest(RemoteHostId alice, UDPPacketReader reader) {
+    public void receiveRelayRequest(RemoteHostId alice, UDPPacketReader reader) {// LINT -- Exporting non-public type through public API
         if (_context.router().isHidden())
             return;
         long tag = reader.getRelayRequestReader().readTag();
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 a6a75459efcf9786b641a24bd5604db64f3b1579..61c75c99e83d4a46e198f98a7a0b717e9457fce0 100644
--- a/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/MessageReceiver.java
@@ -24,7 +24,7 @@ public class MessageReceiver {
     private Log _log;
     private UDPTransport _transport;
     /** list of messages (InboundMessageState) fully received but not interpreted yet */
-    private List _completeMessages;
+    private final List _completeMessages;
     private boolean _alive;
     private ByteCache _cache;
     
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 fc424de5bf58d40200aa27201135dc34ed369033..47a54ce116a6d23f44fc357975a6351b8127dabb 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
@@ -51,7 +51,7 @@ public class OutboundEstablishState {
     private RemoteHostId _remoteHostId;
     private RouterIdentity _remotePeer;
     private SessionKey _introKey;
-    private List _queuedMessages;
+    private final List _queuedMessages;
     private int _currentState;
     private long _introductionNonce;
     // intro
@@ -413,7 +413,7 @@ public class OutboundEstablishState {
     }
 
     /** uniquely identifies an attempt */
-    public RemoteHostId getRemoteHostId() { return _remoteHostId; }
+    public RemoteHostId getRemoteHostId() { return _remoteHostId; }// LINT -- Exporting non-public type through public API
 
     /** we have received a real data packet, so we're done establishing */
     public synchronized void dataReceived() {
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 fc6896627ed6b3be91148c232418f794ef36bb85..c9e7db02c5bf48eb08eba8af78b11f719afd738e 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
@@ -286,6 +286,7 @@ public class OutboundMessageState {
         }
     }
     
+    @Override
     public String toString() {
         short sends[] = _fragmentSends;
         ByteArray messageBuf = _messageBuf;
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 f00587bcd1b564142e0968d9c63ef850f2ad2203..dcdf5fb6d95f95ca7ed7fd830415f85b408b8559 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
@@ -786,6 +786,7 @@ public class PacketBuilder {
     private int getOurExplicitPort() { return 0; }
     
     /** build intro packets for each of the published introducers */
+    @SuppressWarnings("static-access")
     public UDPPacket[] buildRelayRequest(UDPTransport transport, OutboundEstablishState state, SessionKey ourIntroKey) {
         UDPAddress addr = state.getRemoteAddress();
         int count = addr.getIntroducerCount();
@@ -878,7 +879,7 @@ public class PacketBuilder {
      */
     private static final byte PEER_RELAY_INTRO_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_INTRO << 4);
     
-    public UDPPacket buildRelayIntro(RemoteHostId alice, PeerState charlie, UDPPacketReader.RelayRequestReader request) {
+    public UDPPacket buildRelayIntro(RemoteHostId alice, PeerState charlie, UDPPacketReader.RelayRequestReader request) {// LINT -- Exporting non-public type through public API
         UDPPacket packet = UDPPacket.acquire(_context, false);
         byte data[] = packet.getPacket().getData();
         Arrays.fill(data, 0, data.length, (byte)0x0);
@@ -928,7 +929,7 @@ public class PacketBuilder {
      */
     private static final byte PEER_RELAY_RESPONSE_FLAG_BYTE = (UDPPacket.PAYLOAD_TYPE_RELAY_RESPONSE << 4);
     
-    public UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce, SessionKey aliceIntroKey) {
+    public UDPPacket buildRelayResponse(RemoteHostId alice, PeerState charlie, long nonce, SessionKey aliceIntroKey) {// LINT -- Exporting non-public type through public API
         InetAddress aliceAddr = null;
         try {
             aliceAddr = InetAddress.getByAddress(alice.getIP());
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 9e9cde1d34ceb5880fe2bfa2eec1497b05d9d65e..d32e8526dbef6f3b18625b95dc62f8de92f2f687 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
@@ -37,7 +37,7 @@ public class PacketHandler {
     private static final long GRACE_PERIOD = Router.CLOCK_FUDGE_FACTOR + 30*1000;
     
     
-    public PacketHandler(RouterContext ctx, UDPTransport transport, UDPEndpoint endpoint, EstablishmentManager establisher, InboundMessageFragments inbound, PeerTestManager testManager, IntroductionManager introManager) {
+    public PacketHandler(RouterContext ctx, UDPTransport transport, UDPEndpoint endpoint, EstablishmentManager establisher, InboundMessageFragments inbound, PeerTestManager testManager, IntroductionManager introManager) {// LINT -- Exporting non-public type through public API
         _context = ctx;
         _log = ctx.logManager().getLog(PacketHandler.class);
         _transport = transport;
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 f3cd1e269131b6ac9c6a0f347548fd4323b2b4ce..ff1f64f11b4e31915cc683ee1820d0ad6fae39c6 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -74,13 +74,13 @@ public class PeerState {
     /** when did we last have a failed send (beginning of period) */
     private long _lastFailedSendPeriod;
     /** list of messageIds (Long) that we have received but not yet sent */
-    private List _currentACKs;
+    private final List _currentACKs;
     /** 
      * list of the most recent messageIds (Long) that we have received and sent
      * an ACK for.  We keep a few of these around to retransmit with _currentACKs,
      * hopefully saving some spurious retransmissions
      */
-    private List _currentACKsResend;
+    private final List _currentACKsResend;
     /** when did we last send ACKs to the peer? */
     private volatile long _lastACKSend;
     /** when did we decide we need to ACK to this peer? */
@@ -169,9 +169,9 @@ public class PeerState {
     private long _packetsReceived;
     
     /** list of InboundMessageState for active message */
-    private Map _inboundMessages;
+    private final Map _inboundMessages;
     /** list of OutboundMessageState */
-    private List _outboundMessages;
+    private final List _outboundMessages;
     /** which outbound message is currently being retransmitted */
     private OutboundMessageState _retransmitter;
     
@@ -802,6 +802,7 @@ public class PeerState {
         public long getMessageId() { return _msgId; }
         public boolean received(int fragmentNum) { return true; }
         public boolean receivedComplete() { return true; }
+        @Override
         public String toString() { return "Full ACK of " + _msgId; }
     }
         
@@ -1010,7 +1011,7 @@ public class PeerState {
             return MAX_RTO;
     }
     
-    public RemoteHostId getRemoteHostId() { return _remoteHostId; }
+    public RemoteHostId getRemoteHostId() { return _remoteHostId; }// LINT -- Exporting non-public type through public API
     
     public int add(OutboundMessageState state) {
         if (_dead) { 
@@ -1560,6 +1561,7 @@ public class PeerState {
     }
     */
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(64);
         buf.append(_remoteHostId.toString());
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
index 35c5511be4be4bc994ced8a0f24ba4408ad3b039..797cb8d4b7b14f1baf32515fb92f16103f8025a1 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestManager.java
@@ -27,7 +27,7 @@ class PeerTestManager {
     private UDPTransport _transport;
     private PacketBuilder _packetBuilder;
     /** map of Long(nonce) to PeerTestState for tests currently in progress */
-    private Map _activeTests;
+    private final Map _activeTests;
     /** current test we are running, or null */
     private PeerTestState _currentTest;
     private boolean _currentTestComplete;
diff --git a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
index 57dc648d84c9981e8f11fb0a3b016c54032ad7c1..625bf648a7c9e1079ebf12c93ff18a6bcf8b300c 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
@@ -96,6 +96,7 @@ class PeerTestState {
     public int getPacketsRelayed() { return _packetsRelayed; }
     public void incrementPacketsRelayed() { ++_packetsRelayed; }
     
+    @Override
     public synchronized String toString() {
         StringBuffer buf = new StringBuffer(512);
         buf.append("Role: ");
diff --git a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
index 117f8c5636003e52ca21d231f526f2733ce39a62..4bb2338f1f5e7e6ce86525936ea513cb7b3032b3 100644
--- a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
+++ b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
@@ -26,6 +26,7 @@ final class RemoteHostId {
     public int getPort() { return _port; }
     public byte[] getPeerHash() { return _peerHash; }
     
+    @Override
     public int hashCode() {
         int rv = 0;
         for (int i = 0; _ip != null && i < _ip.length; i++)
@@ -36,6 +37,7 @@ final class RemoteHostId {
         return rv;
     }
     
+    @Override
     public boolean equals(Object obj) {
         if (obj == null) 
             throw new NullPointerException("obj is null");
@@ -45,6 +47,7 @@ final class RemoteHostId {
         return (_port == id.getPort()) && DataHelper.eq(_ip, id.getIP()) && DataHelper.eq(_peerHash, id.getPeerHash());
     }
     
+    @Override
     public String toString() { return toString(true); }
     public String toString(boolean includePort) {
         if (_ip != null) {
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 b28fb9101e0ff40ca58a1f5eac3d3c076b3facd9..9ff5a19503a040e9d4e198cf10bc9a475276940e 100644
--- a/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java
+++ b/router/java/src/net/i2p/router/transport/udp/TimedWeightedPriorityMessageQueue.java
@@ -33,7 +33,7 @@ public class TimedWeightedPriorityMessageQueue implements MessageQueue, Outbound
     /** how many bytes total have been pulled off the given queue */
     private long _bytesTransferred[];
     /** lock to notify message enqueue/removal (and block for getNext()) */
-    private Object _nextLock;
+    private final Object _nextLock;
     /** have we shut down or are we still alive? */
     private boolean _alive;
     /** which queue should we pull out of next */
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
index df8b024f587126149b3da94063c9a9d02aa8394c..723817e0104b526a9e6fbcaf898c7d2c758d515d 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
@@ -40,6 +40,7 @@ public class UDPAddress {
         parse(addr);
     }
     
+    @Override
     public String toString() {
         StringBuffer rv = new StringBuffer(64);
         if (_introHosts != null) {
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java b/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java
index dbcd8dfda4362dc8df28190e6c9d0a56d2e72a4f..14dfced396ccbe7d0afad19161158e4e03675d63 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPFlooder.java
@@ -18,7 +18,7 @@ class UDPFlooder implements Runnable {
     private RouterContext _context;
     private Log _log;
     private UDPTransport _transport;
-    private List _peers;
+    private final List _peers;
     private boolean _alive;
     private static final byte _floodData[] = new byte[4096];
     
@@ -37,9 +37,10 @@ class UDPFlooder implements Runnable {
             _peers.notifyAll();
         }
     }
+    @SuppressWarnings("empty-statement")
     public void removePeer(PeerState peer) {
         synchronized (_peers) {
-            while (_peers.remove(peer))
+            while (_peers.remove(peer)) // can this be written better?
                 ;// loops until its empty
             _peers.notifyAll();
         }
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 46d8ae3c1490ca878f1e678e248b67b07db7d2f9..d6387f7c4e8407d0a4dec8738270f562140450dc 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
@@ -129,7 +129,7 @@ public class UDPPacket {
     int getFragmentCount() { return _fragmentCount; }
     void setFragmentCount(int count) { _fragmentCount = count; }
     
-    public RemoteHostId getRemoteHost() {
+    public RemoteHostId getRemoteHost() {// LINT -- Exporting non-public type through public API
         if (_remoteHost == null) {
             long before = System.currentTimeMillis();
             InetAddress addr = _packet.getAddress();
@@ -238,6 +238,7 @@ public class UDPPacket {
     /** how many times we tried to validate the packet */
     int getValidateCount() { return _validateCount; }
     
+    @Override
     public String toString() {
         verifyNotReleased(); 
         StringBuffer buf = new StringBuffer(64);
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 159c21ae6042c04ae3f5444d471daf205795059c..5bff1789d77d92a016fa8433792fb05add487cc7 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
@@ -105,6 +105,7 @@ public class UDPPacketReader {
     public RelayIntroReader getRelayIntroReader() { return _relayIntroReader; }
     public RelayResponseReader getRelayResponseReader() { return _relayResponseReader; }
     
+    @Override
     public String toString() {
         switch (readPayloadType()) {
             case UDPPacket.PAYLOAD_TYPE_DATA:
@@ -398,6 +399,7 @@ public class UDPPacketReader {
             return ((_message[flagOffset] & flag) != 0);
         }
         
+        @Override
         public String toString() {
             StringBuffer buf = new StringBuffer(256);
             long msAgo = _context.clock().now() - readTimestamp()*1000;
@@ -502,6 +504,7 @@ public class UDPPacketReader {
             int flagNum = fragmentNum % 7;
             return (_message[byteNum] & (1 << flagNum)) != 0x0;
         }
+        @Override
         public String toString() { 
             StringBuffer buf = new StringBuffer(64);
             buf.append("Read partial ACK of ");
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 3535484c9f4d8df1f13b6e546d96b7f13e8443de..72fdbbf0e45aba4de2b2d66855e277dcda7a17a4 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
@@ -25,7 +25,7 @@ public class UDPReceiver {
     private Log _log;
     private DatagramSocket _socket;
     private String _name;
-    private List _inboundQueue;
+    private final List _inboundQueue;
     private boolean _keepRunning;
     private Runner _runner;
     private UDPTransport _transport;
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 141b8789282d32db7f44e09aa8e732a2551ead4c..dbc78e8a01c61e262568be6566d69a176108daee 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPSender.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPSender.java
@@ -20,7 +20,7 @@ public class UDPSender {
     private Log _log;
     private DatagramSocket _socket;
     private String _name;
-    private List _outboundQueue;
+    private final List _outboundQueue;
     private boolean _keepRunning;
     private Runner _runner;
     
diff --git a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
index 289e42ba3533ac48acc25c5849be923267292382..b6e7e32b72237b26bbe429a7d586e946057d95f3 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -40,13 +40,13 @@ import net.i2p.util.SimpleTimer;
  *
  */
 public class UDPTransport extends TransportImpl implements TimedWeightedPriorityMessageQueue.FailedListener {
-    private RouterContext _context;
+    private RouterContext _context; // LINT -- field hides a field
     private Log _log;
     private UDPEndpoint _endpoint;
     /** Peer (Hash) to PeerState */
-    private Map _peersByIdent;
+    private final Map _peersByIdent;
     /** RemoteHostId to PeerState */
-    private Map _peersByRemoteHost;
+    private final Map _peersByRemoteHost;
     private PacketHandler _handler;
     private EstablishmentManager _establisher;
     private MessageQueue _outboundMessages;
@@ -90,7 +90,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private TransportBid _transientFail;
     
     /** list of RemoteHostId for peers whose packets we want to drop outright */
-    private List _dropList;
+    private final List _dropList;
     
     private int _expireTimeout;
 
@@ -437,7 +437,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      * get the state for the peer at the given remote host/port, or null 
      * if no state exists
      */
-    public PeerState getPeerState(RemoteHostId hostInfo) {
+    public PeerState getPeerState(RemoteHostId hostInfo) { // LINT -- Exporting non-public type through public API
         synchronized (_peersByRemoteHost) {
             return (PeerState)_peersByRemoteHost.get(hostInfo);
         }
@@ -589,12 +589,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         return true;
     }
     
+    @Override
     public RouterAddress getCurrentAddress() {
         if (needsRebuild())
             rebuildExternalAddress(false);
         return super.getCurrentAddress();
     }
     
+    @Override
     public void messageReceived(I2NPMessage inMsg, RouterIdentity remoteIdent, Hash remoteIdentHash, long msToReceive, int bytesReceived) {
         if (inMsg.getType() == DatabaseStoreMessage.MESSAGE_TYPE) {
             DatabaseStoreMessage dsm = (DatabaseStoreMessage)inMsg;
@@ -671,7 +673,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         }
     }
     
-    public boolean isInDropList(RemoteHostId peer) { synchronized (_dropList) { return _dropList.contains(peer); } }
+    public boolean isInDropList(RemoteHostId peer) { synchronized (_dropList) { return _dropList.contains(peer); } }// LINT -- Exporting non-public type through public API
     
     void dropPeer(Hash peer, boolean shouldShitlist, String why) {
         PeerState state = getPeerState(peer);
@@ -933,6 +935,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static final int MIN_EXPIRE_TIMEOUT = 10*60*1000;
     
     public String getStyle() { return STYLE; }
+    @Override
     public void send(OutNetMessage msg) { 
         if (msg == null) return;
         if (msg.getTarget() == null) return;
@@ -1237,6 +1240,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             super.afterSend(m, true);
     }
 
+    @Override
     public int countActivePeers() {
         long now = _context.clock().now();
         int active = 0;
@@ -1253,6 +1257,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         return active;
     }
     
+    @Override
     public int countActiveSendPeers() {
         long now = _context.clock().now();
         int active = 0;
@@ -1269,6 +1274,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         return active;
     }
     
+    @Override
     public boolean isEstablished(Hash dest) {
         return getPeerState(dest) != null;
     }
@@ -1279,6 +1285,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         }
     }
 
+    @Override
     public boolean haveCapacity() {
         synchronized (_peersByIdent) {
             return _peersByIdent.size() < getMaxConnections() * 4 / 5;
@@ -1289,6 +1296,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      * Return our peer clock skews on this transport.
      * Vector composed of Long, each element representing a peer skew in seconds.
      */
+    @Override
     public Vector getClockSkews() {
 
         Vector skews = new Vector();
@@ -1414,6 +1422,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class IdleInComparator extends PeerComparator {
         private static final IdleInComparator _instance = new IdleInComparator();
         public static final IdleInComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = r.getLastReceiveTime() - l.getLastReceiveTime();
             if (rv == 0) // fallback on alpha
@@ -1425,6 +1434,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class IdleOutComparator extends PeerComparator {
         private static final IdleOutComparator _instance = new IdleOutComparator();
         public static final IdleOutComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = r.getLastSendTime() - l.getLastSendTime();
             if (rv == 0) // fallback on alpha
@@ -1436,6 +1446,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class RateInComparator extends PeerComparator {
         private static final RateInComparator _instance = new RateInComparator();
         public static final RateInComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getReceiveBps() - r.getReceiveBps();
             if (rv == 0) // fallback on alpha
@@ -1447,6 +1458,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class RateOutComparator extends PeerComparator {
         private static final RateOutComparator _instance = new RateOutComparator();
         public static final RateOutComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getSendBps() - r.getSendBps();
             if (rv == 0) // fallback on alpha
@@ -1458,6 +1470,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class UptimeComparator extends PeerComparator {
         private static final UptimeComparator _instance = new UptimeComparator();
         public static final UptimeComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = r.getKeyEstablishedTime() - l.getKeyEstablishedTime();
             if (rv == 0) // fallback on alpha
@@ -1469,6 +1482,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class SkewComparator extends PeerComparator {
         private static final SkewComparator _instance = new SkewComparator();
         public static final SkewComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = Math.abs(l.getClockSkew()) - Math.abs(r.getClockSkew());
             if (rv == 0) // fallback on alpha
@@ -1480,6 +1494,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class CwndComparator extends PeerComparator {
         private static final CwndComparator _instance = new CwndComparator();
         public static final CwndComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getSendWindowBytes() - r.getSendWindowBytes();
             if (rv == 0) // fallback on alpha
@@ -1491,6 +1506,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class SsthreshComparator extends PeerComparator {
         private static final SsthreshComparator _instance = new SsthreshComparator();
         public static final SsthreshComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getSlowStartThreshold() - r.getSlowStartThreshold();
             if (rv == 0) // fallback on alpha
@@ -1502,6 +1518,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class RTTComparator extends PeerComparator {
         private static final RTTComparator _instance = new RTTComparator();
         public static final RTTComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getRTT() - r.getRTT();
             if (rv == 0) // fallback on alpha
@@ -1513,6 +1530,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class DevComparator extends PeerComparator {
         private static final DevComparator _instance = new DevComparator();
         public static final DevComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getRTTDeviation() - r.getRTTDeviation();
             if (rv == 0) // fallback on alpha
@@ -1524,6 +1542,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class RTOComparator extends PeerComparator {
         private static final RTOComparator _instance = new RTOComparator();
         public static final RTOComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getRTO() - r.getRTO();
             if (rv == 0) // fallback on alpha
@@ -1535,6 +1554,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class MTUComparator extends PeerComparator {
         private static final MTUComparator _instance = new MTUComparator();
         public static final MTUComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getMTU() - r.getMTU();
             if (rv == 0) // fallback on alpha
@@ -1546,6 +1566,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class SendCountComparator extends PeerComparator {
         private static final SendCountComparator _instance = new SendCountComparator();
         public static final SendCountComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsTransmitted() - r.getPacketsTransmitted();
             if (rv == 0) // fallback on alpha
@@ -1557,6 +1578,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class RecvCountComparator extends PeerComparator {
         private static final RecvCountComparator _instance = new RecvCountComparator();
         public static final RecvCountComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsReceived() - r.getPacketsReceived();
             if (rv == 0) // fallback on alpha
@@ -1568,6 +1590,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class ResendComparator extends PeerComparator {
         private static final ResendComparator _instance = new ResendComparator();
         public static final ResendComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsRetransmitted() - r.getPacketsRetransmitted();
             if (rv == 0) // fallback on alpha
@@ -1579,6 +1602,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private static class DupComparator extends PeerComparator {
         private static final DupComparator _instance = new DupComparator();
         public static final DupComparator instance() { return _instance; }
+        @Override
         protected int compare(PeerState l, PeerState r) {
             long rv = l.getPacketsReceivedDuplicate() - r.getPacketsReceivedDuplicate();
             if (rv == 0) // fallback on alpha
@@ -1623,6 +1647,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     
     //public void renderStatusHTML(Writer out) throws IOException { renderStatusHTML(out, 0); }
     public void renderStatusHTML(Writer out, int sortFlags) throws IOException {}
+    @Override
     public void renderStatusHTML(Writer out, String urlBase, int sortFlags) throws IOException {
         TreeSet peers = new TreeSet(getComparator(sortFlags));
         synchronized (_peersByIdent) {
@@ -1965,12 +1990,14 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      */
     private class SharedBid extends TransportBid {
         public SharedBid(int ms) { super(); setLatencyMs(ms); }
+        @Override
         public Transport getTransport() { return UDPTransport.this; }
+        @Override
         public String toString() { return "UDP bid @ " + getLatencyMs(); }
     }
     
     private class ExpirePeerEvent implements SimpleTimer.TimedEvent {
-        private List _expirePeers;
+        private final List _expirePeers;
         private List _expireBuffer;
         private boolean _alive;
         public ExpirePeerEvent() {
@@ -2097,11 +2124,12 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         
         return _reachabilityStatus; 
     }
+    @Override
     public void recheckReachability() {
         _testEvent.runTest();
     }
     
-    public PeerState pickTestPeer(RemoteHostId dontInclude) {
+    public PeerState pickTestPeer(RemoteHostId dontInclude) {// LINT -- Exporting non-public type through public API
         List peers = null;
         synchronized (_peersByIdent) {
             peers = new ArrayList(_peersByIdent.values());
diff --git a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
index 6d2e7b7396a652cfefb8c851a1e6eca02f726b25..2de7868dbfa2b21dca5a24cda9c75fafede5f0e2 100644
--- a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
@@ -49,6 +49,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
     private static final int FORCE_BATCH_FLUSH = 50;
     
     /** how long do we want to wait before flushing */
+    @Override
     public long getDelayAmount() { return getDelayAmount(true); }
     private long getDelayAmount(boolean shouldStat) {
         long rv = -1;
@@ -62,6 +63,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
         return rv;
     }
     
+    @Override
     public boolean preprocessQueue(List pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
         StringBuffer timingBuf = null;
         if (_log.shouldLog(Log.DEBUG)) {
diff --git a/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java
index 0be137b4512e190b0e52bcddcee95f111e7dc499..2e5e988855b5d05b072a72ae15fc28d0e0d4d356 100644
--- a/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/BatchedRouterPreprocessor.java
@@ -57,6 +57,7 @@ public class BatchedRouterPreprocessor extends BatchedPreprocessor {
     }
 
     /** how long should we wait before flushing */
+    @Override
     protected long getSendDelay() { 
         String freq = null;
         if (_config != null) {
@@ -77,6 +78,7 @@ public class BatchedRouterPreprocessor extends BatchedPreprocessor {
         return DEFAULT_BATCH_FREQUENCY;
     }
     
+    @Override
     protected void notePreprocessing(long messageId, int numFragments, int totalLength, List messageIds, String msg) {
         if (_config != null)
             _routerContext.messageHistory().fragmentMessage(messageId, numFragments, totalLength, messageIds, _config, msg);
diff --git a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
index 99b66c0c8b805e6f1ed1e3027539c33fa97036b0..7261845c1a90892c9ba5b7384bc14b0bb5b4c521 100644
--- a/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/FragmentHandler.java
@@ -26,7 +26,7 @@ import net.i2p.util.SimpleTimer;
 public class FragmentHandler {
     private I2PAppContext _context;
     private Log _log;
-    private Map _fragmentedMessages;
+    private final Map _fragmentedMessages;
     private DefragmentedReceiver _receiver;
     private int _completed;
     private int _failed;
diff --git a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
index b0203f540d117ee52bcc12e41d422b1bb5d2c8a8..94e2c8c2487ccaf00cbe9b79f0de66f6e5d9d9cf 100644
--- a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
+++ b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
@@ -273,6 +273,7 @@ public class FragmentedMessage {
         }
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(128);
         buf.append("Fragments for ").append(_messageId).append(": ");
diff --git a/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java b/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java
index aea18dc3f645ddead8f2c01d85b061cafaca9329..c9241fccef255459fb89f16c3c3be46fe3cb8fac 100644
--- a/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java
+++ b/router/java/src/net/i2p/router/tunnel/HashSetIVValidator.java
@@ -9,7 +9,7 @@ import net.i2p.data.DataHelper;
  * waste lots of RAM 
  */
 class HashSetIVValidator implements IVValidator {
-    private HashSet _received;
+    private final HashSet _received;
     
     public HashSetIVValidator() {
         _received = new HashSet();
diff --git a/router/java/src/net/i2p/router/tunnel/HopConfig.java b/router/java/src/net/i2p/router/tunnel/HopConfig.java
index 740cf9025ce502517c9156cedb8ad782150a2fd7..ab0c32a3f35a455c8650d1bb8a02d0a57497e3aa 100644
--- a/router/java/src/net/i2p/router/tunnel/HopConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/HopConfig.java
@@ -135,6 +135,7 @@ public class HopConfig {
         return rv;
     }
     
+    @Override
     public String toString() {
         StringBuffer buf = new StringBuffer(64);
         if (_receiveTunnelId != null) {
diff --git a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
index c5c46c365799273b468470514009162026740fdb..b1b03fb22fb3e59bcafb2ff3784649778be7c20f 100644
--- a/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
+++ b/router/java/src/net/i2p/router/tunnel/InboundMessageDistributor.java
@@ -10,7 +10,6 @@ import net.i2p.data.i2np.DeliveryStatusMessage;
 import net.i2p.data.i2np.GarlicMessage;
 import net.i2p.data.i2np.I2NPMessage;
 import net.i2p.data.i2np.TunnelBuildReplyMessage;
-import net.i2p.data.i2np.TunnelGatewayMessage;
 import net.i2p.router.ClientMessage;
 import net.i2p.router.RouterContext;
 import net.i2p.router.TunnelInfo;
diff --git a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java
index a2cac90bb9a8f9b7ae350e98bbfc5c728add4538..9364092df5db80e302427e905300879a4de2bfe3 100644
--- a/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java
+++ b/router/java/src/net/i2p/router/tunnel/PumpedTunnelGateway.java
@@ -32,7 +32,7 @@ import net.i2p.util.Log;
  *
  */
 public class PumpedTunnelGateway extends TunnelGateway {
-    private List _prequeue;
+    private final List _prequeue;
     private TunnelGatewayPumper _pumper;
     
     /**
@@ -58,6 +58,7 @@ public class PumpedTunnelGateway extends TunnelGateway {
      * @param toRouter router to send to after the endpoint (or null for endpoint processing)
      * @param toTunnel tunnel to send to after the endpoint (or null for endpoint or router processing)
      */
+    @Override
     public void add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) {
         _messagesSent++;
         Pending cur = new PendingImpl(msg, toRouter, toTunnel);
diff --git a/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java b/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java
index 7caa3271e6263f3c36d5619260b00cf2b0f98008..acb4231d27cf6989435576bf33deb744af384268 100644
--- a/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/RouterFragmentHandler.java
@@ -16,16 +16,19 @@ public class RouterFragmentHandler extends FragmentHandler {
         _log = context.logManager().getLog(RouterFragmentHandler.class);
     }
     
+    @Override
     protected void noteReception(long messageId, int fragmentId, Object status) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Received fragment " + fragmentId + " for message " + messageId + ": " + status);
         _routerContext.messageHistory().receiveTunnelFragment(messageId, fragmentId, status);
     }
+    @Override
     protected void noteCompletion(long messageId) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Received complete message " + messageId);
         _routerContext.messageHistory().receiveTunnelFragmentComplete(messageId);
     }
+    @Override
     protected void noteFailure(long messageId, String status) {
         if (_log.shouldLog(Log.INFO))
             _log.info("Dropped message " + messageId + ": " + status);
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
index 83f5fbf94e0e6418f2556989a9079fd6b480f2b4..72dccf45c19a9775aaff444a93baeb70cea64b11 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
@@ -163,6 +163,7 @@ public class TunnelCreatorConfig implements TunnelInfo {
             _failures = 0;
     }
     
+    @Override
     public String toString() {
         // H0:1235-->H1:2345-->H2:2345
         StringBuffer buf = new StringBuffer(128);
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
index a9ed0cc1e76df912be1ef39f6c418cb838be4e93..077a43b7de30c3886c793ac5c0b727ded695773f 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
@@ -36,13 +36,13 @@ import net.i2p.util.SimpleTimer;
 public class TunnelGateway {
     protected I2PAppContext _context;
     protected Log _log;
-    protected List _queue;
+    protected final List _queue;
     protected QueuePreprocessor _preprocessor;
     protected Sender _sender;
     protected Receiver _receiver;
     protected long _lastFlush;
     protected int _flushFrequency;
-    protected DelayedFlush _delayedFlush;
+    protected DelayedFlush _delayedFlush;// LINT -- Exporting non-public type through public API
     protected int _messagesSent;
     
     /**
@@ -236,6 +236,7 @@ public class TunnelGateway {
             super(message, toRouter, toTunnel, _context.clock().now());
         }        
         
+        @Override
         public String toString() {
             StringBuffer buf = new StringBuffer(64);
             buf.append("Message ").append(_messageId).append(" on ");
@@ -257,6 +258,7 @@ public class TunnelGateway {
             return buf.toString();
         }
 
+        @Override
         public long getLifetime() { return _context.clock().now()-_created; }
     }
     
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
index 7e808199dea1f2b49cee2e3aaaa9661e2ad1ad3e..b840dad287bb154f7854697ed292dc95aafd62f0 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGatewayPumper.java
@@ -14,7 +14,7 @@ import net.i2p.util.Log;
 public class TunnelGatewayPumper implements Runnable {
     private RouterContext _context;
     private Log _log;
-    private List _wantsPumping;
+    private final List _wantsPumping;
     private boolean _stop;
     
     /** Creates a new instance of TunnelGatewayPumper */
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java b/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java
index 1abceb9f25e85afccfd3a76e0ca77b67da205c04..aefe9670decd0f42b5b2b88b14b88b6aac12948f 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGatewayZeroHop.java
@@ -12,8 +12,8 @@ import net.i2p.util.Log;
  *
  */
 public class TunnelGatewayZeroHop extends TunnelGateway {
-    private RouterContext _context;
-    private Log _log;
+    private RouterContext _context; // LINT -- field hides a field
+    private Log _log; // LINT -- field hides a field
     private TunnelCreatorConfig _config;
     private OutboundMessageDistributor _outDistributor;
     private InboundMessageDistributor _inDistributor;
@@ -37,6 +37,7 @@ public class TunnelGatewayZeroHop extends TunnelGateway {
      *
      * @param msg message received to be sent through the tunnel
      */
+    @Override
     public void add(TunnelGatewayMessage msg) {
         add(msg.getMessage(), null, null);
     }
@@ -50,6 +51,7 @@ public class TunnelGatewayZeroHop extends TunnelGateway {
      * @param toRouter router to send to after the endpoint (or null for endpoint processing)
      * @param toTunnel tunnel to send to after the endpoint (or null for endpoint or router processing)
      */
+    @Override
     public void add(I2NPMessage msg, Hash toRouter, TunnelId toTunnel) {
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("zero hop gateway: distribute " + (_config.isInbound() ? "inbound " : " outbound ")
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
index 5fc8708572147fdf31634d91341c94c7a29c07a6..5e4a92641bb4e5adf99cb72851be12f0790f59ed 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
@@ -218,6 +218,7 @@ public class TunnelParticipant {
         }
     }
     
+    @Override
     public String toString() { 
         if (_config != null) {
             StringBuffer buf = new StringBuffer(64);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
index 06a66635432e51e055e3765a1360bfcb1686c888..05b53fbf9b4bc9874ed5d497fd7b3c9978d2b11d 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildExecutor.java
@@ -21,11 +21,12 @@ import net.i2p.util.Log;
  *
  */
 class BuildExecutor implements Runnable {
+    private final List _recentBuildIds = new ArrayList(100);
     private RouterContext _context;
     private Log _log;
     private TunnelPoolManager _manager;
     /** list of TunnelCreatorConfig elements of tunnels currently being built */
-    private List _currentlyBuilding;
+    private final List _currentlyBuilding;
     private boolean _isRunning;
     private BuildHandler _handler;
     private boolean _repoll;
@@ -50,7 +51,7 @@ class BuildExecutor implements Runnable {
 
         // Get stat manager, get recognized bandwidth tiers
         StatManager statMgr = _context.statManager();
-        String bwTiers = _context.router().getRouterInfo().BW_CAPABILITY_CHARS;
+        String bwTiers = _context.router().getRouterInfo().BW_CAPABILITY_CHARS; // LINT -- Accessing static field "BW_CAPABILITY_CHARS"
         // For each bandwidth tier, create tunnel build agree/reject/expire stats
         for (int i = 0; i < bwTiers.length(); i++) {
             String bwTier = String.valueOf(bwTiers.charAt(i));
@@ -423,7 +424,6 @@ class BuildExecutor implements Runnable {
         }
     }
     
-    private List _recentBuildIds = new ArrayList(100);
     public boolean wasRecentlyBuilding(long replyId) {
         synchronized (_recentBuildIds) {
             return _recentBuildIds.contains(new Long(replyId));
diff --git a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
index 0699d3ff4d04b0df98485f266c3c08f738161d00..38350544e68ac803fb74bf3222c9cc25b737f78b 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
@@ -39,11 +39,11 @@ class BuildHandler {
     private Job _buildMessageHandlerJob;
     private Job _buildReplyMessageHandlerJob;
     /** list of BuildMessageState, oldest first */
-    private List _inboundBuildMessages;
+    private final List _inboundBuildMessages;
     /** list of BuildReplyMessageState, oldest first */
-    private List _inboundBuildReplyMessages;
+    private final List _inboundBuildReplyMessages;
     /** list of BuildEndMessageState, oldest first */
-    private List _inboundBuildEndMessages;
+    private final List _inboundBuildEndMessages;
     private BuildMessageProcessor _processor;
     
     public BuildHandler(RouterContext ctx, BuildExecutor exec) {
@@ -607,7 +607,7 @@ class BuildHandler {
             // send it to the reply tunnel on the reply peer within a new TunnelBuildReplyMessage
             // (enough layers jrandom?)
             TunnelBuildReplyMessage replyMsg = new TunnelBuildReplyMessage(_context);
-            for (int i = 0; i < state.msg.RECORD_COUNT; i++)
+            for (int i = 0; i < state.msg.RECORD_COUNT; i++) // LINT -- Accessing Static field "RECORD_COUNT"
                 replyMsg.setRecord(i, state.msg.getRecord(i));
             replyMsg.setUniqueId(req.readReplyMessageId());
             replyMsg.setMessageExpiration(_context.clock().now() + 10*1000);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
index 76f2c3c256abd35451ff8072a2a986fd0bd30062..3cc4906ea93a3c1ef680519f218d0eb50a9effbf 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/PooledTunnelCreatorConfig.java
@@ -31,6 +31,7 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
     }
     
     // calls TestJob
+    @Override
     public void testSuccessful(int ms) {
         if (_testJob != null)
             _testJob.testSuccessful(ms);
@@ -47,6 +48,7 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
     /**
      * The tunnel failed a test, so (maybe) stop using it
      */
+    @Override
     public boolean tunnelFailed() {
         boolean rv = super.tunnelFailed();
         if (!rv) {
@@ -60,6 +62,7 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
         return rv;
     }
     
+    @Override
     public Properties getOptions() {
         if (_pool == null) return null;
         return _pool.getSettings().getUnknownOptions();
@@ -75,7 +78,8 @@ public class PooledTunnelCreatorConfig extends TunnelCreatorConfig {
     }
     public TunnelPool getTunnelPool() { return _pool; }
     
-    public void setTestJob(TestJob job) { _testJob = job; }
+
+    public void setTestJob(TestJob job) { _testJob = job; } // LINT -- Exporting non-public type through public API
     public void setExpireJob(Job job) { /* _expireJob = job; */ }
     
     // Fix memory leaks caused by references if you need to use pairedTunnel
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
index b81178bdf75b8baf81ff43a2c075361552bef69d..24b379543e6cc58ea5039e042f557440e72eb138 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
@@ -250,6 +250,7 @@ class TestJob extends JobImpl {
             return false;
         }
         
+        @Override
         public String toString() {
             StringBuffer rv = new StringBuffer(64);
             rv.append("Testing tunnel ").append(_cfg.toString()).append(" waiting for ");
@@ -281,6 +282,7 @@ class TestJob extends JobImpl {
             _successTime = getContext().clock().now() - ((DeliveryStatusMessage)message).getArrival();
         }
         
+        @Override
         public String toString() {
             StringBuffer rv = new StringBuffer(64);
             rv.append("Testing tunnel ").append(_cfg.toString());
@@ -306,6 +308,7 @@ class TestJob extends JobImpl {
                 testFailed(getContext().clock().now() - _started);
         }
         
+        @Override
         public String toString() {
             StringBuffer rv = new StringBuffer(64);
             rv.append("Testing tunnel ").append(_cfg.toString());
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
index 699a8be9f1468e57b09e33c235d589ff35247333..8319052999e501792a23ed8d1e420e13d755d5d1 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -25,10 +25,11 @@ import net.i2p.util.Log;
  *
  */
 public class TunnelPool {
+    private final List _inProgress = new ArrayList();
     private RouterContext _context;
     private Log _log;
     private TunnelPoolSettings _settings;
-    private ArrayList<TunnelInfo> _tunnels;
+    private final ArrayList<TunnelInfo> _tunnels;
     private TunnelPeerSelector _peerSelector;
     private TunnelPoolManager _manager;
     private boolean _alive;
@@ -866,13 +867,13 @@ public class TunnelPool {
         return cfg;
     }
     
-    private List _inProgress = new ArrayList();
     void buildComplete(PooledTunnelCreatorConfig cfg) {
         synchronized (_inProgress) { _inProgress.remove(cfg); }
         cfg.setTunnelPool(this);
         //_manager.buildComplete(cfg);
     }
     
+    @Override
     public String toString() {
         if (_settings.isExploratory()) {
             if (_settings.isInbound())
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
index acbb9345db9795ff85d8751f30e7ef42eed18b70..852ee28ff3ea3b502211a2d95917791d25cea81d 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPoolManager.java
@@ -38,9 +38,9 @@ public class TunnelPoolManager implements TunnelManagerFacade {
     private RouterContext _context;
     private Log _log;
     /** Hash (destination) to TunnelPool */
-    private Map _clientInboundPools;
+    private final Map _clientInboundPools;
     /** Hash (destination) to TunnelPool */
-    private Map _clientOutboundPools;
+    private final Map _clientOutboundPools;
     private TunnelPool _inboundExploratory;
     private TunnelPool _outboundExploratory;
     private LoadTestManager _loadTestManager;