Index: trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java	(revision 4842)
+++ trunk/src/org/openstreetmap/josm/actions/ExpertToggleAction.java	(revision 4843)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.lang.ref.WeakReference;
@@ -24,15 +25,32 @@
 
     private static final List<WeakReference<ExpertModeChangeListener>> listeners = new ArrayList<WeakReference<ExpertModeChangeListener>>();
+    private static final List<WeakReference<Component>> visibilityToggleListeners = new ArrayList<WeakReference<Component>>();
+
+    private static ExpertToggleAction INSTANCE = new ExpertToggleAction();
 
     private synchronized static void fireExpertModeChanged(boolean isExpert) {
-        Iterator<WeakReference<ExpertModeChangeListener>> it = listeners.iterator();
-        while (it.hasNext()) {
-            WeakReference<ExpertModeChangeListener> wr = it.next();
-            ExpertModeChangeListener listener = wr.get();
-            if (listener == null) {
-                it.remove();
-                continue;
+        {
+            Iterator<WeakReference<ExpertModeChangeListener>> it = listeners.iterator();
+            while (it.hasNext()) {
+                WeakReference<ExpertModeChangeListener> wr = it.next();
+                ExpertModeChangeListener listener = wr.get();
+                if (listener == null) {
+                    it.remove();
+                    continue;
+                }
+                listener.expertChanged(isExpert);
             }
-            listener.expertChanged(isExpert);
+        }
+        {
+            Iterator<WeakReference<Component>> it = visibilityToggleListeners.iterator();
+            while (it.hasNext()) {
+                WeakReference<Component> wr = it.next();
+                Component c = wr.get();
+                if (c == null) {
+                    it.remove();
+                    continue;
+                }
+                c.setVisible(isExpert);
+            }
         }
     }
@@ -55,5 +73,5 @@
         listeners.add(new WeakReference<ExpertModeChangeListener>(listener));
         if (fireWhenAdding) {
-            listener.expertChanged(Main.main.menu.expert.isSelected());
+            listener.expertChanged(isExpert());
         }
     }
@@ -72,4 +90,27 @@
             // collected in the meantime
             if (wr.get() == null || wr.get() == listener) {
+                it.remove();
+            }
+        }
+    }
+
+    public synchronized static void addVisibilitySwitcher(Component c) {
+        if (c == null) return;
+        for (WeakReference<Component> wr : visibilityToggleListeners) {
+            // already registered ? => abort
+            if (wr.get() == c) return;
+        }
+        visibilityToggleListeners.add(new WeakReference<Component>(c));
+        c.setVisible(isExpert());
+    }
+
+    public synchronized static void removeVisibilitySwitcher(Component c) {
+        if (c == null) return;
+        Iterator<WeakReference<Component>> it = visibilityToggleListeners.iterator();
+        while (it.hasNext()) {
+            WeakReference<Component> wr = it.next();
+            // remove the listener - and any other listener which god garbage
+            // collected in the meantime
+            if (wr.get() == null || wr.get() == c) {
                 it.remove();
             }
@@ -126,3 +167,11 @@
         return selected;
     }
+
+    public static ExpertToggleAction getInstance() {
+        return INSTANCE;
+    }
+
+    public static boolean isExpert() {
+        return INSTANCE.isSelected();
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4842)
+++ trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4843)
@@ -105,5 +105,5 @@
             String hiddenFlagStr = Main.pref.get(getPreferenceKey(), null);
             if (hiddenFlagStr == null) {
-                if (isExpert && !Main.main.menu.expert.isSelected()) {
+                if (isExpert && !ExpertToggleAction.isExpert()) {
                     hiddenFlag = true;
                 }
@@ -121,6 +121,6 @@
             if (!b) listener.buttonShown(); else listener.buttonHidden();
         }
-        if ((b && isExpert && !Main.main.menu.expert.isSelected()) ||
-            (!b && isExpert && Main.main.menu.expert.isSelected())) {
+        if ((b && isExpert && !ExpertToggleAction.isExpert()) ||
+            (!b && isExpert && ExpertToggleAction.isExpert())) {
             Main.pref.put(getPreferenceKey(), null);
         } else {
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 4842)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 4843)
@@ -2,9 +2,10 @@
 package org.openstreetmap.josm.gui;
 
-import java.awt.Toolkit;
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Component;
+import java.awt.Toolkit;
 import java.awt.event.KeyEvent;
 
@@ -159,5 +160,4 @@
     public final HistoryInfoAction historyinfo = new HistoryInfoAction();
     public final HistoryInfoWebAction historyinfoweb = new HistoryInfoWebAction();
-    public final ExpertToggleAction expert = new ExpertToggleAction();
 
     /* Tools menu */
@@ -265,11 +265,18 @@
      */
     public static JMenuItem add(JMenu menu, JosmAction action) {
+        return add(menu, action, false);
+    }
+
+    public static JMenuItem add(JMenu menu, JosmAction action, boolean isExpert) {
         if (action.getShortcut().getAutomatic())
             return null;
         JMenuItem menuitem = menu.add(action);
-            KeyStroke ks = action.getShortcut().getKeyStroke();
-            if (ks != null) {
-                menuitem.setAccelerator(ks);
-            }
+        if (isExpert) {
+            ExpertToggleAction.addVisibilitySwitcher(menuitem);
+        }
+        KeyStroke ks = action.getShortcut().getKeyStroke();
+        if (ks != null) {
+            menuitem.setAccelerator(ks);
+        }
         return menuitem;
     }
@@ -375,5 +382,5 @@
             fileMenu.add(sessionMenu);
         }
