Index: /trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 14977)
+++ /trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 14978)
@@ -228,6 +228,7 @@
 
     protected void firePreferenceChanged(String key, Setting<?> oldValue, Setting<?> newValue) {
+        final Class<?> source = ReflectionUtils.findCallerClass(preferencesClasses);
         final PreferenceChangeEvent evt =
-                new DefaultPreferenceChangeEvent(ReflectionUtils.findCallerClass(preferencesClasses), key, oldValue, newValue);
+                new DefaultPreferenceChangeEvent(source != null ? source : getClass(), key, oldValue, newValue);
         listeners.fireEvent(listener -> listener.preferenceChanged(evt));
 
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 14977)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 14978)
@@ -300,4 +300,9 @@
     }
 
+    /**
+     * Plugin class loaders.
+     */
+    private static final Map<PluginInformation, PluginClassLoader> classLoaders = new HashMap<>();
+
     private static PluginDownloadTask pluginDownloadTask;
 
@@ -317,4 +322,13 @@
     public static Collection<ClassLoader> getResourceClassLoaders() {
         return Collections.unmodifiableCollection(sources);
+    }
+
+    /**
+     * Returns all plugin classloaders.
+     * @return all plugin classloaders
+     * @since 14978
+     */
+    public static Collection<PluginClassLoader> getPluginClassLoaders() {
+        return Collections.unmodifiableCollection(classLoaders.values());
     }
 
@@ -837,5 +851,5 @@
                 return;
 
-            Map<PluginInformation, PluginClassLoader> classLoaders = new HashMap<>();
+            classLoaders.clear();
             for (PluginInformation info : toLoad) {
                 PluginClassLoader cl = AccessController.doPrivileged((PrivilegedAction<PluginClassLoader>)
Index: /trunk/src/org/openstreetmap/josm/tools/ReflectionUtils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ReflectionUtils.java	(revision 14977)
+++ /trunk/src/org/openstreetmap/josm/tools/ReflectionUtils.java	(revision 14978)
@@ -7,4 +7,6 @@
 import java.util.Collection;
 import java.util.function.Function;
+
+import org.openstreetmap.josm.plugins.PluginHandler;
 
 /**
@@ -46,4 +48,11 @@
                 return Class.forName(x.getClassName());
             } catch (ClassNotFoundException e) {
+                for (ClassLoader cl : PluginHandler.getPluginClassLoaders()) {
+                    try {
+                        return Class.forName(x.getClassName(), true, cl);
+                    } catch (ClassNotFoundException ex) {
+                        Logging.trace(ex);
+                    }
+                }
                 Logging.error(e);
                 return null;
