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 29c29bca43f65206ed0a5ad0f6b7a1cb0c700d78..418c0cfceddd7fdbc50f285922988fc4804e77b5 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
@@ -597,10 +597,15 @@ class NetDbRenderer {
                 if (type != DatabaseEntry.KEY_TYPE_LEASESET) {
                     LeaseSet2 ls2 = (LeaseSet2) ls;
                     buf.append("&nbsp;&nbsp;<b>Unpublished? </b>").append(ls2.isUnpublished());
-                    boolean isOff = ls2.isOffline();
-                    buf.append("&nbsp;&nbsp;<b>Offline signed? </b>").append(isOff);
-                    if (isOff)
+                    if (ls2.isOffline()) {
+                        buf.append("&nbsp;&nbsp;<b>Offline signed: </b>");
+                        exp = ls2.getTransientExpiration() - now;
+                        if (exp > 0)
+                            buf.append(_t("Expires in {0}", DataHelper.formatDuration2(exp)));
+                        else
+                            buf.append(_t("Expired {0} ago", DataHelper.formatDuration2(0-exp)));
                         buf.append("&nbsp;&nbsp;<b>Type: </b>").append(ls2.getTransientSigningKey().getType());
+                    }
                 }
                 buf.append("</td></tr>\n<tr><td colspan=\"2\">");
                 //buf.append(dest.toBase32()).append("<br>");
diff --git a/core/java/src/net/i2p/data/LeaseSet2.java b/core/java/src/net/i2p/data/LeaseSet2.java
index 7f7972fe8533451bf215d380662246b3864782a1..b1fc39a5cf0a6b98cbd336e53d5778ed65a1203c 100644
--- a/core/java/src/net/i2p/data/LeaseSet2.java
+++ b/core/java/src/net/i2p/data/LeaseSet2.java
@@ -252,6 +252,15 @@ public class LeaseSet2 extends LeaseSet {
         return _transientSigningPublicKey;
     }
 
+    /**
+     *  Absolute time, not time from now.
+     *  @return transient expiration time or 0 if not offline signed
+     *  @since 0.9.48
+     */
+    public long getTransientExpiration() {
+        return _transientExpires;
+    }
+
     /**
      *  Destination must be previously set.
      *