Index: src/org/openstreetmap/josm/plugins/PluginClassLoader.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginClassLoader.java	(revision 0)
+++ src/org/openstreetmap/josm/plugins/PluginClassLoader.java	(working copy)
@@ -0,0 +1,48 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins;
+
+import java.net.URL;
+import java.net.URLClassLoader;
+import java.util.ArrayList;
+import java.util.Collection;
+
+/**
+ * Class loader for plugins.
+ *
+ * Plugin will have access to JOSM core classes and the classes of the plugin
+ * and all required plugins.
+ */
+public class PluginClassLoader extends URLClassLoader {
+
+    Collection<PluginClassLoader> dependencies;
+
+    static {
+        ClassLoader.registerAsParallelCapable();
+    }
+
+    public PluginClassLoader(URL[] urls, ClassLoader parent, Collection<PluginClassLoader> dependencies) {
+        super(urls, parent);
+        this.dependencies = dependencies == null ? new ArrayList<>() : new ArrayList<>(dependencies);
+    }
+
+    public void addDependency(PluginClassLoader dependency) {
+        dependencies.add(dependency);
+    }
+
+    @Override
+    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
+        for (PluginClassLoader dep : dependencies) {
+            try {
+                Class<?> result = dep.loadClass(name, resolve);
+                if (result != null) {
+                    return result;
+                }
+            } catch (ClassNotFoundException e) {}
+        }
+        Class<?> result = super.loadClass(name, resolve);
+        if (result != null) {
+            return result;
+        }
+        throw new ClassNotFoundException(name);
+    }
+}

Property changes on: src/org/openstreetmap/josm/plugins/PluginClassLoader.java
___________________________________________________________________
Added: svn:eol-style
## -0,0 +1 ##
+native
\ No newline at end of property
Index: src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 12308)
+++ src/org/openstreetmap/josm/plugins/PluginHandler.java	(working copy)
@@ -753,13 +753,13 @@
      * @param plugin the plugin
      * @param pluginClassLoader the plugin class loader
      */
-    public static void loadPlugin(Component parent, PluginInformation plugin, ClassLoader pluginClassLoader) {
+    public static void loadPlugin(Component parent, PluginInformation plugin, PluginClassLoader pluginClassLoader) {
         String msg = tr("Could not load plugin {0}. Delete from preferences?", plugin.name);
         try {
             Class<?> klass = plugin.loadClass(pluginClassLoader);
             if (klass != null) {
                 Main.info(tr("loading plugin ''{0}'' (version {1})", plugin.name, plugin.localversion));
-                PluginProxy pluginProxy = plugin.load(klass);
+                PluginProxy pluginProxy = plugin.load(klass, pluginClassLoader);
                 pluginList.add(pluginProxy);
                 Main.addAndFireMapFrameListener(pluginProxy);
             }
@@ -807,11 +807,40 @@
             if (toLoad.isEmpty())
                 return;
 
+            Map<PluginInformation, PluginClassLoader> classLoaders = new HashMap<>();
+            for (PluginInformation info : toLoad) {
+                classLoaders.put(info, new PluginClassLoader(
+                        info.libraries.toArray(new URL[0]),
+                        Main.class.getClassLoader(),
+                        null));
+            }
+
+            // resolve dependencies
+            for (PluginInformation info : toLoad) {
+                PluginClassLoader cl = classLoaders.get(info);
+                DEPENDENCIES:
+                for (String depName : info.getRequiredPlugins()) {
+                    for (PluginInformation depInfo : toLoad) {
+                        if (depInfo.getName().equals(depName)) {
+                            cl.addDependency(classLoaders.get(depInfo));
+                            continue DEPENDENCIES;
+                        }
+                    }
+                    for (PluginProxy proxy : pluginList) {
+                        if (proxy.getPluginInformation().getName().equals(depName)) {
+                            cl.addDependency(proxy.classLoader);
+                            continue DEPENDENCIES;
+                        }
+                    }
+                    throw new AssertionError("unable to find dependency "+depName+" for plugin " + info.getName());
+                }
+            }
+
             extendPluginClassLoader(toLoad);
             monitor.setTicksCount(toLoad.size());
             for (PluginInformation info : toLoad) {
                 monitor.setExtraText(tr("Loading plugin ''{0}''...", info.name));
-                loadPlugin(parent, info, getPluginClassLoader());
+                loadPlugin(parent, info, classLoaders.get(info));
                 monitor.worked(1);
             }
         } finally {
Index: src/org/openstreetmap/josm/plugins/PluginInformation.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginInformation.java	(revision 12308)
+++ src/org/openstreetmap/josm/plugins/PluginInformation.java	(working copy)
@@ -318,11 +318,11 @@
      * @return the instantiated and initialized plugin
      * @throws PluginException if the plugin cannot be loaded or instanciated
      */
-    public PluginProxy load(Class<?> klass) throws PluginException {
+    public PluginProxy load(Class<?> klass, PluginClassLoader classLoader) throws PluginException {
         try {
             Constructor<?> c = klass.getConstructor(PluginInformation.class);
             Object plugin = c.newInstance(this);
-            return new PluginProxy(plugin, this);
+            return new PluginProxy(plugin, this, classLoader);
         } catch (ReflectiveOperationException e) {
             throw new PluginException(name, e);
         }
Index: src/org/openstreetmap/josm/plugins/PluginProxy.java
===================================================================
--- src/org/openstreetmap/josm/plugins/PluginProxy.java	(revision 12308)
+++ src/org/openstreetmap/josm/plugins/PluginProxy.java	(working copy)
@@ -22,6 +22,7 @@
      * The plugin.
      */
     public final Object plugin;
+    public final PluginClassLoader classLoader;
 
     /**
      * Constructs a new {@code PluginProxy}.
@@ -28,9 +29,10 @@
      * @param plugin the plugin
      * @param info the associated plugin info
      */
-    public PluginProxy(Object plugin, PluginInformation info) {
+    public PluginProxy(Object plugin, PluginInformation info, PluginClassLoader classLoader) {
         super(info);
         this.plugin = plugin;
+        this.classLoader = classLoader;
     }
 
     private void handlePluginException(Exception e) {
