diff --git a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java
index 11f002a51ff59c403a114c8b1d73384ed73f5b07..2d1eed6ee1c7fdb4cb473f26ab0ac53ff4d65dad 100644
--- a/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java
+++ b/apps/desktopgui/src/net/i2p/desktopgui/InternalTrayManager.java
@@ -12,12 +12,14 @@ import javax.swing.JMenuItem;
 import javax.swing.JPopupMenu;
 import javax.swing.SwingWorker;
 
+import net.i2p.data.DataHelper;
 import net.i2p.desktopgui.router.RouterManager;
 import net.i2p.desktopgui.util.BrowseException;
 import net.i2p.desktopgui.util.I2PDesktop;
 import net.i2p.router.RouterContext;
 import net.i2p.util.Log;
 import net.i2p.util.PortMapper;
+import net.i2p.util.Translate;
 
 /**
  *  java -cp i2p.jar:router.jar:desktopgui.jar net.i2p.desktopgui.Main
@@ -28,11 +30,14 @@ class InternalTrayManager extends TrayManager {
 	
     private final RouterContext _context;
     private final Log log;
-    private MenuItem _restartItem, _stopItem, _cancelItem;
-    private JMenuItem _jrestartItem, _jstopItem, _jcancelItem;
+    private MenuItem _statusItem, _browserItem, _configItem, _restartItem, _stopItem,
+                     _restartHardItem, _stopHardItem, _cancelItem;
+    private JMenuItem _jstatusItem, _jbrowserItem, _jconfigItem, _jrestartItem, _jstopItem,
+                      _jrestartHardItem, _jstopHardItem, _jcancelItem;
 
     private static final boolean CONSOLE_ENABLED = Desktop.isDesktopSupported() &&
                                                    Desktop.getDesktop().isSupported(Action.BROWSE);
+    private static final String CONSOLE_BUNDLE_NAME = "net.i2p.router.web.messages";
 
     public InternalTrayManager(RouterContext ctx, Main main, boolean useSwing) {
         super(ctx, main, useSwing);
@@ -40,10 +45,12 @@ class InternalTrayManager extends TrayManager {
         log = ctx.logManager().getLog(InternalTrayManager.class);
     }
 
-    public PopupMenu getMainMenu() {
+    public synchronized PopupMenu getMainMenu() {
         PopupMenu popup = new PopupMenu();
         
-        MenuItem browserLauncher;
+        final MenuItem statusItem = new MenuItem("");
+
+        final MenuItem browserLauncher;
         if (CONSOLE_ENABLED) {
             browserLauncher = new MenuItem(_t("Launch I2P Browser"));
             browserLauncher.addActionListener(new ActionListener() {
@@ -161,6 +168,8 @@ class InternalTrayManager extends TrayManager {
             }
         });
 
+        popup.add(statusItem);
+        popup.addSeparator();
         if (CONSOLE_ENABLED) {
             popup.add(browserLauncher);
             popup.addSeparator();
@@ -176,17 +185,24 @@ class InternalTrayManager extends TrayManager {
         popup.add(stopItem2);
         popup.add(cancelItem);
         
+        _statusItem = statusItem;
+        _browserItem = browserLauncher;
+        _configItem = desktopguiConfigurationLauncher;
         _restartItem = restartItem;
         _stopItem = stopItem;
+        _restartHardItem = restartItem2;
+        _stopHardItem = stopItem2;
         _cancelItem = cancelItem;
 
         return popup;
     }
 
-    public JPopupMenu getSwingMainMenu() {
+    public synchronized JPopupMenu getSwingMainMenu() {
         JPopupMenu popup = new JPopupMenu();
         
-        JMenuItem browserLauncher;
+        final JMenuItem statusItem = new JMenuItem("");
+
+        final JMenuItem browserLauncher;
         if (CONSOLE_ENABLED) {
             browserLauncher = new JMenuItem(_t("Launch I2P Browser"));
             browserLauncher.addActionListener(new ActionListener() {
@@ -304,6 +320,8 @@ class InternalTrayManager extends TrayManager {
             }
         });
 
+        popup.add(statusItem);
+        popup.addSeparator();
         if (CONSOLE_ENABLED) {
             popup.add(browserLauncher);
             popup.addSeparator();
@@ -319,8 +337,13 @@ class InternalTrayManager extends TrayManager {
         popup.add(stopItem2);
         popup.add(cancelItem);
         
+        _jstatusItem = statusItem;
+        _jbrowserItem = browserLauncher;
+        _jconfigItem = desktopguiConfigurationLauncher;
         _jrestartItem = restartItem;
         _jstopItem = stopItem;
+        _jrestartHardItem = restartItem2;
+        _jstopHardItem = stopItem2;
         _jcancelItem = cancelItem;
 
         return popup;
@@ -330,20 +353,59 @@ class InternalTrayManager extends TrayManager {
      * Update the menu
      * @since 0.9.26
      */
