diff --git a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java
index 9e8a47b736db348c06af9e846f07e180e2df43c4..64a7bb6cc22213058f7871b82261e040ff3d4725 100644
--- a/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java
+++ b/apps/streaming/java/src/net/i2p/client/streaming/MessageOutputStream.java
@@ -77,6 +77,7 @@ public class MessageOutputStream extends OutputStream {
     }
     
     public void write(byte b[], int off, int len) throws IOException {
+        if (_closed) throw new IOException("Already closed");
         if (_log.shouldLog(Log.DEBUG))
             _log.debug("write(b[], " + off + ", " + len + ") ");
         int cur = off;
diff --git a/core/java/src/net/i2p/data/RoutingKeyGenerator.java b/core/java/src/net/i2p/data/RoutingKeyGenerator.java
index 76cdacfb06c6fe90d7c3af09b29ad57a266db6cc..5589d589e1bd7551aa3d85dcbeb2dd5e814ca845 100644
--- a/core/java/src/net/i2p/data/RoutingKeyGenerator.java
+++ b/core/java/src/net/i2p/data/RoutingKeyGenerator.java
@@ -71,14 +71,18 @@ public class RoutingKeyGenerator {
      */
     public void generateDateBasedModData() {
         Date today = null;
+        long now = _context.clock().now();
         synchronized (_cal) {
-            _cal.setTime(new Date(_context.clock().now()));
+            _cal.setTime(new Date(now));
+            _cal.set(Calendar.YEAR, _cal.get(Calendar.YEAR));               // gcj <= 4.0 workaround
+            _cal.set(Calendar.DAY_OF_YEAR, _cal.get(Calendar.DAY_OF_YEAR)); // gcj <= 4.0 workaround
             _cal.set(Calendar.HOUR_OF_DAY, 0);
             _cal.set(Calendar.MINUTE, 0);
             _cal.set(Calendar.SECOND, 0);
             _cal.set(Calendar.MILLISECOND, 0);
             today = _cal.getTime();
         }
+        
         byte mod[] = null;
         String modVal = null;
         synchronized (_fmt) {
@@ -91,7 +95,7 @@ public class RoutingKeyGenerator {
             _log.info("Routing modifier generated: " + modVal);
         setModData(mod);
     }
-
+    
     /**
      * Generate a modified (yet consistent) hash from the origKey by generating the
      * SHA256 of the targetKey with the current modData appended to it, *then* 
diff --git a/history.txt b/history.txt
index e5bbf8ae1d0581042fd163e203fd6b3a1b731077..16c9bbb0d4510bbc6ecb17c985ef1101f10ba588 100644
--- a/history.txt
+++ b/history.txt
@@ -1,4 +1,10 @@
-$Id: history.txt,v 1.301 2005/10/19 00:15:15 jrandom Exp $
+$Id: history.txt,v 1.302 2005/10/19 17:38:46 jrandom Exp $
+
+2005-10-20  jrandom
+    * Workaround a bug in GCJ's Calendar implementation
+    * Propery throw an exception in the streaming lib if we try to write to a
+      closed stream.  This will hopefully help clear some I2Phex bugs (thanks
+      GregorK!)
 
 2005-10-19  jrandom
     * Ported the snark bittorrent client to I2P such that it is compatible
diff --git a/router/java/src/net/i2p/router/Router.java b/router/java/src/net/i2p/router/Router.java
index 1702f89b832b6f9ab85a612c49b6834e87ba7793..ece9cc54f2887605bfa6ee8f78d2a53b9b2540b4 100644
--- a/router/java/src/net/i2p/router/Router.java
+++ b/router/java/src/net/i2p/router/Router.java
@@ -460,6 +460,8 @@ public class Router {
         private long getTimeTillMidnight() {
             long now = Router.this._context.clock().now();
             _cal.setTime(new Date(now));
+            _cal.set(Calendar.YEAR, _cal.get(Calendar.YEAR));               // gcj <= 4.0 workaround
+            _cal.set(Calendar.DAY_OF_YEAR, _cal.get(Calendar.DAY_OF_YEAR)); // gcj <= 4.0 workaround
             _cal.add(Calendar.DATE, 1);
             _cal.set(Calendar.HOUR_OF_DAY, 0);
             _cal.set(Calendar.MINUTE, 0);
@@ -468,7 +470,7 @@ public class Router {
             long then = _cal.getTime().getTime();
             long howLong = then - now;
             if (howLong < 0) // hi kaffe
-                howLong = 24*60*60*1000 + howLong;
+                howLong = 24*60*60*1000l + howLong;
             if (_log.shouldLog(Log.DEBUG))
                 _log.debug("Time till midnight: " + howLong + "ms");
             return howLong;
diff --git a/router/java/src/net/i2p/router/RouterVersion.java b/router/java/src/net/i2p/router/RouterVersion.java
index 19ad9dc712dab3fbe7adedbf5ada0632888bfb29..32215ee5dcdabb7304b0af181678acdacfdebd72 100644
--- a/router/java/src/net/i2p/router/RouterVersion.java
+++ b/router/java/src/net/i2p/router/RouterVersion.java
@@ -15,9 +15,9 @@ import net.i2p.CoreVersion;
  *
  */
 public class RouterVersion {
-    public final static String ID = "$Revision: 1.272 $ $Date: 2005/10/19 00:15:15 $";
+    public final static String ID = "$Revision: 1.273 $ $Date: 2005/10/19 17:38:45 $";
     public final static String VERSION = "0.6.1.3";
-    public final static long BUILD = 3;
+    public final static long BUILD = 4;
     public static void main(String args[]) {
         System.out.println("I2P Router version: " + VERSION + "-" + BUILD);
         System.out.println("Router ID: " + RouterVersion.ID);