diff --git a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
index 1931138b4c..841902e701 100644
--- a/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
+++ b/src/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModel.java
@@ -444,11 +444,29 @@ implements TableModelListener, DataSelectionListener, DataSetListener, OsmPrimit
 
     void addMembersAtIndexKeepingOldSelection(final Iterable<RelationMember> newMembers, final int index) {
         int idx = index;
+        // Avoid having the inserted rows from being part of the selection. See JOSM #21889.
+        int[] originalSelection = null;
+        if (selectedIndices().anyMatch(selectedRow -> selectedRow == index)) {
+            originalSelection = selectedIndices().toArray();
+        }
         for (RelationMember member : newMembers) {
             members.add(idx++, member);
         }
         invalidateConnectionType();
         fireTableRowsInserted(index, idx - 1);
+        if (originalSelection != null) {
+            final DefaultListSelectionModel model = this.getSelectionModel();
+            model.setValueIsAdjusting(true);
+            model.clearSelection();
+            for (int row : originalSelection) {
+                if (row < index) {
+                    model.addSelectionInterval(row, row);
+                } else {
+                    model.addSelectionInterval(row + idx - index, row + idx - index);
+                }
+            }
+            model.setValueIsAdjusting(false);
+        }
     }
 
     public void addMembersAtBeginning(List<? extends OsmPrimitive> primitives) {
