Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 16698)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 16699)
@@ -14,5 +14,4 @@
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.EnumSet;
 import java.util.LinkedHashSet;
@@ -386,16 +385,18 @@
     public void actionPerformed(ActionEvent e) {
         DataSet ds = OsmDataManager.getInstance().getEditDataSet();
-        Collection<OsmPrimitive> participants = Collections.emptyList();
-        if (ds != null) {
-            participants = ds.getSelected();
-        }
-
-        // Display dialog even if no data layer (used by preset-tagging-tester plugin)
-        Collection<OsmPrimitive> sel = createSelection(participants);
-        int answer = showDialog(sel, supportsRelation());
-
         if (ds == null) {
             return;
         }
+        showAndApply(ds.getSelected());
+    }
+
+    /**
+     * {@linkplain #showDialog Show preset dialog}, apply changes
+     * @param primitives the primitives
+     */
+    public void showAndApply(Collection<OsmPrimitive> primitives) {
+        // Display dialog even if no data layer (used by preset-tagging-tester plugin)
+        Collection<OsmPrimitive> sel = createSelection(primitives);
+        int answer = showDialog(sel, supportsRelation());
 
         if (!sel.isEmpty() && answer == DIALOG_ANSWER_APPLY) {
@@ -407,5 +408,6 @@
             Relation calculated = null;
             if (getChangedTags().stream().anyMatch(t -> "boundary".equals(t.get("type")) || "multipolygon".equals(t.get("type")))) {
-                Pair<Relation, Relation> res = CreateMultipolygonAction.createMultipolygonRelation(ds.getSelectedWays(), true);
+                Collection<Way> ways = Utils.filteredCollection(primitives, Way.class);
+                Pair<Relation, Relation> res = CreateMultipolygonAction.createMultipolygonRelation(ways, true);
                 if (res != null) {
                     calculated = res.b;
@@ -413,10 +415,9 @@
             }
             final Relation r = calculated != null ? calculated : new Relation();
-            final Collection<RelationMember> members = new LinkedHashSet<>();
-            members.addAll(r.getMembers());
+            final Collection<RelationMember> members = new LinkedHashSet<>(r.getMembers());
             for (Tag t : getChangedTags()) {
                 r.put(t.getKey(), t.getValue());
             }
-            for (OsmPrimitive osm : ds.getSelected()) {
+            for (OsmPrimitive osm : primitives) {
                 if (r == calculated && osm instanceof Way)
                     continue;
@@ -432,5 +433,8 @@
                     MainApplication.getLayerManager().getEditLayer(), r, members).setVisible(true));
         }
-        ds.setSelected(ds.getSelected()); // force update
+        if (!primitives.isEmpty()) {
+            DataSet ds = primitives.iterator().next().getDataSet();
+            ds.setSelected(primitives); // force update
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java	(revision 16698)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/PresetLink.java	(revision 16699)
@@ -28,12 +28,14 @@
     static final class TaggingPresetMouseAdapter extends MouseAdapter {
         private final TaggingPreset t;
+        private final Collection<OsmPrimitive> sel;
 
-        TaggingPresetMouseAdapter(TaggingPreset t) {
+        TaggingPresetMouseAdapter(TaggingPreset t, Collection<OsmPrimitive> sel) {
             this.t = t;
+            this.sel = sel;
         }
 
         @Override
         public void mouseClicked(MouseEvent e) {
-            t.actionPerformed(null);
+            t.showAndApply(sel);
         }
     }
@@ -58,5 +60,5 @@
             TaggingPreset t = found.get();
             JLabel lbl = new TaggingPresetLabel(t);
-            lbl.addMouseListener(new TaggingPresetMouseAdapter(t));
+            lbl.addMouseListener(new TaggingPresetMouseAdapter(t, sel));
             p.add(lbl, GBC.eol().fill(GBC.HORIZONTAL));
         }
