Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java	(revision 18256)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java	(revision 18257)
@@ -31,5 +31,5 @@
 
     /** whether to fire events or not */
-    private boolean enabled = false;
+    private boolean enabled;
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 18256)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 18257)
@@ -13,5 +13,4 @@
 import java.util.Arrays;
 import java.util.Comparator;
-import java.util.TreeMap;
 
 import javax.swing.AbstractAction;
@@ -89,10 +88,10 @@
         initializeLocaleText(null);
         usage = determineTextUsage(support.getSelected(), key);
-        seenValues = new TreeMap<>();
+        seenValues.clear();
         // get the standard values from the preset definition
         initListEntries();
 
         // init the model
-        dropDownModel = new AutoCompComboBoxModel<PresetListEntry>(Comparator.naturalOrder());
+        dropDownModel = new AutoCompComboBoxModel<>(Comparator.<PresetListEntry>naturalOrder());
 
         if (!usage.hasUniqueValue() && !usage.unused()) {
@@ -125,5 +124,5 @@
         combobox.setEditable(editable);
 
-        autoCompModel = new AutoCompComboBoxModel<AutoCompletionItem>(Comparator.naturalOrder());
+        autoCompModel = new AutoCompComboBoxModel<>(Comparator.<AutoCompletionItem>naturalOrder());
         getAllForKeys(Arrays.asList(key)).forEach(autoCompModel::addElement);
         getDisplayValues().forEach(s -> autoCompModel.addElement(new AutoCompletionItem(s, AutoCompletionPriority.IS_IN_STANDARD)));
@@ -155,5 +154,5 @@
         }
 
-        String valueToSelect = getInitialValue(default_);
+        String valueToSelect = getInitialValue(usage);
         if (valueToSelect != null) {
             PresetListEntry selItem = find(valueToSelect);
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 18256)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 18257)
@@ -5,4 +5,5 @@
 
 import java.awt.Component;
+import java.awt.Font;
 import java.lang.reflect.Method;
 import java.lang.reflect.Modifier;
@@ -91,5 +92,5 @@
     protected final List<PresetListEntry> presetListEntries = new ArrayList<>();
     /** Helps avoid duplicate list entries */
-    protected Map<String, PresetListEntry> seenValues = new TreeMap<>();
+    protected final Map<String, PresetListEntry> seenValues = new TreeMap<>();
     protected Usage usage;
     /** Used to see if the user edited the value. May be null. */
@@ -131,4 +132,5 @@
 
             JLabel l = (JLabel) renderer.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
+            l.setComponentOrientation(component.getComponentOrientation());
             if (index != -1) {
                 // index -1 is set when measuring the size of the cell and when painting the
@@ -136,6 +138,9 @@
                 l.setText(value.getListDisplay(width));
             }
+            if (value.getCount() > 0) {
+                l.setFont(l.getFont().deriveFont(Font.ITALIC + Font.BOLD));
+            }
+            l.setIcon(value.getIcon());
             l.setToolTipText(value.getToolTipText(key));
-            l.setIcon(value.getIcon());
             return l;
         }
@@ -221,7 +226,7 @@
     }
 
