diff --git a/src/org/openstreetmap/josm/gui/widgets/ComboBoxHistory.java b/src/org/openstreetmap/josm/gui/widgets/ComboBoxHistory.java
index e1238016a6..f7a70a7cf4 100644
--- a/src/org/openstreetmap/josm/gui/widgets/ComboBoxHistory.java
+++ b/src/org/openstreetmap/josm/gui/widgets/ComboBoxHistory.java
@@ -41,17 +41,25 @@ class ComboBoxHistory extends DefaultComboBoxModel<AutoCompletionItem> implement
     public void addElement(AutoCompletionItem o) {
         String newEntry = o.getValue();
 
+        boolean alreadyAdded = false;
         // if history contains this object already, delete it,
         // so that it looks like a move to the top
         for (int i = 0; i < getSize(); i++) {
             String oldEntry = getElementAt(i).getValue();
             if (oldEntry.equals(newEntry)) {
-                removeElementAt(i);
+                if (i == 0) {
+                    alreadyAdded = true;
+                    break;
+                } else {
+                    removeElementAt(i);
+                }
             }
         }
 
-        // insert element at the top
-        insertElementAt(o, 0);
+        if (!alreadyAdded) {
+            // insert element at the top
+            insertElementAt(o, 0);
+        }
 
         // remove an element, if the history gets too large
         if (getSize() > maxSize) {
diff --git a/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java b/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
index dc6955ece1..33de5a32ac 100644
--- a/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
+++ b/src/org/openstreetmap/josm/gui/widgets/HistoryComboBox.java
@@ -5,6 +5,7 @@ import java.util.List;
 
 import javax.swing.text.JTextComponent;
 
+import org.openstreetmap.josm.data.tagging.ac.AutoCompletionItem;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingComboBox;
 import org.openstreetmap.josm.spi.preferences.Config;
 
@@ -54,7 +55,13 @@ public class HistoryComboBox extends AutoCompletingComboBox {
      * @see ComboBoxHistory#addElement(java.lang.String)
      */
     public void addCurrentItemToHistory() {
-        model.addElement(getEditor().getItem().toString());
+        Object item = getEditor().getItem();
+        // This avoids instantiating multiple AutoCompletionItems
+        if (item instanceof AutoCompletionItem) {
+            model.addElement((AutoCompletionItem) item);
+        } else {
+            model.addElement(item.toString());
+        }
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/gui/widgets/HistoryComboBoxTest.java b/test/unit/org/openstreetmap/josm/gui/widgets/HistoryComboBoxTest.java
index 6475b5d1bd..dcdae47eb2 100644
--- a/test/unit/org/openstreetmap/josm/gui/widgets/HistoryComboBoxTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/widgets/HistoryComboBoxTest.java
@@ -44,4 +44,26 @@ class HistoryComboBoxTest {
         historyComboBox.getEditor().setItem(null);
         assertDoesNotThrow(historyComboBox::addCurrentItemToHistory);
     }
+
+    /**
+     * Non-regression test for JOSM #21215: StackOverflowError
+     */
+    @Test
+    void testNonRegression21215() {
+        final HistoryComboBox historyComboBox = new HistoryComboBox();
+        // utils plugin2 added a listener that pretty much did this
+        historyComboBox.addItemListener(event -> historyComboBox.addCurrentItemToHistory());
+        final AutoCompletionItem testItem = new AutoCompletionItem("testNonRegression21215");
+        // Add the original item
+        historyComboBox.getEditor().setItem(testItem);
+        historyComboBox.addCurrentItemToHistory();
+
+        // add a new item
+        historyComboBox.getEditor().setItem(new AutoCompletionItem("testNonRegression21215_2"));
+        historyComboBox.addCurrentItemToHistory();
+
+        // Readd the first item
+        historyComboBox.getEditor().setItem(testItem);
+        assertDoesNotThrow(historyComboBox::addCurrentItemToHistory);
+    }
 }
