diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index 46b1c57..aff5e0d 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -21,6 +21,7 @@ import java.net.URISyntaxException;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
+import java.util.LinkedList;
 import java.util.List;
 import java.util.Map;
 import java.util.StringTokenizer;
@@ -221,20 +222,38 @@ abstract public class Main {
         }
     }
 
+    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();
 
         // We try to establish an API connection early, so that any API
         // 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);
         } catch (Exception x) {
             // ignore any exception here.
         }
 
+        if (initListener != null)
+            initListener.updateStatus(tr("Building main menu"));
         contentPanePrivate.add(panel, BorderLayout.CENTER);
         panel.add(gettingStarted, BorderLayout.CENTER);
         menu = new MainMenu();
@@ -247,10 +266,20 @@ abstract public class Main {
         registerActionShortcut(menu.help, Shortcut.registerShortcut("system:help", tr("Help"),
                 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,6 +292,9 @@ abstract public class Main {
         });
         FeatureAdapter.registerTranslationAdapter(I18n.getTranslationAdapter());
 
+        if (initListener != null)
+            initListener.updateStatus(tr("Updating user interface"));
+
         toolbar.refreshToolbarControl();
 
         toolbar.control.updateUI();
diff --git a/src/org/openstreetmap/josm/gui/MainApplication.java b/src/org/openstreetmap/josm/gui/MainApplication.java
index b5c9555..b833872 100644
--- a/src/org/openstreetmap/josm/gui/MainApplication.java
+++ b/src/org/openstreetmap/josm/gui/MainApplication.java
@@ -209,41 +209,41 @@ public class MainApplication extends Main {
         }
 
         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"));
         JFrame mainFrame = new JFrame(tr("Java OpenStreetMap Editor"));
         Main.parent = mainFrame;
         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);
         splash.dispose();
diff --git a/src/org/openstreetmap/josm/gui/SplashScreen.java b/src/org/openstreetmap/josm/gui/SplashScreen.java
index 4ca46e5..7637e19 100644
--- a/src/org/openstreetmap/josm/gui/SplashScreen.java
+++ b/src/org/openstreetmap/josm/gui/SplashScreen.java
@@ -12,6 +12,8 @@ import java.awt.Insets;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
 
+import java.util.Arrays;
+import java.util.LinkedList;
 import javax.swing.JFrame;
 import javax.swing.JLabel;
 import javax.swing.JPanel;
@@ -132,6 +134,7 @@ public class SplashScreen extends JFrame {
                 public Dimension getPreferredSize() {
                     Dimension d = super.getPreferredSize();
                     if(d.width < 600) d.width = 600;
+                    d.height *= MAX_NUMBER_OF_MESSAGES;
                     return d;
                 }
             }, gc);
@@ -166,8 +169,34 @@ public class SplashScreen extends JFrame {
             repaint();
         }
 
+        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();
+            }
+            if (!taskTitle.isEmpty()) {
+                long now = System.currentTimeMillis();
+                messages.add(tr("{0} ({1} ms)", taskTitle, Long.toString(now - time)));
+                time = now;
+            }
+            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();
         }
 
