Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 16689)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 16690)
@@ -126,5 +126,12 @@
     }
 
-    protected static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
+    /**
+     * Loads a tagging preset icon
+     * @param iconName the icon name
+     * @param zipIcons zip file where the image is located
+     * @param maxSize maximum image size (or null)
+     * @return the requested image or null if the request failed
+     */
+    public static ImageIcon loadImageIcon(String iconName, File zipIcons, Integer maxSize) {
         final Collection<String> s = Config.getPref().getList("taggingpreset.icon.sources", null);
         ImageProvider imgProv = new ImageProvider(iconName).setDirs(s).setId("presets").setArchive(zipIcons).setOptional(true);
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java	(revision 16689)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetReader.java	(revision 16690)
@@ -37,4 +37,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.items.Optional;
 import org.openstreetmap.josm.gui.tagging.presets.items.PresetLink;
+import org.openstreetmap.josm.gui.tagging.presets.items.PresetListEntry;
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles;
 import org.openstreetmap.josm.gui.tagging.presets.items.Roles.Role;
@@ -151,5 +152,5 @@
         parser.map("space", Space.class);
         parser.map("key", Key.class);
-        parser.map("list_entry", ComboMultiSelect.PresetListEntry.class);
+        parser.map("list_entry", PresetListEntry.class);
         parser.map("item_separator", ItemSeparator.class);
         parser.mapBoth("chunk", Chunk.class);
@@ -188,5 +189,5 @@
         Roles lastrole = null;
         final List<Check> checks = new LinkedList<>();
-        final List<ComboMultiSelect.PresetListEntry> listEntries = new LinkedList<>();
+        final List<PresetListEntry> listEntries = new LinkedList<>();
         final Map<String, List<Object>> byId = new HashMap<>();
         final Deque<String> lastIds = new ArrayDeque<>();
@@ -299,6 +300,6 @@
                             all.getLast().data.add((TaggingPresetItem) o);
                         }
-                    } else if (o instanceof ComboMultiSelect.PresetListEntry) {
-                        listEntries.add((ComboMultiSelect.PresetListEntry) o);
+                    } else if (o instanceof PresetListEntry) {
+                        listEntries.add((PresetListEntry) o);
                     } else if (o instanceof CheckGroup) {
                         CheckGroup cg = (CheckGroup) o;
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 16689)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 16690)
@@ -22,5 +22,4 @@
 import java.util.stream.IntStream;
 
-import javax.swing.ImageIcon;
 import javax.swing.JComponent;
 import javax.swing.JLabel;
@@ -31,8 +30,6 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
-import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetSelector;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.Logging;
@@ -152,124 +149,4 @@
 
             return lbl;
