Index: /trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 3736)
+++ /trunk/src/org/openstreetmap/josm/actions/ImageryAdjustAction.java	(revision 3737)
@@ -223,5 +223,5 @@
                 OffsetBookmark.bookmarkOffset(tBookmarkName.getText(), layer);
             }
-            Main.main.menu.imageryMenuUpdater.refreshOffsetMenu();
+            Main.main.menu.imageryMenu.refreshOffsetMenu();
             if (Main.map == null) return;
             if (oldMapMode != null) {
Index: /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 3736)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 3737)
@@ -121,5 +121,5 @@
         instance.add(info);
         instance.save();
-        Main.main.menu.imageryMenuUpdater.refreshImageryMenu();
+        Main.main.menu.imageryMenu.refreshImageryMenu();
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java	(revision 3737)
+++ /trunk/src/org/openstreetmap/josm/gui/ImageryMenu.java	(revision 3737)
@@ -0,0 +1,162 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+import java.awt.Component;
+import java.awt.event.ActionEvent;
+import java.util.List;
+
+import javax.swing.Action;
+import javax.swing.JComponent;
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.MenuElement;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.AddImageryLayerAction;
+import org.openstreetmap.josm.actions.JosmAction;
+import org.openstreetmap.josm.actions.Map_Rectifier_WMSmenuAction;
+import org.openstreetmap.josm.data.imagery.ImageryInfo;
+import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
+import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.gui.layer.Layer;
+import org.openstreetmap.josm.gui.layer.WMSLayer;
+import org.openstreetmap.josm.tools.ImageProvider;
+
+public class ImageryMenu extends JMenu implements MapView.LayerChangeListener {
+    Action offsetAction = new JosmAction(
+            tr("Imagery offset"), "mapmode/adjustimg", tr("Adjust imagery offset"), null, false, false) {
+        {
+            putValue("toolbar", "imagery-offset");
+            Main.toolbar.register(this);
+        }
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+            if (layers.isEmpty()) {
+                setEnabled(false);
+                return;
+            }
+            Component source = null;
+            if (e.getSource() instanceof Component) {
+                source = (Component)e.getSource();
+            }
+            JPopupMenu popup = new JPopupMenu();
+            if (layers.size() == 1) {
+                JComponent c = layers.get(0).getOffsetMenuItem(popup);
+                if (c instanceof JMenuItem) {
+                    ((JMenuItem) c).getAction().actionPerformed(e);
+                } else {
+                    if (source == null) return;
+                    popup.show(source, source.getWidth()/2, source.getHeight()/2);
+                }
+                return;
+            }
+            if (source == null) return;
+            for (ImageryLayer layer : layers) {
+                JMenuItem layerMenu = layer.getOffsetMenuItem();
+                layerMenu.setText(layer.getName());
+                layerMenu.setIcon(layer.getIcon());
+                popup.add(layerMenu);
+            }
+            popup.show(source, source.getWidth()/2, source.getHeight()/2);
+        }
+    };
+    JMenuItem singleOffset = new JMenuItem(offsetAction);
+    JMenuItem offsetMenuItem = singleOffset;
+    int offsPos;
+
+    public ImageryMenu() {
+        super(tr("Imagery"));
+        MapView.addLayerChangeListener(this);
+    }
+
+    public void refreshImageryMenu() {
+        removeAll();
+
+        // for each configured WMSInfo, add a menu entry.
+        for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
+            add(new AddImageryLayerAction(u));
+        }
+        addSeparator();
+        add(new JMenuItem(new Map_Rectifier_WMSmenuAction()));
+
+        addSeparator();
+        offsPos = getMenuComponentCount();
+        add(offsetMenuItem);
+        addSeparator();
+        add(new JMenuItem(new JosmAction(
+                tr("Blank Layer"), "blankmenu", tr("Open a blank WMS layer to load data from a file"), null, false) {
+            @Override
+            public void actionPerformed(ActionEvent ev) {
+                if (!isEnabled()) return;
+                Main.main.addLayer(new WMSLayer());
+            }
+
+            @Override
+            protected void updateEnabledState() {
+                setEnabled(Main.map != null && Main.map.mapView != null && !Main.map.mapView.getAllLayers().isEmpty());
+            }
+        }));
+    }
+
+    private JMenuItem getNewOffsetMenu(){
+        if (Main.map == null || Main.map.mapView == null) {
+            offsetAction.setEnabled(false);
+            return singleOffset;
+        }
+        List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
+        if (layers.isEmpty()) {
+            offsetAction.setEnabled(false);
+            return singleOffset;
+        }
+        offsetAction.setEnabled(true);
+        JMenu newMenu = new JMenu(trc("layer","Offset")) {
+            // Hack to prevent ToolbarPreference from tracing this menu
+            // TODO: Modify ToolbarPreference to not to trace such dynamic submenus?
+            @Override
+            public MenuElement[] getSubElements() {
+                return new MenuElement[0];
+            }
+        };
+        newMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
+        newMenu.setAction(offsetAction);
+        if (layers.size() == 1)
+            return (JMenuItem)layers.get(0).getOffsetMenuItem(newMenu);
+        for (ImageryLayer layer : layers) {
+            JMenuItem layerMenu = layer.getOffsetMenuItem();
+            layerMenu.setText(layer.getName());
+            layerMenu.setIcon(layer.getIcon());
+            newMenu.add(layerMenu);
+        }
+        return newMenu;
+    }
+
+    public void refreshOffsetMenu() {
+        JMenuItem newItem = getNewOffsetMenu();
+        remove(offsetMenuItem);
+        add(newItem, offsPos);
+        offsetMenuItem = newItem;
+    }
+
+    @Override
+    public void activeLayerChange(Layer oldLayer, Layer newLayer) {
+    }
+
+    @Override
+    public void layerAdded(Layer newLayer) {
+        if (newLayer instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
+    }
+
+    @Override
+    public void layerRemoved(Layer oldLayer) {
+        if (oldLayer instanceof ImageryLayer) {
+            refreshOffsetMenu();
+        }
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 3736)
+++ /trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 3737)
@@ -5,9 +5,6 @@
 import static org.openstreetmap.josm.tools.I18n.marktr;
 import static org.openstreetmap.josm.tools.I18n.tr;
