Index: /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 8935)
+++ /trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 8936)
@@ -234,5 +234,26 @@
     final MultiMap<String, TagCheck> checks = new MultiMap<>();
 
-    static class TagCheck implements Predicate<OsmPrimitive> {
+    /**
+     * Result of {@link TagCheck#readMapCSS}
+     * @since 8936
+     */
+    public static class ParseResult {
+        /** Checks successfully parsed */
+        public final List<TagCheck> parseChecks;
+        /** Errors that occured during parsing */
+        public final Collection<Throwable> parseErrors;
+
+        /**
+         * Constructs a new {@code ParseResult}.
+         * @param parseChecks Checks successfully parsed
+         * @param parseErrors Errors that occured during parsing
+         */
+        public ParseResult(List<TagCheck> parseChecks, Collection<Throwable> parseErrors) {
+            this.parseChecks = parseChecks;
+            this.parseErrors = parseErrors;
+        }
+    }
+
+    public static class TagCheck implements Predicate<OsmPrimitive> {
         protected final GroupedMapCSSRule rule;
         protected final List<FixCommand> fixCommands = new ArrayList<>();
@@ -320,5 +341,5 @@
         }
 
-        static List<TagCheck> readMapCSS(Reader css) throws ParseException {
+        static ParseResult readMapCSS(Reader css) throws ParseException {
             CheckParameterUtil.ensureParameterNotNull(css, "css");
 
@@ -329,5 +350,6 @@
             final MapCSSParser parser = new MapCSSParser(css, MapCSSParser.LexicalState.DEFAULT);
             parser.sheet(source);
-            assert source.getErrors().isEmpty();
+            Collection<Throwable> parseErrors = source.getErrors();
+            assert parseErrors.isEmpty();
             // Ignore "meta" rule(s) from external rules of JOSM wiki
             removeMetaRules(source);
@@ -343,14 +365,15 @@
                 }
             }
-            List<TagCheck> result = new ArrayList<>();
+            List<TagCheck> parseChecks = new ArrayList<>();
             for (Map.Entry<Declaration, List<Selector>> map : g.entrySet()) {
                 try {
-                    result.add(TagCheck.ofMapCSSRule(
+                    parseChecks.add(TagCheck.ofMapCSSRule(
                             new GroupedMapCSSRule(map.getValue(), map.getKey())));
                 } catch (IllegalDataException e) {
                     Main.error("Cannot add MapCss rule: "+e.getMessage());
-                }
-            }
-            return result;
+                    parseErrors.add(e);
+                }
+            }
+            return new ParseResult(parseChecks, parseErrors);
         }
 
@@ -669,23 +692,26 @@
      * Adds a new MapCSS config file from the given URL.
      * @param url The unique URL of the MapCSS config file
+     * @return List of tag checks and parsing errors, or null
      * @throws ParseException if the config file does not match MapCSS syntax
      * @throws IOException if any I/O error occurs
      * @since 7275
      */