-        add(fileMenu, gpxExport);
+        add(fileMenu, gpxExport, true);
         fileMenu.addSeparator();
         add(fileMenu, download);
@@ -386,6 +393,8 @@
         add(fileMenu, upload);
         add(fileMenu, uploadSelection);
-        fileMenu.addSeparator();
-        add(fileMenu, closeChangesetAction);
+        Component sep = new JPopupMenu.Separator();
+        fileMenu.add(sep);
+        ExpertToggleAction.addVisibilitySwitcher(sep);
+        add(fileMenu, closeChangesetAction, true);
         fileMenu.addSeparator();
         add(fileMenu, exit);
@@ -395,10 +404,10 @@
         editMenu.addSeparator();
         add(editMenu, copy);
-        add(editMenu, copyCoordinates);
+        add(editMenu, copyCoordinates, true);
         add(editMenu, paste);
         add(editMenu, pasteTags);
         add(editMenu, duplicate);
         add(editMenu, delete);
-        add(editMenu, purge);
+        add(editMenu, purge, true);
         editMenu.addSeparator();
         add(editMenu,merge);
@@ -430,4 +439,5 @@
         ViewportFollowToggleAction viewportFollowToggleAction = new ViewportFollowToggleAction();
         final JCheckBoxMenuItem vft = new JCheckBoxMenuItem(viewportFollowToggleAction);
+        ExpertToggleAction.addVisibilitySwitcher(vft);
         viewMenu.add(vft);
         vft.setAccelerator(viewportFollowToggleAction.getShortcut().getKeyStroke());
@@ -450,7 +460,7 @@
         viewMenu.addSeparator();
         // -- expert mode toggle action
-        final JCheckBoxMenuItem expertItem = new JCheckBoxMenuItem(expert);
+        final JCheckBoxMenuItem expertItem = new JCheckBoxMenuItem(ExpertToggleAction.getInstance());
         viewMenu.add(expertItem);
-        expert.addButtonModel(expertItem.getModel());
+        ExpertToggleAction.getInstance().addButtonModel(expertItem.getModel());
 
         add(presetsMenu, presetSearchAction);
@@ -467,9 +477,9 @@
         add(toolsMenu, distribute);
         add(toolsMenu, ortho);
-        add(toolsMenu, mirror);
+        add(toolsMenu, mirror, true);
         toolsMenu.addSeparator();
-        add(toolsMenu, followLine);
-        add(toolsMenu, addnode);
-        add(toolsMenu, movenode);
+        add(toolsMenu, followLine, true);
+        add(toolsMenu, addnode, true);
+        add(toolsMenu, movenode, true);
         add(toolsMenu, createCircle);
         toolsMenu.addSeparator();
Index: trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 4842)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/DrawingPreference.java	(revision 4843)
@@ -18,8 +18,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
-import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
 import org.openstreetmap.josm.tools.GBC;
 
