Index: trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 3732)
+++ trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 3733)
@@ -8,4 +8,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
+import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
 
@@ -15,13 +16,23 @@
 
     public AddImageryLayerAction(ImageryInfo info) {
-        super(info.getMenuName(), "imagery_menu", tr("Add imagery layer {0}",info.getName()), null, false);
+        super(info.getMenuName(), "imagery_menu", tr("Add imagery layer {0}",info.getName()), null, false, false);
         putValue("toolbar", "imagery_" + info.getToolbarName());
         this.info = info;
+        installAdapters();
     }
 
     @Override
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled()) return;
         ImageryLayer wmsLayer = ImageryLayer.create(info);
         Main.main.addLayer(wmsLayer);
     }
-};
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(info.getImageryType() == ImageryType.TMS
+                || info.getImageryType() == ImageryType.BING
+                || (Main.map != null && Main.map.mapView != null
+                        && !Main.map.mapView.getAllLayers().isEmpty()));
+    }
+}
Index: trunk/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java	(revision 3732)
+++ trunk/src/org/openstreetmap/josm/actions/Map_Rectifier_WMSmenuAction.java	(revision 3733)
@@ -112,4 +112,5 @@
     @Override
     public void actionPerformed(ActionEvent e) {
+        if (!isEnabled()) return;
         JPanel panel = new JPanel(new GridBagLayout());
         panel.add(new JLabel(tr("Supported Rectifier Services:")), GBC.eol());
@@ -123,6 +124,7 @@
         for(RectifierService s : services) {
             JRadioButton serviceBtn = new JRadioButton(s.name);
-            if(firstBtn == null)
+            if(firstBtn == null) {
                 firstBtn = serviceBtn;
+            }
             // Checks clipboard contents against current service if no match has been found yet.
             // If the contents match, they will be inserted into the text field and the corresponding
@@ -138,11 +140,13 @@
                 panel.add(serviceBtn, GBC.std());
                 panel.add(new UrlLabel(s.url, tr("Visit Homepage")), GBC.eol().anchor(GridBagConstraints.EAST));
-            } else
+            } else {
                 panel.add(serviceBtn, GBC.eol().anchor(GridBagConstraints.WEST));
+            }
         }
 
         // Fallback in case no match was found
-        if(tfWmsUrl.getText().equals("") && firstBtn != null)
+        if(tfWmsUrl.getText().equals("") && firstBtn != null) {
             firstBtn.setSelected(true);
+        }
 
         panel.add(new JLabel(tr("WMS URL or Image ID:")), GBC.eol());
@@ -162,12 +166,14 @@
             int answer = diag.getValue();
             // Break loop when the user cancels
-            if(answer != 1)
+            if(answer != 1) {
                 break;
+            }
 
             String text = tfWmsUrl.getText().trim();
             // Loop all services until we find the selected one
             for(RectifierService s : services) {
-                if(!s.isSelected())
+                if(!s.isSelected()) {
                     continue;
+                }
 
                 // We've reached the custom WMS URL service
@@ -237,3 +243,8 @@
         return result.trim();
     }
+
+    @Override
+    protected void updateEnabledState() {
+        setEnabled(Main.map != null && Main.map.mapView != null && !Main.map.mapView.getAllLayers().isEmpty());
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/MainMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 3732)
+++ trunk/src/org/openstreetmap/josm/gui/MainMenu.java	(revision 3733)
@@ -7,5 +7,4 @@
 import static org.openstreetmap.josm.tools.I18n.trc;
 
-import java.awt.Component;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -58,4 +57,5 @@
 import org.openstreetmap.josm.actions.OpenLocationAction;
 import org.openstreetmap.josm.actions.OrthogonalizeAction;
+import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
 import org.openstreetmap.josm.actions.PasteAction;
 import org.openstreetmap.josm.actions.PasteTagsAction;
@@ -82,5 +82,4 @@
 import org.openstreetmap.josm.actions.ZoomInAction;
 import org.openstreetmap.josm.actions.ZoomOutAction;
