Index: trunk/src/org/openstreetmap/josm/gui/MapFrame.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 6055)
+++ trunk/src/org/openstreetmap/josm/gui/MapFrame.java	(revision 6056)
@@ -287,13 +287,5 @@
         }
 
-        // MapFrame gets destroyed when the last layer is removed, but the status line background
-        // thread that collects the information doesn't get destroyed automatically.
-        if(statusLine.thread != null) {
-            try {
-                statusLine.thread.interrupt();
-            } catch (Exception e) {
-                e.printStackTrace();
-            }
-        }
+        statusLine.destroy();
         mapView.destroy();
     }
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 6055)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 6056)
@@ -28,4 +28,5 @@
 import java.util.ConcurrentModificationException;
 import java.util.List;
+import java.util.TreeSet;
 
 import javax.swing.AbstractAction;
@@ -50,5 +51,7 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.NavigatableComponent.SoMChangeListener;
 import org.openstreetmap.josm.gui.help.Helpful;
+import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor.ProgressMonitorDialog;
@@ -56,4 +59,5 @@
 import org.openstreetmap.josm.gui.widgets.ImageLabel;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
+import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -72,5 +76,5 @@
  * @author imi
  */
-public class MapStatus extends JPanel implements Helpful {
+public class MapStatus extends JPanel implements Helpful, Destroyable {
 
     /**
@@ -142,11 +146,14 @@
     public final BackgroundProgressMonitor progressMonitor = new BackgroundProgressMonitor();
     
-    private MouseListener jumpToOnLeftClick;
+    private final MouseListener jumpToOnLeftClick;
+    private final SoMChangeListener somListener;
+    
+    private double distValue; // Distance value displayed in distText, stored if refresh needed after a change of system of measurement
 
     /**
      * This is the thread that runs in the background and collects the information displayed.
-     * It gets destroyed by MapFrame.java/destroy() when the MapFrame itself is destroyed.
+     * It gets destroyed by destroy() when the MapFrame itself is destroyed.
      */
-    public Thread thread;
+    private Thread thread;
 
     private final List<StatusTextHistory> statusText = new ArrayList<StatusTextHistory>();
@@ -751,5 +758,22 @@
         add(angleText, GBC.std().insets(3,0,0,0));
         add(distText, GBC.std().insets(3,0,0,0));
-
+        
+        distText.addMouseListener(new MouseAdapter() {
+            private final List<String> soms = new ArrayList<String>(new TreeSet<String>(NavigatableComponent.SYSTEMS_OF_MEASUREMENT.keySet()));
+            
+            @Override
+            public void mouseClicked(MouseEvent e) {
+                String som = ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get();
+                String newsom = soms.get((soms.indexOf(som)+1)%soms.size());
+                NavigatableComponent.setSystemOfMeasurement(newsom);
+            }
+        });
+        
+        NavigatableComponent.addSoMChangeListener(somListener = new SoMChangeListener() {
+            @Override public void systemOfMeasurementChanged(String oldSoM, String newSoM) {
+                setDist(distValue);
+            }
+        });
+        
         latText.addMouseListener(jumpToOnLeftClick);
         lonText.addMouseListener(jumpToOnLeftClick);
@@ -840,4 +864,5 @@
      */
     public void setDist(double dist) {
+        distValue = dist;
         distText.setText(dist < 0 ? "--" : NavigatableComponent.getDistText(dist));
     }
@@ -863,3 +888,18 @@
         angleText.setBackground(activeFlag ? ImageLabel.backColorActive : ImageLabel.backColor);
     }
+
+    @Override
+    public void destroy() {
+        NavigatableComponent.removeSoMChangeListener(somListener);
+        
+        // MapFrame gets destroyed when the last layer is removed, but the status line background
+        // thread that collects the information doesn't get destroyed automatically.
+        if (thread != null) {
+            try {
+                thread.interrupt();
+            } catch (Exception e) {
+                e.printStackTrace();
+            }
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 6055)
+++ trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 6056)
@@ -64,5 +64,18 @@
         void zoomChanged();
     }
-
+    
+    /**
+     * Interface to notify listeners of the change of the system of measurement.
+     * @since 6056
+     */
+    public interface SoMChangeListener {
+        /**
+         * The current SoM has changed.
+         * @param oldSoM The old system of measurement
+         * @param newSoM The new (current) system of measurement
+         */
+        void systemOfMeasurementChanged(String oldSoM, String newSoM);
+    }
+    
     /**
      * Simple data class that keeps map center and scale in one object.
@@ -127,4 +140,37 @@
         for (ZoomChangeListener l : zoomChangeListeners) {
             l.zoomChanged();
+        }
+    }
+
+    /**
+     * the SoM listeners
+     */
+    private static final CopyOnWriteArrayList<SoMChangeListener> somChangeListeners = new CopyOnWriteArrayList<SoMChangeListener>();
+
+    /**
+     * Removes a SoM change listener
+     * 
+     * @param listener the listener. Ignored if null or already absent
+     * @since 6056
+     */
+    public static void removeSoMChangeListener(NavigatableComponent.SoMChangeListener listener) {
+        somChangeListeners.remove(listener);
+    }
+
+    /**
+     * Adds a SoM change listener
+     * 
+     * @param listener the listener. Ignored if null or already registered.
+     * @since 6056
+     */
+    public static void addSoMChangeListener(NavigatableComponent.SoMChangeListener listener) {
+        if (listener != null) {
+            somChangeListeners.addIfAbsent(listener);
+        }
+    }
+    
+    protected static void fireSoMChanged(String oldSoM, String newSoM) {
+        for (SoMChangeListener l : somChangeListeners) {
+            l.systemOfMeasurementChanged(oldSoM, newSoM);
         }
     }
@@ -1229,4 +1275,20 @@
             return METRIC_SOM;
         return som;
+    }
+
+    /**
+     * Sets the current system of measurement.
+     * @param somKey The system of measurement key. Must be defined in {@link NavigatableComponent#SYSTEMS_OF_MEASUREMENT}.
+     * @since 6056
+     * @throws IllegalArgumentException if {@code somKey} is not known
+     */
+    public static void setSystemOfMeasurement(String somKey) {
+        if (!SYSTEMS_OF_MEASUREMENT.containsKey(somKey)) {
+            throw new IllegalArgumentException("Invalid system of measurement: "+somKey);
+        }
+        String oldKey = ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get();
+        if (ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.put(somKey)) {
+            fireSoMChanged(oldKey, somKey);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 6055)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 6056)
@@ -371,5 +371,5 @@
 
         int i = unitsCombo.getSelectedIndex();
-        PROP_SYSTEM_OF_MEASUREMENT.put(unitsValues[i]);
+        NavigatableComponent.setSystemOfMeasurement(unitsValues[i]);
 
         return false;
