Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 17609)
@@ -329,4 +329,5 @@
 
         boolean presetInitiallyMatches = !selected.isEmpty() && selected.stream().allMatch(this);
+        final TaggingPresetItemGuiSupport itemGuiSupport = TaggingPresetItemGuiSupport.create(presetInitiallyMatches, selected);
         JPanel items = new JPanel(new GridBagLayout());
         TaggingPresetItem previous = null;
@@ -342,5 +343,5 @@
                     }
                 }
-                if (i.addToPanel(items, selected, presetInitiallyMatches)) {
+                if (i.addToPanel(items, itemGuiSupport)) {
                     p.hasElements = true;
                 }
@@ -355,5 +356,5 @@
         // add Link
         for (Link link : l) {
-            link.addToPanel(p, selected, presetInitiallyMatches);
+            link.addToPanel(p, itemGuiSupport);
         }
 
@@ -674,3 +675,4 @@
         return iconFuture;
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItem.java	(revision 17609)
@@ -57,10 +57,8 @@
      *
      * @param p The panel where components must be added
-     * @param sel The related selected OSM primitives
-     * @param presetInitiallyMatches Whether this {@link TaggingPreset} already matched before applying,
-     *                               i.e. whether the map feature already existed on the primitive.
+     * @param support supporting class for creating the GUI
      * @return {@code true} if this item adds semantic tagging elements, {@code false} otherwise.
      */
-    protected abstract boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches);
+    protected abstract boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support);
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java	(revision 17609)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java	(revision 17609)
@@ -0,0 +1,63 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging.presets;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+import java.util.Arrays;
+import java.util.Collection;
+
+/**
+ * Supporting class for creating the GUI for a preset item.
+ *
+ * @since xxx
+ */
+public class TaggingPresetItemGuiSupport {
+
+    private final Collection<OsmPrimitive> selected;
+    private final boolean presetInitiallyMatches;
+
+    private TaggingPresetItemGuiSupport(boolean presetInitiallyMatches, Collection<OsmPrimitive> selected) {
+        this.selected = selected;
+        this.presetInitiallyMatches = presetInitiallyMatches;
+    }
+
+    /**
+     * Returns the selected primitives
+     *
+     * @return the selected primitives
+     */
+    public Collection<OsmPrimitive> getSelected() {
+        return selected;
+    }
+
+    /**
+     * Returns whether the preset initially matched (before opening the dialog)
+     *
+     * @return whether the preset initially matched
+     */
+    public boolean isPresetInitiallyMatches() {
+        return presetInitiallyMatches;
+    }
+
+    /**
+     * Creates a new {@code TaggingPresetItemGuiSupport}
+     *
+     * @param selected the selected primitives
+     * @param presetInitiallyMatches whether the preset initially matched
+     * @return the new {@code TaggingPresetItemGuiSupport}
+     */
+    public static TaggingPresetItemGuiSupport create(boolean presetInitiallyMatches, Collection<OsmPrimitive> selected) {
+        return new TaggingPresetItemGuiSupport(presetInitiallyMatches, selected);
+    }
+
+    /**
+     * Creates a new {@code TaggingPresetItemGuiSupport}
+     *
+     * @param selected the selected primitives
+     * @param presetInitiallyMatches whether the preset initially matched
+     * @return the new {@code TaggingPresetItemGuiSupport}
+     */
+    public static TaggingPresetItemGuiSupport create(boolean presetInitiallyMatches, OsmPrimitive... selected) {
+        return new TaggingPresetItemGuiSupport(presetInitiallyMatches, Arrays.asList(selected));
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Check.java	(revision 17609)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.gui.widgets.QuadStateCheckBox;
 import org.openstreetmap.josm.tools.GBC;
@@ -38,8 +39,8 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
 
         // find out if our key is already used in the selection.
-        final Usage usage = determineBooleanUsage(sel, key);
+        final Usage usage = determineBooleanUsage(support.getSelected(), key);
         final String oneValue = usage.values.isEmpty() ? null : usage.values.last();
         def = "on".equals(default_) ? Boolean.TRUE : "off".equals(default_) ? Boolean.FALSE : null;
@@ -50,5 +51,5 @@
             if (def != null && !PROP_FILL_DEFAULT.get()) {
                 // default is set and filling default values feature is disabled - check if all primitives are untagged
-                for (OsmPrimitive s : sel) {
+                for (OsmPrimitive s : support.getSelected()) {
                     if (s.hasKeys()) {
                         def = null;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/CheckGroup.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/CheckGroup.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/CheckGroup.java	(revision 17609)
@@ -3,5 +3,4 @@
 
 import java.awt.GridLayout;
-import java.util.Collection;
 import java.util.LinkedList;
 import java.util.List;
@@ -10,7 +9,7 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -32,10 +31,10 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         int rows = (int) Math.ceil(checks.size() / ((double) columns));
         JPanel panel = new JPanel(new GridLayout(rows, columns));
 
         for (Check check : checks) {
-            check.addToPanel(panel, sel, presetInitiallyMatches);
+            check.addToPanel(panel, support);
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 17609)
@@ -28,6 +28,6 @@
 import javax.swing.ListCellRenderer;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetSelector;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -206,9 +206,9 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         initListEntries(true);
 
         // find out if our key is already used in the selection.
-        usage = determineTextUsage(sel, key);
+        usage = determineTextUsage(support.getSelected(), key);
         if (!usage.hasUniqueValue() && !usage.unused()) {
             presetListEntries.add(new PresetListEntry(DIFFERENT));
@@ -220,5 +220,5 @@
         label.setComponentPopupMenu(getPopupMenu());
         p.add(label, GBC.std().insets(0, 0, 10, 0));
-        addToPanelAnchor(p, default_, presetInitiallyMatches);
+        addToPanelAnchor(p, default_, support.isPresetInitiallyMatches());
         label.setLabelFor(component);
         component.setToolTipText(getKeyTooltipText());
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ItemSeparator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ItemSeparator.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/ItemSeparator.java	(revision 17609)
@@ -2,5 +2,4 @@
 package org.openstreetmap.josm.gui.tagging.presets.items;
 
-import java.util.Collection;
 import java.util.List;
 
@@ -8,7 +7,7 @@
 import javax.swing.JSeparator;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -20,5 +19,5 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         p.add(new JSeparator(), GBC.eol().fill(GBC.HORIZONTAL).insets(0, 5, 0, 5));
         return false;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Key.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Key.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Key.java	(revision 17609)
@@ -8,6 +8,6 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 
 /**
@@ -20,5 +20,5 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         return false;
     }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Label.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Label.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Label.java	(revision 17609)
@@ -1,11 +1,9 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.tagging.presets.items;
-
-import java.util.Collection;
 
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -16,5 +14,5 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         initializeLocaleText(null);
         JLabel label = new JLabel(locale_text);
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Link.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Link.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Link.java	(revision 17609)
@@ -6,5 +6,4 @@
 import java.awt.event.MouseEvent;
 import java.util.Arrays;
-import java.util.Collection;
 import java.util.Optional;
 
@@ -12,6 +11,6 @@
 import javax.swing.SwingUtilities;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.dialogs.properties.HelpAction;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.gui.widgets.UrlLabel;
 import org.openstreetmap.josm.spi.preferences.Config;
@@ -35,5 +34,5 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         initializeLocaleText(tr("More information about this feature"));
         Optional.ofNullable(buildUrlLabel()).ifPresent(label -> p.add(label, GBC.eol().insets(0, 10, 0, 0).fill(GBC.HORIZONTAL)));
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Optional.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Optional.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Optional.java	(revision 17609)
@@ -4,10 +4,8 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.util.Collection;
-
 import javax.swing.JLabel;
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -20,5 +18,5 @@
     // TODO: Draw a box around optional stuff
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         initializeLocaleText(tr("Optional Attributes:"));
         p.add(new JLabel(" "), GBC.eol()); // space
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java	(revision 17609)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetLabel;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
@@ -54,5 +55,5 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         final String presetName = preset_name;
         Optional<TaggingPreset> found = TaggingPresets.getTaggingPresets().stream().filter(preset -> presetName.equals(preset.name)).findFirst();
@@ -60,5 +61,5 @@
             TaggingPreset t = found.get();
             JLabel lbl = new TaggingPresetLabel(t);
-            lbl.addMouseListener(new TaggingPresetMouseAdapter(t, sel));
+            lbl.addMouseListener(new TaggingPresetMouseAdapter(t, support.getSelected()));
             p.add(lbl, GBC.eol().fill(GBC.HORIZONTAL));
         }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Roles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Roles.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Roles.java	(revision 17609)
@@ -6,5 +6,4 @@
 import java.awt.GridBagLayout;
 import java.util.ArrayList;
-import java.util.Collection;
 import java.util.List;
 import java.util.Set;
@@ -13,5 +12,4 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler;
@@ -19,4 +17,5 @@
 import org.openstreetmap.josm.data.osm.search.SearchSetting;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
 import org.openstreetmap.josm.tools.GBC;
@@ -191,5 +190,5 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         p.add(new JLabel(" "), GBC.eol()); // space
         if (!roles.isEmpty()) {
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Space.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Space.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Space.java	(revision 17609)
@@ -2,5 +2,4 @@
 package org.openstreetmap.josm.gui.tagging.presets.items;
 
-import java.util.Collection;
 import java.util.List;
 
@@ -8,7 +7,7 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -19,5 +18,5 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
         p.add(new JLabel(" "), GBC.eol()); // space
         return false;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java	(revision 17608)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/Text.java	(revision 17609)
@@ -22,8 +22,8 @@
 import javax.swing.JToggleButton;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItemGuiSupport;
 import org.openstreetmap.josm.gui.widgets.JosmComboBox;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
@@ -61,8 +61,8 @@
 
     @Override
-    public boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
+    public boolean addToPanel(JPanel p, TaggingPresetItemGuiSupport support) {
 
         // find out if our key is already used in the selection.
-        Usage usage = determineTextUsage(sel, key);
+        Usage usage = determineTextUsage(support.getSelected(), key);
         AutoCompletingTextField textField = new AutoCompletingTextField();
         if (alternative_autocomplete_keys != null) {
@@ -88,5 +88,5 @@
             } else if (!usage.hadKeys() || PROP_FILL_DEFAULT.get() || "force".equals(use_last_as_default)) {
                 // selected osm primitives are untagged or filling default values feature is enabled
-                if (!presetInitiallyMatches && !"false".equals(use_last_as_default) && LAST_VALUES.containsKey(key)) {
+                if (!support.isPresetInitiallyMatches() && !"false".equals(use_last_as_default) && LAST_VALUES.containsKey(key)) {
                     textField.setText(LAST_VALUES.get(key));
                 } else {
