Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java	(revision 15436)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java	(revision 15437)
@@ -2,4 +2,7 @@
 package org.openstreetmap.josm.gui.tagging.presets.items;
 
+import java.awt.GridBagLayout;
+import java.awt.event.MouseAdapter;
+import java.awt.event.MouseEvent;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -7,9 +10,13 @@
 import java.util.List;
 
+import javax.swing.ImageIcon;
+import javax.swing.JLabel;
 import javax.swing.JPanel;
+import javax.swing.SwingConstants;
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
 import org.openstreetmap.josm.gui.widgets.QuadStateCheckBox;
 import org.openstreetmap.josm.tools.GBC;
@@ -30,4 +37,8 @@
     /** "on" or "off" or unset (default is unset) */
     public String default_; // only used for tagless objects // NOSONAR
+    /** The location of icon file to display */
+    public String icon; // NOSONAR
+    /** The size of displayed icon. If not set, default is 16px */
+    public String icon_size; // NOSONAR
 
     private QuadStateCheckBox check;
@@ -80,10 +91,23 @@
             allowedStates.add(QuadStateCheckBox.State.NOT_SELECTED);
         allowedStates.add(QuadStateCheckBox.State.UNSET);
-        check = new QuadStateCheckBox(locale_text, initialState,
+        check = new QuadStateCheckBox(icon == null ? locale_text : null, initialState,
                 allowedStates.toArray(new QuadStateCheckBox.State[0]));
         check.setPropertyText(key);
         check.setState(check.getState()); // to update the tooltip text
 
-        p.add(check, GBC.eol()); // Do not fill, see #15104
+        JPanel checkPanel = new JPanel(new GridBagLayout());
+        checkPanel.add(check, GBC.std());
+        if (icon != null) {
+            JLabel label = new JLabel(locale_text, getIcon(), SwingConstants.LEFT);
+            label.addMouseListener(new MouseAdapter() {
+                @Override
+                public void mousePressed(MouseEvent e) {
+                    check.getMouseAdapter().mousePressed(e);
+                }
+            });
+            checkPanel.add(label);
+            checkPanel.add(new JLabel(), GBC.eol().fill());
+        }
+        p.add(checkPanel, GBC.eol()); // Do not fill, see #15104
         return true;
     }
@@ -106,4 +130,14 @@
     }
 
+    /**
+     * Returns the entry icon, if any.
+     * @return the entry icon, or {@code null}
+     * @since 15437
+     */
+    public ImageIcon getIcon() {
+        Integer size = parseInteger(icon_size);
+        return icon == null ? null : loadImageIcon(icon, TaggingPresetReader.getZipIcons(), size != null ? size : 16);
+    }
+
     @Override
     public Collection<String> getValues() {
Index: trunk/src/org/openstreetmap/josm/gui/widgets/QuadStateCheckBox.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/QuadStateCheckBox.java	(revision 15436)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/QuadStateCheckBox.java	(revision 15437)
@@ -45,4 +45,11 @@
     private final transient QuadStateDecorator cbModel;
     private State[] allowed;
+    private final MouseListener mouseAdapter = new MouseAdapter() {
+        @Override
+        public void mousePressed(MouseEvent e) {
+            grabFocus();
+            cbModel.nextState();
+        }
+    };
 
     /**
@@ -57,10 +64,5 @@
         this.allowed = Utils.copyArray(allowed);
         // Add a listener for when the mouse is pressed
-        super.addMouseListener(new MouseAdapter() {
-            @Override public void mousePressed(MouseEvent e) {
-                grabFocus();
-                cbModel.nextState();
-            }
-        });
+        super.addMouseListener(mouseAdapter);
         // Reset the keyboard action map
         ActionMap map = new ActionMapUIResource();
@@ -94,4 +96,13 @@
     public synchronized void addMouseListener(MouseListener l) {
         // Do nothing
+    }
+
+    /**
+     * Returns the internal mouse listener.
+     * @return the internal mouse listener
+     * @since 15437
+     */
+    public MouseListener getMouseAdapter() {
+        return mouseAdapter;
     }
 
