diff --git a/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java b/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java
index c8dd7c90f1974719726bb0c03cb7bda5001977e0..b8e9e725b64415c8054d8973fd41887613724108 100644
--- a/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java
+++ b/common/source/java/ch/systemsx/cisd/common/time/DateTimeUtils.java
@@ -19,6 +19,8 @@ package ch.systemsx.cisd.common.time;
 import java.text.DateFormat;
 import java.util.Calendar;
 import java.util.Date;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 import org.apache.commons.lang.time.DateUtils;
 
@@ -30,6 +32,16 @@ import org.apache.commons.lang.time.DateUtils;
  */
 public final class DateTimeUtils
 {
+    private static final Pattern secPattern = Pattern.compile("([0-9]+)\\s*(|s|sec)");
+
+    private static final Pattern minPattern = Pattern.compile("([0-9]+) *(m|min)");
+
+    private static final Pattern hourPattern = Pattern.compile("([0-9]+) *(h|hours)");
+
+    private static final Pattern dayPattern = Pattern.compile("([0-9]+) *(d|days)");
+
+    private static final Pattern milliPattern = Pattern.compile("([0-9]+) *(ms|msec)");
+
     /**
      * Returns the time zone in the following form: <code>GMT+01:00</code> (could not be easily
      * performed using {@link DateFormat}).
@@ -96,6 +108,56 @@ public final class DateTimeUtils
         return value + unit;
     }
 
+    /**
+     * Parses a time duration to milli-seconds. The string will be trimmed and white spaces in
+     * between number and unit are ignored. Accepted numbers are:
+     * <ul>
+     * <li>ms, msec: milli-seconds</li>
+     * <li>s, sec or nothing: seconds</li>
+     * <li>m, min: minutes</li>
+     * <li>h, hours: hours</li>
+     * <li>d, days: days</li>
+     * </ul>
+     */
+    public static long parseDurationToMillis(String durationStr)
+    {
+        final String durationStrTrimmed = durationStr.trim();
+        Matcher m;
+        m = secPattern.matcher(durationStrTrimmed);
+        if (m.matches())
+        {
+            return Long.parseLong(m.group(1)) * 1000L;
+        }
+        m = minPattern.matcher(durationStrTrimmed);
+        if (m.matches())
+        {
+            return Long.parseLong(m.group(1)) * 60 * 1000L;
+        }
+        m = hourPattern.matcher(durationStrTrimmed);
+        if (m.matches())
+        {
+            return Long.parseLong(m.group(1)) * 3600 * 1000L;
+        }
+        m = dayPattern.matcher(durationStrTrimmed);
+        if (m.matches())
+        {
+            return Long.parseLong(m.group(1)) * 24 * 3600 * 1000L;
+        }
+        m = dayPattern.matcher(durationStrTrimmed);
+        if (m.matches())
+        {
+            return Long.parseLong(m.group(1)) * 24 * 3600 * 1000L;
+        }
+        m = milliPattern.matcher(durationStrTrimmed);
+        if (m.matches())
+        {
+            return Long.parseLong(m.group(1));
+        }
+
+        throw new IllegalArgumentException(String.format("'%s' is not a valid duration",
+                durationStrTrimmed));
+    }
+
     /**
      * Extends the given <var>date</var> until the end of the day.
      */
diff --git a/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java b/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java
index 2d2ef1d3a4b64c16ef53b1ad66ffa83cf4c6e462..f41f8edd30dcc0ddbc4d3fc58e4093b9a4a2f754 100644
--- a/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java
+++ b/common/sourceTest/java/ch/systemsx/cisd/common/time/DateTimeUtilsTest.java
@@ -48,6 +48,80 @@ public class DateTimeUtilsTest extends AssertJUnit
         assertEquals("1h 1min", DateTimeUtils.renderDuration(61 * 1000 * 60));
         assertEquals("2h 3min", DateTimeUtils.renderDuration(123 * 1000 * 60));
     }
+    
+    @Test
+    public void testParseDurationSecs()
+    {
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51s"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51s "));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("  51s"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 s"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51  s"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51sec"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 sec"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51  sec"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51"));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("51 "));
+        assertEquals(51000L, DateTimeUtils.parseDurationToMillis("  51"));
+    }
+
+    @Test
+    public void testParseDurationMins()
+    {
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6m"));
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6m "));
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("  6m"));
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6 m"));
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6  m"));
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6min"));
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6 min"));
+        assertEquals(360000L, DateTimeUtils.parseDurationToMillis("6  min"));
+    }
+
+    @Test
+    public void testParseDurationHours()
+    {
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6h"));
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6h "));
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("  6h"));
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6 h"));
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6  h"));
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6hours"));
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6 hours"));
+        assertEquals(21600000L, DateTimeUtils.parseDurationToMillis("6  hours"));
+    }
+
+    @Test
+    public void testParseDurationDays()
+    {
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3d"));
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3d "));
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("  3d"));
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3 d"));
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3  d"));
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3days"));
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3 days"));
+        assertEquals(259200000L, DateTimeUtils.parseDurationToMillis("3  days"));
+    }
+
+    @Test
+    public void testParseDurationMillis()
+    {
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("13ms"));
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("13ms "));
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("  13ms"));
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("13 ms"));
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("13  ms"));
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("13msec"));
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("13 msec"));
+        assertEquals(13L, DateTimeUtils.parseDurationToMillis("13  msec"));
+    }
+
+    @Test(expectedExceptions = IllegalArgumentException.class)
+    public void testParseInvalidDuration()
+    {
+        DateTimeUtils.parseDurationToMillis("3867bla");
+    }
 
     @Test
     public void testExtendUntilEndOfDay() throws ParseException