-        }
-    }
-
-    /**
-     * Preset list entry.
-     */
-    public static class PresetListEntry implements Comparable<PresetListEntry> {
-        /** Entry value */
-        public String value; // NOSONAR
-        /** The context used for translating {@link #value} */
-        public String value_context; // NOSONAR
-        /** Value displayed to the user */
-        public String display_value; // NOSONAR
-        /** Text to be displayed below {@code display_value}. */
-        public String short_description; // NOSONAR
-        /** The location of icon file to display */
-        public String icon; // NOSONAR
-        /** The size of displayed icon. If not set, default is size from icon file */
-        public short icon_size; // NOSONAR
-        /** The localized version of {@link #display_value}. */
-        public String locale_display_value; // NOSONAR
-        /** The localized version of {@link #short_description}. */
-        public String locale_short_description; // NOSONAR
-
-        /** Cached width (currently only for Combo) to speed up preset dialog initialization */
-        public short preferredWidth = -1; // NOSONAR
-        /** Cached height (currently only for Combo) to speed up preset dialog initialization */
-        public short preferredHeight = -1; // NOSONAR
-
-        /**
-         * Constructs a new {@code PresetListEntry}, uninitialized.
-         */
-        public PresetListEntry() {
-            // Public default constructor is needed
-        }
-
-        /**
-         * Constructs a new {@code PresetListEntry}, initialized with a value.
-         * @param value value
-         */
-        public PresetListEntry(String value) {
-            this.value = value;
-        }
-
-        /**
-         * Returns HTML formatted contents.
-         * @return HTML formatted contents
-         */
-        public String getListDisplay() {
-            if (value.equals(DIFFERENT))
-                return "<b>" + Utils.escapeReservedCharactersHTML(DIFFERENT) + "</b>";
-
-            String displayValue = Utils.escapeReservedCharactersHTML(getDisplayValue());
-            String shortDescription = getShortDescription(true);
-
-            if (displayValue.isEmpty() && (shortDescription == null || shortDescription.isEmpty()))
-                return "&nbsp;";
-
-            final StringBuilder res = new StringBuilder("<b>").append(displayValue).append("</b>");
-            if (shortDescription != null) {
-                // wrap in table to restrict the text width
-                res.append("<div style=\"width:300px; padding:0 0 5px 5px\">")
-                   .append(shortDescription)
-                   .append("</div>");
-            }
-            return res.toString();
-        }
-
-        /**
-         * Returns the entry icon, if any.
-         * @return the entry icon, or {@code null}
-         */
-        public ImageIcon getIcon() {
-            return icon == null ? null : loadImageIcon(icon, TaggingPresetReader.getZipIcons(), (int) icon_size);
-        }
-
-        /**
-         * Returns the value to display.
-         * @return the value to display
-         */
-        public String getDisplayValue() {
-            return Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value));
-        }
-
-        /**
-         * Returns the short description to display.
-         * @param translated whether the text must be translated
-         * @return the short description to display
-         */
-        public String getShortDescription(boolean translated) {
-            return translated
-                    ? Utils.firstNonNull(locale_short_description, tr(short_description))
-                            : short_description;
-        }
-
-        // toString is mainly used to initialize the Editor
-        @Override
-        public String toString() {
-            if (DIFFERENT.equals(value))
-                return DIFFERENT;
-            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(), o.getDisplayValue());
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntry.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntry.java	(revision 16690)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntry.java	(revision 16690)
@@ -0,0 +1,135 @@
+// License: GPL. For details, see LICENSE file.
+
+package org.openstreetmap.josm.gui.tagging.presets.items;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trc;
+
+import java.util.Objects;
+
+import javax.swing.ImageIcon;
+
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
+import org.openstreetmap.josm.tools.AlphanumComparator;
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Preset list entry.
+ */
+public class PresetListEntry implements Comparable<PresetListEntry> {
+    /** Entry value */
+    public String value; // NOSONAR
+    /** The context used for translating {@link #value} */
+    public String value_context; // NOSONAR
+    /** Value displayed to the user */
+    public String display_value; // NOSONAR
+    /** Text to be displayed below {@code display_value}. */
+    public String short_description; // NOSONAR
+    /** The location of icon file to display */
+    public String icon; // NOSONAR
+    /** The size of displayed icon. If not set, default is size from icon file */
+    public short icon_size; // NOSONAR
+    /** The localized version of {@link #display_value}. */
+    public String locale_display_value; // NOSONAR
+    /** The localized version of {@link #short_description}. */
+    public String locale_short_description; // NOSONAR
+
+    /** Cached width (currently only for Combo) to speed up preset dialog initialization */
+    public short preferredWidth = -1; // NOSONAR
+    /** Cached height (currently only for Combo) to speed up preset dialog initialization */
+    public short preferredHeight = -1; // NOSONAR
+
+    /**
+     * Constructs a new {@code PresetListEntry}, uninitialized.
+     */
+    public PresetListEntry() {
+        // Public default constructor is needed
+    }
+
+    /**
+     * Constructs a new {@code PresetListEntry}, initialized with a value.
+     * @param value value
+     */
+    public PresetListEntry(String value) {
+        this.value = value;
+    }
+
+    /**
+     * Returns HTML formatted contents.
+     * @return HTML formatted contents
+     */
+    public String getListDisplay() {
+        if (value.equals(KeyedItem.DIFFERENT))
+            return "<b>" + Utils.escapeReservedCharactersHTML(KeyedItem.DIFFERENT) + "</b>";
+
+        String displayValue = Utils.escapeReservedCharactersHTML(getDisplayValue());
+        String shortDescription = getShortDescription(true);
+
+        if (displayValue.isEmpty() && (shortDescription == null || shortDescription.isEmpty()))
+            return "&nbsp;";
+
+        final StringBuilder res = new StringBuilder("<b>").append(displayValue).append("</b>");
+        if (shortDescription != null) {
+            // wrap in table to restrict the text width
+            res.append("<div style=\"width:300px; padding:0 0 5px 5px\">")
+               .append(shortDescription)
+               .append("</div>");
+        }
+        return res.toString();
+    }
+
+    /**
+     * Returns the entry icon, if any.
+     * @return the entry icon, or {@code null}
+     */
+    public ImageIcon getIcon() {
+        return icon == null ? null : TaggingPresetItem.loadImageIcon(icon, TaggingPresetReader.getZipIcons(), (int) icon_size);
+    }
+
+    /**
+     * Returns the value to display.
+     * @return the value to display
+     */
+    public String getDisplayValue() {
+        return Utils.firstNonNull(locale_display_value, tr(display_value), trc(value_context, value));
+    }
+
+    /**
+     * Returns the short description to display.
+     * @param translated whether the text must be translated
+     * @return the short description to display
+     */
+    public String getShortDescription(boolean translated) {
+        return translated
+                ? Utils.firstNonNull(locale_short_description, tr(short_description))
+                        : short_description;
+    }
+
+    // toString is mainly used to initialize the Editor
+    @Override
+    public String toString() {
+        if (KeyedItem.DIFFERENT.equals(value))
+            return KeyedItem.DIFFERENT;
+        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(), o.getDisplayValue());
+    }
+}
Index: unk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelectTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelectTest.java	(revision 16689)
+++ 	(revision )
@@ -1,31 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.tagging.presets.items;
-
-import static org.junit.Assert.assertEquals;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.gui.tagging.presets.items.ComboMultiSelect.PresetListEntry;
-
-/**
- * Unit tests of {@link ComboMultiSelect} class.
- */
-public class ComboMultiSelectTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/12416">#12416</a>.
-     */
-    @Test
-    public void testTicket12416() {
-        assertEquals("&nbsp;", new PresetListEntry("").getListDisplay());
-    }
-}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntryTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntryTest.java	(revision 16690)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/tagging/presets/items/PresetListEntryTest.java	(revision 16690)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging.presets.items;
+
+import static org.junit.Assert.assertEquals;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests of {@link PresetListEntry} class.
+ */
+public class PresetListEntryTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/12416">#12416</a>.
+     */
+    @Test
+    public void testTicket12416() {
+        assertEquals("&nbsp;", new PresetListEntry("").getListDisplay());
+    }
+}
