Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 12869)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 12870)
@@ -307,5 +307,5 @@
         try {
             sources.add(ClassLoader.getSystemClassLoader());
-            sources.add(org.openstreetmap.josm.gui.MainApplication.class.getClassLoader());
+            sources.add(PluginHandler.class.getClassLoader());
         } catch (SecurityException ex) {
             Logging.debug(ex);
@@ -862,4 +862,5 @@
 
             extendJoinedPluginResourceCL(toLoad);
+            ImageProvider.addAdditionalClassLoaders(getResourceClassLoaders());
             monitor.setTicksCount(toLoad.size());
             for (PluginInformation info : toLoad) {
Index: trunk/src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 12869)
+++ trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 12870)
@@ -30,9 +30,9 @@
 import java.net.URL;
 import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Base64;
 import java.util.Collection;
 import java.util.HashMap;
+import java.util.HashSet;
 import java.util.Hashtable;
 import java.util.Iterator;
@@ -40,4 +40,5 @@
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.CompletableFuture;
@@ -71,5 +72,4 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.io.CachedFile;
-import org.openstreetmap.josm.plugins.PluginHandler;
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.w3c.dom.Element;
@@ -248,4 +248,8 @@
     public static final String PROP_TRANSPARENCY_COLOR = "josm.transparency.color";
 
+    /** set of class loaders to take images from */
+    protected static final Set<ClassLoader> classLoaders = new HashSet<>(Arrays.asList(
+            ClassLoader.getSystemClassLoader(), ImageProvider.class.getClassLoader()));
+
     /** directories in which images are searched */
     protected Collection<String> dirs;
@@ -272,6 +276,4 @@
     /** <code>true</code> if warnings should be suppressed */
     protected boolean suppressWarnings;
-    /** list of class loaders to take images from */
-    protected Collection<ClassLoader> additionalClassLoaders;
     /** ordered list of overlay images */
     protected List<ImageOverlay> overlayInfo;
@@ -334,5 +336,4 @@
         this.optional = image.optional;
         this.suppressWarnings = image.suppressWarnings;
-        this.additionalClassLoaders = image.additionalClassLoaders;
         this.overlayInfo = image.overlayInfo;
         this.isDisabled = image.isDisabled;
@@ -578,11 +579,21 @@
 
     /**
+     * Add an additional class loader to search image for.
+     * @param additionalClassLoader class loader to add to the internal set
+     * @return {@code true} if the set changed as a result of the call
+     * @since 12870
+     */
+    public static boolean addAdditionalClassLoader(ClassLoader additionalClassLoader) {
+        return classLoaders.add(additionalClassLoader);
+    }
+
+    /**
      * Add a collection of additional class loaders to search image for.
-     * @param additionalClassLoaders class loaders to add to the internal list
-     * @return the current object, for convenience
-     */
-    public ImageProvider setAdditionalClassLoaders(Collection<ClassLoader> additionalClassLoaders) {
-        this.additionalClassLoaders = additionalClassLoaders;
-        return this;
+     * @param additionalClassLoaders class loaders to add to the internal set
+     * @return {@code true} if the set changed as a result of the call
+     * @since 12870
+     */
+    public static boolean addAdditionalClassLoaders(Collection<ClassLoader> additionalClassLoaders) {
+        return classLoaders.addAll(additionalClassLoaders);
     }
 
@@ -658,5 +669,5 @@
      */
     public ImageResource getResource() {
-        ImageResource ir = getIfAvailableImpl(additionalClassLoaders);
+        ImageResource ir = getIfAvailableImpl();
         if (ir == null) {
             if (!optional) {
@@ -803,8 +814,7 @@
      * Internal implementation of the image request.
      *
-     * @param additionalClassLoaders the list of class loaders to use
      * @return the requested image or null if the request failed
      */
-    private ImageResource getIfAvailableImpl(Collection<ClassLoader> additionalClassLoaders) {
+    private ImageResource getIfAvailableImpl() {
         synchronized (cache) {
             // This method is called from different thread and modifying HashMap concurrently can result
@@ -902,5 +912,5 @@
                         // and don't bother to create a URL unless we're actually
                         // creating the image.
-                        URL path = getImageUrl(fullName, dirs, additionalClassLoaders);
+                        URL path = getImageUrl(fullName);
                         if (path == null) {
                             continue;
@@ -1134,11 +1144,7 @@
     }
 
-    private static URL getImageUrl(String path, String name, Collection<ClassLoader> additionalClassLoaders) {
+    private URL getImageUrl(String path, String name) {
         if (path != null && path.startsWith("resource://")) {
             String p = path.substring("resource://".length());
-            Collection<ClassLoader> classLoaders = new ArrayList<>(PluginHandler.getResourceClassLoaders());
-            if (additionalClassLoaders != null) {
-                classLoaders.addAll(additionalClassLoaders);
-            }
             for (ClassLoader source : classLoaders) {
                 URL res;
@@ -1154,5 +1160,5 @@
     }
 
-    private static URL getImageUrl(String imageName, Collection<String> dirs, Collection<ClassLoader> additionalClassLoaders) {
+    private URL getImageUrl(String imageName) {
         URL u;
 
@@ -1161,5 +1167,5 @@
             for (String name : dirs) {
                 try {
-                    u = getImageUrl(name, imageName, additionalClassLoaders);
+                    u = getImageUrl(name, imageName);
                     if (u != null)
                         return u;
@@ -1176,5 +1182,5 @@
             String dir = new File(Config.getDirs().getUserDataDirectory(false), "images").getAbsolutePath();
             try {
-                u = getImageUrl(dir, imageName, additionalClassLoaders);
+                u = getImageUrl(dir, imageName);
                 if (u != null)
                     return u;
@@ -1187,10 +1193,10 @@
 
         // Absolute path?
-        u = getImageUrl(null, imageName, additionalClassLoaders);
+        u = getImageUrl(null, imageName);
         if (u != null)
             return u;
 
         // Try plugins and josm classloader
-        u = getImageUrl("resource://images/", imageName, additionalClassLoaders);
+        u = getImageUrl("resource://images/", imageName);
         if (u != null)
             return u;
@@ -1199,8 +1205,8 @@
         if (Main.pref != null) {
             for (String location : Main.pref.getAllPossiblePreferenceDirs()) {
-                u = getImageUrl(location + "images", imageName, additionalClassLoaders);
+                u = getImageUrl(location + "images", imageName);
                 if (u != null)
                     return u;
-                u = getImageUrl(location, imageName, additionalClassLoaders);
+                u = getImageUrl(location, imageName);
                 if (u != null)
                     return u;
