Index: /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 8553)
+++ /trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 8554)
@@ -32,5 +32,4 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
-import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.MapViewPaintable;
@@ -424,5 +423,5 @@
             // - Snap steps relative to the distance?
             double snapDistance;
-            SystemOfMeasurement som = NavigatableComponent.getSystemOfMeasurement();
+            SystemOfMeasurement som = SystemOfMeasurement.getSystemOfMeasurement();
             if (som.equals(SystemOfMeasurement.CHINESE)) {
                 snapDistance = snapDistanceChinese * SystemOfMeasurement.CHINESE.aValue;
Index: /trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(revision 8553)
+++ /trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(revision 8554)
@@ -8,13 +8,29 @@
 import java.util.Locale;
 import java.util.Map;
+import java.util.concurrent.CopyOnWriteArrayList;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 
 /**
  * A system of units used to express length and area measurements.
+ * <p>
+ * This class also manages one globally set system of measurement stored in the {@link ProjectionPreference}
  * @since 3406 (creation)
  * @since 6992 (extraction in this package)
  */
 public class SystemOfMeasurement {
+
+    /**
+     * Interface to notify listeners of the change of the system of measurement.
+     */
+    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);
+    }
 
     /**
@@ -53,4 +69,58 @@
         ALL_SYSTEMS.put(marktr("Imperial"), IMPERIAL);
         ALL_SYSTEMS.put(marktr("Nautical Mile"), NAUTICAL_MILE);
+    }
+
+    private static final CopyOnWriteArrayList<SoMChangeListener> somChangeListeners = new CopyOnWriteArrayList<>();
+
+    /**
+     * Removes a global SoM change listener
+     *
+     * @param listener the listener. Ignored if null or already absent
+     */
+    public static void removeSoMChangeListener(SoMChangeListener listener) {
+        somChangeListeners.remove(listener);
+    }
+
+    /**
+     * Adds a SoM change listener
+     *
+     * @param listener the listener. Ignored if null or already registered.
+     */
+    public static void addSoMChangeListener(SoMChangeListener listener) {
+        if (listener != null) {
+            somChangeListeners.addIfAbsent(listener);
+        }
+    }
+
+    protected static void fireSoMChanged(String oldSoM, String newSoM) {
+        for (SoMChangeListener l : somChangeListeners) {
+            l.systemOfMeasurementChanged(oldSoM, newSoM);
+        }
+    }
+
+    /**
+     * Returns the current global system of measurement.
+     * @return The current system of measurement (metric system by default).
+     */
+    public static SystemOfMeasurement getSystemOfMeasurement() {
+        SystemOfMeasurement som = SystemOfMeasurement.ALL_SYSTEMS.get(ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get());
+        if (som == null)
+            return SystemOfMeasurement.METRIC;
+        return som;
+    }
+
+    /**
+     * Sets the current global system of measurement.
+     * @param somKey The system of measurement key. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
+     * @throws IllegalArgumentException if {@code somKey} is not known
+     */
+    public static void setSystemOfMeasurement(String somKey) {
+        if (!SystemOfMeasurement.ALL_SYSTEMS.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/MapStatus.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 8553)
+++ /trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 8554)
@@ -54,4 +54,5 @@
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.SystemOfMeasurement;
+import org.openstreetmap.josm.data.SystemOfMeasurement.SoMChangeListener;
 import org.openstreetmap.josm.data.coor.CoordinateFormat;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -60,5 +61,4 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.preferences.ColorProperty;
-import org.openstreetmap.josm.gui.NavigatableComponent.SoMChangeListener;
 import org.openstreetmap.josm.gui.help.Helpful;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
@@ -865,5 +865,5 @@
         }
 
-        NavigatableComponent.addSoMChangeListener(somListener = new SoMChangeListener() {
+        SystemOfMeasurement.addSoMChangeListener(somListener = new SoMChangeListener() {
             @Override
             public void systemOfMeasurementChanged(String oldSoM, String newSoM) {
@@ -908,5 +908,5 @@
      */
     public void updateSystemOfMeasurement(String newsom) {
-        NavigatableComponent.setSystemOfMeasurement(newsom);
+        SystemOfMeasurement.setSystemOfMeasurement(newsom);
         if (Main.pref.getBoolean("statusbar.notify.change-system-of-measurement", true)) {
             new Notification(tr("System of measurement changed to {0}", newsom))
@@ -1020,5 +1020,5 @@
     @Override
     public void destroy() {
-        NavigatableComponent.removeSoMChangeListener(somListener);
+        SystemOfMeasurement.removeSoMChangeListener(somListener);
         Main.pref.removePreferenceChangeListener(this);
 
Index: /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 8553)
+++ /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 8554)
@@ -52,5 +52,4 @@
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
-import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.tools.Predicate;
 import org.openstreetmap.josm.tools.Utils;
@@ -79,11 +78,6 @@
      * @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);
+    @Deprecated
+    public interface SoMChangeListener extends SystemOfMeasurement.SoMChangeListener {
     }
 
@@ -138,5 +132,4 @@
     }
 
-    private static final CopyOnWriteArrayList<SoMChangeListener> somChangeListeners = new CopyOnWriteArrayList<>();
 
     /**
@@ -146,6 +139,7 @@
      * @since 6056
      */
+    @Deprecated
     public static void removeSoMChangeListener(NavigatableComponent.SoMChangeListener listener) {
-        somChangeListeners.remove(listener);
+        SystemOfMeasurement.removeSoMChangeListener(listener);
     }
 
@@ -156,23 +150,31 @@
      * @since 6056
      */
+    @Deprecated
     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);
-        }
-    }
-
-    /**
-     * The scale factor in x or y-units per pixel. This means, if scale = 10,
-     * every physical pixel on screen are 10 x or 10 y units in the
-     * northing/easting space of the projection.
-     */
+        SystemOfMeasurement.addSoMChangeListener(listener);
+    }
+
+    /**
+     * Returns the current system of measurement.
+     * @return The current system of measurement (metric system by default).
+     * @since 3490
+     */
+    @Deprecated
+    public static SystemOfMeasurement getSystemOfMeasurement() {
+        return SystemOfMeasurement.getSystemOfMeasurement();
+    }
+
+    /**
+     * Sets the current system of measurement.
+     * @param somKey The system of measurement key. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
+     * @throws IllegalArgumentException if {@code somKey} is not known
+     * @since 6056
+     */
+    @Deprecated
+    public static void setSystemOfMeasurement(String somKey) {
+        SystemOfMeasurement.setSystemOfMeasurement(somKey);
+    }
+
     private double scale = Main.getProjection().getDefaultZoomInPPD();
