Index: trunk/src/org/openstreetmap/josm/gui/MapScaler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapScaler.java	(revision 3405)
+++ trunk/src/org/openstreetmap/josm/gui/MapScaler.java	(revision 3406)
@@ -17,7 +17,10 @@
 
     private final NavigatableComponent mv;
+    
+    private static int PADDING_RIGHT = 100;
+    
     public MapScaler(NavigatableComponent mv) {
         this.mv = mv;
-        setSize(100,30);
+        setSize(100+PADDING_RIGHT,30);
         setOpaque(false);
     }
@@ -33,5 +36,5 @@
         g.drawLine(24, 3, 24, 7);
         g.drawLine(74, 3, 74, 7);
-        g.drawString(text, (int)(100-bound.getWidth()), 23);
+        g.drawString(text, (int)(100-bound.getWidth()/2), 23);
         g.drawString("0", 0, 23);
     }
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 3405)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 3406)
@@ -1,4 +1,3 @@
 // License: GPL. See LICENSE file for details.
-
 package org.openstreetmap.josm.gui;
 
@@ -101,5 +100,5 @@
     ImageLabel angleText = new ImageLabel("angle", tr("The angle between the previous and the current way segment."), 6);
     ImageLabel headingText = new ImageLabel("heading", tr("The (compass) heading of the line segment being drawn."), 6);
-    ImageLabel distText = new ImageLabel("dist", tr("The length of the new way segment being drawn."), 8);
+    ImageLabel distText = new ImageLabel("dist", tr("The length of the new way segment being drawn."), 10);
 
     /**
@@ -635,6 +634,5 @@
     }
     public void setDist(double dist) {
-        String text = dist > 1000 ? (Math.round(dist/100)/10.0)+" km" : Math.round(dist*10)/10.0 +" m";
-        distText.setText(dist < 0 ? "--" : text);
+        distText.setText(dist < 0 ? "--" : NavigatableComponent.getDistText(dist));
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 3405)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 3406)
@@ -1,5 +1,6 @@
 // License: GPL. See LICENSE file for details.
-
 package org.openstreetmap.josm.gui;
+
+import static org.openstreetmap.josm.tools.I18n.marktr;
 
 import java.awt.Point;
@@ -10,6 +11,9 @@
 import java.util.Date;
 import java.util.HashSet;
+import java.util.LinkedHashMap;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Locale;
+import java.util.Map;
 import java.util.Stack;
 import java.util.TreeMap;
@@ -111,9 +115,15 @@
     }
 
+    public static String getDistText(double dist) {
+        SystemOfMeasurement som = SYSTEMS_OF_MEASUREMENT.get(Main.pref.get("system_of_measurement", "Metric"));
+        if (som == null) {
+            som = METRIC_SOM;
+        }
+        return som.getDistText(dist);
+    }
+
     public String getDist100PixelText()
     {
-        double dist = getDist100Pixel();
-        return dist >= 2000 ? Math.round(dist/100)/10 +" km" : (dist >= 1
-                ? Math.round(dist*10)/10 +" m" : "< 1 m");
+        return getDistText(getDist100Pixel());
     }
 
@@ -707,3 +717,46 @@
         return (int)id.getValue();
     }
+
+    public static class SystemOfMeasurement {
+        public final double aValue;
+        public final double bValue;
+        public final String aName;
+        public final String bName;
+
+        /**
+         * System of measurement. Currently covers only length units.
+         *
+         * If a quantity x is given in m (x_m) and in unit a (x_a) then it translates as
+         * x_a == x_m / aValue
+         */
+        public SystemOfMeasurement(double aValue, String aName, double bValue, String bName) {
+            this.aValue = aValue;
+            this.aName = aName;
+            this.bValue = bValue;
+            this.bName = bName;
+        }
+
+        public String getDistText(double dist) {
+            double a = dist / aValue;
+            if (a > bValue / aValue) {
+                double b = dist / bValue;
+                return String.format(Locale.US, "%." + (b<10 ? 2 : 1) + "f %s", b, bName);
+            } else if (a < 0.01)
+                return "< 0.01 " + aName;
+            else
+                return String.format(Locale.US, "%." + (a<10 ? 2 : 1) + "f %s", a, aName);
+        }
+    }
+
+    public static final SystemOfMeasurement METRIC_SOM = new SystemOfMeasurement(1, "m", 1000, "km");
+    public static final SystemOfMeasurement CHINESE_SOM = new SystemOfMeasurement(1.0/3.0, "\u5e02\u5c3a" /* chi */, 500, "\u5e02\u91cc" /* li */);
+    public static final SystemOfMeasurement IMPERIAL_SOM = new SystemOfMeasurement(0.9144, "yd.", 1609.344, "mi.");
+
+    public static Map<String, SystemOfMeasurement> SYSTEMS_OF_MEASUREMENT;
+    static {
+        SYSTEMS_OF_MEASUREMENT = new LinkedHashMap<String, SystemOfMeasurement>();
+        SYSTEMS_OF_MEASUREMENT.put(marktr("Metric"), METRIC_SOM);
+        SYSTEMS_OF_MEASUREMENT.put(marktr("Chinese"), CHINESE_SOM);
+        SYSTEMS_OF_MEASUREMENT.put(marktr("Imperial"), IMPERIAL_SOM);
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 3405)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 3406)
@@ -7,4 +7,5 @@
 import java.awt.event.ActionEvent;
 import java.awt.event.ActionListener;