-    public synchronized void addMapCSS(String url) throws ParseException, IOException {
+    public synchronized ParseResult addMapCSS(String url) throws ParseException, IOException {
         CheckParameterUtil.ensureParameterNotNull(url, "url");
         CachedFile cache = new CachedFile(url);
         InputStream zip = cache.findZipEntryInputStream("validator.mapcss", "");
+        ParseResult result;
         try (InputStream s = zip != null ? zip : cache.getInputStream()) {
-            List<TagCheck> tagchecks = TagCheck.readMapCSS(new BufferedReader(UTFInputStreamReader.create(s)));
+            result = TagCheck.readMapCSS(new BufferedReader(UTFInputStreamReader.create(s)));
             checks.remove(url);
-            checks.putAll(url, tagchecks);
+            checks.putAll(url, result.parseChecks);
             // Check assertions, useful for development of local files
             if (Main.pref.getBoolean("validator.check_assert_local_rules", false) && Utils.isLocalUrl(url)) {
-                for (String msg : checkAsserts(tagchecks)) {
+                for (String msg : checkAsserts(result.parseChecks)) {
                     Main.warn(msg);
                 }
             }
         }
+        return result;
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 8935)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/SourceEditor.java	(revision 8936)
@@ -447,6 +447,7 @@
     /**
      * Synchronously loads available sources and returns the parsed list.
+     * @return list of available sources
      */
-    Collection<ExtendedSourceEntry> loadAndGetAvailableSources() {
+    public final Collection<ExtendedSourceEntry> loadAndGetAvailableSources() {
         try {
             final SourceLoader loader = new SourceLoader(availableSourcesUrl, sourceProviders);
@@ -466,4 +467,7 @@
     }
 
+    /**
+     * Performs the initial loading of source providers. Does nothing if already done.
+     */
     public void initiallyLoadAvailableSources() {
         if (!sourcesInitiallyLoaded) {
Index: /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java	(revision 8935)
+++ /trunk/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java	(revision 8936)
@@ -28,4 +28,5 @@
 import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.TestError;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.ParseResult;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.TagCheck;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
@@ -46,5 +47,5 @@
     static MapCSSTagChecker buildTagChecker(String css) throws ParseException {
         final MapCSSTagChecker test = new MapCSSTagChecker();
-        test.checks.putAll("test", TagCheck.readMapCSS(new StringReader(css)));
+        test.checks.putAll("test", TagCheck.readMapCSS(new StringReader(css)).parseChecks);
         return test;
     }
@@ -52,5 +53,5 @@
     @Test
     public void testNaturalMarsh() throws Exception {
-        final List<MapCSSTagChecker.TagCheck> checks = MapCSSTagChecker.TagCheck.readMapCSS(new StringReader("" +
+        ParseResult result = MapCSSTagChecker.TagCheck.readMapCSS(new StringReader("" +
                 "*[natural=marsh] {\n" +
                 "   throwWarning: tr(\"{0}={1} is deprecated\", \"{0.key}\", tag(\"natural\"));\n" +
@@ -59,5 +60,7 @@
                 "   fixAdd: \"wetland=marsh\";\n" +
                 "}"));
+        final List<MapCSSTagChecker.TagCheck> checks = result.parseChecks;
         assertEquals(1, checks.size());
+        assertTrue(result.parseErrors.isEmpty());
         final MapCSSTagChecker.TagCheck check = checks.get(0);
         assertNotNull(check);
@@ -87,5 +90,5 @@
                 "fixChangeKey: \"highway => construction\";\n" +
                 "fixAdd: \"highway=construction\";\n" +
-                "}")).get(0);
+                "}")).parseChecks.get(0);
         final Command command = check.fixPrimitive(p);
         assertTrue(command instanceof SequenceCommand);
Index: /trunk/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTest.java	(revision 8936)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/preferences/validator/ValidatorTagCheckerRulesPreferenceTest.java	(revision 8936)
@@ -0,0 +1,50 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.preferences.validator;
+
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.io.IOException;
+import java.util.Collection;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker.ParseResult;
+import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
+import org.openstreetmap.josm.gui.preferences.SourceEditor.ExtendedSourceEntry;
+
+/**
+ * Unit tests of {@link ValidatorTagCheckerRulesPreference} class.
+ */
+public class ValidatorTagCheckerRulesPreferenceTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Test that available tag checker rules are valid.
+     * @throws IOException if any I/O error occurs
+     * @throws ParseException if the config file does not match MapCSS syntax
+     */
+    @Test
+    public void testValidityOfAvailableSources() throws ParseException, IOException {
+        Collection<ExtendedSourceEntry> sources = new ValidatorTagCheckerRulesPreference.TagCheckerRulesSourceEditor()
+                .loadAndGetAvailableSources();
+        assertFalse(sources.isEmpty());
+        MapCSSTagChecker tagChecker = new MapCSSTagChecker();
+        for (ExtendedSourceEntry source : sources) {
+            System.out.print(source.url);
+            ParseResult result = tagChecker.addMapCSS(source.url);
+            assertFalse(result.parseChecks.isEmpty());
+            assertTrue(result.parseErrors.isEmpty());
+            System.out.println(" => OK");
+        }
+    }
+}
