Index: trunk/src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 12650)
+++ trunk/src/org/openstreetmap/josm/gui/MapView.java	(revision 12651)
@@ -34,4 +34,5 @@
 import javax.swing.JComponent;
 import javax.swing.JPanel;
+import javax.swing.SwingUtilities;
 
 import org.openstreetmap.josm.Main;
@@ -70,4 +71,6 @@
 import org.openstreetmap.josm.gui.layer.geoimage.GeoImageLayer;
 import org.openstreetmap.josm.gui.layer.markerlayer.PlayHeadMarker;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintSylesUpdateListener;
 import org.openstreetmap.josm.io.audio.AudioPlayer;
 import org.openstreetmap.josm.tools.JosmRuntimeException;
@@ -92,4 +95,24 @@
 implements PropertyChangeListener, PreferenceChangedListener,
 LayerManager.LayerChangeListener, MainLayerManager.ActiveLayerChangeListener {
+
+    static {
+        MapPaintStyles.addMapPaintSylesUpdateListener(new MapPaintSylesUpdateListener() {
+            @Override
+            public void mapPaintStylesUpdated() {
+                SwingUtilities.invokeLater(() -> {
+                    // Trigger a repaint of all data layers
+                    MainApplication.getLayerManager().getLayers()
+                        .stream()
+                        .filter(layer -> layer instanceof OsmDataLayer)
+                        .forEach(Layer::invalidate);
+                });
+            }
+
+            @Override
+            public void mapPaintStyleEntryUpdated(int index) {
+                mapPaintStylesUpdated();
+            }
+        });
+    }
 
     /**
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 12650)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 12651)
@@ -65,4 +65,5 @@
 import org.openstreetmap.josm.gui.mappaint.StyleSetting;
 import org.openstreetmap.josm.gui.mappaint.StyleSource;
+import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
 import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference;
@@ -417,5 +418,5 @@
         public void actionPerformed(ActionEvent e) {
             final int[] rows = tblStyles.getSelectedRows();
-            MapPaintStyles.reloadStyles(rows);
+            MapPaintStyleLoader.reloadStyles(rows);
             MainApplication.worker.submit(() -> SwingUtilities.invokeLater(() -> {
                 selectionModel.setValueIsAdjusting(true);
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 12650)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 12651)
@@ -1,6 +1,4 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.mappaint;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.io.File;
@@ -24,13 +22,8 @@
 import org.openstreetmap.josm.data.preferences.sources.MapPaintPrefHelper;
 import org.openstreetmap.josm.data.preferences.sources.SourceEntry;
-import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.PleaseWaitRunnable;
-import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
 import org.openstreetmap.josm.gui.mappaint.styleelement.MapImage;
 import org.openstreetmap.josm.gui.mappaint.styleelement.NodeElement;
 import org.openstreetmap.josm.gui.mappaint.styleelement.StyleElement;
-import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -340,59 +333,4 @@
 
     /**
-     * reload styles
-     * preferences are the same, but the file source may have changed
-     * @param sel the indices of styles to reload
-     */
-    public static void reloadStyles(final int... sel) {
-        List<StyleSource> toReload = new ArrayList<>();
-        List<StyleSource> data = styles.getStyleSources();
-        for (int i : sel) {
-            toReload.add(data.get(i));
-        }
-        MainApplication.worker.submit(new MapPaintStyleLoader(toReload));
-    }
-
-    /**
-     * This class loads the map paint styles
-     */
-    public static class MapPaintStyleLoader extends PleaseWaitRunnable {
-        private boolean canceled;
-        private final Collection<StyleSource> sources;
-
-        /**
-         * Create a new {@link MapPaintStyleLoader}
-         * @param sources The styles to load
-         */
-        public MapPaintStyleLoader(Collection<StyleSource> sources) {
-            super(tr("Reloading style sources"));
-            this.sources = sources;
-        }
-
-        @Override
-        protected void cancel() {
-            canceled = true;
-        }
-
-        @Override
-        protected void finish() {
-            fireMapPaintSylesUpdated();
-            afterStyleUpdate();
-        }
-
-        @Override
-        protected void realRun() {
-            ProgressMonitor monitor = getProgressMonitor();
-            monitor.setTicksCount(sources.size());
-            for (StyleSource s : sources) {
-                if (canceled)
-                    return;
-                monitor.subTask(tr("loading style ''{0}''...", s.getDisplayString()));
-                s.loadStyleSource();
-                monitor.worked(1);
-            }
-        }
-    }
-
-    /**
      * Move position of entries in the current list of StyleSources
      * @param sel The indices of styles to be moved.
@@ -415,20 +353,4 @@
         MapPaintPrefHelper.INSTANCE.put(data);
         fireMapPaintSylesUpdated();
-        afterStyleUpdate();
-    }
-
-    /**
-     * Manually trigger for now. TODO: Move this to a listener
-     */
-    private static void afterStyleUpdate() {
-        SwingUtilities.invokeLater(() -> {
-            styles.clearCached();
-
-            // Trigger a repaint of all data layers
-            MainApplication.getLayerManager().getLayers()
-                .stream()
-                .filter(layer -> layer instanceof OsmDataLayer)
-                .forEach(Layer::invalidate);
-        });
     }
 
@@ -469,5 +391,4 @@
             fireMapPaintSylesUpdated();
         }
-        afterStyleUpdate();
     }
 
@@ -500,5 +421,4 @@
         MapPaintPrefHelper.INSTANCE.put(styles.getStyleSources());
         fireMapPaintSylesUpdated();
-        afterStyleUpdate();
     }
 
