Index: trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java	(revision 15649)
@@ -95,4 +95,15 @@
 
     /**
+     * Determines if the given component tracks visibility changes.
+     * @param c The component.
+     * @return {@code true} if the given component tracks visibility changes
+     * @since 15649
+     */
+    public static synchronized boolean hasVisibilitySwitcher(Component c) {
+        if (c == null) return false;
+        return visibilityToggleListeners.containsListener(c);
+    }
+
+    /**
      * Constructs a new {@code ExpertToggleAction}.
      */
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/DrawAction.java	(revision 15649)
@@ -61,4 +61,5 @@
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
 import org.openstreetmap.josm.gui.NavigatableComponent;
+import org.openstreetmap.josm.gui.WindowMenu;
 import org.openstreetmap.josm.gui.draw.MapPath2D;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -194,5 +195,5 @@
             }
         }
-        return MainMenu.addWithCheckbox(MainApplication.getMenu().editMenu, snapChangeAction, MainMenu.WINDOW_MENU_GROUP.VOLATILE);
+        return MainMenu.addWithCheckbox(MainApplication.getMenu().editMenu, snapChangeAction, WindowMenu.WINDOW_MENU_GROUP.VOLATILE);
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/ExtrudeAction.java	(revision 15649)
@@ -51,4 +51,5 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.WindowMenu;
 import org.openstreetmap.josm.gui.draw.MapViewPath;
 import org.openstreetmap.josm.gui.draw.SymbolShape;
@@ -251,5 +252,5 @@
             }
         }
-        return MainMenu.addWithCheckbox(MainApplication.getMenu().editMenu, dualAlignChangeAction, MainMenu.WINDOW_MENU_GROUP.VOLATILE);
+        return MainMenu.addWithCheckbox(MainApplication.getMenu().editMenu, dualAlignChangeAction, WindowMenu.WINDOW_MENU_GROUP.VOLATILE);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 15649)
@@ -145,6 +145,4 @@
 public class MainMenu extends JMenuBar {
 
-    public enum WINDOW_MENU_GROUP { ALWAYS, TOGGLE_DIALOG, VOLATILE }
-
     /* File menu */
     /** File / New Layer **/
@@ -392,5 +390,5 @@
      * to use WINDOW_MENU_GROUP to determine the group integer.
      */
-    public final JMenu windowMenu = addMenu("Windows", /* I18N: mnemonic: W */ trc("menu", "Windows"), KeyEvent.VK_W, 11, ht("/ToggleDialogs"));
+    public final WindowMenu windowMenu = addMenu(new WindowMenu(), /* untranslated name */ "Windows", KeyEvent.VK_W, 11, ht("/ToggleDialogs"));
 
     /**
@@ -606,5 +604,5 @@
             boolean isEntryExpert, boolean isGroupSeparatorExpert) {
         int i = getInsertionIndexForGroup(menu, group.ordinal(), isGroupSeparatorExpert);
-        final JCheckBoxMenuItem mi = (JCheckBoxMenuItem) menu.add(new JCheckBoxMenuItem(action), i);
+        final JCheckBoxMenuItem mi = new JCheckBoxMenuItem(action);
         final KeyStroke ks = action.getShortcut().getKeyStroke();
         if (ks != null) {
@@ -614,5 +612,5 @@
             ExpertToggleAction.addVisibilitySwitcher(mi);
         }
-        return mi;
+        return (JCheckBoxMenuItem) menu.add(mi, i);
     }
 
@@ -857,5 +855,5 @@
         // -- changeset manager toggle action
         final JCheckBoxMenuItem mi = MainMenu.addWithCheckbox(windowMenu, changesetManager,
-                MainMenu.WINDOW_MENU_GROUP.ALWAYS, true, false);
+                WindowMenu.WINDOW_MENU_GROUP.ALWAYS, true, false);
         changesetManager.addButtonModel(mi.getModel());
 
Index: trunk/src/org/openstreetmap/josm/gui/WindowMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/WindowMenu.java	(revision 15649)
+++ trunk/src/org/openstreetmap/josm/gui/WindowMenu.java	(revision 15649)
@@ -0,0 +1,64 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+import java.awt.event.ContainerEvent;
+import java.awt.event.ContainerListener;
+import java.util.Arrays;
+
+import javax.swing.JMenu;
+
+import org.openstreetmap.josm.actions.ExpertToggleAction;
+import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
+
+/**
+ * Window menu, holding entries for changeset manager, toggle dialogs.
+ * @since 15649
+ */
+public class WindowMenu extends JMenu implements ContainerListener, ExpertModeChangeListener {
+
+    /**
+     * The possible item groups of the Windows menu.
+     * @see MainMenu#addWithCheckbox
+     */
+    public enum WINDOW_MENU_GROUP {
+        /** Entries always displayed, at the top */
+        ALWAYS,
+        /** Entries displayed only for visible toggle dialogs */
+        TOGGLE_DIALOG,
+        /** Volatile entries displayed at the end */
+        VOLATILE
+    }
+
+    /**
+     * Constructs a new {@code WindowMenu}
+     */
+    public WindowMenu() {
+        /* I18N: mnemonic: W */
+        super(trc("menu", "Windows"));
+        ExpertToggleAction.addExpertModeChangeListener(this);
+        getPopupMenu().addContainerListener(this);
+        setEnabledState();
+    }
+
+    @Override
+    public void expertChanged(boolean isExpert) {
+        setEnabledState();
+    }
+
+    @Override
+    public void componentAdded(ContainerEvent e) {
+        setEnabledState();
+    }
+
+    @Override
+    public void componentRemoved(ContainerEvent e) {
+        setEnabledState();
+    }
+
+    protected void setEnabledState() {
+        setEnabled(ExpertToggleAction.isExpert()
+                || Arrays.stream(getMenuComponents()).anyMatch(c -> !ExpertToggleAction.hasVisibilitySwitcher(c)));
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ToggleDialog.java	(revision 15649)
@@ -54,4 +54,5 @@
 import org.openstreetmap.josm.gui.ShowHideButtonListener;
 import org.openstreetmap.josm.gui.SideButton;
+import org.openstreetmap.josm.gui.WindowMenu;
 import org.openstreetmap.josm.gui.dialogs.DialogsPanel.Action;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -266,5 +267,5 @@
         windowMenuItem = MainMenu.addWithCheckbox(MainApplication.getMenu().windowMenu,
                 (JosmAction) getToggleAction(),
-                MainMenu.WINDOW_MENU_GROUP.TOGGLE_DIALOG, false, true);
+                WindowMenu.WINDOW_MENU_GROUP.TOGGLE_DIALOG, false, true);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 15649)
@@ -60,4 +60,5 @@
 import org.openstreetmap.josm.gui.MainMenu;
 import org.openstreetmap.josm.gui.ScrollViewport;
+import org.openstreetmap.josm.gui.WindowMenu;
 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
 import org.openstreetmap.josm.gui.dialogs.relation.actions.AbstractRelationEditorAction;
@@ -765,5 +766,5 @@
         };
         focusAction.putValue("relationEditor", re);