+import java.util.ArrayList;
 import java.util.Collection;
 import java.util.concurrent.CopyOnWriteArrayList;
@@ -16,4 +17,5 @@
 import javax.swing.JPanel;
 import javax.swing.JScrollPane;
+import javax.swing.JSeparator;
 
 import org.openstreetmap.josm.Main;
@@ -26,4 +28,5 @@
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.data.projection.ProjectionSubPrefs;
+import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -51,4 +54,12 @@
         }
     };
+    private static final StringProperty PROP_SYSTEM_OF_MEASUREMENT = new StringProperty("system_of_measurement", "Metric");
+    private static final String[] unitsValues = (new ArrayList<String>(NavigatableComponent.SYSTEMS_OF_MEASUREMENT.keySet())).toArray(new String[0]);
+    private static final String[] unitsValuesTr = new String[unitsValues.length];
+    static {
+        for (int i=0; i<unitsValues.length; ++i) {
+            unitsValuesTr[i] = tr(unitsValues[i]);
+        }
+    }
 
     //TODO This is not nice place for a listener code but probably only Dataset will want to listen for projection changes so it's acceptable
@@ -80,4 +91,6 @@
     private JComboBox coordinatesCombo = new JComboBox(CoordinateFormat.values());
 
+    private JComboBox unitsCombo = new JComboBox(unitsValuesTr);
+
     /**
      * This variable holds the JPanel with the projection's preferences. If the
@@ -86,4 +99,5 @@
      */
     private JPanel projSubPrefPanel;
+    private JPanel projSubPrefPanelWrapper = new JPanel(new GridBagLayout());
 
     private JLabel projectionCode = new JLabel();
@@ -100,5 +114,5 @@
      * in sync
      */
-    static private GBC projSubPrefPanelGBC = GBC.eol().fill(GBC.BOTH).insets(20,5,5,5);
+    static private GBC projSubPrefPanelGBC = GBC.std().fill(GBC.BOTH).weight(1.0, 1.0);
 
     public void addGui(PreferenceTabbedPane gui) {
@@ -112,9 +126,13 @@
         }
 
+        for (int i = 0; i < unitsValues.length; ++i) {
+            if (unitsValues[i].equals(PROP_SYSTEM_OF_MEASUREMENT.get())) {
+                unitsCombo.setSelectedIndex(i);
+                break;
+            }
+        }
+
         projPanel.setBorder(BorderFactory.createEmptyBorder( 0, 0, 0, 0 ));
         projPanel.setLayout(new GridBagLayout());
-        projPanel.add(new JLabel(tr("Display coordinates as")), GBC.std().insets(5,5,0,5));
-        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
-        projPanel.add(coordinatesCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
         projPanel.add(new JLabel(tr("Projection method")), GBC.std().insets(5,5,0,5));
         projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
@@ -126,5 +144,15 @@
         projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
         projPanel.add(bounds, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
-        projPanel.add(projSubPrefPanel, projSubPrefPanelGBC);
+        projSubPrefPanelWrapper.add(projSubPrefPanel, projSubPrefPanelGBC);
+        projPanel.add(projSubPrefPanelWrapper, GBC.eol().fill(GBC.HORIZONTAL).insets(20,5,5,5));
+
+        projPanel.add(new JSeparator(), GBC.eol().fill(GBC.HORIZONTAL).insets(0,5,0,10));
+        projPanel.add(new JLabel(tr("Display coordinates as")), GBC.std().insets(5,5,0,5));
+        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(coordinatesCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
+        projPanel.add(new JLabel(tr("System of measurement")), GBC.std().insets(5,5,0,5));
+        projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+        projPanel.add(unitsCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
+        projPanel.add(GBC.glue(1,1), GBC.std().fill(GBC.HORIZONTAL).weight(1.0, 1.0));
 
         JScrollPane scrollpane = new JScrollPane(projPanel);
@@ -157,4 +185,7 @@
             CoordinateFormat.setCoordinateFormat((CoordinateFormat)coordinatesCombo.getSelectedItem());
         }
+
+        int i = unitsCombo.getSelectedIndex();
+        PROP_SYSTEM_OF_MEASUREMENT.put(unitsValues[i]);
 
         return false;
@@ -234,6 +265,6 @@
 
         // Replace old panel with new one
-        projPanel.remove(size - 1);
-        projPanel.add(projSubPrefPanel, projSubPrefPanelGBC);
+        projSubPrefPanelWrapper.removeAll();
+        projSubPrefPanelWrapper.add(projSubPrefPanel, projSubPrefPanelGBC);
         projPanel.revalidate();
         projSubPrefPanel.repaint();
