Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 16056)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 16057)
@@ -37,21 +37,17 @@
         if (!usage.unused()) {
             for (String s : usage.values) {
-                if (!lhm.containsKey(s)) {
-                    lhm.put(s, new PresetListEntry(s));
-                }
+                presetListEntries.add(new PresetListEntry(s));
             }
         }
-        if (def != null && !lhm.containsKey(def)) {
-            lhm.put(def, new PresetListEntry(def));
+        if (def != null) {
+            presetListEntries.add(new PresetListEntry(def));
         }
-        if (!lhm.containsKey("")) {
-            lhm.put("", new PresetListEntry(""));
-        }
+        presetListEntries.add(new PresetListEntry(""));
 
-        combobox = new JosmComboBox<>(lhm.values().toArray(new PresetListEntry[lhm.size()]));
+        combobox = new JosmComboBox<>(presetListEntries.toArray(new PresetListEntry[0]));
         component = combobox;
         combobox.setRenderer(getListCellRenderer());
         combobox.setEditable(editable);
-        combobox.reinitialize(lhm.values());
+        combobox.reinitialize(presetListEntries);
         AutoCompletingTextField tf = new AutoCompletingTextField();
         initAutoCompletionField(tf, key);
@@ -70,5 +66,5 @@
         if (usage.hasUniqueValue()) {
             // all items have the same value (and there were no unset items)
-            originalValue = lhm.get(usage.getFirst());
+            originalValue = getListEntry(usage.getFirst());
             combobox.setSelectedItem(originalValue);
         } else if (def != null && usage.unused()) {
@@ -76,20 +72,20 @@
             if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || isForceUseLastAsDefault()) {
                 // selected osm primitives are untagged or filling default feature is enabled
-                combobox.setSelectedItem(lhm.get(def).getDisplayValue(true));
+                combobox.setSelectedItem(getListEntry(def).getDisplayValue());
             } else {
                 // selected osm primitives are tagged and filling default feature is disabled
                 combobox.setSelectedItem("");
             }
-            originalValue = lhm.get(DIFFERENT);
+            originalValue = getListEntry(DIFFERENT);
         } else if (usage.unused()) {
             // all items were unset (and so is default)
-            originalValue = lhm.get("");
+            originalValue = getListEntry("");
             if (!presetInitiallyMatches && isForceUseLastAsDefault() && LAST_VALUES.containsKey(key)) {
-                combobox.setSelectedItem(lhm.get(LAST_VALUES.get(key)));
+                combobox.setSelectedItem(getListEntry(LAST_VALUES.get(key)));
             } else {
                 combobox.setSelectedItem(originalValue);
             }
         } else {
-            originalValue = lhm.get(DIFFERENT);
+            originalValue = getListEntry(DIFFERENT);
             combobox.setSelectedItem(originalValue);
         }
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 16056)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 16057)
@@ -14,10 +14,9 @@
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedHashMap;
 import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
+import java.util.Objects;
 import java.util.Set;
 import java.util.TreeSet;
+import java.util.concurrent.CopyOnWriteArraySet;
 import java.util.stream.Collectors;
 
@@ -98,5 +97,5 @@
 
     protected JComponent component;
-    protected final Map<String, PresetListEntry> lhm = new LinkedHashMap<>();
+    protected final Set<PresetListEntry> presetListEntries = new CopyOnWriteArraySet<>();
     private boolean initialized;
     protected Usage usage;
@@ -253,5 +252,5 @@
                 return "<b>" + Utils.escapeReservedCharactersHTML(DIFFERENT) + "</b>";
 
-            String displayValue = Utils.escapeReservedCharactersHTML(getDisplayValue(true));
+            String displayValue = Utils.escapeReservedCharactersHTML(getDisplayValue());
             String shortDescription = getShortDescription(true);
 
@@ -279,11 +278,8 @@
         /**
          * Returns the value to display.
-         * @param translated whether the text must be translated
          * @return the value to display
          */
-        public String getDisplayValue(boolean translated) {
-            return translated
-                    ? Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value))
-                            : Utils.firstNonNull(display_value, value);
+        public String getDisplayValue() {
+            return Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value));
         }
 
