Index: src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/TestError.java	(revision 17234)
+++ src/org/openstreetmap/josm/data/validation/TestError.java	(working copy)
@@ -10,6 +10,7 @@
 import java.util.Collections;
 import java.util.List;
 import java.util.Locale;
+import java.util.Set;
 import java.util.TreeSet;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -23,10 +24,13 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
 import org.openstreetmap.josm.data.validation.util.MultipleNameVisitor;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.I18n;
+import org.openstreetmap.josm.tools.Logging;
 
 /**
  * Validation error
@@ -544,4 +548,37 @@
         return "TestError [tester=" + tester + ", code=" + code + ", message=" + message + ']';
     }
 
+    /**
+     * Test if the primitives still show the same error. Maybe data was already changed. See #19956
+     * @return updated test or null if error cannot be reproduced.
+     * @since xxx
+     */
+    public TestError doubleCheck() {
+        // see #19956 check again
+        if (getTester() instanceof MapCSSTagChecker)
+            return this;
+        Test tester2;
+        try {
+            tester2 = getTester().getClass().newInstance();
+            Set<OsmPrimitive> toFix = primitives.stream()
+                    .filter(tester2::isPrimitiveUsable)
+                    .collect(Collectors.toSet());
+            if (toFix.isEmpty())
+                return null;
+
+            tester2.startTest(NullProgressMonitor.INSTANCE);
+            tester2.visit(toFix);
+            tester2.endTest();
+            for (TestError e : tester2.getErrors()) {
+                if (e.getCode() == this.getCode()) {
+                    return e;
+                }
+            }
+        } catch (InstantiationException | IllegalAccessException e1) {
+            Logging.error(e1);
+        }
+        return null;
+
+    }
+
 }
Index: src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 17234)
+++ src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(working copy)
@@ -627,10 +627,13 @@
         protected void fixError(TestError error) throws InterruptedException, InvocationTargetException {
             if (error.isFixable()) {
                 if (error.getPrimitives().stream().noneMatch(p -> p.isDeleted() || p.getDataSet() == null)) {
-                    final Command fixCommand = error.getFix();
-                    if (fixCommand != null) {
-                        SwingUtilities.invokeAndWait(fixCommand::executeCommand);
-                        fixCommands.add(fixCommand);
+                    TestError checked = error.doubleCheck();
+                    if (checked != null) {
+                        final Command fixCommand = checked.getFix();
+                        if (fixCommand != null) {
+                            SwingUtilities.invokeAndWait(fixCommand::executeCommand);
+                            fixCommands.add(fixCommand);
+                        }
                     }
                 }
                 // It is wanted to ignore an error if it said fixable, even if fixCommand was null
