Index: /trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java	(revision 14206)
+++ /trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java	(revision 14207)
@@ -8,4 +8,9 @@
 import java.io.File;
 import java.io.IOException;
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
 import java.nio.charset.StandardCharsets;
 import java.security.GeneralSecurityException;
@@ -148,5 +153,5 @@
 
     /**
-     * Enable {@link Main#platform} global variable.
+     * Enable {@code Main#platform} global variable.
      * @return this instance, for easy chaining
      * @deprecated Not needed anymore
@@ -214,5 +219,5 @@
 
     /**
-     * Allow the execution of commands using {@link Main#undoRedo}
+     * Allow the execution of commands using {@code UndoRedoHandler}
      * @return this instance, for easy chaining
      */
@@ -325,5 +330,5 @@
 
     /**
-     * Use the {@link Main#main}, {@code Main.contentPanePrivate}, {@code Main.mainPanel},
+     * Use the {@code Main#main}, {@code Main.contentPanePrivate}, {@code Main.mainPanel},
      *         global variables in this test.
      * @return this instance, for easy chaining
@@ -338,5 +343,5 @@
 
     /**
-     * Use the {@link Main#main}, {@code Main.contentPanePrivate}, {@code Main.mainPanel},
+     * Use the {@code Main#main}, {@code Main.contentPanePrivate}, {@code Main.mainPanel},
      *         global variables in this test.
      * @param mapViewStateMockingRunnable Runnable to use for mocking out any required parts of
@@ -368,4 +373,14 @@
     @Override
     public Statement apply(Statement base, Description description) {
+        // First process any Override* annotations for per-test overrides.
+        // The following only work because "option" methods modify JOSMTestRules in-place
+        final OverrideAssumeRevision overrideAssumeRevision = description.getAnnotation(OverrideAssumeRevision.class);
+        if (overrideAssumeRevision != null) {
+            this.assumeRevision(overrideAssumeRevision.value());
+        }
+        final OverrideTimeout overrideTimeout = description.getAnnotation(OverrideTimeout.class);
+        if (overrideTimeout != null) {
+            this.timeout(overrideTimeout.value());
+        }
         Statement statement = base;
         // counter-intuitively, Statements which need to have their setup routines performed *after* another one need to
@@ -695,3 +710,33 @@
                 getInputArguments().toString().indexOf("-agentlib:jdwp") > 0;
     }
+
+    /**
+     * Override this test's assumed JOSM version (as reported by {@link Version}).
+     * @see JOSMTestRules#assumeRevision(String)
+     */
+    @Documented
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.METHOD)
+    public @interface OverrideAssumeRevision {
+        /**
+         * Returns overriden assumed JOSM version.
+         * @return overriden assumed JOSM version
+         */
+        String value();
+    }
+
+    /**
+     * Override this test's timeout.
+     * @see JOSMTestRules#timeout(int)
+     */
+    @Documented
+    @Retention(RetentionPolicy.RUNTIME)
+    @Target(ElementType.METHOD)
+    public @interface OverrideTimeout {
+        /**
+         * Returns overriden timeout value.
+         * @return overriden timeout value
+         */
+        int value();
+    }
 }
