diff --git a/apps/i2psnark/java/src/org/klomp/snark/BitField.java b/apps/i2psnark/java/src/org/klomp/snark/BitField.java
index 85117b93d7159cfdd1174558ba5080465b4d690f..876a39159ae0901c76c39fdc8d780cb36ad21d3b 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/BitField.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/BitField.java
@@ -140,7 +140,7 @@ public class BitField
   public String toString()
   {
     // Not very efficient
-    StringBuffer sb = new StringBuffer("BitField(");
+    StringBuilder sb = new StringBuilder("BitField(");
     sb.append(size).append(")[");
     for (int i = 0; i < size; i++)
       if (get(i))
diff --git a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
index 984e50ef3f9c1cb164a0056dd6ab1791d4a9e8bc..77f07d2994218f0def5aa422b4332165d9240c6f 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/MetaInfo.java
@@ -362,7 +362,7 @@ public class MetaInfo
    */
   private static String hexencode(byte[] bs)
   {
-    StringBuffer sb = new StringBuffer(bs.length*2);
+    StringBuilder sb = new StringBuilder(bs.length*2);
     for (int i = 0; i < bs.length; i++)
       {
         int c = bs[i] & 0xFF;
@@ -432,7 +432,7 @@ public class MetaInfo
   private byte[] calculateInfoHash()
   {
     Map info = createInfoMap();
-    StringBuffer buf = new StringBuffer(128);
+    StringBuilder buf = new StringBuilder(128);
     buf.append("info: ");
     for (Iterator iter = info.entrySet().iterator(); iter.hasNext(); ) {
         Map.Entry entry = (Map.Entry)iter.next();
diff --git a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
index 67ff4c8580154d1e4cbbfddcab83c1f6d77602b6..0a998af3dff28dc58d7c5afe43414d66a5f78824 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/PeerID.java
@@ -190,7 +190,7 @@ public class PeerID implements Comparable
   {
     boolean leading_zeros = true;
 
-    StringBuffer sb = new StringBuffer(bs.length*2);
+    StringBuilder sb = new StringBuilder(bs.length*2);
     for (int i = 0; i < bs.length; i++)
       {
         int c = bs[i] & 0xFF;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
index 79ea62ebc4ffa0d1000acad3c4517bb160c96380..63b327974f451eee077547737f6ed1061000a3fe 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/SnarkManager.java
@@ -702,7 +702,7 @@ public class SnarkManager implements Snark.CompleteListener {
 //       , "mastertracker", "http://VzXD~stRKbL3MOmeTn1iaCQ0CFyTmuFHiKYyo0Rd~dFPZFCYH-22rT8JD7i-C2xzYFa4jT5U2aqHzHI-Jre4HL3Ri5hFtZrLk2ax3ji7Qfb6qPnuYkuiF2E2UDmKUOppI8d9Ye7tjdhQVCy0izn55tBaB-U7UWdcvSK2i85sauyw3G0Gfads1Rvy5-CAe2paqyYATcDmGjpUNLoxbfv9KH1KmwRTNH6k1v4PyWYYnhbT39WfKMbBjSxVQRdi19cyJrULSWhjxaQfJHeWx5Z8Ev4bSPByBeQBFl2~4vqy0S5RypINsRSa3MZdbiAAyn5tr5slWR6QdoqY3qBQgBJFZppy-3iWkFqqKgSxCPundF8gdDLC5ddizl~KYcYKl42y9SGFHIukH-TZs8~em0~iahzsqWVRks3zRG~tlBcX2U3M2~OJs~C33-NKhyfZT7-XFBREvb8Szmd~p66jDxrwOnKaku-G6DyoQipJqIz4VHmY9-y5T8RrUcJcM-5lVoMpAAAA.i2p/announce.php=http://tracker.mastertracker.i2p/"
 //       , "Galen", "http://5jpwQMI5FT303YwKa5Rd38PYSX04pbIKgTaKQsWbqoWjIfoancFdWCShXHLI5G5ofOb0Xu11vl2VEMyPsg1jUFYSVnu4-VfMe3y4TKTR6DTpetWrnmEK6m2UXh91J5DZJAKlgmO7UdsFlBkQfR2rY853-DfbJtQIFl91tbsmjcA5CGQi4VxMFyIkBzv-pCsuLQiZqOwWasTlnzey8GcDAPG1LDcvfflGV~6F5no9mnuisZPteZKlrv~~TDoXTj74QjByWc4EOYlwqK8sbU9aOvz~s31XzErbPTfwiawiaZ0RUI-IDrKgyvmj0neuFTWgjRGVTH8bz7cBZIc3viy6ioD-eMQOrXaQL0TCWZUelRwHRvgdPiQrxdYQs7ixkajeHzxi-Pq0EMm5Vbh3j3Q9kfUFW3JjFDA-MLB4g6XnjCbM5J1rC0oOBDCIEfhQkszru5cyLjHiZ5yeA0VThgu~c7xKHybv~OMXION7V8pBKOgET7ZgAkw1xgYe3Kkyq5syAAAA.i2p/tr/announce.php=http://galen.i2p/tr/"
        , "crstrack", "http://b4G9sCdtfvccMAXh~SaZrPqVQNyGQbhbYMbw6supq2XGzbjU4NcOmjFI0vxQ8w1L05twmkOvg5QERcX6Mi8NQrWnR0stLExu2LucUXg1aYjnggxIR8TIOGygZVIMV3STKH4UQXD--wz0BUrqaLxPhrm2Eh9Hwc8TdB6Na4ShQUq5Xm8D4elzNUVdpM~RtChEyJWuQvoGAHY3ppX-EJJLkiSr1t77neS4Lc-KofMVmgI9a2tSSpNAagBiNI6Ak9L1T0F9uxeDfEG9bBSQPNMOSUbAoEcNxtt7xOW~cNOAyMyGydwPMnrQ5kIYPY8Pd3XudEko970vE0D6gO19yoBMJpKx6Dh50DGgybLQ9CpRaynh2zPULTHxm8rneOGRcQo8D3mE7FQ92m54~SvfjXjD2TwAVGI~ae~n9HDxt8uxOecAAvjjJ3TD4XM63Q9TmB38RmGNzNLDBQMEmJFpqQU8YeuhnS54IVdUoVQFqui5SfDeLXlSkh4vYoMU66pvBfWbAAAA.i2p/tracker/announce.php=http://crstrack.i2p/tracker/"
-       , "Postman2", "http://lnQ6yoBTxQuQU8EQ1FlF395ITIQF-HGJxUeFvzETLFnoczNjQvKDbtSB7aHhn853zjVXrJBgwlB9sO57KakBDaJ50lUZgVPhjlI19TgJ-CxyHhHSCeKx5JzURdEW-ucdONMynr-b2zwhsx8VQCJwCEkARvt21YkOyQDaB9IdV8aTAmP~PUJQxRwceaTMn96FcVenwdXqleE16fI8CVFOV18jbJKrhTOYpTtcZKV4l1wNYBDwKgwPx5c0kcrRzFyw5~bjuAKO~GJ5dR7BQsL7AwBoQUS4k1lwoYrG1kOIBeDD3XF8BWb6K3GOOoyjc1umYKpur3G~FxBuqtHAsDRICkEbKUqJ9mPYQlTSujhNxiRIW-oLwMtvayCFci99oX8MvazPS7~97x0Gsm-onEK1Td9nBdmq30OqDxpRtXBimbzkLbR1IKObbg9HvrKs3L-kSyGwTUmHG9rSQSoZEvFMA-S0EXO~o4g21q1oikmxPMhkeVwQ22VHB0-LZJfmLr4SAAAA.i2p/announce.php=http://tracker2.postman.i2p/"
+       , "Postman2", "http://tracker2.postman.i2p/announce.php=http://tracker2.postman.i2p/"
     };
     
     /** comma delimited list of name=announceURL=baseURL for the trackers to be displayed */
diff --git a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
index 3ba2f6be633932295243e37c1ea052ee066aa537..da317998a04a63fe1f3f0da622c3e816e9b40ff0 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/TrackerClient.java
@@ -373,7 +373,7 @@ public class TrackerClient extends I2PAppThread
    */
   public static String urlencode(byte[] bs)
   {
-    StringBuffer sb = new StringBuffer(bs.length*3);
+    StringBuilder sb = new StringBuilder(bs.length*3);
     for (int i = 0; i < bs.length; i++)
       {
         int c = bs[i] & 0xFF;
diff --git a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
index 3929fbe1198ddd8c6a62bc088e5bf4bb43836da2..ec5e2b8dbedc31df0a93c1966414a76e7db07405 100644
--- a/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
+++ b/apps/i2psnark/java/src/org/klomp/snark/web/I2PSnarkServlet.java
@@ -398,7 +398,7 @@ public class I2PSnarkServlet extends HttpServlet {
         return rv;
     }
 
-    private static final int MAX_DISPLAYED_FILENAME_LENGTH = 60;
+    private static final int MAX_DISPLAYED_FILENAME_LENGTH = 44;
     private static final int MAX_DISPLAYED_ERROR_LENGTH = 40;
     private void displaySnark(PrintWriter out, Snark snark, String uri, int row, long stats[], boolean showPeers, boolean showDebug) throws IOException {
         String filename = snark.torrent;
@@ -506,7 +506,7 @@ public class I2PSnarkServlet extends HttpServlet {
         // temporarily hardcoded for postman* and anonymity, requires bytemonsoon patch for lookup by info_hash
         String announce = snark.meta.getAnnounce();
         if (announce.startsWith("http://YRgrgTLG") || announce.startsWith("http://8EoJZIKr") ||
-            announce.startsWith("http://lnQ6yoBT")) {
+            announce.startsWith("http://lnQ6yoBT") || announce.startsWith("http://tracker2.postman.i2p/")) {
             Map trackers = _manager.getTrackers();
             for (Iterator iter = trackers.entrySet().iterator(); iter.hasNext(); ) {
                 Map.Entry entry = (Map.Entry)iter.next();
@@ -759,7 +759,7 @@ public class I2PSnarkServlet extends HttpServlet {
                   + _manager.util().getI2CPHost() + "\" size=\"15\" /> ");
         out.write("port: <input type=\"text\" name=\"i2cpPort\" value=\"" +
                   + _manager.util().getI2CPPort() + "\" size=\"5\" maxlength=\"5\" /> <br />\n");
-        StringBuffer opts = new StringBuffer(64);
+        StringBuilder opts = new StringBuilder(64);
         Map options = new TreeMap(_manager.util().getI2CPOptions());
         for (Iterator iter = options.entrySet().iterator(); iter.hasNext(); ) {
             Map.Entry entry = (Map.Entry)iter.next();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
index 79270303b00ec6b8090b1d87aa13e981c6550465..65941f3ba7f4b20d671d75f2c14bc8e7b56884e9 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelConnectClient.java
@@ -179,7 +179,7 @@ public class I2PTunnelConnectClient extends I2PTunnelClientBase implements Runna
             out = s.getOutputStream();
             in = s.getInputStream();
             String line, method = null, host = null, destination = null, restofline = null;
-            StringBuffer newRequest = new StringBuffer();
+            StringBuilder newRequest = new StringBuilder();
             int ahelper = 0;
             while (true) {
                 // Use this rather than BufferedReader because we can't have readahead,
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
index 8dabdc0f61f7ceb65afa366bf5b7742ccb39bda7..f450682cd0731051e06ffa6ed247a34f5e66b82b 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPClient.java
@@ -240,7 +240,7 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
             out = s.getOutputStream();
             InputReader reader = new InputReader(s.getInputStream());
             String line, method = null, protocol = null, host = null, destination = null;
-            StringBuffer newRequest = new StringBuffer();
+            StringBuilder newRequest = new StringBuilder();
             int ahelper = 0;
             while ((line = reader.readLine(method)) != null) {
                 line = line.trim();
@@ -811,11 +811,14 @@ public class I2PTunnelHTTPClient extends I2PTunnelClientBase implements Runnable
      *  but inproxy/gateway ops would be wise to block proxy.i2p to prevent
      *  exposing the docs/ directory or perhaps other issues through
      *  uncaught vulnerabilities.
+     *  Restrict to the /themes/ directory for now.
      *
-     *  @param targetRequest "proxy.i2p/foo.png HTTP/1.1"
+     *  @param targetRequest "proxy.i2p/themes/foo.png HTTP/1.1"
      */
     private static void serveLocalFile(OutputStream out, String method, String targetRequest) {
-        if (method.equals("GET") || method.equals("HEAD")) {
+        if ((method.equals("GET") || method.equals("HEAD")) &&
+            targetRequest.startsWith("proxy.i2p/themes/") &&
+            !targetRequest.contains("..")) {
             int space = targetRequest.indexOf(' ');
             String filename = null;
             try {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
index 2f53f22d036f4244053bd1b8fe87449f8035b8f9..e1ce9084ecb9479dc5590a845f1b5e83f6c131ce 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelHTTPServer.java
@@ -74,7 +74,7 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
 
             InputStream in = socket.getInputStream();
 
-            StringBuffer command = new StringBuffer(128);
+            StringBuilder command = new StringBuilder(128);
             Properties headers = readHeaders(in, command);
             headers.setProperty(HASH_HEADER, socket.getPeerDestination().calculateHash().toBase64());
             headers.setProperty(DEST32_HEADER, Base32.encode(socket.getPeerDestination().calculateHash().getData()) + ".b32.i2p" );
@@ -309,8 +309,8 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
         }
     }
 
-    private String formatHeaders(Properties headers, StringBuffer command) {
-        StringBuffer buf = new StringBuffer(command.length() + headers.size() * 64);
+    private String formatHeaders(Properties headers, StringBuilder command) {
+        StringBuilder buf = new StringBuilder(command.length() + headers.size() * 64);
         buf.append(command.toString().trim()).append("\r\n");
         for (Iterator iter = headers.keySet().iterator(); iter.hasNext(); ) {
             String name = (String)iter.next();
@@ -321,9 +321,9 @@ public class I2PTunnelHTTPServer extends I2PTunnelServer {
         return buf.toString();
     }
     
-    private Properties readHeaders(InputStream in, StringBuffer command) throws IOException {
+    private Properties readHeaders(InputStream in, StringBuilder command) throws IOException {
         Properties headers = new Properties();
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         
         boolean ok = DataHelper.readLine(in, command);
         if (!ok) throw new IOException("EOF reached while reading the HTTP command [" + command.toString() + "]");
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
index 3b5bff785d08377ee6a326e96a4f5d3a0f4c2049..dd8c289d93e828beb547289f2656cbd07a892636 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCClient.java
@@ -82,7 +82,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
         try {
             i2ps = createI2PSocket(dest);
             i2ps.setReadTimeout(readTimeout);
-            StringBuffer expectedPong = new StringBuffer();
+            StringBuilder expectedPong = new StringBuilder();
             Thread in = new I2PThread(new IrcInboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " in");
             in.start();
             Thread out = new I2PThread(new IrcOutboundFilter(s,i2ps, expectedPong), "IRC Client " + __clientId + " out");
@@ -121,9 +121,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
         
         private Socket local;
         private I2PSocket remote;
-        private StringBuffer expectedPong;
+        private StringBuilder expectedPong;
                 
-        IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) {
+        IrcInboundFilter(Socket _local, I2PSocket _remote, StringBuilder pong) {
             local=_local;
             remote=_remote;
             expectedPong=pong;
@@ -195,9 +195,9 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
                     
             private Socket local;
             private I2PSocket remote;
-            private StringBuffer expectedPong;
+            private StringBuilder expectedPong;
                 
-            IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuffer pong) {
+            IrcOutboundFilter(Socket _local, I2PSocket _remote, StringBuilder pong) {
                 local=_local;
                 remote=_remote;
                 expectedPong=pong;
@@ -266,7 +266,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
      *
      */
     
-    public String inboundFilter(String s, StringBuffer expectedPong) {
+    public String inboundFilter(String s, StringBuilder expectedPong) {
         
         String field[]=s.split(" ",4);
         String command;
@@ -353,7 +353,7 @@ public class I2PTunnelIRCClient extends I2PTunnelClientBase implements Runnable
         return null;
     }
     
-    public String outboundFilter(String s, StringBuffer expectedPong) {
+    public String outboundFilter(String s, StringBuilder expectedPong) {
         
         String field[]=s.split(" ",3);
         String command;
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java
index 2e209dbd74cc725bc05546a378b67c2c9a3b5de2..6e042709554b0c108e20605735950800ced09623 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2PTunnelIRCServer.java
@@ -135,7 +135,7 @@ public class I2PTunnelIRCServer extends I2PTunnelServer implements Runnable {
 
     /** keep reading until we see USER or SERVER */
     private String filterRegistration(InputStream in, String newHostname) throws IOException {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         int lineCount = 0;
         
         while (true) {
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java
index f57ecd23d1c630de8dd871573655222926c2eefb..1f358abf0a0a4bdbd0548e41cbbc79d974fe7323 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/I2Ping.java
@@ -211,7 +211,7 @@ public class I2Ping extends I2PTunnelTask implements Runnable {
                 int fail = 0;
                 long totalTime = 0;
                 int cnt = countPing ? CPING_COUNT : PING_COUNT;
-                StringBuffer pingResults = new StringBuffer(2 * cnt + destination.length() + 3);
+                StringBuilder pingResults = new StringBuilder(2 * cnt + destination.length() + 3);
                 for (int i = 0; i < cnt; i++) {
                     boolean sent;
                     sent = ping(dest);
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
index 3dbcfea3067cd106ffb6172146ef2eb754aa230d..6efff96e597ed5c457e5924dc14f909e2ee88b94 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelController.java
@@ -385,7 +385,7 @@ public class TunnelController implements Logging {
     public String getI2CPHost() { return _config.getProperty("i2cpHost"); }
     public String getI2CPPort() { return _config.getProperty("i2cpPort"); }
     public String getClientOptions() {
-        StringBuffer opts = new StringBuffer(64);
+        StringBuilder opts = new StringBuilder(64);
         for (Iterator iter = _config.keySet().iterator(); iter.hasNext(); ) {
             String key = (String)iter.next();
             String val = _config.getProperty(key);
@@ -447,7 +447,7 @@ public class TunnelController implements Logging {
         return true;
     }
     
-    public void getSummary(StringBuffer buf) {
+    public void getSummary(StringBuilder buf) {
         String type = getType();
         if ("httpclient".equals(type))
             getHttpClientSummary(buf);
@@ -461,7 +461,7 @@ public class TunnelController implements Logging {
             buf.append("Unknown type ").append(type);
     }
     
-    private void getHttpClientSummary(StringBuffer buf) {
+    private void getHttpClientSummary(StringBuilder buf) {
         String description = getDescription();
         if ( (description != null) && (description.trim().length() > 0) )
             buf.append("<i>").append(description).append("</i><br />\n");
@@ -482,7 +482,7 @@ public class TunnelController implements Logging {
         getOptionSummary(buf);
     }
     
-    private void getClientSummary(StringBuffer buf) {
+    private void getClientSummary(StringBuilder buf) {
         String description = getDescription();
         if ( (description != null) && (description.trim().length() > 0) )
             buf.append("<i>").append(description).append("</i><br />\n");
@@ -499,7 +499,7 @@ public class TunnelController implements Logging {
         getOptionSummary(buf);
     }
     
-    private void getServerSummary(StringBuffer buf) {
+    private void getServerSummary(StringBuilder buf) {
         String description = getDescription();
         if ( (description != null) && (description.trim().length() > 0) )
             buf.append("<i>").append(description).append("</i><br />\n");
@@ -510,7 +510,7 @@ public class TunnelController implements Logging {
         getOptionSummary(buf);
     }
     
-    private void getHttpServerSummary(StringBuffer buf) {
+    private void getHttpServerSummary(StringBuilder buf) {
         String description = getDescription();
         if ( (description != null) && (description.trim().length() > 0) )
             buf.append("<i>").append(description).append("</i><br />\n");
@@ -522,7 +522,7 @@ public class TunnelController implements Logging {
         getOptionSummary(buf);
     }
     
-    private void getOptionSummary(StringBuffer buf) {
+    private void getOptionSummary(StringBuilder buf) {
         String opts = getClientOptions();
         if ( (opts != null) && (opts.length() > 0) )
             buf.append("Network options: ").append(opts).append("<br />\n");
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
index 88877ff4c4d33581accf4587b80b541a1f68d3c8..b077179e03e3f996d423b3f0af5c63eb3fd26761 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/TunnelControllerGroup.java
@@ -245,7 +245,7 @@ public class TunnelControllerGroup {
             map.putAll(cur);
         }
         
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         for (Iterator iter = map.keySet().iterator(); iter.hasNext(); ) {
             String key = (String)iter.next();
             String val = (String)map.get(key);
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java
index 23ec70c3fd1d19a61a0df0aa5f56b830d800a823..ef88102cf08ed63ac18a9b67c4ca245e5abf219e 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/socks/SOCKS4aServer.java
@@ -123,7 +123,7 @@ public class SOCKS4aServer extends SOCKSServer {
     }
 
     private String readString(DataInputStream in) throws IOException {
-        StringBuffer sb = new StringBuffer(16);
+        StringBuilder sb = new StringBuilder(16);
         char c;
         while ((c = (char) (in.readByte() & 0xff)) != 0)
             sb.append(c);
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
index d606467c529629ab304d8d205372d4c6d9ac8d87..fe1096eeacd37bfd6b36245926305d21a2bf0497 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/EditBean.java
@@ -223,7 +223,7 @@ public class EditBean extends IndexBean {
         if (tun != null) {
             Properties opts = getOptions(tun);
             if (opts == null) return "";
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             int i = 0;
             for (Iterator iter = opts.keySet().iterator(); iter.hasNext(); ) {
                 String key = (String)iter.next();
diff --git a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
index 4c23ced34741bf662e0a9294f9f8ebf2ee30f0af..48bb984b696353152b7f7f293095f88b0316ab95 100644
--- a/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
+++ b/apps/i2ptunnel/java/src/net/i2p/i2ptunnel/web/IndexBean.java
@@ -302,7 +302,7 @@ public class IndexBean {
         if (_group == null)
             return "";
         
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         if (_action != null) {
             try {
                 buf.append(processAction()).append("\n");
@@ -927,11 +927,11 @@ public class IndexBean {
     }
     
     private String getMessages(List msgs) {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         getMessages(msgs, buf);
         return buf.toString();
     }
-    private void getMessages(List msgs, StringBuffer buf) {
+    private void getMessages(List msgs, StringBuilder buf) {
         if (msgs == null) return;
         for (int i = 0; i < msgs.size(); i++) {
             buf.append((String)msgs.get(i)).append("\n");
diff --git a/apps/i2ptunnel/jsp/editClient.jsp b/apps/i2ptunnel/jsp/editClient.jsp
index 4f0a5a3385fb62bf25920a41920113fcbba883a5..26e40afad29f76954e7f493bdbaf4ca921ca7e08 100644
--- a/apps/i2ptunnel/jsp/editClient.jsp
+++ b/apps/i2ptunnel/jsp/editClient.jsp
@@ -18,7 +18,7 @@
     <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
 
     <% if (editBean.allowCSS()) {
-  %><link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
+  %><link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
     <link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" /> 
     <link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
     <% }
@@ -388,7 +388,7 @@
                 <label for="localDestination" accesskey="L">
                     <span class="accessKey">L</span>ocal destination:
                 </label>
-                <textarea rows="1" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
+                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
                 <span class="comment">(if known)</span>
             </div>
 
diff --git a/apps/i2ptunnel/jsp/editServer.jsp b/apps/i2ptunnel/jsp/editServer.jsp
index 3a958fd42ebc8034adb27f60dfef45eeae4b0c2d..2acc75183d1d52c8aa271e7b04035136511b1668 100644
--- a/apps/i2ptunnel/jsp/editServer.jsp
+++ b/apps/i2ptunnel/jsp/editServer.jsp
@@ -18,7 +18,7 @@
     <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
 
     <% if (editBean.allowCSS()) {
-  %><link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
+  %><link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
     <link href="<%=editBean.getTheme()%>default.css" rel="stylesheet" type="text/css" /> 
     <link href="<%=editBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
     <% }
@@ -148,7 +148,7 @@
                 <label for="localDestination" accesskey="L">
                     <span class="accessKey">L</span>ocal destination:
                 </label>
-                <textarea rows="1" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
+                <textarea rows="1" style="height: 3em;" cols="60" readonly="readonly" id="localDestination" title="Read Only: Local Destination (if known)" wrap="off"><%=editBean.getDestinationBase64(curTunnel)%></textarea>               
          <% if (!"".equals(editBean.getDestinationBase64(curTunnel))) { %>    
             <a href="/susidns/addressbook.jsp?book=private&hostname=<%=editBean.getTunnelName(curTunnel)%>&destination=<%=editBean.getDestinationBase64(curTunnel)%>#add">Add to local addressbook</a>    
          <% } %>
@@ -270,7 +270,7 @@
                 <label for="encrypt" accesskey="e">
                     Encryption Key:
                 </label>
-                <textarea rows="1" cols="44" id="portField" name="encryptKey" title="Encrypt Key" wrap="off"><%=editBean.getEncryptKey(curTunnel)%></textarea>               
+                <textarea rows="1" style="height: 3em;" cols="44" id="portField" name="encryptKey" title="Encrypt Key" wrap="off"><%=editBean.getEncryptKey(curTunnel)%></textarea>               
             </div>
             <div id="portField" class="rowItem">
                 <label for="force" accesskey="c">
@@ -299,7 +299,7 @@
                 <label for="accessList" accesskey="s">
                     Access List:
                 </label>
-                <textarea rows="2" cols="60" id="hostField" name="accessList" title="Access List" wrap="off"><%=editBean.getAccessList(curTunnel)%></textarea>               
+                <textarea rows="2" style="height: 4em;" cols="60" id="hostField" name="accessList" title="Access List" wrap="off"><%=editBean.getAccessList(curTunnel)%></textarea>               
                 <span class="comment">(Restrict to these clients only)</span>
             </div>
                  
diff --git a/apps/i2ptunnel/jsp/index.jsp b/apps/i2ptunnel/jsp/index.jsp
index 6c89d5ff426f1a073720db13c37f6d78216e30b4..d14405bdb6ccd05e14adbbaf6b6f6f99e7f76727 100644
--- a/apps/i2ptunnel/jsp/index.jsp
+++ b/apps/i2ptunnel/jsp/index.jsp
@@ -10,7 +10,7 @@
     <meta http-equiv="Content-Type" content="application/xhtml+xml; charset=UTF-8" />
     
     <% if (indexBean.allowCSS()) {
-  %><link href="images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
+  %><link href="/themes/console/images/favicon.ico" type="image/x-icon" rel="shortcut icon" />
     <link href="<%=indexBean.getTheme()%>default.css" rel="stylesheet" type="text/css" /> 
     <link href="<%=indexBean.getTheme()%>i2ptunnel.css" rel="stylesheet" type="text/css" />
     <% }
@@ -76,7 +76,7 @@
       %>
         <div class="nameField rowItem">
             <label>Name:</label>
-            <span class="text"><a href="edit.jsp?tunnel=<%=curClient%>" title="Edit Tunnel Settings for <%=indexBean.getTunnelName(curClient)%>"><%=indexBean.getTunnelName(curClient)%></a></span>
+            <span class="text"><a href="edit.jsp?tunnel=<%=curClient%>" title="Edit Tunnel Settings for <%=indexBean.getTunnelName(curClient)%>"><%=indexBean.getTunnelName(curClient)%> (Edit)</a></span>
         </div>
         <div class="portField rowItem">
             <label>Port:</label>
@@ -192,7 +192,7 @@
       %>
         <div class="nameField rowItem">
             <label>Name:</label>
-            <span class="text"><a href="edit.jsp?tunnel=<%=curServer%>" title="Edit Server Tunnel Settings for <%=indexBean.getTunnelName(curServer)%>"><%=indexBean.getTunnelName(curServer)%></a></span>
+            <span class="text"><a href="edit.jsp?tunnel=<%=curServer%>" title="Edit Server Tunnel Settings for <%=indexBean.getTunnelName(curServer)%>"><%=indexBean.getTunnelName(curServer)%> (Edit)</a></span>
         </div>
         <div class="previewField rowItem">
             <label>Points at:</label>
diff --git a/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java b/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java
index 4c96e49f2b9c92790495d31b511af36e1e77554e..c83756332481175d81906eebd5f989579d08133a 100644
--- a/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java
+++ b/apps/jetty/java/src/org/mortbay/http/I2PRequestLog.java
@@ -88,7 +88,7 @@ public class I2PRequestLog extends NCSARequestLog
             if (_fileOut==null)
                 return;
 
-            StringBuffer buf = new StringBuffer(160);
+            StringBuilder buf = new StringBuilder(160);
             
             String addr = request.getField("X-I2P-DestHash");
             if(addr != null)
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java
index 3ab6354a6362fba67c97d14e470e41dab077264f..5bffa2a2187c55ada62f78c67dc35a209319720b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigAdvancedHelper.java
@@ -10,7 +10,7 @@ public class ConfigAdvancedHelper extends HelperBase {
     public ConfigAdvancedHelper() {}
     
     public String getSettings() {
-        StringBuffer buf = new StringBuffer(4*1024);
+        StringBuilder buf = new StringBuilder(4*1024);
         Set names = _context.router().getConfigSettings();
         TreeSet sortedNames = new TreeSet(names);
         for (Iterator iter = sortedNames.iterator(); iter.hasNext(); ) {
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
index 7acccdc49a0940ae51b5d35f3d97d330985345d5..02b31e884237ab954d36e23a66f22e1d48e61427 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigClientsHelper.java
@@ -13,7 +13,7 @@ public class ConfigClientsHelper extends HelperBase {
     public ConfigClientsHelper() {}
     
     public String getForm1() {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("<table border=\"1\">\n");
         buf.append("<tr><th>Client</th><th>Run at Startup?</th><th>Start Now</th><th>Class and arguments</th></tr>\n");
         
@@ -29,7 +29,7 @@ public class ConfigClientsHelper extends HelperBase {
     }
 
     public String getForm2() {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("<table border=\"1\">\n");
         buf.append("<tr><th>WebApp</th><th>Run at Startup?</th><th>Start Now</th><th>Description</th></tr>\n");
         Properties props = RouterConsoleRunner.webAppProperties();
@@ -46,7 +46,7 @@ public class ConfigClientsHelper extends HelperBase {
         return buf.toString();
     }
 
-    private void renderForm(StringBuffer buf, String index, String name, boolean urlify, boolean enabled, boolean ro, String desc) {
+    private void renderForm(StringBuilder buf, String index, String name, boolean urlify, boolean enabled, boolean ro, String desc) {
         buf.append("<tr><td>");
         if (urlify && enabled) {
             String link = "/";
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
index 635d2e5445d3385f02dd6cc50f27f5bf027d0a47..fa32340a8635ae8b455381ee656d8138be06013f 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigLoggingHelper.java
@@ -29,7 +29,7 @@ public class ConfigLoggingHelper extends HelperBase {
             return (bytes/(1024)) + "k";
     }
     public String getLogLevelTable() {
-        StringBuffer buf = new StringBuffer(32*1024);
+        StringBuilder buf = new StringBuilder(32*1024);
         Properties limits = _context.logManager().getLimits();
         TreeSet sortedLogs = new TreeSet();
         for (Iterator iter = limits.keySet().iterator(); iter.hasNext(); ) {
@@ -51,7 +51,7 @@ public class ConfigLoggingHelper extends HelperBase {
     }
     public String getDefaultLogLevelBox() {
         String cur = _context.logManager().getDefaultLimit();
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("<select name=\"defaultloglevel\">\n");
         
         buf.append("<option value=\"DEBUG\" ");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
index 35f65233bd140fa1bd1819dde31dd8434593567f..bf47f3efa76e6967602b835c2f5862434f528504 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigNetHelper.java
@@ -190,7 +190,7 @@ public class ConfigNetHelper extends HelperBase {
     }
     
     private static String getBurstFactor(int numSeconds, String name) {
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append("<select name=\"").append(name).append("\">\n");
         boolean found = false;
         for (int i = 10; i <= 70; i += 10) {
@@ -220,7 +220,7 @@ public class ConfigNetHelper extends HelperBase {
     
     public String getSharePercentageBox() {
         int pct = (int) (100 * _context.router().getSharePercentage());
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append("<select style=\"text-align: right;\" name=\"sharePercentage\">\n");
         boolean found = false;
         for (int i = 30; i <= 110; i += 10) {
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java
index 7ae7181bc2e4989969213cdc729b186e6b1afff9..c9ab42ddee9e513357237f22217a15d776583dd1 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigRestartBean.java
@@ -71,7 +71,7 @@ public class ConfigRestartBean {
     
     /** @param s value,label,... pairs */
     private static String buttons(String url, String nonce, String s) {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         StringTokenizer tok = new StringTokenizer(s, ",");
         buf.append("<form action=\"").append(url).append("\" method=\"GET\">\n");
         buf.append("<input type=\"hidden\" name=\"consoleNonce\" value=\"").append(nonce).append("\" >\n");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
index 00d2f509d67c3e75459afbc72e8e45f99501ac6a..00a384e73f711f73c44bab35ed00a7ccc52413ee 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigStatsHandler.java
@@ -102,7 +102,7 @@ public class ConfigStatsHandler extends FormHandler {
             }
         }
         
-        StringBuffer stats = new StringBuffer();
+        StringBuilder stats = new StringBuilder();
         for (int i = 0; i < _stats.size(); i++) {
             stats.append((String)_stats.get(i));
             if (i + 1 < _stats.size())
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java
index f1a63e421ae958d03c83574dddadf39a7f52e533..d73b75765802cb92f95e224723f261790d086336 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigTunnelsHelper.java
@@ -13,7 +13,7 @@ public class ConfigTunnelsHelper extends HelperBase {
     
     
     public String getForm() {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("<table border=\"1\">\n");
         TunnelPoolSettings exploratoryIn = _context.tunnelManager().getInboundSettings();
         TunnelPoolSettings exploratoryOut = _context.tunnelManager().getOutboundSettings();
@@ -54,7 +54,7 @@ public class ConfigTunnelsHelper extends HelperBase {
     private static final int MAX_BACKUP_QUANTITY = 3;
     private static final int MAX_VARIANCE = 2;
     private static final int MIN_NEG_VARIANCE = -1;
-    private void renderForm(StringBuffer buf, int index, String prefix, String name, TunnelPoolSettings in, TunnelPoolSettings out) {
+    private void renderForm(StringBuilder buf, int index, String prefix, String name, TunnelPoolSettings in, TunnelPoolSettings out) {
 
         buf.append("<tr><th colspan=\"3\"><a name=\"").append(prefix).append("\">");
         buf.append(name).append("</a></th></tr>\n");
@@ -179,7 +179,7 @@ public class ConfigTunnelsHelper extends HelperBase {
         buf.append("<tr><td colspan=\"3\"><hr /></td></tr>\n");
     }
 
-    private void renderOptions(StringBuffer buf, int min, int max, int now, String prefix, String name) {
+    private void renderOptions(StringBuilder buf, int min, int max, int now, String prefix, String name) {
         for (int i = min; i <= max; i++) {
             buf.append("<option value=\"").append(i).append("\" ");
             if (i == now)
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
index 4aac71dff71fca59478df3411829fd6da64fe785..d67f63bfad4532ff45def426e03ba58876a1d421 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ConfigUpdateHelper.java
@@ -58,7 +58,7 @@ public class ConfigUpdateHelper extends HelperBase {
             ms = Long.parseLong(freq);
         } catch (NumberFormatException nfe) {}
 
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append("<select name=\"refreshFrequency\">");
         for (int i = 0; i < PERIODS.length; i++) {
             buf.append("<option value=\"").append(PERIODS[i]);
@@ -77,7 +77,7 @@ public class ConfigUpdateHelper extends HelperBase {
     public String getUpdatePolicySelectBox() {
         String policy = _context.getProperty(ConfigUpdateHandler.PROP_UPDATE_POLICY, ConfigUpdateHandler.DEFAULT_UPDATE_POLICY);
         
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append("<select name=\"updatePolicy\">");
         
         if ("notify".equals(policy))
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
index 721655a512085fe5f682db95af760d027965b6c4..795eeb26c3c9f12d9dbba810709d140c93cba76d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ContentHelper.java
@@ -45,7 +45,7 @@ public class ContentHelper extends HelperBase {
         if (str == null) 
             return "";
         else {
-            StringBuffer sb = new StringBuffer(str.length()+11);
+            StringBuilder sb = new StringBuilder(str.length()+11);
             sb.append("<pre>");
             for (int i=0; i < str.length(); i++) {
                 char c = str.charAt(i);
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java
index e8f5e4d4231a4d9825dc780db33f24b4baca77f0..0aba83517e9e7484f3ee105101a37f32a9f2035e 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/FormHandler.java
@@ -87,7 +87,7 @@ public class FormHandler {
         process();
         if (_errors.size() <= 0 && _notices.size() <= 0)
             return "";
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("<div class=\"messages\" id=\"messages\"><p>");
         if (_errors.size() > 0) {
             buf.append("<span class=\"error\">");
@@ -178,7 +178,7 @@ public class FormHandler {
         if (source.size() <= 0) {
             return "";
         } else {
-            StringBuffer buf = new StringBuffer(512);
+            StringBuilder buf = new StringBuilder(512);
             buf.append("<ul>\n");
             for (int i = 0; i < source.size(); i++) {
                 buf.append("<li>");
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
index e7fb539ecd8a0622b540d291fe9055d25a48f074..bad1edef45a5eaa279a4f3645beb5060f02029ca 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/LogsHelper.java
@@ -46,7 +46,7 @@ public class LogsHelper extends HelperBase {
 
     private String formatMessages(List msgs) {
         boolean colorize = Boolean.valueOf(_context.getProperty("routerconsole.logs.color")).booleanValue();
-        StringBuffer buf = new StringBuffer(16*1024); 
+        StringBuilder buf = new StringBuilder(16*1024); 
         buf.append("<ul>");
         buf.append("<code>\n");
         for (int i = msgs.size(); i > 0; i--) { 
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NavHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/NavHelper.java
index 2d50379f3402dac022d290471573521a11d2e79a..1ae3029326abbee92c067fac548d36075a819cd2 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NavHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NavHelper.java
@@ -27,7 +27,7 @@ public class NavHelper extends HelperBase {
     }
     
     public String getClientAppLinks() {
-        StringBuffer buf = new StringBuffer(1024); 
+        StringBuilder buf = new StringBuilder(1024); 
         for (Iterator iter = _apps.keySet().iterator(); iter.hasNext(); ) {
             String name = (String)iter.next();
             String path = (String)_apps.get(name);
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
index 33178caf6d1c2a227a9873496cefae85383abce1..0a83f65ac7a53740490d5d01bbfc68ad9248eb34 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/NewsFetcher.java
@@ -144,7 +144,7 @@ public class NewsFetcher implements Runnable, EepGet.StatusListener {
         FileInputStream in = null;
         try {
             in = new FileInputStream(_newsFile);
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             while (DataHelper.readLine(in, buf)) {
                 int index = buf.indexOf(VERSION_PREFIX);
                 if (index == -1) {
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/ServiceManager.java b/apps/routerconsole/java/src/net/i2p/router/web/ServiceManager.java
index 493bf453fc66ea61e6433e83edd019f63ac3a801..55f104f027eee15a0696820523b4a49acd66c98d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/ServiceManager.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/ServiceManager.java
@@ -50,7 +50,7 @@ public class ServiceManager {
 
 //        InputStream  StdoutStream = _shellCommand.getInputStream();
 //        InputStream  StderrStream = _shellCommand.getErrorStream();
-        StringBuffer result       = null;
+        StringBuilder result       = null;
 
         if (_shellCommand.executeAndWait(command))
             return null;
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
index 331f42d890a2c06e2b2c95e61ddeb6494b61b3b2..15a9bf9b5c03d7dfb543f5314804653256aebcd5 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/StatSummarizer.java
@@ -87,7 +87,7 @@ public class StatSummarizer implements Runnable {
                 removeDb(r);
         }
         // add new ones
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         for (int i = 0; i < newSpecs.size(); i++) {
             Rate r = (Rate)newSpecs.get(i);
             if (!old.contains(r))
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
index bca3245482e5e2397cbf10a026e7273f60cbe1ac..f5bdd734295b9200109d9d17023b09625efefabd 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/SummaryHelper.java
@@ -344,7 +344,7 @@ public class SummaryHelper extends HelperBase {
         List clients = new ArrayList(_context.clientManager().listClients());
         Collections.sort(clients, new AlphaComparator());
         
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("<u><b>Local destinations</b></u><br />");
         
         for (Iterator iter = clients.iterator(); iter.hasNext(); ) {
diff --git a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
index 1bcdc6ffbaad287ce20813839856a8822e06970b..257e93f1245e91e6dc237d1f8f2227e31379600b 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/UpdateHandler.java
@@ -156,7 +156,7 @@ public class UpdateHandler {
             // ignored
         }
         public void bytesTransferred(long alreadyTransferred, int currentWrite, long bytesTransferred, long bytesRemaining, String url) {
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("<b>Updating</b> ");
             double pct = ((double)alreadyTransferred + (double)currentWrite) /
                          ((double)alreadyTransferred + (double)currentWrite + (double)bytesRemaining);
diff --git a/apps/routerconsole/jsp/configkeyring.jsp b/apps/routerconsole/jsp/configkeyring.jsp
index 1aa40408b2436ef47c01788681f7477f87859b68..65c0638f401827f5db6e93b00e8ec28fbc5b5688 100644
--- a/apps/routerconsole/jsp/configkeyring.jsp
+++ b/apps/routerconsole/jsp/configkeyring.jsp
@@ -43,7 +43,7 @@
  <p>
  <table>
  <tr><td>Dest. name, hash, or full key:
- <td><textarea name="peer" cols="44" rows="1" wrap="off"></textarea>
+ <td><textarea name="peer" cols="44" rows="1" style="height: 3em;" wrap="off"></textarea>
  <tr><td align="right">Session Key:
  <td><input type="text" size="55" name="key" />
  <tr><td><td><input type="submit" name="action" value="Add key" />
diff --git a/apps/sam/java/src/net/i2p/sam/SAMUtils.java b/apps/sam/java/src/net/i2p/sam/SAMUtils.java
index 61578e333fb82d022992be794c9785e02a1acd8f..859154c4f8eeac606ba1658e50670f17dc39c151 100644
--- a/apps/sam/java/src/net/i2p/sam/SAMUtils.java
+++ b/apps/sam/java/src/net/i2p/sam/SAMUtils.java
@@ -155,7 +155,7 @@ public class SAMUtils {
         String token, param;
         Properties props = new Properties();
         
-        StringBuffer value = new StringBuffer();
+        StringBuilder value = new StringBuilder();
         for (int i = 0; i < ntoks; ++i) {
             token = tok.nextToken();
 
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
index e6d99c473137b7a3f87d3807979cf71f92ab67a6..94ec5532c1fbb12977b7c64e9d94d6b98ac4c746 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/Connection.java
@@ -899,7 +899,7 @@ public class Connection {
                     if (_log.shouldLog(Log.WARN))
                         _log.warn("Closing connection due to inactivity");
                     if (_log.shouldLog(Log.DEBUG)) {
-                        StringBuffer buf = new StringBuffer(128);
+                        StringBuilder buf = new StringBuilder(128);
                         buf.append("last sent was: ").append(_context.clock().now() - _lastSendTime);
                         buf.append("ms ago, last received was: ").append(_context.clock().now()-_lastReceivedOn);
                         buf.append("ms ago, inactivity timeout is: ").append(_options.getInactivityTimeout());
@@ -934,7 +934,7 @@ public class Connection {
     
 	@Override
     public String toString() { 
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[Connection ");
         if (_receiveStreamId > 0)
             buf.append(Packet.toId(_receiveStreamId));
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
index 740fdcf8297380102e3d822c181ccd98df90ae68..c7084b4e72d29c79eb41410ad6d55b4572cfec39 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/ConnectionOptions.java
@@ -475,7 +475,7 @@ public class ConnectionOptions extends I2PSocketOptionsImpl {
     
 	@Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("conDelay=").append(_connectDelay);
         buf.append(" maxSize=").append(_maxMessageSize);
         buf.append(" rtt=").append(_rtt);
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
index 7b87e55836be77ad93c7c8f079cc9f3edd0df018..ad4795c07918126abef625f181895d30f6620664 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageInputStream.java
@@ -174,7 +174,7 @@ public class MessageInputStream extends InputStream {
     public void closeReceived() {
         synchronized (_dataLock) {
             if (_log.shouldLog(Log.DEBUG)) {
-                StringBuffer buf = new StringBuffer(128);
+                StringBuilder buf = new StringBuilder(128);
                 buf.append("Close received, ready bytes: ");
                 long available = 0;
                 for (int i = 0; i < _readyDataBlocks.size(); i++) 
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/Packet.java b/apps/streaming/java/src/net/i2p/client/streaming/Packet.java
index 8fc0f02fa22688c62e6d493cb3bf3af22af1a15b..2a6ae59ad1b4dcf6dc2224b94a450f5b7290a270 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/Packet.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/Packet.java
@@ -598,12 +598,12 @@ public class Packet {
     
 	@Override
     public String toString() {
-        StringBuffer str = formatAsString();
+        StringBuilder str = formatAsString();
         return str.toString();
     }
     
-    protected StringBuffer formatAsString() {
-        StringBuffer buf = new StringBuffer(64);
+    protected StringBuilder formatAsString() {
+        StringBuilder buf = new StringBuilder(64);
         buf.append(toId(_sendStreamId));
         //buf.append("<-->");
         buf.append(toId(_receiveStreamId)).append(": #").append(_sequenceNum);
@@ -629,7 +629,7 @@ public class Packet {
     }
     
     private final String toFlagString() {
-        StringBuffer buf = new StringBuffer(32);
+        StringBuilder buf = new StringBuilder(32);
         if (isFlagSet(FLAG_CLOSE)) buf.append(" CLOSE");
         if (isFlagSet(FLAG_DELAY_REQUESTED)) buf.append(" DELAY ").append(_optionDelay);
         if (isFlagSet(FLAG_ECHO)) buf.append(" ECHO");
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java
index ff43293a0e0fad57ceac0cec811cc39881e4fca4..bbb5a9536aeb02b8a5dc50532a8d11a4283ccc03 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/PacketHandler.java
@@ -112,7 +112,7 @@ public class PacketHandler {
     private static final SimpleDateFormat _fmt = new SimpleDateFormat("HH:mm:ss.SSS");
     void displayPacket(Packet packet, String prefix, String suffix) {
         if (!_log.shouldLog(Log.INFO)) return;
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         synchronized (_fmt) {
             buf.append(_fmt.format(new Date()));
         }
@@ -198,7 +198,7 @@ public class PacketHandler {
                         // someone is sending us a packet on the wrong stream 
                         if (_log.shouldLog(Log.ERROR)) {
                             Set cons = _manager.listConnections();
-                            StringBuffer buf = new StringBuffer(512);
+                            StringBuilder buf = new StringBuilder(512);
                             buf.append("Received a packet on the wrong stream: ");
                             buf.append(packet);
                             buf.append(" connection: ");
@@ -275,7 +275,7 @@ public class PacketHandler {
                     _log.warn("Packet belongs to no other cons, putting on the syn queue: " + packet);
                 }
                 if (_log.shouldLog(Log.DEBUG)) {
-                    StringBuffer buf = new StringBuffer(128);
+                    StringBuilder buf = new StringBuilder(128);
                     Set cons = _manager.listConnections();
                     for (Iterator iter = cons.iterator(); iter.hasNext(); ) {
                         Connection con = (Connection)iter.next();
diff --git a/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java b/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java
index 827be5b04fb6e035629c582a533716eae2eea625..9ed29b50fb21aca3d865fd281838246ef0926364 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/PacketLocal.java
@@ -133,8 +133,8 @@ public class PacketLocal extends Packet implements MessageOutputStream.WriteStat
     public void setResendPacketEvent(SimpleTimer2.TimedEvent evt) { _resendEvent = evt; }
     
 	@Override
-    public StringBuffer formatAsString() {
-        StringBuffer buf = super.formatAsString();
+    public StringBuilder formatAsString() {
+        StringBuilder buf = super.formatAsString();
         
         Connection con = _connection;
         if (con != null)
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
index 8cddafdc42c624e030b16e4916c0eb3d5def1a7d..7dad7a25006a68ee7d42af425825d8a7aa2d4bd6 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/ConfigBean.java
@@ -83,7 +83,7 @@ public class ConfigBean implements Serializable {
 	{
 		File file = new File( configFileName );
 		if( file != null && file.isFile() ) {
-			StringBuffer buf = new StringBuffer();
+			StringBuilder buf = new StringBuilder();
 			BufferedReader br = null;
 			try {
 				br = new BufferedReader( new FileReader( file ) );
diff --git a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
index 9d16701f90dd4247e32be0a7d398fcac578b7ecd..56a42208b31345063f4810194e8e25cfd47ef565 100644
--- a/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
+++ b/apps/susidns/src/java/src/i2p/susi/dns/SubscriptionsBean.java
@@ -86,7 +86,7 @@ public class SubscriptionsBean
 	{
 		File file = new File( getFileName() );
 		if( file != null && file.isFile() ) {
-			StringBuffer buf = new StringBuffer();
+			StringBuilder buf = new StringBuilder();
 			BufferedReader br = null;
 			try {
 				br = new BufferedReader( new FileReader( file ) );
diff --git a/apps/susidns/src/jsp/addressbook.jsp b/apps/susidns/src/jsp/addressbook.jsp
index d3cf0c3b4f140ddc4f63ed7766bf3ab9845c52db..cb3eb32c5dd1a46d31454b992eacf6f737620c69 100644
--- a/apps/susidns/src/jsp/addressbook.jsp
+++ b/apps/susidns/src/jsp/addressbook.jsp
@@ -143,7 +143,7 @@
 <td class="names"><a href="http://${addr.name}/">${addr.name}</a> -
 <span class="addrhlpr"><a href="http://${addr.name}/?i2paddresshelper=${addr.destination}">(addrhlpr)</a></span>
 </td>
-<td class="destinations"><textarea rows="1" cols="40" wrap="off" readonly="readonly" name="dest_${addr.name}" >${addr.destination}</textarea></td>
+<td class="destinations"><textarea rows="1" style="height: 3em;" cols="40" wrap="off" readonly="readonly" name="dest_${addr.name}" >${addr.destination}</textarea></td>
 </tr>
 </c:forEach>
 </table>
@@ -168,7 +168,7 @@
 <p class="add">
 <h3>Add new destination:</h3>
 <b>Hostname:</b> <input type="text" name="hostname" value="${book.hostname}" size="20">
-<b>Destination:</b> <textarea name="destination" rows="1" cols="40" wrap="off" >${book.destination}</textarea><br/>
+<b>Destination:</b> <textarea name="destination" rows="1" style="height: 3em;" cols="40" wrap="off" >${book.destination}</textarea><br/>
 </p><p>
 <input type="image" name="action" value="add" src="images/add.png" alt="Add destination" />
 </p>
diff --git a/apps/susimail/src/src/i2p/susi/webmail/Mail.java b/apps/susimail/src/src/i2p/susi/webmail/Mail.java
index a60f9b93c59620731bc46e3cc282fce69ce3e324..80f6d67bffffb5d954f62a0cb163638a4eed1c81 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/Mail.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/Mail.java
@@ -142,7 +142,7 @@ public class Mail {
 		}
 		return ok;
 	}
-	public static void appendRecipients( StringBuffer buf, ArrayList recipients, String prefix )
+	public static void appendRecipients( StringBuilder buf, ArrayList recipients, String prefix )
 	{
 		for( Iterator it = recipients.iterator(); it.hasNext(); ) {
 			buf.append( prefix );
diff --git a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
index 6e9fad1c5ed4f9cd63b0cd2b825e17432fc807f6..8d3086c746eb23f0f89c345d88fa1e7f0bce1242 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/WebMail.java
@@ -444,7 +444,7 @@ public class WebMail extends HttpServlet
 			boolean showBody = false;
 			boolean prepareAttachment = false;
 			String reason = "";
-			StringBuffer body = null;
+			StringBuilder body = null;
 			
 			String ident = quoteHTML(
 					( mailPart.description != null ? mailPart.description + ", " : "" ) +
@@ -485,7 +485,7 @@ public class WebMail extends HttpServlet
 					try {
 						ReadBuffer decoded = e.decode( mailPart.buffer.content, mailPart.beginBody, mailPart.end - mailPart.beginBody );
 						BufferedReader reader = new BufferedReader( new InputStreamReader( new ByteArrayInputStream( decoded.content, decoded.offset, decoded.length ), charset ) );
-						body = new StringBuffer();
+						body = new StringBuilder();
 						String line;
 						while( ( line = reader.readLine() ) != null ) {
 							body.append( quoteHTML( line ) );
@@ -782,7 +782,7 @@ public class WebMail extends HttpServlet
 							/*
 							 * extract additional recipients
 							 */
-							StringBuffer buf = new StringBuffer();
+							StringBuilder buf = new StringBuilder();
 							String pad = "";
 							if( mail.to != null ) {
 								for( int i = 0; i < mail.to.length; i++ ) {
@@ -1429,7 +1429,7 @@ public class WebMail extends HttpServlet
 		}
 
 		if( ok ) {
-			StringBuffer body = new StringBuffer();
+			StringBuilder body = new StringBuilder();
 			body.append( "From: " + from + "\r\n" );
 			Mail.appendRecipients( body, toList, "To: " );
 			Mail.appendRecipients( body, ccList, "To: " );
diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java
index f9d47152b0e53c908ae30462a950b149542f81f3..b6c8ffaf5a93082b333451122921f0c80450dfc0 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/Base64.java
@@ -70,7 +70,7 @@ public class Base64 implements Encoding {
 	 */
 	private String encode( InputStream in ) throws IOException, EncodingException
 	{
-		StringBuffer strBuf = new StringBuffer();
+		StringBuilder strBuf = new StringBuilder();
 		
 		int buf[] = new int[3];
 		int out[] = new int[4];
diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java
index 9eca318fb275fa8677147e7d5e408f0204362b56..96dab529520a2d5870ef862191235166eff70c72 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/HeaderLine.java
@@ -55,7 +55,7 @@ public class HeaderLine implements Encoding {
 	private static final int BUFSIZE = 2;
 	private String encode(InputStream in) throws IOException
 	{
-		StringBuffer out = new StringBuffer();
+		StringBuilder out = new StringBuilder();
 		int l = 0, buffered = 0, tmp[] = new int[BUFSIZE];
 		boolean quoting = false;
 		boolean quote = false;
diff --git a/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java b/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java
index f42d3ecea376a142e8cd44f9ac501d796125ed8d..5a98c6a05b4dc6286379a42dfbb3c58c5e620cb7 100644
--- a/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java
+++ b/apps/susimail/src/src/i2p/susi/webmail/encoding/QuotedPrintable.java
@@ -69,7 +69,7 @@ public class QuotedPrintable implements Encoding {
 	 */
 	private static int BUFSIZE = 2;
 	private String encode( InputStream in ) throws EncodingException, IOException {
-		StringBuffer out = new StringBuffer();
+		StringBuilder out = new StringBuilder();
 		int l = 0;
 		int read = 0, buffered = 0, tmp[] = new int[BUFSIZE];
 		while( true ) {
diff --git a/core/java/src/com/nettgryppa/security/HashCash.java b/core/java/src/com/nettgryppa/security/HashCash.java
index 7d4e16e92736aff15022d4e3e3fd171c0750e414..6cee4c935e2d7ce6ce6d033fa722bdf6e1c8370f 100644
--- a/core/java/src/com/nettgryppa/security/HashCash.java
+++ b/core/java/src/com/nettgryppa/security/HashCash.java
@@ -323,7 +323,7 @@ private static long bytesToLong(byte[] b) {
     if(null == extensions || extensions.isEmpty())
       return "";
       
-    StringBuffer result = new StringBuffer();
+    StringBuilder result = new StringBuilder();
     List<String> tempList;
     boolean first = true;
     
diff --git a/core/java/src/freenet/support/CPUInformation/CPUID.java b/core/java/src/freenet/support/CPUInformation/CPUID.java
index e145c3795f5451462439cccbc60dc6df8027f5d4..378791ccf6edfa1d7a79339e76ad13cfe195460f 100644
--- a/core/java/src/freenet/support/CPUInformation/CPUID.java
+++ b/core/java/src/freenet/support/CPUInformation/CPUID.java
@@ -74,7 +74,7 @@ public class CPUID {
     private static String getCPUVendorID()
     {
         CPUIDResult c = doCPUID(0);
-        StringBuffer sb= new StringBuffer(13);
+        StringBuilder sb= new StringBuilder(13);
         sb.append((char)( c.EBX        & 0xFF));
         sb.append((char)((c.EBX >> 8)  & 0xFF));
         sb.append((char)((c.EBX >> 16) & 0xFF));
diff --git a/core/java/src/net/i2p/client/naming/PetName.java b/core/java/src/net/i2p/client/naming/PetName.java
index 128fb9811da05b53bb9270535ce0370050ba7cd6..38d27b60837c893e9acbb3822457dca992b59435 100644
--- a/core/java/src/net/i2p/client/naming/PetName.java
+++ b/core/java/src/net/i2p/client/naming/PetName.java
@@ -124,7 +124,7 @@ public class PetName {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         if (_name != null) buf.append(_name.trim());
         buf.append(':');
         if (_network != null) buf.append(_network.trim());
diff --git a/core/java/src/net/i2p/crypto/ElGamalEngine.java b/core/java/src/net/i2p/crypto/ElGamalEngine.java
index 8733e26cf388f1d930fc0cb067ad5577a1ca3cc3..ae82613c703d58d916761d13c429973ca9f7a4ff 100644
--- a/core/java/src/net/i2p/crypto/ElGamalEngine.java
+++ b/core/java/src/net/i2p/crypto/ElGamalEngine.java
@@ -130,7 +130,7 @@ public class ElGamalEngine {
         System.arraycopy(dbytes, 0, out, (dbytes.length < 257 ? 514 - dbytes.length : 257),
                          (dbytes.length > 257 ? 257 : dbytes.length));
         /*
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("Timing\n");
         buf.append("0-1: ").append(t1 - t0).append('\n');
         buf.append("1-2: ").append(t2 - t1).append('\n');
diff --git a/core/java/src/net/i2p/crypto/SHA1Test.java b/core/java/src/net/i2p/crypto/SHA1Test.java
index de1bf1b8190d0e2cee90a9edf4e464bb3a40d278..2c532c5cdee1742581fc544caf0869d27eebe31c 100644
--- a/core/java/src/net/i2p/crypto/SHA1Test.java
+++ b/core/java/src/net/i2p/crypto/SHA1Test.java
@@ -179,7 +179,7 @@ public class SHA1Test {
     }
  
     private static final String toHex(final byte[] bytes) {
-        StringBuffer buf = new StringBuffer(bytes.length * 2);
+        StringBuilder buf = new StringBuilder(bytes.length * 2);
         for (int i = 0; i < bytes.length; i++) {
             if ((i & 3) == 0 && i != 0)
                buf.append(' ');
diff --git a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
index 9bda56119f28cd0907e8bc198d1519c9d712c384..f9661240b9414a04b1442b10b2d3782a5d35a7e3 100644
--- a/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
+++ b/core/java/src/net/i2p/crypto/TransientSessionKeyManager.java
@@ -452,12 +452,12 @@ public class TransientSessionKeyManager extends SessionKeyManager {
         int removed = 0;
         int remaining = 0;
         long now = _context.clock().now();
-        StringBuffer buf = null;
-        StringBuffer bufSummary = null;
+        StringBuilder buf = null;
+        StringBuilder bufSummary = null;
         if (_log.shouldLog(Log.DEBUG)) {
-            buf = new StringBuffer(128);
+            buf = new StringBuilder(128);
             buf.append("Expiring inbound: ");
-            bufSummary = new StringBuffer(1024);
+            bufSummary = new StringBuilder(1024);
         }
         synchronized (_inboundTagSets) {
             for (Iterator<SessionTag> iter = _inboundTagSets.keySet().iterator(); iter.hasNext();) {
@@ -500,7 +500,7 @@ public class TransientSessionKeyManager extends SessionKeyManager {
     }
 
     public String renderStatusHTML() {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("<h2>Inbound sessions</h2>");
         buf.append("<table border=\"1\">");
         Set<TagSet> inbound = getInboundTagSets();
diff --git a/core/java/src/net/i2p/crypto/TrustedUpdate.java b/core/java/src/net/i2p/crypto/TrustedUpdate.java
index 469809beb98d37fd4f0797aead2acb44f87b5e14..1024421567bf78f432989d3c2e456ca327b04960 100644
--- a/core/java/src/net/i2p/crypto/TrustedUpdate.java
+++ b/core/java/src/net/i2p/crypto/TrustedUpdate.java
@@ -255,16 +255,16 @@ D8usM7Dxp5yrDrCYZ5AIijc=
     }
 
     private static final String sanitize(String versionString) {
-        StringBuffer versionStringBuffer = new StringBuffer(versionString);
+        StringBuilder versionStringBuilder = new StringBuilder(versionString);
 
-        for (int i = 0; i < versionStringBuffer.length(); i++) {
-            if (VALID_VERSION_CHARS.indexOf(versionStringBuffer.charAt(i)) == -1) {
-                versionStringBuffer.deleteCharAt(i);
+        for (int i = 0; i < versionStringBuilder.length(); i++) {
+            if (VALID_VERSION_CHARS.indexOf(versionStringBuilder.charAt(i)) == -1) {
+                versionStringBuilder.deleteCharAt(i);
                 i--;
             }
         }
 
-        return versionStringBuffer.toString();
+        return versionStringBuilder.toString();
     }
 
     private static final void showUsageCLI() {
@@ -328,7 +328,7 @@ D8usM7Dxp5yrDrCYZ5AIijc=
      * delimited by CR LF line breaks.
      */
     public String getTrustedKeysString() {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         for (int i = 0; i < _trustedKeys.size(); i++) {
             // If something already buffered, first add line break.
             if (buf.length() > 0) buf.append("\r\n");
diff --git a/core/java/src/net/i2p/data/Address.java b/core/java/src/net/i2p/data/Address.java
index 205c448ff0de60df1db8a676c6a01f927a752b3a..3a69a232f3d0c42ad8d7424f56e5e01fa958ab5f 100644
--- a/core/java/src/net/i2p/data/Address.java
+++ b/core/java/src/net/i2p/data/Address.java
@@ -73,7 +73,7 @@ public class Address extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[Address: ");
         buf.append("\n\tHostname: ").append(getHostname());
         buf.append("\n\tDestination: ").append(getDestination());
diff --git a/core/java/src/net/i2p/data/Base32.java b/core/java/src/net/i2p/data/Base32.java
index b2cc2d548306d42693e852fb8cb1ac518075067b..adb7e9196c0f014d28290764ef98b9736581d22d 100644
--- a/core/java/src/net/i2p/data/Base32.java
+++ b/core/java/src/net/i2p/data/Base32.java
@@ -137,7 +137,7 @@ public class Base32 {
     }
 
     public static String encode(byte[] source) {
-        StringBuffer buf = new StringBuffer((source.length + 7) * 8 / 5);
+        StringBuilder buf = new StringBuilder((source.length + 7) * 8 / 5);
         encodeBytes(source, buf);
         return buf.toString();
     }
@@ -149,7 +149,7 @@ public class Base32 {
      *
      * @param source The data to convert
      */
-    private static void encodeBytes(byte[] source, StringBuffer out) {
+    private static void encodeBytes(byte[] source, StringBuilder out) {
         int usedbits = 0;
         for (int i = 0; i < source.length; ) {
              int fivebits;
diff --git a/core/java/src/net/i2p/data/Base64.java b/core/java/src/net/i2p/data/Base64.java
index 58ec48d24744aef6acffceb5241bf5dcd8134a02..2b9fe85e6f6c6ed16416368eb24cd3bf6cc0c06a 100644
--- a/core/java/src/net/i2p/data/Base64.java
+++ b/core/java/src/net/i2p/data/Base64.java
@@ -330,7 +330,7 @@ public class Base64 {
         } // end switch
     } // end encode3to4
 
-    private static void encode3to4(byte[] source, int srcOffset, int numSigBytes, StringBuffer buf, byte alpha[]) {
+    private static void encode3to4(byte[] source, int srcOffset, int numSigBytes, StringBuilder buf, byte alpha[]) {
         //           1         2         3  
         // 01234567890123456789012345678901 Bit position
         // --------000000001111111122222222 Array position from threeBytes
@@ -394,7 +394,7 @@ public class Base64 {
     private static String safeEncode(byte[] source, int off, int len, boolean useStandardAlphabet) {
         if (len + off > source.length)
             throw new ArrayIndexOutOfBoundsException("Trying to encode too much!  source.len=" + source.length + " off=" + off + " len=" + len);
-        StringBuffer buf = new StringBuffer(len * 4 / 3);
+        StringBuilder buf = new StringBuilder(len * 4 / 3);
         if (useStandardAlphabet)
             encodeBytes(source, off, len, false, buf, ALPHABET);
         else
@@ -446,7 +446,7 @@ public class Base64 {
 ******/
 
     private static String encodeBytes(byte[] source, int off, int len, boolean breakLines) {
-        StringBuffer buf = new StringBuffer( (len*4)/3 );
+        StringBuilder buf = new StringBuilder( (len*4)/3 );
         encodeBytes(source, off, len, breakLines, buf, ALPHABET);
         return buf.toString();
     }
@@ -460,7 +460,7 @@ public class Base64 {
      * @param breakLines Break lines at 80 characters or less.
      * @since 1.4
      */
-    private static void encodeBytes(byte[] source, int off, int len, boolean breakLines, StringBuffer out, byte alpha[]) {
+    private static void encodeBytes(byte[] source, int off, int len, boolean breakLines, StringBuilder out, byte alpha[]) {
         //int len43 = len * 4 / 3;
         //byte[] outBuff = new byte[(len43) // Main 4:3
         //                          + ((len % 3) > 0 ? 4 : 0) // Account for padding
diff --git a/core/java/src/net/i2p/data/Certificate.java b/core/java/src/net/i2p/data/Certificate.java
index 0d89fcdd886b0aedb6e49155785e8bdce098b8f3..9dcc431e520c1caf5403165f4e3cdc10aad3cd23 100644
--- a/core/java/src/net/i2p/data/Certificate.java
+++ b/core/java/src/net/i2p/data/Certificate.java
@@ -149,7 +149,7 @@ public class Certificate extends DataStructureImpl {
     }
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[Certificate: type: ");
         if (getCertificateType() == CERTIFICATE_TYPE_NULL)
             buf.append("Null certificate");
diff --git a/core/java/src/net/i2p/data/DataHelper.java b/core/java/src/net/i2p/data/DataHelper.java
index 53e32a347e85d42c584e7bd822e87524fd17e64f..b3806d1b9f873312538bd313f06226fd3d4fb459 100644
--- a/core/java/src/net/i2p/data/DataHelper.java
+++ b/core/java/src/net/i2p/data/DataHelper.java
@@ -196,7 +196,7 @@ public class DataHelper {
      *
      */
     public static String toString(Properties options) {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         if (options != null) {
             for (Iterator iter = options.keySet().iterator(); iter.hasNext();) {
                 String key = (String) iter.next();
@@ -273,7 +273,7 @@ public class DataHelper {
      *
      */
     public static String toString(Collection col) {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         if (col != null) {
             for (Iterator iter = col.iterator(); iter.hasNext();) {
                 Object o = iter.next();
@@ -296,17 +296,17 @@ public class DataHelper {
     
     public static String toString(byte buf[], int len) {
         if (buf == null) buf = EMPTY_BUFFER;
-        StringBuffer out = new StringBuffer();
+        StringBuilder out = new StringBuilder();
         if (len > buf.length) {
             for (int i = 0; i < len - buf.length; i++)
                 out.append("00");
         }
         for (int i = 0; i < buf.length && i < len; i++) {
-            StringBuffer temp = new StringBuffer(Integer.toHexString(buf[i]));
+            StringBuilder temp = new StringBuilder(Integer.toHexString(buf[i]));
             while (temp.length() < 2) {
                 temp.insert(0, '0');
             }
-            temp = new StringBuffer(temp.substring(temp.length() - 2));
+            temp = new StringBuilder(temp.substring(temp.length() - 2));
             out.append(temp.toString());
         }
         return out.toString();
@@ -775,19 +775,27 @@ public class DataHelper {
     /**
      * Read a newline delimited line from the stream, returning the line (without
      * the newline), or null if EOF reached before the newline was found
+     * Warning - strips \n but not \r
      */
     public static String readLine(InputStream in) throws IOException { return readLine(in, (Sha256Standalone)null); }
-    /** update the hash along the way */
+
+    /**
+     * update the hash along the way
+     * Warning - strips \n but not \r
+     */
     public static String readLine(InputStream in, Sha256Standalone hash) throws IOException {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         boolean ok = readLine(in, buf, hash);
         if (ok)
             return buf.toString();
         else
             return null;
     }
+
     /**
      * Read in a line, placing it into the buffer (excluding the newline).
+     * Warning - strips \n but not \r
+     * @deprecated use StringBuilder version
      *
      * @return true if the line was read, false if eof was reached before a 
      *              newline was found
@@ -795,7 +803,12 @@ public class DataHelper {
     public static boolean readLine(InputStream in, StringBuffer buf) throws IOException {
         return readLine(in, buf, null);
     }
-    /** update the hash along the way */
+
+    /**
+     * update the hash along the way
+     * Warning - strips \n but not \r
+     * @deprecated use StringBuilder version
+     */
     public static boolean readLine(InputStream in, StringBuffer buf, Sha256Standalone hash) throws IOException {
         int c = -1;
         while ( (c = in.read()) != -1) {
@@ -810,6 +823,32 @@ public class DataHelper {
             return true;
     }
     
+    /**
+     * Read in a line, placing it into the buffer (excluding the newline).
+     * Warning - strips \n but not \r
+     *
+     * @return true if the line was read, false if eof was reached before a 
+     *              newline was found
+     */
+    public static boolean readLine(InputStream in, StringBuilder buf) throws IOException {
+        return readLine(in, buf, null);
+    }
+
+    /**
+     * update the hash along the way
+     * Warning - strips \n but not \r
+     */
+    public static boolean readLine(InputStream in, StringBuilder buf, Sha256Standalone hash) throws IOException {
+        int c = -1;
+        while ( (c = in.read()) != -1) {
+            if (hash != null) hash.update((byte)c);
+            if (c == '\n')
+                break;
+            buf.append((char)c);
+        }
+        return c != -1; 
+    }
+    
     public static void write(OutputStream out, byte data[], Sha256Standalone hash) throws IOException {
         hash.update(data);
         out.write(data);
diff --git a/core/java/src/net/i2p/data/Destination.java b/core/java/src/net/i2p/data/Destination.java
index 791dc12098d9aebbad62b748456cd94f4efa7b02..5946056b386559bb5b06b6d9f393472b2bfea467 100644
--- a/core/java/src/net/i2p/data/Destination.java
+++ b/core/java/src/net/i2p/data/Destination.java
@@ -145,7 +145,7 @@ public class Destination extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[Destination: ");
         buf.append("\n\tHash: ").append(calculateHash().toBase64());
         buf.append("\n\tPublic Key: ").append(getPublicKey());
diff --git a/core/java/src/net/i2p/data/Hash.java b/core/java/src/net/i2p/data/Hash.java
index e986b2b5d4ad9b4b55bd93221f5bf9eff49c9579..c04bc62c4bab9b4372beded2f013cf6ff92e9ab2 100644
--- a/core/java/src/net/i2p/data/Hash.java
+++ b/core/java/src/net/i2p/data/Hash.java
@@ -104,7 +104,7 @@ public class Hash extends DataStructureImpl {
             }
             if (_log.shouldLog(Log.DEBUG)) {
                 // explicit buffer, since the compiler can't guess how long it'll be
-                StringBuffer buf = new StringBuffer(128);
+                StringBuilder buf = new StringBuilder(128);
                 buf.append("miss [").append(cached).append("] from ");
                 buf.append(DataHelper.toHexString(getData())).append(" to ");
                 buf.append(DataHelper.toHexString(key.getData()));
@@ -113,7 +113,7 @@ public class Hash extends DataStructureImpl {
         } else {
             if (_log.shouldLog(Log.DEBUG)) {
                 // explicit buffer, since the compiler can't guess how long it'll be
-                StringBuffer buf = new StringBuffer(128);
+                StringBuilder buf = new StringBuilder(128);
                 buf.append("hit from ");
                 buf.append(DataHelper.toHexString(getData())).append(" to ");
                 buf.append(DataHelper.toHexString(key.getData()));
@@ -155,7 +155,7 @@ public class Hash extends DataStructureImpl {
     @Override
     public String toString() {
         if (_stringified == null) {
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("[Hash: ");
             if (_data == null) {
                 buf.append("null hash");
diff --git a/core/java/src/net/i2p/data/Lease.java b/core/java/src/net/i2p/data/Lease.java
index 5f7b3159e28ac43ee1c6778595a2108cf6e3db82..eb22d64cfe9ef3bacc08cd7ca46a5797c8b63c4a 100644
--- a/core/java/src/net/i2p/data/Lease.java
+++ b/core/java/src/net/i2p/data/Lease.java
@@ -147,7 +147,7 @@ public class Lease extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[Lease: ");
         buf.append("\n\tEnd Date: ").append(getEndDate());
         buf.append("\n\tGateway: ").append(getGateway());
diff --git a/core/java/src/net/i2p/data/LeaseSet.java b/core/java/src/net/i2p/data/LeaseSet.java
index 66d10da94471cf3bbcea595eb8e6246fc23be417..3dcbf97a6addeef00c518c938af5554ddba2c757 100644
--- a/core/java/src/net/i2p/data/LeaseSet.java
+++ b/core/java/src/net/i2p/data/LeaseSet.java
@@ -355,7 +355,7 @@ public class LeaseSet extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[LeaseSet: ");
         buf.append("\n\tDestination: ").append(getDestination());
         buf.append("\n\tEncryptionKey: ").append(getEncryptionKey());
diff --git a/core/java/src/net/i2p/data/Payload.java b/core/java/src/net/i2p/data/Payload.java
index 2c730a2365408aa63934683183629046c4a51c05..5f3af7c16600a7004076de0ad0d449965ca3af57 100644
--- a/core/java/src/net/i2p/data/Payload.java
+++ b/core/java/src/net/i2p/data/Payload.java
@@ -108,7 +108,7 @@ public class Payload extends DataStructureImpl {
     @Override
     public String toString() {
         if (true) return "[Payload]";
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[Payload: ");
         if (getUnencryptedData() != null)
             buf.append("\n\tData: ").append(DataHelper.toString(getUnencryptedData(), 16));
diff --git a/core/java/src/net/i2p/data/PrivateKey.java b/core/java/src/net/i2p/data/PrivateKey.java
index e6c06dfd25b93d9b6811d1228be15a87d3dc4f92..7ea047314439b4110ed84960a3e800636331781e 100644
--- a/core/java/src/net/i2p/data/PrivateKey.java
+++ b/core/java/src/net/i2p/data/PrivateKey.java
@@ -77,7 +77,7 @@ public class PrivateKey extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[PrivateKey: ");
         if (_data == null) {
             buf.append("null key");
diff --git a/core/java/src/net/i2p/data/PrivateKeyFile.java b/core/java/src/net/i2p/data/PrivateKeyFile.java
index 497733cc4e348aedbe250da35b4d5118eb8b4549..7ba7f1b6af6b3ec80e5fd5039f9cffd402a04862 100644
--- a/core/java/src/net/i2p/data/PrivateKeyFile.java
+++ b/core/java/src/net/i2p/data/PrivateKeyFile.java
@@ -263,7 +263,7 @@ public class PrivateKeyFile {
     }
 
     public String toString() {
-        StringBuffer s = new StringBuffer(128);
+        StringBuilder s = new StringBuilder(128);
         s.append("Dest: ");
         s.append(this.dest != null ? this.dest.toBase64() : "null");
         s.append("\nContains: ");
diff --git a/core/java/src/net/i2p/data/PublicKey.java b/core/java/src/net/i2p/data/PublicKey.java
index aaf25b04a6bbb3549863643c79e8e8cf4185373c..d653ea9a42dceeac49922e21aaa49bb6aeb29b54 100644
--- a/core/java/src/net/i2p/data/PublicKey.java
+++ b/core/java/src/net/i2p/data/PublicKey.java
@@ -79,7 +79,7 @@ public class PublicKey extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[PublicKey: ");
         if (_data == null) {
             buf.append("null key");
diff --git a/core/java/src/net/i2p/data/RouterAddress.java b/core/java/src/net/i2p/data/RouterAddress.java
index f87e2b4ce0111c19ed680c1ffa4e780a7cb1bc8c..393bf9621f903a92edc54166b47e58720c263cb8 100644
--- a/core/java/src/net/i2p/data/RouterAddress.java
+++ b/core/java/src/net/i2p/data/RouterAddress.java
@@ -138,7 +138,7 @@ public class RouterAddress extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[RouterAddress: ");
         buf.append("\n\tTransportStyle: ").append(getTransportStyle());
         buf.append("\n\tCost: ").append(getCost());
diff --git a/core/java/src/net/i2p/data/RouterIdentity.java b/core/java/src/net/i2p/data/RouterIdentity.java
index c1ad540ef097fb2a768f32c15adbc73b197384c0..d7375b2903bda35bf121da0e7dc14935dee7a7ae 100644
--- a/core/java/src/net/i2p/data/RouterIdentity.java
+++ b/core/java/src/net/i2p/data/RouterIdentity.java
@@ -109,7 +109,7 @@ public class RouterIdentity extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[RouterIdentity: ");
         buf.append("\n\tHash: ").append(getHash().toBase64());
         buf.append("\n\tCertificate: ").append(getCertificate());
diff --git a/core/java/src/net/i2p/data/RouterInfo.java b/core/java/src/net/i2p/data/RouterInfo.java
index 191c7201951a57d522ffcf4e2826cd12de7e635f..e22c033e1dc3cbcf917e158e343824d2798c2f24 100644
--- a/core/java/src/net/i2p/data/RouterInfo.java
+++ b/core/java/src/net/i2p/data/RouterInfo.java
@@ -382,7 +382,7 @@ public class RouterInfo extends DataStructureImpl {
             } else if ((idx = caps.indexOf(cap)) == -1) {
                 return;
 	    } else {
-                StringBuffer buf = new StringBuffer(caps);
+                StringBuilder buf = new StringBuilder(caps);
 		while ( (idx = buf.indexOf(""+cap)) != -1)
                     buf.deleteCharAt(idx);
                 _options.setProperty(PROP_CAPABILITIES, buf.toString());
@@ -555,7 +555,7 @@ public class RouterInfo extends DataStructureImpl {
     @Override
     public String toString() {
         if (_stringified != null) return _stringified;
-        StringBuffer buf = new StringBuffer(5*1024);
+        StringBuilder buf = new StringBuilder(5*1024);
         buf.append("[RouterInfo: ");
         buf.append("\n\tIdentity: ").append(getIdentity());
         buf.append("\n\tSignature: ").append(getSignature());
diff --git a/core/java/src/net/i2p/data/SessionKey.java b/core/java/src/net/i2p/data/SessionKey.java
index a5963259246965419b4fa04baf94059a0a2d6bee..b89bee50511acb714865892d8496a4871d85cedb 100644
--- a/core/java/src/net/i2p/data/SessionKey.java
+++ b/core/java/src/net/i2p/data/SessionKey.java
@@ -84,7 +84,7 @@ public class SessionKey extends DataStructureImpl {
     @Override
     public String toString() { 
         if (true) return super.toString(); 
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[SessionKey: ");
         if (_data == null) {
             buf.append("null key");
diff --git a/core/java/src/net/i2p/data/Signature.java b/core/java/src/net/i2p/data/Signature.java
index 4ab11b947a7cc74768d8b74dec21f9cf7ed3e594..41a56aacd765788b6fc4068bd7c4a94447c378ed 100644
--- a/core/java/src/net/i2p/data/Signature.java
+++ b/core/java/src/net/i2p/data/Signature.java
@@ -69,7 +69,7 @@ public class Signature extends DataStructureImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[Signature: ");
         if (_data == null) {
             buf.append("null signature");
diff --git a/core/java/src/net/i2p/data/SigningPrivateKey.java b/core/java/src/net/i2p/data/SigningPrivateKey.java
index 5f4d64ec06424bf6341d68a1e4c31b3bc739b59f..4a1a99ccb60c098a9df3e1b34b4e048c66ead2b6 100644
--- a/core/java/src/net/i2p/data/SigningPrivateKey.java
+++ b/core/java/src/net/i2p/data/SigningPrivateKey.java
@@ -75,7 +75,7 @@ public class SigningPrivateKey extends DataStructureImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[SigningPrivateKey: ");
         if (_data == null) {
             buf.append("null key");
diff --git a/core/java/src/net/i2p/data/SigningPublicKey.java b/core/java/src/net/i2p/data/SigningPublicKey.java
index 148fc242e61bc5b98d7e1755c3ed3a5891975ec2..09097593f1a4959add8527ccaa4db7310e5f6f10 100644
--- a/core/java/src/net/i2p/data/SigningPublicKey.java
+++ b/core/java/src/net/i2p/data/SigningPublicKey.java
@@ -74,7 +74,7 @@ public class SigningPublicKey extends DataStructureImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("[SigningPublicKey: ");
         if (_data == null) {
             buf.append("null key");
diff --git a/core/java/src/net/i2p/data/VerifiedDestination.java b/core/java/src/net/i2p/data/VerifiedDestination.java
index 888d6a21129379f7f7385c2a312359a427e53684..19fd1079ee5e88d96dec7b06e17d5fb3ff413320 100644
--- a/core/java/src/net/i2p/data/VerifiedDestination.java
+++ b/core/java/src/net/i2p/data/VerifiedDestination.java
@@ -155,7 +155,7 @@ public class VerifiedDestination extends Destination {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(super.toString());
         buf.append("\n\tVerified Certificate? ").append(verifyCert(true));
         return buf.toString();
diff --git a/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java b/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java
index 2f8d567869d70abf06bbb9690967d78e33c9affc..888242d6b9a17e06a627584cc0c772a1630c49e0 100644
--- a/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/BandwidthLimitsMessage.java
@@ -91,7 +91,7 @@ public class BandwidthLimitsMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[BandwidthLimitsMessage");
         buf.append("\n\tIn: ").append(data[0]);
         buf.append("\n\tOut: ").append(data[1]);
diff --git a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
index f31aaa3aadaff42949520486a227baae8e832b84..5b22929e9837cdc113352753cf9c9752cb485b45 100644
--- a/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/CreateLeaseSetMessage.java
@@ -128,7 +128,7 @@ public class CreateLeaseSetMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[CreateLeaseSetMessage: ");
         buf.append("\n\tLeaseSet: ").append(getLeaseSet());
         buf.append("\n\tSigningPrivateKey: ").append(getSigningPrivateKey());
diff --git a/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java b/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java
index fa47ce57f6c55b40fceb46063f9fad59ad535f0b..909238625885e324a9534f5da7e8f894e248040f 100644
--- a/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/CreateSessionMessage.java
@@ -84,7 +84,7 @@ public class CreateSessionMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[CreateSessionMessage: ");
         buf.append("\n\tConfig: ").append(getSessionConfig());
         buf.append("]");
diff --git a/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java b/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java
index 13135a2a41150016461ea5a726ff9bb15af658e7..09b405d6e84da76f6d482d6f971775423439cb04 100644
--- a/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/DestLookupMessage.java
@@ -67,7 +67,7 @@ public class DestLookupMessage extends I2CPMessageImpl {
     }
 
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DestLookupMessage: ");
         buf.append("\n\tHash: ").append(_hash);
         buf.append("]");
diff --git a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java
index 1ed601dc28075bc73bfe273882fde94551f4978b..fbbb93c3da272f76b61f318433dc9f846749ec22 100644
--- a/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/DestReplyMessage.java
@@ -69,7 +69,7 @@ public class DestReplyMessage extends I2CPMessageImpl {
     }
 
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DestReplyMessage: ");
         buf.append("\n\tDestination: ").append(_dest);
         buf.append("]");
diff --git a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java
index a6f43dc7b5142ab548f25f196740f35d61d68d51..2c932c2b82bc6bd6da99063035c591c53364de0f 100644
--- a/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/DestroySessionMessage.java
@@ -80,7 +80,7 @@ public class DestroySessionMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DestroySessionMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("]");
diff --git a/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java b/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java
index 3ccd5263a4402eec738c8a628b59a4c6228b5cb2..cdfa638cc0787ec6d7de785ed1de727bc3790363 100644
--- a/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/DisconnectMessage.java
@@ -76,7 +76,7 @@ public class DisconnectMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DisconnectMessage: ");
         buf.append("\n\tReason: ").append(getReason());
         buf.append("]");
diff --git a/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java b/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java
index a47f883d78a200a776e0d313d05d5fd4bd178c99..67ad71decf106d40ebb5b2c005da0fc7c5ee475a 100644
--- a/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/GetBandwidthLimitsMessage.java
@@ -49,7 +49,7 @@ public class GetBandwidthLimitsMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[GetBandwidthLimitsMessage]");
         return buf.toString();
     }
diff --git a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
index 003ab534db2c960cfdf4580c24aa1f839eea47d5..a928f1f68e0704ea5071bd4e5b329018df52981c 100644
--- a/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/GetDateMessage.java
@@ -52,7 +52,7 @@ public class GetDateMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[GetDateMessage]");
         return buf.toString();
     }
diff --git a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java
index 5dc4a5d710f7fa5f4459898e3b3753033b08f7e7..3301b90d269da0ca8a7a18badc9faffc6ce1b20f 100644
--- a/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/MessagePayloadMessage.java
@@ -123,7 +123,7 @@ public class MessagePayloadMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[MessagePayloadMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tMessageId: ").append(getMessageId());
diff --git a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java
index 998069041922cdc6e4fe1f79c1791c29db630a48..912b38b20fc371aa20c7031963b96cc58ab9f972 100644
--- a/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/MessageStatusMessage.java
@@ -168,7 +168,7 @@ public class MessageStatusMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[MessageStatusMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tNonce: ").append(getNonce());
diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java
index 29320c82ae8be2341da776fdebc2e2279206a193..b942a7173297bcd144b29ef38a92055c56c46660 100644
--- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageBeginMessage.java
@@ -102,7 +102,7 @@ public class ReceiveMessageBeginMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[ReceiveMessageBeginMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tMessageId: ").append(getMessageId());
diff --git a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java
index dcdae6e14e72419883f153f84b6079eb2d13e846..f17298d0a9ab15210c3910ea0e5f09e73ba4ac15 100644
--- a/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReceiveMessageEndMessage.java
@@ -86,7 +86,7 @@ public class ReceiveMessageEndMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[ReceiveMessageEndMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tMessageId: ").append(getMessageId());
diff --git a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java
index 7165f6d3271c9d88b085d694bd0249f4a0d4ef59..4e3eede842117f48289677504dbce5ca8811ce8c 100644
--- a/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReconfigureSessionMessage.java
@@ -93,7 +93,7 @@ public class ReconfigureSessionMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[ReconfigureSessionMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tSessionConfig: ").append(getSessionConfig());
diff --git a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java
index 0800359f20918f0a9d54254231beae4d00db2929..2499610b6e4b5f73345818f97f5009742cdc3f92 100644
--- a/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/ReportAbuseMessage.java
@@ -123,7 +123,7 @@ public class ReportAbuseMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[ReportAbuseMessage: ");
         buf.append("\n\tSessionID: ").append(getSessionId());
         buf.append("\n\tSeverity: ").append(getSeverity());
diff --git a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
index b5fca013d78cb4c8c22e31225666228843b8ad9c..f5a0557aaf5d66af0d9ea6ebeef9ac3872ebf022 100644
--- a/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/RequestLeaseSetMessage.java
@@ -143,7 +143,7 @@ public class RequestLeaseSetMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[RequestLeaseMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tTunnels:");
diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
index d15c1979c4427f1673856cfe2ecff3cbcf731ccf..fabd6e3545f35e5e53158520c08c6fd44dda4335 100644
--- a/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SendMessageExpiresMessage.java
@@ -104,7 +104,7 @@ public class SendMessageExpiresMessage extends SendMessageMessage {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[SendMessageMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tNonce: ").append(getNonce());
diff --git a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java
index 2b9973c0ee7ffc118fee751171f3ef152eb4ea70..a9bb5fb58fef0851cb2d3194d559d90705772419 100644
--- a/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SendMessageMessage.java
@@ -149,7 +149,7 @@ public class SendMessageMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[SendMessageMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tNonce: ").append(getNonce());
diff --git a/core/java/src/net/i2p/data/i2cp/SessionConfig.java b/core/java/src/net/i2p/data/i2cp/SessionConfig.java
index d16ffe126645c48bb3349140d7cc99e708b8e266..89d56c736889742e7e5de61cc5b408fa44e59054 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionConfig.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionConfig.java
@@ -218,7 +218,7 @@ public class SessionConfig extends DataStructureImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer("[SessionConfig: ");
+        StringBuilder buf = new StringBuilder("[SessionConfig: ");
         buf.append("\n\tDestination: ").append(getDestination());
         buf.append("\n\tSignature: ").append(getSignature());
         buf.append("\n\tCreation Date: ").append(getCreationDate());
diff --git a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
index cf989c90868afa17937cb2a389aa5ee340e30c90..051bad5045a0daef1fc449fd730c8c12a8045068 100644
--- a/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SessionStatusMessage.java
@@ -96,7 +96,7 @@ public class SessionStatusMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[SessionStatusMessage: ");
         buf.append("\n\tSessionId: ").append(getSessionId());
         buf.append("\n\tStatus: ").append(getStatus());
diff --git a/core/java/src/net/i2p/data/i2cp/SetDateMessage.java b/core/java/src/net/i2p/data/i2cp/SetDateMessage.java
index 605b0a928707db56f56f1cb6639e163b44596f15..174dea6d638a0b0103ff8c7116310bde24eb4cc5 100644
--- a/core/java/src/net/i2p/data/i2cp/SetDateMessage.java
+++ b/core/java/src/net/i2p/data/i2cp/SetDateMessage.java
@@ -79,7 +79,7 @@ public class SetDateMessage extends I2CPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[SetDateMessage");
         buf.append("\n\tDate: ").append(getDate());
         buf.append("]");
diff --git a/core/java/src/net/i2p/stat/PersistenceHelper.java b/core/java/src/net/i2p/stat/PersistenceHelper.java
index 8132688991ecb05ca1f1e3b07ba5aa096675c611..d8c1312d42432ac31275f1fee0f6abdb0a459f79 100644
--- a/core/java/src/net/i2p/stat/PersistenceHelper.java
+++ b/core/java/src/net/i2p/stat/PersistenceHelper.java
@@ -9,13 +9,13 @@ class PersistenceHelper {
     private final static Log _log = new Log(PersistenceHelper.class);
     private final static String NL = System.getProperty("line.separator");
 
-    public final static void add(StringBuffer buf, String prefix, String name, String description, double value) {
+    public final static void add(StringBuilder buf, String prefix, String name, String description, double value) {
         buf.append("# ").append(prefix).append(name).append(NL);
         buf.append("# ").append(description).append(NL);
         buf.append(prefix).append(name).append('=').append(value).append(NL).append(NL);
     }
 
-    public final static void add(StringBuffer buf, String prefix, String name, String description, long value) {
+    public final static void add(StringBuilder buf, String prefix, String name, String description, long value) {
         buf.append("# ").append(prefix).append(name).append(NL);
         buf.append("# ").append(description).append(NL);
         buf.append(prefix).append(name).append('=').append(value).append(NL).append(NL);
diff --git a/core/java/src/net/i2p/stat/Rate.java b/core/java/src/net/i2p/stat/Rate.java
index d4164c2b5679bdf8297e39304da06e50dbf8aa36..03dc696a589dbc648e9419d886e0ec4564aa9f0e 100644
--- a/core/java/src/net/i2p/stat/Rate.java
+++ b/core/java/src/net/i2p/stat/Rate.java
@@ -363,7 +363,7 @@ public class Rate {
         return 0.0D;
     }
 
-    public void store(String prefix, StringBuffer buf) throws IOException {
+    public void store(String prefix, StringBuilder buf) throws IOException {
         PersistenceHelper.add(buf, prefix, ".period", "Number of milliseconds in the period", _period);
         PersistenceHelper.add(buf, prefix, ".creationDate",
                               "When was this rate created?  (milliseconds since the epoch, GMT)", _creationDate);
@@ -454,7 +454,7 @@ public class Rate {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(2048);
+        StringBuilder buf = new StringBuilder(2048);
         buf.append("\n\t total value: ").append(getLastTotalValue());
         buf.append("\n\t highest total value: ").append(getExtremeTotalValue());
         buf.append("\n\t lifetime total value: ").append(getLifetimeTotalValue());
@@ -494,7 +494,7 @@ public class Rate {
             rate.addData(i * 100, 20);
         }
         rate.coalesce();
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         try {
             rate.store("rate.test", buf);
             byte data[] = buf.toString().getBytes();
diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java
index dd1fe63e3f6b0a5acafe4ea4caa354694bfd7fd6..b021d59f4ef0eeec4aa1a2ea2650835a14721894 100644
--- a/core/java/src/net/i2p/stat/RateStat.java
+++ b/core/java/src/net/i2p/stat/RateStat.java
@@ -93,7 +93,7 @@ public class RateStat {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(4096);
+        StringBuilder buf = new StringBuilder(4096);
         buf.append(getGroupName()).append('.').append(getName()).append(": ").append(getDescription()).append('\n');
         long periods[] = getPeriods();
         Arrays.sort(periods);
@@ -121,7 +121,7 @@ public class RateStat {
     }
 
     public void store(OutputStream out, String prefix) throws IOException {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append(NL);
         buf.append("################################################################################").append(NL);
         buf.append("# Rate: ").append(_groupName).append(": ").append(_statName).append(NL);
diff --git a/core/java/src/net/i2p/stat/SimpleStatDumper.java b/core/java/src/net/i2p/stat/SimpleStatDumper.java
index 2a7d4ae788c54ab78917f5a7ee89eb255759b8dc..eb48e5fce886f61a3f61b8984c5e7aa1e1bbfc67 100644
--- a/core/java/src/net/i2p/stat/SimpleStatDumper.java
+++ b/core/java/src/net/i2p/stat/SimpleStatDumper.java
@@ -14,13 +14,13 @@ public class SimpleStatDumper {
     public static void dumpStats(I2PAppContext context, int logLevel) {
         if (!_log.shouldLog(logLevel)) return;
 
-        StringBuffer buf = new StringBuffer(4 * 1024);
+        StringBuilder buf = new StringBuilder(4 * 1024);
         dumpFrequencies(context, buf);
         dumpRates(context, buf);
         _log.log(logLevel, buf.toString());
     }
 
-    private static void dumpFrequencies(I2PAppContext ctx, StringBuffer buf) {
+    private static void dumpFrequencies(I2PAppContext ctx, StringBuilder buf) {
         Set frequencies = new TreeSet(ctx.statManager().getFrequencyNames());
         for (Iterator iter = frequencies.iterator(); iter.hasNext();) {
             String name = (String) iter.next();
@@ -40,7 +40,7 @@ public class SimpleStatDumper {
         }
     }
 
-    private static void dumpRates(I2PAppContext ctx, StringBuffer buf) {
+    private static void dumpRates(I2PAppContext ctx, StringBuilder buf) {
         Set rates = new TreeSet(ctx.statManager().getRateNames());
         for (Iterator iter = rates.iterator(); iter.hasNext();) {
             String name = (String) iter.next();
@@ -59,7 +59,7 @@ public class SimpleStatDumper {
         }
     }
 
-    static void dumpRate(Rate curRate, StringBuffer buf) {
+    static void dumpRate(Rate curRate, StringBuilder buf) {
         buf.append(curRate.toString());
     }
 }
\ No newline at end of file
diff --git a/core/java/src/net/i2p/time/Timestamper.java b/core/java/src/net/i2p/time/Timestamper.java
index b3f5290e330f26487adc425d301577d82379c945..c452f110a12ec2328e1ad726e1d1e8ab621515af 100644
--- a/core/java/src/net/i2p/time/Timestamper.java
+++ b/core/java/src/net/i2p/time/Timestamper.java
@@ -197,7 +197,7 @@ public class Timestamper implements Runnable {
             } else {
                 if (Math.abs(delta - expectedDelta) > MAX_VARIANCE) {
                     if (_log.shouldLog(Log.ERROR)) {
-                        StringBuffer err = new StringBuffer(96);
+                        StringBuilder err = new StringBuilder(96);
                         err.append("SNTP client variance exceeded at query ").append(i);
                         err.append(".  expected = ");
                         err.append(expectedDelta);
@@ -214,7 +214,7 @@ public class Timestamper implements Runnable {
         }
         stampTime(now);
         if (_log.shouldLog(Log.DEBUG)) {
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("Deltas: ");
             for (int i = 0; i < found.length; i++)
                 buf.append(found[i]).append(' ');
diff --git a/core/java/src/net/i2p/util/BufferedRandomSource.java b/core/java/src/net/i2p/util/BufferedRandomSource.java
index dc975671a5d1b18e151ec587f93de9582a849cdb..c6ecd274046ed4084c6d37830ee1750c21ca79cc 100644
--- a/core/java/src/net/i2p/util/BufferedRandomSource.java
+++ b/core/java/src/net/i2p/util/BufferedRandomSource.java
@@ -218,7 +218,7 @@ public class BufferedRandomSource extends RandomSource {
         System.out.println("Data: " + data.length + "/" + compressed.length + ": " + toString(data));
     }
     private static final String toString(byte data[]) {
-        StringBuffer buf = new StringBuffer(data.length * 9);
+        StringBuilder buf = new StringBuilder(data.length * 9);
         for (int i = 0; i < data.length; i++) {
             for (int j = 0; j < 8; j++) {
                 if ((data[i] & (1 << j)) != 0)
diff --git a/core/java/src/net/i2p/util/EepGet.java b/core/java/src/net/i2p/util/EepGet.java
index c3c18866a7d251cde86d187735d02fa4cb80c668..035d0c6be8689ba4dac19544f162c3723c9d2d8d 100644
--- a/core/java/src/net/i2p/util/EepGet.java
+++ b/core/java/src/net/i2p/util/EepGet.java
@@ -207,7 +207,7 @@ public class EepGet {
                                              "01234567890.,_=@#:";
     private static String sanitize(String name) {
         name = name.replace('/', '_');
-        StringBuffer buf = new StringBuffer(name);
+        StringBuilder buf = new StringBuilder(name);
         for (int i = 0; i < name.length(); i++)
             if (_safeChars.indexOf(buf.charAt(i)) == -1)
                 buf.setCharAt(i, '_');
@@ -292,7 +292,7 @@ public class EepGet {
                         long now = _context.clock().now();
                         long timeToSend = now - _lastComplete;
                         if (timeToSend > 0) {
-                            StringBuffer buf = new StringBuffer(50);
+                            StringBuilder buf = new StringBuilder(50);
                             buf.append(" ");
                             if ( bytesRemaining > 0 ) {
                                 double pct = ((double)_written + _previousWritten) /
@@ -353,7 +353,7 @@ public class EepGet {
             if (_etag != null)
                 System.out.println("== ETag: " + _etag);            
             if (transferred > 0) {
-                StringBuffer buf = new StringBuffer(50);
+                StringBuilder buf = new StringBuilder(50);
                 buf.append("== Transfer rate: ");
                 double kbps = (1000.0d*(double)(transferred)/((double)timeToSend*1024.0d));
                 synchronized (_kbps) {
@@ -381,7 +381,7 @@ public class EepGet {
             long timeToSend = _context.clock().now() - _startedOn;
             System.out.println("== Transfer time: " + DataHelper.formatDuration(timeToSend));
             double kbps = (timeToSend > 0 ? (1000.0d*(double)(bytesTransferred)/((double)timeToSend*1024.0d)) : 0);
-            StringBuffer buf = new StringBuffer(50);
+            StringBuilder buf = new StringBuilder(50);
             buf.append("== Transfer rate: ");
             synchronized (_kbps) {
                 buf.append(_kbps.format(kbps));
@@ -627,7 +627,7 @@ public class EepGet {
 
     private void readHeaders() throws IOException {
         String key = null;
-        StringBuffer buf = new StringBuffer(32);
+        StringBuilder buf = new StringBuilder(32);
 
         boolean read = DataHelper.readLine(_proxyIn, buf);
         if (!read) throw new IOException("Unable to read the first line");
@@ -738,7 +738,7 @@ public class EepGet {
     }
     
     private long readChunkLength() throws IOException {
-        StringBuffer buf = new StringBuffer(8);
+        StringBuilder buf = new StringBuilder(8);
         int nl = 0;
         while (true) {
             int cur = _proxyIn.read();
@@ -893,7 +893,7 @@ public class EepGet {
     }
     
     private String getRequest() throws IOException {
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         boolean post = false;
         if ( (_postData != null) && (_postData.length() > 0) )
             post = true;
@@ -922,7 +922,8 @@ public class EepGet {
             buf.append("-\r\n");
         }
         buf.append("Accept-Encoding: \r\n");
-        buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n");
+        if (_shouldProxy)
+            buf.append("X-Accept-Encoding: x-i2p-gzip;q=1.0, identity;q=0.5, deflate;q=0, gzip;q=0, *;q=0\r\n");
         if (!_allowCaching) {
             buf.append("Cache-control: no-cache\r\n");
             buf.append("Pragma: no-cache\r\n");
diff --git a/core/java/src/net/i2p/util/EepPost.java b/core/java/src/net/i2p/util/EepPost.java
index 50929f3cf5e8e3cf1746acea77f7346005516f0a..615361e2045ef3ed4742ec620a7fd68c8a029a1a 100644
--- a/core/java/src/net/i2p/util/EepPost.java
+++ b/core/java/src/net/i2p/util/EepPost.java
@@ -184,7 +184,7 @@ public class EepPost {
     }
     
     private String getHeader(boolean isProxy, String path, String host, int port, String separator, long length) {
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("POST ");
         if (isProxy) {
             buf.append("http://").append(host);
@@ -212,7 +212,7 @@ public class EepPost {
             return "------------------------" + new java.util.Random().nextLong();
         byte separator[] = new byte[32];  // 2^-128 chance of this being a problem
         I2PAppContext.getGlobalContext().random().nextBytes(separator);
-        StringBuffer sep = new StringBuffer(48);
+        StringBuilder sep = new StringBuilder(48);
         for (int i = 0; i < separator.length; i++)
             sep.append((char)((int)'a' + (int)(separator[i]&0x0F))).append((char)((int)'a' + (int)((separator[i] >>> 4) & 0x0F)));
         return sep.toString();
diff --git a/core/java/src/net/i2p/util/FileUtil.java b/core/java/src/net/i2p/util/FileUtil.java
index b6140b6e43cc8a33ca7ae12f1ad7c6d7df707eb2..9232ec4dcdcae6bcc750b39edef4bf8daeb3b2df 100644
--- a/core/java/src/net/i2p/util/FileUtil.java
+++ b/core/java/src/net/i2p/util/FileUtil.java
@@ -160,7 +160,7 @@ public class FileUtil {
                         lines.remove(0);
                 }
             }
-            StringBuffer buf = new StringBuffer(lines.size() * 80);
+            StringBuilder buf = new StringBuilder(lines.size() * 80);
             for (int i = 0; i < lines.size(); i++)
                 buf.append((String)lines.get(i)).append('\n');
             return buf.toString();
diff --git a/core/java/src/net/i2p/util/LogManager.java b/core/java/src/net/i2p/util/LogManager.java
index 73178b0d62ba5882b4b17c5696bbb9fca99b8568..054e79a2287f1258b29dbc9788b3b23fb2a0a762 100644
--- a/core/java/src/net/i2p/util/LogManager.java
+++ b/core/java/src/net/i2p/util/LogManager.java
@@ -546,7 +546,7 @@ public class LogManager {
     }
     
     private String createConfig() {
-        StringBuffer buf = new StringBuffer(8*1024);
+        StringBuilder buf = new StringBuilder(8*1024);
         buf.append(PROP_FORMAT).append('=').append(new String(_format)).append('\n');
         buf.append(PROP_DATEFORMAT).append('=').append(_dateFormatPattern).append('\n');
         buf.append(PROP_DISPLAYONSCREEN).append('=').append((_displayOnScreen ? "TRUE" : "FALSE")).append('\n');
diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java
index f280e7bf950fdc35de6c673616fd99b99ff101b1..72d6ef9ee7d694ce3388127a3a3fb8fc60ed8f92 100644
--- a/core/java/src/net/i2p/util/LogRecordFormatter.java
+++ b/core/java/src/net/i2p/util/LogRecordFormatter.java
@@ -30,7 +30,7 @@ class LogRecordFormatter {
         int size = 128 + rec.getMessage().length();
         if (rec.getThrowable() != null)
             size += 512;
-        StringBuffer buf = new StringBuffer(size);
+        StringBuilder buf = new StringBuilder(size);
         char format[] = manager.getFormat();
         for (int i = 0; i < format.length; ++i) {
             switch (format[i]) {
@@ -93,7 +93,7 @@ class LogRecordFormatter {
     }
 
     private static String toString(String str, int size) {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         if (str == null) str = "";
         if (str.length() > size) str = str.substring(str.length() - size);
         buf.append(str);
diff --git a/core/java/src/net/i2p/util/LogWriter.java b/core/java/src/net/i2p/util/LogWriter.java
index b6302c3c4a49c70199ef237e349e4dd48f916020..ed94081c6be7f1d43f34884f013cb6c8030e1ee1 100644
--- a/core/java/src/net/i2p/util/LogWriter.java
+++ b/core/java/src/net/i2p/util/LogWriter.java
@@ -238,7 +238,7 @@ class LogWriter implements Runnable {
 
     private static final String replace(String pattern, int num) {
         char c[] = pattern.toCharArray();
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         for (int i = 0; i < c.length; i++) {
             if ( (c[i] != '#') && (c[i] != '@') )
                 buf.append(c[i]);
diff --git a/core/java/src/net/i2p/util/SimpleTimer.java b/core/java/src/net/i2p/util/SimpleTimer.java
index 87aa7b4e54193504b9152c7ff4ce8eac8bf11fe3..bb0a2e67e2fb5fd7ca1ee53d676e94d38d366b8c 100644
--- a/core/java/src/net/i2p/util/SimpleTimer.java
+++ b/core/java/src/net/i2p/util/SimpleTimer.java
@@ -233,7 +233,7 @@ public class SimpleTimer {
                 } else {
                     _occurredTime = now;
                     if (_occurredEventCount > 2500) {
-                        StringBuffer buf = new StringBuffer(128);
+                        StringBuilder buf = new StringBuilder(128);
                         buf.append("Too many simpleTimerJobs (").append(_occurredEventCount);
                         buf.append(") in a second!");
                         _log.log(Log.WARN, buf.toString());
diff --git a/core/java/src/net/i2p/util/SocketTimeout.java b/core/java/src/net/i2p/util/SocketTimeout.java
index 65238dd0dcc7f82439ae573b16aa18f835447357..3813ec6e83880a807b136acce74c950a7a9d0457 100644
--- a/core/java/src/net/i2p/util/SocketTimeout.java
+++ b/core/java/src/net/i2p/util/SocketTimeout.java
@@ -58,7 +58,7 @@ public class SocketTimeout implements SimpleTimer.TimedEvent {
     private static String ts(long when) { synchronized (_fmt) { return _fmt.format(new Date(when)); } }
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("started on ");
         buf.append(ts(_startTime));
         buf.append("idle for ");
diff --git a/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java b/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java
index 05b515bd2357a071e7d53cf25539121d1c9478ca..6da1f0f60742f64a9b048f57984aa94c8353954c 100644
--- a/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java
+++ b/core/java/src/org/xlattice/crypto/filters/BloomSHA1.java
@@ -212,7 +212,7 @@ public class BloomSHA1 {
     }
     // DEBUG METHODS
     public static String keyToString(byte[] key) {
-        StringBuffer sb = new StringBuffer().append(key[0]);
+        StringBuilder sb = new StringBuilder().append(key[0]);
         for (int i = 1; i < key.length; i++) {
             sb.append(".").append(Integer.toString(key[i], 16));
         }
@@ -220,14 +220,14 @@ public class BloomSHA1 {
     }
     /** convert 64-bit integer to hex String */
     public static String ltoh (long i) {
-        StringBuffer sb = new StringBuffer().append("#")
+        StringBuilder sb = new StringBuilder().append("#")
                                 .append(Long.toString(i, 16));
         return sb.toString();
     }
 
     /** convert 32-bit integer to String */
     public static String itoh (int i) {
-        StringBuffer sb = new StringBuffer().append("#")
+        StringBuilder sb = new StringBuilder().append("#")
                                 .append(Integer.toString(i, 16));
         return sb.toString();
     }
diff --git a/core/java/test/net/i2p/crypto/HMACSHA256Bench.java b/core/java/test/net/i2p/crypto/HMACSHA256Bench.java
index 762821f1589429ff4f33de456f44c9ba8ee75bd1..00474e0e463cb56e960552f754c8b4db40585d4d 100644
--- a/core/java/test/net/i2p/crypto/HMACSHA256Bench.java
+++ b/core/java/test/net/i2p/crypto/HMACSHA256Bench.java
@@ -70,12 +70,12 @@ public class HMACSHA256Bench {
 		long maxLong1 = 0;
         
 		byte[] smess = new String("abc").getBytes();
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int x = 0; x < 2*1024; x++) {
 			buf.append("a");
 		}
 		byte[] mmess = buf.toString().getBytes(); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes();
-		buf = new StringBuffer();
+		buf = new StringBuilder();
 		for (int x = 0; x < 10000; x++) {
 			buf.append("a");
 		}
diff --git a/core/java/test/net/i2p/crypto/SHA1HashTest.java b/core/java/test/net/i2p/crypto/SHA1HashTest.java
index 140f784ebf68143a480b2fed24d5bf8311d2124d..b8388382133e8c7a32ff6bb558f8995482fbb7a2 100644
--- a/core/java/test/net/i2p/crypto/SHA1HashTest.java
+++ b/core/java/test/net/i2p/crypto/SHA1HashTest.java
@@ -133,7 +133,7 @@ public class SHA1HashTest extends TestCase{
     }
  
     private final String toHex(final byte[] bytes) {
-        StringBuffer buf = new StringBuffer(bytes.length * 2);
+        StringBuilder buf = new StringBuilder(bytes.length * 2);
         for (int i = 0; i < bytes.length; i++) {
             if ((i & 3) == 0 && i != 0)
                buf.append(' ');
diff --git a/core/java/test/net/i2p/crypto/SHA256Bench.java b/core/java/test/net/i2p/crypto/SHA256Bench.java
index dc5f14163c776d2c68766dd307b442ff77719c48..0988fde34f8f6f76e4bb6831c20ccd472583230a 100644
--- a/core/java/test/net/i2p/crypto/SHA256Bench.java
+++ b/core/java/test/net/i2p/crypto/SHA256Bench.java
@@ -57,12 +57,12 @@ public class SHA256Bench {
 		long maxLong1 = 0;
         
 		byte[] smess = new String("abc").getBytes();
-		StringBuffer buf = new StringBuffer();
+		StringBuilder buf = new StringBuilder();
 		for (int x = 0; x < 10*1024; x++) {
 			buf.append("a");
 		}
 		byte[] mmess = buf.toString().getBytes(); // new String("abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq").getBytes();
-		buf = new StringBuffer();
+		buf = new StringBuilder();
 		for (int x = 0; x < 1000000; x++) {
 			buf.append("a");
 		}
diff --git a/core/java/test/net/i2p/stat/RateTest.java b/core/java/test/net/i2p/stat/RateTest.java
index fd565054ac1693eaaec30054884d0c9325c53918..471e7bb8f328ac396e848a83bc13852f63f60a77 100644
--- a/core/java/test/net/i2p/stat/RateTest.java
+++ b/core/java/test/net/i2p/stat/RateTest.java
@@ -13,7 +13,7 @@ public class RateTest extends TestCase {
             rate.addData(i * 100, 20);
         }
         rate.coalesce();
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         
         rate.store("rate.test", buf);
         byte data[] = buf.toString().getBytes();
diff --git a/router/java/src/net/i2p/data/i2np/DataMessage.java b/router/java/src/net/i2p/data/i2np/DataMessage.java
index 8ba6b13460e579a88e5898e44859a49242574595..cd4c4d327a265b7e541bad14d36714bb0581cc28 100644
--- a/router/java/src/net/i2p/data/i2np/DataMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DataMessage.java
@@ -106,7 +106,7 @@ public class DataMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DataMessage: ");
         buf.append("\n\tData: ").append(DataHelper.toString(getData(), 64));
         buf.append("]");
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java
index 79dec2ee9b41d0ba257e3d2fbf0b9d2e934fdfee..43e2ee8d560cc0c46fbb741203cbec193ba4c105 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseLookupMessage.java
@@ -238,7 +238,7 @@ public class DatabaseLookupMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DatabaseLookupMessage: ");
         buf.append("\n\tSearch Key: ").append(getSearchKey());
         buf.append("\n\tFrom: ").append(getFrom());
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
index c8dc9aa901bc651814ce1124e2318a136e8cb5cf..f477ef2a1f98fd6d5c7a8631594867e708342976 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseSearchReplyMessage.java
@@ -131,7 +131,7 @@ public class DatabaseSearchReplyMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DatabaseSearchReplyMessage: ");
         buf.append("\n\tSearch Key: ").append(getSearchKey());
         buf.append("\n\tReplies: # = ").append(getNumReplies());
diff --git a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
index 04ef417d3adfc776afcd465daa0f10452b83d378..9bf61e84390ecae056687c9d13be4db6eb64e7b4 100644
--- a/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DatabaseStoreMessage.java
@@ -260,7 +260,7 @@ public class DatabaseStoreMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DatabaseStoreMessage: ");
         buf.append("\n\tExpiration: ").append(getMessageExpiration());
         buf.append("\n\tUnique ID: ").append(getUniqueId());
diff --git a/router/java/src/net/i2p/data/i2np/DateMessage.java b/router/java/src/net/i2p/data/i2np/DateMessage.java
index b5388eda5ae8373d0e6c8607125511d4fd99b8f0..166ecafd3c181779fafc2532f810c0096f219c89 100644
--- a/router/java/src/net/i2p/data/i2np/DateMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DateMessage.java
@@ -70,7 +70,7 @@ public class DateMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DateMessage: ");
         buf.append("Now: ").append(_now);
         buf.append("]");
diff --git a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
index 8ad3ddff28c269a48c07b605acf182d2c84d926f..98935a3947ae3e0d666ce5d1037d4cf38236d118 100644
--- a/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
+++ b/router/java/src/net/i2p/data/i2np/DeliveryInstructions.java
@@ -377,7 +377,7 @@ public class DeliveryInstructions extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[DeliveryInstructions: ");
         buf.append("\n\tDelivery mode: ");
         switch (getDeliveryMode()) {
diff --git a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
index ff8ad12cbdc4da0f3997379a6b8e552d481d116e..9325a63331ee49f186c43c206745af837fda81fd 100644
--- a/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
+++ b/router/java/src/net/i2p/data/i2np/DeliveryStatusMessage.java
@@ -82,7 +82,7 @@ public class DeliveryStatusMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[DeliveryStatusMessage: ");
         buf.append("\n\tMessage ID: ").append(getMessageId());
         buf.append("\n\tArrival: ").append(_context.clock().now() - _arrival);
diff --git a/router/java/src/net/i2p/data/i2np/GarlicClove.java b/router/java/src/net/i2p/data/i2np/GarlicClove.java
index aa37994a07fe0539bbc26a6ad12b3beff4048a54..867071c869e9cced894d5c792943cc7ea44da66d 100644
--- a/router/java/src/net/i2p/data/i2np/GarlicClove.java
+++ b/router/java/src/net/i2p/data/i2np/GarlicClove.java
@@ -107,25 +107,25 @@ public class GarlicClove extends DataStructureImpl {
 
     
     public void writeBytes(OutputStream out) throws DataFormatException, IOException {
-        StringBuffer error = null; 
+        StringBuilder error = null; 
         if (_instructions == null) {
-            if (error == null) error = new StringBuffer();
+            if (error == null) error = new StringBuilder();
             error.append("No instructions ");
         }
         if (_msg == null) {
-            if (error == null) error = new StringBuffer();
+            if (error == null) error = new StringBuilder();
             error.append("No message ");
         }
         if (_cloveId < 0) {
-            if (error == null) error = new StringBuffer();
+            if (error == null) error = new StringBuilder();
             error.append("CloveID < 0 [").append(_cloveId).append("] ");
         }
         if (_expiration == null) {
-            if (error == null) error = new StringBuffer();
+            if (error == null) error = new StringBuilder();
             error.append("Expiration is null ");
         }
         if (_certificate == null) {
-            if (error == null) error = new StringBuffer();
+            if (error == null) error = new StringBuilder();
             error.append("Certificate is null ");
         }
         
@@ -210,7 +210,7 @@ public class GarlicClove extends DataStructureImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[GarlicClove: ");
         buf.append("\n\tInstructions: ").append(getInstructions());
         buf.append("\n\tCertificate: ").append(getCertificate());
diff --git a/router/java/src/net/i2p/data/i2np/GarlicMessage.java b/router/java/src/net/i2p/data/i2np/GarlicMessage.java
index 357e7d2f5ee0603db1853e22155063ddf5b2c03c..88d2f2b3780136faa9b195cf7c6000a366812c8b 100644
--- a/router/java/src/net/i2p/data/i2np/GarlicMessage.java
+++ b/router/java/src/net/i2p/data/i2np/GarlicMessage.java
@@ -90,7 +90,7 @@ public class GarlicMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[GarlicMessage: ");
         buf.append("\n\tData length: ").append(getData().length).append(" bytes");
         buf.append("]");
diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java b/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java
index b611f46728173e34c2b49f1b05972859b83ad2e1..4d0008642ef6ee06e87cd843c591b28b43b10189 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelCreateMessage.java
@@ -263,7 +263,7 @@ public class TunnelCreateMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[TunnelCreateMessage: ");
         buf.append("\n\tNext Router: ").append(getNextRouter());
         buf.append("\n\tNext Tunnel: ").append(getNextTunnelId());
diff --git a/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java b/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java
index 515436f5dd019e13fd606465ba9281812ef94983..07185f3406763aea73cb7897040ddba095d0dc90 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelCreateStatusMessage.java
@@ -108,7 +108,7 @@ public class TunnelCreateStatusMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[TunnelCreateStatusMessage: ");
         buf.append("\n\tTunnel ID: ").append(getReceiveTunnelId());
         buf.append("\n\tStatus: ").append(getStatus());
diff --git a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
index 77c967f5871a3d19d772c479b9dab842033ab4b3..a55efc2b1fd40292ed79e00c3e1b609125d8b85c 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelDataMessage.java
@@ -139,7 +139,7 @@ public class TunnelDataMessage extends I2NPMessageImpl {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[TunnelDataMessage:");
         buf.append(" MessageId: ").append(getUniqueId());
         buf.append(" Tunnel ID: ").append(getTunnelId());
diff --git a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java
index a436472e4319d679d1ff9d5ba3021a95cbb10d77..43fc4bce65d89d10e298eb7d207e40146498d2d6 100644
--- a/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java
+++ b/router/java/src/net/i2p/data/i2np/TunnelGatewayMessage.java
@@ -131,7 +131,7 @@ public class TunnelGatewayMessage extends I2NPMessageImpl {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("[TunnelGatewayMessage:");
         buf.append(" Tunnel ID: ").append(getTunnelId());
         buf.append(" Message: ").append(_msg);
diff --git a/router/java/src/net/i2p/router/Blocklist.java b/router/java/src/net/i2p/router/Blocklist.java
index 6195d6a76914dbccea1f601afb8a289de1b1e939..1ce5cb5e7d7afd60e9fd8e96ce4f537fcde20f59 100644
--- a/router/java/src/net/i2p/router/Blocklist.java
+++ b/router/java/src/net/i2p/router/Blocklist.java
@@ -188,7 +188,7 @@ public class Blocklist {
         FileInputStream in = null;
         try {
             in = new FileInputStream(BLFile);
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             while (DataHelper.readLine(in, buf) && count < maxSize) {
                 Entry e = parse(buf, true);
                 buf.setLength(0);
@@ -267,7 +267,7 @@ public class Blocklist {
         }
     }
 
-    private Entry parse(StringBuffer buf, boolean bitch) {
+    private Entry parse(StringBuilder buf, boolean bitch) {
         byte[] ip1;
         byte[] ip2;
         int start1 = 0;
@@ -378,7 +378,7 @@ public class Blocklist {
         FileInputStream in = null;
         try {
             in = new FileInputStream(BLFile);
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             while (DataHelper.readLine(in, buf)) {
                 lines++;
                 buf.setLength(0);
@@ -628,7 +628,7 @@ public class Blocklist {
     }
 
     private static String toStr(long entry) {
-        StringBuffer buf = new StringBuffer(32);
+        StringBuilder buf = new StringBuilder(32);
         for (int i = 7; i >= 0; i--) {
             buf.append((entry >> (8*i)) & 0xff);
             if (i == 4)
@@ -640,7 +640,7 @@ public class Blocklist {
     }
 
     private static String toStr(int ip) {
-        StringBuffer buf = new StringBuffer(16);
+        StringBuilder buf = new StringBuilder(16);
         for (int i = 3; i >= 0; i--) {
             buf.append((ip >> (8*i)) & 0xff);
             if (i > 0)
@@ -719,7 +719,7 @@ public class Blocklist {
             FileInputStream in = null;
             try {
                 in = new FileInputStream(BLFile);
-                StringBuffer buf = new StringBuffer(128);
+                StringBuilder buf = new StringBuilder(128);
                 // assume the file is unsorted, so go through the whole thing
                 while (DataHelper.readLine(in, buf)) {
                     Entry e = parse(buf, false);
diff --git a/router/java/src/net/i2p/router/ClientTunnelSettings.java b/router/java/src/net/i2p/router/ClientTunnelSettings.java
index 6cd3981954c642a23d53395f4b649dd98fe8f15b..cc8c74e6cc059c78e7b4ade8a640476c2bfe2fe1 100644
--- a/router/java/src/net/i2p/router/ClientTunnelSettings.java
+++ b/router/java/src/net/i2p/router/ClientTunnelSettings.java
@@ -46,7 +46,7 @@ public class ClientTunnelSettings {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         Properties p = new Properties();
         writeToProperties(p);
         buf.append("Client tunnel settings:\n");
diff --git a/router/java/src/net/i2p/router/JobImpl.java b/router/java/src/net/i2p/router/JobImpl.java
index a72f852967f3053345d2ba8b811a36787a1baae9..2934855c8d60ac8781810e305652491a9520d2b1 100644
--- a/router/java/src/net/i2p/router/JobImpl.java
+++ b/router/java/src/net/i2p/router/JobImpl.java
@@ -35,7 +35,7 @@ public abstract class JobImpl implements Job {
     
     @Override
     public String toString() { 
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(super.toString());
         buf.append(": Job ").append(_id).append(": ").append(getName());
         return buf.toString();
diff --git a/router/java/src/net/i2p/router/JobQueue.java b/router/java/src/net/i2p/router/JobQueue.java
index 890b303c0c49eebd3dea2083c6307839df12297c..f14cb514663194000c12eec683a1ac1f342ecbbf 100644
--- a/router/java/src/net/i2p/router/JobQueue.java
+++ b/router/java/src/net/i2p/router/JobQueue.java
@@ -245,7 +245,7 @@ public class JobQueue {
             _jobLock.notifyAll();
         }
         if (_log.shouldLog(Log.WARN)) {
-            StringBuffer buf = new StringBuffer(1024);
+            StringBuilder buf = new StringBuilder(1024);
             buf.append("current jobs: \n");
             for (Iterator iter = _queueRunners.values().iterator(); iter.hasNext(); ) {
                 JobQueueRunner runner = (JobQueueRunner)iter.next();
@@ -587,7 +587,7 @@ public class JobQueue {
             numRunners = _queueRunners.size();
         }
         
-        StringBuffer str = new StringBuffer(128);
+        StringBuilder str = new StringBuilder(128);
         str.append("<!-- after queueRunner sync: states: ");
         for (int i = 0; states != null && i < states.length; i++)
             str.append(states[i]).append(" ");
@@ -606,7 +606,7 @@ public class JobQueue {
         out.write("<!-- jobQueue rendering: after jobLock sync -->\n");
         out.flush();
         
-        StringBuffer buf = new StringBuffer(32*1024);
+        StringBuilder buf = new StringBuilder(32*1024);
         buf.append("<h2>JobQueue</h2>");
         buf.append("# runners: ").append(numRunners).append(" [states=");
         if (states != null) 
@@ -667,7 +667,7 @@ public class JobQueue {
     }
     
     /** render the HTML for the job stats */
-    private void getJobStats(StringBuffer buf) { 
+    private void getJobStats(StringBuilder buf) { 
         buf.append("<table border=\"1\">\n");
         buf.append("<tr><th>Job</th><th>Runs</th>");
         buf.append("<th>Time</th><th><i>Avg</i></th><th><i>Max</i></th><th><i>Min</i></th>");
diff --git a/router/java/src/net/i2p/router/JobStats.java b/router/java/src/net/i2p/router/JobStats.java
index ec571299311603df7e0e13c74999b8e1d6019931..148fb7410f096a99d7b59f2ef2a245b42c95e25f 100644
--- a/router/java/src/net/i2p/router/JobStats.java
+++ b/router/java/src/net/i2p/router/JobStats.java
@@ -77,7 +77,7 @@ class JobStats {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("Over ").append(getRuns()).append(" runs, job <b>").append(getName()).append("</b> took ");
         buf.append(getTotalTime()).append("ms (").append(getAvgTime()).append("ms/").append(getMaxTime()).append("ms/");
         buf.append(getMinTime()).append("ms avg/max/min) after a total lag of ");
diff --git a/router/java/src/net/i2p/router/MessageHistory.java b/router/java/src/net/i2p/router/MessageHistory.java
index f875c03b31ab514fbb33e3a64b7e00231fd534a8..a116aaca7cc209cc889ad894d9d31dc1af2522a3 100644
--- a/router/java/src/net/i2p/router/MessageHistory.java
+++ b/router/java/src/net/i2p/router/MessageHistory.java
@@ -144,7 +144,7 @@ public class MessageHistory {
      */
     public void requestTunnelCreate(TunnelId createTunnel, TunnelId outTunnel, Hash peerRequested, Hash nextPeer, TunnelId replyTunnel, Hash replyThrough) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("request [").append(getName(peerRequested)).append("] to create tunnel [");
         buf.append(createTunnel.getTunnelId()).append("] ");
@@ -169,7 +169,7 @@ public class MessageHistory {
      */
     public void receiveTunnelCreate(TunnelId createTunnel, Hash nextPeer, Date expire, boolean ok, Hash sourceRoutePeer) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("receive tunnel create [").append(createTunnel.getTunnelId()).append("] ");
         if (nextPeer != null)
@@ -187,7 +187,7 @@ public class MessageHistory {
     public void tunnelJoined(String state, TunnelInfo tunnel) {
         if (!_doLog) return;
         if (tunnel == null) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("joining as [").append(state);
         buf.append("] to tunnel: ").append(tunnel.toString());
@@ -203,7 +203,7 @@ public class MessageHistory {
     public void tunnelJoined(String state, HopConfig tunnel) {
         if (!_doLog) return;
         if (tunnel == null) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("joining as [").append(state);
         buf.append("] to tunnel: ").append(tunnel.toString());
@@ -242,7 +242,7 @@ public class MessageHistory {
     public void tunnelFailed(TunnelId tunnel) {
         if (!_doLog) return;
         if (tunnel == null) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("failing tunnel [").append(tunnel.getTunnelId()).append("]");
         addEntry(buf.toString());
@@ -258,7 +258,7 @@ public class MessageHistory {
     public void tunnelValid(TunnelInfo tunnel, long timeToTest) {
         if (!_doLog) return;
         if (tunnel == null) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("tunnel ").append(tunnel).append(" tested ok after ").append(timeToTest).append("ms");
         addEntry(buf.toString());
@@ -271,7 +271,7 @@ public class MessageHistory {
     public void tunnelRejected(Hash peer, TunnelId tunnel, Hash replyThrough, String reason) {
         if (!_doLog) return;
         if ( (tunnel == null) || (peer == null) ) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("tunnel [").append(tunnel.getTunnelId()).append("] was rejected by [");
         buf.append(getName(peer)).append("] for [").append(reason).append("]");
@@ -283,7 +283,7 @@ public class MessageHistory {
     public void tunnelParticipantRejected(Hash peer, String msg) {
         if (!_doLog) return;
         if (peer == null) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("tunnel participation rejected by [");
         buf.append(getName(peer)).append("]: ").append(msg);
@@ -298,7 +298,7 @@ public class MessageHistory {
     public void tunnelRequestTimedOut(Hash peer, TunnelId tunnel) {
         if (!_doLog) return;
         if ( (tunnel == null) || (peer == null) ) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("tunnel [").append(tunnel.getTunnelId()).append("] timed out on [");
         buf.append(getName(peer)).append("]");
@@ -314,7 +314,7 @@ public class MessageHistory {
      */
     public void droppedTunnelMessage(TunnelId id, long msgId, Date expiration, Hash from) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("dropped message ").append(msgId).append(" for unknown tunnel [").append(id.getTunnelId());
         buf.append("] from [").append(getName(from)).append("]").append(" expiring on ");
@@ -328,7 +328,7 @@ public class MessageHistory {
     public void droppedOtherMessage(I2NPMessage message, Hash from) {
         if (!_doLog) return;
         if (message == null) return;
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append(getPrefix());
         buf.append("dropped [").append(message.getClass().getName()).append("] ").append(message.getUniqueId());
         buf.append(" [").append(message.toString()).append("] from [");
@@ -342,7 +342,7 @@ public class MessageHistory {
     
     public void droppedInboundMessage(long messageId, Hash from, String info) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append(getPrefix());
         buf.append("dropped inbound message ").append(messageId);
         buf.append(" from ");
@@ -364,7 +364,7 @@ public class MessageHistory {
     public void replyTimedOut(OutNetMessage sentMessage) {
         if (!_doLog) return;
         if (sentMessage == null) return;
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append(getPrefix());
         buf.append("timed out waiting for a reply to [").append(sentMessage.getMessageType());
         buf.append("] [").append(sentMessage.getMessageId()).append("] expiring on [");
@@ -383,7 +383,7 @@ public class MessageHistory {
      */
     public void messageProcessingError(long messageId, String messageType, String error) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("Error processing [").append(messageType).append("] [").append(messageId).append("] failed with [").append(error).append("]");
         addEntry(buf.toString());
@@ -420,7 +420,7 @@ public class MessageHistory {
     public void sendMessage(String messageType, long messageId, long expiration, Hash peer, boolean sentOk, String info) {
         if (!_doLog) return;
         if (false) return;
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append(getPrefix());
         buf.append("send [").append(messageType).append("] message [").append(messageId).append("] ");
         buf.append("to [").append(getName(peer)).append("] ");
@@ -448,7 +448,7 @@ public class MessageHistory {
     public void receiveMessage(String messageType, long messageId, long expiration, Hash from, boolean isValid) {
         if (!_doLog) return;
         if (false) return;
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append(getPrefix());
         buf.append("receive [").append(messageType).append("] with id [").append(messageId).append("] ");
         if (from != null)
@@ -470,7 +470,7 @@ public class MessageHistory {
      */
     public void wrap(String bodyMessageType, long bodyMessageId, String containerMessageType, long containerMessageId) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("Wrap message [").append(bodyMessageType).append("] id [").append(bodyMessageId).append("] ");
         buf.append("in [").append(containerMessageType).append("] id [").append(containerMessageId).append("]");
@@ -483,7 +483,7 @@ public class MessageHistory {
      */
     public void receivePayloadMessage(long messageId) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append(getPrefix());
         buf.append("Receive payload message [").append(messageId).append("]");
         addEntry(buf.toString());
@@ -498,7 +498,7 @@ public class MessageHistory {
      */
     public void sendPayloadMessage(long messageId, boolean successfullySent, long timeToSend) {
         if (!_doLog) return;
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(getPrefix());
         buf.append("Send payload message in [").append(messageId).append("] in [").append(timeToSend).append("] successfully? ").append(successfullySent);
         addEntry(buf.toString());
@@ -507,7 +507,7 @@ public class MessageHistory {
     public void receiveTunnelFragment(long messageId, int fragmentId, Object status) {
         if (!_doLog) return;
         if (messageId == -1) throw new IllegalArgumentException("why are you -1?");
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getPrefix());
         buf.append("Receive fragment ").append(fragmentId).append(" in ").append(messageId);
         buf.append(" status: ").append(status.toString());
@@ -516,7 +516,7 @@ public class MessageHistory {
     public void receiveTunnelFragmentComplete(long messageId) {
         if (!_doLog) return;
         if (messageId == -1) throw new IllegalArgumentException("why are you -1?");
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getPrefix());
         buf.append("Receive fragmented message completely: ").append(messageId);
         addEntry(buf.toString());
@@ -524,7 +524,7 @@ public class MessageHistory {
     public void droppedFragmentedMessage(long messageId, String status) {
         if (!_doLog) return;
         if (messageId == -1) throw new IllegalArgumentException("why are you -1?");
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getPrefix());
         buf.append("Fragmented message dropped: ").append(messageId);
         buf.append(" ").append(status);
@@ -533,7 +533,7 @@ public class MessageHistory {
     public void fragmentMessage(long messageId, int numFragments, int totalLength, List messageIds, String msg) {
         if (!_doLog) return;
         //if (messageId == -1) throw new IllegalArgumentException("why are you -1?");
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getPrefix());
         buf.append("Break message ").append(messageId).append(" into fragments: ").append(numFragments);
         buf.append(" total size ").append(totalLength);
@@ -545,7 +545,7 @@ public class MessageHistory {
     public void fragmentMessage(long messageId, int numFragments, int totalLength, List messageIds, Object tunnel, String msg) {
         if (!_doLog) return;
         //if (messageId == -1) throw new IllegalArgumentException("why are you -1?");
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getPrefix());
         buf.append("Break message ").append(messageId).append(" into fragments: ").append(numFragments);
         buf.append(" total size ").append(totalLength);
@@ -559,7 +559,7 @@ public class MessageHistory {
     public void droppedTunnelDataMessageUnknown(long msgId, long tunnelId) {
         if (!_doLog) return;
         if (msgId == -1) throw new IllegalArgumentException("why are you -1?");
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getPrefix());
         buf.append("Dropped data message ").append(msgId).append(" for unknown tunnel ").append(tunnelId);
         addEntry(buf.toString());
@@ -567,7 +567,7 @@ public class MessageHistory {
     public void droppedTunnelGatewayMessageUnknown(long msgId, long tunnelId) {
         if (!_doLog) return;
         if (msgId == -1) throw new IllegalArgumentException("why are you -1?");
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getPrefix());
         buf.append("Dropped gateway message ").append(msgId).append(" for unknown tunnel ").append(tunnelId);
         addEntry(buf.toString());
@@ -585,7 +585,7 @@ public class MessageHistory {
     }
     
     private final String getPrefix() {
-        StringBuffer buf = new StringBuffer(48);
+        StringBuilder buf = new StringBuilder(48);
         buf.append(getTime(_context.clock().now()));
         buf.append(' ').append(_localIdent).append(": ");
         return buf.toString();
diff --git a/router/java/src/net/i2p/router/MultiRouterBuilder.java b/router/java/src/net/i2p/router/MultiRouterBuilder.java
index 9518e4fac7328130f7cfde60551535270575dbc9..6a7c635bc8a3a5731387cf02cbc0edc9b9394bd3 100644
--- a/router/java/src/net/i2p/router/MultiRouterBuilder.java
+++ b/router/java/src/net/i2p/router/MultiRouterBuilder.java
@@ -77,7 +77,7 @@ public class MultiRouterBuilder {
         buildStartupScriptNix(args);
     }
     private static void buildStartupScriptNix(String args[]) {
-        StringBuffer buf = new StringBuffer(4096);
+        StringBuilder buf = new StringBuilder(4096);
         buf.append("#!/bin/sh\n");
         buf.append("export CP=.; for LIB in lib/* ; do export CP=$CP:$LIB ; done\n"); 
         buf.append("nohup java -cp $CP ");
@@ -106,7 +106,7 @@ public class MultiRouterBuilder {
         File baseDir = new File(dir);
         baseDir.mkdirs();
         File cfgFile = new File(baseDir, "router.config");
-        StringBuffer buf = new StringBuffer(8*1024);
+        StringBuilder buf = new StringBuilder(8*1024);
         buf.append("router.profileDir=").append(baseDir.getPath()).append("/peerProfiles\n");
         buf.append("router.historyFilename=").append(baseDir.getPath()).append("/messageHistory.txt\n");
         buf.append("router.sessionKeys.location=").append(baseDir.getPath()).append("/sessionKeys.dat\n");
diff --git a/router/java/src/net/i2p/router/OutNetMessage.java b/router/java/src/net/i2p/router/OutNetMessage.java
index e1cd2a896622d6aa3489375315f843f36ec725b5..39921a5e7a6b580c449a5408166f4fc60672a972 100644
--- a/router/java/src/net/i2p/router/OutNetMessage.java
+++ b/router/java/src/net/i2p/router/OutNetMessage.java
@@ -287,7 +287,7 @@ public class OutNetMessage {
     public void finalize() throws Throwable {
         if (_message != null) {
             if (_log.shouldLog(Log.WARN)) {
-                StringBuffer buf = new StringBuffer(1024);
+                StringBuilder buf = new StringBuilder(1024);
                 buf.append("Undiscarded ").append(_messageSize).append("byte ");
                 buf.append(_messageType).append(" message created ");
                 buf.append((_context.clock().now() - _created)).append("ms ago: ");
@@ -304,7 +304,7 @@ public class OutNetMessage {
     */
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("[OutNetMessage contains ");
         if (_message == null) {
             buf.append("*no message*");
@@ -334,7 +334,7 @@ public class OutNetMessage {
         return buf.toString();
     }
     
-    private void renderTimestamps(StringBuffer buf) {
+    private void renderTimestamps(StringBuilder buf) {
         if (_log.shouldLog(Log.INFO)) {
             synchronized (this) {
                 long lastWhen = -1;
diff --git a/router/java/src/net/i2p/router/PersistentKeyRing.java b/router/java/src/net/i2p/router/PersistentKeyRing.java
index f1f4fe55a117bfb0fb09714b14f41c8aad871b68..9b7ffe0f388609241e51ddad5c8507209931a5cd 100644
--- a/router/java/src/net/i2p/router/PersistentKeyRing.java
+++ b/router/java/src/net/i2p/router/PersistentKeyRing.java
@@ -66,7 +66,7 @@ public class PersistentKeyRing extends KeyRing {
 
     @Override
     public void renderStatusHTML(Writer out) throws IOException {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(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>");
         for (Entry<Hash, SessionKey> e : entrySet()) {
             buf.append("\n<tr><td>");
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 8c918d93ff45445e76bb9f4120323bef9e2aa3bb..1539750adb23688a682840072805abef98e18263 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -589,7 +589,7 @@ public class Router {
                    "</select> <input type=\"submit\" value=\"GO\" /> </form>" +
                    "<hr />\n");
 
-        StringBuffer buf = new StringBuffer(32*1024);
+        StringBuilder buf = new StringBuilder(32*1024);
         
         if ( (_routerInfo != null) && (_routerInfo.getIdentity() != null) )
             buf.append("<b>Router: </b> ").append(_routerInfo.getIdentity().getHash().toBase64()).append("<br />\n");
@@ -762,7 +762,7 @@ public class Router {
     }
     
     private static int MAX_MSG_LENGTH = 120;
-    private static final void appendLogMessage(StringBuffer buf, String msg) {
+    private static final void appendLogMessage(StringBuilder buf, String msg) {
         // disable this code for the moment because i think it
         // looks ugly (on the router console)
         if (true) {
@@ -804,7 +804,7 @@ public class Router {
     
     /** main-ish method for testing appendLogMessage */
     private static final void testAppendLog() {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         Router.appendLogMessage(buf, "hi\nhow are you\nh0h0h0");
         System.out.println("line: [" + buf.toString() + "]");
         buf.setLength(0);
@@ -1005,7 +1005,7 @@ public class Router {
         FileOutputStream fos = null;
         try {
             fos = new FileOutputStream(_configFilename);
-            StringBuffer buf = new StringBuffer(8*1024);
+            StringBuilder buf = new StringBuilder(8*1024);
             synchronized (_config) {
                 TreeSet ordered = new TreeSet(_config.keySet());
                 for (Iterator iter = ordered.iterator() ; iter.hasNext(); ) {
diff --git a/router/java/src/net/i2p/router/RouterContext.java b/router/java/src/net/i2p/router/RouterContext.java
index 656b1299bd5f06372dcb8309c1e4b7b9f1dbf2ea..6dd7282b0d0a0aab4dcb7a4da47a4ad0229f99b1 100644
--- a/router/java/src/net/i2p/router/RouterContext.java
+++ b/router/java/src/net/i2p/router/RouterContext.java
@@ -268,7 +268,7 @@ public class RouterContext extends I2PAppContext {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("RouterContext: ").append(super.toString()).append('\n');
         buf.append(_router).append('\n');
         buf.append(_clientManagerFacade).append('\n');
diff --git a/router/java/src/net/i2p/router/Shitlist.java b/router/java/src/net/i2p/router/Shitlist.java
index 4e94090a4bf0b91af03413abeb1035aa5736fa47..6f38826b3c348373f5e6c7f1b35f5aea96ee8590 100644
--- a/router/java/src/net/i2p/router/Shitlist.java
+++ b/router/java/src/net/i2p/router/Shitlist.java
@@ -252,7 +252,7 @@ public class Shitlist {
     }
 
     public void renderStatusHTML(Writer out) throws IOException {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("<h2>Shitlist</h2>");
         Map<Hash, Entry> entries = new TreeMap(new HashComparator());
         
diff --git a/router/java/src/net/i2p/router/StatisticsManager.java b/router/java/src/net/i2p/router/StatisticsManager.java
index df51e36b465d24cfd0e3c1a72c8dc95d0d72e4ad..a3c54458aa92676aea1feebd5a7fbbccbd3ae7a4 100644
--- a/router/java/src/net/i2p/router/StatisticsManager.java
+++ b/router/java/src/net/i2p/router/StatisticsManager.java
@@ -200,7 +200,7 @@ public class StatisticsManager implements Service {
     }
     
     private String renderRate(Rate rate, boolean fudgeQuantity) {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(num(rate.getAverageValue())).append(';');
         buf.append(num(rate.getExtremeAverageValue())).append(';');
         buf.append(pct(rate.getPercentageOfLifetimeValue())).append(';');
@@ -259,7 +259,7 @@ public class StatisticsManager implements Service {
     }
     
     private String renderRate(Rate rate, double fudgeQuantity) {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(num(rate.getAverageValue())).append(';');
         buf.append(num(rate.getExtremeAverageValue())).append(';');
         buf.append(pct(rate.getPercentageOfLifetimeValue())).append(';');
diff --git a/router/java/src/net/i2p/router/TunnelPoolSettings.java b/router/java/src/net/i2p/router/TunnelPoolSettings.java
index fab33d919a077b1d5af69126aca2e734f66fcc2b..bf7eb0638b8cb79be39bbfefb935af04eceb2ee8 100644
--- a/router/java/src/net/i2p/router/TunnelPoolSettings.java
+++ b/router/java/src/net/i2p/router/TunnelPoolSettings.java
@@ -187,7 +187,7 @@ public class TunnelPoolSettings {
 
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         Properties p = new Properties();
         writeToProperties("", p);
         buf.append("Tunnel pool settings:\n");
diff --git a/router/java/src/net/i2p/router/admin/AdminRunner.java b/router/java/src/net/i2p/router/admin/AdminRunner.java
index c515f897692f93d11b30fd6c68caa72f1d168e23..2851d7d867b9d4e9f965c90289bcdb3b2fafdfca 100644
--- a/router/java/src/net/i2p/router/admin/AdminRunner.java
+++ b/router/java/src/net/i2p/router/admin/AdminRunner.java
@@ -73,7 +73,7 @@ class AdminRunner implements Runnable {
     }
     
     private void reply(OutputStream out, String content) throws IOException {
-        StringBuffer reply = new StringBuffer(10240);
+        StringBuilder reply = new StringBuilder(10240);
         reply.append("HTTP/1.1 200 OK\n");
         reply.append("Connection: close\n");
         reply.append("Cache-control: no-cache\n");
@@ -90,7 +90,7 @@ class AdminRunner implements Runnable {
     }
     
     private void replyText(OutputStream out, String content) throws IOException {
-        StringBuffer reply = new StringBuffer(10240);
+        StringBuilder reply = new StringBuilder(10240);
         reply.append("HTTP/1.1 200 OK\n");
         reply.append("Connection: close\n");
         reply.append("Cache-control: no-cache\n");
diff --git a/router/java/src/net/i2p/router/admin/StatsGenerator.java b/router/java/src/net/i2p/router/admin/StatsGenerator.java
index cb2b49ac50004fe47572f6e86f8d8d7869df960b..5bfbb64ee29236825e618134d54429ae7c1bb424 100644
--- a/router/java/src/net/i2p/router/admin/StatsGenerator.java
+++ b/router/java/src/net/i2p/router/admin/StatsGenerator.java
@@ -28,7 +28,7 @@ public class StatsGenerator {
     }
     
     public void generateStatsPage(Writer out) throws IOException {
-        StringBuffer buf = new StringBuffer(16*1024);
+        StringBuilder buf = new StringBuilder(16*1024);
         buf.append("<h1>Router statistics</h1><hr />");
         buf.append("<form action=\"/oldstats.jsp\">");
         buf.append("<select name=\"go\" onChange='location.href=this.value'>");
@@ -94,7 +94,7 @@ public class StatsGenerator {
         out.flush();
     }
     
-    private void renderFrequency(String name, StringBuffer buf) {
+    private void renderFrequency(String name, StringBuilder buf) {
         FrequencyStat freq = _context.statManager().getFrequency(name);
         buf.append("<i>");
         buf.append(freq.getDescription());
@@ -130,7 +130,7 @@ public class StatsGenerator {
         buf.append("<br />");
     }
     
-    private void renderRate(String name, StringBuffer buf) {
+    private void renderRate(String name, StringBuilder buf) {
         RateStat rate = _context.statManager().getRate(name);
         String d = rate.getDescription();
         if (! "".equals(d)) {
@@ -223,7 +223,7 @@ public class StatsGenerator {
         buf.append("<br />");
     }
     
-    private static void renderPeriod(StringBuffer buf, long period, String name) {
+    private static void renderPeriod(StringBuilder buf, long period, String name) {
         buf.append("<b>");
         buf.append(DataHelper.formatDuration(period));
         buf.append(" ");
diff --git a/router/java/src/net/i2p/router/client/ClientManager.java b/router/java/src/net/i2p/router/client/ClientManager.java
index e58f16b2623a06d18473e4cf8612e6e565977da5..b042d524015cbaf3aeb792a6f3c82ac9d92583b0 100644
--- a/router/java/src/net/i2p/router/client/ClientManager.java
+++ b/router/java/src/net/i2p/router/client/ClientManager.java
@@ -387,7 +387,7 @@ public class ClientManager {
     }
     
     public void renderStatusHTML(Writer out) throws IOException {
-        StringBuffer buf = new StringBuffer(8*1024);
+        StringBuilder buf = new StringBuilder(8*1024);
         buf.append("<u><b>Local destinations</b></u><br />");
         
         Map runners = null;
diff --git a/router/java/src/net/i2p/router/message/CloveSet.java b/router/java/src/net/i2p/router/message/CloveSet.java
index d18aa55b44baed89829747cf5e0b0b4475ec8784..8c414edcdedd861d9f2ef2fd3d348610a8b80819 100644
--- a/router/java/src/net/i2p/router/message/CloveSet.java
+++ b/router/java/src/net/i2p/router/message/CloveSet.java
@@ -44,7 +44,7 @@ public class CloveSet {
     
     @Override
     public String toString() { 
-	StringBuffer buf = new StringBuffer(128);
+	StringBuilder buf = new StringBuilder(128);
 	buf.append("{");
 	for (int i = 0; i < _cloves.size(); i++) {
 	    GarlicClove clove = (GarlicClove)_cloves.get(i);
diff --git a/router/java/src/net/i2p/router/message/GarlicConfig.java b/router/java/src/net/i2p/router/message/GarlicConfig.java
index ead346e0067f239af6f7caca0acdab0f66f549e9..1c616f43cfb59be51e006109830ae3c559f006b8 100644
--- a/router/java/src/net/i2p/router/message/GarlicConfig.java
+++ b/router/java/src/net/i2p/router/message/GarlicConfig.java
@@ -158,7 +158,7 @@ public class GarlicConfig {
     private final static String NL = System.getProperty("line.separator");
     @Override
     public String toString() {
-	StringBuffer buf = new StringBuffer();
+	StringBuilder buf = new StringBuilder();
 	buf.append("<garlicConfig>").append(NL);
 	buf.append("<certificate>").append(getCertificate()).append("</certificate>").append(NL);
 	buf.append("<instructions>").append(getDeliveryInstructions()).append("</instructions>").append(NL);
diff --git a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
index 2b2a8f9c88741c865d0a6640bf2e0e7d6d9d45a5..a5e8368d3438355c4773bd3c64f32e05f6657679 100644
--- a/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
+++ b/router/java/src/net/i2p/router/message/PayloadGarlicConfig.java
@@ -35,7 +35,7 @@ public class PayloadGarlicConfig extends GarlicConfig {
  
     @Override
     protected String getSubData() { 
-	StringBuffer buf = new StringBuffer();
+	StringBuilder buf = new StringBuilder();
 	buf.append("<payloadMessage>").append(_payload).append("</payloadMessage>");
 	return buf.toString(); 
     }
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 c6668a41e4fcefd5527dce2c5f0682228202cb2e..58e6b16c4c2e5b0858aa50b93460a6175525343f 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketImpl.java
@@ -330,7 +330,7 @@ class KBucketImpl implements KBucket {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("KBucketImpl: ");
         synchronized (_entries) {
             buf.append(_entries.toString()).append("\n");
@@ -380,7 +380,7 @@ class KBucketImpl implements KBucket {
     }
     
     private static void testRand() {
-        StringBuffer buf = new StringBuffer(2048);
+        StringBuilder buf = new StringBuilder(2048);
         int low = 1;
         int high = 3;
         Log log = I2PAppContext.getGlobalContext().logManager().getLog(KBucketImpl.class);
@@ -416,7 +416,7 @@ class KBucketImpl implements KBucket {
     
     private static void testRand2() {
         Log log = I2PAppContext.getGlobalContext().logManager().getLog(KBucketImpl.class);
-        StringBuffer buf = new StringBuffer(1024*1024*16);
+        StringBuilder buf = new StringBuilder(1024*1024*16);
         int low = 1;
         int high = 200;
         byte hash[] = new byte[Hash.HASH_LENGTH];
@@ -452,7 +452,7 @@ class KBucketImpl implements KBucket {
     
     private final static String toString(byte b[]) {
         if (true) return DataHelper.toHexString(b);
-        StringBuffer buf = new StringBuffer(b.length);
+        StringBuilder buf = new StringBuilder(b.length);
         for (int i = 0; i < b.length; i++) {
             buf.append(toString(b[i]));
             buf.append(" ");
@@ -461,7 +461,7 @@ class KBucketImpl implements KBucket {
     }
     
     private final static String toString(byte b) {
-        StringBuffer buf = new StringBuffer(8);
+        StringBuilder buf = new StringBuilder(8);
         for (int i = 7; i >= 0; i--) {
             boolean bb = (0 != (b & (1<<i)));
             if (bb)
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 ddbfb06f7f176a35a51fb976aafa8877c32426f2..c17292bdd4dfa769e8b8f2601c1fc9ce17c2628d 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KBucketSet.java
@@ -141,7 +141,7 @@ class KBucketSet {
     @Override
     public String toString() {
         BigInteger us = new BigInteger(1, _us.getData());
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         buf.append("Bucket set rooted on: ").append(us.toString()).append(" (aka ").append(us.toString(2)).append("): \n");
         for (int i = 0; i < NUM_BUCKETS; i++) {
             buf.append("* Bucket ").append(i).append("/").append(NUM_BUCKETS-1).append(": )\n");
@@ -159,7 +159,7 @@ class KBucketSet {
             System.arraycopy(b, 0, val, Hash.HASH_LENGTH-b.length-1, b.length);
         else
             System.arraycopy(b, Hash.HASH_LENGTH-b.length, val, 0, val.length);
-        StringBuffer buf = new StringBuffer(KEYSIZE_BITS);
+        StringBuilder buf = new StringBuilder(KEYSIZE_BITS);
         for (int i = 0; i < val.length; i++) {
             for (int j = 7; j >= 0; j--) {
                 boolean bb = (0 != (val[i] & (1<<j)));
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 e61a5855414b9b869941ef72b023a84875da9c8f..7650397700d43a4d7ed7222c337d3d56467be45f 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/KademliaNetworkDatabaseFacade.java
@@ -910,7 +910,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
 
     @Override
     public void renderRouterInfoHTML(Writer out, String routerPrefix) throws IOException {
-        StringBuffer buf = new StringBuffer(4*1024);
+        StringBuilder buf = new StringBuilder(4*1024);
         buf.append("<h2>Network Database RouterInfo Lookup</h2>\n");
         if (".".equals(routerPrefix)) {
             renderRouterInfo(buf, _context.router().getRouterInfo(), true, true);
@@ -938,7 +938,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
 
     @Override
     public void renderLeaseSetHTML(Writer out) throws IOException {
-        StringBuffer buf = new StringBuffer(4*1024);
+        StringBuilder buf = new StringBuilder(4*1024);
         buf.append("<h2>Network Database Contents</h2>\n");
         buf.append("<a href=\"netdb.jsp\">View RouterInfo</a>");
         buf.append("<h3>LeaseSets</h3>\n");
@@ -992,7 +992,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         int size = getKnownRouters() * 512;
         if (full)
             size *= 4;
-        StringBuffer buf = new StringBuffer(size);
+        StringBuilder buf = new StringBuilder(size);
         out.write("<h2>Network Database Contents</h2>\n");
         if (!_initialized) {
             buf.append("<i>Not initialized</i>\n");
@@ -1073,7 +1073,7 @@ public class KademliaNetworkDatabaseFacade extends NetworkDatabaseFacade {
         out.flush();
     }
     
-    private void renderRouterInfo(StringBuffer buf, RouterInfo info, boolean isUs, boolean full) {
+    private void renderRouterInfo(StringBuilder buf, RouterInfo info, boolean isUs, boolean full) {
         String hash = info.getIdentity().getHash().toBase64();
         buf.append("<a name=\"").append(hash.substring(0, 6)).append("\" />");
         if (isUs) {
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 a12f58fd74e5f377f5a620ae7b15dc72eb589ec8..6fe5831ddfa2b83bf1e59342a0fd9a09a35cd3a7 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/SearchState.java
@@ -168,7 +168,7 @@ class SearchState {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append("Searching for ").append(_searchKey);
         buf.append(" ");
         if (_completed <= 0)
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 e8f0eca7ea290d66d5e21ee10a1ea1db2f9e34d2..de9f946b932ce47a7f486141211f641082f43b50 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreMessageSelector.java
@@ -57,7 +57,7 @@ class StoreMessageSelector implements MessageSelector {
 
     @Override
     public String toString() {
-        StringBuffer rv = new StringBuffer(64);
+        StringBuilder rv = new StringBuilder(64);
         rv.append("Waiting for netDb confirm from ").append(_peer.toBase64()).append(", found? ");
         rv.append(_found).append(" waiting for ").append(_waitingForId);
         return rv.toString();
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 184c337a9bc587436a37842ea35b2be1ad273514..91e7687ba3c020d5b1846acb3c89c110aee5f4e8 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/StoreState.java
@@ -149,7 +149,7 @@ class StoreState {
 
     @Override
     public String toString() { 
-        StringBuffer buf = new StringBuffer(256);
+        StringBuilder buf = new StringBuilder(256);
         buf.append("Storing ").append(_key);
         buf.append(" ");
         if (_completed <= 0)
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 ace0a9666ec22100db5127b738cd3a8912c617ac..a09bc4860c69e1bad3816bef6725e768ee72d0bc 100644
--- a/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
+++ b/router/java/src/net/i2p/router/networkdb/kademlia/TransientDataStore.java
@@ -147,7 +147,7 @@ class TransientDataStore implements DataStore {
     }
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer();
+        StringBuilder buf = new StringBuilder();
         buf.append("Transient DataStore: ").append(_data.size()).append("\nKeys: ");
         for (Map.Entry<Hash, DataStructure> e : _data.entrySet()) {
             Hash key = e.getKey();
diff --git a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
index bcecf0753ab1f0ba0f596d59b21f9c512af15432..71eca220a7fbe319d8bfc455384234b0f158ea25 100644
--- a/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
+++ b/router/java/src/net/i2p/router/networkdb/reseed/Reseeder.java
@@ -34,7 +34,10 @@ public class Reseeder {
     // Reject unreasonably big files, because we download into a ByteArrayOutputStream.
     private static final long MAX_RESEED_RESPONSE_SIZE = 8 * 1024 * 1024;
 
-    private static final String DEFAULT_SEED_URL = "http://i2pdb.tin0.de/netDb/,http://netdb.i2p2.de/";
+    private static final String DEFAULT_SEED_URL = "http://netdb.i2p2.de/,http://b.netdb.i2p2.de/";
+    private static final String PROP_INPROGRESS = "net.i2p.router.web.ReseedHandler.reseedInProgress";
+    private static final String PROP_ERROR = "net.i2p.router.web.ReseedHandler.errorMessage";
+    private static final String PROP_STATUS = "net.i2p.router.web.ReseedHandler.statusMessage";
 
     public Reseeder(RouterContext ctx) {
         _context = ctx;
@@ -48,7 +51,7 @@ public class Reseeder {
             if (_reseedRunner.isRunning()) {
                 return;
             } else {
-                System.setProperty("net.i2p.router.web.Reseeder.reseedInProgress", "true");
+                System.setProperty(PROP_INPROGRESS, "true");
                 I2PThread reseed = new I2PThread(_reseedRunner, "Reseed");
                 reseed.start();
             }
@@ -61,7 +64,7 @@ public class Reseeder {
 
         public ReseedRunner() {
             _isRunning = false; 
-            System.setProperty("net.i2p.router.web.Reseeder.statusMessage","Reseeding.");
+            System.setProperty(PROP_STATUS, "Reseeding.");
         }
         public boolean isRunning() { return _isRunning; }
         public void run() {
@@ -69,7 +72,7 @@ public class Reseeder {
             System.out.println("Reseed start");
             reseed(false);
             System.out.println("Reseed complete");
-            System.setProperty("net.i2p.router.web.Reseeder.reseedInProgress", "false");
+            System.setProperty(PROP_INPROGRESS, "false");
             _isRunning = false;
         }
 
@@ -126,13 +129,13 @@ public class Reseeder {
         private void reseedOne(String seedURL, boolean echoStatus) {
 
             try {
-                System.setProperty("net.i2p.router.web.Reseeder.errorMessage","");
-                System.setProperty("net.i2p.router.web.Reseeder.statusMessage","Reseeding: fetching seed URL.");
+                System.setProperty(PROP_ERROR, "");
+                System.setProperty(PROP_STATUS, "Reseeding: fetching seed URL.");
                 System.err.println("Reseed from " + seedURL);
                 URL dir = new URL(seedURL);
                 byte contentRaw[] = readURL(dir);
                 if (contentRaw == null) {
-                    System.setProperty("net.i2p.router.web.Reseeder.errorMessage",
+                    System.setProperty(PROP_ERROR,
                         "Last reseed failed fully (failed reading seed URL). " +
                         RESEED_TIPS);
                     // Logging deprecated here since attemptFailed() provides better info
@@ -158,7 +161,7 @@ public class Reseeder {
                 }
                 if (total <= 0) {
                     _log.error("Read " + contentRaw.length + " bytes from seed " + seedURL + ", but found no routerInfo URLs.");
-                    System.setProperty("net.i2p.router.web.Reseeder.errorMessage",
+                    System.setProperty(PROP_ERROR,
                         "Last reseed failed fully (no routerInfo URLs at seed URL). " +
                         RESEED_TIPS);
                     return;
@@ -171,7 +174,7 @@ public class Reseeder {
                 // 200 max from one URL
                 for (Iterator iter = urlList.iterator(); iter.hasNext() && fetched < 200; ) {
                     try {
-                        System.setProperty("net.i2p.router.web.Reseeder.statusMessage",
+                        System.setProperty(PROP_STATUS,
                             "Reseeding: fetching router info from seed URL (" +
                             fetched + " successful, " + errors + " errors, " + total + " total).");
 
@@ -193,12 +196,12 @@ public class Reseeder {
                 // Less than 10% of failures is considered success,
                 // because some routerInfos will always fail.
                 if ((failPercent >= 10) && (failPercent < 90)) {
-                    System.setProperty("net.i2p.router.web.Reseeder.errorMessage",
+                    System.setProperty(PROP_ERROR,
                         "Last reseed failed partly (" + failPercent + "% of " + total + "). " +
                         RESEED_TIPS);
                 }
                 if (failPercent >= 90) {
-                    System.setProperty("net.i2p.router.web.Reseeder.errorMessage",
+                    System.setProperty(PROP_ERROR,
                         "Last reseed failed (" + failPercent + "% of " + total + "). " +
                         RESEED_TIPS);
                 }
@@ -208,7 +211,7 @@ public class Reseeder {
                 if (fetched >= 100)
                     _isRunning = false;
             } catch (Throwable t) {
-                System.setProperty("net.i2p.router.web.Reseeder.errorMessage",
+                System.setProperty(PROP_ERROR,
                     "Last reseed failed fully (exception caught). " +
                     RESEED_TIPS);
                 _log.error("Error reseeding", t);
diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java
index 2c4448be890d74dd380533eaf30cd09b750fd948..b941e6faaf55381fe307c4f5b9fb50268244b4da 100644
--- a/router/java/src/net/i2p/router/peermanager/DBHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java
@@ -165,7 +165,7 @@ public class DBHistory {
     private final static String NL = System.getProperty("line.separator");
     
     public void store(OutputStream out) throws IOException {
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append(NL);
         buf.append("#################").append(NL);
         buf.append("# DB history").append(NL);
@@ -186,7 +186,7 @@ public class DBHistory {
         _invalidReplyRate.store(out, "dbHistory.invalidReplyRate");
     }
     
-    private void add(StringBuffer buf, String name, long val, String description) {
+    private void add(StringBuilder buf, String name, long val, String description) {
         buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL);
         buf.append("dbHistory.").append(name).append('=').append(val).append(NL).append(NL);
     }
diff --git a/router/java/src/net/i2p/router/peermanager/PeerProfile.java b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
index ec05f69f61e09e5f881ec8adf7b9f79f6a546179..5a5d51eedd266b9f2e2ff01032cc50c22acf0b9d 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerProfile.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerProfile.java
@@ -297,7 +297,7 @@ public class PeerProfile {
             }
             
             if (_log.shouldLog(Log.DEBUG) ) {
-                StringBuffer buf = new StringBuffer(128);
+                StringBuilder buf = new StringBuilder(128);
                 buf.append("Updating 1m throughput after ").append(size).append(" to ");
                 for (int i = 0; i < THROUGHPUT_COUNT; i++)
                     buf.append(_peakTunnel1mThroughput[i]).append(',');
@@ -509,7 +509,7 @@ public class PeerProfile {
         fmt.setPositivePrefix("+");
         ProfilePersistenceHelper helper = new ProfilePersistenceHelper(ctx);
         try { Thread.sleep(5*1000); } catch (InterruptedException e) {}
-        StringBuffer buf = new StringBuffer(1024);
+        StringBuilder buf = new StringBuilder(1024);
         for (int i = 0; i < args.length; i++) {
             PeerProfile profile = helper.readProfile(new File(args[i]));
             if (profile == null) {
diff --git a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
index c4ba39db59447f63971753d99313809c25e5419c..89a3572f921b043d207b024c647445056f0671e4 100644
--- a/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
+++ b/router/java/src/net/i2p/router/peermanager/PeerTestJob.java
@@ -224,7 +224,7 @@ public class PeerTestJob extends JobImpl {
         public boolean matchFound() { return _matchFound; }
         @Override
         public String toString() {
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("Test peer ").append(_peer.toBase64().substring(0,4));
             buf.append(" with nonce ").append(_nonce);
             return buf.toString();
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
index df7691bd16a44d45482a4e51f217bdd7c95098c8..1c40b003dbf4436ce5d93ffebf65bacde1c88255 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileManagerImpl.java
@@ -304,7 +304,7 @@ public class ProfileManagerImpl implements ProfileManager {
             PeerProfile prof = getProfile(peer);
             if (prof == null) continue;
             
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             
             buf.append("status: ");
             if (_context.profileOrganizer().isFast(peer)) {
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
index b0de2092d7b4c1bb7fa20f76190109016c8d464f..90792571e33a21580737955d7b2b0830cc53e5a0 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizer.java
@@ -676,7 +676,7 @@ public class ProfileOrganizer {
                        + ", capacity: " + _thresholdCapacityValue + ", speed: " + _thresholdSpeedValue + "]");
             /*****
             if (_log.shouldLog(Log.DEBUG)) {
-                StringBuffer buf = new StringBuffer(512);
+                StringBuilder buf = new StringBuilder(512);
                 for (Iterator iter = _strictCapacityOrder.iterator(); iter.hasNext(); ) {
                     PeerProfile prof = (PeerProfile)iter.next();
                     buf.append('[').append(prof.toString()).append('=').append(prof.getCapacityValue()).append("] ");
diff --git a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
index 20806cca7fa21bd9d2a04586d4cb9c1b8a00204d..4b871962c0ab63feb1777eba2ec5ef69a6cb1f2b 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfileOrganizerRenderer.java
@@ -56,7 +56,7 @@ class ProfileOrganizerRenderer {
         int reliable = 0;
         int integrated = 0;
         int failing = 0;
-        StringBuffer buf = new StringBuffer(16*1024);
+        StringBuilder buf = new StringBuilder(16*1024);
         buf.append("<h2>Peer Profiles</h2>\n");
         buf.append("<p>Showing ").append(order.size()).append(" recent profiles, hiding ").append(peers.size()-order.size()).append(" older profiles</p>");
         buf.append("<table border=\"1\">");
diff --git a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
index e1f265d8f1499c03f30df5f3b2704a36b077019a..e7151314e1985ff9e73f95823e11c836cc32f1c5 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
@@ -89,7 +89,7 @@ class ProfilePersistenceHelper {
                 groups = groups + ", well integrated";
         }
         
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("########################################################################").append(NL);
         buf.append("# profile for ").append(profile.getPeer().toBase64()).append(NL);
         if (_us != null)
diff --git a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
index d43aff6cd4d234d093aa10d4bcbe4c75d0db4cf9..bdf352501e8a8b41ab348feeef97e149414b322d 100644
--- a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
@@ -131,7 +131,7 @@ public class TunnelHistory {
     private final static String NL = System.getProperty("line.separator");
     
     public void store(OutputStream out) throws IOException {
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append(NL);
         buf.append("#################").append(NL);
         buf.append("# Tunnel history").append(NL);
@@ -150,7 +150,7 @@ public class TunnelHistory {
         _failRate.store(out, "tunnelHistory.failRate");
     }
     
-    private void add(StringBuffer buf, String name, long val, String description) {
+    private void add(StringBuilder buf, String name, long val, String description) {
         buf.append("# ").append(name.toUpperCase()).append(NL).append("# ").append(description).append(NL);
         buf.append("tunnels.").append(name).append('=').append(val).append(NL).append(NL);
     }
diff --git a/router/java/src/net/i2p/router/startup/ClientAppConfig.java b/router/java/src/net/i2p/router/startup/ClientAppConfig.java
index f5d48cb1f2dd109612a26463c6e1cfcaaa97096b..70d61f346fe8ad307eb66d0c981699a502ab2698 100644
--- a/router/java/src/net/i2p/router/startup/ClientAppConfig.java
+++ b/router/java/src/net/i2p/router/startup/ClientAppConfig.java
@@ -47,13 +47,15 @@ public class ClientAppConfig {
             cfgFile = new File(ctx.getConfigDir(), clientConfigFile);
         
         // fall back to use router.config's clientApp.* lines
-        if (!cfgFile.exists()) 
+        if (!cfgFile.exists()) {
+            System.out.println("Warning - No client config file " + cfgFile.getAbsolutePath());
             return ctx.router().getConfigMap();
+        }
         
         try {
             DataHelper.loadProps(rv, cfgFile);
         } catch (IOException ioe) {
-            // _log.warn("Error loading the client app properties from " + cfgFile.getName(), ioe);
+            System.out.println("Error loading the client app properties from " + cfgFile.getAbsolutePath() + ' ' + ioe);
         }
         
         return rv;
@@ -99,7 +101,7 @@ public class ClientAppConfig {
         FileOutputStream fos = null;
         try {
             fos = new FileOutputStream(cfgFile);
-            StringBuffer buf = new StringBuffer(2048);
+            StringBuilder buf = new StringBuilder(2048);
             for(int i = 0; i < apps.size(); i++) {
                 ClientAppConfig app = (ClientAppConfig) apps.get(i);
                 buf.append(PREFIX).append(i).append(".main=").append(app.className).append("\n");
diff --git a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java
index 0770241d6b4f66886ef5efce791a3f6e9e25fafd..0f86f5b61b3f02813f9bd96b863d8d211f379f54 100644
--- a/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java
+++ b/router/java/src/net/i2p/router/startup/LoadClientAppsJob.java
@@ -29,6 +29,11 @@ public class LoadClientAppsJob extends JobImpl {
             _loaded = true;
         }
         List apps = ClientAppConfig.getClientApps(getContext());
+        if (apps.size() <= 0) {
+            _log.error("Warning - No client apps or router console configured - we are just a router");
+            System.err.println("Warning - No client apps or router console configured - we are just a router");
+            return;
+        }
         for(int i = 0; i < apps.size(); i++) {
             ClientAppConfig app = (ClientAppConfig) apps.get(i);
             if (app.disabled)
@@ -64,7 +69,7 @@ public class LoadClientAppsJob extends JobImpl {
         List argList = new ArrayList(4);
         if (args != null) {
             char data[] = args.toCharArray();
-            StringBuffer buf = new StringBuffer(32);
+            StringBuilder buf = new StringBuilder(32);
             boolean isQuoted = false;
             for (int i = 0; i < data.length; i++) {
                 switch (data[i]) {
@@ -74,7 +79,7 @@ public class LoadClientAppsJob extends JobImpl {
                             String str = buf.toString().trim();
                             if (str.length() > 0)
                                 argList.add(str);
-                            buf = new StringBuffer(32);
+                            buf = new StringBuilder(32);
                         } else {
                             isQuoted = true;
                         }
@@ -89,7 +94,7 @@ public class LoadClientAppsJob extends JobImpl {
                             String str = buf.toString().trim();
                             if (str.length() > 0)
                                 argList.add(str);
-                            buf = new StringBuffer(32);
+                            buf = new StringBuilder(32);
                         }
                         break;
                     default:
diff --git a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
index 03d3071bb512fcdd24ff56fa53d8b977c77f8a8c..a426c45304e0150d838f6fa013aa6b8df3f39606 100644
--- a/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
+++ b/router/java/src/net/i2p/router/transport/CommSystemFacadeImpl.java
@@ -206,14 +206,15 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
     public final static String PROP_I2NP_NTCP_AUTO_IP = "i2np.ntcp.autoip";
     
     /**
+     * This only creates an address if the hostname AND port are set in router.config,
+     * which should be rare.
+     * Otherwise, notifyReplaceAddress() below takes care of it.
+     * Note this is called both from above and from NTCPTransport.startListening()
+     *
      * This should really be moved to ntcp/NTCPTransport.java, why is it here?
      */
     public static RouterAddress createNTCPAddress(RouterContext ctx) {
         if (!TransportManager.enableNTCP(ctx)) return null;
-        RouterAddress addr = new RouterAddress();
-        addr.setCost(10);
-        addr.setExpiration(null);
-        Properties props = new Properties();
         String name = ctx.router().getConfigSetting(PROP_I2NP_NTCP_HOSTNAME);
         String port = ctx.router().getConfigSetting(PROP_I2NP_NTCP_PORT);
         /*
@@ -236,12 +237,16 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         } catch (NumberFormatException nfe) {
             return null;
         }
+        Properties props = new Properties();
         props.setProperty(NTCPAddress.PROP_HOST, name);
         props.setProperty(NTCPAddress.PROP_PORT, port);
+        RouterAddress addr = new RouterAddress();
+        addr.setCost(10);
+        addr.setExpiration(null);
         addr.setOptions(props);
         addr.setTransportStyle(NTCPTransport.STYLE);
         //if (isNew) {
-            if (false) return null;
+            // why save the same thing?
             ctx.router().setConfigSetting(PROP_I2NP_NTCP_HOSTNAME, name);
             ctx.router().setConfigSetting(PROP_I2NP_NTCP_PORT, port);
             ctx.router().saveConfig();
@@ -334,6 +339,15 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
             }
         } else if (ohost == null || ohost.length() <= 0) {
             return;
+        } else if (enabled.equalsIgnoreCase("true") && status != STATUS_OK) {
+            // UDP transitioned to not-OK, turn off NTCP address
+            // This will commonly happen at startup if we were initially OK
+            // because UPnP was successful, but a subsequent SSU Peer Test determines
+            // we are still firewalled (SW firewall, bad UPnP indication, etc.)
+            if (_log.shouldLog(Log.INFO))
+                _log.info("old: " + ohost + " config: " + name + " new: null");
+            newAddr = null;
+            changed = true;
         }
 
         if (!changed) {
@@ -346,10 +360,12 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
         //
         // really need to fix this so that we can change or create an inbound address
         // without tearing down everything
+        // Especially on disabling the address, we shouldn't tear everything down.
         //
         _log.warn("Halting NTCP to change address");
         t.stopListening();
-        newAddr.setOptions(newProps);
+        if (newAddr != null)
+            newAddr.setOptions(newProps);
         // Wait for NTCP Pumper to stop so we don't end up with two...
         while (t.isAlive()) {
             try { Thread.sleep(5*1000); } catch (InterruptedException ie) {}
@@ -448,7 +464,7 @@ public class CommSystemFacadeImpl extends CommSystemFacade {
     /** Provide a consistent "look" for displaying router IDs in the console */
     public String renderPeerHTML(Hash peer) {
         String h = peer.toBase64().substring(0, 4);
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         String c = getCountry(peer);
         if (c != null) {
             buf.append("<img alt=\"").append(c.toUpperCase()).append("\" title=\"");
diff --git a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
index 1f643b48df7fb23ce21226f8b6dbe15514383852..a4ded13edd6a146770c7154a6852a2a2bd9cee1d 100644
--- a/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
+++ b/router/java/src/net/i2p/router/transport/FIFOBandwidthLimiter.java
@@ -199,8 +199,8 @@ public class FIFOBandwidthLimiter {
     void setInboundBurstBytes(int bytes) { _maxInboundBurst = bytes; }
     void setOutboundBurstBytes(int bytes) { _maxOutboundBurst = bytes; }
     
-    StringBuffer getStatus() {
-        StringBuffer rv = new StringBuffer(64);
+    StringBuilder getStatus() {
+        StringBuilder rv = new StringBuilder(64);
         rv.append("Available: ").append(_availableInbound).append('/').append(_availableOutbound).append(' ');
         rv.append("Max: ").append(_maxInbound).append('/').append(_maxOutbound).append(' ');
         rv.append("Burst: ").append(_unavailableInboundBurst).append('/').append(_unavailableOutboundBurst).append(' ');
@@ -618,7 +618,7 @@ public class FIFOBandwidthLimiter {
     
     public void renderStatusHTML(Writer out) throws IOException {
         long now = now();
-        StringBuffer buf = new StringBuffer(4096);
+        StringBuilder buf = new StringBuilder(4096);
         buf.append("<p><b id=\"bwlim\">Limiter Status:</b><br />").append(getStatus().toString()).append("</p>\n");
         buf.append("<p><b>Pending bandwidth requests:</b><ul>");
         buf.append("<li>Inbound requests: <ol>");
diff --git a/router/java/src/net/i2p/router/transport/GeoIP.java b/router/java/src/net/i2p/router/transport/GeoIP.java
index fb4984978d99b1f7f55aa9740e3342cd6e25628d..185547a319d0e57a4b68292f006886a50262b12e 100644
--- a/router/java/src/net/i2p/router/transport/GeoIP.java
+++ b/router/java/src/net/i2p/router/transport/GeoIP.java
@@ -140,7 +140,7 @@ public class GeoIP {
         FileInputStream in = null;
         try {
             in = new FileInputStream(GeoFile);
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             while (DataHelper.readLine(in, buf)) {
                 try {
                     if (buf.charAt(0) == '#') {
@@ -202,7 +202,7 @@ public class GeoIP {
         FileInputStream in = null;
         try {
             in = new FileInputStream(GeoFile);
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             while (DataHelper.readLine(in, buf) && idx < search.length) {
                 try {
                     if (buf.charAt(0) == '#') {
diff --git a/router/java/src/net/i2p/router/transport/TransportImpl.java b/router/java/src/net/i2p/router/transport/TransportImpl.java
index e6e3c80e50e8e172ab5ac39207be49d49f602d9f..7f27766a76f0bc7333faa61259ceabc9c083f9a3 100644
--- a/router/java/src/net/i2p/router/transport/TransportImpl.java
+++ b/router/java/src/net/i2p/router/transport/TransportImpl.java
@@ -364,7 +364,7 @@ public abstract class TransportImpl implements Transport {
         if (msToReceive > 5000)
             level = Log.WARN;
         if (_log.shouldLog(level)) {
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             buf.append("Message received: ").append(inMsg.getClass().getName());
             buf.append(" / ").append(inMsg.getUniqueId());
             buf.append(" in ").append(msToReceive).append("ms containing ");
diff --git a/router/java/src/net/i2p/router/transport/TransportManager.java b/router/java/src/net/i2p/router/transport/TransportManager.java
index c61ed14f8bfec4f039fc9bdab7854edcbf01664b..d432f80fd2d0e7cd4a585f3896392b414da4ec5e 100644
--- a/router/java/src/net/i2p/router/transport/TransportManager.java
+++ b/router/java/src/net/i2p/router/transport/TransportManager.java
@@ -486,7 +486,7 @@ public class TransportManager implements TransportEventListener {
             Transport t= (Transport)iter.next();
             t.renderStatusHTML(out, urlBase, sortFlags);
         }
-        StringBuffer buf = new StringBuffer(4*1024);
+        StringBuilder buf = new StringBuilder(4*1024);
         buf.append("<p><b>Router Transport Addresses:</b><br /><pre>\n");
         for (int i = 0; i < _transports.size(); i++) {
             Transport t = (Transport)_transports.get(i);
diff --git a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java
index e462764d5915d69d649aa39d660568bab1a6c0e2..89d1cf85b8f65f07499da0b306e910bd7563f886 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/EstablishState.java
@@ -662,7 +662,7 @@ public class EstablishState {
     private String prefix() { return toString(); }
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("est").append(System.identityHashCode(this));
         if (_con.isInbound()) buf.append(" inbound");
         else buf.append(" outbound");
diff --git a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
index 84cd7673212bbc6395618cadb7479e7160cd35c4..5fa10b3108c47049eadb42bd0fd88177256561f4 100644
--- a/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
+++ b/router/java/src/net/i2p/router/transport/ntcp/NTCPTransport.java
@@ -417,7 +417,7 @@ public class NTCPTransport extends TransportImpl {
     private static final int NUM_CONCURRENT_WRITERS = 3;
 
     public synchronized RouterAddress startListening() {
-        if (_log.shouldLog(Log.DEBUG)) _log.debug("Starting ntcp transport listening");
+        if (_log.shouldLog(Log.WARN)) _log.warn("Starting ntcp transport listening");
         _finisher.start();
         _pumper.startPumping();
 
@@ -429,14 +429,17 @@ public class NTCPTransport extends TransportImpl {
     }
 
     public synchronized RouterAddress restartListening(RouterAddress addr) {
-        if (_log.shouldLog(Log.DEBUG)) _log.debug("Restarting ntcp transport listening");
+        if (_log.shouldLog(Log.WARN)) _log.warn("Restarting ntcp transport listening");
         _finisher.start();
         _pumper.startPumping();
 
         _reader.startReading(NUM_CONCURRENT_READERS);
         _writer.startWriting(NUM_CONCURRENT_WRITERS);
 
-        _myAddress = new NTCPAddress(addr);
+        if (addr == null)
+            _myAddress = null;
+        else
+            _myAddress = new NTCPAddress(addr);
         return bindAddress();
     }
 
@@ -603,7 +606,7 @@ public class NTCPTransport extends TransportImpl {
      *  before calling startListening() or restartListening()
      */
     public synchronized void stopListening() {
-        if (_log.shouldLog(Log.DEBUG)) _log.debug("Stopping ntcp transport");
+        if (_log.shouldLog(Log.WARN)) _log.warn("Stopping ntcp transport");
         _pumper.stopPumping();
         _writer.stopWriting();
         _reader.stopReading();
@@ -643,7 +646,7 @@ public class NTCPTransport extends TransportImpl {
         long totalSend = 0;
         long totalRecv = 0;
 
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("<p><b id=\"ntcpcon\">NTCP connections: ").append(peers.size());
         buf.append(" limit: ").append(getMaxConnections());
         buf.append(" timeout: ").append(DataHelper.formatDuration(_pumper.getIdleTimeout()));
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 290a5139b060c81018be0cc21b735b26e4bae32a..7b2bce4b0e2048b0c76a3493046632a6d7a3db38 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundEstablishState.java
@@ -181,7 +181,7 @@ public class InboundEstablishState {
         _sentSignature = _context.dsa().sign(signed, _context.keyManager().getSigningPrivateKey());
         
         if (_log.shouldLog(Log.DEBUG)) {
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             buf.append("Signing sessionCreated:");
             buf.append(" ReceivedX: ").append(Base64.encode(_receivedX));
             buf.append(" SentY: ").append(Base64.encode(_sentY));
@@ -333,7 +333,7 @@ public class InboundEstablishState {
     
     @Override
     public String toString() {            
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append(super.toString());
         if (_receivedX != null)
             buf.append(" ReceivedX: ").append(Base64.encode(_receivedX, 0, 4));
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 71ce7d0815d9165ff7429cc27761410a558e70e8..7338e0b8355c190a21b7b991064efe59d6ab447a 100644
--- a/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/InboundMessageState.java
@@ -140,7 +140,7 @@ public class InboundMessageState {
         
         @Override
         public String toString() { 
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("Partial ACK of ");
             buf.append(_bitfieldMessageId);
             buf.append(" with ACKs for: ");
@@ -165,7 +165,7 @@ public class InboundMessageState {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(32);
+        StringBuilder buf = new StringBuilder(32);
         buf.append("Message: ").append(_messageId);
         if (isComplete()) {
             buf.append(" completely received with ");
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 47a54ce116a6d23f44fc357975a6351b8127dabb..a5c732e080fa727e3701c2e1f7d962dfe0e552a4 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundEstablishState.java
@@ -291,7 +291,7 @@ public class OutboundEstablishState {
         DataHelper.toLong(signed, off, 4, _receivedSignedOnTime);
         boolean valid = _context.dsa().verifySignature(_receivedSignature, signed, _remotePeer.getSigningPublicKey());
         if (!valid || _log.shouldLog(Log.DEBUG)) {
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             buf.append("Signed sessionCreated:");
             buf.append(" AliceIP: ").append(Base64.encode(_aliceIP));
             buf.append(" AlicePort: ").append(_alicePort);
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 052ff2b4f7de23bc883837265a8fcab7fedd6298..650c17592a3798f679adf7fdfe73e3d8e0272895 100644
--- a/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
+++ b/router/java/src/net/i2p/router/transport/udp/OutboundMessageState.java
@@ -295,7 +295,7 @@ public class OutboundMessageState {
     public String toString() {
         short sends[] = _fragmentSends;
         ByteArray messageBuf = _messageBuf;
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append("Message ").append(_messageId);
         if (sends != null)
             buf.append(" with ").append(sends.length).append(" fragments");
diff --git a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
index dcdf5fb6d95f95ca7ed7fd830415f85b408b8559..d12076e7f4161da6e9f0bf868de367a31cd08f7b 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketBuilder.java
@@ -61,10 +61,10 @@ public class PacketBuilder {
     public UDPPacket buildPacket(OutboundMessageState state, int fragment, PeerState peer, List ackIdsRemaining, List partialACKsRemaining) {
         UDPPacket packet = UDPPacket.acquire(_context, false);
 
-        StringBuffer msg = null;
+        StringBuilder msg = null;
         boolean acksIncluded = false;
         if (_log.shouldLog(Log.INFO)) {
-            msg = new StringBuffer(128);
+            msg = new StringBuilder(128);
             msg.append("Send to ").append(peer.getRemotePeer().toBase64());
             msg.append(" msg ").append(state.getMessageId()).append(":").append(fragment);
             if (fragment == state.getFragmentCount() - 1)
@@ -219,9 +219,9 @@ public class PacketBuilder {
     public UDPPacket buildACK(PeerState peer, List ackBitfields) {
         UDPPacket packet = UDPPacket.acquire(_context, false);
         
-        StringBuffer msg = null;
+        StringBuilder msg = null;
         if (_log.shouldLog(Log.DEBUG)) {
-            msg = new StringBuffer(128);
+            msg = new StringBuilder(128);
             msg.append("building ACK packet to ").append(peer.getRemotePeer().toBase64().substring(0,6));
         }
 
@@ -379,7 +379,7 @@ public class PacketBuilder {
         off += 8;
         
         if (_log.shouldLog(Log.DEBUG)) {
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             buf.append("Sending sessionCreated:");
             buf.append(" AliceIP: ").append(Base64.encode(sentIP));
             buf.append(" AlicePort: ").append(state.getSentPort());
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 d32e8526dbef6f3b18625b95dc62f8de92f2f687..fb5d2e9c9e9864c012b4b14633e215767303a0e4 100644
--- a/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
+++ b/router/java/src/net/i2p/router/transport/udp/PacketHandler.java
@@ -93,7 +93,7 @@ public class PacketHandler {
     }
 
     String getHandlerStatus() {
-        StringBuffer rv = new StringBuffer();
+        StringBuilder rv = new StringBuilder();
         int size = _handlers.size();
         rv.append("Handlers: ").append(size);
         for (int i = 0; i < size; i++) {
@@ -324,7 +324,7 @@ public class PacketHandler {
         private void receivePacket(UDPPacketReader reader, UDPPacket packet, InboundEstablishState state, boolean allowFallback) {
             _state = 31;
             if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) {
-                StringBuffer buf = new StringBuffer(128);
+                StringBuilder buf = new StringBuilder(128);
                 buf.append("Attempting to receive a packet on a known inbound state: ");
                 buf.append(state);
                 buf.append(" MAC key: ").append(state.getMACKey());
@@ -362,7 +362,7 @@ public class PacketHandler {
         private void receivePacket(UDPPacketReader reader, UDPPacket packet, OutboundEstablishState state) {
             _state = 35;
             if ( (state != null) && (_log.shouldLog(Log.DEBUG)) ) {
-                StringBuffer buf = new StringBuffer(128);
+                StringBuilder buf = new StringBuilder(128);
                 buf.append("Attempting to receive a packet on a known outbound state: ");
                 buf.append(state);
                 buf.append(" MAC key: ").append(state.getMACKey());
@@ -470,7 +470,7 @@ public class PacketHandler {
                     if (state != null) {
                         UDPPacketReader.DataReader dr = reader.getDataReader();
                         if (_log.shouldLog(Log.INFO)) {
-                            StringBuffer msg = new StringBuffer();
+                            StringBuilder msg = new StringBuilder();
                             msg.append("Receive ").append(System.identityHashCode(packet));
                             msg.append(" from ").append(state.getRemotePeer().toBase64()).append(" ").append(state.getRemoteHostId());
                             for (int i = 0; i < dr.readFragmentCount(); i++) {
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 74608069c5dafbf5adeeb39c1a26e7d5dc3aada8..85169b0495b25cd4b120a592a016b409db833c8a 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerState.java
@@ -1555,7 +1555,7 @@ public class PeerState {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append(_remoteHostId.toString());
         if (_remotePeer != null)
             buf.append(" ").append(_remotePeer.toBase64().substring(0,6));
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 625bf648a7c9e1079ebf12c93ff18a6bcf8b300c..16fff5fa8fd1d15ef8abc0a70edc23ea87580e45 100644
--- a/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
+++ b/router/java/src/net/i2p/router/transport/udp/PeerTestState.java
@@ -98,7 +98,7 @@ class PeerTestState {
     
     @Override
     public synchronized String toString() {
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("Role: ");
         if (_ourRole == ALICE) buf.append("Alice");
         else if (_ourRole == BOB) buf.append("Bob");
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 4bb2338f1f5e7e6ce86525936ea513cb7b3032b3..510d712a0bb478838e0e6a3977ca823b4ce6e9dc 100644
--- a/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
+++ b/router/java/src/net/i2p/router/transport/udp/RemoteHostId.java
@@ -60,7 +60,7 @@ final class RemoteHostId {
         }
     }
     public static String toString(byte ip[]) {
-        StringBuffer buf = new StringBuffer(ip.length+5);
+        StringBuilder buf = new StringBuilder(ip.length+5);
         for (int i = 0; i < ip.length; i++) {
             buf.append(ip[i]&0xFF);
             if (i + 1 < ip.length)
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 723817e0104b526a9e6fbcaf898c7d2c758d515d..6db0b1c6c2d840106582216896634306eeaff141 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPAddress.java
@@ -42,7 +42,7 @@ public class UDPAddress {
     
     @Override
     public String toString() {
-        StringBuffer rv = new StringBuffer(64);
+        StringBuilder rv = new StringBuilder(64);
         if (_introHosts != null) {
             for (int i = 0; i < _introHosts.length; i++) {
                 rv.append("ssu://");
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 4a5ef837f3e96bcf73f1ba2cfb116e7f7baab386..37fd5ad1293cd05f9564105b8791321e807bc6e8 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacket.java
@@ -168,7 +168,7 @@ public class UDPPacket {
             Hash hmac = _context.hmac().calculate(macKey, buf.getData(), 0, off);
 
             if (_log.shouldLog(Log.DEBUG)) {
-                StringBuffer str = new StringBuffer(128);
+                StringBuilder str = new StringBuilder(128);
                 str.append(_packet.getLength()).append(" byte packet received, payload length ");
                 str.append(payloadLength);
                 str.append("\nIV: ").append(Base64.encode(buf.getData(), payloadLength, IV_SIZE));
@@ -237,7 +237,7 @@ public class UDPPacket {
     @Override
     public String toString() {
         verifyNotReleased(); 
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append(_packet.getLength());
         buf.append(" byte packet with ");
         buf.append(_packet.getAddress().getHostAddress()).append(":");
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 5bff1789d77d92a016fa8433792fb05add487cc7..9bb665f6b645412fdaa636750e72edaa3e87c2f5 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPPacketReader.java
@@ -129,7 +129,7 @@ public class UDPPacketReader {
         }
     }
     
-    public void toRawString(StringBuffer buf) {
+    public void toRawString(StringBuilder buf) {
         if (_message != null)
             buf.append(Base64.encode(_message, _payloadBeginOffset, _payloadLength));
     }
@@ -401,7 +401,7 @@ public class UDPPacketReader {
         
         @Override
         public String toString() {
-            StringBuffer buf = new StringBuffer(256);
+            StringBuilder buf = new StringBuilder(256);
             long msAgo = _context.clock().now() - readTimestamp()*1000;
             buf.append("Data packet sent ").append(msAgo).append("ms ago ");
             buf.append("IV ");
@@ -463,7 +463,7 @@ public class UDPPacketReader {
             return buf.toString();
         }
         
-        public void toRawString(StringBuffer buf) { 
+        public void toRawString(StringBuilder buf) { 
             UDPPacketReader.this.toRawString(buf); 
             buf.append(" payload: ");
                   
@@ -506,7 +506,7 @@ public class UDPPacketReader {
         }
         @Override
         public String toString() { 
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("Read partial ACK of ");
             buf.append(getMessageId());
             buf.append(" with ACKs for: ");
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 6dec9779eea94ca82d0c95cc600d8d1d63c62b02..82d0ea656092bfbaaf8658e4db9b89fc9fb8ba5d 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPReceiver.java
@@ -164,7 +164,7 @@ public class UDPReceiver {
         packet.release();
         _context.statManager().addRateData("udp.droppedInbound", queueSize, headPeriod);
         if (_log.shouldLog(Log.WARN)) {
-            StringBuffer msg = new StringBuffer();
+            StringBuilder msg = new StringBuilder();
             msg.append("Dropping inbound packet with ");
             msg.append(queueSize);
             msg.append(" queued for ");
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 e010e5213f851dd2663b70b0780289fc447a6ba8..47edd62c3af35b00442524a5ce83fcd430da1813 100644
--- a/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
+++ b/router/java/src/net/i2p/router/transport/udp/UDPTransport.java
@@ -437,12 +437,16 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
             synchronized (this) {
                 if ( (_externalListenHost == null) ||
                      (!eq(_externalListenHost.getAddress(), _externalListenPort, ourIP, ourPort)) ) {
+                    if (_log.shouldLog(Log.WARN))
+                        _log.warn("Change address? status = " + _reachabilityStatus +
+                                  " diff = " + (_context.clock().now() - _reachabilityStatusLastUpdated) +
+                                  " old = " + _externalListenHost + ':' + _externalListenPort);
                     if ( (_reachabilityStatus != CommSystemFacade.STATUS_OK) ||
                          (_externalListenHost == null) || (_externalListenPort <= 0) ||
                          (_context.clock().now() - _reachabilityStatusLastUpdated > 2*TEST_FREQUENCY) ) {
                         // they told us something different and our tests are either old or failing
-                        if (_log.shouldLog(Log.INFO))
-                            _log.info("Trying to change our external address...");
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Trying to change our external address...");
                         try {
                             _externalListenHost = InetAddress.getByAddress(ourIP);
                             // fixed port defaults to true so we never do this
@@ -455,15 +459,15 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
                             }
                         } catch (UnknownHostException uhe) {
                             _externalListenHost = null;
-                            if (_log.shouldLog(Log.INFO))
-                                _log.info("Error trying to change our external address", uhe);
+                            if (_log.shouldLog(Log.WARN))
+                                _log.warn("Error trying to change our external address", uhe);
                         }
                     } else {
                         // they told us something different, but our tests are recent and positive,
                         // so lets test again
                         fireTest = true;
-                        if (_log.shouldLog(Log.INFO))
-                            _log.info("Different address, but we're fine.. (" + _reachabilityStatus + ")");
+                        if (_log.shouldLog(Log.WARN))
+                            _log.warn("Different address, but we're fine.. (" + _reachabilityStatus + ")");
                     }
                 } else {
                     // matched what we expect
@@ -760,7 +764,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
     private void dropPeer(PeerState peer, boolean shouldShitlist, String why) {
         if (_log.shouldLog(Log.WARN)) {
             long now = _context.clock().now();
-            StringBuffer buf = new StringBuffer(4096);
+            StringBuilder buf = new StringBuilder(4096);
             long timeSinceSend = now - peer.getLastSendTime();
             long timeSinceRecv = now - peer.getLastReceiveTime();
             long timeSinceAck  = now - peer.getLastACKSend();
@@ -1282,7 +1286,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
      
         OutNetMessage m = msg.getMessage();
         PeerState p = msg.getPeer();
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         buf.append(" lifetime: ").append(msg.getLifetime());
         buf.append(" sends: ").append(sends);
         buf.append(" pushes: ").append(pushCount);
@@ -1727,7 +1731,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         }
     }
     
-    private void appendSortLinks(StringBuffer buf, String urlBase, int sortFlags, String descr, int ascending) {
+    private void appendSortLinks(StringBuilder buf, String urlBase, int sortFlags, String descr, int ascending) {
         if (sortFlags == ascending) {
             buf.append(" <a href=\"").append(urlBase).append("?sort=").append(0-ascending);
             buf.append("\" title=\"").append(descr).append("\">V</a><b>^</b> ");
@@ -1763,7 +1767,7 @@ public class UDPTransport extends TransportImpl implements TimedWeightedPriority
         long dupRecvTotal = 0;
         int numPeers = 0;
         
-        StringBuffer buf = new StringBuffer(512);
+        StringBuilder buf = new StringBuilder(512);
         buf.append("<p><b id=\"udpcon\">UDP connections: ").append(peers.size());
         buf.append(" limit: ").append(getMaxConnections());
         buf.append(" timeout: ").append(DataHelper.formatDuration(_expireTimeout));
diff --git a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
index 2de7868dbfa2b21dca5a24cda9c75fafede5f0e2..751d629a54451553e1950556b9e4b0d61ce517ec 100644
--- a/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/BatchedPreprocessor.java
@@ -65,10 +65,10 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
     
     @Override
     public boolean preprocessQueue(List pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
-        StringBuffer timingBuf = null;
+        StringBuilder timingBuf = null;
         if (_log.shouldLog(Log.DEBUG)) {
             _log.debug("Preprocess queue with " + pending.size() + " to send");
-            timingBuf = new StringBuffer(128);
+            timingBuf = new StringBuilder(128);
             timingBuf.append("Preprocess with " + pending.size() + " to send. ");
         }
         if (DISABLE_BATCHING) {
@@ -246,7 +246,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
     private void display(long allocated, List pending, String title) {
         if (_log.shouldLog(Log.INFO)) {
             long highestDelay = 0;
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             buf.append(_name).append(": ");
             buf.append(title);
             buf.append(" allocated: ").append(allocated);
@@ -286,7 +286,7 @@ public class BatchedPreprocessor extends TrivialPreprocessor {
         // generate the final preprocessed data
         
         if (offset <= 0) {
-            StringBuffer buf = new StringBuffer(128);
+            StringBuilder buf = new StringBuilder(128);
             buf.append("wtf, written offset is ").append(offset);
             buf.append(" for ").append(startAt).append(" through ").append(sendThrough);
             for (int i = startAt; i <= sendThrough; i++) {
diff --git a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
index 94e2c8c2487ccaf00cbe9b79f0de66f6e5d9d9cf..77f54bb2c4fd8f1da0d7e8aed20db3643da3d0f4 100644
--- a/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
+++ b/router/java/src/net/i2p/router/tunnel/FragmentedMessage.java
@@ -275,7 +275,7 @@ public class FragmentedMessage {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         buf.append("Fragments for ").append(_messageId).append(": ");
         for (int i = 0; i <= _highFragmentNum; i++) {
             ByteArray ba = _fragments[i];
diff --git a/router/java/src/net/i2p/router/tunnel/HopConfig.java b/router/java/src/net/i2p/router/tunnel/HopConfig.java
index ab0c32a3f35a455c8650d1bb8a02d0a57497e3aa..532bdfe20c5157f28d16dcca4c9c47a871363862 100644
--- a/router/java/src/net/i2p/router/tunnel/HopConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/HopConfig.java
@@ -137,7 +137,7 @@ public class HopConfig {
     
     @Override
     public String toString() {
-        StringBuffer buf = new StringBuffer(64);
+        StringBuilder buf = new StringBuilder(64);
         if (_receiveTunnelId != null) {
             buf.append("recv on ");
             buf.append(DataHelper.fromLong(_receiveTunnelId, 0, 4));
diff --git a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
index d687df726f2b80366c4f925c2ac749336516b3db..4792b14c266bcc66e33e73117288f74dab5d46ad 100644
--- a/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
+++ b/router/java/src/net/i2p/router/tunnel/TrivialPreprocessor.java
@@ -43,9 +43,9 @@ public class TrivialPreprocessor implements TunnelGateway.QueuePreprocessor {
      */
     public boolean preprocessQueue(List pending, TunnelGateway.Sender sender, TunnelGateway.Receiver rec) {
         long begin = System.currentTimeMillis();
-        StringBuffer buf = null;
+        StringBuilder buf = null;
         if (_log.shouldLog(Log.DEBUG)) {
-            buf = new StringBuffer(256);
+            buf = new StringBuilder(256);
             buf.append("Trivial preprocessing of ").append(pending.size()).append(" ");
         }
         while (pending.size() > 0) {
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
index 72dccf45c19a9775aaff444a93baeb70cea64b11..c91af69293b3458975dcc56c618626dfb124c9b9 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelCreatorConfig.java
@@ -166,7 +166,7 @@ public class TunnelCreatorConfig implements TunnelInfo {
     @Override
     public String toString() {
         // H0:1235-->H1:2345-->H2:2345
-        StringBuffer buf = new StringBuffer(128);
+        StringBuilder buf = new StringBuilder(128);
         if (_isInbound)
             buf.append("inbound");
         else
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
index 077a43b7de30c3886c793ac5c0b727ded695773f..75887f4063b5b4783944c925cdbca2f6c8405a5f 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelGateway.java
@@ -238,7 +238,7 @@ public class TunnelGateway {
         
         @Override
         public String toString() {
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("Message ").append(_messageId).append(" on ");
             buf.append(TunnelGateway.this.toString());
             if (_toRouter != null) {
diff --git a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
index 5e4a92641bb4e5adf99cb72851be12f0790f59ed..b9d660751b0a45e3c592ebd0c9ee9a96682db291 100644
--- a/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
+++ b/router/java/src/net/i2p/router/tunnel/TunnelParticipant.java
@@ -221,7 +221,7 @@ public class TunnelParticipant {
     @Override
     public String toString() { 
         if (_config != null) {
-            StringBuffer buf = new StringBuffer(64);
+            StringBuilder buf = new StringBuilder(64);
             buf.append("participant at ").append(_config.toString());
             return buf.toString();
         } else {
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 bee05c9c67013776b95d03869723a8ed349579c9..0583c73b118fb4bb66a87c3a5a17c50f8a959623 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/BuildHandler.java
@@ -206,7 +206,7 @@ class BuildHandler {
         long replyMessageId = state.msg.getUniqueId();
         PooledTunnelCreatorConfig cfg = null;
         List building = _exec.locked_getCurrentlyBuilding();
-        StringBuffer buf = null;
+        StringBuilder buf = null;
         synchronized (building) {
             for (int i = 0; i < building.size(); i++) {
                 PooledTunnelCreatorConfig cur = (PooledTunnelCreatorConfig)building.get(i);
@@ -217,7 +217,7 @@ class BuildHandler {
                 }
             }
             if ( (cfg == null) && (_log.shouldLog(Log.DEBUG)) )
-                buf = new StringBuffer(building.toString());
+                buf = new StringBuilder(building.toString());
         }
         
         if (cfg == null) {
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 24b379543e6cc58ea5039e042f557440e72eb138..c0633ef9ff20571e56c6a672c3bf33930aab4c1c 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TestJob.java
@@ -252,7 +252,7 @@ class TestJob extends JobImpl {
         
         @Override
         public String toString() {
-            StringBuffer rv = new StringBuffer(64);
+            StringBuilder rv = new StringBuilder(64);
             rv.append("Testing tunnel ").append(_cfg.toString()).append(" waiting for ");
             rv.append(_id).append(" found? ").append(_found);
             return rv.toString();
@@ -284,7 +284,7 @@ class TestJob extends JobImpl {
         
         @Override
         public String toString() {
-            StringBuffer rv = new StringBuffer(64);
+            StringBuilder rv = new StringBuilder(64);
             rv.append("Testing tunnel ").append(_cfg.toString());
             rv.append(" successful after ").append(_successTime);
             return rv.toString();
@@ -310,7 +310,7 @@ class TestJob extends JobImpl {
         
         @Override
         public String toString() {
-            StringBuffer rv = new StringBuffer(64);
+            StringBuilder rv = new StringBuilder(64);
             rv.append("Testing tunnel ").append(_cfg.toString());
             rv.append(" timed out");
             return rv.toString();
diff --git a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
index c515310051d3e6973ee19f86b1cd8799eb62bd15..2cfac2cc4fc9ae4d657b8cd4aa436daab221fb2e 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPeerSelector.java
@@ -129,7 +129,7 @@ public abstract class TunnelPeerSelector {
             rv.remove(0);
         
         if (log.shouldLog(Log.INFO)) {
-            StringBuffer buf = new StringBuffer();
+            StringBuilder buf = new StringBuilder();
             if (settings.getDestinationNickname() != null)
                 buf.append("peers for ").append(settings.getDestinationNickname());
             else if (settings.getDestination() != null)
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 8ce5859df0877bcfb4b5c096fb74ff9b0e9aacd4..39e6c2280c70af4458e03fad5ef6c9be08ef86c9 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -892,7 +892,7 @@ public class TunnelPool {
             else
                 return "Outbound exploratory pool";
         } else {
-            StringBuffer rv = new StringBuffer(32);
+            StringBuilder rv = new StringBuilder(32);
             if (_settings.isInbound())
                 rv.append("Inbound client pool for ");
             else
diff --git a/router/java/src/net/i2p/router/SSUDemo.java b/router/java/test/net/i2p/router/SSUDemo.java
similarity index 100%
rename from router/java/src/net/i2p/router/SSUDemo.java
rename to router/java/test/net/i2p/router/SSUDemo.java