Index: src/org/openstreetmap/josm/gui/IconToggleButton.java
===================================================================
--- src/org/openstreetmap/josm/gui/IconToggleButton.java	(revision 4590)
+++ src/org/openstreetmap/josm/gui/IconToggleButton.java	(working copy)
@@ -6,9 +6,11 @@
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 
+import javax.swing.AbstractAction;
 import javax.swing.Action;
 import javax.swing.JToggleButton;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.tools.Destroyable;
 
 /**
@@ -58,4 +60,17 @@
         }
         action.removePropertyChangeListener(this);
     }
+    
+    public void checkButtonHiddenPreferences() {
+            String actionName = (String) getAction().getValue(AbstractAction.NAME);
+            boolean hiddenFlag =
+                    Main.pref.getBoolean(actionName + ".itbutton_hidden", false);
+            setVisible(!hiddenFlag);   
+    }
+
+    public void setButtonHidden(boolean b) {
+            String actionName = (String) getAction().getValue(AbstractAction.NAME);
+            setVisible(!b);
+            Main.pref.put(actionName + ".itbutton_hidden", b);
+    }
 }
Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4590)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(working copy)
@@ -13,6 +13,7 @@
 import java.awt.event.MouseWheelEvent;
 import java.awt.event.MouseWheelListener;
 import java.util.ArrayList;
+import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -108,6 +109,7 @@
     public final ButtonGroup toolGroup = new ButtonGroup();
 
     public final JButton otherButton = new JButton(new OtherButtonsAction());
+    public final JButton listAllMapModesButton = new JButton(new ListAllMapModesAction());
 
     /**
      * Default width of the toggle dialog area.
@@ -304,6 +306,24 @@
             mapModes.add((MapMode) b.getAction());
         } else
             throw new IllegalArgumentException("MapMode action must be subclass of MapMode");
+        final IconToggleButton bb = b; // ee do not want to change signature of the method
+        //context menu
+        b.addMouseListener(new PopupMenuLauncher(new JPopupMenu() {
+            {
+                add(new AbstractAction() {
+                    {
+                        putValue(NAME, tr("Hide this button"));
+                        putValue(SHORT_DESCRIPTION, tr("Click the arrow at the bottom to show it again."));
+                    }
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        bb.setButtonHidden(true);
+                        validateToolBarVisibility();
+                    }
+                });
+            }
+        }));
+        b.checkButtonHiddenPreferences();
     }
 
     /**
@@ -362,7 +382,11 @@
         jb.setFloatable(false);
         toolBarActions.setAlignmentX(0.5f);
         jb.add(toolBarActions);
-
+        listAllMapModesButton.setAlignmentX(0.5f);
+        listAllMapModesButton.setBorder(null);
+        listAllMapModesButton.setFont(otherButton.getFont().deriveFont(Font.PLAIN));
+        jb.add(listAllMapModesButton);
+        
         if(Main.pref.getBoolean("sidetoolbar.togglevisible", true)) {
             jb.addSeparator(new Dimension(0,18));
             toolBarToggle.setAlignmentX(0.5f);
@@ -425,7 +449,59 @@
             menu.show(otherButton, bounds.x+bounds.width, 0);
         }
     }
+    
+        class ListAllMapModesAction extends AbstractAction {
 
+        public ListAllMapModesAction() {
+            putValue(NAME, ">>");
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            JPopupMenu menu = new JPopupMenu();
+            AbstractButton b;
+            Enumeration<AbstractButton> elements = toolGroup.getElements();
+            while (elements.hasMoreElements()) {
+                b = elements.nextElement();
+                if (!(b instanceof IconToggleButton)) continue;
+                final IconToggleButton t = (IconToggleButton) b;
+                menu.add(new JCheckBoxMenuItem(new AbstractAction() {
+
+                    {
+                        putValue(NAME, t.getAction().getValue(NAME));
+                        putValue(SMALL_ICON, t.getAction().getValue(SMALL_ICON));
+                        putValue(SELECTED_KEY, t.isVisible());
+                        putValue(SHORT_DESCRIPTION, tr("Hide or show this toggle button"));
+                    }
+
+                    @Override
+                    public void actionPerformed(ActionEvent e) {
+                        if ((Boolean) getValue(SELECTED_KEY)) {
+                            t.setButtonHidden(false);
+                        } else {
+                            t.setButtonHidden(true);
+                        }
+                        validateToolBarVisibility();
+                    }
+                }));
+            }
+            Rectangle bounds = listAllMapModesButton.getBounds();
+            menu.show(listAllMapModesButton, bounds.x + bounds.width, 0);
+        }
+    }
+
+    public void validateToolBarVisibility() {
+        AbstractButton b;
+        Enumeration<AbstractButton> elements = toolGroup.getElements();
+        while (elements.hasMoreElements()) {
+            b = elements.nextElement();
+            if (!(b instanceof IconToggleButton)) continue;
+            ((IconToggleButton) b).checkButtonHiddenPreferences();
+        }
+        toolBarActions.repaint();
+    }
+
+
     /**
      * Replies the instance of a toggle dialog of type <code>type</code> managed by this
      * map frame