-import static org.openstreetmap.josm.tools.I18n.trc;
-
-import java.awt.event.ActionEvent;
+
 import java.awt.event.KeyEvent;
-import java.util.List;
 
 import javax.swing.JCheckBoxMenuItem;
@@ -19,5 +16,4 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.AboutAction;
-import org.openstreetmap.josm.actions.AddImageryLayerAction;
 import org.openstreetmap.josm.actions.AddNodeAction;
 import org.openstreetmap.josm.actions.AlignInCircleAction;
@@ -46,5 +42,4 @@
 import org.openstreetmap.josm.actions.JosmAction;
 import org.openstreetmap.josm.actions.JumpToAction;
-import org.openstreetmap.josm.actions.Map_Rectifier_WMSmenuAction;
 import org.openstreetmap.josm.actions.MergeLayerAction;
 import org.openstreetmap.josm.actions.MergeNodesAction;
@@ -90,12 +85,7 @@
 import org.openstreetmap.josm.actions.audio.AudioSlowerAction;
 import org.openstreetmap.josm.actions.search.SearchAction;
-import org.openstreetmap.josm.data.imagery.ImageryInfo;
-import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
 import org.openstreetmap.josm.gui.io.RecentlyOpenedFilesMenu;
-import org.openstreetmap.josm.gui.layer.ImageryLayer;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.WMSLayer;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetSearchAction;
-import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
 
@@ -190,5 +180,6 @@
     public final JMenu toolsMenu = addMenu(marktr("Tools"), KeyEvent.VK_T, 3, ht("/Menu/Tools"));
     public final JMenu presetsMenu = addMenu(marktr("Presets"), KeyEvent.VK_P, 4, ht("/Menu/Presets"));
