Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10092)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 10093)
@@ -52,4 +52,5 @@
 import org.openstreetmap.josm.data.CustomConfigurator;
 import org.openstreetmap.josm.data.Version;
+import org.openstreetmap.josm.gui.SplashScreen.SplashProgressMonitor;
 import org.openstreetmap.josm.gui.download.DownloadDialog;
 import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
@@ -446,17 +447,6 @@
         Collection<PluginInformation> pluginsToLoad = null;
 
-
         if (!skipLoadingPlugins) {
-            pluginsToLoad = PluginHandler.buildListOfPluginsToLoad(splash, monitor.createSubTaskMonitor(1, false));
-            if (!pluginsToLoad.isEmpty() && PluginHandler.checkAndConfirmPluginUpdate(splash)) {
-                monitor.subTask(tr("Updating plugins"));
-                pluginsToLoad = PluginHandler.updatePlugins(splash, null, monitor.createSubTaskMonitor(1, false), false);
-            }
-
-            monitor.indeterminateSubTask(tr("Installing updated plugins"));
-            PluginHandler.installDownloadedPlugins(true);
-
-            monitor.indeterminateSubTask(tr("Loading early plugins"));
-            PluginHandler.loadEarlyPlugins(splash, pluginsToLoad, monitor.createSubTaskMonitor(1, false));
+            pluginsToLoad = updateAndLoadEarlyPlugins(splash, monitor);
         }
 
@@ -468,7 +458,5 @@
 
         if (!skipLoadingPlugins) {
-            monitor.indeterminateSubTask(tr("Loading plugins"));
-            PluginHandler.loadLatePlugins(splash, pluginsToLoad,  monitor.createSubTaskMonitor(1, false));
-            toolbar.refreshToolbarControl();
+            loadLatePlugins(splash, monitor, pluginsToLoad);
         }
 
@@ -525,4 +513,26 @@
             RepaintManager.setCurrentManager(new CheckThreadViolationRepaintManager());
         }
+    }
+
+    static Collection<PluginInformation> updateAndLoadEarlyPlugins(SplashScreen splash, SplashProgressMonitor monitor) {
+        Collection<PluginInformation> pluginsToLoad;
+        pluginsToLoad = PluginHandler.buildListOfPluginsToLoad(splash, monitor.createSubTaskMonitor(1, false));
+        if (!pluginsToLoad.isEmpty() && PluginHandler.checkAndConfirmPluginUpdate(splash)) {
+            monitor.subTask(tr("Updating plugins"));
+            pluginsToLoad = PluginHandler.updatePlugins(splash, null, monitor.createSubTaskMonitor(1, false), false);
+        }
+
+        monitor.indeterminateSubTask(tr("Installing updated plugins"));
+        PluginHandler.installDownloadedPlugins(true);
+
+        monitor.indeterminateSubTask(tr("Loading early plugins"));
+        PluginHandler.loadEarlyPlugins(splash, pluginsToLoad, monitor.createSubTaskMonitor(1, false));
+        return pluginsToLoad;
+    }
+
+    static void loadLatePlugins(SplashScreen splash, SplashProgressMonitor monitor, Collection<PluginInformation> pluginsToLoad) {
+        monitor.indeterminateSubTask(tr("Loading plugins"));
+        PluginHandler.loadLatePlugins(splash, pluginsToLoad, monitor.createSubTaskMonitor(1, false));
+        toolbar.refreshToolbarControl();
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/SplashScreen.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/SplashScreen.java	(revision 10092)
+++ trunk/src/org/openstreetmap/josm/gui/SplashScreen.java	(revision 10093)
@@ -197,4 +197,9 @@
         private SplashProgressMonitor latestSubtask;
 
+        /**
+         * Constructs a new {@code SplashProgressMonitor}.
+         * @param name name
+         * @param listener change listener
+         */
         public SplashProgressMonitor(String name, ChangeListener listener) {
             this.name = name;
Index: trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 10092)
+++ trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 10093)
@@ -8,4 +8,5 @@
 import java.awt.Component;
 import java.awt.Font;
+import java.awt.GraphicsEnvironment;
 import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
@@ -276,5 +277,5 @@
      * @param plugins the collection of plugins
      */