-    private List<String> getValuesFromCode(String values_from) {
+    private List<String> getValuesFromCode(String valuesFrom) {
         // get the values from a Java function
-        String[] classMethod = values_from.split("#", -1);
+        String[] classMethod = valuesFrom.split("#", -1);
         if (classMethod.length == 2) {
             try {
@@ -315,16 +320,19 @@
      * The initial value is the value shown in the control when the preset dialogs opens.
      *
-     * @param def The default value
+     * @param usage The key Usage
      * @return The initial value to use.
      */
-    protected String getInitialValue(String def) {
+    protected String getInitialValue(Usage usage) {
         String initialValue = null;
+        originalValue = null;
 
         if (usage.hasUniqueValue()) {
             // all selected primitives have the same not empty value for this key
             initialValue = usage.getFirst();
+            originalValue = initialValue;
         } else if (!usage.unused()) {
             // at least one primitive has a value for this key (but not all have the same one)
             initialValue = DIFFERENT;
+            originalValue = initialValue;
         } else if (PROP_FILL_DEFAULT.get() || isForceUseLastAsDefault()) {
             // at this point no primitive had any value for this key
@@ -336,7 +344,6 @@
         } else if (!usage.hadKeys()) {
             // use the default only on objects with no keys at all
-            initialValue = def;
-        }
-        originalValue = initialValue;
+            initialValue = default_;
+        }
         return initialValue;
     }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java	(revision 18256)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java	(revision 18257)
@@ -107,4 +107,5 @@
         private boolean hadKeys;
         private boolean hadEmpty;
+        private int selectedCount;
 
         /**
@@ -139,4 +140,33 @@
         public boolean hadKeys() {
             return hadKeys;
+        }
+
+        /**
+         * Returns the number of primitives selected.
+         * @return the number of primitives selected.
+         */
+        public int getSelectedCount() {
+            return selectedCount;
+        }
+
+        /**
+         * Splits multiple values and adds their usage counts as single value.
+         * <p>
+         * A value of {@code regional;pizza} will increment the count of {@code regional} and of
+         * {@code pizza}.
+         * @param delimiter The delimiter used for splitting.
+         * @return A new usage object with the new counts.
+         */
+        public Usage splitValues(String delimiter) {
+            Usage usage = new Usage();
+            usage.hadEmpty = hadEmpty;
+            usage.hadKeys = hadKeys;
+            usage.selectedCount = selectedCount;
+            map.forEach((value, count) -> {
+                for (String v : value.split(String.valueOf(delimiter), -1)) {
+                    usage.map.merge(v, count, Integer::sum);
+                }
+            });
+            return usage;
         }
     }
@@ -150,4 +180,5 @@
     public static Usage determineTextUsage(Collection<OsmPrimitive> sel, String key) {
         Usage returnValue = new Usage();
+        returnValue.selectedCount = sel.size();
         for (OsmPrimitive s : sel) {
             String v = s.get(key);
@@ -166,4 +197,5 @@
     protected static Usage determineBooleanUsage(Collection<OsmPrimitive> sel, String key) {
         Usage returnValue = new Usage();
+        returnValue.selectedCount = sel.size();
         for (OsmPrimitive s : sel) {
             String booleanValue = OsmUtils.getNamedOsmBoolean(s.get(key));
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java	(revision 18256)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java	(revision 18257)
@@ -2,5 +2,7 @@
 package org.openstreetmap.josm.gui.tagging.presets.items;
 
-import java.util.TreeMap;
+import java.awt.Dimension;
+import java.awt.Insets;
+import java.awt.Rectangle;
 import java.util.stream.Collectors;
 
@@ -41,16 +43,24 @@
         initializeLocaleText(null);
         usage = determineTextUsage(support.getSelected(), key);
-        seenValues = new TreeMap<>();
+        seenValues.clear();
         initListEntries();
 
         model.clear();
-        if (!usage.hasUniqueValue() && !usage.unused()) {
-            addEntry(PresetListEntry.ENTRY_DIFFERENT);
+        // disable if the selected primitives have different values
+        list.setEnabled(usage.hasUniqueValue() || usage.unused());
+        String initialValue = getInitialValue(usage);
+
+        // Add values from the preset.
+        presetListEntries.forEach(this::addEntry);
+
+        // Add all values used in the selected primitives. This also adds custom values and makes
+        // sure we won't lose them.
+        usage = usage.splitValues(String.valueOf(delimiter));
+        for (String value: usage.map.keySet()) {
+            addEntry(new PresetListEntry(value, this));
         }
 
-        String initialValue = getInitialValue(default_);
-        if (initialValue != null) {
-            // add all values already present to the list, otherwise we would remove all
-            // custom entries unknown to the preset
+        // Select the values in the initial value.
+        if (initialValue != null && !DIFFERENT.equals(initialValue)) {
             for (String value : initialValue.split(String.valueOf(delimiter), -1)) {
                 PresetListEntry e = new PresetListEntry(value, this);
@@ -61,15 +71,25 @@
         }
 
-        presetListEntries.forEach(this::addEntry);
-
         ComboMultiSelectListCellRenderer renderer = new ComboMultiSelectListCellRenderer(list, list.getCellRenderer(), 200, key);
         list.setCellRenderer(renderer);
+        JLabel label = addLabel(p);
+        label.setLabelFor(list);
+        JScrollPane sp = new JScrollPane(list);
 
         if (rows > 0) {
             list.setVisibleRowCount(rows);
+            // setVisibleRowCount() only works when all cells have the same height, but sometimes we
+            // have icons of different sizes. Calculate the size of the first {@code rows} entries
+            // and size the scrollpane accordingly.
+            Rectangle r = list.getCellBounds(0, Math.min(rows, model.size() - 1));
+            Insets insets = list.getInsets();
+            r.width += insets.left + insets.right;
+            r.height += insets.top + insets.bottom;
+            insets = sp.getInsets();
+            r.width += insets.left + insets.right;
+            r.height += insets.top + insets.bottom;
+            sp.setPreferredSize(new Dimension(r.width, r.height));
         }
-        JLabel label = addLabel(p);
-        p.add(new JScrollPane(list), GBC.eol().fill(GBC.HORIZONTAL)); // NOSONAR
-        label.setLabelFor(list);
+        p.add(sp, GBC.eol().fill(GBC.HORIZONTAL)); // NOSONAR
 
         list.addListSelectionListener(l -> support.fireItemValueModified(this, key, getSelectedItem().value));
@@ -83,5 +103,5 @@
     protected PresetListEntry getSelectedItem() {
         return new PresetListEntry(list.getSelectedValuesList()
-            .stream().map(e -> e.value).collect(Collectors.joining(String.valueOf(delimiter))), this);
+            .stream().map(e -> e.value).distinct().sorted().collect(Collectors.joining(String.valueOf(delimiter))), this);
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntry.java	(revision 18256)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntry.java	(revision 18257)
@@ -48,7 +48,7 @@
     public String locale_short_description; // NOSONAR
 
-    private String cachedDisplayValue = null;
-    private String cachedShortDescription = null;
-    private ImageIcon cachedIcon = null;
+    private String cachedDisplayValue;
+    private String cachedShortDescription;
+    private ImageIcon cachedIcon;
 
     /**
@@ -83,8 +83,8 @@
     public String getListDisplay(int width) {
         String displayValue = getDisplayValue();
-        Integer count = cms == null ? null : cms.usage.map.get(value);
+        Integer count = getCount();
 
-        if (count != null) {
-            displayValue = String.format("%s (%d)", displayValue, count);
+        if (count > 0 && cms.usage.getSelectedCount() > 1) {
+            displayValue = tr("{0} ({1})", displayValue, count);
         }
 
@@ -184,4 +184,13 @@
     }
 
+    /**
+     * Returns how many selected primitives had this value set.
+     * @return see above
+     */
+    public int getCount() {
+        Integer count = cms == null ? null : cms.usage.map.get(value);
+        return count == null ? 0 : count;
+    }
+
     @Override
     public int compareTo(PresetListEntry o) {
Index: trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java	(revision 18256)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java	(revision 18257)
@@ -48,5 +48,5 @@
 
     /** the configured maximum row count or null */
-    private Integer configMaximumRowCount = null;
+    private Integer configMaximumRowCount;
 
     /**
