Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 8492)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 8493)
@@ -65,4 +65,5 @@
 import org.openstreetmap.josm.gui.widgets.QuadStateCheckBox;
 import org.openstreetmap.josm.gui.widgets.UrlLabel;
+import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -93,5 +94,5 @@
     private static final Map<String,String> LAST_VALUES = new HashMap<>();
 
-    public static class PresetListEntry {
+    public static class PresetListEntry implements Comparable<PresetListEntry> {
         public String value;
         /** The context used for translating {@link #value} */
@@ -168,4 +169,9 @@
                 return DIFFERENT;
             return getDisplayValue(true).replaceAll("<.*>", ""); // remove additional markup, e.g. <br>
+        }
+
+        @Override
+        public int compareTo(PresetListEntry o) {
+            return AlphanumComparator.getInstance().compare(this.getDisplayValue(true), o.getDisplayValue(true));
         }
     }
@@ -1064,5 +1070,5 @@
         }
 
-        private String[] initListEntriesFromAttributes() {
+        private void initListEntriesFromAttributes() {
             char delChar = getDelChar();
 
@@ -1110,19 +1116,27 @@
             }
 
+            final List<PresetListEntry> entries = new ArrayList<>(value_array.length);
             for (int i = 0; i < value_array.length; i++) {
                 final PresetListEntry e = new PresetListEntry(value_array[i]);
                 e.locale_display_value = locale_display_values != null
                         ? display_array[i]
-                                : trc(values_context, fixPresetString(display_array[i]));
-                        if (short_descriptions_array != null) {
-                            e.locale_short_description = locale_short_descriptions != null
-                                    ? short_descriptions_array[i]
-                                            : tr(fixPresetString(short_descriptions_array[i]));
-                        }
-                        lhm.put(value_array[i], e);
-                        display_array[i] = e.getDisplayValue(true);
-            }
-
-            return display_array;
+                        : trc(values_context, fixPresetString(display_array[i]));
+                if (short_descriptions_array != null) {
+                    e.locale_short_description = locale_short_descriptions != null
+                            ? short_descriptions_array[i]
+                            : tr(fixPresetString(short_descriptions_array[i]));
+                }
+
+                entries.add(e);
+            }
+
+            if (Main.pref.getBoolean("taggingpreset.sortvalues", true)) {
+                Collections.sort(entries);
+            }
+
+            for (PresetListEntry i : entries) {
+                lhm.put(i.value, i);
+            }
+
         }
 