-        return MainMenu.add(MainApplication.getMenu().windowMenu, focusAction, MainMenu.WINDOW_MENU_GROUP.VOLATILE);
+        return MainMenu.add(MainApplication.getMenu().windowMenu, focusAction, WindowMenu.WINDOW_MENU_GROUP.VOLATILE);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/gui/help/HelpBrowser.java	(revision 15649)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MainMenu;
+import org.openstreetmap.josm.gui.WindowMenu;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
 import org.openstreetmap.josm.gui.widgets.JosmEditorPane;
@@ -214,5 +215,5 @@
             }
             if (windowMenuItem == null && visible) {
-                windowMenuItem = MainMenu.add(menu.windowMenu, FOCUS_ACTION, MainMenu.WINDOW_MENU_GROUP.VOLATILE);
+                windowMenuItem = MainMenu.add(menu.windowMenu, FOCUS_ACTION, WindowMenu.WINDOW_MENU_GROUP.VOLATILE);
             }
         }
Index: trunk/src/org/openstreetmap/josm/tools/ListenerList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ListenerList.java	(revision 15648)
+++ trunk/src/org/openstreetmap/josm/tools/ListenerList.java	(revision 15649)
@@ -113,5 +113,11 @@
     }
 
-    private boolean containsListener(T listener) {
+    /**
+     * Determines if this listener list contains the given listener.
+     * @param listener listener to find
+     * @return {@code true} is the listener is known
+     * @since 15649
+     */
+    public synchronized boolean containsListener(T listener) {
         return listeners.contains(listener) || weakListeners.contains(new WeakListener<>(listener));
     }