-    public final JMenu imageryMenu = addMenu(marktr("Imagery"), KeyEvent.VK_I, 5, ht("/Menu/Imagery"));
+    public final ImageryMenu imageryMenu =
+        (ImageryMenu)addMenu(new ImageryMenu(), marktr("Imagery"), KeyEvent.VK_I, 5, ht("/Menu/Imagery"));
     public JMenu audioMenu = null;
     public final JMenu helpMenu = addMenu(marktr("Help"), KeyEvent.VK_H, 6, ht("/Menu/Help"));
@@ -202,5 +193,4 @@
 
     public final TaggingPresetSearchAction presetSearchAction = new TaggingPresetSearchAction();
-    public final ImageryMenuUpdater imageryMenuUpdater;
 
     /**
@@ -223,5 +213,8 @@
 
     public JMenu addMenu(String name, int mnemonicKey, int position, String relativeHelpTopic) {
-        JMenu menu = new JMenu(tr(name));
+        return addMenu(new JMenu(tr(name)), name, mnemonicKey, position, relativeHelpTopic);
+    }
+
+    public JMenu addMenu(JMenu menu, String name, int mnemonicKey, int position, String relativeHelpTopic) {
         Shortcut.registerShortcut("menu:" + name, tr("Menu: {0}", tr(name)), mnemonicKey,
                 Shortcut.GROUP_MNEMONIC).setMnemonic(menu);
@@ -358,5 +351,4 @@
 
         new PresetsMenuEnabler(presetsMenu).refreshEnabled();
-        imageryMenuUpdater = new ImageryMenuUpdater();
     }
 
@@ -390,87 +382,3 @@
         }
     }
-
-    public class ImageryMenuUpdater implements MapView.LayerChangeListener {
-        JMenuItem disabledOffset = new JMenuItem(trc("layer","Offset"));
-        JMenuItem offsetSubMenu = disabledOffset;
-        int offsPos;
-
-        public ImageryMenuUpdater() {
-            MapView.addLayerChangeListener(this);
-            disabledOffset.setEnabled(false);
-        }
-
-        public void refreshImageryMenu() {
-            imageryMenu.removeAll();
-
-            // for each configured WMSInfo, add a menu entry.
-            for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
-                imageryMenu.add(new AddImageryLayerAction(u));
-            }
-            imageryMenu.addSeparator();
-            imageryMenu.add(new JMenuItem(new Map_Rectifier_WMSmenuAction()));
-
-            imageryMenu.addSeparator();
-            offsPos = imageryMenu.getMenuComponentCount();
-            imageryMenu.add(offsetSubMenu);
-            imageryMenu.addSeparator();
-            imageryMenu.add(new JMenuItem(new JosmAction(
-                    tr("Blank Layer"), "blankmenu", tr("Open a blank WMS layer to load data from a file"), null, false) {
-                @Override
-                public void actionPerformed(ActionEvent ev) {
-                    if (!isEnabled()) return;
-                    Main.main.addLayer(new WMSLayer());
-                }
-
-                @Override
-                protected void updateEnabledState() {
-                    setEnabled(Main.map != null && Main.map.mapView != null && !Main.map.mapView.getAllLayers().isEmpty());
-                }
-            }));
-        }
-
-        private JMenuItem getNewOffsetMenu(){
-            if (Main.map == null || Main.map.mapView == null)
-                return disabledOffset;
-            List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
-            if (layers.isEmpty())
-                return disabledOffset;
-            if (layers.size() == 1)
-                return layers.get(0).getOffsetMenuItem();
-            JMenu newMenu = new JMenu(trc("layer","Offset"));
-            newMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
-            for (ImageryLayer layer : layers) {
-                JMenuItem layerMenu = layer.getOffsetMenuItem();
-                layerMenu.setText(layer.getName());
-                layerMenu.setIcon(layer.getIcon());
-                newMenu.add(layerMenu);
-            }
-            return newMenu;
-        }
-
-        public void refreshOffsetMenu() {
-            JMenuItem newItem = getNewOffsetMenu();
-            imageryMenu.remove(offsetSubMenu);
-            imageryMenu.add(newItem, offsPos);
-            offsetSubMenu = newItem;
-        }
-
-        @Override
-        public void activeLayerChange(Layer oldLayer, Layer newLayer) {
-        }
-
-        @Override
-        public void layerAdded(Layer newLayer) {
-            if (newLayer instanceof ImageryLayer) {
-                refreshOffsetMenu();
-            }
-        }
-
-        @Override
-        public void layerRemoved(Layer oldLayer) {
-            if (oldLayer instanceof ImageryLayer) {
-                refreshOffsetMenu();
-            }
-        }
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3736)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3737)
@@ -19,4 +19,5 @@
 import javax.swing.Icon;
 import javax.swing.JCheckBoxMenuItem;
+import javax.swing.JComponent;
 import javax.swing.JMenu;
 import javax.swing.JMenuItem;
@@ -128,5 +129,5 @@
         public void actionPerformed(ActionEvent ev) {
             setOffset(b.dx, b.dy);
-            Main.main.menu.imageryMenuUpdater.refreshOffsetMenu();
+            Main.main.menu.imageryMenu.refreshOffsetMenu();
             Main.map.repaint();
         }
@@ -152,9 +153,13 @@
 
     public JMenuItem getOffsetMenuItem() {
+        JMenu subMenu = new JMenu(trc("layer", "Offset"));
+        subMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
+        return (JMenuItem)getOffsetMenuItem(subMenu);
+    }
+
+    public JComponent getOffsetMenuItem(JComponent subMenu) {
         JMenuItem adjustMenuItem = new JMenuItem(adjustAction);
         if (OffsetBookmark.allBookmarks.isEmpty()) return adjustMenuItem;
 
-        JMenu subMenu = new JMenu(trc("layer", "Offset"));
-        subMenu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
         subMenu.add(adjustMenuItem);
         subMenu.add(new JSeparator());
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ImageryPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ImageryPreference.java	(revision 3736)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ImageryPreference.java	(revision 3737)
@@ -274,6 +274,6 @@
         boolean restartRequired = false;
         ImageryLayerInfo.instance.save();
-        Main.main.menu.imageryMenuUpdater.refreshImageryMenu();
-        Main.main.menu.imageryMenuUpdater.refreshOffsetMenu();
+        Main.main.menu.imageryMenu.refreshImageryMenu();
+        Main.main.menu.imageryMenu.refreshOffsetMenu();
         OffsetBookmark.saveBookmarks();
 
@@ -746,6 +746,6 @@
         ImageryLayerInfo.instance.load();
         OffsetBookmark.loadBookmarks();
-        Main.main.menu.imageryMenuUpdater.refreshImageryMenu();
-        Main.main.menu.imageryMenuUpdater.refreshOffsetMenu();
+        Main.main.menu.imageryMenu.refreshImageryMenu();
+        Main.main.menu.imageryMenu.refreshOffsetMenu();
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 3736)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ToolbarPreferences.java	(revision 3737)
@@ -712,5 +712,5 @@
     }
 
-    private static final String[] deftoolbar = {"open", "save", "download", "upload", "|", "undo", "redo", "|", "dialogs/search", "preference", "|", "splitway", "combineway", "wayflip", "|", "tagginggroup_Highways/Streets", "tagginggroup_Highways/Ways", "tagginggroup_Highways/Waypoints", "tagginggroup_Highways/Barriers", "|", "tagginggroup_Transport/Car", "tagginggroup_Transport/Public Transport", "|", "tagginggroup_Travel/Tourism", "tagginggroup_Travel/Food+Drinks", "|", "tagginggroup_Travel/Historic Places", "|", "tagginggroup_Man-Made/Man Made"};
+    private static final String[] deftoolbar = {"open", "save", "download", "upload", "|", "undo", "redo", "|", "dialogs/search", "preference", "|", "splitway", "combineway", "wayflip", "|", "imagery-offset", "|", "tagginggroup_Highways/Streets", "tagginggroup_Highways/Ways", "tagginggroup_Highways/Waypoints", "tagginggroup_Highways/Barriers", "|", "tagginggroup_Transport/Car", "tagginggroup_Transport/Public Transport", "|", "tagginggroup_Travel/Tourism", "tagginggroup_Travel/Food+Drinks", "|", "tagginggroup_Travel/Historic Places", "|", "tagginggroup_Man-Made/Man Made"};
 
     private static Collection<String> getToolString() {
