Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 4680)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 4681)
@@ -22,4 +22,5 @@
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
@@ -222,7 +223,21 @@
     }
 
+    private static InitStatusListener initListener = null;
+
+    public static interface InitStatusListener {
+
+        void updateStatus(String event);
+    }
+
+    public static void setInitStatusListener(InitStatusListener listener) {
+        initListener = listener;
+    }
+
     public Main() {
         main = this;
         isOpenjdk = System.getProperty("java.vm.name").toUpperCase().indexOf("OPENJDK") != -1;
+
+        if (initListener != null)
+            initListener.updateStatus(tr("Executing platform startup hook"));
         platform.startupHook();
 
@@ -230,4 +245,6 @@
         // capabilities are already known to the editor instance. However
         // if it goes wrong that's not critical at this stage.
+        if (initListener != null)
+            initListener.updateStatus(tr("Initializing OSM API"));
         try {
             OsmApi.getOsmApi().initialize(null, true);
@@ -236,4 +253,6 @@
         }
 
+        if (initListener != null)
+            initListener.updateStatus(tr("Building main menu"));
         contentPanePrivate.add(panel, BorderLayout.CENTER);
         panel.add(gettingStarted, BorderLayout.CENTER);
@@ -248,8 +267,18 @@
                 KeyEvent.VK_F1, Shortcut.GROUP_DIRECT));
 
+        if (initListener != null)
+            initListener.updateStatus(tr("Initializing presets"));
         TaggingPresetPreference.initialize();
+
+        if (initListener != null)
+            initListener.updateStatus(tr("Initializing map styles"));
         MapPaintPreference.initialize();
+
+        if (initListener != null)
+            initListener.updateStatus(tr("Loading imagery preferences"));
         ImageryPreference.initialize();
 
+        if (initListener != null)
+            initListener.updateStatus(tr("Initializing validator"));
         validator = new OsmValidator();
         MapView.addLayerChangeListener(validator);
@@ -263,4 +292,7 @@
         });
         FeatureAdapter.registerTranslationAdapter(I18n.getTranslationAdapter());
+
+        if (initListener != null)
+            initListener.updateStatus(tr("Updating user interface"));
 
         toolbar.refreshToolbarControl();
Index: /trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 4680)
+++ /trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 4681)
@@ -210,28 +210,30 @@
 
         SplashScreen splash = new SplashScreen();
-        ProgressMonitor monitor = splash.getProgressMonitor();
+        final ProgressMonitor monitor = splash.getProgressMonitor();
         monitor.beginTask(tr("Initializing"));
-        monitor.setTicksCount(7);
         splash.setVisible(Main.pref.getBoolean("draw.splashscreen", true));
+        Main.setInitStatusListener(new InitStatusListener() {
+
+            @Override
+            public void updateStatus(String event) {
+                monitor.indeterminateSubTask(event);
+            }
+        });
 
         List<PluginInformation> pluginsToLoad = PluginHandler.buildListOfPluginsToLoad(splash,monitor.createSubTaskMonitor(1, false));
         if (!pluginsToLoad.isEmpty() && PluginHandler.checkAndConfirmPluginUpdate(splash)) {
-            monitor.subTask(tr("Updating plugins..."));
+            monitor.subTask(tr("Updating plugins"));
             pluginsToLoad = PluginHandler.updatePlugins(splash,pluginsToLoad, monitor.createSubTaskMonitor(1, false));
         }
-        monitor.worked(1);
-
-        monitor.subTask(tr("Installing updated plugins"));
+
+        monitor.indeterminateSubTask(tr("Installing updated plugins"));
         PluginHandler.installDownloadedPlugins(true);
-        monitor.worked(1);
-
-        monitor.subTask(tr("Loading early plugins"));
+
+        monitor.indeterminateSubTask(tr("Loading early plugins"));
         PluginHandler.loadEarlyPlugins(splash,pluginsToLoad, monitor.createSubTaskMonitor(1, false));
-        monitor.worked(1);
-
-        monitor.subTask(tr("Setting defaults"));
+
+        monitor.indeterminateSubTask(tr("Setting defaults"));
         preConstructorInit(args);
         removeObsoletePreferences();
-        monitor.worked(1);
 
         monitor.indeterminateSubTask(tr("Creating main GUI"));
@@ -240,9 +242,7 @@
         Main.addListener();
         final Main main = new MainApplication(mainFrame);
-        monitor.worked(1);
-
-        monitor.subTask(tr("Loading plugins"));
+
+        monitor.indeterminateSubTask(tr("Loading plugins"));
         PluginHandler.loadLatePlugins(splash,pluginsToLoad,  monitor.createSubTaskMonitor(1, false));
-        monitor.worked(1);
         toolbar.refreshToolbarControl();
         splash.setVisible(false);
Index: /trunk/src/org/openstreetmap/josm/gui/SplashScreen.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/SplashScreen.java	(revision 4680)
+++ /trunk/src/org/openstreetmap/josm/gui/SplashScreen.java	(revision 4681)
@@ -13,4 +13,6 @@
 import java.awt.event.MouseEvent;
 
+import java.util.Arrays;
+import java.util.LinkedList;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
@@ -133,4 +135,5 @@
                     Dimension d = super.getPreferredSize();
                     if(d.width < 600) d.width = 600;
+                    d.height *= MAX_NUMBER_OF_MESSAGES;
                     return d;
                 }
@@ -167,6 +170,37 @@
         }
 
+        private static final int MAX_NUMBER_OF_MESSAGES = 3;
+        private LinkedList<String> messages = new LinkedList<String>(Arrays.asList("", "", "")); //update when changing MAX_NUMBER_OF_MESSAGES
+        private long time = System.currentTimeMillis();
+
+        /**
+         * Stores and displays the {@code MAX_NUMBER_OF_MESSAGES} most recent
+         * task titles together with their execution time.
+         */
         public void setTaskTitle(String taskTitle) {
-            lblTaskTitle.setText(taskTitle);
+
+            while (messages.size() >= MAX_NUMBER_OF_MESSAGES) {
+                messages.removeFirst();
+            }
+            long now = System.currentTimeMillis();
+            String prevMessageTitle = messages.getLast();
+            if (!prevMessageTitle.isEmpty()) {
+                messages.removeLast();
+                messages.add(tr("{0} ({1} ms)", prevMessageTitle, Long.toString(now - time)));
+            }
+            time = now;
+            if (!taskTitle.isEmpty()) {
+                messages.add(taskTitle);
+            }
+            String html = "";
+            int i = 0;
+            for (String m : messages) {
+                html += "<p class=\"entry" + (++i) + "\">" + m + "</p>";
+            }
+
+            lblTaskTitle.setText("<html><style>"
+                    + ".entry1{color:#CCCCCC;}"
+                    + ".entry2{color:#999999;}"
+                    + ".entry3{color:#000000;}</style>" + html + "</html>");  //update when changing MAX_NUMBER_OF_MESSAGES
             repaint();
         }
