Index: src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 16252)
+++ src/org/openstreetmap/josm/data/validation/OsmValidator.java	(working copy)
@@ -234,8 +234,22 @@
             } catch (SecurityException e) {
                 Logging.log(Logging.LEVEL_ERROR, "Unable to load ignored errors", e);
             }
-            // see #19053: remove invalid entry
-            ignoredErrors.remove("3000");
+
+            // see #19053: remove unusable entries created by older releases
+            boolean removedEntries = false;
+            Iterator<Entry<String, String>> iter = ignoredErrors.entrySet().iterator();
+            while (iter.hasNext()) {
+                Entry<String, String> entry = iter.next();
+                if ("3000".equals(entry.getKey()) || entry.getKey().startsWith("3000_")) {
+                    Logging.warn(tr("Cannot handle ignore list entry {0}"), entry);
+                    iter.remove();
+                    removedEntries = true;
+                }
+            }
+            if (removedEntries) {
+                saveIgnoredErrors();
+            }
+
         }
     }
 
@@ -426,7 +440,7 @@
                 }
                 if (tr("Ignore list").equals(description))
                     description = "";
-                if (!key.matches("^[0-9]+(_.*|$)")) {
+                if (!key.matches("^[0-9]+(:.*|$)")) {
                     description = key;
                     key = "";
                 }
@@ -439,7 +453,7 @@
                 } else if (item.matches("^(r|w|n)_.*")) {
                     // single element
                     entry = key + ":" + item;
-                } else if (item.matches("^[0-9]+(_.*|)$")) {
+                } else if (item.matches("^[0-9]+(:.*|)$")) {
                     // no element ids
                     entry = item;
                 }
Index: src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/TestError.java	(revision 16252)
+++ src/org/openstreetmap/josm/data/validation/TestError.java	(working copy)
@@ -21,6 +21,7 @@
 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.tools.AlphanumComparator;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
@@ -351,6 +352,10 @@
      * @see TestError#getIgnoreSubGroup()
      */
     public String getIgnoreGroup() {
+        if (code == MapCSSTagChecker.MAPCSS_CODE) {
+            // see #19053: add most descriptive text to key
+            return MapCSSTagChecker.MAPCSS_CODE + ":" + (description == null ? message : description);
+        }
         return Integer.toString(code);
     }
 
Index: src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 16252)
+++ src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(working copy)
@@ -76,6 +76,9 @@
  * @since 6506
  */
 public class MapCSSTagChecker extends Test.TagTest {
+    /** Code used for all {@link TestError} instances created by MapCSS validator rules */
+    public static final int MAPCSS_CODE = 3000;
+
     private MapCSSStyleIndex indexData;
     private final Map<MapCSSRule, MapCSSTagCheckerAndRule> ruleToCheckMap = new HashMap<>();
     private static final Map<IPrimitive, Area> mpAreaCache = new HashMap<>();
@@ -551,9 +554,8 @@
                 final String description = getDescriptionForMatchingSelector(p, matchingSelector);
                 final String description1 = group == null ? description : group;
                 final String description2 = group == null ? null : description;
-                final String selector = matchingSelector.toString();
-                TestError.Builder errorBuilder = TestError.builder(tester, getSeverity(), 3000)
-                        .messageWithManuallyTranslatedDescription(description1, description2, selector);
+                TestError.Builder errorBuilder = TestError.builder(tester, getSeverity(), MAPCSS_CODE)
+                        .messageWithManuallyTranslatedDescription(description1, description2, null);
                 if (fix != null) {
                     errorBuilder.fix(() -> fix);
                 }
@@ -562,8 +564,8 @@
                 } else if (env.children != null) {
                     for (IPrimitive c : env.children) {
                         if (c instanceof OsmPrimitive) {
-                            errorBuilder = TestError.builder(tester, getSeverity(), 3000)
-                                    .messageWithManuallyTranslatedDescription(description1, description2, selector);
+                            errorBuilder = TestError.builder(tester, getSeverity(), MAPCSS_CODE)
+                                    .messageWithManuallyTranslatedDescription(description1, description2, null);
                             if (fix != null) {
                                 errorBuilder.fix(() -> fix);
                             }
Index: src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 16252)
+++ src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(working copy)
@@ -53,6 +53,7 @@
 import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.data.validation.ValidatorVisitor;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
@@ -412,7 +413,10 @@
         if (node != null) {
             final Set<String> codes = new HashSet<>();
             ValidatorTreePanel.visitTestErrors(node, error -> {
-                codes.add(error.getIgnoreSubGroup()); // see #19053
+                if (error.getCode() == MapCSSTagChecker.MAPCSS_CODE) {
+                    // see #19053
+                    codes.add(error.getIgnoreSubGroup());
+                }
                 error.setSelected(true);
 
                 hasFixes.set(hasFixes.get() || error.isFixable());
Index: test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java	(revision 16252)
+++ test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java	(working copy)
@@ -144,7 +144,7 @@
         final Collection<TestError> errors = test.getErrorsForPrimitive(p, false);
         assertEquals(1, errors.size());
         assertEquals("has alt_name but not name", errors.iterator().next().getMessage());
-        assertEquals("3000_*[.+_name][!name]", errors.iterator().next().getIgnoreSubGroup());
+        assertEquals("3000:has alt_name but not name", errors.iterator().next().getIgnoreSubGroup());
     }
 
     /**
@@ -159,7 +159,7 @@
         final Collection<TestError> errors = test.getErrorsForPrimitive(p, false);
         assertEquals(1, errors.size());
         assertEquals("footway used with foot=no", errors.iterator().next().getMessage());
-        assertEquals("3000_way[highway=footway][foot]", errors.iterator().next().getIgnoreSubGroup());
+        assertEquals("3000:footway used with foot=no", errors.iterator().next().getIgnoreSubGroup());
     }
 
     /**
