Index: trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4668)
+++ trunk/src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4669)
@@ -25,4 +25,5 @@
     public boolean groupbutton;
     private ShowHideButtonListener listener;
+    private boolean hideIfDisabled=false;
 
     /**
@@ -66,19 +67,39 @@
     }
     
+    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);
     }
     
Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4668)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4669)
@@ -33,4 +33,5 @@
 import javax.swing.JToolBar;
 import javax.swing.KeyStroke;
+import javax.swing.SwingUtilities;
 import javax.swing.border.Border;
 import javax.swing.plaf.basic.BasicSplitPaneDivider;
@@ -408,5 +409,5 @@
         }));
     }
-   
+
         class ListAllButtonsAction extends AbstractAction {
 
@@ -454,9 +455,9 @@
         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
@@ -535,5 +536,14 @@
         // 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) {
