diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
index 96dd026..36df02c 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
@@ -274,12 +274,15 @@ public class TaggingPreset extends AbstractAction implements MapView.LayerChange
         return null;
     }
 
+    static boolean presetInitiallyMatches = false;
+
     @Override
     public void actionPerformed(ActionEvent e) {
         if (Main.main == null) return;
         if (Main.main.getCurrentDataSet() == null) return;
 
         Collection<OsmPrimitive> sel = createSelection(Main.main.getCurrentDataSet().getSelected());
+        presetInitiallyMatches = !sel.isEmpty() && Utils.forAll(sel, this);
         int answer = showDialog(sel, supportsRelation());
 
         if (!sel.isEmpty() && answer == DIALOG_ANSWER_APPLY) {
diff --git a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
index da1b136..852da09 100644
--- a/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
+++ b/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
@@ -596,7 +596,7 @@ public final class TaggingPresetItems {
                 }
                 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 (!"false".equals(use_last_as_default) && lastValue.containsKey(key)) {
+                    if (!"false".equals(use_last_as_default) && lastValue.containsKey(key) && !TaggingPreset.presetInitiallyMatches) {
                         textField.setText(lastValue.get(key));
                     } else {
                         textField.setText(default_);
@@ -1226,7 +1226,7 @@ public final class TaggingPresetItems {
             } else if (usage.unused()) {
                 // all items were unset (and so is default)
                 originalValue = lhm.get("");
-                if ("force".equals(use_last_as_default) && lastValue.containsKey(key)) {
+                if ("force".equals(use_last_as_default) && lastValue.containsKey(key) && !TaggingPreset.presetInitiallyMatches) {
                     combo.setSelectedItem(lhm.get(lastValue.get(key)));
                 } else {
                     combo.setSelectedItem(originalValue);
diff --git a/src/org/openstreetmap/josm/tools/Utils.java b/src/org/openstreetmap/josm/tools/Utils.java
index 67f5ae4..3307859 100644
--- a/src/org/openstreetmap/josm/tools/Utils.java
+++ b/src/org/openstreetmap/josm/tools/Utils.java
@@ -64,6 +64,9 @@ public final class Utils {
      */
     public static final Charset UTF_8 = Charset.forName("UTF-8");
 
+    /**
+     * Tests whether {@code predicate} applies to at least one elements from {@code collection}.
+     */
     public static <T> boolean exists(Iterable<? extends T> collection, Predicate<? super T> predicate) {
         for (T item : collection) {
             if (predicate.evaluate(item))
@@ -72,6 +75,13 @@ public final class Utils {
         return false;
     }
 
+    /**
+     * Tests whether {@code predicate} applies to all elements from {@code collection}.
+     */
+    public static <T> boolean forAll(Iterable<? extends T> collection, Predicate<? super T> predicate) {
+        return !exists(collection, Predicates.not(predicate));
+    }
+
     public static <T> boolean exists(Iterable<T> collection, Class<? extends T> klass) {
         for (Object item : collection) {
             if (klass.isInstance(item))
