diff --git a/tests/autofillservice/src/android/autofillservice/cts/AbstractAutoFillActivity.java b/tests/autofillservice/src/android/autofillservice/cts/AbstractAutoFillActivity.java
index efc0b2c..1de07cc 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/AbstractAutoFillActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/AbstractAutoFillActivity.java
@@ -35,14 +35,14 @@
      * Run an action in the UI thread, and blocks caller until the action is finished.
      */
     public final void syncRunOnUiThread(Runnable action) {
-        syncRunOnUiThread(action, Helper.UI_TIMEOUT_MS);
+        syncRunOnUiThread(action, Timeouts.UI_TIMEOUT.ms());
     }
 
     /**
      * Run an action in the UI thread, and blocks caller until the action is finished or it times
      * out.
      */
-    public final void syncRunOnUiThread(Runnable action, int timeoutMs) {
+    public final void syncRunOnUiThread(Runnable action, long timeoutMs) {
         final CountDownLatch latch = new CountDownLatch(1);
         runOnUiThread(() -> {
             action.run();
diff --git a/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java b/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java
index c049951..5af6bfb 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/AutoFillServiceTestCase.java
@@ -36,6 +36,8 @@
 import org.junit.Before;
 import org.junit.BeforeClass;
 import org.junit.Rule;
+import org.junit.rules.TestWatcher;
+import org.junit.runner.Description;
 import org.junit.runner.RunWith;
 
 /**
@@ -55,7 +57,20 @@
     private static String sRealService;
 
     @Rule
-    public final RetryRule mRetryRule = new RetryRule(2);
+    public final TestWatcher watcher = new TestWatcher() {
+        @Override
+        protected void starting(Description description) {
+            JUnitHelper.setCurrentTestName(description.getDisplayName());
+        }
+
+        @Override
+        protected void finished(Description description) {
+            JUnitHelper.setCurrentTestName(null);
+        }
+    };
+
+    @Rule
+    public final RetryRule mRetryRule = new RetryRule(5);
 
     @Rule
     public final AutofillLoggingTestRule mLoggingRule = new AutofillLoggingTestRule(TAG);
@@ -80,9 +95,13 @@
     private String mLoggingLevel;
 
     protected AutoFillServiceTestCase() {
+        this(sDefaultUiBot);
+    }
+
+    protected AutoFillServiceTestCase(UiBot uiBot) {
         mContext = InstrumentationRegistry.getTargetContext();
         mPackageName = mContext.getPackageName();
-        mUiBot = sDefaultUiBot;
+        mUiBot = uiBot;
     }
 
     @BeforeClass
diff --git a/tests/autofillservice/src/android/autofillservice/cts/AutoFinishSessionTest.java b/tests/autofillservice/src/android/autofillservice/cts/AutoFinishSessionTest.java
index 3367040..43bc24f 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/AutoFinishSessionTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/AutoFinishSessionTest.java
@@ -36,6 +36,8 @@
 import org.junit.Rule;
 import org.junit.Test;
 
+import java.util.concurrent.atomic.AtomicReference;
+
 /**
  * Tests that the session finishes when the views and fragments go away
  */
@@ -62,8 +64,7 @@
 
     // firstRemove and secondRemove run in the UI Thread; firstCheck doesn't
     private void removeViewsBaseTest(@NonNull Runnable firstRemove, @Nullable Runnable firstCheck,
-            @Nullable Runnable secondRemove, String... viewsToSave)
-            throws Exception {
+            @Nullable Runnable secondRemove, String... viewsToSave) throws Exception {
         enableService();
 
         // Set expectations.
@@ -110,11 +111,24 @@
 
     @Test
     public void removeBothViewsToFinishSession() throws Exception {
+        final AtomicReference<Exception> ref = new AtomicReference<>();
         removeViewsBaseTest(
                 () -> ((ViewGroup) mEditText1.getParent()).removeView(mEditText1),
-                () -> mUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_GENERIC),
+                () -> assertSaveNotShowing(ref),
                 () -> ((ViewGroup) mEditText2.getParent()).removeView(mEditText2),
                 "editText1", "editText2");
+        final Exception e = ref.get();
+        if (e != null) {
+            throw e;
+        }
+    }
+
+    private void assertSaveNotShowing(AtomicReference<Exception> ref) {
+        try {
+            mUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_GENERIC);
+        } catch (Exception e) {
+            ref.set(e);
+        }
     }
 
     @Test
diff --git a/tests/autofillservice/src/android/autofillservice/cts/CheckoutActivity.java b/tests/autofillservice/src/android/autofillservice/cts/CheckoutActivity.java
index 84d057d..141b8d0 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/CheckoutActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/CheckoutActivity.java
@@ -117,7 +117,7 @@
         if (sInstance != null) {
             Log.d(TAG, "So long and thanks for all the fish!");
             sInstance.finish();
-            uiBot.assertGoneByRelativeId(ID_CC_NUMBER, Helper.ACTIVITY_RESURRECTION_MS);
+            uiBot.assertGoneByRelativeId(ID_CC_NUMBER, Timeouts.ACTIVITY_RESURRECTION);
         }
     }
 
diff --git a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionTest.java b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionTest.java
index 3514013..92a379c 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionTest.java
@@ -488,9 +488,17 @@
         return new RemoteViews(getContext().getPackageName(), resourceId);
     }
 
+    private UiObject2 assertSaveUiShowing() {
+        try {
+            return mUiBot.assertSaveShowing(SAVE_DATA_TYPE_GENERIC);
+        } catch (Exception e) {
+            throw new RuntimeException(e);
+        }
+    }
+
     private void assertSaveUiWithoutCustomDescriptionIsShown() {
         // First make sure the UI is shown...
-        final UiObject2 saveUi = mUiBot.assertSaveShowing(SAVE_DATA_TYPE_GENERIC);
+        final UiObject2 saveUi = assertSaveUiShowing();
 
         // Then make sure it does not have the custom view on it.
         assertWithMessage("found static_text on SaveUI (%s)", mUiBot.getChildrenAsText(saveUi))
@@ -499,7 +507,7 @@
 
     private UiObject2 assertSaveUiWithCustomDescriptionIsShown() {
         // First make sure the UI is shown...
-        final UiObject2 saveUi = mUiBot.assertSaveShowing(SAVE_DATA_TYPE_GENERIC);
+        final UiObject2 saveUi = assertSaveUiShowing();
 
         // Then make sure it does have the custom view on it...
         final UiObject2 staticText = saveUi.findObject(By.res(mPackageName, "static_text"));
diff --git a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java
index f93792e..7b8a42c 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/CustomDescriptionWithLinkTestCase.java
@@ -265,11 +265,12 @@
         return newCustomDescriptionBuilder(intent).build();
     }
 
-    protected final UiObject2 assertSaveUiWithLinkIsShown(int saveType) {
+    protected final UiObject2 assertSaveUiWithLinkIsShown(int saveType) throws Exception {
         return assertSaveUiWithLinkIsShown(saveType, "DON'T TAP ME!");
     }
 
-    protected final UiObject2 assertSaveUiWithLinkIsShown(int saveType, String expectedText) {
+    protected final UiObject2 assertSaveUiWithLinkIsShown(int saveType, String expectedText)
+            throws Exception {
         // First make sure the UI is shown...
         final UiObject2 saveUi = mUiBot.assertSaveShowing(saveType);
         // Then make sure it does have the custom view with link on it...
diff --git a/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivity.java b/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivity.java
index 3f7664d..24cd5bf 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivity.java
@@ -55,7 +55,7 @@
         syncRunOnUiThread(() -> v.visit(mDialog.mUsernameEditText));
     }
 
-    void launchDialog(UiBot uiBot) {
+    void launchDialog(UiBot uiBot) throws Exception {
         syncRunOnUiThread(() -> mLaunchButton.performClick());
         // TODO: should assert by id, but it's not working
         uiBot.assertShownByText("Username");
diff --git a/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivityTest.java
index 981655d..1b3ac97 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/DialogLauncherActivityTest.java
@@ -77,7 +77,8 @@
         }
     }
 
-    @Test
+    // TODO(b/70813757): re-enable once fixed.
+    // @Test
     public void testAutofill_oneDataset() throws Exception {
         autofillOneDatasetTest(false);
     }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java b/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java
index a035213..a7d3519 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/DisableAutofillTest.java
@@ -16,8 +16,6 @@
 
 package android.autofillservice.cts;
 
-import static com.google.common.truth.Truth.assertThat;
-
 import android.autofillservice.cts.CannedFillResponse.CannedDataset;
 import android.content.Intent;
 import android.os.SystemClock;
@@ -39,14 +37,14 @@
         Helper.preTestCleanup();
     }
 
-    private SimpleSaveActivity startSimpleSaveActivity() {
+    private SimpleSaveActivity startSimpleSaveActivity() throws Exception {
         final Intent intent = new Intent(mContext, SimpleSaveActivity.class);
         mContext.startActivity(intent);
         mUiBot.assertShownByRelativeId(SimpleSaveActivity.ID_LABEL);
         return SimpleSaveActivity.getInstance();
     }
 
-    private PreSimpleSaveActivity startPreSimpleSaveActivity() {
+    private PreSimpleSaveActivity startPreSimpleSaveActivity() throws Exception {
         final Intent intent = new Intent(mContext, PreSimpleSaveActivity.class);
         mContext.startActivity(intent);
         mUiBot.assertShownByRelativeId(PreSimpleSaveActivity.ID_PRE_LABEL);
@@ -129,11 +127,7 @@
             }
 
             // Asserts isEnabled() status.
-            if (action == PostLaunchAction.ASSERT_ENABLED_AND_AUTOFILL) {
-                assertThat(activity.getAutofillManager().isEnabled()).isTrue();
-            } else {
-                assertThat(activity.getAutofillManager().isEnabled()).isFalse();
-            }
+            assertAutofillEnabled(activity, action == PostLaunchAction.ASSERT_ENABLED_AND_AUTOFILL);
         } finally {
             activity.unregisterCallback();
             activity.finish();
@@ -177,11 +171,7 @@
             }
 
             // Asserts isEnabled() status.
-            if (action == PostLaunchAction.ASSERT_ENABLED_AND_AUTOFILL) {
-                assertThat(activity.getAutofillManager().isEnabled()).isTrue();
-            } else {
-                assertThat(activity.getAutofillManager().isEnabled()).isFalse();
-            }
+            assertAutofillEnabled(activity, action == PostLaunchAction.ASSERT_ENABLED_AND_AUTOFILL);
         } finally {
             activity.unregisterCallback();
             activity.finish();
@@ -214,7 +204,7 @@
         enableService();
 
         // Need to wait the equivalent of launching 2 activities, plus some extra legging room
-        final long duration = 2 * Helper.ACTIVITY_RESURRECTION_MS + 500;
+        final long duration = 2 * Timeouts.ACTIVITY_RESURRECTION.ms() + 500;
 
         // Set expectations.
         sReplier.addResponse(new CannedFillResponse.Builder().disableAutofill(duration).build());
@@ -282,7 +272,7 @@
         enableService();
 
         // Need to wait the equivalent of launching 2 activities, plus some extra legging room
-        final long duration = 2 * Helper.ACTIVITY_RESURRECTION_MS + 500;
+        final long duration = 2 * Timeouts.ACTIVITY_RESURRECTION.ms() + 500;
 
         // Set expectations.
         sReplier.addResponse(new CannedFillResponse.Builder()
@@ -327,4 +317,14 @@
         // Try again on activity that disabled it.
         launchSimpleSaveActivity(PostLaunchAction.ASSERT_ENABLED_AND_AUTOFILL);
     }
+
+    private void assertAutofillEnabled(AbstractAutoFillActivity activity, boolean expected)
+            throws Exception {
+        Timeouts.ACTIVITY_RESURRECTION.run(
+                "assertAutofillEnabled(" + activity.getComponentName().flattenToShortString() + ")",
+                () -> {
+                    return activity.getAutofillManager().isEnabled() == expected
+                            ? Boolean.TRUE : null;
+                });
+    }
 }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/DuplicateIdActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/DuplicateIdActivityTest.java
index ea48f19..f6a0a66 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/DuplicateIdActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/DuplicateIdActivityTest.java
@@ -46,7 +46,7 @@
     private DuplicateIdActivity mActivity;
 
     @Before
-    public void setup() {
+    public void setup() throws Exception {
         Helper.disableAutoRotation(mUiBot);
         mUiBot.setScreenOrientation(0);
 
diff --git a/tests/autofillservice/src/android/autofillservice/cts/EditDistanceScorerTest.java b/tests/autofillservice/src/android/autofillservice/cts/EditDistanceScorerTest.java
index 2534c9e..0afa747 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/EditDistanceScorerTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/EditDistanceScorerTest.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static com.google.common.truth.Truth.assertThat;
+import static android.autofillservice.cts.Helper.assertFloat;
 
 import android.service.autofill.EditDistanceScorer;
 import android.support.test.runner.AndroidJUnit4;
@@ -32,43 +32,43 @@
 
     @Test
     public void testGetScore_nullValue() {
-        assertThat(mScorer.getScore(null, "D'OH!")).isWithin(0);
+        assertFloat(mScorer.getScore(null, "D'OH!"), 0);
     }
 
     @Test
     public void testGetScore_nonTextValue() {
-        assertThat(mScorer.getScore(AutofillValue.forToggle(true), "D'OH!")).isWithin(0);
+        assertFloat(mScorer.getScore(AutofillValue.forToggle(true), "D'OH!"), 0);
     }
 
     @Test
     public void testGetScore_nullUserData() {
-        assertThat(mScorer.getScore(AutofillValue.forText("D'OH!"), null)).isWithin(0);
+        assertFloat(mScorer.getScore(AutofillValue.forText("D'OH!"), null), 0);
     }
 
     @Test
     public void testGetScore_fullMatch() {
-        assertThat(mScorer.getScore(AutofillValue.forText("D'OH!"), "D'OH!")).isWithin(1);
+        assertFloat(mScorer.getScore(AutofillValue.forText("D'OH!"), "D'OH!"), 1);
     }
 
     @Test
     public void testGetScore_fullMatchMixedCase() {
-        assertThat(mScorer.getScore(AutofillValue.forText("D'OH!"), "D'oH!")).isWithin(1);
+        assertFloat(mScorer.getScore(AutofillValue.forText("D'OH!"), "D'oH!"), 1);
     }
 
     // TODO(b/70291841): might need to change it once it supports different sizes
     @Test
     public void testGetScore_mismatchDifferentSizes() {
-        assertThat(mScorer.getScore(AutofillValue.forText("One"), "MoreThanOne")).isWithin(0);
-        assertThat(mScorer.getScore(AutofillValue.forText("MoreThanOne"), "One")).isWithin(0);
+        assertFloat(mScorer.getScore(AutofillValue.forText("One"), "MoreThanOne"), 0);
+        assertFloat(mScorer.getScore(AutofillValue.forText("MoreThanOne"), "One"), 0);
     }
 
     @Test
     public void testGetScore_partialMatch() {
-        assertThat(mScorer.getScore(AutofillValue.forText("Dude"), "Dxxx")).isWithin(0.25F);
-        assertThat(mScorer.getScore(AutofillValue.forText("Dude"), "DUxx")).isWithin(0.50F);
-        assertThat(mScorer.getScore(AutofillValue.forText("Dude"), "DUDx")).isWithin(0.75F);
-        assertThat(mScorer.getScore(AutofillValue.forText("Dxxx"), "Dude")).isWithin(0.25F);
-        assertThat(mScorer.getScore(AutofillValue.forText("DUxx"), "Dude")).isWithin(0.50F);
-        assertThat(mScorer.getScore(AutofillValue.forText("DUDx"), "Dude")).isWithin(0.75F);
+        assertFloat(mScorer.getScore(AutofillValue.forText("Dude"), "Dxxx"), 0.25F);
+        assertFloat(mScorer.getScore(AutofillValue.forText("Dude"), "DUxx"), 0.50F);
+        assertFloat(mScorer.getScore(AutofillValue.forText("Dude"), "DUDx"), 0.75F);
+        assertFloat(mScorer.getScore(AutofillValue.forText("Dxxx"), "Dude"), 0.25F);
+        assertFloat(mScorer.getScore(AutofillValue.forText("DUxx"), "Dude"), 0.50F);
+        assertFloat(mScorer.getScore(AutofillValue.forText("DUDx"), "Dude"), 0.75F);
     }
 }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/FillEventHistoryTest.java b/tests/autofillservice/src/android/autofillservice/cts/FillEventHistoryTest.java
index f8f116f..865b2e2 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/FillEventHistoryTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/FillEventHistoryTest.java
@@ -432,6 +432,7 @@
 
         // Launch activity B
         mContext.startActivity(new Intent(mContext, CheckoutActivity.class));
+        mUiBot.assertShownByRelativeId(ID_CC_NUMBER);
 
         // Trigger autofill on activity B
         sReplier.addResponse(new CannedFillResponse.Builder()
diff --git a/tests/autofillservice/src/android/autofillservice/cts/FragmentContainerActivity.java b/tests/autofillservice/src/android/autofillservice/cts/FragmentContainerActivity.java
index 7be4496..2e84a32 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/FragmentContainerActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/FragmentContainerActivity.java
@@ -71,10 +71,10 @@
     }
 
     public boolean waitUntilResumed() throws InterruptedException {
-        return mResumed.await(Helper.UI_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        return mResumed.await(Timeouts.UI_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
     }
 
     public boolean waitUntilStopped() throws InterruptedException {
-        return mStopped.await(Helper.UI_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        return mStopped.await(Timeouts.UI_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
     }
 }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/Helper.java b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
index 3f0c59d..444a0bd 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/Helper.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/Helper.java
@@ -88,66 +88,6 @@
 
     private static final String CMD_LIST_SESSIONS = "cmd autofill list sessions";
 
-    /**
-     * Timeout (in milliseconds) until framework binds / unbinds from service.
-     */
-    static final long CONNECTION_TIMEOUT_MS = 2000;
-
-    /**
-     * Timeout (in milliseconds) until framework unbinds from a service.
-     */
-    static final long IDLE_UNBIND_TIMEOUT_MS = 5000;
-
-    /**
-     * Timeout (in milliseconds) for expected auto-fill requests.
-     */
-    static final long FILL_TIMEOUT_MS = 2000;
-
-    /**
-     * Timeout (in milliseconds) for expected save requests.
-     */
-    static final long SAVE_TIMEOUT_MS = 5000;
-
-    /**
-     * Time to wait if a UI change is not expected
-     */
-    static final long NOT_SHOWING_TIMEOUT_MS = 500;
-
-    /**
-     * Timeout (in milliseconds) for UI operations. Typically used by {@link UiBot}.
-     */
-    static final int UI_TIMEOUT_MS = 2000;
-
-    /**
-     * Timeout (in milliseconds) for showing the autofill dataset picker UI.
-     *
-     * <p>The value is usually higher than {@link #UI_TIMEOUT_MS} because the performance of the
-     * dataset picker UI can be affect by external factors in some low-level devices.
-     *
-     * <p>Typically used by {@link UiBot}.
-     */
-    static final int UI_DATASET_PICKER_TIMEOUT_MS = 4000;
-
-    /**
-     * Timeout (in milliseconds) for an activity to be brought out to top.
-     */
-    static final int ACTIVITY_RESURRECTION_MS = 5000;
-
-    /**
-     * Timeout (in milliseconds) for changing the screen orientation.
-     */
-    static final int UI_SCREEN_ORIENTATION_TIMEOUT_MS = 5000;
-
-    /**
-     * Timeout (in milliseconds) for using Recents to swtich activities.
-     */
-    static final int UI_RECENTS_SWITCH_TIMEOUT_MS = 200;
-
-    /**
-     * Time to wait in between retries
-     */
-    static final int RETRY_MS = 100;
-
     private final static String ACCELLEROMETER_CHANGE =
             "content insert --uri content://settings/system --bind name:s:accelerometer_rotation "
                     + "--bind value:i:%d";
@@ -188,40 +128,6 @@
     };
 
     /**
-     * Runs a {@code r}, ignoring all {@link RuntimeException} and {@link Error} until the
-     * {@link #UI_TIMEOUT_MS} is reached.
-     */
-    static void eventually(Runnable r) throws Exception {
-        eventually(r, UI_TIMEOUT_MS);
-    }
-
-    /**
-     * Runs a {@code r}, ignoring all {@link RuntimeException} and {@link Error} until the
-     * {@code timeout} is reached.
-     */
-    static void eventually(Runnable r, int timeout) throws Exception {
-        long startTime = System.currentTimeMillis();
-
-        while (true) {
-            try {
-                r.run();
-                break;
-            } catch (RuntimeException | Error e) {
-                if (System.currentTimeMillis() - startTime < timeout) {
-                    if (VERBOSE) Log.v(TAG, "Ignoring", e);
-                    Thread.sleep(RETRY_MS);
-                } else {
-                    if (e instanceof RetryableException) {
-                        throw e;
-                    } else {
-                        throw new RetryableException(e, "Timedout out after %d ms", timeout);
-                    }
-                }
-            }
-        }
-    }
-
-    /**
      * Runs a Shell command, returning a trimmed response.
      */
     static String runShellCommand(String template, Object...args) {
@@ -746,7 +652,7 @@
     /**
      * Prevents the screen to rotate by itself
      */
-    public static void disableAutoRotation(UiBot uiBot) {
+    public static void disableAutoRotation(UiBot uiBot) throws Exception {
         runShellCommand(ACCELLEROMETER_CHANGE, 0);
         uiBot.setScreenOrientation(PORTRAIT);
     }
@@ -763,28 +669,21 @@
      *
      * @return The pid of the process
      */
-    public static int getOutOfProcessPid(@NonNull String processName) {
-        long startTime = System.currentTimeMillis();
+    public static int getOutOfProcessPid(@NonNull String processName, @NonNull Timeout timeout)
+            throws Exception {
 
-        while (System.currentTimeMillis() - startTime <= UI_TIMEOUT_MS) {
-            String[] allProcessDescs = runShellCommand("ps -eo PID,ARGS=CMD").split("\n");
+        return timeout.run("getOutOfProcessPid(" + processName + ")", () -> {
+            final String[] allProcessDescs = runShellCommand("ps -eo PID,ARGS=CMD").split("\n");
 
             for (String processDesc : allProcessDescs) {
-                String[] pidAndName = processDesc.trim().split(" ");
+                final String[] pidAndName = processDesc.trim().split(" ");
 
                 if (pidAndName[1].equals(processName)) {
                     return Integer.parseInt(pidAndName[0]);
                 }
             }
-
-            try {
-                Thread.sleep(RETRY_MS);
-            } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-            }
-        }
-
-        throw new IllegalStateException("process not found");
+            return null;
+        });
     }
 
     /**
@@ -885,11 +784,15 @@
      * Asserts that there is no session left in the service.
      */
     public static void assertNoDanglingSessions() {
-        final String result = runShellCommand(CMD_LIST_SESSIONS);
+        final String result = listSessions();
         assertWithMessage("Dangling sessions ('%s'): %s'", CMD_LIST_SESSIONS, result).that(result)
                 .isEmpty();
     }
 
+    public static String listSessions() {
+        return runShellCommand(CMD_LIST_SESSIONS);
+    }
+
     /**
      * Asserts that there is a pending session for the given package.
      */
@@ -1237,7 +1140,12 @@
         return componentName.flattenToShortString();
     }
 
+    public static void assertFloat(float actualValue, float expectedValue) {
+        assertThat(actualValue).isWithin(1.0e-10f).of(expectedValue);
+    }
+
     private Helper() {
+        throw new UnsupportedOperationException("contain static methods only");
     }
 
     static class FieldClassificationResult {
diff --git a/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java b/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java
index 6be3476..4800d64 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/InstrumentedAutoFillService.java
@@ -18,13 +18,13 @@
 
 import static android.autofillservice.cts.CannedFillResponse.ResponseType.NULL;
 import static android.autofillservice.cts.CannedFillResponse.ResponseType.TIMEOUT;
-import static android.autofillservice.cts.Helper.CONNECTION_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.IDLE_UNBIND_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.SAVE_TIMEOUT_MS;
 import static android.autofillservice.cts.Helper.dumpAutofillService;
 import static android.autofillservice.cts.Helper.dumpStructure;
 import static android.autofillservice.cts.Helper.getActivityName;
+import static android.autofillservice.cts.Timeouts.CONNECTION_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.IDLE_UNBIND_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.SAVE_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -155,12 +155,15 @@
      * block until the service receives a callback, it should use
      * {@link Replier#getNextFillRequest()} instead.
      */
-    static void waitUntilConnected() throws InterruptedException {
-        final String state = sConnectionStates.poll(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        if (state == null) {
-            dumpAutofillService();
-            throw new RetryableException("not connected in %d ms", CONNECTION_TIMEOUT_MS);
-        }
+    static void waitUntilConnected() throws Exception {
+        final String state = CONNECTION_TIMEOUT.run("waitUntilConnected()", () -> {
+            final String polled =
+                    sConnectionStates.poll(CONNECTION_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+            if (polled == null) {
+                dumpAutofillService();
+            }
+            return polled;
+        });
         assertWithMessage("Invalid connection state").that(state).isEqualTo(STATE_CONNECTED);
     }
 
@@ -170,12 +173,10 @@
      * <p>This method is useful on tests that explicitly verifies the connection, but should be
      * avoided in other tests, as it adds extra time to the test execution.
      */
-    static void waitUntilDisconnected() throws InterruptedException {
-        final String state = sConnectionStates.poll(2 * IDLE_UNBIND_TIMEOUT_MS,
-                TimeUnit.MILLISECONDS);
-        if (state == null) {
-            throw new RetryableException("not disconnected in %d ms", IDLE_UNBIND_TIMEOUT_MS);
-        }
+    static void waitUntilDisconnected() throws Exception {
+        final String state = IDLE_UNBIND_TIMEOUT.run("waitUntilDisconnected()", () -> {
+            return sConnectionStates.poll(2 * IDLE_UNBIND_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        });
         assertWithMessage("Invalid connection state").that(state).isEqualTo(STATE_DISCONNECTED);
     }
 
@@ -320,10 +321,10 @@
          * <p>Typically called at the end of a test case, to assert the initial request.
          */
         FillRequest getNextFillRequest() throws InterruptedException {
-            final FillRequest request = mFillRequests.poll(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+            final FillRequest request =
+                    mFillRequests.poll(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
             if (request == null) {
-                throw new RetryableException("onFillRequest() not called in %s ms",
-                        FILL_TIMEOUT_MS);
+                throw new RetryableException(FILL_TIMEOUT, "onFillRequest() not called");
             }
             return request;
         }
@@ -351,10 +352,10 @@
          * <p>Typically called at the end of a test case, to assert the initial request.
          */
         SaveRequest getNextSaveRequest() throws InterruptedException {
-            final SaveRequest request = mSaveRequests.poll(SAVE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+            final SaveRequest request =
+                    mSaveRequests.poll(SAVE_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
             if (request == null) {
-                throw new RetryableException(
-                        "onSaveRequest() not called in %d ms", SAVE_TIMEOUT_MS);
+                throw new RetryableException(SAVE_TIMEOUT, "onSaveRequest() not called");
             }
             return request;
         }
@@ -386,7 +387,7 @@
             try {
                 CannedFillResponse response = null;
                 try {
-                    response = mResponses.poll(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+                    response = mResponses.poll(CONNECTION_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
                 } catch (InterruptedException e) {
                     Log.w(TAG, "Interrupted getting CannedResponse: " + e);
                     Thread.currentThread().interrupt();
diff --git a/tests/autofillservice/src/android/autofillservice/cts/JUnitHelper.java b/tests/autofillservice/src/android/autofillservice/cts/JUnitHelper.java
new file mode 100644
index 0000000..3d70bd0
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/JUnitHelper.java
@@ -0,0 +1,40 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.autofillservice.cts;
+
+import android.support.annotation.NonNull;
+
+/**
+ * Generic helper for JUnit needs.
+ */
+public final class JUnitHelper {
+
+    private static String sCurrentTestNamer;
+
+    @NonNull
+    static String getCurrentTestName() {
+        return sCurrentTestNamer != null ? sCurrentTestNamer : "N/A";
+    }
+
+    public static void setCurrentTestName(String name) {
+        sCurrentTestNamer = name;
+    }
+
+    private JUnitHelper() {
+        throw new UnsupportedOperationException("contain static methods only");
+    }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
index 18e95e4..cc4b88a 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/LoginActivityTest.java
@@ -1334,7 +1334,7 @@
         saveGoesAway(DismissType.TOUCH_OUTSIDE);
     }
 
-    private void startCheckoutActivityAsNewTask() {
+    private void startCheckoutActivityAsNewTask() throws Exception {
         final Intent intent = new Intent(mContext, CheckoutActivity.class);
         intent.setFlags(
                 Intent.FLAG_ACTIVITY_NEW_DOCUMENT | Intent.FLAG_ACTIVITY_RETAIN_IN_RECENTS);
@@ -3586,7 +3586,7 @@
 
         // Set expectations.
         final OneTimeCancellationSignalListener listener =
-                new OneTimeCancellationSignalListener(Helper.FILL_TIMEOUT_MS + 2000);
+                new OneTimeCancellationSignalListener(Timeouts.FILL_TIMEOUT.ms() + 2000);
         sReplier.addResponse(DO_NOT_REPLY_RESPONSE);
 
         // Trigger auto-fill.
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MultipleFragmentLoginTest.java b/tests/autofillservice/src/android/autofillservice/cts/MultipleFragmentLoginTest.java
index e3afa94..8da4add 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MultipleFragmentLoginTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MultipleFragmentLoginTest.java
@@ -18,8 +18,6 @@
 
 import static android.autofillservice.cts.CannedFillResponse.NO_RESPONSE;
 import static android.autofillservice.cts.FragmentContainerActivity.FRAGMENT_TAG;
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.eventually;
 import static android.autofillservice.cts.Helper.findNodeByResourceId;
 import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_GENERIC;
 
@@ -70,18 +68,12 @@
                 new InstrumentedAutoFillService.FillRequest[1];
 
         // Trigger autofill
-        eventually(() -> {
-            mActivity.syncRunOnUiThread(() -> {
-                mEditText2.requestFocus();
-                mEditText1.requestFocus();
-            });
+        mActivity.syncRunOnUiThread(() -> {
+            mEditText2.requestFocus();
+            mEditText1.requestFocus();
+        });
 
-            try {
-                fillRequest[0] = sReplier.getNextFillRequest();
-            } catch (InterruptedException e) {
-                throw new RuntimeException(e);
-            }
-        }, (int) (FILL_TIMEOUT_MS * 2));
+        fillRequest[0] = sReplier.getNextFillRequest();
 
         assertThat(fillRequest[0].data).isNull();
 
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesRadioGroupListener.java b/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesRadioGroupListener.java
index 8e8c7e0..5af2762 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesRadioGroupListener.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesRadioGroupListener.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -49,8 +49,8 @@
     }
 
     void assertAutoFilled() throws Exception {
-        final boolean set = mLatch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertWithMessage("Timeout (%s ms) on RadioGroup %s", FILL_TIMEOUT_MS, mName)
+        final boolean set = mLatch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        assertWithMessage("Timeout (%s ms) on RadioGroup %s", FILL_TIMEOUT.ms(), mName)
             .that(set).isTrue();
         final int actual = mRadioGroup.getAutofillValue().getListValue();
         assertWithMessage("Wrong auto-fill value on RadioGroup %s", mName)
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTextWatcher.java b/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTextWatcher.java
index c928f31..a510639 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTextWatcher.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTextWatcher.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -62,8 +62,8 @@
     }
 
     void assertAutoFilled() throws Exception {
-        final boolean set = mLatch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertWithMessage("Timeout (%s ms) on EditText %s", FILL_TIMEOUT_MS, mName)
+        final boolean set = mLatch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        assertWithMessage("Timeout (%s ms) on EditText %s", FILL_TIMEOUT.ms(), mName)
                 .that(set).isTrue();
         final String actual = mEditText.getText().toString();
         assertWithMessage("Wrong auto-fill value on EditText %s", mName)
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTimeListener.java b/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTimeListener.java
index 1aed119..2519aec 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTimeListener.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MultipleTimesTimeListener.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -50,8 +50,8 @@
     }
 
     void assertAutoFilled() throws Exception {
-        final boolean set = latch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertWithMessage("Timeout (%s ms) on TimePicker %s", FILL_TIMEOUT_MS, name)
+        final boolean set = latch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        assertWithMessage("Timeout (%s ms) on TimePicker %s", FILL_TIMEOUT.ms(), name)
                 .that(set).isTrue();
         assertWithMessage("Wrong hour on TimePicker %s", name)
                 .that(timePicker.getHour()).isEqualTo(expectedHour);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java b/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java
index 50d1d6c..3d6acc9 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MyAutofillCallback.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.CONNECTION_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.CONNECTION_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -52,9 +52,9 @@
      * Gets the next available event or fail if it times out.
      */
     MyEvent getEvent() throws InterruptedException {
-        final MyEvent event = mEvents.poll(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        final MyEvent event = mEvents.poll(CONNECTION_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
         if (event == null) {
-            throw new RetryableException("no event in %d ms", CONNECTION_TIMEOUT_MS);
+            throw new RetryableException(CONNECTION_TIMEOUT, "no event");
         }
         return event;
     }
@@ -63,7 +63,7 @@
      * Assert no more events were received.
      */
     void assertNotCalled() throws InterruptedException {
-        final MyEvent event = mEvents.poll(CONNECTION_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        final MyEvent event = mEvents.poll(CONNECTION_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
         if (event != null) {
             // Not retryable.
             throw new IllegalStateException("should not have received " + event);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/MyWebView.java b/tests/autofillservice/src/android/autofillservice/cts/MyWebView.java
index fa233dd..410a267 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/MyWebView.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/MyWebView.java
@@ -15,7 +15,7 @@
  */
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -45,11 +45,11 @@
 
     public void assertAutofilled() throws Exception {
         assertWithMessage("expectAutofill() not called").that(mExpectation).isNotNull();
-        final boolean set = mExpectation.mLatch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        final boolean set = mExpectation.mLatch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
         if (mExpectation.mException != null) {
             throw mExpectation.mException;
         }
-        assertWithMessage("Timeout (%s ms) expecting autofill()", FILL_TIMEOUT_MS)
+        assertWithMessage("Timeout (%s ms) expecting autofill()", FILL_TIMEOUT.ms())
                 .that(set).isTrue();
         assertWithMessage("Wrong value for username").that(mExpectation.mActualUsername)
                 .isEqualTo(mExpectation.mExpectedUsername);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/OneTimeCompoundButtonListener.java b/tests/autofillservice/src/android/autofillservice/cts/OneTimeCompoundButtonListener.java
index 071dec6..4d7af94 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/OneTimeCompoundButtonListener.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/OneTimeCompoundButtonListener.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -48,8 +48,8 @@
     }
 
     void assertAutoFilled() throws Exception {
-        final boolean set = latch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertWithMessage("Timeout (%s ms) on CompoundButton %s", FILL_TIMEOUT_MS, name)
+        final boolean set = latch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        assertWithMessage("Timeout (%s ms) on CompoundButton %s", FILL_TIMEOUT.ms(), name)
             .that(set).isTrue();
         final boolean actual = button.isChecked();
         assertWithMessage("Wrong auto-fill value on CompoundButton %s", name)
diff --git a/tests/autofillservice/src/android/autofillservice/cts/OneTimeDateListener.java b/tests/autofillservice/src/android/autofillservice/cts/OneTimeDateListener.java
index ef28a23..407861d 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/OneTimeDateListener.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/OneTimeDateListener.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -51,8 +51,8 @@
     }
 
     void assertAutoFilled() throws Exception {
-        final boolean set = latch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertWithMessage("Timeout (%s ms) on DatePicker %s", FILL_TIMEOUT_MS, name)
+        final boolean set = latch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        assertWithMessage("Timeout (%s ms) on DatePicker %s", FILL_TIMEOUT.ms(), name)
             .that(set).isTrue();
         assertWithMessage("Wrong year on DatePicker %s", name)
             .that(datePicker.getYear()).isEqualTo(expectedYear);
diff --git a/tests/autofillservice/src/android/autofillservice/cts/OneTimeRadioGroupListener.java b/tests/autofillservice/src/android/autofillservice/cts/OneTimeRadioGroupListener.java
index 1903cb9..73ed648 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/OneTimeRadioGroupListener.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/OneTimeRadioGroupListener.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -47,8 +47,8 @@
     }
 
     void assertAutoFilled() throws Exception {
-        final boolean set = latch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertWithMessage("Timeout (%s ms) on RadioGroup %s", FILL_TIMEOUT_MS, name)
+        final boolean set = latch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        assertWithMessage("Timeout (%s ms) on RadioGroup %s", FILL_TIMEOUT.ms(), name)
             .that(set).isTrue();
         final int actual = radioGroup.getCheckedRadioButtonId();
         assertWithMessage("Wrong auto-fill value on RadioGroup %s", name)
diff --git a/tests/autofillservice/src/android/autofillservice/cts/OneTimeSpinnerListener.java b/tests/autofillservice/src/android/autofillservice/cts/OneTimeSpinnerListener.java
index 6bc8279..5fb5973 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/OneTimeSpinnerListener.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/OneTimeSpinnerListener.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -44,8 +44,8 @@
     }
 
     void assertAutoFilled() throws Exception {
-        final boolean set = latch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-        assertWithMessage("Timeout (%s ms) on Spinner %s", FILL_TIMEOUT_MS, name)
+        final boolean set = latch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+        assertWithMessage("Timeout (%s ms) on Spinner %s", FILL_TIMEOUT.ms(), name)
             .that(set).isTrue();
         final int actual = spinner.getSelectedItemPosition();
         assertWithMessage("Wrong auto-fill value on Spinner %s", name)
diff --git a/tests/autofillservice/src/android/autofillservice/cts/RetryRule.java b/tests/autofillservice/src/android/autofillservice/cts/RetryRule.java
index bcfba92..2de94f8 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/RetryRule.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/RetryRule.java
@@ -45,18 +45,24 @@
 
             @Override
             public void evaluate() throws Throwable {
+                final String name = description.getDisplayName();
                 Throwable caught = null;
                 for (int i = 1; i <= mMaxAttempts; i++) {
                     try {
                         base.evaluate();
                         return;
-                    } catch (RetryableException | StaleObjectException e) {
+                    } catch (RetryableException e) {
+                        final Timeout timeout = e.getTimeout();
+                        if (timeout != null) {
+                            timeout.increase();
+                        }
                         caught = e;
-                        Log.w(TAG,
-                                description.getDisplayName() + ": attempt " + i + " failed: " + e);
+                    } catch (StaleObjectException e) {
+                        caught = e;
                     }
+                    Log.w(TAG, name + ": attempt " + i + " failed: " + caught);
                 }
-                Log.e(TAG, description.getDisplayName() + ": giving up after " + mMaxAttempts);
+                Log.e(TAG, name + ": giving up after " + mMaxAttempts + " attempts");
                 throw caught;
             }
         };
diff --git a/tests/autofillservice/src/android/autofillservice/cts/RetryRuleTest.java b/tests/autofillservice/src/android/autofillservice/cts/RetryRuleTest.java
index 3b733f6..473ec4e 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/RetryRuleTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/RetryRuleTest.java
@@ -68,6 +68,17 @@
     }
 
     @Test
+    public void testPassOnRetryableExceptionWithTimeout() throws Throwable {
+        final Timeout timeout = new Timeout("YOUR TIME IS GONE", 1, 2, 10);
+        final RetryableException exception = new RetryableException(timeout, "Y U NO?");
+        final RetryRule rule = new RetryRule(2);
+        rule.apply(new RetryableStatement<RetryableException>(1, exception), mDescription)
+                .evaluate();
+        // Assert timeout was increased
+        assertThat(timeout.ms()).isEqualTo(2);
+    }
+
+    @Test
     public void testFailOnRetryableException() throws Throwable {
         final RetryRule rule = new RetryRule(2);
         try {
diff --git a/tests/autofillservice/src/android/autofillservice/cts/RetryableException.java b/tests/autofillservice/src/android/autofillservice/cts/RetryableException.java
index 7ca7d62..55b4d5c 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/RetryableException.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/RetryableException.java
@@ -16,20 +16,52 @@
 
 package android.autofillservice.cts;
 
+import android.support.annotation.Nullable;
+
 /**
  * Exception that cause the {@link RetryRule} to re-try a test.
  */
 public class RetryableException extends RuntimeException {
 
+    @Nullable
+    private final Timeout mTimeout;
+
     public RetryableException(String msg) {
-        super(msg);
+        this((Timeout) null, msg);
     }
 
     public RetryableException(String format, Object...args) {
-        super(String.format(format, args));
+        this((Timeout) null, String.format(format, args));
     }
 
     public RetryableException(Throwable cause, String format, Object...args) {
+        this((Timeout) null, String.format(format, args), cause);
+    }
+
+    public RetryableException(@Nullable Timeout timeout, String msg) {
+        super(msg);
+        this.mTimeout = timeout;
+    }
+
+    public RetryableException(@Nullable Timeout timeout, String format, Object...args) {
+        super(String.format(format, args));
+        this.mTimeout = timeout;
+    }
+
+    public RetryableException(@Nullable Timeout timeout, Throwable cause, String format,
+            Object...args) {
         super(String.format(format, args), cause);
+        this.mTimeout = timeout;
+    }
+
+    @Nullable
+    public Timeout getTimeout() {
+        return mTimeout;
+    }
+
+    @Override
+    public String getMessage() {
+        final String superMessage = super.getMessage();
+        return mTimeout == null ? superMessage : superMessage + " (timeout=" + mTimeout + ")";
     }
 }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/SessionLifecycleTest.java b/tests/autofillservice/src/android/autofillservice/cts/SessionLifecycleTest.java
index 5dec382..7f1bfda 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/SessionLifecycleTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/SessionLifecycleTest.java
@@ -19,9 +19,7 @@
 import static android.autofillservice.cts.Helper.ID_LOGIN;
 import static android.autofillservice.cts.Helper.ID_PASSWORD;
 import static android.autofillservice.cts.Helper.ID_USERNAME;
-import static android.autofillservice.cts.Helper.assertNoDanglingSessions;
 import static android.autofillservice.cts.Helper.assertTextAndValue;
-import static android.autofillservice.cts.Helper.eventually;
 import static android.autofillservice.cts.Helper.findNodeByResourceId;
 import static android.autofillservice.cts.Helper.getContext;
 import static android.autofillservice.cts.Helper.getOutOfProcessPid;
@@ -46,6 +44,8 @@
 import org.junit.Before;
 import org.junit.Test;
 
+import java.util.concurrent.Callable;
+
 /**
  * Test the lifecycle of a autofill session
  */
@@ -56,6 +56,21 @@
     private static final String BUTTON_FULL_ID = "android.autofillservice.cts:id/button";
     private static final String CANCEL_FULL_ID = "android.autofillservice.cts:id/cancel";
 
+    private static final Timeout SESSION_LIFECYCLE_TIMEOUT = new Timeout(
+            "SESSION_LIFECYCLE_TIMEOUT", 500, 2F, 5000);
+
+    /**
+     * Runs an {@code assertion}, retrying until {@code timeout} is reached.
+     */
+    private static void eventually(String description, Callable<Boolean> assertion)
+            throws Exception {
+        SESSION_LIFECYCLE_TIMEOUT.run(description, assertion);
+    }
+
+    public SessionLifecycleTest() {
+        super(new UiBot(SESSION_LIFECYCLE_TIMEOUT));
+    }
+
     @Before
     public void cleanUpState() {
         Helper.preTestCleanup();
@@ -65,7 +80,7 @@
      * Prevents the screen to rotate by itself
      */
     @Before
-    public void disableAutoRotation() {
+    public void disableAutoRotation() throws Exception {
         Helper.disableAutoRotation(mUiBot);
     }
 
@@ -79,14 +94,17 @@
 
     private void killOfProcessLoginActivityProcess() throws Exception {
         // Waiting for activity to stop (stop marker appears)
-        eventually(() -> assertThat(getStoppedMarker(getContext()).exists()).isTrue());
+        eventually("getStoppedMarker()", () -> {
+            return getStoppedMarker(getContext()).exists();
+        });
 
         // onStop might not be finished, hence wait more
         SystemClock.sleep(1000);
 
         // Kill activity that is in the background
         runShellCommand("kill -9 %d",
-                getOutOfProcessPid("android.autofillservice.cts.outside"));
+                getOutOfProcessPid("android.autofillservice.cts.outside",
+                        SESSION_LIFECYCLE_TIMEOUT));
     }
 
     @Test
@@ -165,8 +183,9 @@
         mUiBot.selectDataset("dataset");
 
         // Check the results.
-        eventually(() -> assertThat(mUiBot.getTextById(USERNAME_FULL_ID)).isEqualTo(
-                "autofilled username"));
+        eventually("getTextById(" + USERNAME_FULL_ID + ")", () -> {
+            return mUiBot.getTextById(USERNAME_FULL_ID).equals("autofilled username");
+        });
 
         // Set password
         mUiBot.setTextById(PASSWORD_FULL_ID, "new password");
@@ -200,7 +219,9 @@
         final String extraValue = saveRequest.data.getString("numbers");
         assertWithMessage("extras not passed on save").that(extraValue).isEqualTo("4815162342");
 
-        eventually(() -> assertNoDanglingSessions());
+        eventually("assert dangling sessions", () -> {
+            return Helper.listSessions().isEmpty();
+        });
     }
 
     @Test
@@ -262,7 +283,7 @@
         CannedFillResponse response = new CannedFillResponse.Builder()
                 .addDataset(new CannedFillResponse.CannedDataset.Builder(
                         createPresentation("dataset"))
-                        .setField(ID_USERNAME, "filled").build())
+                                .setField(ID_USERNAME, "filled").build())
                 .build();
         sReplier.addResponse(response);
 
@@ -308,7 +329,7 @@
         CannedFillResponse response = new CannedFillResponse.Builder()
                 .addDataset(new CannedFillResponse.CannedDataset.Builder(
                         createPresentation("dataset1"))
-                        .setField(ID_USERNAME, "filled").build())
+                                .setField(ID_USERNAME, "filled").build())
                 .build();
         sReplier.addResponse(response);
 
@@ -328,7 +349,7 @@
         response = new CannedFillResponse.Builder()
                 .addDataset(new CannedFillResponse.CannedDataset.Builder(
                         createPresentation("dataset2"))
-                        .setField(ID_USERNAME, "filled").build())
+                                .setField(ID_USERNAME, "filled").build())
                 .build();
         sReplier.addResponse(response);
 
diff --git a/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java
index 82f4f43..f10b394 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/SimpleSaveActivityTest.java
@@ -434,7 +434,7 @@
 
         // Switch back to the activity.
         restartActivity();
-        mUiBot.assertShownByText(TEXT_LABEL, Helper.ACTIVITY_RESURRECTION_MS);
+        mUiBot.assertShownByText(TEXT_LABEL, Timeouts.ACTIVITY_RESURRECTION);
         final UiObject2 datasetPicker = mUiBot.assertDatasets("YO");
         callback.assertUiShownEvent(mActivity.mInput);
 
@@ -484,7 +484,7 @@
 
         // Switch back to the activity.
         restartActivity();
-        mUiBot.assertShownByText(TEXT_LABEL, Helper.ACTIVITY_RESURRECTION_MS);
+        mUiBot.assertShownByText(TEXT_LABEL, Timeouts.ACTIVITY_RESURRECTION);
         mUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_GENERIC);
         sReplier.getNextFillRequest();
         mUiBot.assertNoDatasets();
@@ -715,7 +715,7 @@
                 throw new IllegalArgumentException("invalid type: " + type);
         }
         // Make sure right activity is showing
-        mUiBot.assertShownByRelativeId(ID_INPUT, Helper.ACTIVITY_RESURRECTION_MS);
+        mUiBot.assertShownByRelativeId(ID_INPUT, Timeouts.ACTIVITY_RESURRECTION);
 
         mUiBot.assertSaveNotShowing(SAVE_DATA_TYPE_GENERIC);
     }
diff --git a/tests/autofillservice/src/android/autofillservice/cts/Timeout.java b/tests/autofillservice/src/android/autofillservice/cts/Timeout.java
new file mode 100644
index 0000000..e709dac
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/Timeout.java
@@ -0,0 +1,181 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package android.autofillservice.cts;
+
+import android.os.SystemClock;
+import android.support.annotation.NonNull;
+import android.text.TextUtils;
+import android.util.Log;
+
+import java.util.concurrent.Callable;
+
+/**
+ * A "smart" timeout that supports exponential backoff.
+ */
+//TODO: move to common CTS Code
+public final class Timeout {
+
+    private static final String TAG = "Timeout";
+    private static final boolean VERBOSE = true;
+
+    private final String mName;
+    private long mCurrentValue;
+    private final float mMultiplier;
+    private final long mMaxValue;
+
+    /**
+     * Default constructor.
+     *
+     * @param name name to be used for logging purposes.
+     * @param initialValue initial timeout value, in ms.
+     * @param multiplier multiplier for {@link #increase()}.
+     * @param maxValue max timeout value (in ms) set by {@link #increase()}.
+     *
+     * @throws IllegalArgumentException if {@code name} is {@code null} or empty,
+     * {@code initialValue}, {@code multiplir} or {@code maxValue} are less than {@code 1},
+     * or if {@code initialValue} is higher than {@code maxValue}
+     */
+    public Timeout(String name, long initialValue, float multiplier, long maxValue) {
+        if (initialValue < 1 || maxValue < 1 || initialValue > maxValue) {
+            throw new IllegalArgumentException(
+                    "invalid initial and/or max values: " + initialValue + " and " + maxValue);
+        }
+        if (multiplier <= 1) {
+            throw new IllegalArgumentException("multiplier must be higher than 1: " + multiplier);
+        }
+        if (TextUtils.isEmpty(name)) {
+            throw new IllegalArgumentException("no name");
+        }
+        mName = name;
+        mCurrentValue = initialValue;
+        mMultiplier = multiplier;
+        mMaxValue = maxValue;
+        Log.d(TAG, "Constructor: " + this + " at " + JUnitHelper.getCurrentTestName());
+    }
+
+    /**
+     * Gets the current timeout, in ms.
+     */
+    public long ms() {
+        return mCurrentValue;
+    }
+
+    /**
+     * Gets the max timeout, in ms.
+     */
+    public long getMaxValue() {
+        return mMaxValue;
+    }
+
+    /**
+     * @return the mMultiplier
+     */
+    public float getMultiplier() {
+        return mMultiplier;
+    }
+
+    /**
+     * Gets the user-friendly name of this timeout.
+     */
+    @NonNull
+    public String getName() {
+        return mName;
+    }
+
+    /**
+     * Increases the current value by the {@link #getMultiplier()}, up to {@link #getMaxValue()}.
+     *
+     * @return previous current value.
+     */
+    public long increase() {
+        final long oldValue = mCurrentValue;
+        mCurrentValue = Math.min(mMaxValue, (long) (mCurrentValue * mMultiplier));
+        if (oldValue != mCurrentValue) {
+            Log.w(TAG, mName + " increased from " + oldValue + "ms to " + mCurrentValue + "ms at "
+                    + JUnitHelper.getCurrentTestName());
+        }
+        return oldValue;
+    }
+
+    /**
+     * Runs a {@code job} many times before giving up, sleeping between failed attempts up to
+     * {@link #ms()}.
+     *
+     * @param description description of the job for logging purposes.
+     * @param job job to be run, must return {@code null} if it failed and should be retried.
+     * @throws RetryableException if all attempts failed.
+     * @throws IllegalArgumentException if {@code description} is {@code null} or empty, if
+     * {@code job} is {@code  null}, or if {@code maxAttempts} is less than 1.
+     * @throws Exception any other exception thrown by helper methods.
+     *
+     * @return job's result.
+     */
+    public <T> T run(String description, Callable<T> job) throws Exception {
+        return run(description, 100, job);
+    }
+
+    /**
+     * Runs a {@code job} many times before giving up, sleeping between failed attempts up to
+     * {@link #ms()}.
+     *
+     * @param description description of the job for logging purposes.
+     * @param job job to be run, must return {@code null} if it failed and should be retried.
+     * @param retryMs how long to sleep between failures.
+     * @throws RetryableException if all attempts failed.
+     * @throws IllegalArgumentException if {@code description} is {@code null} or empty, if
+     * {@code job} is {@code  null}, or if {@code maxAttempts} is less than 1.
+     * @throws Exception any other exception thrown by helper methods.
+     *
+     * @return job's result.
+     */
+    public <T> T run(String description, long retryMs, Callable<T> job) throws Exception {
+        if (TextUtils.isEmpty(description)) {
+            throw new IllegalArgumentException("no description");
+        }
+        if (job == null) {
+            throw new IllegalArgumentException("no job");
+        }
+        if (retryMs < 1) {
+            throw new IllegalArgumentException("need to sleep at least 1ms, right?");
+        }
+        long startTime = System.currentTimeMillis();
+        int attempt = 0;
+        while (System.currentTimeMillis() - startTime <= mCurrentValue) {
+            final T result = job.call();
+            if (result != null) {
+                // Good news, everyone: job succeeded on first attempt!
+                return result;
+            }
+            attempt++;
+            if (VERBOSE) {
+                Log.v(TAG, description + " failed at attempt #" + attempt + "; sleeping for "
+                        + retryMs + "ms before trying again");
+            }
+            SystemClock.sleep(retryMs);
+            retryMs *= mMultiplier;
+        }
+        Log.w(TAG, description + " failed after " + attempt + " attempts and "
+                + (System.currentTimeMillis() - startTime) + "ms: " + this);
+        throw new RetryableException(this, description);
+    }
+
+    @Override
+    public String toString() {
+        return mName + ": [current=" + mCurrentValue + "ms; multiplier=" + mMultiplier + "x; max="
+                + mMaxValue + "ms]";
+    }
+
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/TimeoutTest.java b/tests/autofillservice/src/android/autofillservice/cts/TimeoutTest.java
new file mode 100644
index 0000000..69c69e4
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/TimeoutTest.java
@@ -0,0 +1,123 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.autofillservice.cts;
+
+import static android.autofillservice.cts.Helper.assertFloat;
+
+import static com.google.common.truth.Truth.assertThat;
+
+import static org.mockito.Mockito.when;
+import static org.testng.Assert.assertThrows;
+import static org.testng.Assert.expectThrows;
+
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.mockito.Mock;
+import org.mockito.junit.MockitoJUnitRunner;
+
+import java.util.concurrent.Callable;
+
+@RunWith(MockitoJUnitRunner.class)
+public class TimeoutTest {
+
+    private static final String NAME = "TIME, Y U NO OUT?";
+    private static final String DESC = "something";
+
+    @Mock
+    private Callable<Object> mJob;
+
+    @Test
+    public void testInvalidConstructor() {
+        // Invalid name
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(null, 1, 2, 2));
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout("", 1, 2, 2));
+        // Invalid initial value
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, -1, 2, 2));
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, 0, 2, 2));
+        // Invalid multiplier
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, 1, -1, 2));
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, 1, 0, 2));
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, 1, 1, 2));
+        // Invalid max value
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, 1, 2, -1));
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, 1, 2, 0));
+        // Max value cannot be less than initial
+        assertThrows(IllegalArgumentException.class, ()-> new Timeout(NAME, 2, 2, 1));
+    }
+
+    @Test
+    public void testGetters() {
+        final Timeout timeout = new Timeout(NAME, 1, 2, 5);
+        assertThat(timeout.ms()).isEqualTo(1);
+        assertFloat(timeout.getMultiplier(), 2);
+        assertThat(timeout.getMaxValue()).isEqualTo(5);
+        assertThat(timeout.getName()).isEqualTo(NAME);
+    }
+
+    @Test
+    public void testIncrease() {
+        final Timeout timeout = new Timeout(NAME, 1, 2, 5);
+        // Pre-maximum
+        assertThat(timeout.increase()).isEqualTo(1);
+        assertThat(timeout.ms()).isEqualTo(2);
+        assertThat(timeout.increase()).isEqualTo(2);
+        assertThat(timeout.ms()).isEqualTo(4);
+        // Post-maximum
+        assertThat(timeout.increase()).isEqualTo(4);
+        assertThat(timeout.ms()).isEqualTo(5);
+        assertThat(timeout.increase()).isEqualTo(5);
+        assertThat(timeout.ms()).isEqualTo(5);
+    }
+
+    @Test
+    public void testRun_invalidArgs() {
+        final Timeout timeout = new Timeout(NAME, 1, 2, 5);
+        // Invalid description
+        assertThrows(IllegalArgumentException.class, ()-> timeout.run(null, mJob));
+        assertThrows(IllegalArgumentException.class, ()-> timeout.run("", mJob));
+        // Invalid max attempts
+        assertThrows(IllegalArgumentException.class, ()-> timeout.run(DESC, -1, mJob));
+        assertThrows(IllegalArgumentException.class, ()-> timeout.run(DESC, 0, mJob));
+        // Invalid job
+        assertThrows(IllegalArgumentException.class, ()-> timeout.run(DESC, null));
+    }
+
+    @Test
+    public void testRun_successOnFirstAttempt() throws Exception {
+        final Timeout timeout = new Timeout(NAME, 100, 2, 500);
+        final Object result = new Object();
+        when(mJob.call()).thenReturn(result);
+        assertThat(timeout.run(DESC, 1, mJob)).isSameAs(result);
+    }
+
+    @Test
+    public void testRun_successOnSecondAttempt() throws Exception {
+        final Timeout timeout = new Timeout(NAME, 100, 2, 500);
+        final Object result = new Object();
+        when(mJob.call()).thenReturn((Object) null, result);
+        assertThat(timeout.run(DESC, 10, mJob)).isSameAs(result);
+    }
+
+    @Test
+    public void testRun_allAttemptsFailed() throws Exception {
+        final Timeout timeout = new Timeout(NAME, 100, 2, 500);
+        final RetryableException e = expectThrows(RetryableException.class,
+                () -> timeout.run(DESC, 10, mJob));
+        assertThat(e.getMessage()).contains(DESC);
+        assertThat(e.getTimeout()).isSameAs(timeout);
+    }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/Timeouts.java b/tests/autofillservice/src/android/autofillservice/cts/Timeouts.java
new file mode 100644
index 0000000..adaa5a7
--- /dev/null
+++ b/tests/autofillservice/src/android/autofillservice/cts/Timeouts.java
@@ -0,0 +1,86 @@
+/*
+ * Copyright (C) 2017 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *      http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package android.autofillservice.cts;
+
+/**
+ * Timeouts for common tasks.
+ */
+final class Timeouts {
+
+    /**
+     * Timeout until framework binds / unbinds from service.
+     */
+    static final Timeout CONNECTION_TIMEOUT = new Timeout("CONNECTION_TIMEOUT", 1000, 2F, 2000);
+
+    /**
+     * Timeout until framework unbinds from a service.
+     */
+    static final Timeout IDLE_UNBIND_TIMEOUT = new Timeout("IDLE_UNBIND_TIMEOUT", 5000, 2F, 10000);
+
+    /**
+     * Timeout for expected autofill requests.
+     */
+    static final Timeout FILL_TIMEOUT = new Timeout("FILL_TIMEOUT", 1000, 2F, 2000);
+
+    /**
+     * Timeout for expected save requests.
+     */
+    static final Timeout SAVE_TIMEOUT = new Timeout("SAVE_TIMEOUT", 1000, 2F, 5000);
+
+    /**
+     * Time to wait if a UI change is not expected
+     */
+    static final Timeout NOT_SHOWING_TIMEOUT = new Timeout("NOT_SHOWING_TIMEOUT", 100, 2F, 500);
+
+    /**
+     * Timeout for UI operations. Typically used by {@link UiBot}.
+     */
+    static final Timeout UI_TIMEOUT = new Timeout("UI_TIMEOUT", 500, 2F, 2000);
+
+    /**
+     * Timeout for showing the autofill dataset picker UI.
+     *
+     * <p>The value is usually higher than {@link #UI_TIMEOUT} because the performance of the
+     * dataset picker UI can be affect by external factors in some low-level devices.
+     *
+     * <p>Typically used by {@link UiBot}.
+     */
+    static final Timeout UI_DATASET_PICKER_TIMEOUT =
+            new Timeout("UI_DATASET_PICKER_TIMEOUT", 500, 2F, 4000);
+
+    /**
+     * Timeout (in milliseconds) for an activity to be brought out to top.
+     */
+    static final Timeout ACTIVITY_RESURRECTION =
+            new Timeout("ACTIVITY_RESURRECTION", 1000, 2F, 10000);
+
+    /**
+     * Timeout for changing the screen orientation.
+     */
+    static final Timeout UI_SCREEN_ORIENTATION_TIMEOUT =
+            new Timeout("UI_SCREEN_ORIENTATION_TIMEOUT", 5000, 2F, 10000);
+
+    /**
+     * Timeout for using Recents to swtich activities.
+     */
+    static final Timeout UI_RECENTS_SWITCH_TIMEOUT =
+            new Timeout("UI_RECENTS_SWITCH_TIMEOUT", 200, 2F, 1000);
+
+    private Timeouts() {
+        throw new UnsupportedOperationException("contain static methods only");
+    }
+}
diff --git a/tests/autofillservice/src/android/autofillservice/cts/UiBot.java b/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
index a23c48d..70e9d1c 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/UiBot.java
@@ -16,11 +16,12 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.NOT_SHOWING_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.SAVE_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.UI_DATASET_PICKER_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.UI_RECENTS_SWITCH_TIMEOUT_MS;
-import static android.autofillservice.cts.Helper.UI_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.NOT_SHOWING_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.SAVE_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.UI_DATASET_PICKER_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.UI_RECENTS_SWITCH_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.UI_SCREEN_ORIENTATION_TIMEOUT;
+import static android.autofillservice.cts.Timeouts.UI_TIMEOUT;
 import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_ADDRESS;
 import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_CREDIT_CARD;
 import static android.service.autofill.SaveInfo.SAVE_DATA_TYPE_EMAIL_ADDRESS;
@@ -103,8 +104,14 @@
     private final Context mContext;
     private final String mPackageName;
     private final UiAutomation mAutoman;
+    private final Timeout mDefaultTimeout;
 
     UiBot() {
+        this(UI_TIMEOUT);
+    }
+
+    UiBot(Timeout defaultTimeout) {
+        mDefaultTimeout = defaultTimeout;
         final Instrumentation instrumentation = InstrumentationRegistry.getInstrumentation();
         mDevice = UiDevice.getInstance(instrumentation);
         mContext = instrumentation.getContext();
@@ -115,8 +122,8 @@
     /**
      * Asserts the dataset chooser is not shown.
      */
-    void assertNoDatasets() {
-        assertNotShowing("datasets", DATASET_PICKER_SELECTOR, NOT_SHOWING_TIMEOUT_MS);
+    void assertNoDatasets() throws Exception {
+        assertNotShowing("datasets", DATASET_PICKER_SELECTOR, NOT_SHOWING_TIMEOUT);
     }
 
     /**
@@ -124,8 +131,8 @@
      *
      * @return the dataset picker object.
      */
-    UiObject2 assertDatasets(String...names) {
-        final UiObject2 picker = findDatasetPicker(UI_DATASET_PICKER_TIMEOUT_MS);
+    UiObject2 assertDatasets(String...names) throws Exception {
+        final UiObject2 picker = findDatasetPicker(UI_DATASET_PICKER_TIMEOUT);
         assertWithMessage("wrong dataset names").that(getChildrenAsText(picker))
                 .containsExactlyElementsIn(Arrays.asList(names)).inOrder();
         return picker;
@@ -136,8 +143,9 @@
      *
      * @return the dataset picker object.
      */
-    UiObject2 assertDatasetsWithBorders(String header, String footer, String...names) {
-        final UiObject2 picker = findDatasetPicker(UI_DATASET_PICKER_TIMEOUT_MS);
+    UiObject2 assertDatasetsWithBorders(String header, String footer, String...names)
+            throws Exception {
+        final UiObject2 picker = findDatasetPicker(UI_DATASET_PICKER_TIMEOUT);
         final List<String> expectedChild = new ArrayList<>();
         if (header != null) {
             expectedChild.add(header);
@@ -173,8 +181,8 @@
     /**
      * Selects a dataset that should be visible in the floating UI.
      */
-    void selectDataset(String name) {
-        final UiObject2 picker = findDatasetPicker(UI_DATASET_PICKER_TIMEOUT_MS);
+    void selectDataset(String name) throws Exception {
+        final UiObject2 picker = findDatasetPicker(UI_DATASET_PICKER_TIMEOUT);
         selectDataset(picker, name);
     }
 
@@ -195,7 +203,7 @@
      * <p><b>NOTE:</b> when selecting an option in dataset picker is shown, prefer
      * {@link #selectDataset(String)}.
      */
-    void selectByText(String name) {
+    void selectByText(String name) throws Exception {
         Log.v(TAG, "selectByText(): " + name);
 
         final UiObject2 object = waitForObject(By.text(name));
@@ -208,12 +216,12 @@
      * <p><b>NOTE:</b> when asserting the dataset picker is shown, prefer
      * {@link #assertDatasets(String...)}.
      */
-    public UiObject2 assertShownByText(String text) {
-        return assertShownByText(text, UI_TIMEOUT_MS);
+    public UiObject2 assertShownByText(String text) throws Exception {
+        return assertShownByText(text, mDefaultTimeout);
     }
 
-    public UiObject2 assertShownByText(String text, int timeoutMs) {
-        final UiObject2 object = waitForObject(By.text(text), timeoutMs);
+    public UiObject2 assertShownByText(String text, Timeout timeout) throws Exception {
+        final UiObject2 object = waitForObject(By.text(text), timeout);
         assertWithMessage("No node with text '%s'", text).that(object).isNotNull();
         return object;
     }
@@ -222,7 +230,7 @@
      * Asserts a node with the given content description is shown.
      *
      */
-    public UiObject2 assertShownByContentDescription(String contentDescription) {
+    public UiObject2 assertShownByContentDescription(String contentDescription) throws Exception {
         final UiObject2 object = waitForObject(By.desc(contentDescription));
         assertWithMessage("No node with content description '%s'", contentDescription).that(object)
                 .isNotNull();
@@ -241,28 +249,28 @@
     /**
      * Selects a view by id.
      */
-    void selectById(String id) {
+    void selectById(String id) throws Exception {
         Log.v(TAG, "selectById(): " + id);
 
-        final UiObject2 view = waitForObject(By.res(id));
+        final UiObject2 view = waitForObject(By.res(id), mDefaultTimeout);
         view.click();
     }
 
     /**
      * Asserts the id is shown on the screen.
      */
-    void assertShownById(String id) {
+    void assertShownById(String id) throws Exception {
         assertThat(waitForObject(By.res(id))).isNotNull();
     }
 
     /**
      * Asserts the id is shown on the screen, using a resource id from the test package.
      */
-    UiObject2 assertShownByRelativeId(String id) {
-        return assertShownByRelativeId(id, UI_TIMEOUT_MS);
+    UiObject2 assertShownByRelativeId(String id) throws Exception {
+        return assertShownByRelativeId(id, mDefaultTimeout);
     }
 
-    UiObject2 assertShownByRelativeId(String id, long timeout) {
+    UiObject2 assertShownByRelativeId(String id, Timeout timeout) throws Exception {
         final UiObject2 obj = waitForObject(By.res(mPackageName, id), timeout);
         assertThat(obj).isNotNull();
         return obj;
@@ -273,8 +281,8 @@
      * <p><b>Note:</b> this method should only called AFTER the id was previously shown, otherwise
      * it might pass without really asserting anything.
      */
-    void assertGoneByRelativeId(String id, long timeout) {
-        boolean gone = mDevice.wait(Until.gone(By.res(mPackageName, id)), timeout);
+    void assertGoneByRelativeId(String id, Timeout timeout) {
+        boolean gone = mDevice.wait(Until.gone(By.res(mPackageName, id)), timeout.ms());
         if (!gone) {
             final String message = "Object with id '" + id + "' should be gone after "
                     + timeout + " ms";
@@ -286,7 +294,8 @@
     /**
      * Asserts that a {@code selector} is not showing after {@code timeout} milliseconds.
      */
-    private void assertNotShowing(String description, BySelector selector, long timeout) {
+    private void assertNotShowing(String description, BySelector selector, Timeout timeout)
+            throws Exception {
         final UiObject2 object;
         try {
             object = waitForObject(null, selector, timeout, DONT_DUMP_ON_ERROR);
@@ -294,14 +303,14 @@
             // Not found as expected.
             return;
         }
-        throw new RetryableException(
-                "Should not be showing " + description + ", but got " + getChildrenAsText(object));
+        throw new RetryableException(timeout, "Should not be showing %s, but got %s",
+                description, getChildrenAsText(object));
     }
 
     /**
      * Gets the text set on a view.
      */
-    String getTextById(String id) {
+    String getTextById(String id) throws Exception {
         final UiObject2 obj = waitForObject(By.res(id));
         return obj.getText();
     }
@@ -309,14 +318,14 @@
     /**
      * Focus in the view with the given resource id.
      */
-    void focusByRelativeId(String id) {
+    void focusByRelativeId(String id) throws Exception {
         waitForObject(By.res(mPackageName, id)).click();
     }
 
     /**
      * Sets a new text on a view.
      */
-    void setTextById(String id, String newText) {
+    void setTextById(String id, String newText) throws Exception {
         UiObject2 view = waitForObject(By.res(id));
         view.setText(newText);
     }
@@ -324,14 +333,14 @@
     /**
      * Asserts the save snackbar is showing and returns it.
      */
-    UiObject2 assertSaveShowing(int type) {
-        return assertSaveShowing(SAVE_TIMEOUT_MS, type);
+    UiObject2 assertSaveShowing(int type) throws Exception {
+        return assertSaveShowing(SAVE_TIMEOUT, type);
     }
 
     /**
      * Asserts the save snackbar is showing and returns it.
      */
-    UiObject2 assertSaveShowing(long timeout, int type) {
+    UiObject2 assertSaveShowing(Timeout timeout, int type) throws Exception {
         return assertSaveShowing(null, timeout, type);
     }
 
@@ -362,7 +371,7 @@
 
         // ...wait until apps are shown...
         // TODO(b/37566627): figure out a way to wait for a specific UI instead.
-        SystemClock.sleep(UI_RECENTS_SWITCH_TIMEOUT_MS);
+        SystemClock.sleep(UI_RECENTS_SWITCH_TIMEOUT.ms());
 
         // ...press again to go back to the activity.
         mDevice.pressRecentApps();
@@ -371,8 +380,8 @@
     /**
      * Asserts the save snackbar is not showing and returns it.
      */
-    void assertSaveNotShowing(int type) {
-        assertNotShowing("save UI for type " + type, SAVE_UI_SELECTOR, NOT_SHOWING_TIMEOUT_MS);
+    void assertSaveNotShowing(int type) throws Exception {
+        assertNotShowing("save UI for type " + type, SAVE_UI_SELECTOR, NOT_SHOWING_TIMEOUT);
     }
 
     private String getSaveTypeString(int type) {
@@ -399,32 +408,33 @@
         return getString(typeResourceName);
     }
 
-    UiObject2 assertSaveShowing(String description, int... types) {
+    UiObject2 assertSaveShowing(String description, int... types) throws Exception {
         return assertSaveShowing(SaveInfo.NEGATIVE_BUTTON_STYLE_CANCEL, description,
-                SAVE_TIMEOUT_MS, types);
+                SAVE_TIMEOUT, types);
     }
 
-    UiObject2 assertSaveShowing(String description, long timeout, int... types) {
+    UiObject2 assertSaveShowing(String description, Timeout timeout, int... types)
+            throws Exception {
         return assertSaveShowing(SaveInfo.NEGATIVE_BUTTON_STYLE_CANCEL, description, timeout,
                 types);
     }
 
     UiObject2 assertSaveShowing(int negativeButtonStyle, String description,
-            int... types) {
-        return assertSaveShowing(negativeButtonStyle, description, SAVE_TIMEOUT_MS, types);
+            int... types) throws Exception {
+        return assertSaveShowing(negativeButtonStyle, description, SAVE_TIMEOUT, types);
     }
 
-    UiObject2 assertSaveShowing(int negativeButtonStyle, String description, long timeout,
-            int... types) {
+    UiObject2 assertSaveShowing(int negativeButtonStyle, String description, Timeout timeout,
+            int... types) throws Exception {
         final UiObject2 snackbar = waitForObject(SAVE_UI_SELECTOR, timeout);
 
         final UiObject2 titleView =
-                waitForObject(snackbar, By.res("android", RESOURCE_ID_SAVE_TITLE), UI_TIMEOUT_MS);
+                waitForObject(snackbar, By.res("android", RESOURCE_ID_SAVE_TITLE), timeout);
         assertWithMessage("save title (%s) is not shown", RESOURCE_ID_SAVE_TITLE).that(titleView)
                 .isNotNull();
 
         final UiObject2 iconView =
-                waitForObject(snackbar, By.res("android", RESOURCE_ID_SAVE_ICON), UI_TIMEOUT_MS);
+                waitForObject(snackbar, By.res("android", RESOURCE_ID_SAVE_ICON), timeout);
         assertWithMessage("save icon (%s) is not shown", RESOURCE_ID_SAVE_ICON).that(iconView)
                 .isNotNull();
 
@@ -467,7 +477,7 @@
                 : RESOURCE_STRING_SAVE_BUTTON_NO_THANKS;
         final String expectedNegativeButtonText = getString(negativeButtonStringId).toUpperCase();
         final UiObject2 negativeButton = waitForObject(snackbar,
-                By.res("android", RESOURCE_ID_SAVE_BUTTON_NO), UI_TIMEOUT_MS);
+                By.res("android", RESOURCE_ID_SAVE_BUTTON_NO), timeout);
         assertWithMessage("wrong text on negative button")
                 .that(negativeButton.getText().toUpperCase()).isEqualTo(expectedNegativeButtonText);
 
@@ -484,7 +494,7 @@
      * @param yesDoIt {@code true} for 'YES', {@code false} for 'NO THANKS'.
      * @param types expected types of save info.
      */
-    void saveForAutofill(boolean yesDoIt, int... types) {
+    void saveForAutofill(boolean yesDoIt, int... types) throws Exception {
         final UiObject2 saveSnackBar = assertSaveShowing(
                 SaveInfo.NEGATIVE_BUTTON_STYLE_CANCEL, null, types);
         saveForAutofill(saveSnackBar, yesDoIt);
@@ -496,7 +506,7 @@
      * @param yesDoIt {@code true} for 'YES', {@code false} for 'NO THANKS'.
      * @param types expected types of save info.
      */
-    void saveForAutofill(int negativeButtonStyle, boolean yesDoIt, int... types) {
+    void saveForAutofill(int negativeButtonStyle, boolean yesDoIt, int... types) throws Exception {
         final UiObject2 saveSnackBar = assertSaveShowing(negativeButtonStyle,null, types);
         saveForAutofill(saveSnackBar, yesDoIt);
     }
@@ -526,13 +536,13 @@
      *
      * @param id resource id of the field.
      */
-    UiObject2 getAutofillMenuOption(String id) {
+    UiObject2 getAutofillMenuOption(String id) throws Exception {
         final UiObject2 field = waitForObject(By.res(mPackageName, id));
         // TODO: figure out why obj.longClick() doesn't always work
         field.click(3000);
 
         final List<UiObject2> menuItems = waitForObjects(
-                By.res("android", RESOURCE_ID_CONTEXT_MENUITEM), UI_TIMEOUT_MS);
+                By.res("android", RESOURCE_ID_CONTEXT_MENUITEM), mDefaultTimeout);
         final String expectedText = getString(RESOURCE_STRING_AUTOFILL);
         final StringBuffer menuNames = new StringBuffer();
         for (UiObject2 menuItem : menuItems) {
@@ -568,8 +578,8 @@
      *
      * @param selector {@link BySelector} that identifies the object.
      */
-    private UiObject2 waitForObject(BySelector selector) {
-        return waitForObject(selector, UI_TIMEOUT_MS);
+    private UiObject2 waitForObject(BySelector selector) throws Exception {
+        return waitForObject(selector, mDefaultTimeout);
     }
 
     /**
@@ -580,28 +590,26 @@
      * @param timeout timeout in ms.
      * @param dumpOnError whether the window hierarchy should be dumped if the object is not found.
      */
-    private UiObject2 waitForObject(UiObject2 parent, BySelector selector, long timeout,
-            boolean dumpOnError) {
+    private UiObject2 waitForObject(UiObject2 parent, BySelector selector, Timeout timeout,
+            boolean dumpOnError) throws Exception {
         // NOTE: mDevice.wait does not work for the save snackbar, so we need a polling approach.
-        final int maxTries = 5;
-        final long napTime = timeout / maxTries;
-        for (int i = 1; i <= maxTries; i++) {
-            final UiObject2 uiObject = parent != null
-                    ? parent.findObject(selector)
-                    : mDevice.findObject(selector);
-            if (uiObject != null) {
-                return uiObject;
+        try {
+            return timeout.run("waitForObject(" + selector + ")", () -> {
+                return parent != null
+                        ? parent.findObject(selector)
+                        : mDevice.findObject(selector);
+
+            });
+        } catch (RetryableException e) {
+            if (dumpOnError) {
+                dumpScreen("waitForObject() for " + selector + "failed");
             }
-            SystemClock.sleep(napTime);
+            throw e;
         }
-        if (dumpOnError) {
-            dumpScreen("waitForObject() for " + selector + "failed");
-        }
-        throw new RetryableException("Object with selector '%s' not found in %d ms",
-                selector, UI_TIMEOUT_MS);
     }
 
-    private UiObject2 waitForObject(UiObject2 parent, BySelector selector, long timeout) {
+    private UiObject2 waitForObject(UiObject2 parent, BySelector selector, Timeout timeout)
+            throws Exception {
         return waitForObject(parent, selector, timeout, DUMP_ON_ERROR);
     }
 
@@ -611,7 +619,7 @@
      * @param selector {@link BySelector} that identifies the object.
      * @param timeout timeout in ms
      */
-    private UiObject2 waitForObject(BySelector selector, long timeout) {
+    private UiObject2 waitForObject(BySelector selector, Timeout timeout) throws Exception {
         return waitForObject(null, selector, timeout);
     }
 
@@ -621,23 +629,25 @@
      * @param selector {@link BySelector} that identifies the object.
      * @param timeout timeout in ms
      */
-    private List<UiObject2> waitForObjects(BySelector selector, long timeout) {
+    private List<UiObject2> waitForObjects(BySelector selector, Timeout timeout) throws Exception {
         // NOTE: mDevice.wait does not work for the save snackbar, so we need a polling approach.
-        final int maxTries = 5;
-        final long napTime = timeout / maxTries;
-        for (int i = 1; i <= maxTries; i++) {
-            final List<UiObject2> uiObjects = mDevice.findObjects(selector);
-            if (uiObjects != null && !uiObjects.isEmpty()) {
-                return uiObjects;
-            }
-            SystemClock.sleep(napTime);
+        try {
+            return timeout.run("waitForObject(" + selector + ")", () -> {
+                final List<UiObject2> uiObjects = mDevice.findObjects(selector);
+                if (uiObjects != null && !uiObjects.isEmpty()) {
+                    return uiObjects;
+                }
+                return null;
+
+            });
+
+        } catch (RetryableException e) {
+            dumpScreen("waitForObjects() for " + selector + "failed");
+            throw e;
         }
-        dumpScreen("waitForObjects() for " + selector + "failed");
-        throw new RetryableException("Objects with selector '%s' not found in %d ms",
-                selector, UI_TIMEOUT_MS);
     }
 
-    private UiObject2 findDatasetPicker(long timeout) {
+    private UiObject2 findDatasetPicker(Timeout timeout) throws Exception {
         final UiObject2 picker = waitForObject(DATASET_PICKER_SELECTOR, timeout);
 
         final String expectedTitle = getString(RESOURCE_STRING_DATASET_PICKER_ACCESSIBILITY_TITLE);
@@ -668,27 +678,12 @@
      *
      * @throws RetryableException if value didn't change.
      */
-    public void setScreenOrientation(int orientation) {
+    public void setScreenOrientation(int orientation) throws Exception {
         mAutoman.setRotation(orientation);
 
-        long startTime = System.currentTimeMillis();
-
-        while (System.currentTimeMillis() - startTime <= Helper.UI_SCREEN_ORIENTATION_TIMEOUT_MS) {
-            final int actualValue = getScreenOrientation();
-            if (actualValue == orientation) {
-                return;
-            }
-            Log.w(TAG, "setScreenOrientation(): sleeping " + Helper.RETRY_MS
-                    + "ms until orientation is " + orientation
-                    + " (instead of " + actualValue + ")");
-            try {
-                Thread.sleep(Helper.RETRY_MS);
-            } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-            }
-        }
-        throw new RetryableException("Screen orientation didn't change to %d in %d ms", orientation,
-                Helper.UI_SCREEN_ORIENTATION_TIMEOUT_MS);
+        UI_SCREEN_ORIENTATION_TIMEOUT.run("setScreenOrientation(" + orientation + ")", () -> {
+            return getScreenOrientation() == orientation ? Boolean.TRUE : null;
+        });
     }
 
     /**
diff --git a/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java b/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java
index 971bb05..e2cf27f 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerActivityTest.java
@@ -386,7 +386,7 @@
             mActivity.mUsername.changeFocus(true);
             latch.countDown();
         });
-        latch.await(Helper.UI_TIMEOUT_MS, TimeUnit.MILLISECONDS);
+        latch.await(Timeouts.UI_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
         sReplier.getNextFillRequest();
 
         // TODO: 63602573 Should be removed once this bug is fixed
@@ -433,7 +433,7 @@
     /**
      * Asserts the dataset picker is properly displayed in a give line.
      */
-    private void assertDatasetShown(Line line, String... expectedDatasets) {
+    private void assertDatasetShown(Line line, String... expectedDatasets) throws Exception {
         final Rect pickerBounds = mUiBot.assertDatasets(expectedDatasets).getVisibleBounds();
         final Rect fieldBounds = line.getAbsCoordinates();
         assertWithMessage("vertical coordinates don't match; picker=%s, field=%s", pickerBounds,
diff --git a/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerView.java b/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerView.java
index d8b1c47..92fc7a7 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerView.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/VirtualContainerView.java
@@ -16,7 +16,7 @@
 
 package android.autofillservice.cts;
 
-import static android.autofillservice.cts.Helper.FILL_TIMEOUT_MS;
+import static android.autofillservice.cts.Timeouts.FILL_TIMEOUT;
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
@@ -373,8 +373,8 @@
             }
 
             void assertAutoFilled() throws Exception {
-                final boolean set = latch.await(FILL_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-                assertWithMessage("Timeout (%s ms) on Line %s", FILL_TIMEOUT_MS, label)
+                final boolean set = latch.await(FILL_TIMEOUT.ms(), TimeUnit.MILLISECONDS);
+                assertWithMessage("Timeout (%s ms) on Line %s", FILL_TIMEOUT.ms(), label)
                         .that(set).isTrue();
                 final String actual = text.text.toString();
                 assertWithMessage("Wrong auto-fill value on Line %s", label)
diff --git a/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java b/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java
index 04249d7..a7c880f 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/WebViewActivity.java
@@ -96,31 +96,31 @@
         });
     }
 
-    public UiObject2 getUsernameLabel(UiBot uiBot) {
+    public UiObject2 getUsernameLabel(UiBot uiBot) throws Exception {
         return getLabel(uiBot, "Username: ");
     }
 
-    public UiObject2 getPasswordLabel(UiBot uiBot) {
+    public UiObject2 getPasswordLabel(UiBot uiBot) throws Exception {
         return getLabel(uiBot, "Password: ");
     }
 
-    public UiObject2 getUsernameInput(UiBot uiBot) {
+    public UiObject2 getUsernameInput(UiBot uiBot) throws Exception {
         return getInput(uiBot, "Username: ");
     }
 
-    public UiObject2 getPasswordInput(UiBot uiBot) {
+    public UiObject2 getPasswordInput(UiBot uiBot) throws Exception {
         return getInput(uiBot, "Password: ");
     }
 
-    public UiObject2 getLoginButton(UiBot uiBot) {
+    public UiObject2 getLoginButton(UiBot uiBot) throws Exception {
         return getLabel(uiBot, "Login");
     }
 
-    private UiObject2 getLabel(UiBot uiBot, String label) {
+    private UiObject2 getLabel(UiBot uiBot, String label) throws Exception {
         return uiBot.assertShownByText(label);
     }
 
-    private UiObject2 getInput(UiBot uiBot, String contentDescription) {
+    private UiObject2 getInput(UiBot uiBot, String contentDescription) throws Exception {
         // First get the label..
         final UiObject2 label = getLabel(uiBot, contentDescription);
 
diff --git a/tests/autofillservice/src/android/autofillservice/cts/WelcomeActivity.java b/tests/autofillservice/src/android/autofillservice/cts/WelcomeActivity.java
index 3e3a302..993951d 100644
--- a/tests/autofillservice/src/android/autofillservice/cts/WelcomeActivity.java
+++ b/tests/autofillservice/src/android/autofillservice/cts/WelcomeActivity.java
@@ -79,7 +79,7 @@
         if (sInstance != null) {
             Log.d(TAG, "So long and thanks for all the fish!");
             sInstance.finish();
-            uiBot.assertGoneByRelativeId(ID_WELCOME, Helper.ACTIVITY_RESURRECTION_MS);
+            uiBot.assertGoneByRelativeId(ID_WELCOME, Timeouts.ACTIVITY_RESURRECTION);
         }
         if (sPendingIntent != null) {
             sPendingIntent.cancel();
