Added support for running repackaged Android ICU4J tests using JUnit

Adds JUnit integration classes under android_icu4j/runner that
bridges between ICU4J's custom testing framework and JUnit.
These classes were copied from cts/tests/tests/icu to here,
moved into a new package (to remove cts and ensure that they
do not clash with original classes in cts) and then made
standalone so that they didn't depend on CTS.

The intent is that the original classes will be removed and the
CTS runner will use these classes, either directly or through
standard Android/JUnit integration.

In order for these classes to work with CTS they need to be able
to skip execution, i.e. 'run' the tests in order to fire events
but to not actually execute the tests themselves. This was
previously done using a special parameters class but this uses
the 'standard', in internal Android at least,
AndroidRunnerParams class. As that class is not available on the
host and the host does not require the ability to skip the
execution this provides a dummy implementation that never skips.

This also adds @RunWith annotations to the tests during
repackaging so that they can be run using standard JUnit
runners.

The Android.mk file has instructions on how to run using both
JUnit and the ICU4J test framework.

There are a number of issues with running tests under JUnit but
they will be fixed in follow on changes.

(cherry picked from commit 3a45e58d9461ee00f295ca8a6a29ef0860559e7e)

Bug: 22023363
Change-Id: Iac1221c12cc7194277db49b9a013d427d9533b36
diff --git a/android_icu4j/Android.mk b/android_icu4j/Android.mk
index 8d0a1d4..4c06a5a 100644
--- a/android_icu4j/Android.mk
+++ b/android_icu4j/Android.mk
@@ -35,8 +35,9 @@
 # Don't include this package in any target
 LOCAL_MODULE_TAGS := tests
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src/main/tests)
-LOCAL_JAVA_RESOURCE_DIRS := src/main/tests
+    $(call all-java-files-under,src/main/tests) \
+    $(call all-java-files-under,runner/src/main/java)
+LOCAL_JAVA_RESOURCE_DIRS := src/main/tests runner/src/main/java
 LOCAL_STATIC_JAVA_LIBRARIES := \
     android-support-test
 LOCAL_JAVA_LIBRARIES := \
@@ -66,6 +67,9 @@
 #==========================================================
 # build repackaged ICU tests for host for testing purposes
 #
+# Run the tests using junit with the following command:
+#   java -cp ${ANDROID_BUILD_TOP}/out/host/linux-x86/framework/android-icu4j-tests-host.jar org.junit.runner.JUnitCore android.icu.dev.test.TestAll
+#
 # Run the tests using the ICU4J test framework with the following command:
 #   java -cp ${ANDROID_BUILD_TOP}/out/host/linux-x86/framework/android-icu4j-tests-host.jar android.icu.dev.test.TestAll
 #==========================================================
@@ -74,9 +78,12 @@
 # Don't include this package in any target
 LOCAL_MODULE_TAGS := tests
 LOCAL_SRC_FILES := \
-    $(call all-java-files-under,src/main/tests)
+    $(call all-java-files-under,src/main/tests) \
+    $(call all-java-files-under,runner/src/main/java) \
+    $(call all-java-files-under,runner/src/host/java)
 LOCAL_JAVA_RESOURCE_DIRS := src/main/tests
 LOCAL_STATIC_JAVA_LIBRARIES := \
-    android-icu4j-host
+    android-icu4j-host \
+    junit
 LOCAL_MODULE := android-icu4j-tests-host
 include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/android_icu4j/runner/src/host/java/android/support/test/internal/util/AndroidRunnerParams.java b/android_icu4j/runner/src/host/java/android/support/test/internal/util/AndroidRunnerParams.java
