diff --git a/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java b/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
index 9fba4cd..f0f5ea2 100644
--- a/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
+++ b/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
@@ -3,12 +3,11 @@ package org.openstreetmap.josm.testutils;
 
 import java.io.File;
 import java.io.IOException;
+import java.text.MessageFormat;
 import java.util.TimeZone;
 
-import org.junit.rules.DisableOnDebug;
 import org.junit.rules.TemporaryFolder;
 import org.junit.rules.TestRule;
-import org.junit.rules.Timeout;
 import org.junit.runner.Description;
 import org.junit.runners.model.InitializationError;
 import org.junit.runners.model.Statement;
@@ -32,7 +31,7 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
  * @author Michael Zangl
  */
 public class JOSMTestRules implements TestRule {
-    private Timeout timeout = Timeout.seconds(10);
+    private int timeout = 10 * 1000;
     private TemporaryFolder josmHome;
     private boolean usePreferences = false;
     private APIType useAPI = APIType.NONE;
@@ -45,7 +44,7 @@ public class JOSMTestRules implements TestRule {
      * @return this instance, for easy chaining
      */
     public JOSMTestRules noTimeout() {
-        timeout = null;
+        timeout = -1;
         return this;
     }
 
@@ -55,7 +54,7 @@ public class JOSMTestRules implements TestRule {
      * @return this instance, for easy chaining
      */
     public JOSMTestRules timeout(int millis) {
-        timeout = Timeout.millis(millis);
+        timeout = millis;
         return this;
     }
 
@@ -134,21 +133,13 @@ public class JOSMTestRules implements TestRule {
     }
 
     @Override
-    public Statement apply(final Statement base, Description description) {
-        Statement statement = new Statement() {
-            @Override
-            public void evaluate() throws Throwable {
-                before();
-                try {
-                    base.evaluate();
-                } finally {
-                    after();
-                }
-            }
-        };
-        if (timeout != null) {
-            statement = new DisableOnDebug(timeout).apply(statement, description);
+    public Statement apply(Statement base, Description description) {
+        Statement statement = base;
+        if (timeout > 0) {
+            // TODO: new DisableOnDebug(timeout)
+            statement = new FailOnTimeoutStatement(statement, timeout);
         }
+        statement = new CreateJosmEnvironment(statement);
         if (josmHome != null) {
             statement = josmHome.apply(statement, description);
         }
@@ -252,7 +243,84 @@ public class JOSMTestRules implements TestRule {
         System.gc();
     }
 
+    private final class CreateJosmEnvironment extends Statement {
+        private final Statement base;
+
+        private CreateJosmEnvironment(Statement base) {
+            this.base = base;
+        }
+
+        @Override
+        public void evaluate() throws Throwable {
+            before();
+            try {
+                base.evaluate();
+            } finally {
+                after();
+            }
+        }
+    }
+
     enum APIType {
         NONE, FAKE, DEV
     }
+
+    /**
+     * The junit timeout statement has problems when switchting timezones. This one does not.
+     * @author Michael Zangl
+     * @since xxx
+     */
+    private static class FailOnTimeoutStatement extends Statement {
+
+        private int timeout;
+        private Statement original;
+
+        FailOnTimeoutStatement(Statement original, int timeout) {
+            this.original = original;
+            this.timeout = timeout;
+        }
+
+        @Override
+        public void evaluate() throws Throwable {
+            TimeoutThread thread = new TimeoutThread(original);
+            thread.setDaemon(true);
+            thread.start();
+            thread.join(timeout);
+            thread.interrupt();
+            if (!thread.isDone) {
+                Throwable exception = thread.getExecutionException();
+                if (exception != null) {
+                    throw exception;
+                } else {
+                    throw new Exception(MessageFormat.format("Test timed out after {0}ms", timeout));
+                }
+            }
+        }
+
+    }
+
+    private static class TimeoutThread extends Thread {
+        public boolean isDone;
+        private Statement original;
+        private Throwable exceptionCaught;
+
+        private TimeoutThread(Statement original) {
+            super("Timeout runner");
+            this.original = original;
+        }
+
+        public Throwable getExecutionException() {
+            return exceptionCaught;
+        }
+
+        @Override
+        public void run() {
+            try {
+                original.evaluate();
+                isDone = true;
+            } catch (Throwable e) {
+                exceptionCaught = e;
+            }
+        }
+    }
 }
diff --git a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
index 658ba4f..0fcf036 100644
--- a/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ExifReaderTest.java
@@ -34,7 +34,7 @@ public class ExifReaderTest {
      */
     @Rule
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().timeout(60000);
+    public JOSMTestRules test = new JOSMTestRules();
 
     private File orientationSampleFile, directionSampleFile;
 
diff --git a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
index 06803a7..23373d2 100644
--- a/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
@@ -23,6 +23,8 @@ public class DateUtilsTest {
 
     /**
      * Set the timezone and timeout.
+     * <p>
+     * Timeouts need to be disabled because we change the time zone.
      */
     @Rule
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
