Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 2390)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 2391)
@@ -7,4 +7,6 @@
 import java.awt.Container;
 import java.awt.Dimension;
+import java.awt.event.MouseWheelListener;
+import java.awt.event.MouseWheelEvent;
 import java.util.ArrayList;
 import java.util.List;
@@ -262,11 +264,16 @@
         jb.setFloatable(false);
         jb.add(toolBarActions);
-        jb.addSeparator();
+        jb.addSeparator(new Dimension(0,10));
         jb.add(toolBarToggle);
         if(Main.pref.getBoolean("sidetoolbar.visible", true))
         {
             if(Main.pref.getBoolean("sidetoolbar.scrollable", true)) {
-                panel.add(new ScrollViewport(jb, ScrollViewport.VERTICAL_DIRECTION),
-                        BorderLayout.WEST);
+                final ScrollViewport svp = new ScrollViewport(jb, ScrollViewport.VERTICAL_DIRECTION);
+                panel.add(svp, BorderLayout.WEST);
+                jb.addMouseWheelListener(new MouseWheelListener() {
+                    public void mouseWheelMoved(MouseWheelEvent e) {
+                        svp.scroll(0,e.getUnitsToScroll() * 5);
+                    }
+                });
             } else {
                 panel.add(jb, BorderLayout.WEST);
Index: trunk/src/org/openstreetmap/josm/gui/ScrollViewport.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/ScrollViewport.java	(revision 2390)
+++ trunk/src/org/openstreetmap/josm/gui/ScrollViewport.java	(revision 2391)
@@ -9,6 +9,11 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.awt.event.ComponentAdapter;
+import java.awt.event.ComponentEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
+
+import java.util.ArrayList;
+import java.util.List;
 
 import javax.swing.JButton;
@@ -62,6 +67,8 @@
     private JViewport vp = new JViewport();
     private JComponent component = null;
-
-    private Timer timer = new Timer(200, new ActionListener() {
+    
+    private List<JButton> buttons = new ArrayList<JButton>();
+
+    private Timer timer = new Timer(100, new ActionListener() {
         public void actionPerformed(ActionEvent arg0) {
             ScrollViewport.this.scroll();
@@ -78,5 +85,5 @@
     public ScrollViewport(int direction) {
         setLayout(new BorderLayout());
-
+        
         JButton button;
 
@@ -88,4 +95,5 @@
             button.setIcon(ImageProvider.get("svpUp"));
             add(button, BorderLayout.NORTH);
+            buttons.add(button);
         }
 
@@ -97,4 +105,5 @@
             button.setIcon(ImageProvider.get("svpDown"));
             add(button, BorderLayout.SOUTH);
+            buttons.add(button);
         }
 
@@ -106,4 +115,5 @@
             button.setIcon(ImageProvider.get("svpLeft"));
             add(button, BorderLayout.WEST);
+            buttons.add(button);
         }
 
@@ -115,8 +125,17 @@
             button.setIcon(ImageProvider.get("svpRight"));
             add(button, BorderLayout.EAST);
+            buttons.add(button);
         }
 
         add(vp, BorderLayout.CENTER);
 
+        this.addComponentListener(new ComponentAdapter() {
+            @Override public void  componentResized(ComponentEvent e) {
+                showOrHideButtons();
+            }
+        });
+
+        showOrHideButtons();
+        
         timer.setRepeats(true);
         timer.setInitialDelay(400);
@@ -133,43 +152,45 @@
         Rectangle viewRect = vp.getViewRect();
 
-        int delta;
-        int newY = 0;
-        int newX = 0;
+        int deltaX = 0;
+        int deltaY = 0;
 
         if (direction < LEFT_DIRECTION) {
-            newX = viewRect.x;
-            delta = viewRect.height * 4 / 5;
+            deltaY = viewRect.height * 2 / 7;
         } else {
-            newY = viewRect.y;
-            delta = viewRect.width * 4 / 5;
+            deltaX = viewRect.width * 2 / 7;
         }
 
         switch (direction) {
-        case UP_DIRECTION :
-            newY = viewRect.y - delta;
-            if (newY < 0) {
-                newY = 0;
-            }
-            break;
-        case DOWN_DIRECTION :
-            newY = viewRect.y + delta;
-            if (newY > compSize.height - viewRect.height) {
-                newY = compSize.height - viewRect.height;
-            }
-            break;
-        case LEFT_DIRECTION :
-            newX = viewRect.x - delta;
-            if (newX < 0) {
-                newX = 0;
-            }
-            break;
-        case RIGHT_DIRECTION :
-            newX = viewRect.x + delta;
-            if (newX > compSize.width - viewRect.width) {
-                newX = compSize.width - viewRect.width;
-            }
-            break;
-        default :
-            throw new IllegalStateException("Unknown direction : [0]" + direction);
+            case UP_DIRECTION :
+                deltaY *= -1;
+                break;
+            case LEFT_DIRECTION :
+                deltaX *= -1;
+                break;
+        }
+
+        scroll(deltaX, deltaY);
+    }
+    public synchronized void scroll(int deltaX, int deltaY) {
+        if (component == null) {
+            return;
+        }
+        Dimension compSize = component.getSize();
+        Rectangle viewRect = vp.getViewRect();
+
+        int newX = viewRect.x + deltaX;
+        int newY = viewRect.y + deltaY;
+
+        if (newY < 0) {
+            newY = 0;
+        }
+        if (newY > compSize.height - viewRect.height) {
+            newY = compSize.height - viewRect.height;
+        }
+        if (newX < 0) {
+            newX = 0;
+        }
+        if (newX > compSize.width - viewRect.width) {
+            newX = compSize.width - viewRect.width;
         }
 
@@ -177,4 +198,16 @@
     }
 
+    /**
+     * Update the visibility of the buttons
+     * Only show them if the Viewport is too small for the content.
+     */
+    public void showOrHideButtons() {
+        boolean needButtons = vp.getViewSize().height > vp.getViewRect().height || 
+                              vp.getViewSize().width > vp.getViewRect().width;
+        for (JButton b : buttons) {
+            b.setVisible(needButtons);
+        }
+    }
+    
     public Rectangle getViewRect() {
         return vp.getViewRect();
