diff --git a/apps/i2psnark/java/src/org/klomp/snark/Storage.java b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
index b3c4fd3e693cd46c564c2cd5755c80aa65652d3b..6b786054fca48c7e78f9196d5076a4282de21427 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/Storage.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/Storage.java
@@ -1301,6 +1301,15 @@ public class Storage
           return name.compareTo(tf.name);
       }
 
+      @Override
+      public int hashCode() { return RAFfile.getAbsolutePath().hashCode(); }
+
+      @Override
+      public boolean equals(Object o) {
+          return (o instanceof TorrentFile) &&
+                 RAFfile.getAbsolutePath().equals(((TorrentFile)o).RAFfile.getAbsolutePath());
+      }
+
       @Override
       public String toString() { return name; }
   }
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java
index f1b73c1146ddddc2e6b06f204450d044f640fc64..244e76c6e045050d540e0538e70d51b090892f17 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/HTTPResponseOutputStream.java
@@ -273,11 +273,10 @@ class HTTPResponseOutputStream extends FilterOutputStream {
         }
 
         public void run() {
-            ReusableGZIPInputStream _in = null;
+            ReusableGZIPInputStream _in = ReusableGZIPInputStream.acquire();
             long written = 0;
             ByteArray ba = null;
             try {
-                _in = ReusableGZIPInputStream.acquire();
                 // blocking
                 _in.initialize(_inRaw);
                 ba = _cache.acquire();
@@ -294,7 +293,7 @@ class HTTPResponseOutputStream extends FilterOutputStream {
                     _log.info("Decompressed: " + written + ", " + _in.getTotalRead() + "/" + _in.getTotalExpanded());
             } catch (IOException ioe) {
                 if (_log.shouldLog(Log.WARN))
-                    _log.warn("Error decompressing: " + written + ", " + (_in != null ? _in.getTotalRead() + "/" + _in.getTotalExpanded() : ""), ioe);
+                    _log.warn("Error decompressing: " + written + ", " + _in.getTotalRead() + "/" + _in.getTotalExpanded(), ioe);
             } catch (OutOfMemoryError oom) {
                 _log.error("OOM in HTTP Decompressor", oom);
             } finally {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
index 1bf2ead5ff16334a22fa221f1ed7d4c75c8ed107..1cdf6f29e2a2a8db4f231692c25cd17adf4180f8 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnel.java
@@ -51,6 +51,7 @@ import java.util.Properties;
 import java.util.Set;
 import java.util.StringTokenizer;
 import java.util.concurrent.CopyOnWriteArraySet;
+import java.util.concurrent.atomic.AtomicLong;
 
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
@@ -78,7 +79,7 @@ import net.i2p.util.Log;
 public class I2PTunnel extends EventDispatcherImpl implements Logging {
     private final Log _log;
     private final I2PAppContext _context;
-    private static long __tunnelId = 0;
+    private static final AtomicLong __tunnelId = new AtomicLong();
     private final long _tunnelId;
     private final Properties _clientOptions;
     private final Set<I2PSession> _sessions;
@@ -118,7 +119,7 @@ public class I2PTunnel extends EventDispatcherImpl implements Logging {
     public I2PTunnel(String[] args, ConnectionEventListener lsnr) {
         super();
         _context = I2PAppContext.getGlobalContext(); // new I2PAppContext();
-        _tunnelId = ++__tunnelId;
+        _tunnelId = __tunnelId.incrementAndGet();
         _log = _context.logManager().getLog(I2PTunnel.class);
         // as of 0.8.4, include context properties
         Properties p = _context.getProperties();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
index c6d5904943aaf721e7504f2d0f0c02101b5b1f48..381a113be72f4527f76f9b050c546b07e72a3579 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelClientBase.java
@@ -22,6 +22,7 @@ import java.util.concurrent.RejectedExecutionException;
 import java.util.concurrent.ThreadPoolExecutor;
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.ThreadFactory;
+import java.util.concurrent.atomic.AtomicLong;
 
 import net.i2p.I2PAppContext;
 import net.i2p.I2PException;
@@ -43,7 +44,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
 
     static final long DEFAULT_CONNECT_TIMEOUT = 60 * 1000;
 
-    private static volatile long __clientId = 0;
+    private static final AtomicLong __clientId = new AtomicLong();
     protected long _clientId;
     protected final Object sockLock = new Object(); // Guards sockMgr and mySockets
     protected I2PSocketManager sockMgr; // should be final and use a factory. LINT
@@ -161,7 +162,7 @@ public abstract class I2PTunnelClientBase extends I2PTunnelTask implements Runna
                                EventDispatcher notifyThis, String handlerName, 
                                I2PTunnel tunnel, String pkf) throws IllegalArgumentException{
         super(localPort + " (uninitialized)", notifyThis, tunnel);
-        _clientId = ++__clientId;
+        _clientId = __clientId.incrementAndGet();
         this.localPort = localPort;
         this.l = l;
         _ownDest = ownDest; // == ! shared client
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
index 142aaf49bbd10f7e92235ac7a1244f86dd6e56f6..f05600a9e7cb8c7f4c98d9ae9ca0ac96003d0fac 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
@@ -104,7 +104,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
     public I2PTunnelConnectClient(int localPort, Logging l, boolean ownDest, 
                                String wwwProxy, EventDispatcher notifyThis, 
                                I2PTunnel tunnel) throws IllegalArgumentException {
-        super(localPort, ownDest, l, notifyThis, "HTTPS Proxy on " + tunnel.listenHost + ':' + localPort + " #" + (++__clientId), tunnel);
+        super(localPort, ownDest, l, notifyThis, "HTTPS Proxy on " + tunnel.listenHost + ':' + localPort, tunnel);
 
         if (waitEventValue("openBaseClientResult").equals("error")) {
             notifyEvent("openConnectClientResult", "error");
@@ -167,7 +167,7 @@ public class I2PTunnelConnectClient extends I2PTunnelHTTPClientBase implements R
         String targetRequest = null;
         boolean usingWWWProxy = false;
         String currentProxy = null;
-        long requestId = ++__requestId;
+        long requestId = __requestId.incrementAndGet();
         try {
             out = s.getOutputStream();
             in = s.getInputStream();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
index f28df88277cc3fbc567e13e4355825823a2a8042..3ab3e6709e6706f1cf35563bb1fad7ad342073f7 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
@@ -202,7 +202,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
     public I2PTunnelHTTPClient(int localPort, Logging l, boolean ownDest,
                                String wwwProxy, EventDispatcher notifyThis,
                                I2PTunnel tunnel) throws IllegalArgumentException {
-        super(localPort, ownDest, l, notifyThis, "HTTP Proxy on " + tunnel.listenHost + ':' + localPort + " #" + (++__clientId), tunnel);
+        super(localPort, ownDest, l, notifyThis, "HTTP Proxy on " + tunnel.listenHost + ':' + localPort, tunnel);
         _proxyNonce = Long.toString(_context.random().nextLong());
 
         //proxyList = new ArrayList(); // We won't use outside of i2p
@@ -335,7 +335,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelHTTPClientBase implements Runn
         String internalPath = null;
         String internalRawQuery = null;
         String currentProxy = null;
-        long requestId = ++__requestId;
+        long requestId = __requestId.incrementAndGet();
         boolean shout = false;
 
         try {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
index e9cfb12b50fe1f0d411d8715367a44c28b315684..3209b6ad2ce04a0c8ce6f357cd47191a7fad5d97 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClientBase.java
@@ -18,6 +18,7 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.atomic.AtomicInteger;
+import java.util.concurrent.atomic.AtomicLong;
 
 import net.i2p.I2PAppContext;
 import net.i2p.client.streaming.I2PSocketManager;
@@ -69,9 +70,6 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
          "HTTP outproxy configured.  Please configure an outproxy in I2PTunnel")
          .getBytes();
     
-    /** used to assign unique IDs to the threads / clients.  no logic or functionality */
-    protected static volatile long __clientId = 0;
-
     private final byte[] _proxyNonce;
     private final ConcurrentHashMap<String, NonceInfo> _nonces;
     private final AtomicInteger _nonceCleanCounter = new AtomicInteger();
@@ -90,7 +88,7 @@ public abstract class I2PTunnelHTTPClientBase extends I2PTunnelClientBase implem
 
     protected static final int DEFAULT_READ_TIMEOUT = 5*60*1000;
     
-    protected static long __requestId = 0;
+    protected static final AtomicLong __requestId = new AtomicLong();
 
     public I2PTunnelHTTPClientBase(int localPort, boolean ownDest, Logging l, 
                                EventDispatcher notifyThis, String handlerName, 
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
index 41e3069fd87d26449b9987aac15eabc8f3899d9f..5e1b76fc788c618eaff4758e445e84de28182bd5 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
@@ -29,9 +29,6 @@ import net.i2p.util.PortMapper;
  */
 public class I2PTunnelIRCClient extends I2PTunnelClientBase {
 
-    /** used to assign unique IDs to the threads / clients.  no logic or functionality */
-    private static volatile long __clientId = 0;
-    
     /** list of Destination objects that we point at */
     private final List<I2PSocketAddress> _addrs;
     private static final long DEFAULT_READ_TIMEOUT = 5*60*1000; // -1
@@ -61,7 +58,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase {
               ownDest, 
               l, 
               notifyThis, 
-              "IRC Client on " + tunnel.listenHost + ':' + localPort + " #" + (++__clientId), tunnel, pkf);
+              "IRC Client on " + tunnel.listenHost + ':' + localPort, tunnel, pkf);
         
         _addrs = new ArrayList(4);
         buildAddresses(destinations);
@@ -139,9 +136,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase {
             i2ps.setReadTimeout(readTimeout);
             StringBuffer expectedPong = new StringBuffer();
             DCCHelper dcc = _dccEnabled ? new DCC(s.getLocalAddress().getAddress()) : null;
-            Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong, _log, dcc), "IRC Client " + __clientId + " in", true);
+            Thread in = new I2PAppThread(new IrcInboundFilter(s,i2ps, expectedPong, _log, dcc), "IRC Client " + _clientId + " in", true);
             in.start();
-            Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong, _log, dcc), "IRC Client " + __clientId + " out", true);
+            Thread out = new I2PAppThread(new IrcOutboundFilter(s,i2ps, expectedPong, _log, dcc), "IRC Client " + _clientId + " out", true);
             out.start();
         } catch (Exception ex) {
             // generally NoRouteToHostException
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
index c3bfea5e7bf37b2548c4f3abba857d4b10e62655..fe512be23386544e96c67e8f6ab60d8b2d0385d4 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelRunner.java
@@ -11,6 +11,7 @@ import java.io.OutputStream;
 import java.net.Socket;
 import java.net.SocketException;
 import java.util.List;
+import java.util.concurrent.atomic.AtomicLong;
 
 import javax.net.ssl.SSLException;
 
@@ -26,7 +27,7 @@ import net.i2p.util.Log;
 public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErrorListener {
     protected final Log _log;
 
-    private static volatile long __runnerId;
+    private static final AtomicLong __runnerId = new AtomicLong();
     private final long _runnerId;
     /** 
      * max bytes streamed in a packet - smaller ones might be filled
@@ -96,7 +97,7 @@ public class I2PTunnelRunner extends I2PAppThread implements I2PSocket.SocketErr
         _log = I2PAppContext.getGlobalContext().logManager().getLog(getClass());
         if (_log.shouldLog(Log.INFO))
             _log.info("I2PTunnelRunner started");
-        _runnerId = ++__runnerId;
+        _runnerId = __runnerId.incrementAndGet();
         __forwarderId = i2ps.hashCode();
         setName("I2PTunnelRunner " + _runnerId);
         start();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java
index 442c1533faaa1768b16ab6905bff6b0b6a955023..f439019484c21b3410ce8225bbbac19b289e4a2f 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/udpTunnel/I2PTunnelUDPClientBase.java
@@ -6,6 +6,7 @@ package net.i2p.i2ptunnel.udpTunnel;
 import java.io.ByteArrayOutputStream;
 import java.io.ByteArrayInputStream;
 import java.net.ServerSocket;
+import java.util.concurrent.atomic.AtomicLong;
 
 import net.i2p.I2PAppContext;
 import net.i2p.client.I2PClient;
@@ -48,13 +49,12 @@ import net.i2p.util.EventDispatcher;
 
     static final long DEFAULT_CONNECT_TIMEOUT = 60 * 1000;
 
-    private static volatile long __clientId = 0;
+    private static final AtomicLong __clientId = new AtomicLong();
     protected long _clientId;
 
     protected Destination dest = null;
 
     private final Object startLock = new Object();
-    private Object conLock = new Object();
     
     private I2PSession _session;
     private Source _i2pSource;
@@ -67,7 +67,7 @@ import net.i2p.util.EventDispatcher;
    public I2PTunnelUDPClientBase(String destination, Logging l, EventDispatcher notifyThis,
                                   I2PTunnel tunnel) throws IllegalArgumentException {
         super("UDPServer", notifyThis, tunnel);
-        _clientId = ++__clientId;
+        _clientId = __clientId.incrementAndGet();;
         this.l = l;
 
         _context = tunnel.getContext();
diff --git a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
index 039f1528334180a5d4e6225bd3e10ac0675402d3..b61bc40745bc290df1861e78554e33915ed08069 100644
--- a/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
+++ b/apps/routerconsole/java/src/net/i2p/router/update/ConsoleUpdateManager.java
@@ -1104,7 +1104,6 @@ public class ConsoleUpdateManager implements UpdateManager {
 
             case PLUGIN:
                 Properties props = PluginStarter.pluginProperties(_context, id);
-                String oldVersion = props.getProperty("version");
                 String xpi2pURL = props.getProperty("updateURL");
                 if (xpi2pURL != null) {
                     try {
@@ -1472,6 +1471,12 @@ public class ConsoleUpdateManager implements UpdateManager {
             return VersionComparator.comp(version, r.version);
         }
 
+        @Override
+        public int hashCode() { return version.hashCode(); }
+
+        @Override
+        public boolean equals(Object o) { return (o instanceof Version) && version.equals(((Version)o).version); }
+
         @Override
         public String toString() {
             return "Version " + version;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
index 31e8ff0bb5be079e2423b2cdbd5e01e6d882e987..2f8e441f4c16b9e1b9f59ebaa48b714316b21d80 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/PluginStarter.java
@@ -632,7 +632,7 @@ public class PluginStarter implements Runnable {
 
             ClassLoader cl = null;
             if (app.classpath != null) {
-                String cp = new String(app.classpath);
+                String cp = app.classpath;
                 if (cp.indexOf("$") >= 0) {
                     cp = cp.replace("$I2P", ctx.getBaseDir().getAbsolutePath());
                     cp = cp.replace("$CONFIG", ctx.getConfigDir().getAbsolutePath());
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java b/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java
index ac7dc477885203aa3b392af08f5880933cf604e9..e2b9e2e7fdb6eacc03337908823d8dc7b8a0333d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/WebAppStarter.java
@@ -85,7 +85,7 @@ public class WebAppStarter {
             throw new IOException("Web app " + warPath + " does not exist");
         Long oldmod = warModTimes.get(warPath);
         if (oldmod == null) {
-            warModTimes.put(warPath, new Long(newmod));
+            warModTimes.put(warPath, Long.valueOf(newmod));
         } else if (oldmod.longValue() < newmod) {
             // copy war to temporary directory
             File warTmpDir = new SecureDirectory(ctx.getTempDir(), "war-copy-" + appName + ctx.random().nextInt());
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
index 80ffce32c760adeba5676dbfd705e56f38060b5b..323673bae26bc2624b6955970fa9b90c4c4e6130 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/AddressbookBean.java
@@ -354,11 +354,17 @@ public class AddressbookBean extends BaseBean
 	{
 		String filename = properties.getProperty( getBook() + "_addressbook" );
 		
-		FileOutputStream fos = new SecureFileOutputStream( ConfigBean.addressbookPrefix + filename  );
-		addressbook.store( fos, null );
+		FileOutputStream fos = null;
 		try {
-			fos.close();
-		} catch (IOException ioe) {}
+			fos = new SecureFileOutputStream( ConfigBean.addressbookPrefix + filename  );
+			addressbook.store( fos, null );
+		} finally {
+			if (fos != null) {
+				try {
+					fos.close();
+				} catch (IOException ioe) {}
+			}
+		}
 	}
 
 	public String getFilter() {
diff --git a/core/java/src/net/i2p/crypto/AESEngine.java b/core/java/src/net/i2p/crypto/AESEngine.java
index 85b98d5f97556819f2c31bf7fb00af59c255f049..af0fb79f960b400c3504f4a61dc92aa0e00d8451 100644
--- a/core/java/src/net/i2p/crypto/AESEngine.java
+++ b/core/java/src/net/i2p/crypto/AESEngine.java
@@ -108,10 +108,6 @@ public class AESEngine {
 
         byte decr[] = new byte[payload.length];
         decrypt(payload, 0, decr, 0, sessionKey, iv, payload.length);
-        if (decr == null) {
-            _log.error("Error decrypting the data - payload " + payload.length + " decrypted to null");
-            return null;
-        }
 
         byte h[] = SimpleByteCache.acquire(Hash.HASH_LENGTH);
         _context.sha().calculateHash(iv, 0, 16, h, 0);
diff --git a/core/java/src/net/i2p/crypto/CertUtil.java b/core/java/src/net/i2p/crypto/CertUtil.java
index eef351c03409a9ee65b86a3663f78192dd24ba77..27ca116f58394de5d8476fac9114f0ed963ccd8d 100644
--- a/core/java/src/net/i2p/crypto/CertUtil.java
+++ b/core/java/src/net/i2p/crypto/CertUtil.java
@@ -89,9 +89,9 @@ public class CertUtil {
         log(I2PAppContext.getGlobalContext(), Log.ERROR, msg, t);
     }
 
-    private static void error(I2PAppContext ctx, String msg, Throwable t) {
-        log(ctx, Log.ERROR, msg, t);
-    }
+    //private static void error(I2PAppContext ctx, String msg, Throwable t) {
+    //    log(ctx, Log.ERROR, msg, t);
+    //}
 
     private static void log(I2PAppContext ctx, int level, String msg, Throwable t) {
         Log l = ctx.logManager().getLog(CertUtil.class);
diff --git a/core/java/src/net/i2p/crypto/KeyStoreUtil.java b/core/java/src/net/i2p/crypto/KeyStoreUtil.java
index a367534912a7b9528e9b2146e95dd5acc3d440bb..665f9c907c5ccd31aab03dea2bd1e4cd9bad3b06 100644
--- a/core/java/src/net/i2p/crypto/KeyStoreUtil.java
+++ b/core/java/src/net/i2p/crypto/KeyStoreUtil.java
@@ -4,6 +4,7 @@ import java.io.File;
 import java.io.FileInputStream;
 import java.io.InputStream;
 import java.io.IOException;
+import java.io.OutputStream;
 import java.security.GeneralSecurityException;
 import java.security.KeyStore;
 import java.security.PrivateKey;
@@ -54,11 +55,23 @@ public class KeyStoreUtil {
         char[] pwchars = password != null ? password.toCharArray() : null;
         KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
         if (exists) {
-            InputStream fis = new FileInputStream(ksFile);
-            ks.load(fis, pwchars);
+            InputStream fis = null;
+            try {
+                fis = new FileInputStream(ksFile);
+                ks.load(fis, pwchars);
+            } finally {
+                if (fis != null) try { fis.close(); } catch (IOException ioe) {}
+            }
+        }
+        if (ksFile != null && !exists) {
+            OutputStream fos = null;
+            try {
+                fos = new SecureFileOutputStream(ksFile);
+                ks.store(fos, pwchars);
+            } finally {
+                if (fos != null) try { fos.close(); } catch (IOException ioe) {}
+            }
         }
-        if (ksFile != null && !exists)
-            ks.store(new SecureFileOutputStream(ksFile), pwchars);
         return ks;
     }
 
@@ -452,13 +465,13 @@ public class KeyStoreUtil {
         log(I2PAppContext.getGlobalContext(), Log.ERROR, msg, t);
     }
 
-    private static void info(I2PAppContext ctx, String msg) {
-        log(ctx, Log.INFO, msg, null);
-    }
+    //private static void info(I2PAppContext ctx, String msg) {
+    //    log(ctx, Log.INFO, msg, null);
+    //}
 
-    private static void error(I2PAppContext ctx, String msg, Throwable t) {
-        log(ctx, Log.ERROR, msg, t);
-    }
+    //private static void error(I2PAppContext ctx, String msg, Throwable t) {
+    //    log(ctx, Log.ERROR, msg, t);
+    //}
 
     private static void log(I2PAppContext ctx, int level, String msg, Throwable t) {
         if (level >= Log.WARN && !ctx.isRouterContext()) {
diff --git a/core/java/src/net/i2p/crypto/SigUtil.java b/core/java/src/net/i2p/crypto/SigUtil.java
index 1d9fe7c17d0b39268a75bdf9c656434177fe079f..da2fa363e521892ac46f215f894b1d2e3bfaeff0 100644
--- a/core/java/src/net/i2p/crypto/SigUtil.java
+++ b/core/java/src/net/i2p/crypto/SigUtil.java
@@ -174,7 +174,6 @@ class SigUtil {
     private static ECPrivateKey cvtToJavaECKey(SigningPrivateKey pk)
                               throws GeneralSecurityException {
         SigType type = pk.getType();
-        int len = type.getPubkeyLen();
         byte[] b = pk.getData();
         BigInteger s = new NativeBigInteger(1, b);
         // see ECConstants re: casting
diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
index 0d2d024360c7d08a13f0460b85d69c3fec3fe4b0..dbe17366a473005c790b7cfdc01eec29b1812cb9 100644
--- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
+++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
@@ -293,7 +293,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
             }
             if (sess == null) {
                 SessionKey key = _context.keyGenerator().generateSessionKey();
-                sess = createAndReturnSession(target, key);
+                createAndReturnSession(target, key);
                 return key;
             }
             return sess.getCurrentKey();
diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java
index 2731b6ce9dfbefb13ec9c78351ee018ed003d44b..8fb72e1c0af567e3ab1ca267fcdd3b500888f8fb 100644
--- a/core/java/src/net/i2p/data/Base64.java
+++ b/core/java/src/net/i2p/data/Base64.java
@@ -477,9 +477,11 @@ public class Base64 {
      * @param breakLines Break lines at 80 characters or less.
      * @since 1.4
      */
+/***** unused
     private static String encodeBytes(byte[] source, boolean breakLines) {
         return encodeBytes(source, 0, source.length, breakLines);
     } // end encodeBytes
+******/
 
     /**
      * Encodes a byte array into Base64 notation.
@@ -493,13 +495,13 @@ public class Base64 {
     private static String encodeBytes(byte[] source, int off, int len) {
         return encodeBytes(source, off, len, true);
     } // end encodeBytes
-******/
 
     private static String encodeBytes(byte[] source, int off, int len, boolean breakLines) {
         StringBuilder buf = new StringBuilder( (len*4)/3 );
         encodeBytes(source, off, len, breakLines, buf, ALPHABET);
         return buf.toString();
     }
+******/
         
     /**
      * Encodes a byte array into Base64 notation.
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index 93606b2478f36dbbdac9f25dcf9d77f4f3239df3..2fadef1db753af9006b38ff1999a93205e3db72b 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -1291,7 +1291,7 @@ public class EepGet {
             } catch (IOException ioe) {
                 _decompressException = ioe;
                 if (_log.shouldLog(Log.WARN))
-                    _log.warn("Error decompressing: " + written + ", " + (in != null ? in.getTotalRead() + "/" + in.getTotalExpanded() : ""), ioe);
+                    _log.warn("Error decompressing: " + written + ", " + in.getTotalRead() + "/" + in.getTotalExpanded(), ioe);
             } catch (OutOfMemoryError oom) {
                 _decompressException = new IOException("OOM in HTTP Decompressor");
                 _log.error("OOM in HTTP Decompressor", oom);
diff --git a/core/java/src/net/i2p/util/NativeBigInteger.java b/core/java/src/net/i2p/util/NativeBigInteger.java
index 48762653d5eef6da92f34a2a29875c2f456ad3c6..99850c066804cdc774129377a7ee32b78ca0ab04 100644
--- a/core/java/src/net/i2p/util/NativeBigInteger.java
+++ b/core/java/src/net/i2p/util/NativeBigInteger.java
@@ -522,9 +522,11 @@ public class NativeBigInteger extends BigInteger {
      * @return true if it was loaded successfully, else false
      *
      */
+/****
     private static final boolean loadGeneric(boolean optimized) {
         return loadGeneric(getMiddleName(optimized));
     }
+****/
 
     private static final boolean loadGeneric(String name) {
         try {
@@ -563,10 +565,12 @@ public class NativeBigInteger extends BigInteger {
      * @return true if it was loaded successfully, else false
      *
      */
+/****
     private static final boolean loadFromResource(boolean optimized) {
         String resourceName = getResourceName(optimized);
         return loadFromResource(resourceName);
     }
+****/
 
     private static final boolean loadFromResource(String resourceName) {
         if (resourceName == null) return false;
diff --git a/core/java/src/net/metanotion/io/data/IntBytes.java b/core/java/src/net/metanotion/io/data/IntBytes.java
index 251cea6542ac1e28bc98638f1b4fa4d0cb2d4f00..89845040c2a20c17d6f486cd52fe6c673a79b0ff 100644
--- a/core/java/src/net/metanotion/io/data/IntBytes.java
+++ b/core/java/src/net/metanotion/io/data/IntBytes.java
@@ -46,6 +46,6 @@ public class IntBytes implements Serializer {
 				 ((b[1] & 0xff) << 16) |
 				 ((b[2] & 0xff) <<  8) |
 				 (b[3] & 0xff));
-		return new Integer(v);
+		return Integer.valueOf(v);
 	}
 }
diff --git a/core/java/src/net/metanotion/io/data/LongBytes.java b/core/java/src/net/metanotion/io/data/LongBytes.java
index 796b6493d6f7e7534f3dcb207ab8ef81b101f5b8..fe06e5120450ac8abb34ca7f379ea13437482cd6 100644
--- a/core/java/src/net/metanotion/io/data/LongBytes.java
+++ b/core/java/src/net/metanotion/io/data/LongBytes.java
@@ -54,6 +54,6 @@ public class LongBytes implements Serializer {
 				 ((long)(b[5] & 0xff) << 16) |
 				 ((long)(b[6] & 0xff) <<  8) |
 				 (b[7] & 0xff));
-		return new Long(v);
+		return Long.valueOf(v);
 	}
 }
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 5f540c84e1b8c20f89db0273a51fda61c0ba020f..3388ca81934d3b99c7e7998638df04b7959f6869 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -18,7 +18,7 @@ public class RouterVersion {
     /** deprecated */
     public final static String ID = "Monotone";
     public final static String VERSION = CoreVersion.VERSION;
-    public final static long BUILD = 26;
+    public final static long BUILD = 27;
 
     /** for example "-test" */
     public final static String EXTRA = "";
diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java
index 3016dadd6ee82856c5b53b6cb9e6c45cb62237f4..1c52e3f7086cd45c0d4cb32451b9e2d0c83a00d6 100644
--- a/router/java/src/net/i2p/router/TunnelPoolSettings.java
+++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java
@@ -285,7 +285,7 @@ public class TunnelPoolSettings {
     private static final boolean getBoolean(String str, boolean defaultValue) { 
         if (str == null) return defaultValue;
         boolean v = Boolean.parseBoolean(str) ||
-                    (str != null && "YES".equals(str.toUpperCase(Locale.US)));
+                    "YES".equals(str.toUpperCase(Locale.US));
         return v;
     }
 
diff --git a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
index 8c20f72d46ecfd5fa7873ef1361ad0b5951b3879..072bfde8304f8a792560272899353ce9eb94016c 100644
--- a/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
+++ b/router/java/src/net/i2p/router/message/OutboundClientMessageOneShotJob.java
@@ -681,10 +681,17 @@ public class OutboundClientMessageOneShotJob extends JobImpl {
      *
      * this is safe to call multiple times (only tells the client once)
      */
+/****
     private void dieFatal() {
         dieFatal(MessageStatusMessage.STATUS_SEND_GUARANTEED_FAILURE);
     }
+****/
 
+    /**
+     * give up the ghost, this message just aint going through.  tell the client.
+     *
+     * this is safe to call multiple times (only tells the client once)
+     */
     private void dieFatal(int status) {
         if (_finished.getAndSet(true))
             return;
diff --git a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
index d09b11f04b42fd8f4505893812f61c5fa41eb1a8..eb6d3ee9d05eebb286ef4a8abad5ed0100eb8151 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/FloodfillVerifyStoreJob.java
@@ -97,10 +97,6 @@ class FloodfillVerifyStoreJob extends JobImpl {
             return;
         }
         DatabaseLookupMessage lookup = buildLookup(replyTunnelInfo);
-        if (lookup == null) {
-            _facade.verifyFinished(_key);
-            return;
-        }        
  
         // If we are verifying a leaseset, use the destination's own tunnels,
         // to avoid association by the exploratory tunnel OBEP.
@@ -180,6 +176,7 @@ class FloodfillVerifyStoreJob extends JobImpl {
         return _sentTo;
     }
     
+    /** @return non-null */
     private DatabaseLookupMessage buildLookup(TunnelInfo replyTunnelInfo) {
         // If we are verifying a leaseset, use the destination's own tunnels,
         // to avoid association by the exploratory tunnel OBEP.
diff --git a/router/java/src/net/i2p/router/tasks/ShutdownHook.java b/router/java/src/net/i2p/router/tasks/ShutdownHook.java
index d3db8f876569b34f2373539549a0c2acc453c27a..135494417cc9639bc37b3fb016a7855274e5d09c 100644
--- a/router/java/src/net/i2p/router/tasks/ShutdownHook.java
+++ b/router/java/src/net/i2p/router/tasks/ShutdownHook.java
@@ -8,6 +8,8 @@ package net.i2p.router.tasks;
  *
  */
 
+import java.util.concurrent.atomic.AtomicInteger;
+
 import net.i2p.router.Router;
 import net.i2p.router.RouterContext;
 import net.i2p.router.RouterVersion;
@@ -21,12 +23,12 @@ import net.i2p.util.Log;
  */
 public class ShutdownHook extends Thread {
     private final RouterContext _context;
-    private static int __id = 0;
+    private static final AtomicInteger __id = new AtomicInteger();
     private final int _id;
 
     public ShutdownHook(RouterContext ctx) {
         _context = ctx;
-        _id = ++__id;
+        _id = __id.incrementAndGet();
     }
 
     @Override
diff --git a/router/java/src/net/i2p/router/transport/GeoIPv6.java b/router/java/src/net/i2p/router/transport/GeoIPv6.java
index 0fdf7831070f6ab727f3ec74b6667aeda3897446..ebf79e5d14018c22c43ff2767525850ff5ec0158 100644
--- a/router/java/src/net/i2p/router/transport/GeoIPv6.java
+++ b/router/java/src/net/i2p/router/transport/GeoIPv6.java
@@ -292,6 +292,12 @@ class GeoIPv6 {
             return 0;
         }
 
+        @Override
+        public int hashCode() { return (((int) from) ^ ((int) to)); }
+
+        @Override
+        public boolean equals(Object o) { return (o instanceof V6Entry) && compareTo((V6Entry)o) == 0; }
+
         @Override
         public String toString() {
                 return "0x" + Long.toHexString(from) + " -> 0x" + Long.toHexString(to) + " : " + cc;