Index: src/org/openstreetmap/josm/gui/IconToggleButton.java
===================================================================
--- src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4667)
+++ src/org/openstreetmap/josm/gui/IconToggleButton.java	(working copy)
@@ -24,6 +24,7 @@
 
     public boolean groupbutton;
     private ShowHideButtonListener listener;
+    private boolean hideIfDisabled=false;
 
     /**
      * Construct the toggle button with the given action.
@@ -65,23 +66,43 @@
         }
     }
     
+    String getPreferenceKey() {
+        String s = (String) getSafeActionValue("toolbar");
+        if (s==null) {
+            if (getAction()!=null) s=getAction().getClass().getName();
+        }
+        return "sidetoolbar.hidden."+s;
+        
+    }
+    
     @Override
     public void applyButtonHiddenPreferences() {
-        String actionName = (String) getSafeActionValue(AbstractAction.NAME);
-        boolean hiddenFlag = Main.pref.getBoolean(actionName + ".itbutton_hidden", false);
-        setVisible(!hiddenFlag);   
+        boolean alwaysHideDisabled = Main.pref.getBoolean("sidetoolbar.hideDisabledButtons", false);
+        boolean hiddenFlag = Main.pref.getBoolean(getPreferenceKey(), false);
+        if (!isEnabled() && (hideIfDisabled || alwaysHideDisabled)) 
+                setVisible(false);  // hide because of disabled button 
+            else 
+                setVisible( !hiddenFlag ); // show or hide, do what preferences say  
     }
 
     @Override
     public void setButtonHidden(boolean b) {
-        String actionName = (String) getSafeActionValue(AbstractAction.NAME);
         setVisible(!b);
         if (listener!=null) { // if someone wants to know about changes of visibility
             if (!b) listener.buttonShown(); else listener.buttonHidden();
         }
-        Main.pref.put(actionName + ".itbutton_hidden", b);
+        Main.pref.put(getPreferenceKey(), b);
     }
     
+    /* 
+     * This fuction should be called for plugins that want to enable auto-hiding
+     * custom buttons when they are disabled (because of incorrect layer, for example)
+     */
+    public void setAutoHideDisabledButton(boolean b) {
+        hideIfDisabled=b;
+        if (b && !isEnabled()) setVisible(false);
+    }
+    
     @Override
     public void showButton() {
         setButtonHidden(false);
Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4667)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(working copy)
@@ -32,6 +32,7 @@
 import javax.swing.JSplitPane;
 import javax.swing.JToolBar;
 import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
 import javax.swing.border.Border;
 import javax.swing.plaf.basic.BasicSplitPaneDivider;
 import javax.swing.plaf.basic.BasicSplitPaneUI;
@@ -407,7 +408,7 @@
             }
         }));
     }
-   
+
         class ListAllButtonsAction extends AbstractAction {
 
         private JButton button;
@@ -453,11 +454,11 @@
         }
         toolBarToggle.repaint();
         for (IconToggleButton b : allMapModeButtons) {
-            b.applyButtonHiddenPreferences();
+             b.applyButtonHiddenPreferences();
         }
         toolBarActions.repaint();
     }
-
+    
     /**
      * Replies the instance of a toggle dialog of type <code>type</code> managed by this
      * map frame
@@ -534,7 +535,16 @@
         }
         // invalidate repaint cache
         Main.map.mapView.preferenceChanged(null);
+        
+        // After all listeners notice new layer, some buttons will be disabled/enabled 
+        // and possibly need to be hidden/shown.
+        SwingUtilities.invokeLater(new Runnable() {
+            public void run() {
+                validateToolBarsVisibility();
+            }
+        });
     }
+    
 
     private MapMode getLastMapMode(Layer newLayer) {
         MapMode mode = lastMapMode.get(newLayer);
