Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 16973)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 16974)
@@ -871,4 +871,7 @@
         setupCallbacks();
 
+        if (!skipLoadingPlugins) {
+            PluginHandler.loadVeryEarlyPlugins();
+        }
         // Configure Look and feel before showing SplashScreen (#19290)
         setupUIManager();
Index: /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 16973)
+++ /trunk/src/org/openstreetmap/josm/plugins/PluginHandler.java	(revision 16974)
@@ -902,5 +902,20 @@
 
     /**
-     * Loads plugins from <code>plugins</code> which have the flag {@link PluginInformation#early} set to true.
+     * Loads plugins from <code>plugins</code> which have the flag {@link PluginInformation#early} set to true
+     * <i>and</i> a negative {@link PluginInformation#stage} value.
+     *
+     * This is meant for plugins that provide additional {@link javax.swing.LookAndFeel}.
+     */
+    public static void loadVeryEarlyPlugins() {
+        List<PluginInformation> veryEarlyPlugins = PluginHandler.buildListOfPluginsToLoad(null, null)
+                .stream()
+                .filter(pi -> pi.early && pi.stage < 0)
+                .collect(Collectors.toList());
+        loadPlugins(null, veryEarlyPlugins, null);
+    }
+
+    /**
+     * Loads plugins from <code>plugins</code> which have the flag {@link PluginInformation#early} set to true
+     * <i>and</i> a non-negative {@link PluginInformation#stage} value.
      *
      * @param parent The parent component to be used for the displayed dialog
@@ -909,10 +924,7 @@
      */
     public static void loadEarlyPlugins(Component parent, Collection<PluginInformation> plugins, ProgressMonitor monitor) {
-        List<PluginInformation> earlyPlugins = new ArrayList<>(plugins.size());
-        for (PluginInformation pi: plugins) {
-            if (pi.early) {
-                earlyPlugins.add(pi);
-            }
-        }
+        List<PluginInformation> earlyPlugins = plugins.stream()
+                .filter(pi -> pi.early && pi.stage >= 0)
+                .collect(Collectors.toList());
         loadPlugins(parent, earlyPlugins, monitor);
     }
@@ -926,10 +938,7 @@
      */
     public static void loadLatePlugins(Component parent, Collection<PluginInformation> plugins, ProgressMonitor monitor) {
-        List<PluginInformation> latePlugins = new ArrayList<>(plugins.size());
-        for (PluginInformation pi: plugins) {
-            if (!pi.early) {
-                latePlugins.add(pi);
-            }
-        }
+        List<PluginInformation> latePlugins = plugins.stream()
+                .filter(pi -> !pi.early)
+                .collect(Collectors.toList());
         loadPlugins(parent, latePlugins, monitor);
     }
@@ -1023,5 +1032,5 @@
                 }
             }
-            if (!plugins.isEmpty()) {
+            if (!plugins.isEmpty() && parent != null) {
                 alertMissingPluginInformation(parent, plugins);
             }