-public class DrawingPreference implements PreferenceSetting, ExpertModeChangeListener {
+public class DrawingPreference implements PreferenceSetting {
 
     public static class Factory implements PreferenceSettingFactory {
@@ -39,5 +38,4 @@
 
     // Options that affect performance
-    private JLabel performanceLabel = new JLabel(tr("Options that affect drawing performance"));
     private JCheckBox useHighlighting = new JCheckBox(tr("Highlight target ways and nodes"));
     private JCheckBox drawHelperLine = new JCheckBox(tr("Draw rubber-band helper line"));
@@ -119,4 +117,5 @@
         outlineOnly.setToolTipText(tr("This option suppresses the filling of areas, overriding anything specified in the selected style."));
 
+        JLabel performanceLabel = new JLabel(tr("Options that affect drawing performance"));
         panel.add(performanceLabel, GBC.eop().insets(5,10,0,0));
         panel.add(useAntialiasing, GBC.eop().insets(20,5,0,0));
@@ -124,18 +123,13 @@
         panel.add(outlineOnly, GBC.eol().insets(20,0,0,5));
 
+        ExpertToggleAction.addVisibilitySwitcher(performanceLabel);
+        ExpertToggleAction.addVisibilitySwitcher(useAntialiasing);
+        ExpertToggleAction.addVisibilitySwitcher(useHighlighting);
+        ExpertToggleAction.addVisibilitySwitcher(outlineOnly);
+
         panel.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.BOTH));
         scrollpane = new JScrollPane(panel);
         scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
         gui.displaycontent.addTab(tr("OSM Data"), scrollpane);
-
-        ExpertToggleAction.addExpertModeChangeListener(this, true);
-    }
-
-    @Override
-    public void expertChanged(boolean isExpert) {
-        performanceLabel.setVisible(isExpert);
-        useAntialiasing.setVisible(isExpert);
-        useHighlighting.setVisible(isExpert);
-        outlineOnly.setVisible(isExpert);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java	(revision 4842)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/LafPreference.java	(revision 4843)
@@ -22,8 +22,7 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
-import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
 import org.openstreetmap.josm.tools.GBC;
 
-public class LafPreference implements PreferenceSetting, ExpertModeChangeListener {
+public class LafPreference implements PreferenceSetting {
 
     public static class Factory implements PreferenceSettingFactory {
@@ -90,8 +89,9 @@
         showLocalizedName.setToolTipText(tr("Show localized name in selection lists, if available"));
         showLocalizedName.setSelected(Main.pref.getBoolean("osm-primitives.localize-name", true));
-
+        ExpertToggleAction.addVisibilitySwitcher(showLocalizedName);
 
         modeless.setToolTipText(tr("Do not require to switch modes (potlatch style workflow)"));
         modeless.setSelected(Main.pref.getBoolean("modeless", false));
+        ExpertToggleAction.addVisibilitySwitcher(modeless);
 
         panel.add(showID, GBC.eop().insets(20, 0, 0, 0));
@@ -112,12 +112,4 @@
         scrollpane.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
         gui.displaycontent.addTab(tr("Look and Feel"), scrollpane);
-
-        ExpertToggleAction.addExpertModeChangeListener(this, true);
-    }
-
-    @Override
-    public void expertChanged(boolean isExpert) {
-        showLocalizedName.setVisible(isExpert);
-        modeless.setVisible(isExpert);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 4842)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceDialog.java	(revision 4843)
@@ -28,4 +28,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
@@ -45,8 +46,8 @@
 
         JCheckBox expert = new JCheckBox(tr("Expert mode"));
-        expert.setSelected(Main.main.menu.expert.isSelected());
+        expert.setSelected(ExpertToggleAction.isExpert());
         expert.addActionListener(new ActionListener() {
             public void actionPerformed(ActionEvent e) {
-                Main.main.menu.expert.actionPerformed(null);
+                ExpertToggleAction.getInstance().actionPerformed(null);
             }
         });
Index: trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 4842)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/PreferenceTabbedPane.java	(revision 4843)
@@ -278,5 +278,5 @@
 
     private void addGUITabs(boolean clear) {
-        boolean expert = Main.main.menu.expert.isSelected();
+        boolean expert = ExpertToggleAction.isExpert();
         Component sel = getSelectedComponent();
         if (clear) {