@@ -304,11 +300,24 @@
             if (DIFFERENT.equals(value))
                 return DIFFERENT;
-            String displayValue = getDisplayValue(true);
+            String displayValue = getDisplayValue();
             return displayValue != null ? displayValue.replaceAll("<.*>", "") : ""; // remove additional markup, e.g. <br>
+        }
+
+        @Override
+        public boolean equals(Object o) {
+            if (this == o) return true;
+            if (o == null || getClass() != o.getClass()) return false;
+            PresetListEntry that = (PresetListEntry) o;
+            return Objects.equals(value, that.value);
+        }
+
+        @Override
+        public int hashCode() {
+            return Objects.hash(value);
         }
 
         @Override
         public int compareTo(PresetListEntry o) {
-            return AlphanumComparator.getInstance().compare(this.getDisplayValue(true), o.getDisplayValue(true));
+            return AlphanumComparator.getInstance().compare(this.getDisplayValue(), o.getDisplayValue());
         }
     }
@@ -355,5 +364,5 @@
     public Collection<String> getValues() {
         initListEntries();
-        return lhm.keySet();
+        return presetListEntries.stream().map(x -> x.value).collect(Collectors.toSet());
     }
 
@@ -364,5 +373,5 @@
     public Collection<String> getDisplayValues() {
         initListEntries();
-        return lhm.values().stream().map(x -> x.getDisplayValue(true)).collect(Collectors.toList());
+        return presetListEntries.stream().map(PresetListEntry::getDisplayValue).collect(Collectors.toList());
     }
 
@@ -374,5 +383,5 @@
         usage = determineTextUsage(sel, key);
         if (!usage.hasUniqueValue() && !usage.unused()) {
-            lhm.put(DIFFERENT, new PresetListEntry(DIFFERENT));
+            presetListEntries.add(new PresetListEntry(DIFFERENT));
         }
 
@@ -389,7 +398,7 @@
     private void initListEntries() {
         if (initialized) {
-            lhm.remove(DIFFERENT); // possibly added in #addToPanel
+            presetListEntries.remove(new PresetListEntry(DIFFERENT)); // possibly added in #addToPanel
             return;
-        } else if (lhm.isEmpty()) {
+        } else if (presetListEntries.isEmpty()) {
             initListEntriesFromAttributes();
         } else {
@@ -409,5 +418,5 @@
                         key, text, "short_descriptions", "list_entry"));
             }
-            for (PresetListEntry e : lhm.values()) {
+            for (PresetListEntry e : presetListEntries) {
                 if (e.value_context == null) {
                     e.value_context = values_context;
@@ -493,7 +502,5 @@
         }
 
-        for (PresetListEntry i : entries) {
-            lhm.put(i.value, i);
-        }
+        addListEntries(entries);
     }
 
@@ -509,8 +516,8 @@
 
         if (display != null) {
-            for (Entry<String, PresetListEntry> entry : lhm.entrySet()) {
-                String k = entry.getValue().toString();
+            for (PresetListEntry entry : presetListEntries) {
+                String k = entry.toString();
                 if (k.equals(display)) {
-                    value = entry.getKey();
+                    value = entry.value;
                     break;
                 }
@@ -560,5 +567,5 @@
      */
     public void addListEntry(PresetListEntry e) {
-        lhm.put(e.value, e);
+        presetListEntries.add(e);
     }
 
@@ -573,4 +580,8 @@
     }
 
+    protected PresetListEntry getListEntry(String value) {
+        return presetListEntries.stream().filter(e -> Objects.equals(e.value, value)).findFirst().orElse(null);
+    }
+
     protected ListCellRenderer<PresetListEntry> getListCellRenderer() {
         return RENDERER;
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java	(revision 16056)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java	(revision 16057)
@@ -26,5 +26,5 @@
     @Override
     protected void addToPanelAnchor(JPanel p, String def, boolean presetInitiallyMatches) {
-        list = new ConcatenatingJList(delimiter, lhm.values().toArray(new PresetListEntry[lhm.size()]));
+        list = new ConcatenatingJList(delimiter, presetListEntries.toArray(new PresetListEntry[0]));
         component = list;
         ListCellRenderer<PresetListEntry> renderer = getListCellRenderer();
