Index: src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 16287)
+++ src/org/openstreetmap/josm/data/validation/OsmValidator.java	(working copy)
@@ -18,10 +18,12 @@
 import java.util.EnumMap;
 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;
 import java.util.TreeSet;
@@ -234,8 +236,15 @@
             } catch (SecurityException e) {
                 Logging.log(Logging.LEVEL_ERROR, "Unable to load ignored errors", e);
             }
-            // see #19053: remove invalid entry
-            ignoredErrors.remove("3000");
+            // see #19053:
+            String legacyEntry = ignoredErrors.remove("3000");
+            if (legacyEntry != null) {
+                if (!legacyEntry.isEmpty()) {
+                    addIgnoredError("3000_" + legacyEntry, legacyEntry);
+                }
+                saveIgnoredErrors();
+            }
+
         }
     }
 
@@ -265,6 +274,7 @@
      *  Make sure that we don't keep single entries for a "group ignore".
      */
     static void cleanupIgnoredErrors() {
+        cleanup3000();
         if (ignoredErrors.size() > 1) {
             List<String> toRemove = new ArrayList<>();
 
@@ -288,6 +298,20 @@
         }
     }
 
+    private static void cleanup3000() {
+        // see #19053
+        if (ignoredErrors.size() > 1) {
+            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()));
+
+        }
+    }
+
     private static boolean sameCode(String key1, String key2) {
         return extractCodeFromIgnoreKey(key1).equals(extractCodeFromIgnoreKey(key2));
     }
Index: src/org/openstreetmap/josm/data/validation/TestError.java
===================================================================
--- src/org/openstreetmap/josm/data/validation/TestError.java	(revision 16287)
+++ src/org/openstreetmap/josm/data/validation/TestError.java	(working copy)
@@ -338,6 +338,10 @@
      * @return The ignore sub group
      */
     public String getIgnoreSubGroup() {
+        if (code == 3000) {
+            // see #19053
+            return "3000_" + (description == null ? message : description);
+        }
         String ignorestring = getIgnoreGroup();
         if (descriptionEn != null) {
             ignorestring += '_' + descriptionEn;
@@ -351,6 +355,10 @@
      * @see TestError#getIgnoreSubGroup()
      */
     public String getIgnoreGroup() {
+        if (code == 3000) {
+            // see #19053
+            return "3000_" + getMessage();
+        }
         return Integer.toString(code);
     }
 
@@ -524,4 +532,5 @@
     public String toString() {
         return "TestError [tester=" + tester + ", code=" + code + ", message=" + message + ']';
     }
+
 }
Index: src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(revision 16287)
+++ src/org/openstreetmap/josm/gui/dialogs/ValidatorDialog.java	(working copy)
@@ -410,9 +410,7 @@
 
         lastSelectedNode = node;
         if (node != null) {
-            final Set<String> codes = new HashSet<>();
             ValidatorTreePanel.visitTestErrors(node, error -> {
-                codes.add(error.getIgnoreSubGroup()); // see #19053
                 error.setSelected(true);
 
                 hasFixes.set(hasFixes.get() || error.isFixable());
@@ -424,7 +422,7 @@
             });
             selectAction.setEnabled(true);
             if (ignoreAction != null) {
-                ignoreAction.setEnabled(!(node.getUserObject() instanceof Severity) && codes.size() <= 1);
+                ignoreAction.setEnabled(!(node.getUserObject() instanceof Severity));
             }
         }
 
Index: test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
===================================================================
--- test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java	(revision 16287)
+++ 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());
     }
 
     /**
@@ -413,4 +413,23 @@
         }
     }
 
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/19053">Bug #19053</a>.
+     * Mapcss rule with group.
+     * @throws ParseException if a parsing error occurs
+     */
+    @Test
+    public void testTicket19053() throws ParseException {
+        final MapCSSTagChecker test = buildTagChecker(
+                "*[ele][ele =~ /^-?[0-9]+\\.[0-9][0-9][0-9]+$/] {"
+                        + "throwWarning: tr(\"{0}\",\"{0.tag}\");"
+                        + "group: tr(\"Unnecessary amount of decimal places\");" + "}");
+        final OsmPrimitive p = OsmUtils.createPrimitive("node ele=12.123456");
+        final Collection<TestError> errors = test.getErrorsForPrimitive(p, false);
+        assertEquals(1, errors.size());
+        assertEquals("Unnecessary amount of decimal places", errors.iterator().next().getMessage());
+        assertEquals("3000_ele=12.123456", errors.iterator().next().getIgnoreSubGroup());
+        assertEquals("3000_Unnecessary amount of decimal places", errors.iterator().next().getIgnoreGroup());
+    }
+
 }
