Index: /trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/AbstractExtendedSourceEntryTestCase.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/AbstractExtendedSourceEntryTestCase.java	(revision 15098)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/AbstractExtendedSourceEntryTestCase.java	(revision 15098)
@@ -0,0 +1,63 @@
+// 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<>();
+
+    /** Entry to test */
+    protected final ExtendedSourceEntry source;
+    protected final List<String> ignoredErrors = new ArrayList<>();
+
+    protected AbstractExtendedSourceEntryTestCase(ExtendedSourceEntry source) {
+        this.source = source;
+    }
+
+    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(Exception e, Set<String> errors) {
+        e.printStackTrace();
+        String s = source.url + " => " + e.toString();
+        if (isIgnoredSubstring(s)) {
+            ignoredErrors.add(s);
+        } else {
+            errors.add(s);
+        }
+    }
+
+    protected static boolean isIgnoredSubstring(String substring) {
+        return errorsToIgnore.parallelStream().anyMatch(x -> substring.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 15097)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/MapPaintPreferenceTestIT.java	(revision 15098)
@@ -8,5 +8,4 @@
 import java.util.ArrayList;
 import java.util.List;
-import java.util.stream.Collectors;
 
 import org.junit.BeforeClass;
@@ -35,5 +34,5 @@
  */
 @RunWith(ParallelParameterized.class)
-public class MapPaintPreferenceTestIT {
+public class MapPaintPreferenceTestIT extends AbstractExtendedSourceEntryTestCase {
 
     /**
@@ -43,9 +42,4 @@
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public static JOSMTestRules test = new JOSMTestRules().https().timeout(15000*60).parameters();
-
-    /** Entry to test */
-    private final ExtendedSourceEntry source;
-    private final List<String> ignoredErrors = new ArrayList<>();
-    private static final List<String> errorsToIgnore = new ArrayList<>();
 
     /**
@@ -66,6 +60,5 @@
     public static List<Object[]> data() throws Exception {
         ImageProvider.clearCache();
-        return new MapPaintPreference.MapPaintSourceEditor().loadAndGetAvailableSources().stream()
-                .map(x -> new Object[] {x.getDisplayName(), x.url, x}).collect(Collectors.toList());
+        return getTestParameters(new MapPaintPreference.MapPaintSourceEditor().loadAndGetAvailableSources());
     }
 
@@ -77,5 +70,5 @@
      */
     public MapPaintPreferenceTestIT(String displayName, String url, ExtendedSourceEntry source) {
-        this.source = source;
+        super(source);
     }
 
@@ -116,7 +109,3 @@
         assumeTrue(ignoredErrors.toString(), ignoredErrors.isEmpty());
     }
-
-    private static boolean isIgnoredSubstring(String substring) {
-        return errorsToIgnore.parallelStream().anyMatch(x -> substring.contains(x));
-    }
 }
Index: /trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java	(revision 15097)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreferenceTestIT.java	(revision 15098)
@@ -7,5 +7,4 @@
 
 import java.io.IOException;
-import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashSet;
@@ -17,5 +16,4 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
-import java.util.stream.Collectors;
 
 import org.junit.BeforeClass;
@@ -41,5 +39,5 @@
  */
 @RunWith(Parameterized.class)
-public class TaggingPresetPreferenceTestIT {
+public class TaggingPresetPreferenceTestIT extends AbstractExtendedSourceEntryTestCase {
 
     /**
@@ -49,9 +47,4 @@
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
     public static JOSMTestRules test = new JOSMTestRules().https().timeout(10000*60).parameters();
-
-    /** Entry to test */
-    private final ExtendedSourceEntry source;
-    private final List<String> ignoredErrors = new ArrayList<>();
-    private static final List<String> errorsToIgnore = new ArrayList<>();
 
     /**
@@ -77,6 +70,5 @@
     public static List<Object[]> data() throws Exception {
         ImageProvider.clearCache();
-        return new TaggingPresetPreference.TaggingPresetSourceEditor().loadAndGetAvailableSources().stream()
-                .map(x -> new Object[] {x.getDisplayName(), x.url, x}).collect(Collectors.toList());
+        return getTestParameters(new TaggingPresetPreference.TaggingPresetSourceEditor().loadAndGetAvailableSources());
     }
 
@@ -88,5 +80,5 @@
      */
     public TaggingPresetPreferenceTestIT(String displayName, String url, ExtendedSourceEntry source) {
-        this.source = source;
+        super(source);
     }
 
@@ -113,14 +105,4 @@
         assertTrue(errors.toString(), errors.isEmpty());
         assumeTrue(ignoredErrors.toString(), ignoredErrors.isEmpty());
-    }
-
-    private void handleException(Exception e, Set<String> errors) {
-        e.printStackTrace();
-        String s = source.url + " => " + e.toString();
-        if (isIgnoredSubstring(s)) {
-            ignoredErrors.add(s);
-        } else {
-            errors.add(s);
-        }
     }
 
@@ -152,7 +134,3 @@
         }
     }
-
-    private static boolean isIgnoredSubstring(String substring) {
-        return errorsToIgnore.parallelStream().anyMatch(x -> substring.contains(x));
-    }
 }
