Index: trunk/src/org/openstreetmap/josm/gui/MapScaler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapScaler.java	(revision 10076)
+++ trunk/src/org/openstreetmap/josm/gui/MapScaler.java	(revision 10078)
@@ -6,4 +6,5 @@
 
 import java.awt.Color;
+import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.geom.Rectangle2D;
@@ -25,5 +26,6 @@
     private final NavigatableComponent mv;
 
-    private static final int PADDING_RIGHT = 100;
+    private final static int PADDING_LEFT = 5;
+    private final static int PADDING_RIGHT = 50;
 
     /**
@@ -33,21 +35,23 @@
     public MapScaler(NavigatableComponent mv) {
         this.mv = mv;
-        setSize(100+PADDING_RIGHT, 30);
+        setPreferredLineLength(100);
         setOpaque(false);
+    }
+
+    /**
+     * Sets the preferred length the distance line should have.
+     * @param pixel The length.
+     */
+    public void setPreferredLineLength(int pixel) {
+        setPreferredSize(new Dimension(pixel + PADDING_LEFT + PADDING_RIGHT, 30));
     }
 
     @Override
     public void paint(Graphics g) {
-        String text = mv.getDist100PixelText();
-        Rectangle2D bound = g.getFontMetrics().getStringBounds(text, g);
         g.setColor(getColor());
-        g.drawLine(0, 5, 99, 5);
-        g.drawLine(0, 0, 0, 10);
-        g.drawLine(99, 0, 99, 10);
-        g.drawLine(49, 3, 49, 7);
-        g.drawLine(24, 3, 24, 7);
-        g.drawLine(74, 3, 74, 7);
-        g.drawString(text, (int) (100-bound.getWidth()/2), 23);
-        g.drawString("0", 0, 23);
+
+        double dist100Pixel = mv.getDist100Pixel(true);
+        TickMarks tickMarks = new TickMarks(dist100Pixel, getWidth() - PADDING_LEFT - PADDING_RIGHT);
+        tickMarks.paintTicks(g);
     }
 
@@ -95,3 +99,68 @@
         }
     }
+
+    /**
+     * This class finds the best possible tick mark positions.
+     * <p>
+     * It will attempt to use steps of 1m, 2.5m, 10m, 25m, ...
+     */
+    private static final class TickMarks {
+
+        private final double dist100Pixel;
+        private final double lineDistance;
+        /**
+         * Distance in meters between two ticks.
+         */
+        private final double spacingMeter;
+        private final int steps;
+        private final int majorStepEvery;
+
+        /**
+         * Creates a new tick mark helper.
+         * @param dist100Pixel The distance of 100 pixel on the map.
+         * @param width The width of the mark.
+         */
+        public TickMarks(double dist100Pixel, int width) {
+            this.dist100Pixel = dist100Pixel;
+            lineDistance = dist100Pixel * width / 100;
+
+            double log10 = Math.log(lineDistance) / Math.log(10);
+            double spacingLog10 = Math.pow(10, Math.floor(log10));
+            if (log10 - Math.floor(log10) < .75) {
+                spacingMeter = spacingLog10 / 4;
+                majorStepEvery = 4;
+            } else {
+                spacingMeter = spacingLog10;
+                majorStepEvery = 5;
+            }
+            steps = (int) Math.floor(lineDistance / spacingMeter);
+        }
+
+        public void paintTicks(Graphics g) {
+            double spacingPixel = spacingMeter / (dist100Pixel / 100);
+            double textBlockedUntil = -1;
+            for (int step = 0; step <= steps; step++) {
+                int x = (int) (PADDING_LEFT + spacingPixel * step);
+                boolean isMajor = step % majorStepEvery == 0;
+                int paddingY = isMajor ? 0 : 3;
+                g.drawLine(x, paddingY, x, 10 - paddingY);
+
+                if (isMajor || (step == steps && textBlockedUntil < 0)) {
+                    String text;
+                    if (step == 0) {
+                        text = "0";
+                    } else {
+                        text = NavigatableComponent.getDistText(spacingMeter * step);
+                    }
+                    Rectangle2D bound = g.getFontMetrics().getStringBounds(text, g);
+                    int left = (int) (x - bound.getWidth() / 2);
+                    if (textBlockedUntil < left) {
+                        g.drawString(text, left, 23);
+                        textBlockedUntil = left + bound.getWidth() + 2;
+                    }
+                }
+            }
+            g.drawLine(PADDING_LEFT + 0, 5, (int) (PADDING_LEFT + spacingPixel * steps), 5);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/MapSlider.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapSlider.java	(revision 10076)
+++ trunk/src/org/openstreetmap/josm/gui/MapSlider.java	(revision 10078)
@@ -4,8 +4,10 @@
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 
+import java.awt.Dimension;
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
 
 import javax.swing.JSlider;
+import javax.swing.UIManager;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -21,5 +23,5 @@
 
     MapSlider(MapView mv) {
-        super(0, 150);
+        super(0, 160);
         setOpaque(false);
         this.mv = mv;
@@ -28,4 +30,6 @@
         // Call this manually once so it gets setup correctly
         propertyChange(null);
+        int w = UIManager.getDefaults().getInt("Slider.thumbWidth") + 150;
+        setPreferredSize(new Dimension(w, 27));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 10076)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 10078)
@@ -332,10 +332,7 @@
 
         addComponentListener(new ComponentAdapter() {
-            @Override public void componentResized(ComponentEvent e) {
+            @Override
+            public void componentResized(ComponentEvent e) {
                 removeComponentListener(this);
-
-                for (JComponent c : getMapNavigationComponents(MapView.this)) {
-                    MapView.this.add(c);
-                }
 
                 mapMover = new MapMover(MapView.this, contentPane);
@@ -369,4 +366,8 @@
             setFocusTraversalKeysEnabled(false);
         }
+
+        for (JComponent c : getMapNavigationComponents(MapView.this)) {
+            add(c);
+        }
     }
 
@@ -378,9 +379,13 @@
     public static List<? extends JComponent> getMapNavigationComponents(MapView forMapView) {
         MapSlider zoomSlider = new MapSlider(forMapView);
-        zoomSlider.setBounds(3, 0, 114, 30);
+        Dimension size = zoomSlider.getPreferredSize();
+        zoomSlider.setSize(size);
+        zoomSlider.setLocation(3, 0);
         zoomSlider.setFocusTraversalKeysEnabled(Shortcut.findShortcut(KeyEvent.VK_TAB, 0) == null);
 
         MapScaler scaler = new MapScaler(forMapView);
-        scaler.setLocation(10, 30);
+        scaler.setPreferredLineLength(size.width - 10);
+        scaler.setSize(scaler.getPreferredSize());
+        scaler.setLocation(3, size.height);
 
         return Arrays.asList(zoomSlider, scaler);