@@ -522,4 +442,18 @@
     private static final ListenerList<MapPaintSylesUpdateListener> listeners = ListenerList.createUnchecked();
 
+    static {
+        listeners.addListener(new MapPaintSylesUpdateListener() {
+            @Override
+            public void mapPaintStylesUpdated() {
+                SwingUtilities.invokeLater(styles::clearCached);
+            }
+
+            @Override
+            public void mapPaintStyleEntryUpdated(int index) {
+                mapPaintStylesUpdated();
+            }
+        });
+    }
+
     /**
      * Add a listener that listens to global style changes.
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java	(revision 12650)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/StyleSetting.java	(revision 12651)
@@ -12,4 +12,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -71,5 +72,5 @@
                 public void actionPerformed(ActionEvent e) {
                     setValue(item.isSelected());
-                    MainApplication.worker.submit(new MapPaintStyles.MapPaintStyleLoader(Arrays.asList(parentStyle)));
+                    MainApplication.worker.submit(new MapPaintStyleLoader(Arrays.asList(parentStyle)));
                 }
             };
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/loader/MapPaintStyleLoader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/loader/MapPaintStyleLoader.java	(revision 12651)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/loader/MapPaintStyleLoader.java	(revision 12651)
@@ -0,0 +1,69 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.mappaint.loader;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.PleaseWaitRunnable;
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles;
+import org.openstreetmap.josm.gui.mappaint.StyleSource;
+import org.openstreetmap.josm.gui.progress.ProgressMonitor;
+
+/**
+ * This class loads the map paint styles
+ * @since 12651 (extracted from {@link MapPaintStyles}).
+ */
+public class MapPaintStyleLoader extends PleaseWaitRunnable {
+    private boolean canceled;
+    private final Collection<StyleSource> sources;
+
+    /**
+     * Create a new {@link MapPaintStyleLoader}
+     * @param sources The styles to load
+     */
+    public MapPaintStyleLoader(Collection<StyleSource> sources) {
+        super(tr("Reloading style sources"));
+        this.sources = sources;
+    }
+
+    @Override
+    protected void cancel() {
+        canceled = true;
+    }
+
+    @Override
+    protected void finish() {
+        MapPaintStyles.fireMapPaintSylesUpdated();
+    }
+
+    @Override
+    protected void realRun() {
+        ProgressMonitor monitor = getProgressMonitor();
+        monitor.setTicksCount(sources.size());
+        for (StyleSource s : sources) {
+            if (canceled)
+                return;
+            monitor.subTask(tr("loading style ''{0}''...", s.getDisplayString()));
+            s.loadStyleSource();
+            monitor.worked(1);
+        }
+    }
+
+    /**
+     * Reload styles
+     * preferences are the same, but the file source may have changed
+     * @param sel the indices of styles to reload
+     */
+    public static void reloadStyles(final int... sel) {
+        List<StyleSource> toReload = new ArrayList<>();
+        List<StyleSource> data = MapPaintStyles.getStyles().getStyleSources();
+        for (int i : sel) {
+            toReload.add(data.get(i));
+        }
+        MainApplication.worker.submit(new MapPaintStyleLoader(toReload));
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/loader/package-info.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/loader/package-info.java	(revision 12651)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/loader/package-info.java	(revision 12651)
@@ -0,0 +1,6 @@
+// License: GPL. For details, see LICENSE file.
+
+/**
+ * Provides the GUI classes allowing map paint styles to be (re)loaded.
+ */
+package org.openstreetmap.josm.gui.mappaint.loader;
Index: trunk/src/org/openstreetmap/josm/io/FileWatcher.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/FileWatcher.java	(revision 12650)
+++ trunk/src/org/openstreetmap/josm/io/FileWatcher.java	(revision 12651)
@@ -19,6 +19,6 @@
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
-import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.MapPaintStyleLoader;
 import org.openstreetmap.josm.gui.mappaint.StyleSource;
+import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
Index: trunk/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
===================================================================
--- trunk/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java	(revision 12650)
+++ trunk/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java	(revision 12651)
@@ -39,4 +39,5 @@
 import org.openstreetmap.josm.gui.NavigatableComponent;
 import org.openstreetmap.josm.gui.mappaint.StyleSetting.BooleanStyleSetting;
+import org.openstreetmap.josm.gui.mappaint.loader.MapPaintStyleLoader;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
@@ -142,5 +143,5 @@
         Assert.assertNotNull(hideIconsSetting);
         hideIconsSetting.setValue(false);
-        MapPaintStyles.reloadStyles(defaultStyleIdx);
+        MapPaintStyleLoader.reloadStyles(defaultStyleIdx);
 
         try (
@@ -157,5 +158,5 @@
             hideIconsSetting.setValue(true);
         }
-        MapPaintStyles.reloadStyles(defaultStyleIdx);
+        MapPaintStyleLoader.reloadStyles(defaultStyleIdx);
     }
 
@@ -290,5 +291,5 @@
             setFilterStyleActive(false);
         }
-        MapPaintStyles.reloadStyles(filterStyleIdx);
+        MapPaintStyleLoader.reloadStyles(filterStyleIdx);
         test.run();
     }
Index: trunk/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSPerformanceTest.java
===================================================================
--- trunk/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSPerformanceTest.java	(revision 12650)
+++ trunk/test/performance/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSPerformanceTest.java	(revision 12651)
@@ -68,5 +68,5 @@
 
     void loadStyle() {
-        System.out.println("Loading style '"+STYLE_FILE+"' ...");
+        System.out.print("Loading style '"+STYLE_FILE+"' ...");
         MapCSSStyleSource source = new MapCSSStyleSource(
             new SourceEntry(
