Index: /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadTask.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadTask.java	(revision 8937)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginDownloadTask.java	(revision 8938)
@@ -162,5 +162,7 @@
         for (PluginInformation d : toUpdate) {
             if (canceled) return;
-            progressMonitor.subTask(tr("Downloading Plugin {0}...", d.name));
+            String message = tr("Downloading Plugin {0}...", d.name);
+            Main.info(message);
+            progressMonitor.subTask(message);
             progressMonitor.worked(1);
             File pluginFile = new File(pluginDir, d.name + ".jar.new");
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 8937)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 8938)
@@ -232,4 +232,10 @@
 
     /**
+     * All exceptions that occured during plugin loading
+     * @since 8938
+     */
+    public static final Map<String, Exception> pluginLoadingExceptions = new HashMap<>();
+
+    /**
      * Global plugin ClassLoader.
      */
@@ -279,5 +285,5 @@
         // notify user about removed deprecated plugins
         //
-        StringBuilder sb = new StringBuilder();
+        StringBuilder sb = new StringBuilder(32);
         sb.append("<html>")
           .append(trn(
@@ -308,4 +314,5 @@
      *
      * Asks the user for every unmaintained plugin whether it should be removed.
+     * @param parent The parent Component used to display warning popup
      *
      * @param plugins the collection of plugins
@@ -316,5 +323,5 @@
                 continue;
             }
-            String msg =  tr("<html>Loading of the plugin \"{0}\" was requested."
+            String msg = tr("<html>Loading of the plugin \"{0}\" was requested."
                     + "<br>This plugin is no longer developed and very likely will produce errors."
                     +"<br>It should be disabled.<br>Delete from preferences?</html>", unmaintained);
@@ -702,4 +709,5 @@
             msg = null;
         } catch (PluginException e) {
+            pluginLoadingExceptions.put(plugin.name, e);
             Main.error(e);
             if (e.getCause() instanceof ClassNotFoundException) {
@@ -708,4 +716,5 @@
             }
         }  catch (Exception e) {
+            pluginLoadingExceptions.put(plugin.name, e);
             Main.error(e);
         }
@@ -1449,4 +1458,18 @@
     }
 
+    /**
+     * Returns the set of deprecated and unmaintained plugins.
+     * @return set of deprecated and unmaintained plugins names.
+     * @since 8938
+     */
+    public static Set<String> getDeprecatedAndUnmaintainedPlugins() {
+        Set<String> result = new HashSet<>(DEPRECATED_PLUGINS.size() + UNMAINTAINED_PLUGINS.length);
+        for (DeprecatedPlugin dp : DEPRECATED_PLUGINS) {
+            result.add(dp.name);
+        }
+        result.addAll(Arrays.asList(UNMAINTAINED_PLUGINS));
+        return result;
+    }
+
     private static class UpdatePluginsMessagePanel extends JPanel {
         private JMultilineLabel lblMessage;
Index: /trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java	(revision 8938)
+++ /trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java	(revision 8938)
@@ -0,0 +1,74 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.plugins;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Iterator;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+/**
+ * Unit tests of {@link PluginHandler} class.
+ */
+public class PluginHandlerTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Test that available plugins rules can be loaded.
+     */
+    @Test
+    public void testValidityOfAvailablePlugins() {
+        // Download complete list of plugins
+        ReadRemotePluginInformationTask pluginInfoDownloadTask = new ReadRemotePluginInformationTask(
+                Main.pref.getOnlinePluginSites());
+        pluginInfoDownloadTask.run();
+        List<PluginInformation> plugins = pluginInfoDownloadTask.getAvailablePlugins();
+        System.out.println("Original plugin list contains " + plugins.size() + " plugins");
+        assertFalse(plugins.isEmpty());
+        PluginInformation info = plugins.get(0);
+        assertFalse(info.getName().isEmpty());
+        assertFalse(info.getClass().getName().isEmpty());
+
+        // Filter deprecated and unmaintained ones
+        Set<String> deprecatedPlugins = PluginHandler.getDeprecatedAndUnmaintainedPlugins();
+        for (Iterator<PluginInformation> it = plugins.iterator(); it.hasNext();) {
+            PluginInformation pi = it.next();
+            if (deprecatedPlugins.contains(pi.name)) {
+                it.remove();
+            }
+        }
+        System.out.println("Filtered plugin list contains " + plugins.size() + " plugins");
+
+        // Update the locally installed plugins
+        PluginDownloadTask pluginDownloadTask = new PluginDownloadTask(NullProgressMonitor.INSTANCE, plugins, null);
+        pluginDownloadTask.run();
+        assertTrue(pluginDownloadTask.getFailedPlugins().toString(), pluginDownloadTask.getFailedPlugins().isEmpty());
+        assertEquals(plugins.size(), pluginDownloadTask.getDownloadedPlugins().size());
+
+        // Update Plugin info for downloaded plugins
+        PluginHandler.refreshLocalUpdatedPluginInfo(pluginDownloadTask.getDownloadedPlugins());
+
+        // Load early plugins
+        PluginHandler.loadEarlyPlugins(null, plugins, null);
+
+        // Load late plugins
+        PluginHandler.loadLatePlugins(null, plugins, null);
+
+        assertTrue(PluginHandler.pluginLoadingExceptions.toString(), PluginHandler.pluginLoadingExceptions.isEmpty());
+    }
+}
Index: unk/test/unit/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTaskTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/plugins/ReadRemotePluginInformationTaskTest.java	(revision 8937)
+++ 	(revision )
@@ -1,40 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.plugins;
-
-import static org.junit.Assert.assertFalse;
-
-import java.util.List;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-
-/**
- * Unit tests of {@link ReadRemotePluginInformationTask} class.
- */
-public class ReadRemotePluginInformationTaskTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void setUp() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    /**
-     * Test of plugin list download.
-     */
-    @Test
-    public void testDownloadPluginList() {
-        ReadRemotePluginInformationTask pluginInfoDownloadTask = new ReadRemotePluginInformationTask(
-                Main.pref.getOnlinePluginSites());
-        pluginInfoDownloadTask.run();
-        List<PluginInformation> list = pluginInfoDownloadTask.getAvailablePlugins();
-        assertFalse(list.isEmpty());
-        PluginInformation info = list.get(0);
-        assertFalse(info.getName().isEmpty());
-        assertFalse(info.getClass().getName().isEmpty());
-    }
-}