-
     /**
      * Center n/e coordinate of the desired screen center.
@@ -212,5 +214,5 @@
      */
     public static String getDistText(double dist) {
-        return getSystemOfMeasurement().getDistText(dist);
+        return SystemOfMeasurement.getSystemOfMeasurement().getDistText(dist);
     }
 
@@ -224,5 +226,5 @@
      */
     public static String getDistText(final double dist, final NumberFormat format, final double threshold) {
-        return getSystemOfMeasurement().getDistText(dist, format, threshold);
+        return SystemOfMeasurement.getSystemOfMeasurement().getDistText(dist, format, threshold);
     }
 
@@ -234,5 +236,5 @@
      */
     public static String getAreaText(double area) {
-        return getSystemOfMeasurement().getAreaText(area);
+        return SystemOfMeasurement.getSystemOfMeasurement().getAreaText(area);
     }
 
@@ -246,5 +248,5 @@
      */
     public static String getAreaText(final double area, final NumberFormat format, final double threshold) {
-        return getSystemOfMeasurement().getAreaText(area, format, threshold);
+        return SystemOfMeasurement.getSystemOfMeasurement().getAreaText(area, format, threshold);
     }
 
@@ -1435,32 +1437,4 @@
     }
 
-    /**
-     * Returns the current system of measurement.
-     * @return The current system of measurement (metric system by default).
-     * @since 3490
-     */
-    public static SystemOfMeasurement getSystemOfMeasurement() {
-        SystemOfMeasurement som = SystemOfMeasurement.ALL_SYSTEMS.get(ProjectionPreference.PROP_SYSTEM_OF_MEASUREMENT.get());
-        if (som == null)
-            return SystemOfMeasurement.METRIC;
-        return som;
-    }
-
-    /**
-     * Sets the current system of measurement.
-     * @param somKey The system of measurement key. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
-     * @throws IllegalArgumentException if {@code somKey} is not known
-     * @since 6056
-     */
-    public static void setSystemOfMeasurement(String somKey) {
-        if (!SystemOfMeasurement.ALL_SYSTEMS.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);
-        }
-    }
-
     private static class CursorInfo {
         private final Cursor cursor;
Index: /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 8553)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/GpxLayer.java	(revision 8554)
@@ -26,4 +26,5 @@
 import org.openstreetmap.josm.actions.SaveActionBase;
 import org.openstreetmap.josm.data.Bounds;
+import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -150,5 +151,5 @@
                 info.append(getTimespanForTrack(trk));
                 info.append("</td><td>");
-                info.append(NavigatableComponent.getSystemOfMeasurement().getDistText(trk.length()));
+                info.append(SystemOfMeasurement.getSystemOfMeasurement().getDistText(trk.length()));
                 info.append("</td><td>");
                 if (trk.getAttributes().containsKey("url")) {
@@ -160,5 +161,5 @@
         }
 
-        info.append(tr("Length: {0}", NavigatableComponent.getSystemOfMeasurement().getDistText(data.length()))).append("<br>")
+        info.append(tr("Length: {0}", SystemOfMeasurement.getSystemOfMeasurement().getDistText(data.length()))).append("<br>")
             .append(trn("{0} route, ", "{0} routes, ", data.routes.size(), data.routes.size())).append(
                 trn("{0} waypoint", "{0} waypoints", data.waypoints.size(), data.waypoints.size())).append("<br>");
@@ -222,5 +223,5 @@
             .append(trn("{0} route, ", "{0} routes, ", data.routes.size(), data.routes.size()))
             .append(trn("{0} waypoint", "{0} waypoints", data.waypoints.size(), data.waypoints.size())).append("<br>")
-            .append(tr("Length: {0}", NavigatableComponent.getSystemOfMeasurement().getDistText(data.length())))
+            .append(tr("Length: {0}", SystemOfMeasurement.getSystemOfMeasurement().getDistText(data.length())))
             .append("<br></html>");
         return info.toString();
Index: /trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(revision 8553)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/gpx/ChooseTrackVisibilityAction.java	(revision 8554)
@@ -33,8 +33,8 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.SystemOfMeasurement;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxTrack;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.layer.GpxLayer;
 import org.openstreetmap.josm.tools.GBC;
@@ -83,5 +83,5 @@
         @Override
         public String toString() {
-            return NavigatableComponent.getSystemOfMeasurement().getDistText(value);
+            return SystemOfMeasurement.getSystemOfMeasurement().getDistText(value);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 8553)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 8554)
@@ -30,5 +30,4 @@
 import org.openstreetmap.josm.data.projection.CustomProjection;
 import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
@@ -384,5 +383,5 @@
 
         int i = unitsCombo.getSelectedIndex();
-        NavigatableComponent.setSystemOfMeasurement(unitsValues[i]);
+        SystemOfMeasurement.setSystemOfMeasurement(unitsValues[i]);
 
         return false;
