Index: trunk/src/org/openstreetmap/josm/data/validation/Test.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/Test.java	(revision 6353)
+++ trunk/src/org/openstreetmap/josm/data/validation/Test.java	(revision 6354)
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -64,4 +65,8 @@
     /** the progress monitor to use */
     protected ProgressMonitor progressMonitor;
+    
+    /** the start time to compute elapsed time when test finishes */
+    protected long startTime;
+    
     /**
      * Constructor
@@ -87,4 +92,5 @@
      */
     public void initialize() throws Exception {
+        this.startTime = -1;
     }
 
@@ -100,6 +106,9 @@
             this.progressMonitor = progressMonitor;
         }
-        this.progressMonitor.beginTask(tr("Running test {0}", name));
-        errors = new ArrayList<TestError>(30);
+        String startMessage = tr("Running test {0}", name);
+        this.progressMonitor.beginTask(startMessage);
+        Main.debug(startMessage);
+        this.errors = new ArrayList<TestError>(30);
+        this.startTime = System.currentTimeMillis();
     }
 
@@ -130,4 +139,8 @@
         progressMonitor.finishTask();
         progressMonitor = null;
+        if (startTime > 0) {
+            long elapsedTime = System.currentTimeMillis() - startTime;
+            Main.info(tr("Test ''{0}'' completed in {1}", getName(), Utils.getDurationString(elapsedTime)));
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 6353)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 6354)
@@ -151,5 +151,5 @@
      */
     public TagChecker() {
-        super(tr("Tag checker :"), tr("This test checks for errors in tag keys and values."));
+        super(tr("Tag checker"), tr("This test checks for errors in tag keys and values."));
     }
 
@@ -511,5 +511,5 @@
         a.anchor = GridBagConstraints.EAST;
 
-        testPanel.add(new JLabel(name), GBC.eol().insets(3,0,0,0));
+        testPanel.add(new JLabel(name+" :"), GBC.eol().insets(3,0,0,0));
 
         prefCheckKeys = new JCheckBox(tr("Check property keys."), Main.pref.getBoolean(PREF_CHECK_KEYS, true));
Index: trunk/src/org/openstreetmap/josm/tools/Utils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 6353)
+++ trunk/src/org/openstreetmap/josm/tools/Utils.java	(revision 6354)
@@ -1,4 +1,7 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+import static org.openstreetmap.josm.tools.I18n.trn;
 
 import java.awt.Color;
@@ -754,3 +757,34 @@
         return josmTmpDir;
     }
+
+    /**
+     * Returns a simple human readable (hours, minutes, seconds) string for a given duration in milliseconds.
+     * @param elapsedTime The duration in milliseconds
+     * @return A human redable string for the given duration
+     * @throws IllegalArgumentException if elapsedTime is < 0
+     * @since 6354
+     */
+    public static String getDurationString(long elapsedTime) throws IllegalArgumentException {
+        if (elapsedTime < 0) {
+            throw new IllegalArgumentException("elapsedTime must be > 0");
+        }
+        // Is it less than 1 second ?
+        if (elapsedTime < 1000) {
+            return String.format("%d %s", elapsedTime, tr("ms"));
+        }
+        // Is it less than 1 minute ?
+        if (elapsedTime < 60*1000) {
+            return String.format("%.1f %s", elapsedTime/1000f, tr("s"));
+        }
+        // Is it less than 1 hour ?
+        if (elapsedTime < 60*60*1000) {
+            return String.format("%d %s %d %s", elapsedTime/60000, tr("min"), elapsedTime/1000, tr("s"));
+        }
+        // Is it less than 1 day ?
+        if (elapsedTime < 24*60*60*1000) {
+            return String.format("%d %s %d %s", elapsedTime/3600000, tr("h"), elapsedTime/60000, tr("min"));
+        }
+        long days = elapsedTime/86400000;
+        return String.format("%d %s %d %s", days, trn("day", "days", days), elapsedTime/3600000, tr("h"));
+    }
 }