-import org.openstreetmap.josm.actions.OrthogonalizeAction.Undo;
 import org.openstreetmap.josm.actions.audio.AudioBackAction;
 import org.openstreetmap.josm.actions.audio.AudioFasterAction;
@@ -98,4 +97,5 @@
 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;
 
@@ -392,8 +392,11 @@
 
     public class ImageryMenuUpdater implements MapView.LayerChangeListener {
-        JMenu offsetSubMenu = new JMenu(trc("layer","Offset"));
+        JMenuItem disabledOffset = new JMenuItem(trc("layer","Offset"));
+        JMenuItem offsetSubMenu = disabledOffset;
+        int offsPos;
 
         public ImageryMenuUpdater() {
             MapView.addLayerChangeListener(this);
+            disabledOffset.setEnabled(false);
         }
 
@@ -403,5 +406,5 @@
             // for each configured WMSInfo, add a menu entry.
             for (final ImageryInfo u : ImageryLayerInfo.instance.getLayers()) {
-                imageryMenu.add(new JMenuItem(new AddImageryLayerAction(u)));
+                imageryMenu.add(new AddImageryLayerAction(u));
             }
             imageryMenu.addSeparator();
@@ -409,48 +412,46 @@
 
             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) {
+            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());
+                }
             }));
-            refreshEnabled();
-        }
-
-        public void refreshEnabled() {
-            imageryMenu.setEnabled(Main.map != null
-                    && Main.map.mapView !=null
-            );
+        }
+
+        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() {
-            offsetSubMenu.removeAll();
-            if (Main.map == null || Main.map.mapView == null) {
-                offsetSubMenu.setEnabled(false);
-                return;
-            }
-            List<ImageryLayer> layers = Main.map.mapView.getLayersOfType(ImageryLayer.class);
-            if (layers.isEmpty()) {
-                offsetSubMenu.setEnabled(false);
-                return;
-            }
-            offsetSubMenu.setEnabled(true);
-            if (layers.size() == 1) {
-                for (Component c : layers.get(0).getOffsetMenu()) {
-                    offsetSubMenu.add(c);
-                }
-                return;
-            }
-            for (ImageryLayer layer : layers) {
-                JMenu subMenu = new JMenu(layer.getName());
-                subMenu.setIcon(layer.getIcon());
-                for (Component c : layer.getOffsetMenu()) {
-                    subMenu.add(c);
-                }
-                offsetSubMenu.add(subMenu);
-            }
+            JMenuItem newItem = getNewOffsetMenu();
+            imageryMenu.remove(offsetSubMenu);
+            imageryMenu.add(newItem, offsPos);
+            offsetSubMenu = newItem;
         }
 
@@ -464,5 +465,4 @@
                 refreshOffsetMenu();
             }
-            refreshEnabled();
         }
 
@@ -472,5 +472,4 @@
                 refreshOffsetMenu();
             }
-            refreshEnabled();
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3732)
+++ trunk/src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 3733)
@@ -7,5 +7,4 @@
 import java.awt.Color;
 import java.awt.Component;
-import java.awt.Container;
 import java.awt.Font;
 import java.awt.Graphics;
@@ -15,5 +14,4 @@
 import java.awt.image.ConvolveOp;
 import java.awt.image.Kernel;
-import java.util.ArrayList;
 import java.util.List;
 
@@ -32,5 +30,4 @@
 import org.openstreetmap.josm.data.imagery.OffsetBookmark;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
-import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.tools.ImageProvider;
 
@@ -55,5 +52,4 @@
 
     protected final ImageryInfo info;
-    protected MapView mv;
 
     protected double dx = 0.0;
@@ -65,11 +61,11 @@
         super(info.getName());
         this.info = info;
-        this.mv = Main.map.mapView;
         this.sharpenLevel = PROP_SHARPEN_LEVEL.get();
     }
 
     public double getPPD(){
-        ProjectionBounds bounds = mv.getProjectionBounds();
-        return mv.getWidth() / (bounds.max.east() - bounds.min.east());
+        if (Main.map == null || Main.map.mapView == null) return Main.proj.getDefaultZoomInPPD();
+        ProjectionBounds bounds = Main.map.mapView.getProjectionBounds();
+        return Main.map.mapView.getWidth() / (bounds.max.east() - bounds.min.east());
     }
 
