Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 6776)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 6779)
@@ -501,14 +501,11 @@
         List<Callable<Void>> tasks = new ArrayList<Callable<Void>>();
 
-        tasks.add(new Callable<Void>() {
+        tasks.add(new InitializationTask(tr("Initializing OSM API")) {
 
             @Override
-            public Void call() throws Exception {
+            public void initialize() throws Exception {
                 // 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);
@@ -516,48 +513,37 @@
                     Main.warn(getErrorMessage(Utils.getRootCause(e)));
                 }
-                return null;
             }
         });
 
-        tasks.add(new Callable<Void>() {
+        tasks.add(new InitializationTask(tr("Initializing validator")) {
 
             @Override
-            public Void call() throws Exception {
-                if (initListener != null) {
-                    initListener.updateStatus(tr("Initializing presets"));
-                }
-                TaggingPresetPreference.initialize();
-                // some validator tests require the presets to be initialized
-                // TODO remove this dependency for parallel initialization
-                if (initListener != null) {
-                    initListener.updateStatus(tr("Initializing validator"));
-                }
+            public void initialize() throws Exception {
                 validator = new OsmValidator();
                 MapView.addLayerChangeListener(validator);
-                return null;
             }
         });
 
-        tasks.add(new Callable<Void>() {
+        tasks.add(new InitializationTask(tr("Initializing presets")) {
 
             @Override
-            public Void call() throws Exception {
-                if (initListener != null) {
-                    initListener.updateStatus(tr("Initializing map styles"));
-                }
+            public void initialize() throws Exception {
+                TaggingPresetPreference.initialize();
+            }
+        });
+
+        tasks.add(new InitializationTask(tr("Initializing map styles")) {
+
+            @Override
+            public void initialize() throws Exception {
                 MapPaintPreference.initialize();
-                return null;
             }
         });
 
-        tasks.add(new Callable<Void>() {
+        tasks.add(new InitializationTask(tr("Loading imagery preferences")) {
 
             @Override
-            public Void call() throws Exception {
-                if (initListener != null) {
-                    initListener.updateStatus(tr("Loading imagery preferences"));
-                }
+            public void initialize() throws Exception {
                 ImageryPreference.initialize();
-                return null;
             }
         });
@@ -590,4 +576,27 @@
         contentPanePrivate.updateUI();
 
+    }
+
+    private abstract class InitializationTask implements Callable<Void> {
+
+        private final String name;
+
+        protected InitializationTask(String name) {
+            this.name = name;
+        }
+
+        public abstract void initialize() throws Exception;
+
+        @Override
+        public Void call() throws Exception {
+            if (initListener != null) {
+                initListener.updateStatus(name);
+            }
+            final long startTime = System.currentTimeMillis();
+            initialize();
+            final long elapsedTime = System.currentTimeMillis() - startTime;
+            Main.debug(tr("{0} completed in {1}", name, Utils.getDurationString(elapsedTime)));
+            return null;
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/ValidateAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ValidateAction.java	(revision 6776)
+++ trunk/src/org/openstreetmap/josm/actions/ValidateAction.java	(revision 6779)
@@ -68,4 +68,5 @@
             return;
 
+        OsmValidator.initializeTests();
         OsmValidator.initializeErrorLayer();
 
Index: trunk/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java	(revision 6776)
+++ trunk/src/org/openstreetmap/josm/actions/upload/ValidateUploadHook.java	(revision 6779)
@@ -143,4 +143,5 @@
 
         if (ed.getValue() != 1) {
+            OsmValidator.initializeTests();
             OsmValidator.initializeErrorLayer();
             Main.map.validatorDialog.unfurlDialog();
Index: trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 6776)
+++ trunk/src/org/openstreetmap/josm/data/validation/OsmValidator.java	(revision 6779)
@@ -138,5 +138,4 @@
         checkValidatorDir();
         initializeGridDetail();
-        initializeTests(getTests());
         loadIgnoredErrors(); //FIXME: load only when needed
     }
@@ -295,4 +294,20 @@
     }
 
+    private static boolean testsInitialized = false;
+
+    /**
+     * Initializes all tests if this operations hasn't been performed already.
+     */
+    public static synchronized void initializeTests() {
+        if (!testsInitialized) {
+            Main.debug("Initializing validator tests");
+            final long startTime = System.currentTimeMillis();
+            initializeTests(getTests());
+            testsInitialized = true;
+            final long elapsedTime = System.currentTimeMillis() - startTime;
+            Main.debug("Initializing validator tests completed in " + Utils.getDurationString(elapsedTime));
+        }
+    }
+
     /**
      * Initializes all tests