new file mode 100644
index 0000000..e6d4501
--- /dev/null
+++ b/android_icu4j/runner/src/host/java/android/support/test/internal/util/AndroidRunnerParams.java
@@ -0,0 +1,26 @@
+/*
+ * Copyright (C) 2016 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.support.test.internal.util;
+
+/**
+ * A dummy class used to support running ICU JUnit tests on host.
+ */
+public class AndroidRunnerParams {
+
+    public boolean isSkipExecution() {
+        return false;
+    }
+}
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/ErrorReportingRunner.java b/android_icu4j/runner/src/main/java/android/icu/junit/ErrorReportingRunner.java
new file mode 100644
index 0000000..38cd26f
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/ErrorReportingRunner.java
@@ -0,0 +1,123 @@
+package android.icu.junit;
+
+import java.lang.reflect.InvocationTargetException;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Iterator;
+import java.util.List;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runner.manipulation.Filter;
+import org.junit.runner.manipulation.Filterable;
+import org.junit.runner.manipulation.NoTestsRemainException;
+import org.junit.runner.notification.Failure;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * A copy of the JUnit 4.10 {@link org.junit.internal.runners.ErrorReportingRunner} class.
+ *
+ * <p>Modified as follows:</p>
+ *
+ * <ul>
+ * <li>allows the class in error to be specified by name rather than {@link Class} object so that it
+ * can be used for when the class could not be found. See
+ * {@link #ErrorReportingRunner(String, Throwable)} and
+ * {@link #fTestClassName}.
+ * <li>supports filtering of the individual causes. See {@link #filter(Filter)}.
+ * <li>uses the cause to construct the description allowing filtering on specific error messages.
+ * See {@link #describeCause(Throwable)}.
+ * </ul>
+ *
+ * See https://github.com/junit-team/junit/issues/1253
+ */
+// android-changed - implements Filterable
+class ErrorReportingRunner extends Runner implements Filterable {
+    private final List<Throwable> fCauses;
+
+    // android-changed - changed type from Class<?> and renamed from fTestClass.
+    private final String fTestClassName;
+
+    public ErrorReportingRunner(String testClassName, Throwable cause) {
+        fTestClassName = testClassName;
+        // Take a copy so that they can be modified during filtering if necessary.
+        fCauses = new ArrayList<>(getCauses(cause));
+    }
+    // end android-changed
+
+    @Override
+    public Description getDescription() {
+        // android-changed - renamed from fTestClass.
+        Description description= Description.createSuiteDescription(fTestClassName);
+        // end android-changed
+        for (Throwable each : fCauses)
+            description.addChild(describeCause(each));
+        return description;
+    }
+
+    @Override
+    public void run(RunNotifier notifier) {
+        for (Throwable each : fCauses)
+            runCause(each, notifier);
+    }
+
+    // android-changed - added filtering support
+    @Override
+    public void filter(Filter filter) throws NoTestsRemainException {
+        Iterator<Throwable> iterator = fCauses.iterator();
+        while (iterator.hasNext()) {
+            Throwable cause = iterator.next();
+            Description description = describeCause(cause);
+            if (!filter.shouldRun(description)) {
+                iterator.remove();
+            }
+        }
+
+        // If there are no causes left then throw an exception to cause the parent runner, if any,
+        // to remove this runner from its list.
+        if (fCauses.isEmpty()) {
+            throw new NoTestsRemainException();
+        }
+    }
+    // end android-changed
+
+    @SuppressWarnings("deprecation")
+    private List<Throwable> getCauses(Throwable cause) {
+        if (cause instanceof InvocationTargetException)
+            return getCauses(cause.getCause());
+        if (cause instanceof InitializationError)
+            return ((InitializationError) cause).getCauses();
+        if (cause instanceof org.junit.internal.runners.InitializationError)
+            return ((org.junit.internal.runners.InitializationError) cause)
+                    .getCauses();
+        return Arrays.asList(cause);
+    }
+
+    private Description describeCause(Throwable child) {
+        // android-changed - create a description that incorporates the cause
+        // Extract the first line of the message, exclude any special characters that could
+        // cause problems with later parsing of the description.
+        String message = child.getMessage();
+        Matcher matcher = Pattern.compile("^([^()\n]*).*").matcher(message);
+        if (matcher.matches()) {
+            message = matcher.group(1);
+        }
+
+        // Create a suite description (need to use that method because the createTestDescription
+        // methods use a class rather than a class name).
+        String causeClassName = child.getClass().getName();
+        return Description.createSuiteDescription(
+                String.format("initializationError[%s: %s](%s)",
+                        causeClassName, message, fTestClassName));
+        // end android-changed
+    }
+
+    private void runCause(Throwable child, RunNotifier notifier) {
+        Description description= describeCause(child);
+        notifier.fireTestStarted(description);
+        notifier.fireTestFailure(new Failure(description, child));
+        notifier.fireTestFinished(description);
+    }
+}
\ No newline at end of file
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/IcuFrameworkTest.java b/android_icu4j/runner/src/main/java/android/icu/junit/IcuFrameworkTest.java
new file mode 100644
index 0000000..b6fc748
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/IcuFrameworkTest.java
@@ -0,0 +1,133 @@
+/*
+ * Copyright (C) 2016 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.icu.junit;
+
+import android.icu.dev.test.TestFmwk;
+import java.io.PrintWriter;
+import java.io.StringWriter;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+import junit.framework.AssertionFailedError;
+import org.junit.runner.Description;
+
+/**
+ * Represents a test within a {@link TestFmwk} class.
+ */
+final class IcuFrameworkTest implements Comparable<IcuFrameworkTest> {
+
+    private static final String[] EMPTY_ARGS = new String[0];
+
+    private static final Pattern EXTRACT_ERROR_INFO = Pattern.compile(
+            "^[A-Za-z0-9_]+ \\{(\n.*)\n\\}.*", Pattern.DOTALL);
+
+    /**
+     * The {@link TestFmwk} instance on which the tests will be run.
+     */
+    private final TestFmwk testFmwk;
+
+    private final TestFmwk.Target target;
+
+    /**
+     * The name of the individual target to run.
+     */
+    private final String methodName;
+
+    IcuFrameworkTest(TestFmwk testFmwk, TestFmwk.Target target, String methodName) {
+        this.testFmwk = testFmwk;
+        this.target = target;
+        this.methodName = methodName;
+    }
+
+    public String getMethodName() {
+        return methodName;
+    }
+
+    /**
+     * Runs the target.
+     */
+    public void run() {
+        test_for_TestFmwk_Run();
+    }
+
+    /**
+     * A special method to avoid the TestFmwk from throwing an InternalError when an error occurs
+     * during execution of the test but outside the actual test method, e.g. in a
+     * {@link TestFmwk#validate()} method. See http://bugs.icu-project.org/trac/ticket/12183
+     *
+     * <p>DO NOT CHANGE THE NAME
+     */
+    private void test_for_TestFmwk_Run() {
+        StringWriter stringWriter = new StringWriter();
+        PrintWriter log = new PrintWriter(stringWriter);
+
+        TestFmwk.TestParams localParams = TestFmwk.TestParams.create(EMPTY_ARGS, log);
+        if (localParams == null) {
+            throw new IllegalStateException("Could not create params");
+        }
+
+        // We don't want an error summary as we are only running one test.
+        localParams.errorSummary = null;
+
+        try {
+            // Make sure that the TestFmwk is initialized with the correct parameters. This method
+            // is being called solely for its side effect of updating the TestFmwk.params field.
+            testFmwk.resolveTarget(localParams);
+
+            // Run the target.
+            target.run();
+        } catch (Exception e) {
+            // Output the exception to the log and make sure it is treated as an error.
+            e.printStackTrace(log);
+            localParams.errorCount++;
+        }
+
+        // Treat warnings as errors.
+        int errorCount = localParams.errorCount + localParams.warnCount;
+
+        // Ensure that all data is written to the StringWriter.
+        log.flush();
+
+        // Treat warnings as errors.
+        String information = stringWriter.toString();
+        if (errorCount != 0) {
+            // Remove unnecessary formatting.
+            Matcher matcher = EXTRACT_ERROR_INFO.matcher(information);
+            if (matcher.matches()) {
+                information = matcher.group(1)/*.replace("\n    ", "\n")*/;
+            }
+
+            // Also append the logs to the console output.
+            String output = "Failure: " + getDescription() + ", due to "
+                    + errorCount + " error(s)\n" + information;
+
+            throw new AssertionFailedError(output);
+        }
+    }
+
+    /**
+     * Get the JUnit {@link Description}
+     */
+    public Description getDescription() {
+        // Get a description for the specific method within the class.
+        return Description.createTestDescription(testFmwk.getClass(), methodName);
+    }
+
+    @Override
+    public int compareTo(IcuFrameworkTest o) {
+        return methodName.compareTo(o.methodName);
+    }
+}
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestFmwkRunner.java b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestFmwkRunner.java
new file mode 100644
index 0000000..6f5e436
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestFmwkRunner.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2016 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.icu.junit;
+
+import android.icu.dev.test.TestFmwk;
+import android.support.test.internal.util.AndroidRunnerParams;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+import org.junit.runner.Description;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.model.Statement;
+
+/**
+ * A {@link org.junit.runner.Runner} that can be used to run a class that is a {@link TestFmwk}
+ * but not a {@link android.icu.dev.test.TestFmwk.TestGroup}
+ */
+public class IcuTestFmwkRunner extends IcuTestParentRunner<IcuFrameworkTest> {
+
+    /**
+     * A {@link Statement} that does nothing, used when skipping execution.
+     */
+    private static final Statement EMPTY_STATEMENT = new Statement() {
+        @Override
+        public void evaluate() throws Throwable {
+        }
+    };
+
+    private final boolean skipExecution;
+
+    private final List<IcuFrameworkTest> tests;
+
+    /**
+     * The constructor used when this class is used with {@code @RunWith(...)}.
+     */
+    public IcuTestFmwkRunner(Class<?> testClass)
+            throws Exception {
+        this(checkClass(testClass), null);
+    }
+
+    /**
+     * Make sure that the supplied test class is supported by this.
+     */
+    private static Class<? extends TestFmwk> checkClass(Class<?> testClass) {
+        if (!TestFmwk.class.isAssignableFrom(testClass)) {
+            throw new IllegalStateException(
+                    "Cannot use " + IcuTestFmwkRunner.class + " for running "
+                            + testClass + " as it is not a " + TestFmwk.class);
+        }
+        if (TestFmwk.TestGroup.class.isAssignableFrom(testClass)) {
+            throw new IllegalStateException(
+                    "Cannot use " + IcuTestFmwkRunner.class + " for running "
+                            + testClass + " as it is a " + TestFmwk.TestGroup.class
+                            + ": Use @RunWith(" + IcuTestGroupRunner.class.getSimpleName()
+                            + ".class) instead");
+        }
+
+        return testClass.asSubclass(TestFmwk.class);
+    }
+
+    IcuTestFmwkRunner(Class<? extends TestFmwk> testFmwkClass, AndroidRunnerParams runnerParams)
+            throws Exception {
+        super(testFmwkClass);
+
+        this.skipExecution = runnerParams == null ? false : runnerParams.isSkipExecution();
+
+        // Create a TestFmwk and make sure that it's initialized properly.
+        TestFmwk testFmwk = TestFmwkUtils.newTestFmwkInstance(testFmwkClass);
+
+        tests = new ArrayList<>();
+
+        TestFmwk.Target target = TestFmwkUtils.getTargets(testFmwk);
+        while (target != null) {
+            String name = target.name;
+            // Just ignore targets that do not have a name, they are do nothing place holders.
+            if (name != null) {
+                tests.add(new IcuFrameworkTest(testFmwk, target, name));
+            }
+            target = target.getNext();
+        }
+
+        // If the class has no tests then fail.
+        if (tests.isEmpty()) {
+            throw new IllegalStateException("Cannot find any tests for " + testFmwkClass);
+        }
+
+        // Sort the methods to ensure consistent ordering.
+        Collections.sort(tests);
+    }
+
+    @Override
+    protected List<IcuFrameworkTest> getChildren() {
+        return tests;
+    }
+
+    @Override
+    protected Description describeChild(IcuFrameworkTest child) {
+        return child.getDescription();
+    }
+
+    @Override
+    protected void runChild(final IcuFrameworkTest child, RunNotifier notifier) {
+        Description description = describeChild(child);
+        Statement statement;
+        if (skipExecution) {
+            statement = EMPTY_STATEMENT;
+        } else {
+            statement = new Statement() {
+                @Override
+                public void evaluate() throws Throwable {
+                    child.run();
+                }
+            };
+        }
+        runLeaf(statement, description, notifier);
+    }
+}
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestGroupRunner.java b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestGroupRunner.java
new file mode 100644
index 0000000..7cead85
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestGroupRunner.java
@@ -0,0 +1,98 @@
+/*
+ * Copyright (C) 2016 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.icu.junit;
+
+import android.icu.dev.test.TestFmwk;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.runner.Description;
+import org.junit.runner.Runner;
+import org.junit.runner.notification.RunNotifier;
+import org.junit.runners.model.RunnerBuilder;
+
+/**
+ * A {@link org.junit.runner.Runner} that can be used to run a class that is a
+ * {@link TestFmwk.TestGroup} but not a {@link TestFmwk}
+ */
+public class IcuTestGroupRunner extends IcuTestParentRunner<Runner> {
+
+    private final List<Runner> runners;
+
+    /**
+     * The constructor used when this class is used with {@code @RunWith(...)}.
+     */
+    public IcuTestGroupRunner(Class<?> testClass, RunnerBuilder runnerBuilder)
+            throws Exception {
+        super(testClass);
+
+        Class<? extends TestFmwk.TestGroup> testGroupClass = checkClass(testClass);
+
+        // Create a TestGroup and make sure that it's initialized properly.
+        TestFmwk.TestGroup testGroup = TestFmwkUtils.newTestFmwkInstance(testGroupClass);
+
+        runners = new ArrayList<>();
+        List<String> classNames = TestFmwkUtils.getClassNames(testGroup);
+        ClassLoader classLoader = testGroupClass.getClassLoader();
+        for (String className : classNames) {
+            Runner runner;
+
+            try {
+                Class<?> childTestClass = Class.forName(className, false, classLoader);
+                runner = runnerBuilder.safeRunnerForClass(childTestClass);
+            } catch (ClassNotFoundException e) {
+                runner = new ErrorReportingRunner(className, e);
+            }
+
+            runners.add(runner);
+        }
+    }
+
+    /**
+     * Make sure that the supplied test class is supported by this.
+     */
+    private static Class<? extends TestFmwk.TestGroup> checkClass(Class<?> testClass) {
+        if (!TestFmwk.TestGroup.class.isAssignableFrom(testClass)) {
+            if (TestFmwk.class.isAssignableFrom(testClass)) {
+                throw new IllegalStateException(
+                        "Cannot use " + IcuTestGroupRunner.class + " for running "
+                                + testClass + " as it is a " + TestFmwk.class
+                                + ": Use @RunWith(" + IcuTestFmwkRunner.class.getSimpleName()
+                                + ".class) instead");
+            }
+            throw new IllegalStateException(
+                    "Cannot use " + IcuTestGroupRunner.class + " for running "
+                            + testClass + " as it is not a " + TestFmwk.TestGroup.class);
+        }
+
+        return testClass.asSubclass(TestFmwk.TestGroup.class);
+    }
+
+    @Override
+    protected List<Runner> getChildren() {
+        return runners;
+    }
+
+    @Override
+    protected Description describeChild(Runner child) {
+        return child.getDescription();
+    }
+
+    @Override
+    protected void runChild(Runner child, RunNotifier notifier) {
+        child.run(notifier);
+    }
+}
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestParentRunner.java b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestParentRunner.java
new file mode 100644
index 0000000..728a356
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestParentRunner.java
@@ -0,0 +1,55 @@
+/*
+ * Copyright (C) 2016 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.icu.junit;
+
+import org.junit.runners.ParentRunner;
+import org.junit.runners.model.InitializationError;
+
+/**
+ * Extends {@link ParentRunner} to prevent it from trying to create an instance of
+ * {@link org.junit.runners.model.TestClass} for the supplied {@code testClass} because that
+ * requires that the {@code testClass} has only a single constructor and at least one ICU test
+ * ({@code android.icu.dev.test.serializable.CoverageTest}) has more than one constructor.
+ *
+ * <p>This provides a dummy class and overrides the {@link #getName()} method to return the
+ * correct name. The consequence of this is that it is not possible to use JUnit 4 annotations
+ * related to the class, like {@link org.junit.BeforeClass}, {@link org.junit.ClassRule}, etc.
+ */
+abstract class IcuTestParentRunner<T> extends ParentRunner<T> {
+
+    private final Class<?> testClass;
+
+    IcuTestParentRunner(Class<?> testClass) throws InitializationError {
+        super(DummyTestClass.class);
+        this.testClass = testClass;
+    }
+
+    @Override
+    protected String getName() {
+        return testClass.getName();
+    }
+
+    /**
+     * A dummy test class to pass to {@link ParentRunner} for it to validate and check for
+     * annotations.
+     *
+     * <p>Must be public.
+     */
+    public static class DummyTestClass {
+
+    }
+}
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestRunnerBuilder.java b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestRunnerBuilder.java
new file mode 100644
index 0000000..5602bb8
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/IcuTestRunnerBuilder.java
@@ -0,0 +1,49 @@
+/*
+ * Copyright (C) 2016 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.icu.junit;
+
+import android.icu.dev.test.TestFmwk;
+import android.support.test.internal.util.AndroidRunnerParams;
+import org.junit.runner.Runner;
+import org.junit.runners.model.RunnerBuilder;
+
+/**
+ * A {@link RunnerBuilder} used for running ICU test classes derived from {@link TestFmwk}.
+ */
+public class IcuTestRunnerBuilder extends RunnerBuilder {
+
+    private final AndroidRunnerParams runnerParams;
+
+    public IcuTestRunnerBuilder(AndroidRunnerParams runnerParams) {
+        this.runnerParams = runnerParams;
+    }
+
+    @Override
+    public Runner runnerForClass(Class<?> testClass) throws Throwable {
+        // Check for a TestGroup before a TestFmwk class as TestGroup is a subclass of TestFmwk
+        if (TestFmwk.TestGroup.class.isAssignableFrom(testClass)) {
+            return new IcuTestGroupRunner(testClass.asSubclass(TestFmwk.TestGroup.class), this);
+        }
+
+        if (TestFmwk.class.isAssignableFrom(testClass)) {
+            // Make sure that in the event of an error the resulting Runner an be filtered out.
+            return new IcuTestFmwkRunner(testClass.asSubclass(TestFmwk.class), runnerParams);
+        }
+
+        return null;
+    }
+}
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/TestFmwkUtils.java b/android_icu4j/runner/src/main/java/android/icu/junit/TestFmwkUtils.java
new file mode 100644
index 0000000..9e52ed0
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/TestFmwkUtils.java
@@ -0,0 +1,131 @@
+/*
+ * Copyright (C) 2016 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.icu.junit;
+
+import android.icu.dev.test.TestFmwk;
+import java.lang.reflect.Field;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.List;
+
+/**
+ * Abstracts away reflection code that accesses various hidden fields and methods in the ICU test
+ * framework.
+ *
+ * <p>Assuming that this is integrated into ICU test framework itself then ideally the test
+ * framework will itself be modified to remove the need for this reflection at which point this
+ * class can be removed.
+ */
+public class TestFmwkUtils {
+
+    /**
+     * The field on TestGroup which has the list of classes in it.
+     */
+    private static final Field classesToTestField = getField(TestFmwk.TestGroup.class, "names");
+
+    /**
+     * The field on TestGroup which has the default package in it.
+     */
+    private static final Field defaultPackageField =
+            getField(TestFmwk.TestGroup.class, "defaultPackage");
+
+    /**
+     * The field on TestFmwk which has the {@link android.icu.dev.test.TestFmwk.TestParams} in it.
+     */
+    private static final Field paramsField = getField(TestFmwk.class, "params");
+
+    private static final Method getTargetsMethod = getTargetsMethod();
+
+    private static Field getField(Class<?> theClass, String name) {
+        // Find the field, and complain if it is not where it's expected to be.
+        try {
+            Field field = theClass.getDeclaredField(name);
+            field.setAccessible(true);  // It's private by default.
+            return field;
+        } catch (NoSuchFieldException e) {
+            throw new RuntimeException("Class structure of ICU tests have changed.", e);
+        }
+    }
+
+    private static Method getTargetsMethod() {
+        try {
+            Method method = TestFmwk.class.getDeclaredMethod("getTargets", String.class);
+            method.setAccessible(true);
+            return method;
+        } catch (NoSuchMethodException e) {
+            throw new RuntimeException("Class structure of ICU tests have changed.", e);
+        }
+    }
+
+    public static TestFmwk.Target getTargets(TestFmwk testFmwk) {
+        return test_for_TestFmwk_GetTargets(testFmwk);
+    }
+
+    /**
+     * A special method to avoid the TestFmwk from throwing an InternalError when an error occurs
+     * during execution of the test but outside the actual test method, e.g. in a
+     * {@link TestFmwk#validate()} method. See http://bugs.icu-project.org/trac/ticket/12183
+     *
+     * <p>DO NOT CHANGE THE NAME
+     */
+    private static TestFmwk.Target test_for_TestFmwk_GetTargets(TestFmwk testFmwk) {
+        try {
+            return (TestFmwk.Target) getTargetsMethod.invoke(testFmwk, new Object[] {null});
+        } catch (InvocationTargetException | IllegalAccessException e) {
+            throw new IllegalStateException(
+                    "Problem calling getTargets(null) on " + testFmwk, e);
+        }
+    }
+
+    public static <T extends TestFmwk> T newTestFmwkInstance(Class<? extends T> testFmwkClass)
+            throws IllegalAccessException, InstantiationException {
+        // Create a TestFmwk and make sure that it's params field is initialized.
+        T testFmwk = testFmwkClass.newInstance();
+        TestFmwk.TestParams testParams = TestFmwk.TestParams.create(new String[0], null);
+        paramsField.set(testFmwk, testParams);
+        return testFmwk;
+    }
+
+    public static List<String> getClassNames(TestFmwk.TestGroup testGroup) {
+        try {
+            String[] classNames = (String[]) classesToTestField.get(testGroup);
+            String defaultPackage = (String) defaultPackageField.get(testGroup);
+
+            List<String> list = new ArrayList<>(classNames.length);
+            for (String basicName : classNames) {
+                // Handle relative class names.
+                String fullyQualifiedName;
+                if (basicName.contains(".")) {
+                    fullyQualifiedName = basicName;
+                } else {
+                    fullyQualifiedName = defaultPackage + basicName;
+                }
+
+                list.add(fullyQualifiedName);
+            }
+
+            // Sort to ensure consistent ordering.
+            Collections.sort(list);
+
+            return list;
+        } catch (IllegalAccessException e) {
+            throw new IllegalStateException("Problem getting class names from " + testGroup, e);
+        }
+    }
+}
diff --git a/android_icu4j/runner/src/main/java/android/icu/junit/package-info.java b/android_icu4j/runner/src/main/java/android/icu/junit/package-info.java
new file mode 100644
index 0000000..9c03393
--- /dev/null
+++ b/android_icu4j/runner/src/main/java/android/icu/junit/package-info.java
@@ -0,0 +1,10 @@
+/**
+ * Contains classes used to make ICU tests runnable by JUnit.
+ *
+ * <p>Ideally, this will be integrated into ICU itself and cleaned up so that ICU tests can be
+ * simply run using standard JUnit. e.g. ICU test classes will be annotated with
+ * {@code RunWith(IcuTestGroupRunner.class)} or {@code RunWith(IcuTestFmwkRunner.class)} depending
+ * on whether they extend {@link android.icu.dev.test.TestFmwk.TestGroup} or
+ * {@link android.icu.dev.test.TestFmwk}.
+ */
+package android.icu.junit;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/TestAll.java
index ce131fc..3fde4dc 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCollate.java b/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCollate.java
index 424bf7b..654efa2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCollate.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCollate.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAllCollate extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCore.java b/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCore.java
index e750445..5f5ee07 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCore.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/TestAllCore.java
@@ -8,7 +8,10 @@
 package android.icu.dev.test;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
+@RunWith(IcuTestGroupRunner.class)
 public class TestAllCore extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/TestAllTranslit.java b/android_icu4j/src/main/tests/android/icu/dev/test/TestAllTranslit.java
index 42ddb52..c25aa79 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/TestAllTranslit.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/TestAllTranslit.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAllTranslit extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/TestLocaleNamePackaging.java b/android_icu4j/src/main/tests/android/icu/dev/test/TestLocaleNamePackaging.java
index 640c155..6c46201 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/TestLocaleNamePackaging.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/TestLocaleNamePackaging.java
@@ -16,7 +16,10 @@
 import android.icu.text.LocaleDisplayNames;
 import android.icu.text.LocaleDisplayNames.DialectHandling;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestLocaleNamePackaging extends TestFmwk {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/TestPackaging.java b/android_icu4j/src/main/tests/android/icu/dev/test/TestPackaging.java
index 738dd48..7196e30 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/TestPackaging.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/TestPackaging.java
@@ -8,7 +8,10 @@
 package android.icu.dev.test;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
+@RunWith(IcuTestGroupRunner.class)
 public class TestPackaging extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BiDiConformanceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BiDiConformanceTest.java
index 159630e..034d17f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BiDiConformanceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BiDiConformanceTest.java
@@ -15,12 +15,15 @@
 import android.icu.lang.UCharacterDirection;
 import android.icu.text.Bidi;
 import android.icu.text.BidiClassifier;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author Markus W. Scherer
  * BiDi conformance test, using the Unicode BidiTest.txt and BidiCharacterTest.txt files.
  * Ported from ICU4C intltest/bidiconf.cpp .
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class BiDiConformanceTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new BiDiConformanceTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BidiTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BidiTest.java
index 0085788..5b8620a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BidiTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/BidiTest.java
@@ -16,6 +16,8 @@
 import android.icu.text.Bidi;
 import android.icu.text.BidiRun;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * A base class for the Bidi test suite.
@@ -23,6 +25,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class BidiTest extends TestFmwk {
 
     protected static final char[] charFromDirProp = {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestAll.java
index b5189db..ea939a0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestAll.java
@@ -9,10 +9,13 @@
 package android.icu.dev.test.bidi;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestBidi.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestBidi.java
index fa6bcc7..eaf0fd6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestBidi.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestBidi.java
@@ -12,6 +12,8 @@
 
 import android.icu.text.Bidi;
 import android.icu.text.BidiRun;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for Bidi class override.
@@ -19,6 +21,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestBidi extends BidiTest {
 
     private static final int MAXLEN = 256;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCharFromDirProp.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCharFromDirProp.java
index 403bf11..bb525e4 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCharFromDirProp.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCharFromDirProp.java
@@ -11,6 +11,8 @@
 import android.icu.impl.Utility;
 import android.icu.lang.UCharacter;
 import android.icu.lang.UCharacterDirection;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for Bidi charFromDirProp
@@ -18,6 +20,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestCharFromDirProp extends BidiTest {
 
     /* verify that the exemplar characters have the expected bidi classes */
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestClassOverride.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestClassOverride.java
index a96c4e4..fb59781 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestClassOverride.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestClassOverride.java
@@ -10,6 +10,8 @@
 
 import android.icu.text.Bidi;
 import android.icu.text.BidiClassifier;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for Bidi class override.
@@ -17,6 +19,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestClassOverride extends BidiTest {
 
     private static final int DEF = TestData.DEF;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java
index 685b40b..6478d47 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestCompatibility.java
@@ -14,6 +14,8 @@
 import java.text.AttributedString;
 
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for java.text.Bidi compatibility
@@ -21,6 +23,7 @@
  * @author Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestCompatibility extends BidiTest {
 
     void compareBidi(Bidi bidi, java.text.Bidi jbidi)
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestContext.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestContext.java
index 492e7f8..f8dab83 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestContext.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestContext.java
@@ -9,6 +9,8 @@
 package android.icu.dev.test.bidi;
 
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for doing transformations in context
@@ -16,6 +18,7 @@
  * @author Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestContext extends BidiTest {
 
     private class ContextCase {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestFailureRecovery.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestFailureRecovery.java
index 745247b..c5a1524 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestFailureRecovery.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestFailureRecovery.java
@@ -9,6 +9,8 @@
 package android.icu.dev.test.bidi;
 
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for Bidi failure recovery
@@ -16,6 +18,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestFailureRecovery extends BidiTest {
 
     public void testFailureRecovery()
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestInverse.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestInverse.java
index e95baaf..0cdefe9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestInverse.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestInverse.java
@@ -12,6 +12,8 @@
 
 import android.icu.impl.Utility;
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for the basic "inverse" Bidi mode.
@@ -19,6 +21,7 @@
  * ported from C by Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestInverse extends BidiTest {
 
     private int countRoundtrips = 0;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestMultipleParagraphs.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestMultipleParagraphs.java
index 702804d..24742d2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestMultipleParagraphs.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestMultipleParagraphs.java
@@ -13,6 +13,8 @@
 import android.icu.impl.Utility;
 import android.icu.text.Bidi;
 import android.icu.text.BidiRun;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for Bidi multiple paragraphs
@@ -20,6 +22,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestMultipleParagraphs extends BidiTest {
 
     private static final String text =
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorder.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorder.java
index d69e3d2..dc819aa 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorder.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorder.java
@@ -9,6 +9,8 @@
 package android.icu.dev.test.bidi;
 
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -17,6 +19,7 @@
  * ported from C by Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestReorder extends BidiTest {
 
     private static final String[] logicalOrder = {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderArabicMathSymbols.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderArabicMathSymbols.java
index 1237674..df79768 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderArabicMathSymbols.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderArabicMathSymbols.java
@@ -8,6 +8,8 @@
 package android.icu.dev.test.bidi;
 
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -16,6 +18,7 @@
  * Ported from C by Ramy Said
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestReorderArabicMathSymbols extends BidiTest {
 
     private static final String[] logicalOrder = {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderRunsOnly.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderRunsOnly.java
index 0e60f1c..08f58a5 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderRunsOnly.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderRunsOnly.java
@@ -9,6 +9,8 @@
 package android.icu.dev.test.bidi;
 
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for variants to the UBA.
@@ -16,6 +18,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestReorderRunsOnly extends BidiTest {
 
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderingMode.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderingMode.java
index e3a1f42..e1a7b92 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderingMode.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestReorderingMode.java
@@ -11,6 +11,8 @@
 import java.util.Arrays;
 
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for variants to the UBA.
@@ -18,6 +20,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestReorderingMode extends BidiTest {
 
     static final String[] textIn = {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestStreaming.java b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestStreaming.java
index a5ed8af..e261d3c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestStreaming.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bidi/TestStreaming.java
@@ -10,6 +10,8 @@
 
 import android.icu.impl.Utility;
 import android.icu.text.Bidi;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for streaming mode
@@ -17,6 +19,7 @@
  * @author Lina Kemmel, Matitiahu Allouche
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestStreaming extends BidiTest {
 
     static final int MAXPORTIONS = 10;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/bigdec/DiagBigDecimal.java b/android_icu4j/src/main/tests/android/icu/dev/test/bigdec/DiagBigDecimal.java
index d8692e7..dfe355c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/bigdec/DiagBigDecimal.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/bigdec/DiagBigDecimal.java
@@ -16,6 +16,8 @@
 import android.icu.dev.test.TestUtil;
 import android.icu.dev.test.TestUtil.JavaVendor;
 import android.icu.math.BigDecimal;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /* ------------------------------------------------------------------ */
 /* Decimal diagnostic tests mfc */
@@ -99,6 +101,7 @@
  * @author Mike Cowlishaw
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DiagBigDecimal extends TestFmwk {
     //private static final java.lang.String $0 = "DiagBigDecimal.nrx";
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/AstroTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/AstroTest.java
index 0d1bd1c..ec1a76b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/AstroTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/AstroTest.java
@@ -21,9 +21,12 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 // TODO: try finding next new moon after  07/28/1984 16:00 GMT
 
+@RunWith(IcuTestFmwkRunner.class)
 public class AstroTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new AstroTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegression.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegression.java
index 7d0be52..59547cd 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegression.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarRegression.java
@@ -27,6 +27,8 @@
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test 1.32 99/11/14
@@ -36,6 +38,7 @@
  * 4145158 4145983 4147269 4149677 4162587 4165343 4166109 4167060 4173516
  * 4174361 4177484 4197699 4209071 4288792
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CalendarRegression extends android.icu.dev.test.TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarTest.java
index 04d7aac..fe8dca5 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CalendarTest.java
@@ -20,11 +20,14 @@
 import android.icu.util.ChineseCalendar;
 import android.icu.util.GregorianCalendar;
 import android.icu.util.SimpleTimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * A base class for classes that test individual Calendar subclasses.
  * Defines various useful utility methods and constants
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CalendarTest extends TestFmwk {
     
     // Constants for use by subclasses, solely to save typing
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/ChineseTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/ChineseTest.java
index 12c40b0..702e724 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/ChineseTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/ChineseTest.java
@@ -17,6 +17,8 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test of ChineseCalendar.
@@ -60,6 +62,7 @@
  * Tue May 22 2096 = 4733-04*-01, Year 53, Cycle 79
  * Sun Mar 22 2099 = 4736-02*-01, Year 56, Cycle 79
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class ChineseTest extends CalendarTest {
 
     public static void main(String args[]) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CompatibilityTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CompatibilityTest.java
index a0f9737..bef1611 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CompatibilityTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CompatibilityTest.java
@@ -21,7 +21,10 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CompatibilityTest extends android.icu.dev.test.TestFmwk {
 
     public static void main(String argv[]) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CopticTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CopticTest.java
index 47b11d2..5d8f694 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CopticTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/CopticTest.java
@@ -19,10 +19,13 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for the <code>CopticCalendar</code> class.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CopticTest extends CalendarTest 
 {
     public static void main(String args[]) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DangiTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DangiTest.java
index baf99e5..0740c50 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DangiTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DangiTest.java
@@ -14,7 +14,10 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DangiTest extends CalendarTest {
 
     public static void main(String args[]) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DataDrivenCalendarTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DataDrivenCalendarTest.java
index 3245d2a..15d81fa 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DataDrivenCalendarTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/DataDrivenCalendarTest.java
@@ -19,6 +19,8 @@
 import android.icu.util.Calendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author srl
@@ -26,6 +28,7 @@
  * analog of dadrcal.cpp
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class DataDrivenCalendarTest extends ModuleTest {
 
     public DataDrivenCalendarTest() {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/EthiopicTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/EthiopicTest.java
index 67bee08..62537aa 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/EthiopicTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/EthiopicTest.java
@@ -18,10 +18,13 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for the <code>EthiopicCalendar</code> class.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class EthiopicTest extends CalendarTest 
 {
     public static void main(String args[]) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HebrewTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HebrewTest.java
index 97b1642..b1678c7 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HebrewTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HebrewTest.java
@@ -17,10 +17,13 @@
 import android.icu.util.HebrewCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for the <code>HebrewCalendar</code> class.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class HebrewTest extends CalendarTest {
     public static void main(String args[]) throws Exception {
         new HebrewTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HolidayTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HolidayTest.java
index 521c2d0..66c0fa2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HolidayTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/HolidayTest.java
@@ -21,10 +21,13 @@
 import android.icu.util.SimpleHoliday;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for the <code>Holiday</code> class.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class HolidayTest extends TestFmwk {
     public static void main(String args[]) throws Exception {
         new HolidayTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IBMCalendarTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IBMCalendarTest.java
index 99be95f..fb1ea2f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IBMCalendarTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IBMCalendarTest.java
@@ -26,10 +26,13 @@
 import android.icu.util.TimeZone;
 import android.icu.util.TimeZone.SystemTimeZoneType;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @summary Tests of new functionality in IBMCalendar
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class IBMCalendarTest extends CalendarTest {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IndianTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IndianTest.java
index 2aae7a5..f294e3b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IndianTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IndianTest.java
@@ -18,10 +18,13 @@
 import android.icu.util.IndianCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for the <code>IndianCalendar</code> class.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class IndianTest extends CalendarTest 
 {
     public static void main(String args[]) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IslamicTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IslamicTest.java
index 9a40878..78ae4aa 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IslamicTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/IslamicTest.java
@@ -24,10 +24,13 @@
 import android.icu.util.IslamicCalendar.CalculationType;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for the <code>IslamicCalendar</code> class.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class IslamicTest extends CalendarTest {
     public static void main(String args[]) throws Exception {
         new IslamicTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/JapaneseTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/JapaneseTest.java
index 7eb3f6b..ea5d27c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/JapaneseTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/JapaneseTest.java
@@ -19,10 +19,13 @@
 import android.icu.util.JapaneseCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for the <code>JapaneseCalendar</code> class.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class JapaneseTest extends CalendarTest {
     public static void main(String args[]) throws Exception {
         new JapaneseTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/PersianTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/PersianTest.java
index 2f0b680..2ead1ec 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/PersianTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/PersianTest.java
@@ -10,7 +10,10 @@
 
 import android.icu.util.Calendar;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class PersianTest extends CalendarTest {
 
     public static void main(String args[]) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/TestAll.java
index 517779a..3e2eb7c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/calendar/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/calendar/TestAll.java
@@ -7,10 +7,13 @@
  */
 package android.icu.dev.test.calendar;
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other calendar tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/charsetdet/TestCharsetDetector.java b/android_icu4j/src/main/tests/android/icu/dev/test/charsetdet/TestCharsetDetector.java
index 4993315..c8f1d90 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/charsetdet/TestCharsetDetector.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/charsetdet/TestCharsetDetector.java
@@ -31,11 +31,14 @@
 import android.icu.impl.Utility;
 import android.icu.text.CharsetDetector;
 import android.icu.text.CharsetMatch;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
  * @author andy
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestCharsetDetector extends TestFmwk
 {
     
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestAll.java
index e3baf09..5a7c3b0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.cldr;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all collation and search tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestCLDRVsICU.java b/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestCLDRVsICU.java
index 6e1f573..d378104 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestCLDRVsICU.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/cldr/TestCLDRVsICU.java
@@ -43,6 +43,8 @@
 import android.icu.util.Currency;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * This is a test file that takes in the CLDR XML test files and test against
@@ -70,6 +72,7 @@
  * @author medavis
  * @author John Huan Vu (johnvu@us.ibm.com)
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestCLDRVsICU extends TestFmwk {
     static final boolean DEBUG = false;
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java
index fd9c42d..876425d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/AlphabeticIndexTest.java
@@ -36,10 +36,13 @@
 import android.icu.text.UTF16;
 import android.icu.text.UnicodeSet;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author Mark Davis
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class AlphabeticIndexTest extends TestFmwk {
     /**
      * 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationAPITest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationAPITest.java
index 464c4bf..f7d1e97 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationAPITest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationAPITest.java
@@ -34,7 +34,10 @@
 import android.icu.text.UnicodeSet;
 import android.icu.util.ULocale;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationAPITest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new CollationAPITest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationChineseTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationChineseTest.java
index 310f497..1629f62 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationChineseTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationChineseTest.java
@@ -18,7 +18,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationChineseTest extends TestFmwk{
     public static void main(String[] args) throws Exception{
         new CollationChineseTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCreationMethodTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCreationMethodTest.java
index 2e09ebd..b70e07b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCreationMethodTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCreationMethodTest.java
@@ -15,6 +15,8 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -25,6 +27,7 @@
  * @author Brian Rower - IBM - August 2008
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationCreationMethodTest extends TestFmwk 
 {
     
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCurrencyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCurrencyTest.java
index e321b3a..99e05fb 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCurrencyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationCurrencyTest.java
@@ -19,7 +19,10 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationCurrencyTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new CollationCurrencyTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationDummyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationDummyTest.java
index b02b629..ede34ae 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationDummyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationDummyTest.java
@@ -22,7 +22,10 @@
 import android.icu.text.Collator;
 import android.icu.text.Normalizer;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationDummyTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new CollationDummyTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationEnglishTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationEnglishTest.java
index be28eb3..4911c6a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationEnglishTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationEnglishTest.java
@@ -18,7 +18,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationEnglishTest extends TestFmwk{
     public static void main(String[] args) throws Exception{
         new CollationEnglishTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFinnishTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFinnishTest.java
index 4811575..e6265cb 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFinnishTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFinnishTest.java
@@ -17,7 +17,10 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationFinnishTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new CollationFinnishTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrenchTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrenchTest.java
index adee72e..c63c8ea 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrenchTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrenchTest.java
@@ -19,7 +19,10 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationFrenchTest extends TestFmwk{
     public static void main(String[] args) throws Exception {
         new CollationFrenchTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrozenMonkeyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrozenMonkeyTest.java
index 41a657d..682510b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrozenMonkeyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationFrozenMonkeyTest.java
@@ -20,6 +20,8 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * CollationFrozenMonkeyTest is a third level test class.  This tests the random 
@@ -28,6 +30,7 @@
  * less than the string itself appended with any character.
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationFrozenMonkeyTest extends TestFmwk {
     
     private String source = "-abcdefghijklmnopqrstuvwxyz#&^$@";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationGermanTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationGermanTest.java
index 12aff3d..809c2d2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationGermanTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationGermanTest.java
@@ -18,8 +18,11 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
- public class CollationGermanTest extends TestFmwk{
+ @RunWith(IcuTestFmwkRunner.class)
+public class CollationGermanTest extends TestFmwk{
     public static void main(String[] args) throws Exception{
         new CollationGermanTest().run(args);
     }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationIteratorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationIteratorTest.java
index b11dad7..4d8eae7 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationIteratorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationIteratorTest.java
@@ -25,7 +25,10 @@
 import android.icu.text.RuleBasedCollator;
 import android.icu.text.UCharacterIterator;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationIteratorTest extends TestFmwk {
     
     String test1 = "What subset of all possible test cases?";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationKanaTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationKanaTest.java
index cef42f6..ad10c79 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationKanaTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationKanaTest.java
@@ -20,7 +20,10 @@
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationKanaTest extends TestFmwk{
     public static void main(String[] args) throws Exception{
         new CollationKanaTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMiscTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMiscTest.java
index 29a5c37..afb9e7c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMiscTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMiscTest.java
@@ -35,7 +35,10 @@
 import android.icu.text.UnicodeSetIterator;
 import android.icu.util.ULocale;
 import android.icu.util.UResourceBundle;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationMiscTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMonkeyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMonkeyTest.java
index 83d7ad1..50fa983 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMonkeyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationMonkeyTest.java
@@ -20,6 +20,8 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * CollationMonkeyTest is a third level test class.  This tests the random 
@@ -28,6 +30,7 @@
  * less than the string itself appended with any character.
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationMonkeyTest extends TestFmwk {
     
     private String source = "-abcdefghijklmnopqrstuvwxyz#&^$@";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationRegressionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationRegressionTest.java
index 4ca9b07..50fb204 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationRegressionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationRegressionTest.java
@@ -23,7 +23,10 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationRegressionTest extends TestFmwk {
     public static void main(String[] args) throws Exception{
         new CollationRegressionTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationServiceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationServiceTest.java
index fd17ac6..7259a53 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationServiceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationServiceTest.java
@@ -22,7 +22,10 @@
 import android.icu.text.Collator;
 import android.icu.text.Collator.CollatorFactory;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationServiceTest extends TestFmwk {
     public static void main(String[] args) {
         new CollationServiceTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationSpanishTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationSpanishTest.java
index 27037ed..56f297b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationSpanishTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationSpanishTest.java
@@ -18,8 +18,11 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
- public class CollationSpanishTest extends TestFmwk {
+ @RunWith(IcuTestFmwkRunner.class)
+public class CollationSpanishTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new CollationSpanishTest().run(args);
     }
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTest.java
index 1e658f7..6b91be6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTest.java
@@ -46,7 +46,10 @@
 import android.icu.util.IllformedLocaleException;
 import android.icu.util.Output;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationTest extends TestFmwk {
     public static void main(String[] args) throws Exception{
         new CollationTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThaiTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThaiTest.java
index d665a02..120f9a1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThaiTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThaiTest.java
@@ -25,7 +25,10 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationThaiTest extends TestFmwk {
     
     final int MAX_FAILURES_TO_SHOW = -1;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThreadTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThreadTest.java
index 6198abc..23c7f63 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThreadTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationThreadTest.java
@@ -14,7 +14,10 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.Collator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationThreadTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new CollationThreadTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTurkishTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTurkishTest.java
index 170c113..50305bd 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTurkishTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/CollationTurkishTest.java
@@ -18,7 +18,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class CollationTurkishTest extends TestFmwk{
     public static void main(String[] args) throws Exception{
         new CollationTurkishTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/G7CollationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/G7CollationTest.java
index d1f9850..adb5277 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/G7CollationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/G7CollationTest.java
@@ -19,7 +19,10 @@
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
 import android.icu.text.RuleBasedCollator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class G7CollationTest extends TestFmwk{
     public static void main(String[] args) throws Exception{
         new G7CollationTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/LotusCollationKoreanTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/LotusCollationKoreanTest.java
index 3c5c5a6..da814bb 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/LotusCollationKoreanTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/LotusCollationKoreanTest.java
@@ -18,7 +18,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.CollationKey;
 import android.icu.text.Collator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
  
+@RunWith(IcuTestFmwkRunner.class)
 public class LotusCollationKoreanTest extends TestFmwk{
     public static void main(String[] args) throws Exception{
         new LotusCollationKoreanTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/TestAll.java
index 1a2a9bd..a74579f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.collator;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all collation and search tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/collator/UCAConformanceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/collator/UCAConformanceTest.java
index a76fa35..55e9ce3 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/collator/UCAConformanceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/collator/UCAConformanceTest.java
@@ -24,7 +24,10 @@
 import android.icu.text.UTF16;
 import android.icu.util.ULocale;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class UCAConformanceTest extends TestFmwk {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/compression/DecompressionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/compression/DecompressionTest.java
index f76ed53..63ead23 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/compression/DecompressionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/compression/DecompressionTest.java
@@ -9,7 +9,10 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.UnicodeDecompressor;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DecompressionTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new DecompressionTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/compression/ExhaustiveTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/compression/ExhaustiveTest.java
index 7e0f243..fbae351 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/compression/ExhaustiveTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/compression/ExhaustiveTest.java
@@ -10,7 +10,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.UnicodeCompressor;
 import android.icu.text.UnicodeDecompressor;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ExhaustiveTest extends TestFmwk {
     public static void main(String args[]) throws Exception {
         new ExhaustiveTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/compression/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/compression/TestAll.java
index ff9435b..a80470d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/compression/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/compression/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.compression;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) throws Exception {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/DataReadWriteTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/DataReadWriteTest.java
index 471a828..bb0aacb 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/DataReadWriteTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/DataReadWriteTest.java
@@ -16,7 +16,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.duration.impl.XMLRecordReader;
 import android.icu.impl.duration.impl.XMLRecordWriter;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DataReadWriteTest extends TestFmwk {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/ICUDurationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/ICUDurationTest.java
index a054746..0401026 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/ICUDurationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/ICUDurationTest.java
@@ -22,11 +22,14 @@
 import android.icu.text.DurationFormat;
 import android.icu.util.Calendar;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author srl
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class ICUDurationTest extends TestFmwk {
     /**
      * Allows us to not depend on javax.xml.datatype.DatatypeFactory.
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/LanguageTestRoot.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/LanguageTestRoot.java
index ab0ec14..6d74ee3 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/LanguageTestRoot.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/LanguageTestRoot.java
@@ -30,10 +30,13 @@
 import android.icu.impl.duration.TimeUnitConstants;
 import android.icu.impl.duration.impl.DataRecord.ECountVariant;
 import android.icu.impl.duration.impl.DataRecord.EUnitVariant;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for en
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class LanguageTestRoot extends TestFmwk implements TimeUnitConstants {
 
     private static final TimeUnit[] units = {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderFactoryTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderFactoryTest.java
index ea9c476..4bd44b6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderFactoryTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderFactoryTest.java
@@ -17,7 +17,10 @@
 import android.icu.impl.duration.PeriodBuilderFactory;
 import android.icu.impl.duration.TimeUnit;
 import android.icu.impl.duration.TimeUnitConstants;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class PeriodBuilderFactoryTest extends TestFmwk implements TimeUnitConstants {
     private PeriodBuilderFactory pbf;
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderTest.java
index dd6440c..d32755c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodBuilderTest.java
@@ -11,7 +11,10 @@
 package android.icu.dev.test.duration;
 
 import android.icu.dev.test.TestFmwk;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class PeriodBuilderTest extends TestFmwk {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodTest.java
index 3d50365..275d30d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/PeriodTest.java
@@ -13,7 +13,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.duration.Period;
 import android.icu.impl.duration.TimeUnit;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class PeriodTest extends TestFmwk {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/RegressionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/RegressionTest.java
index e6c88ad..c4af3a6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/RegressionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/RegressionTest.java
@@ -14,7 +14,10 @@
 import android.icu.impl.duration.PeriodFormatterService;
 import android.icu.text.DurationFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class RegressionTest extends TestFmwk {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java
index def299a..08b87a5 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/ResourceBasedPeriodFormatterDataServiceTest.java
@@ -16,7 +16,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.duration.impl.PeriodFormatterData;
 import android.icu.impl.duration.impl.ResourceBasedPeriodFormatterDataService;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ResourceBasedPeriodFormatterDataServiceTest extends TestFmwk {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/TestAll.java
index a4d90d7..77a4ed1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/TestAll.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/TestAll.java
index dd0b727..8fd0a97 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/TestAll.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ar_EG.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ar_EG.java
index c50d766..431a363 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ar_EG.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ar_EG.java
@@ -11,11 +11,14 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
  * Test cases for ar_EG
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_ar_EG extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_en.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_en.java
index a64c7dd..ae9d02e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_en.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_en.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for en
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_en extends LanguageTestRoot {
 
   public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_es.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_es.java
index 01b59a1..40cd937 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_es.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_es.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for es
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_es extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_fr.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_fr.java
index c6d9634..babec36 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_fr.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_fr.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for fr
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_fr extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_he_IL.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_he_IL.java
index 53ac157..695f13f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_he_IL.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_he_IL.java
@@ -11,11 +11,14 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
  * Test cases for he_IL
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_he_IL extends LanguageTestRoot {
   /**
    * Invoke the tests.
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_hi.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_hi.java
index 708200d..dec5593 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_hi.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_hi.java
@@ -12,10 +12,13 @@
 
 import android.icu.dev.test.duration.LanguageTestRoot;
 import android.icu.impl.duration.TimeUnitConstants;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for hi
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_hi extends LanguageTestRoot implements TimeUnitConstants {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_it.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_it.java
index d52f2a9..ea1dada 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_it.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_it.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for it
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_it extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ja.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ja.java
index a4d5ac9..0e44f57 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ja.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ja.java
@@ -15,10 +15,13 @@
 import android.icu.impl.duration.Period;
 import android.icu.impl.duration.PeriodFormatter;
 import android.icu.impl.duration.TimeUnitConstants;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for en
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_ja extends LanguageTestRoot implements TimeUnitConstants {
   private BasicPeriodFormatterFactory pff;
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ko.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ko.java
index 659d446..5888b17 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ko.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ko.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for ko
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_ko extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ru.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ru.java
index eb28b84..919e42e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ru.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_ru.java
@@ -11,11 +11,14 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
  * Test cases for ru
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_ru extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans.java
index cc4f1c4..c910169 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans.java
@@ -11,11 +11,14 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
  * Test cases for zh_Hans
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_zh_Hans extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans_SG.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans_SG.java
index a26b53b..aeb83c5 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans_SG.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hans_SG.java
@@ -11,10 +11,13 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for zh_Hans_SG
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_zh_Hans_SG extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant.java
index dd86273..08b6633 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant.java
@@ -11,11 +11,14 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
  * Test cases for zh_Hant
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_zh_Hant extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant_HK.java b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant_HK.java
index bc61851..8e80f28 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant_HK.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/duration/languages/Test_zh_Hant_HK.java
@@ -11,11 +11,14 @@
 package android.icu.dev.test.duration.languages;
 
 import android.icu.dev.test.duration.LanguageTestRoot;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
  * Test cases for zh_Hant_HK
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class Test_zh_Hant_HK extends LanguageTestRoot {
 
   /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/BigNumberFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/BigNumberFormatTest.java
index 59ab653..b0a00c1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/BigNumberFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/BigNumberFormatTest.java
@@ -15,11 +15,14 @@
 import android.icu.text.DecimalFormat;
 import android.icu.text.DecimalFormatSymbols;
 import android.icu.text.NumberFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * General test of Big NumberFormat
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class BigNumberFormatTest extends TestFmwk {
 
     static final int ILLEGAL = -1;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java
index 6dfd677..dc89986 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/CompactDecimalFormatTest.java
@@ -22,7 +22,10 @@
 import android.icu.text.NumberFormat;
 import android.icu.text.PluralRules;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CompactDecimalFormatTest extends TestFmwk {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenFormatTest.java
index b1ac78c..75cf9ed 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenFormatTest.java
@@ -22,11 +22,14 @@
 import android.icu.util.Calendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author srl
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class DataDrivenFormatTest extends ModuleTest {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestSuite.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestSuite.java
index 502b92b..b1c6c95 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestSuite.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DataDrivenNumberFormatTestSuite.java
@@ -15,10 +15,13 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.dev.test.TestUtil;
 import android.icu.impl.Utility;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * A collection of methods to run the data driven number format test suite.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class DataDrivenNumberFormatTestSuite extends TestFmwk {
     
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatMiscTests.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatMiscTests.java
index 563fd9d..c44eddc 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatMiscTests.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatMiscTests.java
@@ -20,10 +20,13 @@
 
 import android.icu.text.DateFormatSymbols;
 import android.icu.text.SimpleDateFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /** 
  * Performs miscellaneous tests for DateFormat, SimpleDateFormat, DateFormatSymbols
  **/
+@RunWith(IcuTestFmwkRunner.class)
 public class DateFormatMiscTests extends android.icu.dev.test.TestFmwk {
 
     public static void main(String[] args) throws Exception{
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTest.java
index af602d8..a1e88fa 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTest.java
@@ -35,10 +35,13 @@
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /** 
  * Performs regression test for DateFormat
  **/
+@RunWith(IcuTestFmwkRunner.class)
 public class DateFormatRegressionTest extends android.icu.dev.test.TestFmwk {
 
     public static void main(String[] args) throws Exception{
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTestJ.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTestJ.java
index 3b6e5d8..cad84a0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTestJ.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRegressionTestJ.java
@@ -22,7 +22,10 @@
 import android.icu.text.SimpleDateFormat;
 import android.icu.util.Calendar;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DateFormatRegressionTestJ extends android.icu.dev.test.TestFmwk {
     
     private static final String TIME_STRING = "2000/11/17 08:01:00";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRoundTripTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRoundTripTest.java
index e4f491a..709805f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRoundTripTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatRoundTripTest.java
@@ -24,10 +24,13 @@
 import android.icu.util.Calendar;
 import android.icu.util.GregorianCalendar;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /** 
  * Performs round-trip tests for DateFormat
  **/
+@RunWith(IcuTestFmwkRunner.class)
 public class DateFormatRoundTripTest extends android.icu.dev.test.TestFmwk {
     public boolean INFINITE = false;
     public boolean quick = true;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java
index 7ae7dfa..9934878 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateFormatTest.java
@@ -58,7 +58,10 @@
 import android.icu.util.ULocale;
 import android.icu.util.UResourceBundle;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DateFormatTest extends android.icu.dev.test.TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateIntervalFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateIntervalFormatTest.java
index a8824c1..79eb66d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateIntervalFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateIntervalFormatTest.java
@@ -28,7 +28,10 @@
 import android.icu.util.DateInterval;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DateIntervalFormatTest extends android.icu.dev.test.TestFmwk {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java
index 10c2fb4..75def1e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/DateTimeGeneratorTest.java
@@ -36,7 +36,10 @@
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DateTimeGeneratorTest extends TestFmwk {
     public static boolean GENERATE_TEST_DATA;
     static {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/GlobalizationPreferencesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/GlobalizationPreferencesTest.java
index b52ced9..0e1d9f4 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/GlobalizationPreferencesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/GlobalizationPreferencesTest.java
@@ -28,9 +28,12 @@
 import android.icu.util.JapaneseCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 
+@RunWith(IcuTestFmwkRunner.class)
 public class GlobalizationPreferencesTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormat.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormat.java
index e87142f..c93d90b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormat.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormat.java
@@ -25,7 +25,10 @@
 import android.icu.text.DateFormat;
 import android.icu.text.SimpleDateFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDateFormat extends android.icu.dev.test.TestFmwk {
     // Values in milliseconds (== Date)
     private static final long ONESECOND = 1000;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPI.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPI.java
index 5835b52..61f88b9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPI.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPI.java
@@ -29,7 +29,10 @@
 import android.icu.text.NumberFormat;
 import android.icu.util.Calendar;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDateFormatAPI extends android.icu.dev.test.TestFmwk
 {
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPIC.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPIC.java
index 1f55725..d1155b7 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPIC.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatAPIC.java
@@ -21,12 +21,15 @@
 import android.icu.text.DecimalFormat;
 import android.icu.text.NumberFormat;
 import android.icu.text.SimpleDateFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /*
  * This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
  * try to test the full functionality.  It just calls each function in the class and
  * verifies that it works on a basic level.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDateFormatAPIC extends android.icu.dev.test.TestFmwk {
     
     public static void main(String[] args)  throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatSymbols.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatSymbols.java
index 7eabcf2..293122b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatSymbols.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDateFormatSymbols.java
@@ -22,7 +22,10 @@
 import android.icu.text.DateFormatSymbols;
 import android.icu.util.Calendar;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDateFormatSymbols extends android.icu.dev.test.TestFmwk
 {
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPI.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPI.java
index 815a85c..25751f3 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPI.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPI.java
@@ -28,7 +28,10 @@
 import android.icu.text.DecimalFormat;
 import android.icu.text.DecimalFormatSymbols;
 import android.icu.text.NumberFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDecimalFormatAPI extends android.icu.dev.test.TestFmwk
 {
     public static void main(String[] args)  throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPIC.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPIC.java
index 790da97..4dc6836 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPIC.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatAPIC.java
@@ -25,10 +25,13 @@
 import android.icu.text.DecimalFormat;
 import android.icu.text.DecimalFormatSymbols;
 import android.icu.text.NumberFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 // This is an API test, not a unit test.  It doesn't test very many cases, and doesn't
 // try to test the full functionality.  It just calls each function in the class and
 // verifies that it works on a basic level.
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDecimalFormatAPIC extends android.icu.dev.test.TestFmwk {
     
     public static void main(String[] args)  throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
index a1ce74b..d2f5aae 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbols.java
@@ -22,7 +22,10 @@
 
 import android.icu.text.DecimalFormatSymbols;
 import android.icu.util.Currency;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDecimalFormatSymbols extends android.icu.dev.test.TestFmwk
 {
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbolsC.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbolsC.java
index 246b888..30f67e0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbolsC.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestDecimalFormatSymbolsC.java
@@ -18,10 +18,13 @@
 
 import android.icu.text.DecimalFormat;
 import android.icu.text.DecimalFormatSymbols;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Tests for DecimalFormatSymbols
  **/
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestDecimalFormatSymbolsC extends android.icu.dev.test.TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormat.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormat.java
index a774889..df997a9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormat.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormat.java
@@ -17,11 +17,14 @@
 
 import android.icu.text.DecimalFormat;
 import android.icu.text.NumberFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * This test does round-trip testing (format -> parse -> format -> parse -> etc.) of
  * NumberFormat.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestNumberFormat extends android.icu.dev.test.TestFmwk {
     
     public NumberFormat fNumberFormat;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormatAPI.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormatAPI.java
index 12af09f..84db33d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormatAPI.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestNumberFormatAPI.java
@@ -24,7 +24,10 @@
 
 import android.icu.text.NumberFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestNumberFormatAPI extends android.icu.dev.test.TestFmwk
 {
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestSimpleDateFormatAPI.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestSimpleDateFormatAPI.java
index b650e7b..07292ce 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestSimpleDateFormatAPI.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/IntlTestSimpleDateFormatAPI.java
@@ -27,11 +27,14 @@
 
 import android.icu.text.DateFormatSymbols;
 import android.icu.text.SimpleDateFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * @test 1.4 98/03/06
 * @summary test International Simple Date Format API
 */
+@RunWith(IcuTestFmwkRunner.class)
 public class IntlTestSimpleDateFormatAPI extends android.icu.dev.test.TestFmwk
 {
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/ListFormatterTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/ListFormatterTest.java
index bf19b22..1ed8dfd 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/ListFormatterTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/ListFormatterTest.java
@@ -13,7 +13,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.ListFormatter;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ListFormatterTest extends TestFmwk {
     public static void main(String[] args) {
         new ListFormatterTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java
index 311ef62..f12b25d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/MeasureUnitTest.java
@@ -38,12 +38,15 @@
 import android.icu.util.TimeUnit;
 import android.icu.util.TimeUnitAmount;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * See https://sites.google.com/site/icusite/processes/release/tasks/standards?pli=1
  * for information on how to update with each new release.
  * @author markdavis
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class MeasureUnitTest extends TestFmwk {
     
     static class OrderedPair<F extends Comparable, S extends Comparable> extends Pair<F, S> implements Comparable<OrderedPair<F, S>> {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/MessagePatternUtilTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/MessagePatternUtilTest.java
index 970bd0b..f1a060b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/MessagePatternUtilTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/MessagePatternUtilTest.java
@@ -23,11 +23,14 @@
 import android.icu.text.MessagePatternUtil.MessageNode;
 import android.icu.text.MessagePatternUtil.TextNode;
 import android.icu.text.MessagePatternUtil.VariantNode;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test MessagePatternUtil (MessagePattern-as-tree-of-nodes API)
  * by building parallel trees of nodes and verifying that they match.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public final class MessagePatternUtilTest extends android.icu.dev.test.TestFmwk {
     public static void main(String[] args) throws Exception {
         new MessagePatternUtilTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/MessageRegression.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/MessageRegression.java
index 1815203..93faf44 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/MessageRegression.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/MessageRegression.java
@@ -47,7 +47,10 @@
 import android.icu.text.MessageFormat;
 import android.icu.text.NumberFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class MessageRegression extends android.icu.dev.test.TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegistrationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegistrationTest.java
index 1aff69c..bbef5db 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegistrationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegistrationTest.java
@@ -12,7 +12,10 @@
 import android.icu.text.NumberFormat;
 import android.icu.text.NumberFormat.SimpleNumberFormatFactory;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class NumberFormatRegistrationTest extends android.icu.dev.test.TestFmwk {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegressionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegressionTest.java
index f90976c..908a41e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegressionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRegressionTest.java
@@ -27,10 +27,13 @@
 import android.icu.text.NumberFormat;
 import android.icu.util.Calendar;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /** 
  * Performs regression test for MessageFormat
  **/
+@RunWith(IcuTestFmwkRunner.class)
 public class NumberFormatRegressionTest extends android.icu.dev.test.TestFmwk {
     
     public static void main(String[] args) throws Exception{
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRoundTripTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRoundTripTest.java
index cf59f40..c2b0b17 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRoundTripTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatRoundTripTest.java
@@ -18,10 +18,13 @@
 
 import android.icu.text.DecimalFormat;
 import android.icu.text.NumberFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /** 
  * Performs round-trip tests for NumberFormat
  **/
+@RunWith(IcuTestFmwkRunner.class)
 public class NumberFormatRoundTripTest extends android.icu.dev.test.TestFmwk {
     
     public double MAX_ERROR = 1e-14;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatSpecificationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatSpecificationTest.java
index fa1f813..ab98f56 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatSpecificationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatSpecificationTest.java
@@ -13,11 +13,14 @@
 import android.icu.text.NumberFormat;
 import android.icu.util.Currency;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author rocketman
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class NumberFormatSpecificationTest extends TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java
index ba9df40..098b102 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberFormatTest.java
@@ -40,7 +40,10 @@
 import android.icu.util.Currency;
 import android.icu.util.CurrencyAmount;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class NumberFormatTest extends android.icu.dev.test.TestFmwk {
     
     private static ULocale EN = new ULocale("en");
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberRegression.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberRegression.java
index aa824ef..e7684cd 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberRegression.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/NumberRegression.java
@@ -46,7 +46,10 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.ULocale;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class NumberRegression extends android.icu.dev.test.TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatTest.java
index 27f49f8..5a6b79a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatTest.java
@@ -15,11 +15,14 @@
 import android.icu.text.CurrencyPluralInfo;
 import android.icu.text.PluralFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author tschumann (Tim Schumann)
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class PluralFormatTest extends TestFmwk {
   
   public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatUnitTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatUnitTest.java
index 5668635..5040006 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatUnitTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralFormatUnitTest.java
@@ -26,11 +26,14 @@
 import android.icu.text.PluralRules.PluralType;
 import android.icu.text.PluralRules.SampleType;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author tschumann (Tim Schumann)
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class PluralFormatUnitTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new PluralFormatUnitTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java
index 1062bc7..cca4a08 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRangesTest.java
@@ -20,11 +20,14 @@
 import android.icu.util.Measure;
 import android.icu.util.MeasureUnit;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author markdavis
  * 
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class PluralRangesTest extends TestFmwk {
     public static void main(String[] args) {
         new PluralRangesTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java
index 5a1f7fe..f39e32a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/PluralRulesTest.java
@@ -47,11 +47,14 @@
 import android.icu.text.UFieldPosition;
 import android.icu.util.Output;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author dougfelt (Doug Felt)
  * @author markdavis (Mark Davis) [for fractional support]
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class PluralRulesTest extends TestFmwk {
 
     PluralRulesFactory factory = PluralRulesFactory.NORMAL;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java
index d687c50..2a93ff1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/RBNFParseTest.java
@@ -12,7 +12,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.RuleBasedNumberFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class RBNFParseTest extends TestFmwk {
     public static void main(String[] args) {
         new RBNFParseTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfLenientScannerTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfLenientScannerTest.java
index f532df3..7ac67ae 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfLenientScannerTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfLenientScannerTest.java
@@ -17,7 +17,10 @@
 import android.icu.text.RbnfLenientScannerProvider;
 import android.icu.text.RuleBasedNumberFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class RbnfLenientScannerTest extends TestFmwk {
     private static final RbnfLenientScannerProvider provider = new RbnfScannerProviderImpl();
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfRoundTripTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfRoundTripTest.java
index e49f4d3..5954b53 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfRoundTripTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfRoundTripTest.java
@@ -11,7 +11,10 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.RuleBasedNumberFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class RbnfRoundTripTest extends TestFmwk {
     public static void main(String[] args) {
         RbnfRoundTripTest test = new RbnfRoundTripTest();
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfTest.java
index 2bbfb81..e99be6c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/RbnfTest.java
@@ -20,11 +20,14 @@
 import android.icu.text.NumberFormat;
 import android.icu.text.RuleBasedNumberFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * This does not test lenient parse mode, since testing the default implementation
  * introduces a dependency on collation.  See RbnfLenientScannerTest.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class RbnfTest extends TestFmwk {
     public static void main(String[] args) {
         RbnfTest test = new RbnfTest();
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/RelativeDateTimeFormatterTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/RelativeDateTimeFormatterTest.java
index 366a2ed..b952e41 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/RelativeDateTimeFormatterTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/RelativeDateTimeFormatterTest.java
@@ -17,7 +17,10 @@
 import android.icu.text.RelativeDateTimeFormatter.Direction;
 import android.icu.text.RelativeDateTimeFormatter.RelativeUnit;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class RelativeDateTimeFormatterTest extends TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/ScientificNumberFormatterTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/ScientificNumberFormatterTest.java
index 5cfd7ea..1e9023e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/ScientificNumberFormatterTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/ScientificNumberFormatterTest.java
@@ -12,11 +12,14 @@
 import android.icu.text.NumberFormat;
 import android.icu.text.ScientificNumberFormatter;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author rocketman
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class ScientificNumberFormatterTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new ScientificNumberFormatterTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatAPITest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatAPITest.java
index 23c7e44..e50ce41 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatAPITest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatAPITest.java
@@ -13,11 +13,14 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.SelectFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author kirtig 
  * This class tests the API functionality of the SelectFormat
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class SelectFormatAPITest extends TestFmwk {
   
     static final String SIMPLE_PATTERN1 = "feminine {feminineVerbValue1} other{otherVerbValue1}";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatUnitTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatUnitTest.java
index ed4278a..75fe251 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatUnitTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/SelectFormatUnitTest.java
@@ -10,11 +10,14 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.SelectFormat;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author kirtig 
  * This class does the unit testing for the SelectFormat
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class SelectFormatUnitTest extends TestFmwk {
   
     static final String SIMPLE_PATTERN = "feminine {feminineVerbValue} other{otherVerbValue}";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/TestAll.java
index d71d7e9..f52cbc9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/TestAll.java
@@ -9,11 +9,14 @@
 package android.icu.dev.test.format;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
 
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) {
@@ -38,7 +41,8 @@
               "Formatting Tests");
     }
 
-    public static class RBNF extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class RBNF extends TestGroup {
         public RBNF() {
             super(new String[] {
                 "RbnfTest",
@@ -48,7 +52,8 @@
         }
     }
 
-    public static class NumberFormat extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class NumberFormat extends TestGroup {
         public NumberFormat() {
             super(new String[] {
                 "CompactDecimalFormatTest",
@@ -69,7 +74,8 @@
         }
     }
 
-    public static class DateFormat extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class DateFormat extends TestGroup {
         public DateFormat() {
             super(new String[] {
                 "DateFormatMiscTests",
@@ -89,7 +95,8 @@
         }
     }
     
-    public static class DateIntervalFormat extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class DateIntervalFormat extends TestGroup {
         public DateIntervalFormat() {
             super(new String[] {
                 "DateIntervalFormatTest"
@@ -97,7 +104,8 @@
         }
     }
     
-    public static class TimeUnitFormat extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class TimeUnitFormat extends TestGroup {
         public TimeUnitFormat() {
             super(new String[] {
                 "TimeUnitTest"
@@ -105,7 +113,8 @@
         }
     }
     
-    public static class PluralFormat extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class PluralFormat extends TestGroup {
         public PluralFormat() {
             super(new String[] {
                 "PluralFormatUnitTest",
@@ -116,7 +125,8 @@
         }
     }
 
-    public static class SelectFormat extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class SelectFormat extends TestGroup {
         public SelectFormat() {
             super(new String[] {
                 "SelectFormatUnitTest",
@@ -125,7 +135,8 @@
         }
     }
 
-    public static class MessageFormat extends TestGroup {
+    @RunWith(IcuTestGroupRunner.class)
+	public static class MessageFormat extends TestGroup {
         public MessageFormat() {
             super(new String[] {
                 "TestMessageFormat",
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/TestMessageFormat.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/TestMessageFormat.java
index 517da01..45a1e23 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/TestMessageFormat.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/TestMessageFormat.java
@@ -35,7 +35,10 @@
 import android.icu.text.UFormat;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestMessageFormat extends android.icu.dev.test.TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeUnitTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeUnitTest.java
index 5a9fa37..5d9d79e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeUnitTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeUnitTest.java
@@ -21,11 +21,14 @@
 import android.icu.util.TimeUnit;
 import android.icu.util.TimeUnitAmount;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author markdavis
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeUnitTest extends TestFmwk {
     public static void main(String[] args) throws Exception{
         new TimeUnitTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeZoneFormatTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeZoneFormatTest.java
index 5b8ff74..ec84581 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeZoneFormatTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/format/TimeZoneFormatTest.java
@@ -39,7 +39,10 @@
 import android.icu.util.TimeZone.SystemTimeZoneType;
 import android.icu.util.TimeZoneTransition;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeZoneFormatTest extends android.icu.dev.test.TestFmwk {
 
     private static boolean JDKTZ = (TimeZone.getDefaultTimeZoneType() == TimeZone.TIMEZONE_JDK);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/impl/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/impl/TestAll.java
index e8cba69..927e42a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/impl/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/impl/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.impl;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) throws Exception {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/iterator/TestUCharacterIterator.java b/android_icu4j/src/main/tests/android/icu/dev/test/iterator/TestUCharacterIterator.java
index 6e0b8f1..f738ded 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/iterator/TestUCharacterIterator.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/iterator/TestUCharacterIterator.java
@@ -14,6 +14,8 @@
 import android.icu.text.ReplaceableString;
 import android.icu.text.UCharacterIterator;
 import android.icu.text.UTF16;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author ram
@@ -23,6 +25,7 @@
  * To enable and disable the creation of type comments go to
  * Window>Preferences>Java>Code Generation.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestUCharacterIterator extends TestFmwk{
 
     // constructor -----------------------------------------------------
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestAll.java
index 740797e..9c2c366 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.lang;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run character property tests.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) throws Exception {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestCharacter.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestCharacter.java
index 005ef78..85f049f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestCharacter.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestCharacter.java
@@ -8,7 +8,10 @@
 package android.icu.dev.test.lang;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
+@RunWith(IcuTestGroupRunner.class)
 public class TestCharacter extends TestGroup {
     public static void main(String[] args) {
         new TestCharacter().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScript.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScript.java
index e27bbdc..af31264 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScript.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScript.java
@@ -17,7 +17,10 @@
 import android.icu.lang.UScript.ScriptUsage;
 import android.icu.text.UnicodeSet;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestUScript extends TestFmwk {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScriptRun.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScriptRun.java
index 1f2b79d..6a8783d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScriptRun.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/TestUScriptRun.java
@@ -11,7 +11,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.lang.UScript;
 import android.icu.lang.UScriptRun;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestUScriptRun extends TestFmwk
 {
     public TestUScriptRun()
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java
index 527290e..f801ada 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCaseTest.java
@@ -24,6 +24,8 @@
 import android.icu.text.RuleBasedBreakIterator;
 import android.icu.text.UTF16;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -32,6 +34,7 @@
 * @author Syn Wee Quek
 * @since march 14 2002
 */
+@RunWith(IcuTestFmwkRunner.class)
 public final class UCharacterCaseTest extends TestFmwk
 {
     // constructor -----------------------------------------------------------
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCategoryTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCategoryTest.java
index e140a81..89079da 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCategoryTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterCategoryTest.java
@@ -8,12 +8,15 @@
 package android.icu.dev.test.lang;
 import android.icu.dev.test.TestFmwk;
 import android.icu.lang.UCharacterCategory;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * Testing UCharacterCategory
 * @author Syn Wee Quek
 * @since April 02 2002
 */
+@RunWith(IcuTestFmwkRunner.class)
 public class UCharacterCategoryTest extends TestFmwk
 {
     // constructor -----------------------------------------------------------
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterDirectionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterDirectionTest.java
index 858b827..3993592 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterDirectionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterDirectionTest.java
@@ -9,12 +9,15 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.lang.UCharacterDirection;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * Testing UCharacterDirection
 * @author Syn Wee Quek
 * @since July 22 2002
 */
+@RunWith(IcuTestFmwkRunner.class)
 public class UCharacterDirectionTest extends TestFmwk
 {    
     // constructor -----------------------------------------------------------
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterSurrogateTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterSurrogateTest.java
index 7457c4e..e624323 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterSurrogateTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterSurrogateTest.java
@@ -12,10 +12,13 @@
 import android.icu.impl.Utility;
 import android.icu.lang.UCharacter;
 import android.icu.text.UTF16;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test JDK 1.5 cover APIs.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public final class UCharacterSurrogateTest extends TestFmwk {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterTest.java
index a62574e..b169673 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterTest.java
@@ -34,6 +34,8 @@
 import android.icu.util.ULocale;
 import android.icu.util.ValueIterator;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * Testing class for UCharacter
@@ -41,6 +43,7 @@
 * @author Syn Wee Quek
 * @since nov 04 2000
 */
+@RunWith(IcuTestFmwkRunner.class)
 public final class UCharacterTest extends TestFmwk
 {
     // private variables =============================================
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterThreadTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterThreadTest.java
index 1abcd29..daa35af 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterThreadTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UCharacterThreadTest.java
@@ -13,11 +13,14 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.lang.UCharacter;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author aheninger
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class UCharacterThreadTest extends TestFmwk {
   // constructor -----------------------------------------------------------
     
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UPropertyAliasesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UPropertyAliasesTest.java
index 6923db3..b2e7a41 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UPropertyAliasesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UPropertyAliasesTest.java
@@ -14,7 +14,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.lang.UCharacter;
 import android.icu.lang.UProperty;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class UPropertyAliasesTest extends TestFmwk {
   
     public UPropertyAliasesTest() {}
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UTF16Test.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UTF16Test.java
index 8a42a18..5cce7a6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UTF16Test.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UTF16Test.java
@@ -15,12 +15,15 @@
 import android.icu.text.ReplaceableString;
 import android.icu.text.UTF16;
 import android.icu.text.UTF16.StringComparator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * Testing class for UTF16
 * @author Syn Wee Quek
 * @since feb 09 2001
 */
+@RunWith(IcuTestFmwkRunner.class)
 public final class UTF16Test extends TestFmwk
 {
     // constructor ===================================================
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetStringSpanTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetStringSpanTest.java
index 08c9ad4..8d00666 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetStringSpanTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetStringSpanTest.java
@@ -15,11 +15,14 @@
 import android.icu.text.UnicodeSet;
 import android.icu.text.UnicodeSet.SpanCondition;
 import android.icu.util.OutputInt;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary General test of UnicodeSet string span.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class UnicodeSetStringSpanTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java
index 8ade31d..10e1279 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/lang/UnicodeSetTest.java
@@ -42,11 +42,14 @@
 import android.icu.text.UnicodeSetSpanner.CountMethod;
 import android.icu.text.UnicodeSetSpanner.TrimOption;
 import android.icu.util.OutputInt;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary General test of UnicodeSet
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class UnicodeSetTest extends TestFmwk {
 
     static final String NOT = "%%%%";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/BasicTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/BasicTest.java
index 2ab1c3f..7f5700d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/BasicTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/BasicTest.java
@@ -26,8 +26,11 @@
 import android.icu.text.UTF16;
 import android.icu.text.UnicodeSet;
 import android.icu.text.UnicodeSetIterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
+@RunWith(IcuTestFmwkRunner.class)
 public class BasicTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new BasicTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/ConformanceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/ConformanceTest.java
index bead972..9e0cf82 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/ConformanceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/ConformanceTest.java
@@ -18,7 +18,10 @@
 import android.icu.text.Normalizer;
 import android.icu.text.UTF16;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ConformanceTest extends TestFmwk {
 
     Normalizer normalizer;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizationMonkeyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizationMonkeyTest.java
index 000f86c..de8e5a7 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizationMonkeyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizationMonkeyTest.java
@@ -15,7 +15,10 @@
 import android.icu.lang.UCharacterCategory;
 import android.icu.text.Normalizer;
 import android.icu.text.UTF16;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class NormalizationMonkeyTest extends TestFmwk {
     int loopCount = 100;
     int maxCharCount = 20;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizerRegressionTests.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizerRegressionTests.java
index 0fe6f71..bf4aba8 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizerRegressionTests.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/NormalizerRegressionTests.java
@@ -10,7 +10,10 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.Normalizer;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class NormalizerRegressionTests extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new NormalizerRegressionTests().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestAll.java
index ed5e6e6..c5f44bf 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.normalizer;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run normalizer tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestCanonicalIterator.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestCanonicalIterator.java
index 564a941..593a603 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestCanonicalIterator.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestCanonicalIterator.java
@@ -19,10 +19,13 @@
 import android.icu.text.CanonicalIterator;
 import android.icu.text.Normalizer;
 import android.icu.text.UTF16;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 // TODO: fit into test framework
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestCanonicalIterator extends TestFmwk {
     
     static final boolean SHOW_NAMES = false;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestDeprecatedNormalizerAPI.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestDeprecatedNormalizerAPI.java
index 35e3f0e..d03220c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestDeprecatedNormalizerAPI.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/TestDeprecatedNormalizerAPI.java
@@ -14,7 +14,10 @@
 import android.icu.text.ComposedCharIter;
 import android.icu.text.Normalizer;
 import android.icu.text.StringCharacterIterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestDeprecatedNormalizerAPI extends TestFmwk
 {
      
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UTS46Test.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UTS46Test.java
index 0e2af87..8599dcf 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UTS46Test.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UTS46Test.java
@@ -16,12 +16,15 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.Normalizer2Impl.UTF16Plus;
 import android.icu.text.IDNA;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * UTS #46 (IDNA2008) test.
  * @author Markus Scherer
  * @since 2010jul10
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class UTS46Test extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new UTS46Test().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UnicodeNormalizerConformanceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UnicodeNormalizerConformanceTest.java
index 313f4ae..4d556b6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UnicodeNormalizerConformanceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/normalizer/UnicodeNormalizerConformanceTest.java
@@ -15,8 +15,11 @@
 import android.icu.dev.test.TestUtil;
 import android.icu.text.UTF16;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
+@RunWith(IcuTestFmwkRunner.class)
 public class UnicodeNormalizerConformanceTest extends TestFmwk {
 
     UnicodeNormalizer normalizer_C, normalizer_D, normalizer_KC, normalizer_KD;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorRegTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorRegTest.java
index 56fe1b1..2fb35ed 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorRegTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorRegTest.java
@@ -13,7 +13,10 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.BreakIterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class BreakIteratorRegTest extends TestFmwk
 {
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java
index af2a165..1cc8afe 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/BreakIteratorTest.java
@@ -16,7 +16,10 @@
 import android.icu.text.BreakIterator;
 import android.icu.text.FilteredBreakIteratorBuilder;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class BreakIteratorTest extends TestFmwk
 {
     private BreakIterator characterBreak;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIAPITest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIAPITest.java
index 66e5785..53313e7 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIAPITest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBIAPITest.java
@@ -20,10 +20,13 @@
 import android.icu.text.BreakIterator;
 import android.icu.text.RuleBasedBreakIterator;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * API Test the RuleBasedBreakIterator class
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class RBBIAPITest extends android.icu.dev.test.TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java
index 5c56eeb..c8347b2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITest.java
@@ -23,7 +23,10 @@
 import android.icu.text.BreakIterator;
 import android.icu.text.RuleBasedBreakIterator;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class RBBITest extends TestFmwk {  
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestExtended.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestExtended.java
index 692b917..5ed8313 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestExtended.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestExtended.java
@@ -19,6 +19,8 @@
 import android.icu.text.BreakIterator;
 import android.icu.text.UTF16;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -28,6 +30,7 @@
  *      See the data file for a description of the tests.
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class RBBITestExtended extends TestFmwk {
 
     public static void main(String[] args)throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestMonkey.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestMonkey.java
index 1b75950..cf77913 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestMonkey.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/RBBITestMonkey.java
@@ -21,6 +21,8 @@
 import android.icu.text.RuleBasedBreakIterator;
 import android.icu.text.UTF16;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -33,6 +35,7 @@
  * Ported from ICU4C, original code in file source/test/intltest/rbbitst.cpp
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class RBBITestMonkey extends TestFmwk {
     
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/SimpleBITest.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/SimpleBITest.java
index 072f9fd..dcc5650 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/SimpleBITest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/SimpleBITest.java
@@ -12,6 +12,8 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.BreakIterator;
 import android.icu.text.RuleBasedBreakIterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 // TODO: {dlf} this test currently doesn't test anything!
 // You'll notice that the resource that uses the dictionary isn't even on the resource path,
@@ -45,6 +47,7 @@
 // that important, since we have a thai dictionary that we do test thoroughly.
 //
 
+@RunWith(IcuTestFmwkRunner.class)
 public class SimpleBITest extends TestFmwk{
     public static final String testText =
 //        "The rain in Spain stays mainly on the plain.  The plains in Spain are mainly pained with rain.";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/TestAll.java
index 246db34..f9b3616 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/rbbi/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.rbbi;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/sample/ModuleTestSample.java b/android_icu4j/src/main/tests/android/icu/dev/test/sample/ModuleTestSample.java
index fe020c9..b581011 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/sample/ModuleTestSample.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/sample/ModuleTestSample.java
@@ -8,7 +8,10 @@
 package android.icu.dev.test.sample;
 
 import android.icu.dev.test.ModuleTest;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ModuleTestSample extends ModuleTest {
     public static void main(String[] args) throws Exception {
     new ModuleTestSample().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/search/SearchTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/search/SearchTest.java
index aad8a34..f5462f8 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/search/SearchTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/search/SearchTest.java
@@ -33,7 +33,10 @@
 import android.icu.text.SearchIterator.ElementComparisonType;
 import android.icu.text.StringSearch;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class SearchTest extends TestFmwk {
 
     //inner class
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CompatibilityTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CompatibilityTest.java
index a71a765..848c2bb 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CompatibilityTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CompatibilityTest.java
@@ -25,10 +25,13 @@
 import java.util.jar.JarFile;
 
 import android.icu.dev.test.TestFmwk;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author emader
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CompatibilityTest extends TestFmwk
 {
     public class FolderTarget extends Target
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CoverageTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CoverageTest.java
index 46c6961..457f071 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CoverageTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/CoverageTest.java
@@ -20,6 +20,8 @@
 import java.util.Enumeration;
 
 import android.icu.impl.URLHandler;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author emader
@@ -27,6 +29,7 @@
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CoverageTest extends CompatibilityTest implements URLHandler.URLVisitor
 {
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableTest.java
index 2be1065..edf7591 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableTest.java
@@ -39,6 +39,8 @@
 import android.icu.util.TimeZoneRule;
 import android.icu.util.ULocale;
 import android.icu.util.VTimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * @author emader
@@ -46,6 +48,7 @@
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
+@RunWith(IcuTestGroupRunner.class)
 public class SerializableTest extends TestFmwk.TestGroup
 {
     public interface Handler
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableWriter.java b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableWriter.java
index 38e1824..999f284 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableWriter.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/serializable/SerializableWriter.java
@@ -12,6 +12,8 @@
 import java.net.URL;
 
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * This class writes the test objects for each class to a file. The work is
@@ -19,6 +21,7 @@
  * a CoverageTest w/ a non-null path, which tells it to write the data.
  * 
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class SerializableWriter extends CoverageTest
 {
     public SerializableWriter(String path)
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/shaping/ArabicShapingRegTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/shaping/ArabicShapingRegTest.java
index f0d8a77..630867f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/shaping/ArabicShapingRegTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/shaping/ArabicShapingRegTest.java
@@ -13,10 +13,13 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.ArabicShaping;
 import android.icu.text.ArabicShapingException;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Regression test for Arabic shaping.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class ArabicShapingRegTest extends TestFmwk {
 
     /* constants copied from ArabicShaping for convenience */
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/IDNAConformanceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/IDNAConformanceTest.java
index cba4fbe..a613341 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/IDNAConformanceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/IDNAConformanceTest.java
@@ -23,11 +23,14 @@
 import android.icu.text.IDNA;
 import android.icu.text.StringPrepParseException;
 import android.icu.text.UTF16;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author limaoyu
  * 
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class IDNAConformanceTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestAll.java
index 896ed2f..c97bdd9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestAll.java
@@ -8,6 +8,8 @@
 package android.icu.dev.test.stringprep;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * @author ram
@@ -15,6 +17,7 @@
  * To change the template for this generated type comment go to
  * Window>Preferences>Java>Code Generation>Code and Comments
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNA.java b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNA.java
index 875b311..28ab13e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNA.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNA.java
@@ -16,10 +16,13 @@
 import android.icu.text.StringPrepParseException;
 import android.icu.text.UCharacterIterator;
 import android.icu.text.UTF16;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author ram
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestIDNA extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new TestIDNA().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNARef.java b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNARef.java
index 4edc1e1..b1dff49 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNARef.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestIDNARef.java
@@ -10,6 +10,8 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.StringPrepParseException;
 import android.icu.text.UCharacterIterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author ram
@@ -17,6 +19,7 @@
  * To change the template for this generated type comment go to
  * Window>Preferences>Java>Code Generation>Code and Comments
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestIDNARef extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new TestIDNARef().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrep.java b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrep.java
index 6a0bd8a..abd013b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrep.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrep.java
@@ -12,11 +12,14 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.StringPrep;
 import android.icu.text.StringPrepParseException;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author ram
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestStringPrep extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new TestStringPrep().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrepProfiles.java b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrepProfiles.java
index aab5054..71cfbd6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrepProfiles.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/stringprep/TestStringPrepProfiles.java
@@ -10,11 +10,14 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.text.StringPrep;
 import android.icu.text.StringPrepParseException;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author Michael Ow
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestStringPrepProfiles extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new TestStringPrepProfiles().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/text/SpoofCheckerTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/text/SpoofCheckerTest.java
index 89c746b..683bc69 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/text/SpoofCheckerTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/text/SpoofCheckerTest.java
@@ -35,7 +35,10 @@
 import android.icu.text.SpoofChecker.RestrictionLevel;
 import android.icu.text.UnicodeSet;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class SpoofCheckerTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/text/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/text/TestAll.java
index c8fa1e5..49ce88d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/text/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/text/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.text;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run text tests.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) throws Exception {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TestAll.java
index c417f5f..96ba1ac 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TestAll.java
@@ -10,10 +10,13 @@
 package android.icu.dev.test.timescale;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run time scale tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
 
     public TestAll() {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleAPITest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleAPITest.java
index 6125cae..574ebd3 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleAPITest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleAPITest.java
@@ -12,10 +12,13 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.math.BigDecimal;
 import android.icu.util.UniversalTimeScale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test UniversalTimeScale API
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeScaleAPITest extends TestFmwk
 {
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleDataTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleDataTest.java
index 7ec1d95..5c739ab 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleDataTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleDataTest.java
@@ -17,6 +17,8 @@
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
 import android.icu.util.UniversalTimeScale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author Owner
@@ -24,6 +26,7 @@
  * TODO To change the template for this generated type comment go to
  * Window - Preferences - Java - Code Style - Code Templates
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeScaleDataTest extends TestFmwk
 {
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleMonkeyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleMonkeyTest.java
index b326672..98d421b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleMonkeyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timescale/TimeScaleMonkeyTest.java
@@ -14,12 +14,15 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.math.BigDecimal;
 import android.icu.util.UniversalTimeScale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * This class tests the UniversalTimeScale class by
  * generating ramdon values in range and making sure
  * that they round-trip correctly.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeScaleMonkeyTest extends TestFmwk
 {
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TestAll.java
index 621cffb..2f7d26c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.timezone;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) throws Exception {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneAliasTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneAliasTest.java
index 0336f12..38ec523 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneAliasTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneAliasTest.java
@@ -24,6 +24,8 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -31,6 +33,7 @@
  * @author Davis
  * 
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeZoneAliasTest extends TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneBoundaryTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneBoundaryTest.java
index eeb8836..0710c0a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneBoundaryTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneBoundaryTest.java
@@ -15,11 +15,14 @@
 import android.icu.util.Calendar;
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * A test which discovers the boundaries of DST programmatically and verifies
  * that they are correct.
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeZoneBoundaryTest extends TestFmwk
 {
     static final int ONE_SECOND = 1000;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneOffsetLocalTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneOffsetLocalTest.java
index c923ab8..3263aef 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneOffsetLocalTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneOffsetLocalTest.java
@@ -20,10 +20,13 @@
 import android.icu.util.RuleBasedTimeZone;
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Testing getOffset APIs using local time
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeZoneOffsetLocalTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegression.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegression.java
index d2f9245..27b9935 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegression.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRegression.java
@@ -30,7 +30,10 @@
 import android.icu.util.SimpleTimeZone;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeZoneRegression extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRuleTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRuleTest.java
index cf68b1b..06e1b8c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRuleTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneRuleTest.java
@@ -31,10 +31,13 @@
 import android.icu.util.TimeZoneTransition;
 import android.icu.util.ULocale;
 import android.icu.util.VTimeZone;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for TimeZoneRule and RuleBasedTimeZone
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeZoneRuleTest extends TestFmwk {
 
     private static final int HOUR = 60 * 60 * 1000;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java
index 4c4c6e0..dcfe21e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/timezone/TimeZoneTest.java
@@ -39,6 +39,8 @@
 import android.icu.util.UResourceBundle;
 import android.icu.util.VTimeZone;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test 1.22 99/09/21
@@ -46,6 +48,7 @@
  * @summary test TimeZone
  * @build TimeZoneTest
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TimeZoneTest extends TestFmwk
 {
     static final int millisPerHour = 3600000;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/AnyScriptTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/AnyScriptTest.java
index 1e8984f..1e7192b 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/AnyScriptTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/AnyScriptTest.java
@@ -14,11 +14,14 @@
 import android.icu.text.UnicodeSet;
 import android.icu.text.UnicodeSetIterator;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author markdavis
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class AnyScriptTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new AnyScriptTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/CompoundTransliteratorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/CompoundTransliteratorTest.java
index 12f0300..0152e5f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/CompoundTransliteratorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/CompoundTransliteratorTest.java
@@ -10,6 +10,8 @@
 import android.icu.impl.Utility;
 import android.icu.text.ReplaceableString;
 import android.icu.text.Transliterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 
@@ -17,6 +19,7 @@
  * @test
  * @summary General test of CompoundTransliterator
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CompoundTransliteratorTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/ErrorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/ErrorTest.java
index 38b97ea..3f6ccb6 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/ErrorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/ErrorTest.java
@@ -10,11 +10,14 @@
 import android.icu.text.ReplaceableString;
 import android.icu.text.Transliterator;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary Error condition test of Transliterator
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class ErrorTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/JamoTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/JamoTest.java
index 74bc82c..8035fae 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/JamoTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/JamoTest.java
@@ -12,11 +12,14 @@
 
 import android.icu.impl.Utility;
 import android.icu.text.Transliterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary Test the Latin-Jamo transliterator
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class JamoTest extends TransliteratorTest {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/PrettyPrinterTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/PrettyPrinterTest.java
index 7a23608..2579edc 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/PrettyPrinterTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/PrettyPrinterTest.java
@@ -13,7 +13,10 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.dev.util.PrettyPrinter;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class PrettyPrinterTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new PrettyPrinterTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/RegexUtilitiesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/RegexUtilitiesTest.java
index 5c332bd..896b635 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/RegexUtilitiesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/RegexUtilitiesTest.java
@@ -20,10 +20,13 @@
 import android.icu.text.Transliterator;
 import android.icu.text.UTF16;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author markdavis
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class RegexUtilitiesTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/ReplaceableTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/ReplaceableTest.java
index 1f22d4c..a886a9e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/ReplaceableTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/ReplaceableTest.java
@@ -12,11 +12,14 @@
 import android.icu.text.Replaceable;
 import android.icu.text.ReplaceableString;
 import android.icu.text.Transliterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary Round trip test of Transliterator
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class ReplaceableTest extends TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/RoundTripTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/RoundTripTest.java
index 2e92777..419d3f1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/RoundTripTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/RoundTripTest.java
@@ -29,11 +29,14 @@
 import android.icu.text.UnicodeSetIterator;
 import android.icu.util.LocaleData;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary Round trip test of Transliterator
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class RoundTripTest extends TestFmwk {
 
     //TODO - revisit test cases referencing FIX_ME
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestAll.java
index bf6daa1..af82e9c 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestAll.java
@@ -8,11 +8,14 @@
 package android.icu.dev.test.translit;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
 
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestUnicodeProperty.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestUnicodeProperty.java
index 3cd7b7e..fa4f8e0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestUnicodeProperty.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/TestUnicodeProperty.java
@@ -15,11 +15,14 @@
 import android.icu.dev.util.UnicodeProperty.Factory;
 import android.icu.dev.util.UnicodePropertySymbolTable;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author markdavis
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TestUnicodeProperty extends TestFmwk{
     public static void main(String[] args) {
         new TestUnicodeProperty().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/ThreadTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/ThreadTest.java
index ed306e3..698f108 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/ThreadTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/ThreadTest.java
@@ -10,10 +10,13 @@
 import java.util.ArrayList;
 
 import android.icu.text.Transliterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 // Test for ICU Ticket #7201.  With threading bugs in RuleBasedTransliterator, this
 //   test would reliably crash.
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ThreadTest extends TransliteratorTest {
     public static void main(String[] args) throws Exception {
         new ThreadTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/TransliteratorTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/TransliteratorTest.java
index 96116c2..ce54b73 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/TransliteratorTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/TransliteratorTest.java
@@ -36,6 +36,8 @@
 import android.icu.text.UnicodeSetIterator;
 import android.icu.util.CaseInsensitiveString;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /***********************************************************************
 
@@ -86,6 +88,7 @@
  * @test
  * @summary General test of Transliterator
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class TransliteratorTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/translit/UnicodeMapTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/translit/UnicodeMapTest.java
index 2e0a922..798066d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/translit/UnicodeMapTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/translit/UnicodeMapTest.java
@@ -24,11 +24,14 @@
 import android.icu.impl.Utility;
 import android.icu.text.UTF16;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary General test of UnicodeSet
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class UnicodeMapTest extends TestFmwk {
 
     static final int MODIFY_TEST_LIMIT = 32;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/BytesTrieTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/BytesTrieTest.java
index eeef999..780e8d9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/BytesTrieTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/BytesTrieTest.java
@@ -18,7 +18,10 @@
 import android.icu.util.BytesTrie;
 import android.icu.util.BytesTrieBuilder;
 import android.icu.util.StringTrieBuilder;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class BytesTrieTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new BytesTrieTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/CharsTrieTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/CharsTrieTest.java
index 98ec7b9..38bb73e 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/CharsTrieTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/CharsTrieTest.java
@@ -19,7 +19,10 @@
 import android.icu.util.CharsTrie;
 import android.icu.util.CharsTrieBuilder;
 import android.icu.util.StringTrieBuilder;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class CharsTrieTest extends TestFmwk {
     public static void main(String[] args) throws Exception {
         new CharsTrieTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/CompactArrayTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/CompactArrayTest.java
index 157c6f1..a2447eb 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/CompactArrayTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/CompactArrayTest.java
@@ -11,10 +11,13 @@
 import android.icu.impl.Utility;
 import android.icu.util.CompactByteArray;
 import android.icu.util.CompactCharArray;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @since release 2.2
  */
+@RunWith(IcuTestFmwkRunner.class)
 public final class CompactArrayTest extends TestFmwk 
 { 
     public static void main(String[] args) throws Exception
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java
index fd1d64c..de7c12a 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/CurrencyTest.java
@@ -34,11 +34,14 @@
 import android.icu.util.GregorianCalendar;
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary General test of Currency
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class CurrencyTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesTest.java
index 4d05f8e..981c828 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/DebugUtilitiesTest.java
@@ -8,11 +8,14 @@
 package android.icu.dev.test.util;
 
 import android.icu.dev.test.TestFmwk;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author srl
  *
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class DebugUtilitiesTest extends TestFmwk {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/DisplayNameTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/DisplayNameTest.java
index 9cb0e19..e6e8a00 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/DisplayNameTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/DisplayNameTest.java
@@ -25,7 +25,10 @@
 import android.icu.util.TimeZone;
 import android.icu.util.ULocale;
 import android.icu.util.UResourceBundle;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class DisplayNameTest extends TestFmwk {
     static final boolean SHOW_ALL = false;
     
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/GenderInfoTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/GenderInfoTest.java
index 1766f93..fcb15fc 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/GenderInfoTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/GenderInfoTest.java
@@ -14,7 +14,10 @@
 import android.icu.util.GenderInfo;
 import android.icu.util.GenderInfo.Gender;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class GenderInfoTest extends TestFmwk {
     public static void main(String[] args) {
         new GenderInfoTest().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUBinaryTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUBinaryTest.java
index b53817a..caedb3d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUBinaryTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUBinaryTest.java
@@ -13,6 +13,8 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.ICUBinary;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * Testing class for Trie. Tests here will be simple, since both CharTrie and 
@@ -21,6 +23,7 @@
 * @author Syn Wee Quek
 * @since release 2.1 Jan 01 2002
 */
+@RunWith(IcuTestFmwkRunner.class)
 public final class ICUBinaryTest extends TestFmwk 
 { 
     // constructor ---------------------------------------------------
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleCollationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleCollationTest.java
index 2a04540..d5daac1 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleCollationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleCollationTest.java
@@ -14,8 +14,11 @@
 import android.icu.text.Collator;
 import android.icu.util.ULocale;
 import android.icu.util.UResourceBundle;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
+@RunWith(IcuTestFmwkRunner.class)
 public final class ICUResourceBundleCollationTest extends TestFmwk {
     private static final String COLLATION_RESNAME = "collations";
     private static final String COLLATION_KEYWORD = "collation";
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleTest.java
index 8742f4c..5592522 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUResourceBundleTest.java
@@ -32,7 +32,10 @@
 import android.icu.util.UResourceBundle;
 import android.icu.util.UResourceBundleIterator;
 import android.icu.util.UResourceTypeMismatchException;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public final class ICUResourceBundleTest extends TestFmwk {
     private static final ClassLoader testLoader = ICUResourceBundleTest.class.getClassLoader();
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceTest.java
index 637a1f7..084fc00 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceTest.java
@@ -36,7 +36,10 @@
 import android.icu.impl.ICUService.SimpleFactory;
 import android.icu.impl.LocaleUtility;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ICUServiceTest extends TestFmwk
 {
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceThreadTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceThreadTest.java
index ee102e8..c07d78f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceThreadTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ICUServiceThreadTest.java
@@ -30,7 +30,10 @@
 import android.icu.impl.ICUService.Factory;
 import android.icu.impl.ICUService.SimpleFactory;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ICUServiceThreadTest extends TestFmwk
 {
     private static final boolean PRINTSTATS = false;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasCollationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasCollationTest.java
index 1d1bb06..e989f31 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasCollationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasCollationTest.java
@@ -12,7 +12,10 @@
 
 import android.icu.text.Collator;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class LocaleAliasCollationTest extends android.icu.dev.test.TestFmwk {
     private static final ULocale[][] _LOCALES = {
             {new ULocale("en", "RH"), new ULocale("en", "ZW")},
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasTest.java
index 0de2640..0ec47e9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleAliasTest.java
@@ -20,7 +20,10 @@
 import android.icu.util.Calendar;
 import android.icu.util.ULocale;
 import android.icu.util.UResourceBundle;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class LocaleAliasTest extends android.icu.dev.test.TestFmwk {
     private static final ULocale[][] _LOCALES = {
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleBuilderTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleBuilderTest.java
index e25df37..6c86008 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleBuilderTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleBuilderTest.java
@@ -13,10 +13,13 @@
 import android.icu.util.IllformedLocaleException;
 import android.icu.util.ULocale;
 import android.icu.util.ULocale.Builder;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test cases for ULocale.LocaleBuilder
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class LocaleBuilderTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleDataTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleDataTest.java
index 1b7c898..3a1b2aa 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleDataTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleDataTest.java
@@ -18,6 +18,8 @@
 import android.icu.util.ICUException;
 import android.icu.util.LocaleData;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @author ram
@@ -25,6 +27,7 @@
  * To change the template for this generated type comment go to
  * Window>Preferences>Java>Code Generation>Code and Comments
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class LocaleDataTest extends TestFmwk{
 
     public static void main(String[] args) throws Exception{
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleMatcherTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleMatcherTest.java
index f7999b9..72dc624 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleMatcherTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocaleMatcherTest.java
@@ -16,12 +16,15 @@
 import android.icu.util.LocaleMatcher.LanguageMatcherData;
 import android.icu.util.LocalePriorityList;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test the LocaleMatcher.
  * 
  * @author markdavis
  */
+@RunWith(IcuTestFmwkRunner.class)
 @SuppressWarnings("deprecation")
 public class LocaleMatcherTest extends TestFmwk {
 
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocalePriorityListTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocalePriorityListTest.java
index 10e3eda..127d20f 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/LocalePriorityListTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/LocalePriorityListTest.java
@@ -11,11 +11,14 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.util.LocalePriorityList;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * Test the LanguagePriorityList
  * @author markdavis@google.com
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class LocalePriorityListTest extends TestFmwk {
     
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java
index c3fcdf9..4fdd62d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/RegionTest.java
@@ -18,12 +18,15 @@
 import android.icu.dev.test.TestFmwk;
 import android.icu.util.Region;
 import android.icu.util.Region.RegionType;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary General test of Regions
  */
 
+@RunWith(IcuTestFmwkRunner.class)
 public class RegionTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/SimplePatternFormatterTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/SimplePatternFormatterTest.java
index 08d2b11..004df78 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/SimplePatternFormatterTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/SimplePatternFormatterTest.java
@@ -11,7 +11,10 @@
 import android.icu.impl.SimplePatternFormatter;
 import android.icu.text.MessageFormat;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class SimplePatternFormatterTest extends TestFmwk {
 
     /**
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/StringTokenizerTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/StringTokenizerTest.java
index ba7ad18..f652bf4 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/StringTokenizerTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/StringTokenizerTest.java
@@ -13,12 +13,15 @@
 import android.icu.text.ReplaceableString;
 import android.icu.text.UnicodeSet;
 import android.icu.util.StringTokenizer;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * Testing class for StringTokenizer class
 * @author Syn Wee Quek
 * @since oct 26 2002
 */
+@RunWith(IcuTestFmwkRunner.class)
 public final class StringTokenizerTest extends TestFmwk
 { 
       // constructor ===================================================
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/TestAll.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/TestAll.java
index 5b8e9e5..c9737a9 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/TestAll.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/TestAll.java
@@ -8,10 +8,13 @@
 package android.icu.dev.test.util;
 
 import android.icu.dev.test.TestFmwk.TestGroup;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestGroupRunner;
 
 /**
  * Top level test used to run all other tests as a batch.
  */
+@RunWith(IcuTestGroupRunner.class)
 public class TestAll extends TestGroup {
     public static void main(String[] args) throws Exception {
         new TestAll().run(args);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/TestUtilities.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/TestUtilities.java
index c1cbe9f..58051d5 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/TestUtilities.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/TestUtilities.java
@@ -32,7 +32,10 @@
 import android.icu.lang.UCharacter;
 import android.icu.lang.UProperty;
 import android.icu.text.UnicodeSet;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TestUtilities extends TestFmwk {
     static final int LIMIT = 0x15; // limit to make testing more realistic in terms of collisions
     static final int ITERATIONS = 1000000;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java
index b67f559..6837ef2 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/TextTrieMapTest.java
@@ -11,7 +11,10 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.impl.TextTrieMap;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TextTrieMapTest extends TestFmwk {
 
     private static final Integer SUN = new Integer(1);
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/Trie2Test.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/Trie2Test.java
index 004b195..53e8f30 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/Trie2Test.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/Trie2Test.java
@@ -21,7 +21,10 @@
 import android.icu.impl.Trie2Writable;
 import android.icu.impl.Trie2_16;
 import android.icu.impl.Trie2_32;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class Trie2Test extends TestFmwk {
     /**
      * Constructor
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieMapTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieMapTest.java
index 6401118..f8d3fb8 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieMapTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieMapTest.java
@@ -29,7 +29,10 @@
 import android.icu.text.UnicodeSet;
 import android.icu.util.StringTrieBuilder.Option;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class TrieMapTest extends TestFmwk {
     static final boolean SHORT = false;
     static final boolean HACK_TO_MAKE_TESTS_PASS = false;
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieTest.java
index f080d9e..ceecbd0 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/TrieTest.java
@@ -17,6 +17,8 @@
 import android.icu.impl.TrieIterator;
 import android.icu.text.UTF16;
 import android.icu.util.RangeValueIterator;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
 * Testing class for Trie. Tests here will be simple, since both CharTrie and 
@@ -25,6 +27,7 @@
 * @author Syn Wee Quek
 * @since release 2.1 Jan 01 2002
 */
+@RunWith(IcuTestFmwkRunner.class)
 public final class TrieTest extends TestFmwk 
 { 
     // constructor ---------------------------------------------------
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java
index 6adf4e3..f0ba99d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleCollationTest.java
@@ -29,7 +29,10 @@
 import android.icu.text.LocaleDisplayNames.UiListItem;
 import android.icu.util.IllformedLocaleException;
 import android.icu.util.ULocale;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ULocaleCollationTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleTest.java
index ac49c62..b679ff4 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/ULocaleTest.java
@@ -44,7 +44,10 @@
 import android.icu.util.ULocale.Minimize;
 import android.icu.util.UResourceBundle;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
+@RunWith(IcuTestFmwkRunner.class)
 public class ULocaleTest extends TestFmwk {
 
     // Ticket #8078 and #11674
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java
index ff07b19..da245e4 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/UtilityTest.java
@@ -23,11 +23,14 @@
 import android.icu.text.UnicodeSet;
 import android.icu.util.ByteArrayWrapper;
 import android.icu.util.CaseInsensitiveString;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 /**
  * @test
  * @summary Test of internal Utility class
  */
+@RunWith(IcuTestFmwkRunner.class)
 public class UtilityTest extends TestFmwk {
 
     public static void main(String[] args) throws Exception {
diff --git a/android_icu4j/src/main/tests/android/icu/dev/test/util/VersionInfoTest.java b/android_icu4j/src/main/tests/android/icu/dev/test/util/VersionInfoTest.java
index 25c2641..88f438d 100644
--- a/android_icu4j/src/main/tests/android/icu/dev/test/util/VersionInfoTest.java
+++ b/android_icu4j/src/main/tests/android/icu/dev/test/util/VersionInfoTest.java
@@ -14,6 +14,8 @@
 
 import android.icu.dev.test.TestFmwk;
 import android.icu.util.VersionInfo;
+import org.junit.runner.RunWith;
+import android.icu.junit.IcuTestFmwkRunner;
 
 
 /**
@@ -21,6 +23,7 @@
 * @author Syn Wee Quek
 * @since release 2.1 March 01 2002
 */
+@RunWith(IcuTestFmwkRunner.class)
 public final class VersionInfoTest extends TestFmwk 
 { 
     // constructor ---------------------------------------------------
diff --git a/tools/srcgen/generate_android_icu4j.sh b/tools/srcgen/generate_android_icu4j.sh
index 8e376e9..d9b07ba 100755
--- a/tools/srcgen/generate_android_icu4j.sh
+++ b/tools/srcgen/generate_android_icu4j.sh
@@ -72,7 +72,7 @@
 echo Processing test code
 # Create the android_icu4j test code
 ALL_TEST_INPUT_DIRS="${TEST_INPUT_DIRS} ${TESTDATA_DIR}"
-java ${SRCGEN_JAVA_ARGS} -cp ${CLASSPATH} com.android.icu4j.srcgen.Icu4jBasicTransform \
+java ${SRCGEN_JAVA_ARGS} -cp ${CLASSPATH} com.android.icu4j.srcgen.Icu4jTestsTransform \
   ${ALL_TEST_INPUT_DIRS} ${TEST_DEST_DIR}
 
 # Copy the data files.
diff --git a/tools/srcgen/src/main/java/com/android/icu4j/srcgen/Icu4jBasicTransform.java b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/Icu4jBasicTransform.java
index 10a16d0..3635aef 100644
--- a/tools/srcgen/src/main/java/com/android/icu4j/srcgen/Icu4jBasicTransform.java
+++ b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/Icu4jBasicTransform.java
@@ -32,7 +32,7 @@
  * Applies basic Android's ICU4J source code transformation rules to code and fixes up the
  * jcite start/end tags so they can be used with doclava.
  *
- * <p>Intended for use when transforming sample and test code.
+ * <p>Intended for use when transforming sample code.
  */
 public class Icu4jBasicTransform {
 
diff --git a/tools/srcgen/src/main/java/com/android/icu4j/srcgen/Icu4jTestsTransform.java b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/Icu4jTestsTransform.java
new file mode 100644
index 0000000..3a468c3
--- /dev/null
+++ b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/Icu4jTestsTransform.java
@@ -0,0 +1,108 @@
+/*
+ * Copyright (C) 2016 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 com.android.icu4j.srcgen;
+
+import com.google.common.collect.Lists;
+import com.google.currysrc.Main;
+import com.google.currysrc.api.Rules;
+import com.google.currysrc.api.input.InputFileGenerator;
+import com.google.currysrc.api.output.OutputSourceFileGenerator;
+import com.google.currysrc.api.process.Rule;
+import com.google.currysrc.processors.ReplaceTextCommentScanner;
+
+import java.io.File;
+import java.util.Collections;
+import java.util.List;
+
+import static com.android.icu4j.srcgen.Icu4jTransformRules.createOptionalRule;
+
+/**
+ * Applies Android's ICU4J source code transformation rules to test code, adds @RunWith annotations
+ * to test so that they can be run with JUnit and fixes up the jcite start/end tags.
+ *
+ * <p>Intended for use when transforming test code.
+ */
+public class Icu4jTestsTransform {
+
+  private static final boolean DEBUG = false;
+
+  private Icu4jTestsTransform() {
+  }
+
+  /**
+   * Usage:
+   * java com.android.icu4j.srcgen.Icu4jSampleTransform {source files/directories} {target dir}
+   */
+  public static void main(String[] args) throws Exception {
+    new Main(DEBUG).execute(new Icu4jBasicRules(args));
+  }
+
+  private static class Icu4jBasicRules implements Rules {
+
+    private final InputFileGenerator inputFileGenerator;
+
+    private final List<Rule> rules;
+
+    private final OutputSourceFileGenerator outputSourceFileGenerator;
+
+    public Icu4jBasicRules(String[] args) {
+      if (args.length < 2) {
+        throw new IllegalArgumentException("At least 2 arguments required.");
+      }
+
+      String[] inputDirNames = new String[args.length - 1];
+      System.arraycopy(args, 0, inputDirNames, 0, args.length - 1);
+      inputFileGenerator = Icu4jTransformRules.createInputFileGenerator(inputDirNames);
+      rules = createTransformRules();
+      outputSourceFileGenerator = Icu4jTransformRules.createOutputFileGenerator(
+          args[args.length - 1]);
+    }
+
+    @Override
+    public List<Rule> getRuleList(File ignored) {
+      return rules;
+    }
+
+    @Override
+    public InputFileGenerator getInputFileGenerator() {
+      return inputFileGenerator;
+    }
+
+    @Override
+    public OutputSourceFileGenerator getOutputSourceFileGenerator() {
+      return outputSourceFileGenerator;
+    }
+
+    private static List<Rule> createTransformRules() {
+      List<Rule> rules =
+              Lists.newArrayList(Icu4jTransform.Icu4jRules.getRepackagingRules());
+
+      // Annotate test files, ones that extend TestFmwk and TestFmwk.TestGroup with appropriate
+      // @RunWith annotation. This must run after those rules that repackage the classes.
+      rules.add(createOptionalRule(new RunWithAnnotator()));
+
+      // Switch all embedded comment references from com.ibm.icu to android.icu.
+      rules.add(
+          createOptionalRule(new ReplaceTextCommentScanner(
+              Icu4jTransform.ORIGINAL_ICU_PACKAGE, Icu4jTransform.ANDROID_ICU_PACKAGE)));
+
+      // Change sample jcite begin / end tags ---XYZ to Androids 'BEGIN(XYZ)' / 'END(XYZ)'
+      rules.add(createOptionalRule(new TranslateJcite.BeginEndTagsHandler()));
+
+      return rules;
+    }
+  }
+}
diff --git a/tools/srcgen/src/main/java/com/android/icu4j/srcgen/RunWithAnnotator.java b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/RunWithAnnotator.java
new file mode 100644
index 0000000..6bf74e2
--- /dev/null
+++ b/tools/srcgen/src/main/java/com/android/icu4j/srcgen/RunWithAnnotator.java
@@ -0,0 +1,159 @@
+/*
+ * Copyright (C) 2016 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 com.android.icu4j.srcgen;
+
+import com.google.currysrc.api.process.Context;
+import com.google.currysrc.api.process.Processor;
+import java.lang.reflect.Modifier;
+import java.util.List;
+import java.util.Map;
+import java.util.TreeMap;
+import org.eclipse.jdt.core.dom.AST;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+import org.eclipse.jdt.core.dom.ImportDeclaration;
+import org.eclipse.jdt.core.dom.Name;
+import org.eclipse.jdt.core.dom.QualifiedName;
+import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
+import org.eclipse.jdt.core.dom.Type;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
+import org.eclipse.jdt.core.dom.TypeLiteral;
+import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
+import org.eclipse.jdt.core.dom.rewrite.ListRewrite;
+
+/**
+ * Adds @RunWith annotations to test classes.
+ *
+ * <p>A class that extends {@code TestFmwk.TestGroup} will have an annotation
+ * {@code @RunWith(IcuTestGroupRunner.class)} added and a class that extends {@code TestFmwk} will
+ * have an annotation {@code @RunWith(IcuTestFmwkRunner.class)} added.
+ *
+ * <p>Ideally, this would operate on an AST that has resolved type information so that it was
+ * possible to traverse the class hierarchy to identify classes that are derived both directly and
+ * indirectly from the test classes. Unfortunately, that approach is very, very time consuming, an
+ * order of magnitude (if not two) slower than not resolving the types. Therefore, it was quicker
+ * to simply iteratively annotate and run the tests to find the set of direct dependencies and hard
+ * code them in here. That could be an issue if this had to deal with many changes in the test
+ * classes but this code should only have a very short lifespan given that the ICU4J team is
+ * already well on their way to porting the tests over to JUnit.
+ */
+class RunWithAnnotator implements Processor {
+
+    private static final String RUN_WITH_CLASS_NAME = "org.junit.runner.RunWith";
+
+    private static final String[] TEST_FMWK_BASE_CLASSES = {
+            "BidiTest",
+            "CalendarTest",
+            "android.icu.dev.test.TestFmwk",
+            "CompatibilityTest",
+            "CoverageTest",
+            "LanguageTestRoot",
+            "ModuleTest",
+            "TestFmwk",
+            "TestFmwk.TestGroup",
+            "TestGroup",
+            "TransliteratorTest",
+    };
+
+    private static final String[] TEST_GROUP_BASE_CLASSES = {
+            "TestFmwk.TestGroup",
+            "TestGroup",
+    };
+
+    private static Map<String, String> BASE_CLASS_2_RUNNER_CLASS = new TreeMap<>();
+    static {
+        for (String name : TEST_FMWK_BASE_CLASSES) {
+            BASE_CLASS_2_RUNNER_CLASS.put(name, "android.icu.junit.IcuTestFmwkRunner");
+        }
+        for (String name : TEST_GROUP_BASE_CLASSES) {
+            BASE_CLASS_2_RUNNER_CLASS.put(name, "android.icu.junit.IcuTestGroupRunner");
+        }
+    }
+
+    @Override
+    public void process(Context context, CompilationUnit cu) {
+        List types = cu.types();
+        ASTRewrite rewrite = context.rewrite();
+        boolean imported = false;
+        for (Object type : types) {
+            if (type instanceof TypeDeclaration) {
+                TypeDeclaration typeDeclaration = (TypeDeclaration) type;
+                imported = annotateTypeDeclaration(cu, rewrite, typeDeclaration, true, imported);
+            }
+        }
+    }
+
+    private boolean annotateTypeDeclaration(CompilationUnit cu,
+            ASTRewrite rewrite, TypeDeclaration typeDeclaration, boolean topLevelClass,
+            boolean imported) {
+
+        int modifiers = typeDeclaration.getModifiers();
+        if ((topLevelClass || Modifier.isStatic(modifiers)) && Modifier.isPublic(modifiers)
+                && !Modifier.isAbstract(modifiers)) {
+            Type superClassType = typeDeclaration.getSuperclassType();
+            if (superClassType != null) {
+                String name = superClassType.toString();
+                String runnerClass = BASE_CLASS_2_RUNNER_CLASS.get(name);
+                if (runnerClass != null) {
+                    addRunWithAnnotation(cu, rewrite, typeDeclaration, runnerClass, imported);
+                    imported = true;
+                }
+            }
+        }
+
+        for (TypeDeclaration innerClass : typeDeclaration.getTypes()) {
+            imported = annotateTypeDeclaration(cu, rewrite, innerClass, false, imported);
+        }
+
+        return imported;
+    }
+
+    private boolean addRunWithAnnotation(
+            CompilationUnit cu, ASTRewrite rewrite, TypeDeclaration type, String runnerClass,
+            boolean imported) {
+
+        AST ast = cu.getAST();
+
+        QualifiedName qRunWith = (QualifiedName) ast.newName(RUN_WITH_CLASS_NAME);
+        QualifiedName qRunner = (QualifiedName) ast.newName(runnerClass);
+        if (!imported) {
+            appendImport(cu, rewrite, qRunWith);
+            appendImport(cu, rewrite, qRunner);
+        }
+        String runWithName = qRunWith.getName().getIdentifier();
+        String runnerName = qRunner.getName().getIdentifier();
+
+        SingleMemberAnnotation annotation = ast.newSingleMemberAnnotation();
+        annotation.setTypeName(ast.newSimpleName(runWithName));
+
+        TypeLiteral junit4Literal = ast.newTypeLiteral();
+        junit4Literal.setType(ast.newSimpleType(ast.newSimpleName(runnerName)));
+        annotation.setValue(junit4Literal);
+
+        ListRewrite lrw = rewrite.getListRewrite(type, type.getModifiersProperty());
+        lrw.insertFirst(annotation, null);
+
+        return imported;
+    }
+
+    private void appendImport(CompilationUnit cu, ASTRewrite rewriter, Name name) {
+        ListRewrite lrw = rewriter.getListRewrite(cu, CompilationUnit.IMPORTS_PROPERTY);
+        AST ast = cu.getAST();
+        ImportDeclaration importDeclaration = ast.newImportDeclaration();
+        importDeclaration.setName(name);
+        lrw.insertLast(importDeclaration, null);
+    }
+
+}