diff --git a/apps/routerconsole/jsp/error500.jsp b/apps/routerconsole/jsp/error500.jsp
index 70e82e9d2d97649bed3fcfba5f9f28f1296c92a1..223b4d5de3fe5aa201f8afa3916be48da32e5d2b 100644
--- a/apps/routerconsole/jsp/error500.jsp
+++ b/apps/routerconsole/jsp/error500.jsp
@@ -45,11 +45,11 @@
 </p><p>
 <%
     if (ERROR_THROWABLE != null) {
-        java.io.ByteArrayOutputStream baos = new java.io.ByteArrayOutputStream(2048);
-        java.io.PrintStream ps = new java.io.PrintStream(baos);
-        ERROR_THROWABLE.printStackTrace(ps);
-        ps.close();
-        String trace = baos.toString();
+        java.io.StringWriter sw = new java.io.StringWriter(2048);
+        java.io.PrintWriter pw = new java.io.PrintWriter(sw);
+        ERROR_THROWABLE.printStackTrace(pw);
+        pw.flush();
+        String trace = sw.toString();
         trace = trace.replace("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;");
         trace = trace.replace("\n", "<br>&nbsp;&nbsp;&nbsp;&nbsp;\n");
         out.print(trace);
diff --git a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java
index 6414f64b45493a7032f2f1c0d7072446c4b13220..c331fae01ed25a3a74f4b253918dba6866eff157 100644
--- a/core/java/src/net/i2p/client/naming/SingleFileNamingService.java
+++ b/core/java/src/net/i2p/client/naming/SingleFileNamingService.java
@@ -28,6 +28,7 @@ import java.util.concurrent.locks.ReentrantReadWriteLock;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.DataFormatException;
+import net.i2p.data.DataHelper;
 import net.i2p.data.Destination;
 import net.i2p.util.FileUtil;
 import net.i2p.util.Log;
@@ -235,7 +236,7 @@ public class SingleFileNamingService extends NamingService {
             // FIXME fails if previous last line didn't have a trailing \n
             out.write(hostname.getBytes("UTF-8"));
             out.write('=');
-            out.write(d.toBase64().getBytes());
+            out.write(DataHelper.getASCII(d.toBase64()));
             out.write('\n');
             out.close();
             for (NamingServiceListener nsl : _listeners) { 
diff --git a/core/java/src/net/i2p/stat/RateStat.java b/core/java/src/net/i2p/stat/RateStat.java
index 512fd64027a9d6a5aec692aff2f800ed4f05301a..018ef1973404de23a9806a6bdbe405fa6873dde1 100644
--- a/core/java/src/net/i2p/stat/RateStat.java
+++ b/core/java/src/net/i2p/stat/RateStat.java
@@ -184,7 +184,7 @@ public class RateStat {
         buf.append("# Rate: ").append(_groupName).append(": ").append(_statName).append(NL);
         buf.append("# ").append(_description).append(NL);
         buf.append("# ").append(NL).append(NL);
-        out.write(buf.toString().getBytes());
+        out.write(buf.toString().getBytes("UTF-8"));
         buf.setLength(0);
         for (Rate r: _rates){
             buf.append("#######").append(NL);
@@ -193,7 +193,7 @@ public class RateStat {
             buf.append(NL);
             String curPrefix = prefix + "." + DataHelper.formatDuration(r.getPeriod());
             r.store(curPrefix, buf);
-            out.write(buf.toString().getBytes());
+            out.write(buf.toString().getBytes("UTF-8"));
             buf.setLength(0);
         }
     }
diff --git a/core/java/src/net/i2p/util/HexDump.java b/core/java/src/net/i2p/util/HexDump.java
index 0d56d2f981c1c691bad35c1a3541acc9c8b3b359..9765f3317b0c5c79659a9c2aa82ba18757865e82 100644
--- a/core/java/src/net/i2p/util/HexDump.java
+++ b/core/java/src/net/i2p/util/HexDump.java
@@ -13,6 +13,8 @@ import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
+import net.i2p.data.DataHelper;
+
 /**
  * Hexdump class (well, it's actually a namespace with some functions,
  * but let's stick with java terminology :-).  These methods generate
@@ -25,7 +27,7 @@ public class HexDump {
 
     private static final int FORMAT_OFFSET_PADDING = 8;
     private static final int FORMAT_BYTES_PER_ROW = 16;
-    private static final byte[] HEXCHARS = "0123456789abcdef".getBytes();
+    private static final byte[] HEXCHARS = DataHelper.getASCII("0123456789abcdef");
 
     /**
      * Dump a byte array in a String.
@@ -37,11 +39,10 @@ public class HexDump {
 
         try {
             dump(data, 0, data.length, out);
+            return out.toString("ISO-8859-1");
         } catch (IOException e) {
-            e.printStackTrace();
+            throw new RuntimeException("no 8859?", e);
         }
-
-        return out.toString();
     }
 
     /**
@@ -56,11 +57,10 @@ public class HexDump {
 
         try {
             dump(data, off, len, out);
+            return out.toString("ISO-8859-1");
         } catch (IOException e) {
-            e.printStackTrace();
+            throw new RuntimeException("no 8859?", e);
         }
-
-        return out.toString();
     }
 
     /**
@@ -91,9 +91,10 @@ public class HexDump {
             hexoff = Integer.toString(dumpoff, 16);
             hexofflen = hexoff.length();
             for (i = 0; i < FORMAT_OFFSET_PADDING - hexofflen; ++i) {
-                hexoff = "0" + hexoff;
+                out.write('0');
             }
-            out.write((hexoff + " ").getBytes());
+            out.write(DataHelper.getASCII(hexoff));
+            out.write(' ');
 
             // Bytes to be printed in the current line
             nextbytes = (FORMAT_BYTES_PER_ROW < (end - dumpoff) ? FORMAT_BYTES_PER_ROW : (end - dumpoff));
@@ -101,15 +102,15 @@ public class HexDump {
             for (i = 0; i < FORMAT_BYTES_PER_ROW; ++i) {
                 // Put two spaces to separate 8-bytes blocks
                 if ((i % 8) == 0) {
-                    out.write(" ".getBytes());
+                    out.write(' ');
                 }
                 if (i >= nextbytes) {
-                    out.write("   ".getBytes());
+                    out.write(DataHelper.getASCII("   "));
                 } else {
                     val = data[dumpoff + i] & 0xff;
                     out.write(HEXCHARS[val >>> 4]);
                     out.write(HEXCHARS[val & 0xf]);
-                    out.write(" ".getBytes());
+                    out.write(' ');
                 }
             }
 
@@ -117,19 +118,32 @@ public class HexDump {
 
             for (i = 0; i < FORMAT_BYTES_PER_ROW; ++i) {
                 if (i >= nextbytes) {
-                    out.write(" ".getBytes());
+                    out.write(' ');
                 } else {
                     val = data[i + dumpoff];
                     // Is it a printable character?
                     if ((val > 31) && (val < 127)) {
                         out.write(val);
                     } else {
-                        out.write(".".getBytes());
+                        out.write('.');
                     }
                 }
             }
 
-            out.write("|\n".getBytes());
+            out.write('|');
+            out.write('\n');
         }
     }
-}
\ No newline at end of file
+
+    /**
+     *  @since 0.9.21
+     */
+/****
+    public static void main(String[] args) {
+        byte[] b = new byte[9993];
+        RandomSource.getInstance().nextBytes(b);
+        System.out.println(dump(b));
+        System.out.println(dump("test test test abcde xyz !!!".getBytes()));
+    }
+****/
+}
diff --git a/core/java/src/net/i2p/util/LogRecordFormatter.java b/core/java/src/net/i2p/util/LogRecordFormatter.java
index 4f367defe90b40232ccade986cf54e26ca418205..05d04b92be711adc1606eba2c2329d4356b4cdeb 100644
--- a/core/java/src/net/i2p/util/LogRecordFormatter.java
+++ b/core/java/src/net/i2p/util/LogRecordFormatter.java
@@ -73,9 +73,9 @@ class LogRecordFormatter {
         buf.append(NL);
         if (rec.getThrowable() != null) {
             StringWriter sw = new StringWriter(512);
-            PrintWriter pw = new PrintWriter(sw, true);
+            PrintWriter pw = new PrintWriter(sw);
             rec.getThrowable().printStackTrace(pw);
-            sw.flush();
+            pw.flush();
             buf.append(sw.toString());
         }
         return buf.toString();
diff --git a/router/java/src/net/i2p/router/peermanager/DBHistory.java b/router/java/src/net/i2p/router/peermanager/DBHistory.java
index c5c94c2ca85a06f40cbbc6d16f5e1ea2829cf92d..b2b46faca3dae1f8b8739dc7121bb182e1d4444d 100644
--- a/router/java/src/net/i2p/router/peermanager/DBHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/DBHistory.java
@@ -228,7 +228,7 @@ public class DBHistory {
         add(buf, "unpromptedDbStoreOld", _unpromptedDbStoreOld, "How times have they sent us something we didn't ask for but have seen before?");
         add(buf, "lastLookupReceived", _lastLookupReceived, "When was the last time they send us a lookup?  (milliseconds since the epoch)");
         add(buf, "avgDelayBetweenLookupsReceived", _avgDelayBetweenLookupsReceived, "How long is it typically between each db lookup they send us?  (in milliseconds)");
-        out.write(buf.toString().getBytes());
+        out.write(buf.toString().getBytes("UTF-8"));
         _failedLookupRate.store(out, "dbHistory.failedLookupRate");
         _invalidReplyRate.store(out, "dbHistory.invalidReplyRate");
     }
diff --git a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
index 32c15038c0f25a7e470df1a45a20ac01de941922..305d0f343454323036ee3f1c51371f544866a5ec 100644
--- a/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
+++ b/router/java/src/net/i2p/router/peermanager/ProfilePersistenceHelper.java
@@ -139,7 +139,7 @@ class ProfilePersistenceHelper {
         add(buf, "tunnelPeakTunnel1mThroughput", profile.getPeakTunnel1mThroughputKBps(), "KBytes/sec");
         buf.append(NL);
         
-        out.write(buf.toString().getBytes());
+        out.write(buf.toString().getBytes("UTF-8"));
         
         if (profile.getIsExpanded()) {
             // only write out expanded data if, uh, we've got it
diff --git a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
index 8cffc431f6dccd23809b602b63bc4e201f8aec7e..37e91b3f297a53005d6e8046e02fd3fb0796af3f 100644
--- a/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
+++ b/router/java/src/net/i2p/router/peermanager/TunnelHistory.java
@@ -151,7 +151,7 @@ public class TunnelHistory {
         add(buf, "lifetimeAgreedTo", _lifetimeAgreedTo.get(), "How many tunnels has the peer ever agreed to participate in?");
         add(buf, "lifetimeFailed", _lifetimeFailed.get(), "How many tunnels has the peer ever agreed to participate in that failed prematurely?");
         add(buf, "lifetimeRejected", _lifetimeRejected.get(), "How many tunnels has the peer ever refused to participate in?");
-        out.write(buf.toString().getBytes());
+        out.write(buf.toString().getBytes("UTF-8"));
         _rejectRate.store(out, "tunnelHistory.rejectRate");
         _failRate.store(out, "tunnelHistory.failRate");
     }
diff --git a/router/java/src/net/i2p/router/startup/WorkingDir.java b/router/java/src/net/i2p/router/startup/WorkingDir.java
index b8503224f6f2cc0d1b14064a20f43b48a5046649..8e3a19c93fdfe3a3d984687326a7f97b9c63df82 100644
--- a/router/java/src/net/i2p/router/startup/WorkingDir.java
+++ b/router/java/src/net/i2p/router/startup/WorkingDir.java
@@ -252,7 +252,7 @@ public class WorkingDir {
         }
         System.setProperty(PROP_WRAPPER_LOG, logfile.getAbsolutePath());
         try {
-            PrintStream ps = new PrintStream(new SecureFileOutputStream(logfile, true));
+            PrintStream ps = new PrintStream(new SecureFileOutputStream(logfile, true), true, "UTF-8");
             System.setOut(ps);
             System.setErr(ps);
         } catch (IOException ioe) {
diff --git a/router/java/src/net/i2p/router/tasks/MarkLiveliness.java b/router/java/src/net/i2p/router/tasks/MarkLiveliness.java
index 00bba1a5bdac4faf20431d47035a761e6d59ad0b..34420f2d97b3815d1bee01aba8e537528e0bbba1 100644
--- a/router/java/src/net/i2p/router/tasks/MarkLiveliness.java
+++ b/router/java/src/net/i2p/router/tasks/MarkLiveliness.java
@@ -12,6 +12,7 @@ import java.io.File;
 import java.io.FileOutputStream;
 import java.io.IOException;
 
+import net.i2p.data.DataHelper;
 import net.i2p.router.Router;
 import net.i2p.util.Log;
 import net.i2p.util.SecureFileOutputStream;
@@ -45,7 +46,7 @@ public class MarkLiveliness implements SimpleTimer.TimedEvent {
         FileOutputStream fos = null;
         try { 
             fos = new SecureFileOutputStream(_pingFile);
-            fos.write(Long.toString(System.currentTimeMillis()).getBytes());
+            fos.write(DataHelper.getASCII(Long.toString(System.currentTimeMillis())));
         } catch (IOException ioe) {
             if (!_errorLogged) {
                 Log log = _router.getContext().logManager().getLog(MarkLiveliness.class);