Index: trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(revision 16984)
+++ trunk/src/org/openstreetmap/josm/data/SystemOfMeasurement.java	(revision 16985)
@@ -3,4 +3,5 @@
 
 import static org.openstreetmap.josm.tools.I18n.marktr;
+import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.text.NumberFormat;
@@ -127,9 +128,10 @@
     /**
      * Sets the current global system of measurement.
-     * @param somKey The system of measurement key. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
+     * @param som The system of measurement to set. Must be defined in {@link SystemOfMeasurement#ALL_SYSTEMS}.
      * @throws IllegalArgumentException if {@code somKey} is not known
-     * @since 8554
-     */
-    public static void setSystemOfMeasurement(String somKey) {
+     * @since xxx (signature)
+     */
+    public static void setSystemOfMeasurement(SystemOfMeasurement som) {
+        String somKey = som.getName();
         if (!SystemOfMeasurement.ALL_SYSTEMS.containsKey(somKey)) {
             throw new IllegalArgumentException("Invalid system of measurement: "+somKey);
@@ -285,4 +287,13 @@
 
     /**
+     * Returns the localized name of this system of measurement
+     * @return the localized name
+     */
+    @Override
+    public String toString() {
+        return tr(name);
+    }
+
+    /**
      * Returns the default system of measurement for the current country.
      * @return the default system of measurement for the current country
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 16984)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 16985)
@@ -35,11 +35,12 @@
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Comparator;
 import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Objects;
-import java.util.TreeSet;
 import java.util.concurrent.BlockingQueue;
 import java.util.concurrent.LinkedBlockingQueue;
+import java.util.stream.Collectors;
 
 import javax.swing.AbstractAction;
@@ -128,4 +129,8 @@
     private static final AbstractProperty<Boolean> SHOW_ID = new BooleanProperty("osm-primitives.showid", false);
 
+    private static final List<SystemOfMeasurement> SORTED_SYSTEM_OF_MEASUREMENTS = SystemOfMeasurement.ALL_SYSTEMS.values().stream()
+            .sorted(Comparator.comparing(SystemOfMeasurement::toString))
+            .collect(Collectors.toList());
+
     /**
      * Property for map status background color.
@@ -801,9 +806,9 @@
 
         MapStatusPopupMenu() {
-            for (final String key : new TreeSet<>(SystemOfMeasurement.ALL_SYSTEMS.keySet())) {
-                JCheckBoxMenuItem item = new JCheckBoxMenuItem(new AbstractAction(key) {
+            for (final SystemOfMeasurement som : SORTED_SYSTEM_OF_MEASUREMENTS) {
+                JCheckBoxMenuItem item = new JCheckBoxMenuItem(new AbstractAction(som.toString()) {
                     @Override
                     public void actionPerformed(ActionEvent e) {
-                        updateSystemOfMeasurement(key);
+                        updateSystemOfMeasurement(som);
                     }
                 });
@@ -919,11 +924,10 @@
         if (Config.getPref().getBoolean("statusbar.change-system-of-measurement-on-click", true)) {
             distText.addMouseListener(new MouseAdapter() {
-                private final List<String> soms = new ArrayList<>(new TreeSet<>(SystemOfMeasurement.ALL_SYSTEMS.keySet()));
-
                 @Override
                 public void mouseClicked(MouseEvent e) {
                     if (!e.isPopupTrigger() && e.getButton() == MouseEvent.BUTTON1) {
-                        String som = SystemOfMeasurement.PROP_SYSTEM_OF_MEASUREMENT.get();
-                        String newsom = soms.get((soms.indexOf(som)+1) % soms.size());
+                        SystemOfMeasurement som = SystemOfMeasurement.getSystemOfMeasurement();
+                        int i = (SORTED_SYSTEM_OF_MEASUREMENTS.indexOf(som) + 1) % SORTED_SYSTEM_OF_MEASUREMENTS.size();
+                        SystemOfMeasurement newsom = SORTED_SYSTEM_OF_MEASUREMENTS.get(i);
                         updateSystemOfMeasurement(newsom);
                     }
@@ -997,11 +1001,11 @@
     /**
      * Updates the system of measurement and displays a notification.
-     * @param newsom The new system of measurement to set
+     * @param som The new system of measurement to set
      * @since 6960
      */
-    public void updateSystemOfMeasurement(String newsom) {
-        SystemOfMeasurement.setSystemOfMeasurement(newsom);
+    public void updateSystemOfMeasurement(SystemOfMeasurement som) {
+        SystemOfMeasurement.setSystemOfMeasurement(som);
         if (Config.getPref().getBoolean("statusbar.notify.change-system-of-measurement", true)) {
-            new Notification(tr("System of measurement changed to {0}", newsom))
+            new Notification(tr("System of measurement changed to {0}", som.toString()))
                 .setDuration(Notification.TIME_SHORT)
                 .show();
Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 16984)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 16985)
@@ -2,5 +2,4 @@
 package org.openstreetmap.josm.gui.preferences.projection;
 
-import static org.openstreetmap.josm.data.SystemOfMeasurement.ALL_SYSTEMS;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -11,4 +10,5 @@
 import java.util.Collection;
 import java.util.Collections;
+import java.util.Comparator;
 import java.util.HashMap;
 import java.util.List;
@@ -296,11 +296,4 @@
     private static final StringProperty PROP_COORDINATES = new StringProperty("coordinates", null);
     private static final ListProperty PROP_SUB_PROJECTION_DEFAULT = new ListProperty("projection.default.sub", null);
-    private static final String[] unitsValues = ALL_SYSTEMS.keySet().toArray(new String[ALL_SYSTEMS.size()]);
-    private static final String[] unitsValuesTr = new String[unitsValues.length];
-    static {
-        for (int i = 0; i < unitsValues.length; ++i) {
-            unitsValuesTr[i] = tr(unitsValues[i]);
-        }
-    }
 
     /**
@@ -314,5 +307,11 @@
     private final JosmComboBox<ICoordinateFormat> coordinatesCombo;
 
-    private final JosmComboBox<String> unitsCombo = new JosmComboBox<>(unitsValuesTr);
+    /**
+     * Combobox with all system of measurements
+     */
+    private final JosmComboBox<SystemOfMeasurement> unitsCombo = new JosmComboBox<>(
+            SystemOfMeasurement.ALL_SYSTEMS.values().stream()
+                    .sorted(Comparator.comparing(SystemOfMeasurement::toString))
+                    .toArray(SystemOfMeasurement[]::new));
 
     /**
@@ -359,7 +358,5 @@
                 .ifPresent(coordinatesCombo::setSelectedIndex);
 
-        IntStream.range(0, unitsValues.length)
-                .filter(i -> unitsValues[i].equals(SystemOfMeasurement.PROP_SYSTEM_OF_MEASUREMENT.get())).findFirst()
-                .ifPresent(unitsCombo::setSelectedIndex);
+        unitsCombo.setSelectedItem(SystemOfMeasurement.getSystemOfMeasurement());
 
         projPanel.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, 0));
@@ -448,6 +445,5 @@
         }
 
-        int i = unitsCombo.getSelectedIndex();
-        SystemOfMeasurement.setSystemOfMeasurement(unitsValues[i]);
+        SystemOfMeasurement.setSystemOfMeasurement(((SystemOfMeasurement) unitsCombo.getSelectedItem()));
 
         return false;
