Index: src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java	(revision 18258)
+++ src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetItemGuiSupport.java	(working copy)
@@ -84,7 +84,10 @@
     }
 
     /**
-     * Returns true if all selected primitives matched this preset (before opening the dialog)
+     * Returns true if all selected primitives matched this preset (before opening the dialog).
+     * <p>
+     * This usually means that the preset dialog was opened from the Tags / Memberships panel as
+     * opposed to being opened by selection from the menu or toolbar or the search.
      *
      * @return true if the preset initially matched
      */
Index: src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(revision 18258)
+++ src/org/openstreetmap/josm/gui/tagging/presets/items/Combo.java	(working copy)
@@ -153,15 +153,14 @@
             p.add(combobox, GBC.eol().fill(GBC.HORIZONTAL)); // NOSONAR
         }
 
-        String valueToSelect = getInitialValue(usage);
-        if (valueToSelect != null) {
-            PresetListEntry selItem = find(valueToSelect);
-            if (selItem != null) {
-                combobox.setSelectedItem(selItem);
-            } else {
-                combobox.setText(valueToSelect);
-            }
+        String initialValue = getInitialValue(usage, support);
+        PresetListEntry selItem = find(initialValue);
+        if (selItem != null) {
+            combobox.setSelectedItem(selItem);
+        } else {
+            combobox.setText(initialValue);
         }
+
         combobox.addActionListener(l -> support.fireItemValueModified(this, key, getSelectedItem().value));
         combobox.addComponentListener(new ComponentListener());
 
Index: src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(revision 18258)
+++ src/org/openstreetmap/josm/gui/tagging/presets/items/ComboMultiSelect.java	(working copy)
@@ -22,6 +22,7 @@
 import javax.swing.ListCellRenderer;
 
 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.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.gui.widgets.JosmListCellRenderer;
@@ -93,7 +94,7 @@
     /** Helps avoid duplicate list entries */
     protected final Map<String, PresetListEntry> seenValues = new TreeMap<>();
     protected Usage usage;
-    /** Used to see if the user edited the value. May be null. */
+    /** Used to see if the user edited the value. */
     protected String originalValue;
 
     /**
@@ -317,14 +318,20 @@
     /**
      * Returns the initial value to use for this preset.
      * <p>
-     * The initial value is the value shown in the control when the preset dialogs opens.
+     * The initial value is the value shown in the control when the preset dialog opens. For a
+     * discussion of all the options see the enclosed tickets.
      *
      * @param usage The key Usage
+     * @param support The support
      * @return The initial value to use.
+     *
+     * @see "https://josm.openstreetmap.de/ticket/5564"
+     * @see "https://josm.openstreetmap.de/ticket/12733"
+     * @see "https://josm.openstreetmap.de/ticket/17324"
      */
-    protected String getInitialValue(Usage usage) {
+    protected String getInitialValue(Usage usage, TaggingPresetItemGuiSupport support) {
         String initialValue = null;
-        originalValue = null;
+        originalValue = "";
 
         if (usage.hasUniqueValue()) {
             // all selected primitives have the same not empty value for this key
@@ -334,18 +341,15 @@
             // at least one primitive has a value for this key (but not all have the same one)
             initialValue = DIFFERENT;
             originalValue = initialValue;
-        } else if (PROP_FILL_DEFAULT.get() || isForceUseLastAsDefault()) {
+        } else if (!usage.hadKeys() || isForceUseLastAsDefault() || PROP_FILL_DEFAULT.get()) {
             // at this point no primitive had any value for this key
-            // use the last value no matter what
-            initialValue = LAST_VALUES.get(key);
-        } else if (!usage.hadKeys() && isUseLastAsDefault()) {
-            // use the last value only on objects with no keys at all
-            initialValue = LAST_VALUES.get(key);
-        } else if (!usage.hadKeys()) {
-            // use the default only on objects with no keys at all
-            initialValue = default_;
+            if (!support.isPresetInitiallyMatches() && isUseLastAsDefault() && LAST_VALUES.containsKey(key)) {
+                initialValue = LAST_VALUES.get(key);
+            } else {
+                initialValue = default_;
+            }
         }
-        return initialValue;
+        return initialValue != null ? initialValue : "";
     }
 
     @Override
@@ -353,8 +357,6 @@
         String value = getSelectedItem().value;
 
         // no change if same as before
-        if (value.isEmpty() && originalValue == null)
-            return;
         if (value.equals(originalValue))
             return;
         changedTags.add(new Tag(key, value));
Index: src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java
===================================================================
--- src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java	(revision 18258)
+++ src/org/openstreetmap/josm/gui/tagging/presets/items/MultiSelect.java	(working copy)
@@ -48,7 +48,7 @@
         model.clear();
         // disable if the selected primitives have different values
         list.setEnabled(usage.hasUniqueValue() || usage.unused());
-        String initialValue = getInitialValue(usage);
+        String initialValue = getInitialValue(usage, support);
 
         // Add values from the preset.
         presetListEntries.forEach(this::addEntry);
@@ -61,7 +61,7 @@
         }
 
         // Select the values in the initial value.
-        if (initialValue != null && !DIFFERENT.equals(initialValue)) {
+        if (!initialValue.isEmpty() && !DIFFERENT.equals(initialValue)) {
             for (String value : initialValue.split(String.valueOf(delimiter), -1)) {
                 PresetListEntry e = new PresetListEntry(value, this);
                 addEntry(e);
Index: test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java	(revision 18258)
+++ test/unit/org/openstreetmap/josm/gui/tagging/presets/items/ComboTest.java	(working copy)
@@ -27,7 +27,7 @@
      */
     @RegisterExtension
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().main().i18n("de");
+    public JOSMTestRules test = new JOSMTestRules().preferences().main().i18n("de");
 
     /**
      * Unit test for {@link Combo#addToPanel}.
@@ -54,8 +54,9 @@
         OsmPrimitive waySI = OsmUtils.createPrimitive("way addr:country=SI");
         KeyedItem.LAST_VALUES.clear();
         KeyedItem.LAST_VALUES.put("addr:country", "AT");
+        Combo.PROP_FILL_DEFAULT.put(false);
+        combo.use_last_as_default = 0;
 
-        combo.use_last_as_default = 0;
         combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, way));
         assertEquals("", combo.getSelectedItem().value);
         combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, wayTagged));
@@ -78,6 +79,19 @@
         assertEquals("SI", combo.getSelectedItem().value);
         combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, wayAT, waySI));
         assertEquals(Combo.DIFFERENT, combo.getSelectedItem().value);
+
+        Combo.PROP_FILL_DEFAULT.put(true);
+        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, way));
+        assertEquals("AT", combo.getSelectedItem().value);
+        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, wayTagged));
+        assertEquals("AT", combo.getSelectedItem().value);
+        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, wayAT));
+        assertEquals("AT", combo.getSelectedItem().value);
+        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, waySI));
+        assertEquals("SI", combo.getSelectedItem().value);
+        combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, wayAT, waySI));
+        assertEquals(Combo.DIFFERENT, combo.getSelectedItem().value);
+        Combo.PROP_FILL_DEFAULT.put(false);
         combo.default_ = null;
 
         combo.use_last_as_default = 1; // untagged objects only
@@ -103,6 +117,7 @@
         assertEquals("SI", combo.getSelectedItem().value);
         combo.addToPanel(new JPanel(), TaggingPresetItemGuiSupport.create(false, wayAT, waySI));
         assertEquals(Combo.DIFFERENT, combo.getSelectedItem().value);
+        combo.use_last_as_default = 0;
 
         KeyedItem.LAST_VALUES.clear();
     }