@@ -132,14 +128,6 @@
         public void actionPerformed(ActionEvent ev) {
             setOffset(b.dx, b.dy);
+            Main.main.menu.imageryMenuUpdater.refreshOffsetMenu();
             Main.map.repaint();
-            if (!(ev.getSource() instanceof Component)) return;
-            Component source = (Component)ev.getSource();
-            if (source.getParent() == null) return;
-            Container m = source.getParent();
-            for (Component c : m.getComponents()) {
-                if (c instanceof JCheckBoxMenuItem && c != source) {
-                    ((JCheckBoxMenuItem)c).setSelected(false);
-                }
-            }
         }
     }
@@ -149,13 +137,10 @@
         public void actionPerformed(ActionEvent e) {
         }
+
         @Override
         public Component createMenuComponent() {
-            JMenu menu = new JMenu(trc("layer", "Offset"));
-            menu.setIcon(ImageProvider.get("mapmode", "adjustimg"));
-            for (Component item : getOffsetMenu()) {
-                menu.add(item);
-            }
-            return menu;
-        }
+            return getOffsetMenuItem();
+        }
+
         @Override
         public boolean supportLayers(List<Layer> layers) {
@@ -164,10 +149,15 @@
     }
 
-    public List<Component> getOffsetMenu() {
-        List<Component> result = new ArrayList<Component>();
-        result.add(new JMenuItem(new ImageryAdjustAction(this)));
-        if (OffsetBookmark.allBookmarks.isEmpty()) return result;
-
-        result.add(new JSeparator(JSeparator.HORIZONTAL));
+    ImageryAdjustAction adjustAction = new ImageryAdjustAction(this);
+
+    public JMenuItem getOffsetMenuItem() {
+        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());
+        boolean hasBookmarks = false;
         for (OffsetBookmark b : OffsetBookmark.allBookmarks) {
             if (!b.isUsable(this)) {
@@ -178,7 +168,8 @@
                 item.setSelected(true);
             }
-            result.add(item);
-        }
-        return result;
+            subMenu.add(item);
+            hasBookmarks = true;
+        }
+        return hasBookmarks ? subMenu : adjustMenuItem;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 3732)
+++ trunk/src/org/openstreetmap/josm/gui/layer/TMSLayer.java	(revision 3733)
@@ -259,10 +259,11 @@
 
     private double getPPDeg() {
+        MapView mv = Main.map.mapView;
         return mv.getWidth()/(mv.getLatLon(mv.getWidth(), mv.getHeight()/2).lon()-mv.getLatLon(0, mv.getHeight()/2).lon());
     }
 
     private int getBestZoom() {
+        if (Main.map == null || Main.map.mapView == null) return 3;
         double ret = Math.log(getPPDeg()*360/tileSource.getTileSize())/Math.log(2);
-        System.out.println("Detected best zoom " + ret);
         return (int)Math.round(ret);
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 3732)
+++ trunk/src/org/openstreetmap/josm/gui/layer/WMSLayer.java	(revision 3733)
@@ -31,13 +31,13 @@
 import org.openstreetmap.josm.actions.SaveActionBase;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+import org.openstreetmap.josm.data.ProjectionBounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.imagery.GeorefImage;
+import org.openstreetmap.josm.data.imagery.GeorefImage.State;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
+import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.data.imagery.ImageryLayerInfo;
-import org.openstreetmap.josm.data.imagery.GeorefImage.State;
-import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
@@ -77,4 +77,5 @@
     protected boolean settingsChanged;
     protected ImageryInfo info;
+    protected final MapView mv;
 
     // Image index boundary for current view
@@ -109,4 +110,5 @@
     public WMSLayer(ImageryInfo info) {
         super(info);
+        mv = Main.map.mapView;
         setBackgroundLayer(true); /* set global background variable */
         initializeImages();
