diff --git a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java
index 418c0cfceddd7fdbc50f285922988fc4804e77b5..799d53866d23dc7e8a856ba6b7b09e08458ee59d 100644
--- a/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java
+++ b/apps/routerconsole/java/src/net/i2p/router/web/helpers/NetDbRenderer.java
@@ -651,7 +651,7 @@ class NetDbRenderer {
                        .append(lease.getTunnelId().getTunnelId()).append("</span></span> ");
                 }
                 if (debug) {
-                    long exl = lease.getEndDate().getTime() - now;
+                    long exl = lease.getEndTime() - now;
                     if (exl > 0)
                         buf.append("<b class=\"netdb_expiry\">").append(_t("Expires in {0}", DataHelper.formatDuration2(exl))).append("</b>");
                     else
diff --git a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
index 515f4a24f647323db2b4f482314d141cf7363cff..546213211b8705017471d8d5572e6fe0fb104577 100644
--- a/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/RequestLeaseSetMessageHandler.java
@@ -158,7 +158,7 @@ class RequestLeaseSetMessageHandler extends HandlerImpl {
                 lease.setTunnelId(msg.getTunnelId(i));
             }
             lease.setGateway(msg.getRouter(i));
-            lease.setEndDate(msg.getEndDate());
+            lease.setEndDate(msg.getEndDate().getTime());
             //lease.setStartDate(msg.getStartDate());
             leaseSet.addLease(lease);
         }
diff --git a/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java
index 4f47d51c1c05967002eea804bf42650c0bc3f900..adeaccba1f04a5eb369523dd2946ed31d2c676a8 100644
--- a/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java
+++ b/core/java/src/net/i2p/client/impl/RequestVariableLeaseSetMessageHandler.java
@@ -71,7 +71,7 @@ class RequestVariableLeaseSetMessageHandler extends RequestLeaseSetMessageHandle
                     lease.setTunnelId(old.getTunnelId());
                 }
                 lease.setGateway(old.getGateway());
-                lease.setEndDate(old.getEndDate());
+                lease.setEndDate(old.getEndTime());
             } else {
                 lease = msg.getEndpoint(i);
             }
