diff --git a/src/org/openstreetmap/josm/gui/MapScaler.java b/src/org/openstreetmap/josm/gui/MapScaler.java
index ddb6f84..afa2a6e 100644
--- a/src/org/openstreetmap/josm/gui/MapScaler.java
+++ b/src/org/openstreetmap/josm/gui/MapScaler.java
@@ -5,6 +5,7 @@ import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.awt.Color;
+import java.awt.Dimension;
 import java.awt.Graphics;
 import java.awt.geom.Rectangle2D;
 
@@ -24,7 +25,8 @@ public class MapScaler extends JComponent implements Helpful, Accessible {
 
     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;
 
     /**
      * Constructs a new {@code MapScaler}.
@@ -32,23 +34,25 @@ public class MapScaler extends JComponent implements Helpful, Accessible {
      */
     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);
     }
 
     /**
@@ -94,4 +98,69 @@ public class MapScaler extends JComponent implements Helpful, Accessible {
             return null;
         }
     }
+
+    /**
+     * 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);
+        }
+    }
 }
diff --git a/src/org/openstreetmap/josm/gui/MapSlider.java b/src/org/openstreetmap/josm/gui/MapSlider.java
index f6f2fc1..7a1a787 100644
--- a/src/org/openstreetmap/josm/gui/MapSlider.java
+++ b/src/org/openstreetmap/josm/gui/MapSlider.java
@@ -3,10 +3,12 @@ package org.openstreetmap.josm.gui;
 
 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;
 
@@ -27,6 +29,8 @@ class MapSlider extends JSlider implements PropertyChangeListener, ChangeListene
         addChangeListener(this);
         // Call this manually once so it gets setup correctly
         propertyChange(null);
+        int w = UIManager.getDefaults().getInt("Slider.thumbWidth") + 150;
+        setPreferredSize(new Dimension(w, 27));
     }
 
     @Override
diff --git a/src/org/openstreetmap/josm/gui/MapView.java b/src/org/openstreetmap/josm/gui/MapView.java
index f509eac..d360b1b 100644
--- a/src/org/openstreetmap/josm/gui/MapView.java
+++ b/src/org/openstreetmap/josm/gui/MapView.java
@@ -279,13 +279,10 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
         Main.pref.addPreferenceChangeListener(this);
 
         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);
             }
         });
@@ -316,6 +313,10 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
         if (Shortcut.findShortcut(KeyEvent.VK_TAB, 0) != null) {
             setFocusTraversalKeysEnabled(false);
         }
+
+        for (JComponent c : getMapNavigationComponents(MapView.this)) {
+            add(c);
+        }
     }
 
     /**
@@ -325,11 +326,15 @@ implements PropertyChangeListener, PreferenceChangedListener, OsmDataLayer.Layer
      */
     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);
     }
