Index: trunk/test/unit/org/openstreetmap/josm/gui/preferences/AbstractExtendedSourceEntryTestCase.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/preferences/AbstractExtendedSourceEntryTestCase.java	(revision 17531)
+++ trunk/test/unit/org/openstreetmap/josm/gui/preferences/AbstractExtendedSourceEntryTestCase.java	(revision 17531)
@@ -0,0 +1,58 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import java.util.stream.Collectors;
+
+import org.openstreetmap.josm.data.preferences.sources.ExtendedSourceEntry;
+
+/**
+ * Super class of parameterized source entry integration tests.
+ */
+public abstract class AbstractExtendedSourceEntryTestCase {
+
+    private static final Pattern RESOURCE_PATTERN = Pattern.compile("resource://(.+)");
+    private static final Pattern JOSM_WIKI_PATTERN = Pattern.compile("https://josm.openstreetmap.de/josmfile\\?page=(.+)&zip=1");
+    private static final Pattern GITHUB_PATTERN = Pattern.compile("https://raw.githubusercontent.com/([^/]+)/([^/]+)/([^/]+)/(.+)");
+
+    protected static final List<String> errorsToIgnore = new ArrayList<>();
+
+    protected static List<Object[]> getTestParameters(Collection<ExtendedSourceEntry> entries) throws Exception {
+        return entries.stream().map(x -> new Object[] {x.getDisplayName(), cleanUrl(x.url), x}).collect(Collectors.toList());
+    }
+
+    private static String cleanUrl(String url) {
+        Matcher wiki = JOSM_WIKI_PATTERN.matcher(url);
+        if (wiki.matches()) {
+            return "https://josm.openstreetmap.de/wiki/" + wiki.group(1);
+        }
+        Matcher github = GITHUB_PATTERN.matcher(url);
+        if (github.matches()) {
+            return String.format("https://github.com/%s/%s/blob/%s/%s", github.group(1), github.group(2), github.group(3), github.group(4));
+        }
+        Matcher resource = RESOURCE_PATTERN.matcher(url);
+        if (resource.matches()) {
+            return "https://josm.openstreetmap.de/browser/trunk/" + resource.group(1);
+        }
+        return url;
+    }
+
+    protected final void handleException(ExtendedSourceEntry source, Throwable e, Set<String> errors, List<String> ignoredErrors) {
+        e.printStackTrace();
+        String s = source.url + " => " + e.toString();
+        if (isIgnoredSubstring(source, s)) {
+            ignoredErrors.add(s);
+        } else {
+            errors.add(s);
+        }
+    }
+
+    protected boolean isIgnoredSubstring(ExtendedSourceEntry source, String substring) {
+        return errorsToIgnore.parallelStream().anyMatch(x -> substring.contains(x) || source.url.contains(x));
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/AbstractExtendedSourceEntryTestCase.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/AbstractExtendedSourceEntryTestCase.java	(revision 17527)
+++ 	(revision )
@@ -1,55 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.preferences.map;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.List;
-import java.util.Set;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-
-import org.openstreetmap.josm.data.preferences.sources.ExtendedSourceEntry;
-
-abstract class AbstractExtendedSourceEntryTestCase {
-
-    private static final Pattern RESOURCE_PATTERN = Pattern.compile("resource://(.+)");
-    private static final Pattern JOSM_WIKI_PATTERN = Pattern.compile("https://josm.openstreetmap.de/josmfile\\?page=(.+)&zip=1");
-    private static final Pattern GITHUB_PATTERN = Pattern.compile("https://raw.githubusercontent.com/([^/]+)/([^/]+)/([^/]+)/(.+)");
-
-    protected static final List<String> errorsToIgnore = new ArrayList<>();
-
-    protected static List<Object[]> getTestParameters(Collection<ExtendedSourceEntry> entries) throws Exception {
-        return entries.stream().map(x -> new Object[] {x.getDisplayName(), cleanUrl(x.url), x}).collect(Collectors.toList());
-    }
-
-    private static String cleanUrl(String url) {
-        Matcher wiki = JOSM_WIKI_PATTERN.matcher(url);
-        if (wiki.matches()) {
-            return "https://josm.openstreetmap.de/wiki/" + wiki.group(1);
-        }
-        Matcher github = GITHUB_PATTERN.matcher(url);
-        if (github.matches()) {
-            return String.format("https://github.com/%s/%s/blob/%s/%s", github.group(1), github.group(2), github.group(3), github.group(4));
-        }
-        Matcher resource = RESOURCE_PATTERN.matcher(url);
-        if (resource.matches()) {
-            return "https://josm.openstreetmap.de/browser/trunk/" + resource.group(1);
-        }
-        return url;
-    }
-
-    protected final void handleException(ExtendedSourceEntry source, Exception e, Set<String> errors, List<String> ignoredErrors) {
-        e.printStackTrace();
-        String s = source.url + " => " + e.toString();
-        if (isIgnoredSubstring(source, s)) {
-            ignoredErrors.add(s);
-        } else {
-            errors.add(s);
-        }
-    }
-
-    protected boolean isIgnoredSubstring(ExtendedSourceEntry source, String substring) {
-        return errorsToIgnore.parallelStream().anyMatch(x -> substring.contains(x) || source.url.contains(x));
-    }
-}
Index: trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java	(revision 17527)
+++ trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java	(revision 17531)
@@ -22,4 +22,5 @@
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction.AssignmentInstruction;
+import org.openstreetmap.josm.gui.preferences.AbstractExtendedSourceEntryTestCase;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
Index: trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java	(revision 17527)
+++ trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java	(revision 17531)
@@ -18,8 +18,11 @@
 import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.extension.RegisterExtension;
+import org.junit.jupiter.api.parallel.Execution;
+import org.junit.jupiter.api.parallel.ExecutionMode;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.preferences.sources.ExtendedSourceEntry;
+import org.openstreetmap.josm.gui.preferences.AbstractExtendedSourceEntryTestCase;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
@@ -79,4 +82,5 @@
      * @throws Exception in case of error
      */
+    @Execution(ExecutionMode.CONCURRENT)
     @ParameterizedTest(name = "{0} - {1}")
     @MethodSource("data")
Index: trunk/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTestIT.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTestIT.java	(revision 17527)
+++ trunk/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTestIT.java	(revision 17531)
@@ -2,4 +2,6 @@
 package org.openstreetmap.josm.gui.preferences.validator;
 
+import static org.junit.Assume.assumeFalse;
+import static org.junit.Assume.assumeTrue;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
@@ -7,11 +9,19 @@
 import java.io.IOException;
 import java.util.ArrayList;
-import java.util.Collection;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
 
-import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.extension.RegisterExtension;
+import org.junit.jupiter.api.parallel.Execution;
+import org.junit.jupiter.api.parallel.ExecutionMode;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.MethodSource;
+import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.preferences.sources.ExtendedSourceEntry;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.ParseResult;
+import org.openstreetmap.josm.gui.preferences.AbstractExtendedSourceEntryTestCase;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
@@ -21,5 +31,5 @@
  * Integration tests of {@link ValidatorTagCheckerRulesPreference} class.
  */
-class ValidatorTagCheckerRulesPreferenceTestIT {
+class ValidatorTagCheckerRulesPreferenceTestIT extends AbstractExtendedSourceEntryTestCase {
 
     /**
@@ -28,31 +38,56 @@
     @RegisterExtension
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().https().timeout(20_000);
+    static JOSMTestRules test = new JOSMTestRules().https().timeout(20_000);
 
     /**
-     * Test that available tag checker rules are valid.
+     * Setup test
+     * @throws IOException in case of I/O error
+     */
+    @BeforeAll
+    public static void beforeClass() throws IOException {
+        errorsToIgnore.addAll(TestUtils.getIgnoredErrorMessages(ValidatorTagCheckerRulesPreferenceTestIT.class));
+    }
+
+    /**
+     * Returns list of entries to test.
+     * @return list of entries to test
      * @throws Exception in case of error
      */
-    @Test
-    void testValidityOfAvailableRules() throws Exception {
-        Collection<ExtendedSourceEntry> sources = new ValidatorTagCheckerRulesPreference.TagCheckerRulesSourceEditor()
-                .loadAndGetAvailableSources();
-        assertFalse(sources.isEmpty(), sources::toString);
-        Collection<Throwable> allErrors = new ArrayList<>();
-        MapCSSTagChecker tagChecker = new MapCSSTagChecker();
-        for (ExtendedSourceEntry source : sources) {
-            System.out.print(source.url);
-            try {
-                ParseResult result = tagChecker.addMapCSS(source.url);
-                assertFalse(result.parseChecks.isEmpty(), result::toString);
-                System.out.println(result.parseErrors.isEmpty() ? " => OK" : " => KO");
-                allErrors.addAll(result.parseErrors);
-            } catch (IOException e) {
-                System.out.println(" => KO");
-                allErrors.add(e);
-                e.printStackTrace();
-            }
+    public static List<Object[]> data() throws Exception {
+        return getTestParameters(new ValidatorTagCheckerRulesPreference.TagCheckerRulesSourceEditor()
+                .loadAndGetAvailableSources());
+    }
+
+    /**
+     * Test that available tag checker rule is valid.
+     * @param displayName displayed name
+     * @param url URL
+     * @param source source entry to test
+     * @throws Exception in case of error
+     */
+    @Execution(ExecutionMode.CONCURRENT)
+    @ParameterizedTest(name = "{0} - {1}")
+    @MethodSource("data")
+    void testValidityOfAvailableRule(String displayName, String url, ExtendedSourceEntry source) throws Exception {
+        assumeFalse(isIgnoredSubstring(source, source.url));
+        List<String> ignoredErrors = new ArrayList<>();
+        Set<String> errors = new HashSet<>();
+        System.out.print(source.url);
+        try {
+            ParseResult result = new MapCSSTagChecker().addMapCSS(source.url);
+            assertFalse(result.parseChecks.isEmpty(), result::toString);
+            System.out.println(result.parseErrors.isEmpty() ? " => OK" : " => KO");
+            result.parseErrors.forEach(e -> handleException(source, e, errors, ignoredErrors));
+        } catch (IOException e) {
+            System.out.println(" => KO");
+            e.printStackTrace();
+            handleException(source, e, errors, ignoredErrors);
         }
-        assertTrue(allErrors.isEmpty(), allErrors::toString);
+        // #16567 - Shouldn't be necessary to print displayName if Ant worked properly
+        // See https://josm.openstreetmap.de/ticket/16567#comment:53
+        // See https://bz.apache.org/bugzilla/show_bug.cgi?id=64564
+        // See https://github.com/apache/ant/pull/121
+        assertTrue(errors.isEmpty(), displayName + " => " + errors);
+        assumeTrue(ignoredErrors.toString(), ignoredErrors.isEmpty());
     }
 }