diff --git a/core/java/src/net/i2p/data/Lease.java b/core/java/src/net/i2p/data/Lease.java
index f2e3cf1cb0f35d3f40421ec536ffbd70b1cdd96c..44efe47e6e546e369ffee4d7e783650ba12ca0b2 100644
--- a/core/java/src/net/i2p/data/Lease.java
+++ b/core/java/src/net/i2p/data/Lease.java
@@ -25,7 +25,7 @@ import net.i2p.util.Clock;
 public class Lease extends DataStructureImpl {
     protected Hash _gateway;
     protected TunnelId _tunnelId;
-    protected Date _end;
+    protected long _end;
 
     public Lease() {
     }
@@ -58,11 +58,32 @@ public class Lease extends DataStructureImpl {
         _tunnelId = id;
     }
 
+    /**
+     * @deprecated use getEndTime()
+     */
+    @Deprecated
     public Date getEndDate() {
-        return _end;
+        return new Date(_end);
     }
 
+    /**
+     * @deprecated use setEndDate(long)
+     */
     public void setEndDate(Date date) {
+        _end = date.getTime();
+    }
+
+    /**
+     * @since 0.9.48
+     */
+    public long getEndTime() {
+        return _end;
+    }
+
+    /**
+     * @since 0.9.48
+     */
+    public void setEndDate(long date) {
         _end = date;
     }
 
@@ -107,8 +128,7 @@ public class Lease extends DataStructureImpl {
 
     /** has this lease already expired (giving allowing up the fudgeFactor milliseconds for clock skew)? */
     public boolean isExpired(long fudgeFactor) {
-        if (_end == null) return true;
-        return _end.getTime() < Clock.getInstance().now() - fudgeFactor;
+        return _end < Clock.getInstance().now() - fudgeFactor;
     }
     
     public void readBytes(InputStream in) throws DataFormatException, IOException {
@@ -117,7 +137,7 @@ public class Lease extends DataStructureImpl {
         _gateway = Hash.create(in);
         _tunnelId = new TunnelId();
         _tunnelId.readBytes(in);
-        _end = DataHelper.readDate(in);
+        _end = DataHelper.readLong(in, 8);
     }
     
     public void writeBytes(OutputStream out) throws DataFormatException, IOException {
@@ -126,7 +146,7 @@ public class Lease extends DataStructureImpl {
 
         _gateway.writeBytes(out);
         _tunnelId.writeBytes(out);
-        DataHelper.writeDate(out, _end);
+        DataHelper.writeLong(out, 8, _end);
     }
     
     @Override
@@ -134,7 +154,7 @@ public class Lease extends DataStructureImpl {
         if (object == this) return true;
         if ((object == null) || !(object instanceof Lease)) return false;
         Lease lse = (Lease) object;
-        return DataHelper.eq(_end, lse.getEndDate())
+        return _end == lse.getEndTime()
                && DataHelper.eq(_tunnelId, lse.getTunnelId())
                && DataHelper.eq(_gateway, lse.getGateway());
 
@@ -142,15 +162,15 @@ public class Lease extends DataStructureImpl {
     
     @Override
     public int hashCode() {
-        return DataHelper.hashCode(_end) + DataHelper.hashCode(_gateway)
-               + DataHelper.hashCode(_tunnelId);
+        return (int) _end ^ DataHelper.hashCode(_gateway)
+               ^ DataHelper.hashCode(_tunnelId);
     }
     
     @Override
     public String toString() {
         StringBuilder buf = new StringBuilder(128);
         buf.append("[Lease: ");
-        buf.append("\n\tEnd Date: ").append(_end);
+        buf.append("\n\tEnd Date: ").append(DataHelper.formatTime(_end));
         buf.append("\n\tGateway: ").append(_gateway);
         buf.append("\n\tTunnelId: ").append(_tunnelId);
         buf.append("]");
diff --git a/core/java/src/net/i2p/data/Lease2.java b/core/java/src/net/i2p/data/Lease2.java
index 902f97ebc513fe6725ada9d30ef6861fcf316b95..278f432acf880a6d137b737f057f94d28adc83a0 100644
--- a/core/java/src/net/i2p/data/Lease2.java
+++ b/core/java/src/net/i2p/data/Lease2.java
@@ -22,7 +22,7 @@ public class Lease2 extends Lease {
         _gateway = Hash.create(in);
         _tunnelId = new TunnelId();
         _tunnelId.readBytes(in);
-        _end = new Date(DataHelper.readLong(in, 4) * 1000);
+        _end = DataHelper.readLong(in, 4) * 1000;
     }
     
     @Override
@@ -31,7 +31,7 @@ public class Lease2 extends Lease {
             throw new DataFormatException("Not enough data to write out a Lease");
         _gateway.writeBytes(out);
         _tunnelId.writeBytes(out);
-        DataHelper.writeLong(out, 4, _end.getTime() / 1000);
+        DataHelper.writeLong(out, 4, _end / 1000);
     }
     
     @Override
@@ -39,14 +39,14 @@ public class Lease2 extends Lease {
         if (object == this) return true;
         if ((object == null) || !(object instanceof Lease2)) return false;
         Lease2 lse = (Lease2) object;
-        return DataHelper.eq(_end, lse.getEndDate())
+        return _end == lse.getEndTime()
                && DataHelper.eq(_tunnelId, lse.getTunnelId())
                && DataHelper.eq(_gateway, lse.getGateway());
     }
     
     @Override
     public int hashCode() {
-        return (int) _end.getTime() ^ DataHelper.hashCode(_gateway)
+        return (int) _end ^ DataHelper.hashCode(_gateway)
                ^ (int) _tunnelId.getTunnelId();
     }
 }
diff --git a/core/java/src/net/i2p/data/LeaseSet.java b/core/java/src/net/i2p/data/LeaseSet.java
index 2a612a8d6de8cbe79bf584f95ccbe5173e78763c..856fe0d989f7e238ce87ae4045529331cd96d363 100644
--- a/core/java/src/net/i2p/data/LeaseSet.java
+++ b/core/java/src/net/i2p/data/LeaseSet.java
@@ -236,7 +236,7 @@ public class LeaseSet extends DatabaseEntry {
         if (_leases.size() >= MAX_LEASES)
             throw new IllegalArgumentException("Too many leases - max is " + MAX_LEASES);
         _leases.add(lease);
-        long expire = lease.getEndDate().getTime();
+        long expire = lease.getEndTime();
         if (expire < _firstExpiration)
             _firstExpiration = expire;
         if (expire > _lastExpiration)
@@ -517,7 +517,7 @@ public class LeaseSet extends DatabaseEntry {
         RandomSource.getInstance().nextBytes(enc, datalen, padlen);
         // add the padded lease...
         Lease padLease = new Lease();
-        padLease.setEndDate(_leases.get(0).getEndDate());
+        padLease.setEndDate(_leases.get(0).getEndTime());
         _leases.add(padLease);
         // ...and replace all the gateways and tunnel ids
         ByteArrayInputStream bais = new ByteArrayInputStream(enc);
@@ -567,7 +567,7 @@ public class LeaseSet extends DatabaseEntry {
             TunnelId t = new TunnelId();
             t.readBytes(bais);
             l.setTunnelId(t);
-            l.setEndDate(_leases.get(i).getEndDate());
+            l.setEndDate(_leases.get(i).getEndTime());
             _decryptedLeases.add(l);
         }
     }
diff --git a/core/java/src/net/i2p/data/MetaLease.java b/core/java/src/net/i2p/data/MetaLease.java
index dad2a344c74a2da61db67e8ca3dbfc039816060a..ba1af4681f447af945405195e035e16f64419111 100644
--- a/core/java/src/net/i2p/data/MetaLease.java
+++ b/core/java/src/net/i2p/data/MetaLease.java
@@ -62,7 +62,7 @@ public class MetaLease extends Lease {
         DataHelper.skip(in, 2);
         _type = in.read();
         _cost = in.read();
-        _end = new Date(DataHelper.readLong(in, 4) * 1000);
+        _end = DataHelper.readLong(in, 4) * 1000;
     }
     
     @Override
@@ -74,7 +74,7 @@ public class MetaLease extends Lease {
         DataHelper.writeLong(out, 2, 0);
         out.write(_type);
         out.write(_cost);
-        DataHelper.writeLong(out, 4, _end.getTime() / 1000);
+        DataHelper.writeLong(out, 4, _end / 1000);
     }
     
     @Override
@@ -82,7 +82,7 @@ public class MetaLease extends Lease {
         if (object == this) return true;
         if ((object == null) || !(object instanceof MetaLease)) return false;
         MetaLease lse = (MetaLease) object;
-        return DataHelper.eq(_end, lse.getEndDate())
+        return _end == lse.getEndTime()
                && _type == lse._type
                && _cost == lse._cost
                && DataHelper.eq(_gateway, lse.getGateway());
@@ -90,7 +90,7 @@ public class MetaLease extends Lease {
     
     @Override
     public int hashCode() {
-        return (int) _end.getTime() ^ DataHelper.hashCode(_gateway)
+        return (int) _end ^ DataHelper.hashCode(_gateway)
                ^ _cost;
     }
     
@@ -98,7 +98,7 @@ public class MetaLease extends Lease {
     public String toString() {
         StringBuilder buf = new StringBuilder(128);
         buf.append("[Meta Lease: ");
-        buf.append("\n\tEnd Date: ").append(_end);
+        buf.append("\n\tEnd Date: ").append(DataHelper.formatTime(_end));
         buf.append("\n\tTarget: ").append(_gateway);
         buf.append("\n\tCost: ").append(_cost);
         buf.append("\n\tType: ").append(_type);
diff --git a/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java b/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java
index 2667ab1174fb6da52d50ec02ede290d48d52667f..c3a9abadf6aadf83a83328ae913a303bb544dbb7 100644
--- a/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java
+++ b/router/java/src/net/i2p/router/client/RequestLeaseSetJob.java
@@ -102,12 +102,12 @@ class RequestLeaseSetJob extends JobImpl {
             rmsg.setSessionId(id);
             for (int i = 0; i < requested.getLeaseCount(); i++) {
                 Lease lease = requested.getLease(i);
-                if (lease.getEndDate().getTime() < endTime) {
+                if (lease.getEndTime() < endTime) {
                     // don't modify old object, we don't know where it came from
                     Lease nl = new Lease();
                     nl.setGateway(lease.getGateway());
                     nl.setTunnelId(lease.getTunnelId());
-                    nl.setEndDate(new Date(endTime));
+                    nl.setEndDate(endTime);
                     lease = nl;
                     //if (_log.shouldLog(Log.INFO))
                     //    _log.info("Adjusted end date to " + endTime + " for " + lease);
diff --git a/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java
index 1dc45eb613c32bb5035b90f39c7406b7841f43b6..1e2a1487bb2b6115d863067401b5638bb0c6b378 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/AliasedTunnelPool.java
@@ -123,7 +123,7 @@ public class AliasedTunnelPool extends TunnelPool {
         for (int i = 0; i < ls.getLeaseCount(); i++) {
             Lease old = ls.getLease(i);
             Lease lease = new Lease();
-            lease.setEndDate(old.getEndDate());
+            lease.setEndDate(old.getEndTime());
             lease.setTunnelId(old.getTunnelId());
             lease.setGateway(old.getGateway());
             rv.addLease(lease);
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 3839fa5c77ed2c7592a38807bb87190dcaebb602..320c9c40293f82f6cd4d8f80ae8ae2979e24b3e0 100644
--- a/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
+++ b/router/java/src/net/i2p/router/tunnel/pool/TunnelPool.java
@@ -652,7 +652,13 @@ public class TunnelPool {
      */
     private static class LeaseComparator implements Comparator<Lease>, Serializable {
          public int compare(Lease l, Lease r) {
-             return r.getEndDate().compareTo(l.getEndDate());
+             long lt = l.getEndTime();
+             long rt = r.getEndTime();
+             if (rt > lt)
+                 return 1;
+             if (rt < lt)
+                 return -1;
+             return 0;
         }
     }
 
@@ -755,7 +761,7 @@ public class TunnelPool {
             // Get the "real" expiration from the gateway hop config,
             // HopConfig expirations are the same as the "real" expiration and don't change
             // see configureNewTunnel()
-            lease.setEndDate(new Date(((TunnelCreatorConfig)tunnel).getConfig(0).getExpiration()));
+            lease.setEndDate(((TunnelCreatorConfig)tunnel).getConfig(0).getExpiration());
             lease.setTunnelId(inId);
             lease.setGateway(gw);
             leases.add(lease);