-    protected void updateMenu() {
+    protected synchronized void updateMenu() {
         boolean x = RouterManager.isShutdownInProgress(_context);
+        boolean imminent = false;
+        String status;
+        if (x) {
+            long time = RouterManager.getShutdownTimeRemaining(_context);
+            if (time > 5000) {
+                status = _t("Shutdown in {0}", DataHelper.formatDuration2(time).replace(" ", " "));
+            } else {
+                status = _t("Shutdown imminent");
+                imminent = true;
+            }
+        } else {
+            // status translations are in the console bundle
+            status = _t("Network") + ": " +
+                     Translate.getString(RouterManager.getStatus(_context), _context, CONSOLE_BUNDLE_NAME);
+        }
+        PopupMenu awt = trayIcon.getPopupMenu();
+        if (awt != null) {
+            awt.remove(0);
+            awt.insert(status, 0);
+        }
+        if (_browserItem != null)
+            _browserItem.setEnabled(!imminent);
+        if (_configItem != null)
+            _configItem.setEnabled(!imminent);
         if (_restartItem != null)
             _restartItem.setEnabled(!x);
         if (_stopItem != null)
             _stopItem.setEnabled(!x);
+        if (_restartHardItem != null)
+            _restartHardItem.setEnabled(!imminent);
+        if (_stopHardItem != null)
+            _stopHardItem.setEnabled(!imminent);
         if (_cancelItem != null)
-            _cancelItem.setEnabled(x);
+            _cancelItem.setEnabled(x && !imminent);
+
+        if (_jstatusItem != null)
+            _jstatusItem.setText(status);
+        if (_jbrowserItem != null)
+            _jbrowserItem.setVisible(!imminent);
+        if (_jconfigItem != null)
+            _jconfigItem.setVisible(!imminent);
         if (_jrestartItem != null)
-            _jrestartItem.setEnabled(!x);
+            _jrestartItem.setVisible(!x);
         if (_jstopItem != null)
-            _jstopItem.setEnabled(!x);
+            _jstopItem.setVisible(!x);
+        if (_jrestartHardItem != null)
+            _jrestartHardItem.setVisible(!imminent);
+        if (_jstopHardItem != null)
+            _jstopHardItem.setVisible(!imminent);
         if (_jcancelItem != null)
-            _jcancelItem.setEnabled(x);
+            _jcancelItem.setVisible(x && !imminent);
     }
 
     /**
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java
index f5ff8a40534bddfb221b5cc61a2129adc0afd97a..2df63f2af9c28af4d68c514d27795eb3ca532501 100644
--- a/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java
+++ b/apps/desktopgui/src/net/i2p/desktopgui/TrayManager.java
@@ -192,4 +192,11 @@ abstract class TrayManager {
     protected String _t(String s) {
         return DesktopguiTranslator._t(_appContext, s);
     }
+    
+    /**
+     * @since 0.9.26
+     */
+    protected String _t(String s, Object o) {
+        return DesktopguiTranslator._t(_appContext, s, o);
+    }
 }
diff --git a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java
index 4d2f8e2143dbd67022c0524127c224d811370dae..fde992dc4d17239a3cd8a6fadf9d4ff99f953a5e 100644
--- a/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java
+++ b/apps/desktopgui/src/net/i2p/desktopgui/router/RouterManager.java
@@ -97,4 +97,21 @@ public class RouterManager {
     public static boolean isShutdownInProgress(RouterContext ctx) {
         return ctx.router().scheduledGracefulExitCode() > 0;
     }
+
+    /**
+     * Get time until shutdown
+     * @return -1 if no shutdown in progress.
+     * @since 0.9.26
+     */
+    public static long getShutdownTimeRemaining(RouterContext ctx) {
+        return ctx.router().getShutdownTimeRemaining();
+    }
+
+    /**
+     * Get network status, untranslated
+     * @since 0.9.26
+     */
+    public static String getStatus(RouterContext ctx) {
+        return ctx.commSystem().getStatus().toStatusString();
+    }
 }