Index: src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapFrame.java	(revision 4587)
+++ src/org/openstreetmap/josm/gui/MapFrame.java	(working copy)
@@ -16,6 +16,7 @@
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Enumeration;
 import java.util.concurrent.CopyOnWriteArrayList;
 
 import javax.swing.AbstractAction;
@@ -108,6 +109,7 @@
     public final ButtonGroup toolGroup = new ButtonGroup();
 
     public final JButton otherButton = new JButton(new OtherButtonsAction());
+    public final JButton otherMapModeButton = new JButton(new OtherMapModesAction());
 
     /**
      * Default width of the toggle dialog area.
@@ -296,14 +298,32 @@
             }
         }
     }
-
-    public void addMapMode(IconToggleButton b) {
+    
+    public void addMapMode(final IconToggleButton b) {
         toolBarActions.add(b);
         toolGroup.add(b);
         if (b.getAction() instanceof MapMode) {
             mapModes.add((MapMode) b.getAction());
         } else
             throw new IllegalArgumentException("MapMode action must be subclass of MapMode");
+        
+        //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) {
+                        String actionName = (String) b.getAction().getValue(AbstractAction.NAME);
+                         Main.pref.put(actionName+".mbutton_hidden",false);
+                         validateToolBarVisibility();
+                    }
+                });
+            }
+        }));
     }
 
     /**
@@ -362,6 +382,11 @@
         jb.setFloatable(false);
         toolBarActions.setAlignmentX(0.5f);
         jb.add(toolBarActions);
+        otherMapModeButton.setAlignmentX(0.5f);
+        otherMapModeButton.setBorder(null);
+        otherMapModeButton.setFont(otherButton.getFont().deriveFont(Font.PLAIN));
+        jb.add(otherMapModeButton);
+        validateToolBarVisibility();
 
         jb.addSeparator(new Dimension(0,18));
         toolBarToggle.setAlignmentX(0.5f);
@@ -390,6 +415,61 @@
         }
     }
 
+    class OtherMapModesAction extends AbstractAction {
+
+        public OtherMapModesAction() {
+            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)) {
+                            Main.pref.put(getValue(NAME) + ".mbutton_hidden", true);
+                        } else {
+                            Main.pref.put(getValue(NAME) + ".mbutton_hidden", false);
+                        }
+                        validateToolBarVisibility();
+                    }
+                }));
+            }
+            Rectangle bounds = otherMapModeButton.getBounds();
+            menu.show(otherMapModeButton, 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;
+            final IconToggleButton t = (IconToggleButton) b;
+            String actionName = (String) t.getAction().getValue(AbstractAction.NAME);
+            boolean visibilityFlag =
+                    Main.pref.getBoolean(actionName + ".mbutton_hidden", true);
+            t.setVisible(visibilityFlag);
+        }
+        toolBarActions.repaint();
+    }
+
     class OtherButtonsAction extends AbstractAction {
 
         public OtherButtonsAction() {
