Index: trunk/src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java	(revision 16295)
+++ trunk/src/org/openstreetmap/josm/data/preferences/sources/ValidatorPrefHelper.java	(revision 16296)
@@ -47,4 +47,7 @@
     /** The preferences key for the ignorelist */
     public static final String PREF_IGNORELIST = PREFIX + ".ignorelist";
+
+    /** The preferences key for the ignorelist format */
+    public static final String PREF_IGNORELIST_FORMAT = PREF_IGNORELIST + ".version";
 
     /**
Index: trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 16295)
+++ trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 16296)
@@ -19,8 +19,10 @@
 import java.util.Enumeration;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
+import java.util.Set;
 import java.util.SortedMap;
 import java.util.TreeMap;
@@ -224,4 +226,5 @@
                         treeSet.addAll(Files.readAllLines(path, StandardCharsets.UTF_8));
                         treeSet.forEach(ignore -> ignoredErrors.putIfAbsent(ignore, ""));
+                        removeLegacyEntries(true);
 
                         saveIgnoredErrors();
@@ -237,6 +240,31 @@
                 Logging.log(Logging.LEVEL_ERROR, "Unable to load ignored errors", e);
             }
-            // see #19053: remove invalid entry
-            ignoredErrors.remove("3000");
+            removeLegacyEntries(Config.getPref().get(ValidatorPrefHelper.PREF_IGNORELIST_FORMAT).isEmpty());
+        }
+    }
+
+    private static void removeLegacyEntries(boolean force) {
+        // see #19053:
+        boolean wasChanged = false;
+        if (force) {
+            Iterator<Entry<String, String>> iter = ignoredErrors.entrySet().iterator();
+            while (iter.hasNext()) {
+                Entry<String, String> entry = iter.next();
+                if (entry.getKey().startsWith("3000_")) {
+                    Logging.warn(tr("Cannot handle ignore list entry {0}", entry));
+                    iter.remove();
+                    wasChanged = true;
+                }
+            }
+        }
+        String legacyEntry = ignoredErrors.remove("3000");
+        if (legacyEntry != null) {
+            if (!legacyEntry.isEmpty()) {
+                addIgnoredError("3000_" + legacyEntry, legacyEntry);
+            }
+            wasChanged = true;
+        }
+        if (wasChanged) {
+            saveIgnoredErrors();
         }
     }
@@ -268,4 +296,5 @@
      */
     static void cleanupIgnoredErrors() {
+        cleanup3000();
         if (ignoredErrors.size() > 1) {
             List<String> toRemove = new ArrayList<>();
@@ -289,4 +318,16 @@
             ignoredErrors.putAll(tmap);
         }
+    }
+
+    private static void cleanup3000() {
+        // see #19053
+        Set<String> toRemove = new HashSet<>();
+        for (Entry<String, String> entry : ignoredErrors.entrySet()) {
+            if (entry.getKey().equals("3000_" + entry.getValue()))
+                toRemove.add(entry.getValue());
+        }
+        ignoredErrors.entrySet()
+                .removeIf(e -> toRemove.contains(e.getValue()) && !e.getKey().equals("3000_" + e.getValue()));
+
     }
 
@@ -485,4 +526,5 @@
         if (list.isEmpty()) list = null;
         Config.getPref().putListOfMaps(ValidatorPrefHelper.PREF_IGNORELIST, list);
+        Config.getPref().put(ValidatorPrefHelper.PREF_IGNORELIST_FORMAT, "2");
     }
 
Index: trunk/src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 16295)
+++ trunk/src/org/openstreetmap/josm/data/validation/TestError.java	(revision 16296)
@@ -339,4 +339,8 @@
      */
     public String getIgnoreSubGroup() {
+        if (code == 3000) {
+            // see #19053
+            return "3000_" + (description == null ? message : description);
+        }
         String ignorestring = getIgnoreGroup();
         if (descriptionEn != null) {
@@ -352,4 +356,8 @@
      */
     public String getIgnoreGroup() {
+        if (code == 3000) {
+            // see #19053
+            return "3000_" + getMessage();
+        }
         return Integer.toString(code);
     }
@@ -525,3 +533,4 @@
         return "TestError [tester=" + tester + ", code=" + code + ", message=" + message + ']';
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 16295)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 16296)
@@ -411,7 +411,5 @@
         lastSelectedNode = node;
         if (node != null) {
-            final Set<String> codes = new HashSet<>();
             ValidatorTreePanel.visitTestErrors(node, error -> {
-                codes.add(error.getIgnoreSubGroup()); // see #19053
                 error.setSelected(true);
 
@@ -425,5 +423,5 @@
             selectAction.setEnabled(true);
             if (ignoreAction != null) {
-                ignoreAction.setEnabled(!(node.getUserObject() instanceof Severity) && codes.size() <= 1);
+                ignoreAction.setEnabled(!(node.getUserObject() instanceof Severity));
             }
         }
