diff --git a/router/java/src/net/i2p/data/i2np/GarlicClove.java b/router/java/src/net/i2p/data/i2np/GarlicClove.java
index 218f23579359dba135b4a384dbbf24bfba2ba8dc..e6308fe2937e1c986ba81c3ef3bea99a19ce3940 100644
--- a/router/java/src/net/i2p/data/i2np/GarlicClove.java
+++ b/router/java/src/net/i2p/data/i2np/GarlicClove.java
@@ -11,7 +11,6 @@ package net.i2p.data.i2np;
 import java.io.IOException;
 import java.io.InputStream;
 import java.io.OutputStream;
-import java.util.Date;
 
 import net.i2p.I2PAppContext;
 import net.i2p.data.Certificate;
@@ -35,7 +34,7 @@ public class GarlicClove extends DataStructureImpl {
     private DeliveryInstructions _instructions;
     private I2NPMessage _msg;
     private long _cloveId;
-    private Date _expiration;
+    private long _expiration;
     private Certificate _certificate;
     
     public GarlicClove(I2PAppContext context) {
@@ -49,8 +48,8 @@ public class GarlicClove extends DataStructureImpl {
     public void setData(I2NPMessage msg) { _msg = msg; }
     public long getCloveId() { return _cloveId; }
     public void setCloveId(long id) { _cloveId = id; }
-    public Date getExpiration() { return _expiration; }
-    public void setExpiration(Date exp) { _expiration = exp; }
+    public long getExpiration() { return _expiration; }
+    public void setExpiration(long exp) { _expiration = exp; }
     public Certificate getCertificate() { return _certificate; }
     public void setCertificate(Certificate cert) { _certificate = cert; }
     
@@ -79,7 +78,7 @@ public class GarlicClove extends DataStructureImpl {
         }
         _cloveId = DataHelper.fromLong(source, cur, 4);
         cur += 4;
-        _expiration = DataHelper.fromDate(source, cur);
+        _expiration = DataHelper.fromLong(source, cur, 8);
         cur += DataHelper.DATE_LENGTH;
         _certificate = Certificate.create(source, cur);
         cur += _certificate.size();
@@ -99,7 +98,7 @@ public class GarlicClove extends DataStructureImpl {
             I2NPMessageHandler handler = new I2NPMessageHandler(_context);
             _msg = I2NPMessageImpl.fromRawByteArrayNTCP2(_context, source, offset + isz, len - isz, handler);
             _cloveId = _msg.getUniqueId();
-            _expiration = new Date(_msg.getMessageExpiration());
+            _expiration = _msg.getMessageExpiration();
             _certificate = Certificate.NULL_CERT;
         } catch (I2NPMessageException ime) {
             throw new DataFormatException("Unable to read the message from a garlic clove", ime);
@@ -125,7 +124,7 @@ public class GarlicClove extends DataStructureImpl {
         offset = _msg.toByteArray(rv, offset);
         DataHelper.toLong(rv, offset, 4, _cloveId);
         offset += 4;
-        DataHelper.toDate(rv, offset, _expiration.getTime());
+        DataHelper.toLong(rv, offset, 8, _expiration);
         offset += DataHelper.DATE_LENGTH;
         offset += _certificate.writeBytes(rv, offset);
         if (offset != rv.length) {
@@ -173,7 +172,7 @@ public class GarlicClove extends DataStructureImpl {
         return DataHelper.eq(_certificate, clove._certificate) &&
                _cloveId == clove._cloveId &&
                DataHelper.eq(_msg, clove._msg) &&
-               DataHelper.eq(_expiration, clove._expiration) &&
+               _expiration == clove._expiration &&
                DataHelper.eq(_instructions,  clove._instructions);
     }
     
@@ -182,7 +181,7 @@ public class GarlicClove extends DataStructureImpl {
         return DataHelper.hashCode(_certificate) ^
                (int) _cloveId ^
                DataHelper.hashCode(_msg) ^
-               DataHelper.hashCode(_expiration) ^
+               (int) _expiration ^
                DataHelper.hashCode(_instructions);
     }
     
@@ -193,7 +192,7 @@ public class GarlicClove extends DataStructureImpl {
         buf.append("\n\tInstructions: ").append(_instructions);
         buf.append("\n\tCertificate: ").append(_certificate);
         buf.append("\n\tClove ID: ").append(_cloveId);
-        buf.append("\n\tExpiration: ").append(_expiration);
+        buf.append("\n\tExpiration: ").append(DataHelper.formatTime(_expiration));
         buf.append("\n\tData: ").append(_msg);
         buf.append("]");
         return buf.toString();
diff --git a/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java b/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java
index 0d3b61c19fc154423a72723a88310884bff319b7..7527d9a1fa1bc7bc104e9d755cba934f88b0f600 100644
--- a/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java
+++ b/router/java/src/net/i2p/router/message/GarlicMessageBuilder.java
@@ -467,7 +467,7 @@ public class GarlicMessageBuilder {
     private static byte[] buildCommonClove(GarlicClove clove, GarlicConfig config) {
         clove.setCertificate(config.getCertificate());
         clove.setCloveId(config.getId());
-        clove.setExpiration(new Date(config.getExpiration()));
+        clove.setExpiration(config.getExpiration());
         clove.setInstructions(config.getDeliveryInstructions());
         return clove.toByteArray();
     }
@@ -514,7 +514,7 @@ public class GarlicMessageBuilder {
         clove.setData(config.getPayload());
         clove.setCertificate(Certificate.NULL_CERT);
         clove.setCloveId(0);
-        clove.setExpiration(new Date(config.getExpiration()));
+        clove.setExpiration(config.getExpiration());
         clove.setInstructions(config.getDeliveryInstructions());
         return clove;
     }
diff --git a/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java b/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java
index 8d7ec11e209c6e4fef9a68f8f64bca4fb5a9265e..d2a1600cf79e5d4e877dcd46279742e372b9014e 100644
--- a/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java
+++ b/router/java/src/net/i2p/router/message/GarlicMessageReceiver.java
@@ -134,11 +134,11 @@ public class GarlicMessageReceiver {
         // is no longer a separate field for the clove ID in the transmission format.
         //String invalidReason = _context.messageValidator().validateMessage(clove.getCloveId(), 
         //                                                                   clove.getExpiration().getTime());
-        String invalidReason = _context.messageValidator().validateMessage(clove.getExpiration().getTime());
+        String invalidReason = _context.messageValidator().validateMessage(clove.getExpiration());
 
         boolean rv = invalidReason == null;
         if (!rv) {
-            String howLongAgo = DataHelper.formatDuration(_context.clock().now()-clove.getExpiration().getTime());
+            String howLongAgo = DataHelper.formatDuration(_context.clock().now()-clove.getExpiration());
             if (_log.shouldInfo())
                 _log.info("Clove is NOT valid: id=" + clove.getCloveId() 
                            + " expiration " + howLongAgo + " ago", new Exception("Invalid within..."));