-    private static void filterDeprecatedPlugins(Component parent, Collection<String> plugins) {
+    static void filterDeprecatedPlugins(Component parent, Collection<String> plugins) {
         Set<DeprecatedPlugin> removedPlugins = new TreeSet<>();
         for (DeprecatedPlugin depr : DEPRECATED_PLUGINS) {
@@ -305,10 +306,12 @@
         }
         sb.append("</ul></html>");
-        JOptionPane.showMessageDialog(
-                parent,
-                sb.toString(),
-                tr("Warning"),
-                JOptionPane.WARNING_MESSAGE
-        );
+        if (!GraphicsEnvironment.isHeadless()) {
+            JOptionPane.showMessageDialog(
+                    parent,
+                    sb.toString(),
+                    tr("Warning"),
+                    JOptionPane.WARNING_MESSAGE
+            );
+        }
     }
 
@@ -323,5 +326,5 @@
      * @param plugins the collection of plugins
      */
-    private static void filterUnmaintainedPlugins(Component parent, Collection<String> plugins) {
+    static void filterUnmaintainedPlugins(Component parent, Collection<String> plugins) {
         for (String unmaintained : UNMAINTAINED_PLUGINS) {
             if (!plugins.contains(unmaintained)) {
Index: trunk/test/unit/org/openstreetmap/josm/gui/MainApplicationTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/gui/MainApplicationTest.java	(revision 10093)
+++ trunk/test/unit/org/openstreetmap/josm/gui/MainApplicationTest.java	(revision 10093)
@@ -0,0 +1,61 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
+
+import java.util.Collection;
+
+import javax.swing.event.ChangeEvent;
+import javax.swing.event.ChangeListener;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.gui.SplashScreen.SplashProgressMonitor;
+import org.openstreetmap.josm.plugins.PluginHandler;
+import org.openstreetmap.josm.plugins.PluginInformation;
+
+/**
+ * Unit tests of {@link MainApplication} class.
+ */
+public class MainApplicationTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init(true);
+    }
+
+    /**
+     * Test of {@link MainApplication#updateAndLoadEarlyPlugins} and {@link MainApplication#loadLatePlugins} methods.
+     */
+    @Test
+    public void testUpdateAndLoadPlugins() {
+        final String old = System.getProperty("josm.plugins");
+        try {
+            System.setProperty("josm.plugins", "buildings_tools,plastic_laf");
+            SplashProgressMonitor monitor = new SplashProgressMonitor("foo", new ChangeListener() {
+                @Override
+                public void stateChanged(ChangeEvent e) {
+                    // Do nothing
+                }
+            });
+            Collection<PluginInformation> plugins = MainApplication.updateAndLoadEarlyPlugins(null, monitor);
+            assertEquals(2, plugins.size());
+            assertNotNull(PluginHandler.getPlugin("plastic_laf"));
+            assertNull(PluginHandler.getPlugin("buildings_tools"));
+            MainApplication.loadLatePlugins(null, monitor, plugins);
+            assertNotNull(PluginHandler.getPlugin("buildings_tools"));
+        } finally {
+            if (old != null) {
+                System.setProperty("josm.plugins", old);
+            } else {
+                System.clearProperty("josm.plugins");
+            }
+        }
+    }
+}
Index: trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java	(revision 10092)
+++ trunk/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java	(revision 10093)
@@ -2,7 +2,10 @@
 package org.openstreetmap.josm.plugins;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
@@ -11,4 +14,5 @@
 import org.junit.Test;
 import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.plugins.PluginHandler.DeprecatedPlugin;
 import org.openstreetmap.josm.tools.Utils;
@@ -58,3 +62,25 @@
         }
     }
+
+    /**
+     * Unit test of {@link PluginHandler#filterDeprecatedPlugins}.
+     */
+    @Test
+    public void testFilterDeprecatedPlugins() {
+        List<String> plugins = new ArrayList<>(Arrays.asList("foo", "bar", "imagery"));
+        PluginHandler.filterDeprecatedPlugins(Main.parent, plugins);
+        assertEquals(2, plugins.size());
+        assertFalse(plugins.contains("imagery"));
+    }
+
+    /**
+     * Unit test of {@link PluginHandler#filterUnmaintainedPlugins}.
+     */
+    @Test
+    public void testFilterUnmaintainedPlugins() {
+        List<String> plugins = new ArrayList<>(Arrays.asList("foo", "bar", "gpsbabelgui"));
+        PluginHandler.filterUnmaintainedPlugins(Main.parent, plugins);
+        assertEquals(2, plugins.size());
+        assertFalse(plugins.contains("gpsbabelgui"));
+    }
 }
