diff --git a/OWNERS b/OWNERS
index 3690ffa..d240561 100644
--- a/OWNERS
+++ b/OWNERS
@@ -11,7 +11,7 @@
 nickrose@google.com
 
 # File Specific Approvers
-per-file Backup* = alsutton@google.com, anniemeng@google.com, brufino@google.com, nathch@google.com, rthakohov@google.com
+per-file Backup* = aabhinav@google.com, jstemmer@google.com, nathch@google.com, niagra@google.com, niamhfw@google.com, philippov@google.com, rthakohov@google.com, tobiast@google.com
 per-file cts-meerkat.xml = alanstokes@google.com, brufino@google.com, lus@google.com, rickywai@google.com
 per-file cts-on-csi*.xml = ycchen@google.com, hsinyichen@google.com, tyanh@google.com
 per-file csi-*.xml = ycchen@google.com, hsinyichen@google.com, tyanh@google.com
diff --git a/PREUPLOAD.cfg b/PREUPLOAD.cfg
index 12604f9..2cabacc 100644
--- a/PREUPLOAD.cfg
+++ b/PREUPLOAD.cfg
@@ -8,4 +8,4 @@
 [Hook Scripts]
 # `^.` is a RegExr that matches any character at the beginning, so this hook
 # is basically applied to ALL files in a git commit.
-aospcheck_hook = ${REPO_ROOT}/frameworks/base/tools/aosp/aosp_sha.sh ${PREUPLOAD_COMMIT} "^."
+aospcheck_hook = ${REPO_ROOT}/tools/tradefederation/core/aosp_sha.sh ${PREUPLOAD_COMMIT} "^."
diff --git a/build/Android.bp b/build/Android.bp
deleted file mode 100644
index fcf438f..0000000
--- a/build/Android.bp
+++ /dev/null
@@ -1,16 +0,0 @@
-bootstrap_go_package {
-    name: "soong-suite-harness",
-    pkgPath: "android/soong/suite_harness",
-    deps: [
-        "blueprint",
-        "blueprint-pathtools",
-        "blueprint-proptools",
-        "soong",
-        "soong-android",
-        "soong-java",
-    ],
-    srcs: [
-        "tradefed_binary.go",
-    ],
-    pluginFor: ["soong_build"],
-}
diff --git a/build/tradefed_binary.go b/build/tradefed_binary.go
deleted file mode 100644
index 8598458..0000000
--- a/build/tradefed_binary.go
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2018 Google Inc. All rights reserved.
-//
-// 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 suite_harness
-
-import (
-	"strings"
-
-	"github.com/google/blueprint"
-
-	"android/soong/android"
-	"android/soong/java"
-)
-
-var pctx = android.NewPackageContext("android/soong/suite_harness")
-
-func init() {
-	android.RegisterModuleType("tradefed_binary_host", tradefedBinaryFactory)
-
-	pctx.Import("android/soong/android")
-}
-
-type TradefedBinaryProperties struct {
-	Short_name string
-	Full_name  string
-	Version    string
-	Prepend_platform_version_name bool
-}
-
-// tradefedBinaryFactory creates an empty module for the tradefed_binary module type,
-// which is a java_binary with some additional processing in tradefedBinaryLoadHook.
-func tradefedBinaryFactory() android.Module {
-	props := &TradefedBinaryProperties{}
-	module := java.BinaryHostFactory()
-	module.AddProperties(props)
-	android.AddLoadHook(module, tradefedBinaryLoadHook(props))
-
-	return module
-}
-
-const genSuffix = "-gen"
-
-// tradefedBinaryLoadHook adds extra resources and libraries to tradefed_binary modules.
-func tradefedBinaryLoadHook(tfb *TradefedBinaryProperties) func(ctx android.LoadHookContext) {
-	return func(ctx android.LoadHookContext) {
-		genName := ctx.ModuleName() + genSuffix
-		version := tfb.Version
-		if (tfb.Prepend_platform_version_name) {
-			version = ctx.Config().PlatformVersionName() + tfb.Version
-		}
-
-		// Create a submodule that generates the test-suite-info.properties file
-		// and copies DynamicConfig.xml if it is present.
-		ctx.CreateModule(tradefedBinaryGenFactory,
-			&TradefedBinaryGenProperties{
-				Name:       &genName,
-				Short_name: tfb.Short_name,
-				Full_name:  tfb.Full_name,
-				Version:    version,
-			})
-
-		props := struct {
-			Java_resources []string
-			Libs           []string
-		}{}
-
-		// Add dependencies required by all tradefed_binary modules.
-		props.Libs = []string{
-			"tradefed",
-			"tradefed-test-framework",
-			"loganalysis",
-			"hosttestlib",
-			"compatibility-host-util",
-		}
-
-		// Add the files generated by the submodule created above to the resources.
-		props.Java_resources = []string{":" + genName}
-
-		ctx.AppendProperties(&props)
-
-	}
-}
-
-type TradefedBinaryGenProperties struct {
-	Name       *string
-	Short_name string
-	Full_name  string
-	Version    string
-}
-
-type tradefedBinaryGen struct {
-	android.ModuleBase
-
-	properties TradefedBinaryGenProperties
-
-	gen android.Paths
-}
-
-func tradefedBinaryGenFactory() android.Module {
-	tfg := &tradefedBinaryGen{}
-	tfg.AddProperties(&tfg.properties)
-	android.InitAndroidModule(tfg)
-	return tfg
-}
-
-func (tfg *tradefedBinaryGen) DepsMutator(android.BottomUpMutatorContext) {}
-
-var tradefedBinaryGenRule = pctx.StaticRule("tradefedBinaryGenRule", blueprint.RuleParams{
-	Command: `rm -f $out && touch $out && ` +
-		`echo "# This file is auto generated by Android.mk. Do not modify." >> $out && ` +
-		`echo "build_number = $$(cat ${buildNumberFile})" >> $out && ` +
-		`echo "target_arch = ${arch}" >> $out && ` +
-		`echo "name = ${name}" >> $out && ` +
-		`echo "fullname = ${fullname}" >> $out && ` +
-		`echo "version = ${version}" >> $out`,
-}, "buildNumberFile", "arch", "name", "fullname", "version")
-
-func (tfg *tradefedBinaryGen) GenerateAndroidBuildActions(ctx android.ModuleContext) {
-	buildNumberFile := ctx.Config().BuildNumberFile(ctx)
-	outputFile := android.PathForModuleOut(ctx, "test-suite-info.properties")
-	ctx.Build(pctx, android.BuildParams{
-		Rule:      tradefedBinaryGenRule,
-		Output:    outputFile,
-		OrderOnly: android.Paths{buildNumberFile},
-		Args: map[string]string{
-			"buildNumberFile": buildNumberFile.String(),
-			"arch":            ctx.Config().DevicePrimaryArchType().String(),
-			"name":            tfg.properties.Short_name,
-			"fullname":        tfg.properties.Full_name,
-			"version":         tfg.properties.Version,
-		},
-	})
-
-	tfg.gen = append(tfg.gen, outputFile)
-
-	dynamicConfig := android.ExistentPathForSource(ctx, ctx.ModuleDir(), "DynamicConfig.xml")
-	if dynamicConfig.Valid() {
-		outputFile := android.PathForModuleOut(ctx, strings.TrimSuffix(ctx.ModuleName(), genSuffix)+".dynamic")
-		ctx.Build(pctx, android.BuildParams{
-			Rule:   android.Cp,
-			Input:  dynamicConfig.Path(),
-			Output: outputFile,
-		})
-
-		tfg.gen = append(tfg.gen, outputFile)
-	}
-}
-
-func (tfg *tradefedBinaryGen) Srcs() android.Paths {
-	return append(android.Paths(nil), tfg.gen...)
-}
-
-var _ android.SourceFileProducer = (*tradefedBinaryGen)(nil)
diff --git a/common/host-side/manifest-generator/Android.bp b/common/host-side/manifest-generator/Android.bp
deleted file mode 100644
index 9d6cdb8..0000000
--- a/common/host-side/manifest-generator/Android.bp
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright (C) 2015 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.
-
-java_library_host {
-    name: "compatibility-manifest-generator",
-
-    srcs: ["src/**/*.java"],
-
-    static_libs: ["kxml2-2.3.0"],
-
-    manifest: "MANIFEST.mf",
-
-    use_tools_jar: true,
-}
diff --git a/common/host-side/manifest-generator/MANIFEST.mf b/common/host-side/manifest-generator/MANIFEST.mf
deleted file mode 100644
index 4f62631..0000000
--- a/common/host-side/manifest-generator/MANIFEST.mf
+++ /dev/null
@@ -1,2 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: com.android.compatibility.common.generator.ManifestGenerator
diff --git a/common/host-side/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java b/common/host-side/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java
deleted file mode 100644
index 6e48ca9..0000000
--- a/common/host-side/manifest-generator/src/com/android/compatibility/common/generator/ManifestGenerator.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.generator;
-
-import java.io.FileOutputStream;
-import java.io.OutputStream;
-import java.util.ArrayList;
-import java.util.List;
-
-import org.kxml2.io.KXmlSerializer;
-
-public class ManifestGenerator {
-
-    private static final String DEFAULT_MIN_SDK = "8";
-
-    private static final String USAGE = "Usage: "
-        + "manifest-generator -n NAME -p PACKAGE_NAME -o OUTPUT_FILE -i INSTRUMENT_NAME "
-        + "[-s MIN_SDK_VERSION] [-t TARGET_SDK_VERSION] [-r PERMISSION]+ [-a ACTIVITY]+";
-    private static final String MANIFEST = "manifest";
-    private static final String USES_SDK = "uses-sdk";
-    private static final String USES_PERMISSION = "uses-permission";
-    private static final String APPLICATION = "application";
-    private static final String INSTRUMENTATION = "instrumentation";
-    private static final String ACTIVITY = "activity";
-    private static final String USES_LIBRARY = "uses-library";
-
-    public static void main(String[] args) {
-        String pkgName = null;
-        String instrumentName = null;
-        String minSdk = DEFAULT_MIN_SDK;
-        String targetSdk = null;
-        List<String> permissions = new ArrayList<>();
-        List<String> activities = new ArrayList<>();
-        List<String> libraries = new ArrayList<>();
-        String output = null;
-
-        for (int i = 0; i < args.length - 1; i++) {
-            if (args[i].equals("-p")) {
-                pkgName = args[++i];
-            } else if (args[i].equals("-a")) {
-                activities.add(args[++i]);
-            } else if (args[i].equals("-l")) {
-                libraries.add(args[++i]);
-            } else if (args[i].equals("-o")) {
-                output = args[++i];
-            } else if (args[i].equals("-i")) {
-                instrumentName = args[++i];
-            } else if (args[i].equals("-r")) {
-                permissions.add(args[++i]);
-            } else if (args[i].equals("-s")) {
-                minSdk = args[++i];
-            } else if (args[i].equals("-t")) {
-                targetSdk = args[++i];
-            }
-        }
-
-        if (pkgName == null) {
-            error("Missing package name");
-        } else if (instrumentName == null) {
-            error("Missing instrumentation name");
-        } else if (activities.isEmpty()) {
-            error("No activities");
-        } else if (output == null) {
-            error("Missing output file");
-        }
-
-        FileOutputStream out = null;
-        try {
-          out = new FileOutputStream(output);
-          generate(out, pkgName, instrumentName, minSdk, targetSdk, permissions, activities,
-                libraries);
-        } catch (Exception e) {
-          System.err.println("Couldn't create manifest file");
-        } finally {
-          if (out != null) {
-              try {
-                  out.close();
-              } catch (Exception e) {
-                  // Ignore
-              }
-          }
-        }
-    }
-
-    /*package*/ static void generate(OutputStream out, String pkgName, String instrumentName,
-            String minSdk, String targetSdk, List<String> permissions, List<String> activities,
-            List<String> libraries)
-            throws Exception {
-        final String ns = null;
-        KXmlSerializer serializer = new KXmlSerializer();
-        serializer.setOutput(out, "UTF-8");
-        serializer.startDocument("UTF-8", true);
-        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
-        serializer.startTag(ns, MANIFEST);
-        serializer.attribute(ns, "xmlns:android", "http://schemas.android.com/apk/res/android");
-        serializer.attribute(ns, "package", pkgName);
-        serializer.startTag(ns, USES_SDK);
-        serializer.attribute(ns, "android:minSdkVersion", minSdk);
-        if (targetSdk != null) {
-            serializer.attribute(ns, "android:targetSdkVersion", targetSdk);
-        }
-        serializer.endTag(ns, USES_SDK);
-        for (String permission : permissions) {
-            serializer.startTag(ns, USES_PERMISSION);
-            serializer.attribute(ns, "android:name", permission);
-            serializer.endTag(ns, USES_PERMISSION);
-        }
-        serializer.startTag(ns, APPLICATION);
-        for (String library : libraries) {
-            serializer.startTag(ns, USES_LIBRARY);
-            serializer.attribute(ns, "android:name", library);
-            serializer.endTag(ns, USES_LIBRARY);
-        }
-        for (String activity : activities) {
-            serializer.startTag(ns, ACTIVITY);
-            serializer.attribute(ns, "android:name", activity);
-            serializer.endTag(ns, ACTIVITY);
-        }
-        serializer.endTag(ns, APPLICATION);
-        serializer.startTag(ns, INSTRUMENTATION);
-        serializer.attribute(ns, "android:name", instrumentName);
-        serializer.attribute(ns, "android:targetPackage", pkgName);
-        serializer.endTag(ns, INSTRUMENTATION);
-        serializer.endTag(ns, MANIFEST);
-        serializer.endDocument();
-        out.flush();
-    }
-
-    private static void error(String message) {
-        System.err.println(message);
-        System.err.println(USAGE);
-        System.exit(1);
-    }
-}
diff --git a/common/host-side/manifest-generator/tests/Android.bp b/common/host-side/manifest-generator/tests/Android.bp
deleted file mode 100644
index b8f012d..0000000
--- a/common/host-side/manifest-generator/tests/Android.bp
+++ /dev/null
@@ -1,24 +0,0 @@
-// Copyright (C) 2015 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.
-
-java_test_host {
-    name: "compatibility-manifest-generator-tests",
-
-    srcs: ["src/**/*.java"],
-
-    libs: [
-        "compatibility-manifest-generator",
-        "junit",
-    ],
-}
diff --git a/common/host-side/manifest-generator/tests/run_tests.sh b/common/host-side/manifest-generator/tests/run_tests.sh
deleted file mode 100755
index 0a77a9b..0000000
--- a/common/host-side/manifest-generator/tests/run_tests.sh
+++ /dev/null
@@ -1,27 +0,0 @@
-#!/bin/bash
-
-# Copyright (C) 2015 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.
-
-# Helper script for running unit tests for compatibility libraries
-
-HARNESS_DIR=$(dirname ${0})/../../../..
-source ${HARNESS_DIR}/test_defs.sh
-
-JARS="
-    compatibility-manifest-generator\
-    compatibility-manifest-generator-tests"
-
-run_tests "com.android.compatibility.common.generator.ManifestGeneratorTest" "${JARS}" "${@}"
-
diff --git a/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java b/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
deleted file mode 100644
index b68b34c..0000000
--- a/common/host-side/manifest-generator/tests/src/com/android/compatibility/common/generator/ManifestGeneratorTest.java
+++ /dev/null
@@ -1,87 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.generator;
-
-import java.io.IOException;
-import java.io.OutputStream;
-import java.nio.charset.StandardCharsets;
-import java.util.ArrayList;
-import java.util.List;
-
-import junit.framework.TestCase;
-
-/** Unit tests for {@link ManifestGenerator}. */
-public class ManifestGeneratorTest extends TestCase {
-
-    private static final String PACKAGE = "test.package";
-    private static final String INSTRUMENT = "test.package.TestInstrument";
-    private static final String MIN_SDK = "8";
-    private static final String TARGET_SDK = "17";
-    private static final String MANIFEST = "<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>\r\n"
-        + "<manifest xmlns:android=\"http://schemas.android.com/apk/res/android\" "
-        + "package=\"test.package\">\r\n"
-        + "  <uses-sdk android:minSdkVersion=\"8\" android:targetSdkVersion=\"17\" />\r\n"
-        + "%s"
-        + "  <application>\r\n"
-        + "%s"
-        + "%s"
-        + "  </application>\r\n"
-        + "  <instrumentation android:name=\"test.package.TestInstrument\" "
-        + "android:targetPackage=\"test.package\" />\r\n"
-        + "</manifest>";
-    private static final String PERMISSION = "  <uses-permission android:name=\"%s\" />\r\n";
-    private static final String PERMISSION_A = "android.permission.PermissionA";
-    private static final String PERMISSION_B = "android.permission.PermissionB";
-    private static final String ACTIVITY = "    <activity android:name=\"%s\" />\r\n";
-    private static final String ACTIVITY_A = "test.package.ActivityA";
-    private static final String ACTIVITY_B = "test.package.ActivityB";
-    private static final String USES_LIBRARY = "    <uses-library android:name=\"%s\" />\r\n";
-    private static final String LIBRARY = "test.runner.library";
-
-    public void testManifest() throws Exception {
-        List<String> permissions = new ArrayList<>();
-        permissions.add(PERMISSION_A);
-        permissions.add(PERMISSION_B);
-        List<String> activities = new ArrayList<>();
-        activities.add(ACTIVITY_A);
-        activities.add(ACTIVITY_B);
-        List<String> libraries = new ArrayList<>();
-        libraries.add(LIBRARY);
-        OutputStream output = new OutputStream() {
-            private StringBuilder string = new StringBuilder();
-            @Override
-            public void write(int b) throws IOException {
-                this.string.append((char) b);
-            }
-
-            @Override
-            public String toString(){
-                return this.string.toString();
-            }
-        };
-        ManifestGenerator.generate(output, PACKAGE, INSTRUMENT, MIN_SDK, TARGET_SDK,
-            permissions, activities, libraries);
-        String permissionXml = String.format(PERMISSION, PERMISSION_A)
-                + String.format(PERMISSION, PERMISSION_B);
-        String activityXml = String.format(ACTIVITY, ACTIVITY_A)
-                + String.format(ACTIVITY, ACTIVITY_B);
-        String libraryXml = String.format(USES_LIBRARY, LIBRARY);
-        String expected = String.format(MANIFEST, permissionXml, libraryXml, activityXml);
-        assertEquals("Wrong manifest output", expected, output.toString());
-    }
-
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/command/CompatibilityConsole.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/command/CompatibilityConsole.java
index 696423a..75b479a 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/command/CompatibilityConsole.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/command/CompatibilityConsole.java
@@ -19,7 +19,6 @@
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
 import com.android.compatibility.common.tradefed.result.SubPlanHelper;
 import com.android.compatibility.common.tradefed.result.suite.CertificationResultXml;
-import com.android.compatibility.common.tradefed.testtype.ModuleRepo;
 import com.android.compatibility.common.tradefed.testtype.suite.CompatibilityTestSuite;
 import com.android.compatibility.common.util.ResultHandler;
 import com.android.tradefed.build.BuildRetrievalError;
@@ -38,6 +37,7 @@
 import com.android.tradefed.testtype.IAbi;
 import com.android.tradefed.testtype.IRemoteTest;
 import com.android.tradefed.testtype.IRuntimeHintProvider;
+import com.android.tradefed.testtype.suite.SuiteModuleLoader;
 import com.android.tradefed.testtype.suite.TestSuiteInfo;
 import com.android.tradefed.testtype.suite.params.ModuleParameters;
 import com.android.tradefed.util.AbiUtils;
@@ -315,7 +315,7 @@
     private void splitModules(int shards) {
         File[] files = null;
         try {
-            files = getBuildHelper().getTestsDir().listFiles(new ModuleRepo.ConfigFilter());
+            files = getBuildHelper().getTestsDir().listFiles(new SuiteModuleLoader.ConfigFilter());
         } catch (FileNotFoundException e) {
             printLine(e.getMessage());
             e.printStackTrace();
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/IModuleListener.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/IModuleListener.java
deleted file mode 100644
index 213d293..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/IModuleListener.java
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.result;
-
-import com.android.tradefed.result.ITestInvocationListener;
-
-/**
- * Listener for Compatibility tests.
- * <p>
- * This listener wraps around the normal listener to convert from module name to module id.
- */
-public interface IModuleListener extends ITestInvocationListener {
-
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/InvocationFailureHandler.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/InvocationFailureHandler.java
deleted file mode 100644
index abbf14c..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/InvocationFailureHandler.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.compatibility.common.tradefed.result;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.util.FileUtil;
-
-import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-
-
-/**
- * A helper class for setting and checking whether an invocation has failed.
- */
-public class InvocationFailureHandler {
-
-    /**
-     * Determine whether the invocation for this session has previously failed.
-     *
-     * @param buildHelper the {@link CompatibilityBuildHelper} from which to retrieve invocation
-     * failure file
-     * @return if invocation has previously failed
-     */
-    public static boolean hasFailed(final CompatibilityBuildHelper buildHelper) {
-        try {
-            File f = buildHelper.getInvocationFailureFile();
-            return (f.exists() && f.length() != 0);
-        } catch (FileNotFoundException e) {
-            CLog.e("Could not find invocation failure file for session %s",
-                CompatibilityBuildHelper.getDirSuffix(buildHelper.getStartTime()));
-            CLog.e(e);
-            return false;
-        }
-    }
-
-    /**
-     * Write the cause of invocation failure to the result's invocation failure file.
-     *
-     * @param buildHelper the {@link CompatibilityBuildHelper} from which to retrieve the
-     * invocation failure file
-     * @param cause the throwable responsible for invocation failure
-     */
-    public static void setFailed(final CompatibilityBuildHelper buildHelper, Throwable cause) {
-        try {
-            File f = buildHelper.getInvocationFailureFile();
-            if (!f.exists()) {
-                f.createNewFile();
-            }
-            // Append to previous failures to get them all.
-            FileUtil.writeToFile(cause.toString(), f, true);
-        } catch (IOException e) {
-            CLog.e("Exception while writing invocation failure file.");
-            CLog.e(e);
-        }
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ModuleListener.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ModuleListener.java
deleted file mode 100644
index e37f608..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ModuleListener.java
+++ /dev/null
@@ -1,184 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.result;
-
-import com.android.compatibility.common.tradefed.testtype.IModuleDef;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.InputStreamSource;
-import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.result.TestSummary;
-import com.android.tradefed.util.proto.TfMetricProtoUtil;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Listener for Compatibility test info.
- * <p>
- * This listener wraps around the normal listener to convert from module name to module id.
- */
-public class ModuleListener implements IModuleListener {
-
-    private IModuleDef mModule;
-    private ITestInvocationListener mListener;
-
-    /**
-     * @param module
-     * @param listener
-     */
-    public ModuleListener(IModuleDef module, ITestInvocationListener listener) {
-        mModule = module;
-        mListener = listener;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void invocationStarted(IInvocationContext context) {
-        CLog.d("ModuleListener.invocationStarted(%s)", context.getBuildInfos());
-        mListener.invocationStarted(context);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunStarted(String name, int numTests) {
-        CLog.d("ModuleListener.testRunStarted(%s, %d)", name, numTests);
-        mListener.testRunStarted(mModule.getId(), numTests);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testStarted(TestDescription test) {
-        CLog.d("ModuleListener.testStarted(%s)", test.toString());
-        mListener.testStarted(test);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testEnded(TestDescription test, HashMap<String, Metric> metrics) {
-        CLog.d("ModuleListener.testEnded(%s, %s)", test.toString(), metrics.toString());
-        mListener.testEnded(test, metrics);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testIgnored(TestDescription test) {
-        CLog.d("ModuleListener.testIgnored(%s)", test.toString());
-        mListener.testIgnored(test);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testFailed(TestDescription test, String trace) {
-        CLog.d("ModuleListener.testFailed(%s, %s)", test.toString(), trace);
-        mListener.testFailed(test, trace);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testAssumptionFailure(TestDescription test, String trace) {
-        CLog.d("ModuleListener.testAssumptionFailure(%s, %s)", test.toString(), trace);
-        mListener.testAssumptionFailure(test, trace);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunStopped(long elapsedTime) {
-        CLog.d("ModuleListener.testRunStopped(%d)", elapsedTime);
-        mListener.testRunStopped(elapsedTime);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, HashMap<String, Metric> metrics) {
-        CLog.d("ModuleListener.testRunEnded(%d, %s)", elapsedTime, metrics.toString());
-        mListener.testRunEnded(elapsedTime, metrics);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> metrics) {
-        testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(metrics));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunFailed(String errorMessage) {
-        CLog.d("ModuleListener.testRunFailed(%s)", errorMessage);
-        mListener.testRunFailed(errorMessage);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public TestSummary getSummary() {
-        return mListener.getSummary();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void invocationEnded(long elapsedTime) {
-        CLog.d("ModuleListener.invocationEnded(%d)", elapsedTime);
-        mListener.invocationEnded(elapsedTime);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void invocationFailed(Throwable cause) {
-        CLog.d("ModuleListener.invocationFailed(%s)", cause.toString());
-        mListener.invocationFailed(cause);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testLog(String name, LogDataType type, InputStreamSource stream) {
-        CLog.d("ModuleListener.testLog(%s, %s, %s)", name, type.toString(), stream.toString());
-        mListener.testLog(name, type, stream);
-    }
-
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
deleted file mode 100644
index c6ccd2a..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/ResultReporter.java
+++ /dev/null
@@ -1,1154 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.result;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.compatibility.common.tradefed.testtype.retry.RetryFactoryTest;
-import com.android.compatibility.common.tradefed.testtype.suite.CompatibilityTestSuite;
-import com.android.compatibility.common.tradefed.util.FingerprintComparisonException;
-import com.android.compatibility.common.tradefed.util.RetryType;
-import com.android.compatibility.common.util.ChecksumReporter;
-import com.android.compatibility.common.util.DeviceInfo;
-import com.android.compatibility.common.util.ICaseResult;
-import com.android.compatibility.common.util.IInvocationResult;
-import com.android.compatibility.common.util.IModuleResult;
-import com.android.compatibility.common.util.ITestResult;
-import com.android.compatibility.common.util.InvocationResult;
-import com.android.compatibility.common.util.InvocationResult.RunHistory;
-import com.android.compatibility.common.util.MetricsStore;
-import com.android.compatibility.common.util.ReportLog;
-import com.android.compatibility.common.util.ResultHandler;
-import com.android.compatibility.common.util.ResultUploader;
-import com.android.compatibility.common.util.TestStatus;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.IConfiguration;
-import com.android.tradefed.config.IConfigurationReceiver;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
-import com.android.tradefed.config.OptionClass;
-import com.android.tradefed.config.OptionCopier;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.FileInputStreamSource;
-import com.android.tradefed.result.ILogSaver;
-import com.android.tradefed.result.ILogSaverListener;
-import com.android.tradefed.result.IShardableListener;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.ITestSummaryListener;
-import com.android.tradefed.result.InputStreamSource;
-import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.result.LogFile;
-import com.android.tradefed.result.LogFileSaver;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.result.TestSummary;
-import com.android.tradefed.result.suite.SuiteResultReporter;
-import com.android.tradefed.util.FileUtil;
-import com.android.tradefed.util.StreamUtil;
-import com.android.tradefed.util.TimeUtil;
-import com.android.tradefed.util.ZipUtil;
-import com.android.tradefed.util.proto.TfMetricProtoUtil;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.xml.XmlEscapers;
-import com.google.gson.Gson;
-
-import org.xmlpull.v1.XmlPullParserException;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Collect test results for an entire invocation and output test results to disk.
- */
-@OptionClass(alias="result-reporter")
-public class ResultReporter implements ILogSaverListener, ITestInvocationListener,
-       ITestSummaryListener, IShardableListener, IConfigurationReceiver {
-
-    public static final String INCLUDE_HTML_IN_ZIP = "html-in-zip";
-    private static final String UNKNOWN_DEVICE = "unknown_device";
-    private static final String RESULT_KEY = "COMPATIBILITY_TEST_RESULT";
-    private static final String CTS_PREFIX = "cts:";
-    private static final String BUILD_INFO = CTS_PREFIX + "build_";
-    private static final String LATEST_LINK_NAME = "latest";
-    /** Used to get run history from the test result of last run. */
-    private static final String RUN_HISTORY_KEY = "run_history";
-
-
-    public static final String BUILD_BRAND = "build_brand";
-    public static final String BUILD_DEVICE = "build_device";
-    public static final String BUILD_FINGERPRINT = "build_fingerprint";
-    public static final String BUILD_ID = "build_id";
-    public static final String BUILD_MANUFACTURER = "build_manufacturer";
-    public static final String BUILD_MODEL = "build_model";
-    public static final String BUILD_PRODUCT = "build_product";
-    public static final String BUILD_VERSION_RELEASE = "build_version_release";
-
-    private static final List<String> NOT_RETRY_FILES = Arrays.asList(
-            ChecksumReporter.NAME,
-            ChecksumReporter.PREV_NAME,
-            ResultHandler.FAILURE_REPORT_NAME,
-            "diffs");
-
-    @Option(name = RetryFactoryTest.RETRY_OPTION,
-            shortName = 'r',
-            description = "retry a previous session.",
-            importance = Importance.IF_UNSET)
-    private Integer mRetrySessionId = null;
-
-    @Option(name = RetryFactoryTest.RETRY_TYPE_OPTION,
-            description = "used with " + RetryFactoryTest.RETRY_OPTION
-            + ", retry tests of a certain status. Possible values include \"failed\", "
-            + "\"not_executed\", and \"custom\".",
-            importance = Importance.IF_UNSET)
-    private RetryType mRetryType = null;
-
-    @Option(name = "result-server", description = "Server to publish test results.")
-    private String mResultServer;
-
-    @Option(name = "disable-result-posting", description = "Disable result posting into report server.")
-    private boolean mDisableResultPosting = false;
-
-    @Option(name = "include-test-log-tags", description = "Include test log tags in report.")
-    private boolean mIncludeTestLogTags = false;
-
-    @Option(name = "use-log-saver", description = "Also saves generated result with log saver")
-    private boolean mUseLogSaver = false;
-
-    @Option(name = "compress-logs", description = "Whether logs will be saved with compression")
-    private boolean mCompressLogs = true;
-
-    @Option(name = INCLUDE_HTML_IN_ZIP,
-            description = "Whether failure summary report is included in the zip fie.")
-    private boolean mIncludeHtml = false;
-
-    @Option(
-            name = "result-attribute",
-            description =
-                    "Extra key-value pairs to be added as attributes and corresponding"
-                            + "values of the \"Result\" tag in the result XML.")
-    private Map<String, String> mResultAttributes = new HashMap<String, String>();
-
-    private CompatibilityBuildHelper mBuildHelper;
-    private File mResultDir = null;
-    private File mLogDir = null;
-    private ResultUploader mUploader;
-    private String mReferenceUrl;
-    private ILogSaver mLogSaver;
-    private int invocationEndedCount = 0;
-    private CountDownLatch mFinalized = null;
-
-    protected IInvocationResult mResult = new InvocationResult();
-    private IModuleResult mCurrentModuleResult;
-    private ICaseResult mCurrentCaseResult;
-    private ITestResult mCurrentResult;
-    private String mDeviceSerial = UNKNOWN_DEVICE;
-    private Set<String> mMainDeviceSerials = new HashSet<>();
-    private Set<IBuildInfo> mMainBuildInfos = new HashSet<>();
-    // Whether or not we failed the fingerprint check
-    private boolean mFingerprintFailure = false;
-
-    // mCurrentTestNum and mTotalTestsInModule track the progress within the module
-    // Note that this count is not necessarily equal to the count of tests contained
-    // in mCurrentModuleResult because of how special cases like ignored tests are reported.
-    private int mCurrentTestNum;
-    private int mTotalTestsInModule;
-
-    // Whether modules can be marked done for this invocation. Initialized in invocationStarted()
-    // Visible for unit testing
-    protected boolean mCanMarkDone;
-    // Whether the current test run has failed. If true, we will not mark the current module done
-    protected boolean mTestRunFailed;
-    // Whether the current module has previously been marked done
-    private boolean mModuleWasDone;
-
-    // Nullable. If null, "this" is considered the primary and must handle
-    // result aggregation and reporting. When not null, it should forward events to the primary
-    private final ResultReporter mPrimaryResultReporter;
-
-    private LogFileSaver mTestLogSaver;
-
-    // Elapsed time from invocation started to ended.
-    private long mElapsedTime;
-
-    /** Invocation level configuration */
-    private IConfiguration mConfiguration = null;
-
-    /**
-     * Default constructor.
-     */
-    public ResultReporter() {
-        this(null);
-        mFinalized = new CountDownLatch(1);
-    }
-
-    /**
-     * Construct a shard ResultReporter that forwards module results to the mPrimaryResultReporter.
-     */
-    public ResultReporter(ResultReporter primaryResultReporter) {
-        mPrimaryResultReporter = primaryResultReporter;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void setConfiguration(IConfiguration configuration) {
-        mConfiguration = configuration;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void invocationStarted(IInvocationContext context) {
-        IBuildInfo primaryBuild = context.getBuildInfos().get(0);
-        synchronized(this) {
-            if (mBuildHelper == null) {
-                mBuildHelper = new CompatibilityBuildHelper(primaryBuild);
-            }
-            if (mDeviceSerial == null && primaryBuild.getDeviceSerial() != null) {
-                mDeviceSerial = primaryBuild.getDeviceSerial();
-            }
-            mCanMarkDone = canMarkDone(mBuildHelper.getRecentCommandLineArgs());
-        }
-
-        if (isShardResultReporter()) {
-            // Shard ResultReporters forward invocationStarted to the mPrimaryResultReporter
-            mPrimaryResultReporter.invocationStarted(context);
-            return;
-        }
-
-        // NOTE: Everything after this line only applies to the primary ResultReporter.
-
-        synchronized (this) {
-            if (primaryBuild.getDeviceSerial() != null) {
-                // The primary ResultReporter collects all device serials being used
-                // for the current implementation.
-                mMainDeviceSerials.add(primaryBuild.getDeviceSerial());
-            }
-
-            // The primary ResultReporter collects all buildInfos.
-            mMainBuildInfos.add(primaryBuild);
-
-            if (mResultDir == null) {
-                // For the non-sharding case, invocationStarted is only called once,
-                // but for the sharding case, this might be called multiple times.
-                // Logic used to initialize the result directory should not be
-                // invoked twice during the same invocation.
-                initializeResultDirectories();
-            }
-        }
-    }
-
-    /**
-     * Create directory structure where results and logs will be written.
-     */
-    private void initializeResultDirectories() {
-        debug("Initializing result directory");
-
-        try {
-            // Initialize the result directory. Either a new directory or reusing
-            // an existing session.
-            if (mRetrySessionId != null) {
-                // Overwrite the mResult with the test results of the previous session
-                mResult = ResultHandler.findResult(mBuildHelper.getResultsDir(), mRetrySessionId);
-            }
-            mResult.setStartTime(mBuildHelper.getStartTime());
-            mResultDir = mBuildHelper.getResultDir();
-            if (mResultDir != null) {
-                mResultDir.mkdirs();
-            }
-        } catch (FileNotFoundException e) {
-            throw new RuntimeException(e);
-        }
-
-        if (mResultDir == null) {
-            throw new RuntimeException("Result Directory was not created");
-        }
-        if (!mResultDir.exists()) {
-            throw new RuntimeException("Result Directory was not created: " +
-                    mResultDir.getAbsolutePath());
-        }
-
-        debug("Results Directory: %s", mResultDir.getAbsolutePath());
-
-        mUploader = new ResultUploader(mResultServer, mBuildHelper.getSuiteName());
-        try {
-            mLogDir = new File(mBuildHelper.getLogsDir(),
-                    CompatibilityBuildHelper.getDirSuffix(mBuildHelper.getStartTime()));
-        } catch (FileNotFoundException e) {
-            CLog.e(e);
-        }
-        if (mLogDir != null && mLogDir.mkdirs()) {
-            debug("Created log dir %s", mLogDir.getAbsolutePath());
-        }
-        if (mLogDir == null || !mLogDir.exists()) {
-            throw new IllegalArgumentException(String.format("Could not create log dir %s",
-                    mLogDir.getAbsolutePath()));
-        }
-        if (mTestLogSaver == null) {
-            mTestLogSaver = new LogFileSaver(mLogDir);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunStarted(String id, int numTests) {
-        if (mCurrentModuleResult != null && mCurrentModuleResult.getId().equals(id)
-                && mCurrentModuleResult.isDone()) {
-            // Modules run with JarHostTest treat each test class as a separate module,
-            // resulting in additional unexpected test runs.
-            // This case exists only for N
-            mTotalTestsInModule += numTests;
-        } else {
-            // Handle non-JarHostTest case
-            mCurrentModuleResult = mResult.getOrCreateModule(id);
-            mModuleWasDone = mCurrentModuleResult.isDone();
-            mTestRunFailed = false;
-            if (!mModuleWasDone) {
-                // we only want to update testRun variables if the IModuleResult is not yet done
-                // otherwise leave testRun variables alone so isDone evaluates to true.
-                if (mCurrentModuleResult.getExpectedTestRuns() == 0) {
-                    mCurrentModuleResult.setExpectedTestRuns(TestRunHandler.getTestRuns(
-                            mBuildHelper, mCurrentModuleResult.getId()));
-                }
-                mCurrentModuleResult.addTestRun();
-            }
-            // Reset counters
-            mTotalTestsInModule = numTests;
-            mCurrentTestNum = 0;
-        }
-        mCurrentModuleResult.inProgress(true);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testStarted(TestDescription test) {
-        mCurrentCaseResult = mCurrentModuleResult.getOrCreateResult(test.getClassName());
-        mCurrentResult = mCurrentCaseResult.getOrCreateResult(test.getTestName().trim());
-        if (mCurrentResult.isRetry()) {
-            mCurrentResult.reset(); // clear result status for this invocation
-        }
-        mCurrentTestNum++;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testEnded(TestDescription test, HashMap<String, Metric> metrics) {
-        if (mCurrentResult.getResultStatus() == TestStatus.FAIL) {
-            // Test has previously failed.
-            return;
-        }
-        // device test can have performance results in test metrics
-        Metric perfResult = metrics.get(RESULT_KEY);
-        ReportLog report = null;
-        if (perfResult != null) {
-            try {
-                report = ReportLog.parse(perfResult.getMeasurements().getSingleString());
-            } catch (XmlPullParserException | IOException e) {
-                e.printStackTrace();
-            }
-        } else {
-            // host test should be checked into MetricsStore.
-            report = MetricsStore.removeResult(mBuildHelper.getBuildInfo(),
-                    mCurrentModuleResult.getAbi(), test.toString());
-        }
-        if (mCurrentResult.getResultStatus() == null) {
-            // Only claim that we passed when we're certain our result was
-            // not any other state.
-            mCurrentResult.passed(report);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testIgnored(TestDescription test) {
-        mCurrentResult.skipped();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testFailed(TestDescription test, String trace) {
-        mCurrentResult.failed(sanitizeXmlContent(trace));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testAssumptionFailure(TestDescription test, String trace) {
-        mCurrentResult.skipped();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunStopped(long elapsedTime) {
-        // ignore
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, Map<String, String> metrics) {
-        testRunEnded(elapsedTime, TfMetricProtoUtil.upgradeConvert(metrics));
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunEnded(long elapsedTime, HashMap<String, Metric> metrics) {
-        mCurrentModuleResult.inProgress(false);
-        mCurrentModuleResult.addRuntime(elapsedTime);
-        if (!mModuleWasDone && mCanMarkDone) {
-            if (mTestRunFailed) {
-                // set done to false for test run failures
-                mCurrentModuleResult.setDone(false);
-            } else {
-                // Only mark module done if:
-                // - status of the invocation allows it (mCanMarkDone), and
-                // - module has not already been marked done, and
-                // - no test run failure has been detected
-                mCurrentModuleResult.setDone(mCurrentTestNum >= mTotalTestsInModule);
-            }
-        }
-        if (isShardResultReporter()) {
-            // Forward module results to the primary.
-            mPrimaryResultReporter.mergeModuleResult(mCurrentModuleResult);
-            mCurrentModuleResult.resetTestRuns();
-            mCurrentModuleResult.resetRuntime();
-        }
-    }
-
-    /**
-     * Directly add a module result. Note: this method is meant to be used by
-     * a shard ResultReporter.
-     */
-    private void mergeModuleResult(IModuleResult moduleResult) {
-        // This merges the results in moduleResult to any existing results already
-        // contained in mResult. This is useful for retries and allows the final
-        // report from a retry to contain all test results.
-        synchronized(this) {
-            mResult.mergeModuleResult(moduleResult);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testRunFailed(String errorMessage) {
-        mTestRunFailed = true;
-        mCurrentModuleResult.setFailed();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public TestSummary getSummary() {
-        // ignore
-        return null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void putSummary(List<TestSummary> summaries) {
-        for (TestSummary summary : summaries) {
-            // If one summary is from SuiteResultReporter, log it as an extra file.
-            if (SuiteResultReporter.SUITE_REPORTER_SOURCE.equals(summary.getSource())) {
-                File summaryFile = null;
-                try {
-                    summaryFile = FileUtil.createTempFile("summary", ".txt");
-                    FileUtil.writeToFile(summary.getSummary().getString(), summaryFile);
-                    try (InputStreamSource stream = new FileInputStreamSource(summaryFile)) {
-                        testLog("summary", LogDataType.TEXT, stream);
-                    }
-                } catch (IOException e) {
-                    CLog.e(e);
-                } finally {
-                    FileUtil.deleteFile(summaryFile);
-                }
-            } else if (mReferenceUrl == null && summary.getSummary().getString() != null) {
-                mReferenceUrl = summary.getSummary().getString();
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void invocationEnded(long elapsedTime) {
-        if (isShardResultReporter()) {
-            // Shard ResultReporters report
-            mPrimaryResultReporter.invocationEnded(elapsedTime);
-            return;
-        }
-
-        // NOTE: Everything after this line only applies to the primary ResultReporter.
-
-        synchronized (this) {
-            // The mPrimaryResultReporter tracks the progress of all invocations across
-            // shard ResultReporters. Writing results should not proceed until all
-            // ResultReporters have completed.
-            if (++invocationEndedCount < mMainBuildInfos.size()) {
-                return;
-            }
-            mElapsedTime = elapsedTime;
-            finalizeResults();
-            mFinalized.countDown();
-        }
-    }
-
-    /**
-     * Returns whether a report creation should be skipped.
-     */
-    protected boolean shouldSkipReportCreation() {
-        // This value is always false here for backwards compatibility.
-        // Extended classes have the option to override this.
-        return false;
-    }
-
-    private void finalizeResults() {
-        if (mFingerprintFailure) {
-            CLog.w("Failed the fingerprint check. Skip result reporting.");
-            return;
-        }
-        // Add all device serials into the result to be serialized
-        for (String deviceSerial : mMainDeviceSerials) {
-            mResult.addDeviceSerial(deviceSerial);
-        }
-
-        addDeviceBuildInfoToResult();
-
-        Set<String> allExpectedModules = new HashSet<>();
-        for (IBuildInfo buildInfo : mMainBuildInfos) {
-            for (Map.Entry<String, String> entry : buildInfo.getBuildAttributes().entrySet()) {
-                String key = entry.getKey();
-                String value = entry.getValue();
-                if (key.equals(CompatibilityBuildHelper.MODULE_IDS) && value.length() > 0) {
-                    Collections.addAll(allExpectedModules, value.split(","));
-                }
-            }
-        }
-
-        // Include a record in the report of all expected modules ids, even if they weren't
-        // executed.
-        for (String moduleId : allExpectedModules) {
-            mResult.getOrCreateModule(moduleId);
-        }
-
-        String moduleProgress = String.format("%d of %d",
-                mResult.getModuleCompleteCount(), mResult.getModules().size());
-
-
-        if (shouldSkipReportCreation()) {
-            return;
-        }
-
-        // Get run history from the test result of last run and add the run history of the current
-        // run to it.
-        // TODO(b/137973382): avoid casting by move the method to interface level.
-        Collection<RunHistory> runHistories = ((InvocationResult) mResult).getRunHistories();
-        String runHistoryJSON = mResult.getInvocationInfo().get(RUN_HISTORY_KEY);
-        Gson gson = new Gson();
-        if (runHistoryJSON != null) {
-            RunHistory[] runHistoryArray = gson.fromJson(runHistoryJSON, RunHistory[].class);
-            Collections.addAll(runHistories, runHistoryArray);
-        }
-        RunHistory newRun = new RunHistory();
-        newRun.startTime = mResult.getStartTime();
-        newRun.endTime = newRun.startTime + mElapsedTime;
-        runHistories.add(newRun);
-        mResult.addInvocationInfo(RUN_HISTORY_KEY, gson.toJson(runHistories));
-
-        try {
-            // Zip the full test results directory.
-            copyDynamicConfigFiles();
-            copyFormattingFiles(mResultDir, mBuildHelper.getSuiteName());
-
-            File resultFile = generateResultXmlFile();
-            if (mRetrySessionId != null) {
-                copyRetryFiles(ResultHandler.getResultDirectory(
-                        mBuildHelper.getResultsDir(), mRetrySessionId), mResultDir);
-            }
-            File failureReport = null;
-            if (mIncludeHtml) {
-                // Create the html report before the zip file.
-                failureReport = ResultHandler.createFailureReport(resultFile);
-            }
-            File zippedResults = zipResults(mResultDir);
-            if (!mIncludeHtml) {
-                // Create failure report after zip file so extra data is not uploaded
-                failureReport = ResultHandler.createFailureReport(resultFile);
-            }
-            if (failureReport != null && failureReport.exists()) {
-                info("Test Result: %s", failureReport.getCanonicalPath());
-            } else {
-                info("Test Result: %s", resultFile.getCanonicalPath());
-            }
-            info("Test Logs: %s", mLogDir.getCanonicalPath());
-            debug("Full Result: %s", zippedResults.getCanonicalPath());
-
-            Path latestLink = createLatestLinkDirectory(mResultDir.toPath());
-            if (latestLink != null) {
-                info("Latest results link: " + latestLink.toAbsolutePath());
-            }
-
-            latestLink = createLatestLinkDirectory(mLogDir.toPath());
-            if (latestLink != null) {
-                info("Latest logs link: " + latestLink.toAbsolutePath());
-            }
-
-            saveLog(resultFile, zippedResults);
-
-            uploadResult(resultFile);
-
-        } catch (IOException | XmlPullParserException e) {
-            CLog.e("[%s] Exception while saving result XML.", mDeviceSerial);
-            CLog.e(e);
-        }
-        // print the run results last.
-        info("Invocation finished in %s. PASSED: %d, FAILED: %d, MODULES: %s",
-                TimeUtil.formatElapsedTime(mElapsedTime),
-                mResult.countResults(TestStatus.PASS),
-                mResult.countResults(TestStatus.FAIL),
-                moduleProgress);
-    }
-
-    private Path createLatestLinkDirectory(Path directory) {
-        Path link = null;
-
-        Path parent = directory.getParent();
-
-        if (parent != null) {
-            link = parent.resolve(LATEST_LINK_NAME);
-            try {
-                // if latest already exists, we have to remove it before creating
-                Files.deleteIfExists(link);
-                Files.createSymbolicLink(link, directory);
-            } catch (IOException ioe) {
-                CLog.e("Exception while attempting to create 'latest' link to: [%s]",
-                    directory);
-                CLog.e(ioe);
-                return null;
-            } catch (UnsupportedOperationException uoe) {
-                CLog.e("Failed to create 'latest' symbolic link - unsupported operation");
-                return null;
-            }
-        }
-        return link;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void invocationFailed(Throwable cause) {
-        warn("Invocation failed: %s", cause);
-        InvocationFailureHandler.setFailed(mBuildHelper, cause);
-        if (cause instanceof FingerprintComparisonException) {
-            mFingerprintFailure = true;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testLog(String name, LogDataType type, InputStreamSource stream) {
-        // This is safe to be invoked on either the primary or a shard ResultReporter
-        if (isShardResultReporter()) {
-            // Shard ResultReporters forward testLog to the mPrimaryResultReporter
-            mPrimaryResultReporter.testLog(name, type, stream);
-            return;
-        }
-        if (name.endsWith(DeviceInfo.FILE_SUFFIX)) {
-            // Handle device info file case
-            testLogDeviceInfo(name, stream);
-        } else {
-            // Handle default case
-            try {
-                File logFile = null;
-                if (mCompressLogs) {
-                    try (InputStream inputStream = stream.createInputStream()) {
-                        logFile = mTestLogSaver.saveAndGZipLogData(name, type, inputStream);
-                    }
-                } else {
-                    try (InputStream inputStream = stream.createInputStream()) {
-                        logFile = mTestLogSaver.saveLogData(name, type, inputStream);
-                    }
-                }
-                debug("Saved logs for %s in %s", name, logFile.getAbsolutePath());
-            } catch (IOException e) {
-                warn("Failed to write log for %s", name);
-                CLog.e(e);
-            }
-        }
-    }
-
-    /* Write device-info files to the result, invoked only by the primary result reporter */
-    private void testLogDeviceInfo(String name, InputStreamSource stream) {
-        try {
-            File ediDir = new File(mResultDir, DeviceInfo.RESULT_DIR_NAME);
-            ediDir.mkdirs();
-            File ediFile = new File(ediDir, name);
-            if (!ediFile.exists()) {
-                // only write this file to the results if not already present
-                FileUtil.writeToFile(stream.createInputStream(), ediFile);
-            }
-        } catch (IOException e) {
-            warn("Failed to write device info %s to result", name);
-            CLog.e(e);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testLogSaved(String dataName, LogDataType dataType, InputStreamSource dataStream,
-            LogFile logFile) {
-        // This is safe to be invoked on either the primary or a shard ResultReporter
-        if (mIncludeTestLogTags
-                && mCurrentResult != null
-                && dataName.startsWith(mCurrentResult.getFullName())) {
-
-            if (dataType == LogDataType.BUGREPORT) {
-                mCurrentResult.setBugReport(logFile.getUrl());
-            } else if (dataType == LogDataType.LOGCAT) {
-                mCurrentResult.setLog(logFile.getUrl());
-            } else if (dataType == LogDataType.PNG) {
-                mCurrentResult.setScreenshot(logFile.getUrl());
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setLogSaver(ILogSaver saver) {
-        // This is safe to be invoked on either the primary or a shard ResultReporter
-        mLogSaver = saver;
-    }
-
-    /**
-     * When enabled, save log data using log saver
-     */
-    private void saveLog(File resultFile, File zippedResults) throws IOException {
-        if (!mUseLogSaver) {
-            return;
-        }
-
-        FileInputStream fis = null;
-        LogFile logFile = null;
-        try {
-            fis = new FileInputStream(resultFile);
-            logFile = mLogSaver.saveLogData("log-result", LogDataType.XML, fis);
-            debug("Result XML URL: %s", logFile.getUrl());
-            logReportFiles(mConfiguration, resultFile, resultFile.getName(), LogDataType.XML);
-        } catch (IOException ioe) {
-            CLog.e("[%s] error saving XML with log saver", mDeviceSerial);
-            CLog.e(ioe);
-        } finally {
-            StreamUtil.close(fis);
-        }
-        // Save the full results folder.
-        if (zippedResults != null) {
-            FileInputStream zipResultStream = null;
-            try {
-                zipResultStream = new FileInputStream(zippedResults);
-                logFile = mLogSaver.saveLogData("results", LogDataType.ZIP, zipResultStream);
-                debug("Result zip URL: %s", logFile.getUrl());
-                logReportFiles(
-                        mConfiguration, zippedResults, "results", LogDataType.ZIP);
-            } finally {
-                StreamUtil.close(zipResultStream);
-            }
-        }
-    }
-
-    /**
-     * Return the path in which log saver persists log files or null if
-     * logSaver is not enabled.
-     */
-    private String getLogUrl() {
-        if (!mUseLogSaver || mLogSaver == null) {
-            return null;
-        }
-
-        return mLogSaver.getLogReportDir().getUrl();
-    }
-
-    @Override
-    public IShardableListener clone() {
-        ResultReporter clone = new ResultReporter(this);
-        OptionCopier.copyOptionsNoThrow(this, clone);
-        return clone;
-    }
-
-    /**
-     * Create results file compatible with CTSv2 (xml) report format.
-     */
-    protected File generateResultXmlFile()
-            throws IOException, XmlPullParserException {
-        return ResultHandler.writeResults(
-                mBuildHelper.getSuiteName(),
-                mBuildHelper.getSuiteVersion(),
-                getSuitePlan(mBuildHelper),
-                mBuildHelper.getSuiteBuild(),
-                mResult,
-                mResultDir,
-                mResult.getStartTime(),
-                mElapsedTime + mResult.getStartTime(),
-                mReferenceUrl,
-                getLogUrl(),
-                mBuildHelper.getCommandLineArgs(),
-                mResultAttributes);
-    }
-
-    /**
-     * Add build info collected from the device attributes to the results.
-     */
-    protected void addDeviceBuildInfoToResult() {
-        // Add all build info to the result to be serialized
-        Map<String, String> buildProperties = mapBuildInfo();
-        addBuildInfoToResult(buildProperties, mResult);
-    }
-
-    /**
-     * Override specific build properties so the report will be associated with the
-     * build fingerprint being certified.
-     */
-    protected void addDeviceBuildInfoToResult(String buildFingerprintOverride,
-            String manufactureOverride, String modelOverride) {
-
-        Map<String, String> buildProperties = mapBuildInfo();
-
-        // Extract and override values from build fingerprint.
-        // Build fingerprint format: brand/product/device:version/build_id/tags
-        String fingerprintPrefix = buildFingerprintOverride.split(":")[0];
-        String fingerprintTail = buildFingerprintOverride.split(":")[1];
-        String buildIdOverride = fingerprintTail.split("/")[1];
-        buildProperties.put(BUILD_ID, buildIdOverride);
-        String brandOverride = fingerprintPrefix.split("/")[0];
-        buildProperties.put(BUILD_BRAND, brandOverride);
-        String deviceOverride = fingerprintPrefix.split("/")[2];
-        buildProperties.put(BUILD_DEVICE, deviceOverride);
-        String productOverride = fingerprintPrefix.split("/")[1];
-        buildProperties.put(BUILD_PRODUCT, productOverride);
-        String versionOverride = fingerprintTail.split("/")[0];
-        buildProperties.put(BUILD_VERSION_RELEASE, versionOverride);
-        buildProperties.put(BUILD_FINGERPRINT, buildFingerprintOverride);
-        buildProperties.put(BUILD_MANUFACTURER, manufactureOverride);
-        buildProperties.put(BUILD_MODEL, modelOverride);
-
-        // Add modified values to results.
-        addBuildInfoToResult(buildProperties, mResult);
-        mResult.setBuildFingerprint(buildFingerprintOverride);
-    }
-    /** Aggregate build info from member device info. */
-    protected Map<String, String> mapBuildInfo() {
-        Map<String, String> buildProperties = new HashMap<>();
-        for (IBuildInfo buildInfo : mMainBuildInfos) {
-            for (Map.Entry<String, String> entry : buildInfo.getBuildAttributes().entrySet()) {
-                String key = entry.getKey();
-                String value = entry.getValue();
-                if (key.startsWith(BUILD_INFO)) {
-                    buildProperties.put(key.substring(CTS_PREFIX.length()), value);
-                }
-            }
-        }
-        return buildProperties;
-    }
-
-    /**
-     * Add build info to results.
-     * @param buildProperties Build info to add.
-     */
-    protected static void addBuildInfoToResult(Map<String, String> buildProperties,
-            IInvocationResult invocationResult) {
-        buildProperties.entrySet().stream().forEach(entry ->
-                invocationResult.addInvocationInfo(entry.getKey(), entry.getValue()));
-    }
-
-    /**
-     * Get the suite plan. This protected method was created for overrides.
-     * Extending classes can decide on the content of the output's suite_plan field.
-     *
-     * @param mBuildHelper Helper that contains build information.
-     * @return string Suite plan to use.
-     */
-    protected String getSuitePlan(CompatibilityBuildHelper mBuildHelper) {
-        return mBuildHelper.getSuitePlan();
-    }
-
-    /**
-     * Return true if this instance is a shard ResultReporter and should propagate certain events to
-     * the primary.
-     */
-    private boolean isShardResultReporter() {
-        return mPrimaryResultReporter != null;
-    }
-
-    /**
-     * When enabled, upload the result to a server.
-     */
-    private void uploadResult(File resultFile) {
-        if (mResultServer != null && !mResultServer.trim().isEmpty() && !mDisableResultPosting) {
-            try {
-                debug("Result Server: %d", mUploader.uploadResult(resultFile, mReferenceUrl));
-            } catch (IOException ioe) {
-                CLog.e("[%s] IOException while uploading result.", mDeviceSerial);
-                CLog.e(ioe);
-            }
-        }
-    }
-
-    /**
-     * Returns whether it is safe to mark modules as "done", given the invocation command-line
-     * arguments. Returns true unless this is a retry and specific filtering techniques are applied
-     * on the command-line, such as:
-     *   --retry-type failed
-     *   --include-filter
-     *   --exclude-filter
-     *   -t/--test
-     *   --subplan
-     */
-    private boolean canMarkDone(String args) {
-        if (mRetrySessionId == null) {
-            return true; // always allow modules to be marked done if not retry
-        }
-        return !(RetryType.FAILED.equals(mRetryType)
-                || RetryType.CUSTOM.equals(mRetryType)
-                || args.contains(CompatibilityTestSuite.INCLUDE_FILTER_OPTION)
-                || args.contains(CompatibilityTestSuite.EXCLUDE_FILTER_OPTION)
-                || args.contains(CompatibilityTestSuite.SUBPLAN_OPTION)
-                || args.matches(String.format(".* (-%s|--%s) .*",
-                CompatibilityTestSuite.TEST_OPTION_SHORT_NAME, CompatibilityTestSuite.TEST_OPTION)));
-    }
-
-    /**
-     * Copy the xml formatting files stored in this jar to the results directory
-     *
-     * @param resultsDir
-     */
-    static void copyFormattingFiles(File resultsDir, String suiteName) {
-        for (String resultFileName : ResultHandler.RESULT_RESOURCES) {
-            InputStream configStream = ResultHandler.class.getResourceAsStream(
-                    String.format("/report/%s-%s", suiteName, resultFileName));
-            if (configStream == null) {
-                // If suite specific files are not available, fallback to common.
-                configStream = ResultHandler.class.getResourceAsStream(
-                    String.format("/report/%s", resultFileName));
-            }
-            if (configStream != null) {
-                File resultFile = new File(resultsDir, resultFileName);
-                try {
-                    FileUtil.writeToFile(configStream, resultFile);
-                } catch (IOException e) {
-                    warn("Failed to write %s to file", resultFileName);
-                }
-            } else {
-                warn("Failed to load %s from jar", resultFileName);
-            }
-        }
-    }
-
-    /**
-     * move the dynamic config files to the results directory
-     */
-    private void copyDynamicConfigFiles() {
-        File configDir = new File(mResultDir, "config");
-        if (!configDir.mkdir()) {
-            warn("Failed to make dynamic config directory \"%s\" in the result",
-                    configDir.getAbsolutePath());
-        }
-
-        Set<String> uniqueModules = new HashSet<>();
-        for (IBuildInfo buildInfo : mMainBuildInfos) {
-            CompatibilityBuildHelper helper = new CompatibilityBuildHelper(buildInfo);
-            Map<String, File> dcFiles = helper.getDynamicConfigFiles();
-            for (String moduleName : dcFiles.keySet()) {
-                File srcFile = dcFiles.get(moduleName);
-                if (!uniqueModules.contains(moduleName)) {
-                    // have not seen config for this module yet, copy into result
-                    File destFile = new File(configDir, moduleName + ".dynamic");
-                    try {
-                        FileUtil.copyFile(srcFile, destFile);
-                        uniqueModules.add(moduleName); // Add to uniqueModules if copy succeeds
-                    } catch (IOException e) {
-                        warn("Failure when copying config file \"%s\" to \"%s\" for module %s",
-                                srcFile.getAbsolutePath(), destFile.getAbsolutePath(), moduleName);
-                        CLog.e(e);
-                    }
-                }
-                FileUtil.deleteFile(srcFile);
-            }
-        }
-    }
-
-    /**
-     * Recursively copy any other files found in the previous session's result directory to the
-     * new result directory, so long as they don't already exist. For example, a "screenshots"
-     * directory generated in a previous session by a passing test will not be generated on retry
-     * unless copied from the old result directory.
-     *
-     * @param oldDir
-     * @param newDir
-     */
-    static void copyRetryFiles(File oldDir, File newDir) {
-        File[] oldChildren = oldDir.listFiles();
-        for (File oldChild : oldChildren) {
-            if (NOT_RETRY_FILES.contains(oldChild.getName())) {
-                continue; // do not copy this file/directory or its children
-            }
-            File newChild = new File(newDir, oldChild.getName());
-            if (!newChild.exists()) {
-                // If this old file or directory doesn't exist in new dir, simply copy it
-                try {
-                    if (oldChild.isDirectory()) {
-                        FileUtil.recursiveCopy(oldChild, newChild);
-                    } else {
-                        FileUtil.copyFile(oldChild, newChild);
-                    }
-                } catch (IOException e) {
-                    warn("Failed to copy file \"%s\" from previous session", oldChild.getName());
-                }
-            } else if (oldChild.isDirectory() && newChild.isDirectory()) {
-                // If both children exist as directories, make sure the children of the old child
-                // directory exist in the new child directory.
-                copyRetryFiles(oldChild, newChild);
-            }
-        }
-    }
-
-    /**
-     * Zip the contents of the given results directory.
-     *
-     * @param resultsDir
-     */
-    private static File zipResults(File resultsDir) {
-        File zipResultFile = null;
-        try {
-            // create a file in parent directory, with same name as resultsDir
-            zipResultFile = new File(resultsDir.getParent(), String.format("%s.zip",
-                    resultsDir.getName()));
-            ZipUtil.createZip(resultsDir, zipResultFile);
-        } catch (IOException e) {
-            warn("Failed to create zip for %s", resultsDir.getName());
-        }
-        return zipResultFile;
-    }
-
-    /**
-     *  Log info to the console.
-     */
-    private static void info(String format, Object... args) {
-        log(LogLevel.INFO, format, args);
-    }
-
-    /**
-     *  Log debug to the console.
-     */
-    private static void debug(String format, Object... args) {
-        log(LogLevel.DEBUG, format, args);
-    }
-
-    /**
-     *  Log a warning to the console.
-     */
-    private static void warn(String format, Object... args) {
-        log(LogLevel.WARN, format, args);
-    }
-
-    /**
-     * Log a message to the console
-     */
-    private static void log(LogLevel level, String format, Object... args) {
-        CLog.logAndDisplay(level, format, args);
-    }
-
-    /**
-     * For testing purpose.
-     */
-    @VisibleForTesting
-    public IInvocationResult getResult() {
-        return mResult;
-    }
-
-    /**
-     * Returns true if the reporter is finalized before the end of the timeout. False otherwise.
-     */
-    @VisibleForTesting
-    public boolean waitForFinalized(long timeout, TimeUnit unit) throws InterruptedException {
-        return mFinalized.await(timeout, unit);
-    }
-
-    private static String sanitizeXmlContent(String s) {
-        return XmlEscapers.xmlContentEscaper().escape(s);
-    }
-
-    /** Re-log a result file to all reporters so they are aware of it. */
-    private void logReportFiles(
-            IConfiguration configuration, File resultFile, String dataName, LogDataType type) {
-        if (configuration == null) {
-            return;
-        }
-        List<ITestInvocationListener> listeners = configuration.getTestInvocationListeners();
-        try (FileInputStreamSource source = new FileInputStreamSource(resultFile)) {
-            for (ITestInvocationListener listener : listeners) {
-                if (listener.equals(this)) {
-                    // Avoid logging agaisnt itself
-                    continue;
-                }
-                listener.testLog(dataName, type, source);
-            }
-        }
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/TestRunHandler.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/TestRunHandler.java
deleted file mode 100644
index 4473eb8..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/TestRunHandler.java
+++ /dev/null
@@ -1,97 +0,0 @@
-/*
- * 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.compatibility.common.tradefed.result;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.util.FileUtil;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.HashMap;
-import java.util.Map;
-
-
-/**
- * A helper class for setting and checking the number of expected test runs.
- */
-public class TestRunHandler {
-
-    private static final String MAP_DELIMITER = "->";
-
-    /**
-     * Determine the number of expected test runs for the module
-     *
-     * @param buildHelper the {@link CompatibilityBuildHelper} from which to retrieve invocation
-     * failure file
-     * @return the number of expected test runs, or 1 if module is not found
-     */
-    public static int getTestRuns(final CompatibilityBuildHelper buildHelper, String id) {
-        try {
-            File f = buildHelper.getTestRunsFile();
-            if (!f.exists() || f.length() == 0) {
-                return 1; // test runs file doesn't exist, expect one test run by default
-            }
-            String mapString = FileUtil.readStringFromFile(f);
-            Map<String, Integer> map = stringToMap(mapString);
-            Integer testRuns = map.get(id);
-            return (testRuns == null) ? 1 : testRuns;
-        } catch (IOException e) {
-            CLog.e("Could not read test run file for session %s",
-                buildHelper.getDirSuffix(buildHelper.getStartTime()));
-            CLog.e(e);
-            return 1;
-        }
-    }
-
-    /**
-     * Write the number of expected test runs to the result's test run file.
-     *
-     * @param buildHelper the {@link CompatibilityBuildHelper} used to write the
-     * test run file
-     * @param testRuns a mapping of module names to number of test runs expected
-     */
-    public static void setTestRuns(final CompatibilityBuildHelper buildHelper,
-            Map<String, Integer> testRuns) {
-        try {
-            File f = buildHelper.getTestRunsFile();
-            if (!f.exists()) {
-                f.createNewFile();
-            }
-            FileUtil.writeToFile(mapToString(testRuns), f);
-        } catch (IOException e) {
-            CLog.e("Exception while writing test runs file.");
-            CLog.e(e);
-        }
-    }
-
-    private static String mapToString(Map<String, Integer> map) {
-        StringBuilder sb = new StringBuilder("");
-        for (Map.Entry<String, Integer> entry : map.entrySet()) {
-            sb.append(String.format("%s%s%d\n", entry.getKey(), MAP_DELIMITER, entry.getValue()));
-        }
-        return sb.toString();
-    }
-
-    private static Map<String, Integer> stringToMap(String str) {
-        Map<String, Integer> map = new HashMap<>();
-        for (String entry : str.split("\n")) {
-            String[] parts = entry.split(MAP_DELIMITER);
-            map.put(parts[0], Integer.parseInt(parts[1]));
-        }
-        return map;
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/PreviousResultLoader.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/PreviousResultLoader.java
index c459681..5ee0fbb 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/PreviousResultLoader.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/result/suite/PreviousResultLoader.java
@@ -19,7 +19,6 @@
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
 import com.android.compatibility.common.tradefed.targetprep.BuildFingerPrintPreparer;
-import com.android.compatibility.common.tradefed.testtype.retry.RetryFactoryTest;
 import com.android.compatibility.common.util.ResultHandler;
 import com.android.ddmlib.Log.LogLevel;
 import com.android.tradefed.build.BuildRetrievalError;
@@ -73,7 +72,10 @@
 
     private static final String COMMAND_LINE_ARGS = "command_line_args";
 
-    @Option(name = RetryFactoryTest.RETRY_OPTION,
+    public static final String RETRY_OPTION = "retry";
+
+    @Option(
+            name = RETRY_OPTION,
             shortName = 'r',
             description = "retry a previous session's failed and not executed tests.",
             mandatory = true)
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstaller.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstaller.java
index 77a12a8..32f8c7b 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstaller.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstaller.java
@@ -21,14 +21,18 @@
 import com.android.tradefed.invoker.TestInformation;
 import com.android.tradefed.targetprep.TargetSetupError;
 import com.android.tradefed.targetprep.TestAppInstallSetup;
+import com.android.tradefed.targetprep.suite.SuiteApkInstaller;
 
 import java.io.File;
 import java.io.FileNotFoundException;
 
 /**
  * Installs specified APKs from Compatibility repository.
+ *
+ * @deprecated Use {@link SuiteApkInstaller} instead. Options will be unchanged.
  */
-@OptionClass(alias="apk-installer")
+@Deprecated
+@OptionClass(alias = "apk-installer")
 public class ApkInstaller extends TestAppInstallSetup {
 
     private CompatibilityBuildHelper mBuildHelper = null;
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstrumentationPreparer.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstrumentationPreparer.java
index 827c3de..3e6cae1 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstrumentationPreparer.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/ApkInstrumentationPreparer.java
@@ -30,6 +30,8 @@
 import com.android.tradefed.result.TestDescription;
 import com.android.tradefed.result.TestResult;
 import com.android.tradefed.result.TestRunResult;
+import com.android.tradefed.result.error.DeviceErrorIdentifier;
+import com.android.tradefed.result.error.InfraErrorIdentifier;
 import com.android.tradefed.targetprep.BuildError;
 import com.android.tradefed.targetprep.TargetSetupError;
 import com.android.tradefed.testtype.AndroidJUnitTest;
@@ -87,12 +89,17 @@
             if (instrument(testInfo)) {
                 CLog.d("Target preparation successful");
             } else if (mThrowError) {
-                throw new TargetSetupError("Not all target preparation steps completed",
-                        device.getDeviceDescriptor());
+                throw new TargetSetupError(
+                        "Not all target preparation steps completed",
+                        device.getDeviceDescriptor(),
+                        DeviceErrorIdentifier.DEVICE_UNEXPECTED_RESPONSE);
             }
         } catch (FileNotFoundException e) {
-            throw new TargetSetupError("Couldn't find apk to instrument", e,
-                    device.getDeviceDescriptor());
+            throw new TargetSetupError(
+                    "Couldn't find apk to instrument",
+                    e,
+                    device.getDeviceDescriptor(),
+                    InfraErrorIdentifier.ARTIFACT_NOT_FOUND);
         }
     }
 
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInteractionHelperInstaller.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInteractionHelperInstaller.java
index c980f81..8ca82a9 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInteractionHelperInstaller.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DeviceInteractionHelperInstaller.java
@@ -16,13 +16,10 @@
 package com.android.compatibility.common.tradefed.targetprep;
 
 import com.android.ddmlib.Log.LogLevel;
-import com.android.tradefed.build.IBuildInfo;
 import com.android.tradefed.config.Option;
 import com.android.tradefed.config.OptionClass;
 import com.android.tradefed.device.DeviceNotAvailableException;
 import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.invoker.InvocationContext;
 import com.android.tradefed.invoker.TestInformation;
 import com.android.tradefed.log.LogUtil.CLog;
 import com.android.tradefed.targetprep.BaseTargetPreparer;
@@ -72,18 +69,6 @@
 
     /** {@inheritDoc} */
     @Override
-    public void setUp(ITestDevice device, IBuildInfo buildInfo)
-            throws TargetSetupError, BuildError, DeviceNotAvailableException {
-        IInvocationContext context = new InvocationContext();
-        context.addAllocatedDevice("device", device);
-        context.addDeviceBuildInfo("device", buildInfo);
-        TestInformation testInfo =
-                TestInformation.newBuilder().setInvocationContext(context).build();
-        setUp(testInfo);
-    }
-
-    /** {@inheritDoc} */
-    @Override
     public void setUp(TestInformation testInfo)
             throws TargetSetupError, BuildError, DeviceNotAvailableException {
         ITestDevice device = testInfo.getDevice();
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java
index 52c2b79..e353c2c 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/DynamicConfigPusher.java
@@ -27,6 +27,8 @@
 import com.android.tradefed.invoker.IInvocationContext;
 import com.android.tradefed.invoker.TestInformation;
 import com.android.tradefed.log.LogUtil.CLog;
+import com.android.tradefed.result.error.DeviceErrorIdentifier;
+import com.android.tradefed.result.error.InfraErrorIdentifier;
 import com.android.tradefed.targetprep.BaseTargetPreparer;
 import com.android.tradefed.targetprep.BuildError;
 import com.android.tradefed.targetprep.TargetSetupError;
@@ -156,9 +158,12 @@
             String deviceDest = String.format("%s%s.dynamic",
                     DynamicConfig.CONFIG_FOLDER_ON_DEVICE, mModuleName);
             if (!device.pushFile(hostFile, deviceDest)) {
-                throw new TargetSetupError(String.format(
-                        "Failed to push local '%s' to remote '%s'", hostFile.getAbsolutePath(),
-                        deviceDest), device.getDeviceDescriptor());
+                throw new TargetSetupError(
+                        String.format(
+                                "Failed to push local '%s' to remote '%s'",
+                                hostFile.getAbsolutePath(), deviceDest),
+                        device.getDeviceDescriptor(),
+                        DeviceErrorIdentifier.FAIL_PUSH_FILE);
             }
             mDeviceFilePushed = deviceDest;
         }
@@ -218,7 +223,9 @@
                 FileUtil.deleteFile(localConfigFile);
                 throw new TargetSetupError(
                         String.format("Fail to unpack '%s.dynamic' from resources", lookupName),
-                        e, device.getDeviceDescriptor());
+                        e,
+                        device.getDeviceDescriptor(),
+                        InfraErrorIdentifier.ARTIFACT_NOT_FOUND);
             }
             return localConfigFile;
         }
@@ -228,8 +235,11 @@
             String lookupName = (mDynamicConfigName != null) ? mDynamicConfigName : mModuleName;
             localConfigFile = buildHelper.getTestFile(String.format("%s.dynamic", lookupName));
         } catch (FileNotFoundException e) {
-            throw new TargetSetupError("Cannot get local dynamic config file from test directory",
-                    e, device.getDeviceDescriptor());
+            throw new TargetSetupError(
+                    "Cannot get local dynamic config file from test directory",
+                    e,
+                    device.getDeviceDescriptor(),
+                    InfraErrorIdentifier.ARTIFACT_NOT_FOUND);
         }
         return localConfigFile;
     }
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/PropertyCheck.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/PropertyCheck.java
index 06c1a4b..c61adbd 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/PropertyCheck.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/PropertyCheck.java
@@ -72,7 +72,7 @@
                 if (mThrowError) {
                     throw new TargetSetupError(msg, device.getDeviceDescriptor());
                 } else {
-                    logWarning(msg);
+                    CLog.w(msg);
                 }
             }
             return;
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/TokenRequirement.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/TokenRequirement.java
deleted file mode 100644
index eda26ce..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/targetprep/TokenRequirement.java
+++ /dev/null
@@ -1,58 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.targetprep;
-
-import com.android.tradefed.config.Option;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.invoker.TestInformation;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.targetprep.BaseTargetPreparer;
-import com.android.tradefed.targetprep.BuildError;
-import com.android.tradefed.targetprep.ITargetPreparer;
-import com.android.tradefed.targetprep.TargetSetupError;
-
-import java.util.HashSet;
-import java.util.Set;
-
-/**
- * An {@link ITargetPreparer} that allows a test module to specify tokens that a device must have to
- * run the tests contained.
- *
- * <p>A token is string that is required by a test module and given to a device by the user, they
- * are used by the scheduler to ensure tests are scheduled on the correct devices. Eg if the user is
- * sharding the innvocation across 10 devices, they will not want to put a SIM card in every device,
- * instead they can use a single SIM card and use tokens to tell the scheduler which device should
- * be used to run the SIM card tests.
- */
-public class TokenRequirement extends BaseTargetPreparer {
-
-    @Option(name = "token", description = "The token a device must have to run this module")
-    private Set<String> mTokens = new HashSet<>();
-
-    @Override
-    public void setUp(TestInformation testInfo)
-            throws TargetSetupError, BuildError, DeviceNotAvailableException {
-        CLog.e("TokenRequirement is not expected to run");
-    }
-
-    /**
-     * @return the {@link Set} of tokens required by this module.
-     */
-    public Set<String> getTokens() {
-        return mTokens;
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java
deleted file mode 100644
index 72d2f4f..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTest.java
+++ /dev/null
@@ -1,1003 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.compatibility.common.tradefed.result.InvocationFailureHandler;
-import com.android.compatibility.common.tradefed.result.SubPlanHelper;
-import com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker;
-import com.android.compatibility.common.tradefed.testtype.suite.CompatibilityTestSuite;
-import com.android.compatibility.common.tradefed.util.RetryFilterHelper;
-import com.android.compatibility.common.tradefed.util.RetryType;
-import com.android.compatibility.common.tradefed.util.UniqueModuleCountUtil;
-import com.android.compatibility.common.util.IInvocationResult;
-import com.android.compatibility.common.util.ResultHandler;
-import com.android.compatibility.common.util.TestFilter;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.ConfigurationException;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.config.Option.Importance;
-import com.android.tradefed.config.OptionClass;
-import com.android.tradefed.config.OptionCopier;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.DeviceUnresponsiveException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.invoker.InvocationContext;
-import com.android.tradefed.log.ITestLogger;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.InputStreamSource;
-import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.suite.checker.ISystemStatusChecker;
-import com.android.tradefed.suite.checker.ISystemStatusCheckerReceiver;
-import com.android.tradefed.suite.checker.StatusCheckerResult;
-import com.android.tradefed.suite.checker.StatusCheckerResult.CheckStatus;
-import com.android.tradefed.testtype.Abi;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IDeviceTest;
-import com.android.tradefed.testtype.IInvocationContextReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IShardableTest;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.suite.TestSuiteInfo;
-import com.android.tradefed.util.AbiFormatter;
-import com.android.tradefed.util.AbiUtils;
-import com.android.tradefed.util.ArrayUtil;
-import com.android.tradefed.util.MultiMap;
-import com.android.tradefed.util.StreamUtil;
-import com.android.tradefed.util.TimeUtil;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.ByteArrayOutputStream;
-import java.io.FileNotFoundException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.CountDownLatch;
-import java.util.concurrent.TimeUnit;
-
-/**
- * A Test for running Compatibility Suites.
- * @deprecated use {@link CompatibilityTestSuite} instead.
- */
-@Deprecated
-@OptionClass(alias = "compatibility")
-public class CompatibilityTest implements IDeviceTest, IShardableTest, IBuildReceiver,
-        ISystemStatusCheckerReceiver, ITestCollector,
-        IInvocationContextReceiver {
-
-    public static final String INCLUDE_FILTER_OPTION = "include-filter";
-    public static final String EXCLUDE_FILTER_OPTION = "exclude-filter";
-    public static final String SUBPLAN_OPTION = "subplan";
-    public static final String MODULE_OPTION = "module";
-    public static final String TEST_OPTION = "test";
-    public static final String PRECONDITION_ARG_OPTION = "precondition-arg";
-    public static final String MODULE_ARG_OPTION = "module-arg";
-    public static final String TEST_ARG_OPTION = "test-arg";
-    public static final char TEST_OPTION_SHORT_NAME = 't';
-    public static final String RETRY_OPTION = "retry";
-    public static final String RETRY_TYPE_OPTION = "retry-type";
-    public static final String ABI_OPTION = "abi";
-    public static final String SHARD_OPTION = "shards";
-    public static final String SKIP_DEVICE_INFO_OPTION = "skip-device-info";
-    public static final String SKIP_PRECONDITIONS_OPTION = "skip-preconditions";
-    public static final String SKIP_HOST_ARCH_CHECK = "skip-host-arch-check";
-    public static final String PRIMARY_ABI_RUN = "primary-abi-only";
-    public static final String DEVICE_TOKEN_OPTION = "device-token";
-    public static final String LOGCAT_ON_FAILURE_SIZE_OPTION = "logcat-on-failure-size";
-
-    // Constants for checking invocation or preconditions preparation failure
-    private static final int NUM_PREP_ATTEMPTS = 10;
-    private static final int MINUTES_PER_PREP_ATTEMPT = 2;
-
-    @Option(name = SUBPLAN_OPTION,
-            description = "the subplan to run",
-            importance = Importance.IF_UNSET)
-    private String mSubPlan;
-
-    @Option(name = INCLUDE_FILTER_OPTION,
-            description = "the include module filters to apply.",
-            importance = Importance.ALWAYS)
-    private Set<String> mIncludeFilters = new HashSet<>();
-
-    @Option(name = EXCLUDE_FILTER_OPTION,
-            description = "the exclude module filters to apply.",
-            importance = Importance.ALWAYS)
-    private Set<String> mExcludeFilters = new HashSet<>();
-
-    @Option(name = MODULE_OPTION,
-            shortName = 'm',
-            description = "the test module to run.",
-            importance = Importance.IF_UNSET)
-    private String mModuleName = null;
-
-    @Option(name = TEST_OPTION,
-            shortName = TEST_OPTION_SHORT_NAME,
-            description = "the test run.",
-            importance = Importance.IF_UNSET)
-    private String mTestName = null;
-
-    @Option(name = PRECONDITION_ARG_OPTION,
-            description = "the arguments to pass to a precondition. The expected format is"
-                    + "\"<arg-name>:<arg-value>\"",
-            importance = Importance.ALWAYS)
-    private List<String> mPreconditionArgs = new ArrayList<>();
-
-    @Option(name = MODULE_ARG_OPTION,
-            description = "the arguments to pass to a module. The expected format is"
-                    + "\"<module-name>:<arg-name>:[<arg-key>:=]<arg-value>\"",
-            importance = Importance.ALWAYS)
-    private List<String> mModuleArgs = new ArrayList<>();
-
-    @Option(name = TEST_ARG_OPTION,
-            description = "the arguments to pass to a test. The expected format is"
-                    + "\"<test-class>:<arg-name>:[<arg-key>:=]<arg-value>\"",
-            importance = Importance.ALWAYS)
-    private List<String> mTestArgs = new ArrayList<>();
-
-    @Option(name = RETRY_OPTION,
-            shortName = 'r',
-            description = "retry a previous session's failed and not executed tests.",
-            importance = Importance.IF_UNSET)
-    private Integer mRetrySessionId = null;
-
-    @Option(name = RETRY_TYPE_OPTION,
-            description = "used with " + RETRY_OPTION + ", retry tests of a certain status. "
-            + "Possible values include \"failed\", \"not_executed\", and \"custom\".",
-            importance = Importance.IF_UNSET)
-    private RetryType mRetryType = null;
-
-    @Option(name = ABI_OPTION,
-            shortName = 'a',
-            description = "the abi to test.",
-            importance = Importance.IF_UNSET)
-    private String mAbiName = null;
-
-    @Option(name = SHARD_OPTION,
-            description = "split the modules up to run on multiple devices concurrently. "
-                    + "Deprecated, use --shard-count instead.")
-    @Deprecated
-    private int mShards = 1;
-
-    @Option(name = SKIP_DEVICE_INFO_OPTION,
-            shortName = 'd',
-            description = "Whether device info collection should be skipped")
-    private boolean mSkipDeviceInfo = false;
-
-    @Option(name = SKIP_HOST_ARCH_CHECK,
-            description = "Whether host architecture check should be skipped")
-    private boolean mSkipHostArchCheck = false;
-
-    @Option(name = SKIP_PRECONDITIONS_OPTION,
-            shortName = 'o',
-            description = "Whether preconditions should be skipped")
-    private boolean mSkipPreconditions = false;
-
-    @Option(name = PRIMARY_ABI_RUN,
-            description = "Whether to run tests with only the device primary abi. "
-                    + "This override the --abi option.")
-    private boolean mPrimaryAbiRun = false;
-
-    @Option(name = DEVICE_TOKEN_OPTION,
-            description = "Holds the devices' tokens, used when scheduling tests that have"
-                    + "prerequisites such as requiring a SIM card. Format is <serial>:<token>",
-            importance = Importance.ALWAYS)
-    private List<String> mDeviceTokens = new ArrayList<>();
-
-    @Option(name = "bugreport-on-failure",
-            description = "Take a bugreport on every test failure. " +
-                    "Warning: can potentially use a lot of disk space.")
-    private boolean mBugReportOnFailure = false;
-
-    @Option(name = "logcat-on-failure",
-            description = "Take a logcat snapshot on every test failure.")
-    private boolean mLogcatOnFailure = false;
-
-    @Option(name = LOGCAT_ON_FAILURE_SIZE_OPTION,
-            description = "The max number of logcat data in bytes to capture when "
-            + "--logcat-on-failure is on. Should be an amount that can comfortably fit in memory.")
-    private int mMaxLogcatBytes = 500 * 1024; // 500K
-
-    @Option(name = "screenshot-on-failure",
-            description = "Take a screenshot on every test failure.")
-    private boolean mScreenshotOnFailure = false;
-
-    @Option(name = "reboot-before-test",
-            description = "Reboot the device before the test suite starts.")
-    private boolean mRebootBeforeTest = false;
-
-    @Option(name = "reboot-on-failure",
-            description = "Reboot the device after every test failure.")
-    private boolean mRebootOnFailure = false;
-
-    @Option(name = "reboot-per-module",
-            description = "Reboot the device before every module run.")
-    private boolean mRebootPerModule = false;
-
-    @Option(name = "skip-connectivity-check",
-            description = "Don't verify device connectivity between module execution.")
-    private boolean mSkipConnectivityCheck = false;
-
-    @Option(
-            name = "preparer-whitelist",
-            description =
-                    "Only run specific preparers."
-                            + "Specify zero or more ITargetPreparers as canonical class names. "
-                            + "e.g. \"com.android.compatibility.common.tradefed.targetprep.ApkInstaller\" "
-                            + "If not specified, all configured preparers are run.")
-    private Set<String> mPreparerAllowlist = new HashSet<>();
-
-    @Option(name = "skip-all-system-status-check",
-            description = "Whether all system status check between modules should be skipped")
-    private boolean mSkipAllSystemStatusCheck = false;
-
-    @Option(name = "skip-system-status-check",
-            description = "Disable specific system status checkers."
-            + "Specify zero or more SystemStatusChecker as canonical class names. e.g. "
-            + "\"com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker\" "
-            + "If not specified, all configured or whitelisted system status checkers are run.")
-    private Set<String> mSystemStatusCheckBlacklist = new HashSet<>();
-
-    @Option(name = "system-status-check-whitelist",
-            description = "Only run specific system status checkers."
-            + "Specify zero or more SystemStatusChecker as canonical class names. e.g. "
-            + "\"com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker\" "
-            + "If not specified, all configured system status checkers are run.")
-    private Set<String> mSystemStatusCheckWhitelist = new HashSet<>();
-
-    private List<ISystemStatusChecker> mListCheckers = new ArrayList<>();
-
-    @Option(name = "collect-tests-only",
-            description = "Only invoke the suite to collect list of applicable test cases. All "
-                    + "test run callbacks will be triggered, but test execution will not be "
-                    + "actually carried out.")
-    private Boolean mCollectTestsOnly = null;
-
-    @Option(name = "module-metadata-include-filter",
-            description = "Include modules for execution based on matching of metadata fields: "
-                    + "for any of the specified filter name and value, if a module has a metadata "
-                    + "field with the same name and value, it will be included. When both module "
-                    + "inclusion and exclusion rules are applied, inclusion rules will be "
-                    + "evaluated first. Using this together with test filter inclusion rules may "
-                    + "result in no tests to execute if the rules don't overlap.")
-    private MultiMap<String, String> mModuleMetadataIncludeFilter = new MultiMap<>();
-
-    @Option(name = "module-metadata-exclude-filter",
-            description = "Exclude modules for execution based on matching of metadata fields: "
-                    + "for any of the specified filter name and value, if a module has a metadata "
-                    + "field with the same name and value, it will be excluded. When both module "
-                    + "inclusion and exclusion rules are applied, inclusion rules will be "
-                    + "evaluated first.")
-    private MultiMap<String, String> mModuleMetadataExcludeFilter = new MultiMap<>();
-
-    private int mTotalShards;
-    private Integer mShardIndex = null;
-    private IModuleRepo mModuleRepo;
-    private ITestDevice mDevice;
-    private CompatibilityBuildHelper mBuildHelper;
-
-    // variables used for local sharding scenario
-    private static CountDownLatch sPreparedLatch;
-    private boolean mIsLocalSharding = false;
-    private boolean mIsSharded = false;
-
-    private IInvocationContext mInvocationContext;
-
-    /**
-     * Create a new {@link CompatibilityTest} that will run the default list of
-     * modules.
-     */
-    public CompatibilityTest() {
-        this(1 /* totalShards */, new ModuleRepo(), 0);
-    }
-
-    /**
-     * Create a new {@link CompatibilityTest} that will run a sublist of
-     * modules.
-     */
-    public CompatibilityTest(int totalShards, IModuleRepo moduleRepo, Integer shardIndex) {
-        if (totalShards < 1) {
-            throw new IllegalArgumentException(
-                    "Must be at least 1 shard. Given:" + totalShards);
-        }
-        mTotalShards = totalShards;
-        mModuleRepo = moduleRepo;
-        mShardIndex = shardIndex;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ITestDevice getDevice() {
-        return mDevice;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setDevice(ITestDevice device) {
-        mDevice = device;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBuild(IBuildInfo buildInfo) {
-        mBuildHelper = new CompatibilityBuildHelper(buildInfo);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        try {
-            List<ISystemStatusChecker> checkers = new ArrayList<>();
-            // Get system status checkers
-            if (mSkipAllSystemStatusCheck) {
-                CLog.d("Skipping system status checkers");
-            } else {
-                checkSystemStatusBlackAndWhiteList();
-                for (ISystemStatusChecker checker : mListCheckers) {
-                    if(shouldIncludeSystemStatusChecker(checker)) {
-                        checkers.add(checker);
-                    }
-                }
-            }
-
-            LinkedList<IModuleDef> modules = initializeModuleRepo();
-
-            mExcludeFilters.clear();
-            mIncludeFilters.clear();
-            // Update BuildInfo in each shard to store the original command-line arguments from
-            // the session to be retried. These arguments will be serialized in the report later.
-            if (mRetrySessionId != null) {
-                loadRetryCommandLineArgs(mRetrySessionId);
-            }
-
-            listener = new FailureListener(listener, getDevice(), mBugReportOnFailure,
-                    mLogcatOnFailure, mScreenshotOnFailure, mRebootOnFailure, mMaxLogcatBytes);
-            int moduleCount = modules.size();
-            if (moduleCount == 0) {
-                CLog.logAndDisplay(LogLevel.INFO, "No module to run on %s.",
-                        mDevice.getSerialNumber());
-                // Make sure we unlock other shards.
-                if (sPreparedLatch != null) {
-                    sPreparedLatch.countDown();
-                }
-                return;
-            } else {
-                int uniqueModuleCount = UniqueModuleCountUtil.countUniqueModules(modules);
-                CLog.logAndDisplay(LogLevel.INFO, "Starting %d test sub-module%s on %s",
-                        uniqueModuleCount, (uniqueModuleCount > 1) ? "s" : "",
-                                mDevice.getSerialNumber());
-            }
-
-            if (mRebootBeforeTest) {
-                CLog.d("Rebooting device before test starts as requested.");
-                mDevice.reboot();
-            }
-
-            if (mSkipConnectivityCheck) {
-                String clazz = NetworkConnectivityChecker.class.getCanonicalName();
-                CLog.logAndDisplay(LogLevel.INFO, "\"--skip-connectivity-check\" is deprecated, "
-                        + "please use \"--skip-system-status-check %s\" instead", clazz);
-                mSystemStatusCheckBlacklist.add(clazz);
-            }
-
-            // Set values and run preconditions
-            boolean isPrepared = true; // whether the device has been successfully prepared
-            for (int i = 0; i < moduleCount; i++) {
-                IModuleDef module = modules.get(i);
-                module.setBuild(mBuildHelper.getBuildInfo());
-                module.setDevice(mDevice);
-                module.setPreparerAllowlist(mPreparerAllowlist);
-                // don't set a value if unspecified
-                if (mCollectTestsOnly != null) {
-                    module.setCollectTestsOnly(mCollectTestsOnly);
-                }
-                isPrepared &= module.prepare(mSkipPreconditions, mPreconditionArgs);
-            }
-            if (!isPrepared) {
-                throw new RuntimeException(String.format("Failed preconditions on %s",
-                        mDevice.getSerialNumber()));
-            }
-            if (mIsLocalSharding) {
-                try {
-                    sPreparedLatch.countDown();
-                    int attempt = 1;
-                    while(!sPreparedLatch.await(MINUTES_PER_PREP_ATTEMPT, TimeUnit.MINUTES)) {
-                        if (attempt > NUM_PREP_ATTEMPTS ||
-                                InvocationFailureHandler.hasFailed(mBuildHelper)) {
-                            CLog.logAndDisplay(LogLevel.ERROR,
-                                    "Incorrect preparation detected, exiting test run from %s",
-                                    mDevice.getSerialNumber());
-                            return;
-                        }
-                        CLog.logAndDisplay(LogLevel.WARN, "waiting on preconditions");
-                        attempt++;
-                    }
-                } catch (InterruptedException e) {
-                    throw new RuntimeException(e);
-                }
-            }
-            // Module Repo is not useful anymore
-            mModuleRepo.tearDown();
-            mModuleRepo = null;
-            // Run the tests
-            while (!modules.isEmpty()) {
-                // Make sure we remove the modules from the reference list when we are done with
-                // them.
-                IModuleDef module = modules.poll();
-                long start = System.currentTimeMillis();
-
-                if (mRebootPerModule) {
-                    if ("user".equals(mDevice.getProperty("ro.build.type"))) {
-                        CLog.e("reboot-per-module should only be used during development, "
-                            + "this is a\" user\" build device");
-                    } else {
-                        CLog.logAndDisplay(LogLevel.INFO, "Rebooting device before starting next "
-                            + "module");
-                        mDevice.reboot();
-                    }
-                }
-
-                // execute pre module execution checker
-                if (checkers != null && !checkers.isEmpty()) {
-                    runPreModuleCheck(module.getName(), checkers, mDevice, listener);
-                }
-                IInvocationContext moduleContext = new InvocationContext();
-                moduleContext.setConfigurationDescriptor(module.getConfigurationDescriptor());
-                moduleContext.addInvocationAttribute(IModuleDef.MODULE_NAME, module.getName());
-                moduleContext.addInvocationAttribute(IModuleDef.MODULE_ABI,
-                        module.getAbi().getName());
-                // This format is not always true but for the deprecated runner this is best effort.
-                moduleContext.addInvocationAttribute(
-                        IModuleDef.MODULE_ID,
-                        String.format("%s %s", module.getAbi().getName(), module.getName()));
-                mInvocationContext.setModuleInvocationContext(moduleContext);
-                // Populate the module context with devices and builds
-                for (String deviceName : mInvocationContext.getDeviceConfigNames()) {
-                    moduleContext.addAllocatedDevice(
-                            deviceName, mInvocationContext.getDevice(deviceName));
-                    moduleContext.addDeviceBuildInfo(
-                            deviceName, mInvocationContext.getBuildInfo(deviceName));
-                }
-                module.setInvocationContext(moduleContext);
-                try {
-                    listener.testModuleStarted(moduleContext);
-                    module.run(listener);
-                } catch (DeviceUnresponsiveException due) {
-                    // being able to catch a DeviceUnresponsiveException here implies that recovery
-                    // was successful, and test execution should proceed to next module
-                    ByteArrayOutputStream stack = new ByteArrayOutputStream();
-                    due.printStackTrace(new PrintWriter(stack, true));
-                    StreamUtil.close(stack);
-                    CLog.w("Ignored DeviceUnresponsiveException because recovery was successful, "
-                            + "proceeding with next module. Stack trace: %s",
-                            stack.toString());
-                    CLog.w("This may be due to incorrect timeout setting on module %s",
-                            module.getName());
-                } finally {
-                    // clear out module invocation context since we are now done with module
-                    // execution
-                    mInvocationContext.setModuleInvocationContext(null);
-                    listener.testModuleEnded();
-                }
-                long duration = System.currentTimeMillis() - start;
-                long expected = module.getRuntimeHint();
-                long delta = Math.abs(duration - expected);
-                // Show warning if delta is more than 10% of expected
-                if (expected > 0 && ((float)delta / (float)expected) > 0.1f) {
-                    CLog.logAndDisplay(LogLevel.WARN,
-                            "Inaccurate runtime hint for %s, expected %s was %s",
-                            module.getId(),
-                            TimeUtil.formatElapsedTime(expected),
-                            TimeUtil.formatElapsedTime(duration));
-                }
-                if (checkers != null && !checkers.isEmpty()) {
-                    runPostModuleCheck(module.getName(), checkers, mDevice, listener);
-                }
-                module = null;
-            }
-        } catch (FileNotFoundException fnfe) {
-            throw new RuntimeException("Failed to initialize modules", fnfe);
-        }
-    }
-
-    /**
-     * Initialize module repo.
-     *
-     * @return A list of module definition
-     * @throws DeviceNotAvailableException
-     * @throws FileNotFoundException
-     */
-    protected LinkedList<IModuleDef> initializeModuleRepo()
-            throws DeviceNotAvailableException, FileNotFoundException {
-        // FIXME: Each shard will do a full initialization which is not optimal. Need a way
-        // to be more specific on what to initialize.
-        synchronized (mModuleRepo) {
-            if (!mModuleRepo.isInitialized()) {
-                setupFilters();
-                // Initialize the repository, {@link CompatibilityBuildHelper#getTestsDir} can
-                // throw a {@link FileNotFoundException}
-                mModuleRepo.initialize(mTotalShards, mShardIndex, mBuildHelper.getTestsDir(),
-                        getAbis(), mDeviceTokens, mTestArgs, mModuleArgs, mIncludeFilters,
-                        mExcludeFilters, mModuleMetadataIncludeFilter, mModuleMetadataExcludeFilter,
-                        mBuildHelper.getBuildInfo());
-
-                // Add the entire list of modules to the CompatibilityBuildHelper for reporting
-                mBuildHelper.setModuleIds(mModuleRepo.getModuleIds());
-
-                int count = UniqueModuleCountUtil.countUniqueModules(mModuleRepo.getTokenModules())
-                        + UniqueModuleCountUtil.countUniqueModules(
-                                  mModuleRepo.getNonTokenModules());
-                CLog.logAndDisplay(LogLevel.INFO, "========================================");
-                CLog.logAndDisplay(LogLevel.INFO, "Starting a run with %s unique modules.", count);
-                CLog.logAndDisplay(LogLevel.INFO, "========================================");
-            } else {
-                CLog.d("ModuleRepo already initialized.");
-            }
-            // Get the tests to run in this shard
-            return mModuleRepo.getModules(getDevice().getSerialNumber(), mShardIndex);
-        }
-    }
-
-    /**
-     * Gets the set of ABIs supported by both Compatibility and the device under test
-     *
-     * @return The set of ABIs to run the tests on
-     * @throws DeviceNotAvailableException
-     */
-    Set<IAbi> getAbis() throws DeviceNotAvailableException {
-        Set<IAbi> abis = new LinkedHashSet<>();
-        Set<String> archAbis = getAbisForBuildTargetArch();
-        if (mPrimaryAbiRun) {
-            if (mAbiName == null) {
-                // Get the primary from the device and make it the --abi to run.
-                mAbiName = mDevice.getProperty("ro.product.cpu.abi").trim();
-            } else {
-                CLog.d("Option --%s supersedes the option --%s, using abi: %s", ABI_OPTION,
-                        PRIMARY_ABI_RUN, mAbiName);
-            }
-        }
-        if (mAbiName != null) {
-            // A particular abi was requested, it still need to be supported by the build.
-            if ((!mSkipHostArchCheck && !archAbis.contains(mAbiName)) ||
-                    !AbiUtils.isAbiSupportedByCompatibility(mAbiName)) {
-                throw new IllegalArgumentException(String.format("Your CTS hasn't been built with "
-                        + "abi '%s' support, this CTS currently supports '%s'.",
-                        mAbiName, archAbis));
-            } else {
-                abis.add(new Abi(mAbiName, AbiUtils.getBitness(mAbiName)));
-                return abis;
-            }
-        } else {
-            // Run on all abi in common between the device and CTS.
-            List<String> deviceAbis = Arrays.asList(AbiFormatter.getSupportedAbis(mDevice, ""));
-            for (String abi : deviceAbis) {
-                if ((mSkipHostArchCheck || archAbis.contains(abi)) &&
-                        AbiUtils.isAbiSupportedByCompatibility(abi)) {
-                    abis.add(new Abi(abi, AbiUtils.getBitness(abi)));
-                } else {
-                    CLog.d("abi '%s' is supported by device but not by this CTS build (%s), tests "
-                            + "will not run against it.", abi, archAbis);
-                }
-            }
-            if (abis.isEmpty()) {
-                throw new IllegalArgumentException(String.format("None of the abi supported by this"
-                       + " CTS build ('%s') are supported by the device ('%s').",
-                       archAbis, deviceAbis));
-            }
-            return abis;
-        }
-    }
-
-    /**
-     * Return the abis supported by the Host build target architecture.
-     * Exposed for testing.
-     */
-    protected Set<String> getAbisForBuildTargetArch() {
-        return AbiUtils.getAbisForArch(TestSuiteInfo.getInstance().getTargetArchs().get(0));
-    }
-
-    /**
-     * Check that the system status checker specified by option are valid.
-     */
-    protected void checkSystemStatusBlackAndWhiteList() {
-        for (String checker : mSystemStatusCheckWhitelist) {
-            try {
-                Class.forName(checker);
-            } catch (ClassNotFoundException e) {
-                ConfigurationException ex = new ConfigurationException(
-                        String.format("--system-status-check-whitelist must contains valid class, "
-                                + "%s was not found", checker), e);
-                throw new RuntimeException(ex);
-            }
-        }
-        for (String checker : mSystemStatusCheckBlacklist) {
-            try {
-                Class.forName(checker);
-            } catch (ClassNotFoundException e) {
-                ConfigurationException ex = new ConfigurationException(
-                        String.format("--skip-system-status-check must contains valid class, "
-                                + "%s was not found", checker), e);
-                throw new RuntimeException(ex);
-            }
-        }
-    }
-
-    /**
-     * Resolve the inclusion and exclusion logic of system status checkers
-     *
-     * @param s the {@link ISystemStatusChecker} to perform filtering logic on
-     * @return True if the {@link ISystemStatusChecker} should be included, false otherwise.
-     */
-    private boolean shouldIncludeSystemStatusChecker(ISystemStatusChecker s) {
-        String clazz = s.getClass().getCanonicalName();
-        boolean shouldInclude = mSystemStatusCheckWhitelist.isEmpty()
-                || mSystemStatusCheckWhitelist.contains(clazz);
-        boolean shouldExclude = !mSystemStatusCheckBlacklist.isEmpty()
-                && mSystemStatusCheckBlacklist.contains(clazz);
-        return shouldInclude && !shouldExclude;
-    }
-
-    @VisibleForTesting
-    void runPreModuleCheck(String moduleName, List<ISystemStatusChecker> checkers,
-            ITestDevice device, ITestLogger logger) throws DeviceNotAvailableException {
-        CLog.i("Running system status checker before module execution: %s", moduleName);
-        List<String> failures = new ArrayList<>();
-        for (ISystemStatusChecker checker : checkers) {
-            StatusCheckerResult result = checker.preExecutionCheck(device);
-            if (!CheckStatus.SUCCESS.equals(result.getStatus())) {
-                failures.add(checker.getClass().getCanonicalName());
-                CLog.w("System status checker [%s] failed", checker.getClass().getCanonicalName());
-            }
-        }
-        if (!failures.isEmpty()) {
-            CLog.w("There are failed system status checkers: %s capturing a bugreport",
-                    failures.toString());
-            try (InputStreamSource bugSource = device.getBugreport()) {
-                logger.testLog(String.format("bugreport-checker-pre-module-%s", moduleName),
-                        LogDataType.BUGREPORT, bugSource);
-            }
-        }
-    }
-
-    @VisibleForTesting
-    void runPostModuleCheck(String moduleName, List<ISystemStatusChecker> checkers,
-            ITestDevice device, ITestLogger logger) throws DeviceNotAvailableException {
-        CLog.i("Running system status checker after module execution: %s", moduleName);
-        List<String> failures = new ArrayList<>();
-        for (ISystemStatusChecker checker : checkers) {
-            StatusCheckerResult result = checker.postExecutionCheck(device);
-            if (!CheckStatus.SUCCESS.equals(result.getStatus())) {
-                failures.add(checker.getClass().getCanonicalName());
-                CLog.w("System status checker [%s] failed", checker.getClass().getCanonicalName());
-            }
-        }
-        if (!failures.isEmpty()) {
-            CLog.w("There are failed system status checkers: %s capturing a bugreport",
-                    failures.toString());
-            try (InputStreamSource bugSource = device.getBugreport()) {
-                logger.testLog(String.format("bugreport-checker-post-module-%s", moduleName),
-                        LogDataType.BUGREPORT, bugSource);
-            }
-        }
-    }
-
-    /**
-     * Sets the retry command-line args to be stored in the BuildInfo and serialized into the
-     * report upon completion of the invocation.
-     */
-    void loadRetryCommandLineArgs(Integer sessionId) {
-        IInvocationResult result = null;
-        try {
-            result = ResultHandler.findResult(mBuildHelper.getResultsDir(), sessionId);
-        } catch (FileNotFoundException e) {
-            // We should never reach this point, because this method should only be called
-            // after setupFilters(), so result exists if we've gotten this far
-            throw new RuntimeException(e);
-        }
-        if (result == null) {
-            // Again, this should never happen
-            throw new IllegalArgumentException(String.format(
-                    "Could not find session with id %d", sessionId));
-        }
-        String retryCommandLineArgs = result.getCommandLineArgs();
-        if (retryCommandLineArgs != null) {
-            mBuildHelper.setRetryCommandLineArgs(retryCommandLineArgs);
-        }
-    }
-
-    /**
-     * Sets the include/exclude filters up based on if a module name was given or whether this is a
-     * retry run.
-     */
-    void setupFilters() throws DeviceNotAvailableException {
-        if (mRetrySessionId != null) {
-            // Load the invocation result
-            RetryFilterHelper helper = createRetryFilterHelper(mRetrySessionId);
-            helper.validateBuildFingerprint(mDevice);
-            helper.setCommandLineOptionsFor(this);
-            helper.populateRetryFilters();
-            mIncludeFilters = helper.getIncludeFilters();
-            mExcludeFilters = helper.getExcludeFilters();
-            helper.tearDown();
-        } else {
-            if (mSubPlan != null) {
-                ISubPlan subPlan = SubPlanHelper.getSubPlanByName(mBuildHelper, mSubPlan);
-                mIncludeFilters.addAll(subPlan.getIncludeFilters());
-                mExcludeFilters.addAll(subPlan.getExcludeFilters());
-            }
-            if (mModuleName != null) {
-                try {
-                    List<String> modules = ModuleRepo.getModuleNamesMatching(
-                            mBuildHelper.getTestsDir(), mModuleName);
-                    if (modules.size() == 0) {
-                        throw new IllegalArgumentException(
-                                String.format("No modules found matching %s", mModuleName));
-                    } else if (modules.size() > 1) {
-                        throw new IllegalArgumentException(String.format("Multiple modules found"
-                                + " matching %s:\n%s\nWhich one did you mean?\n",
-                                mModuleName, ArrayUtil.join("\n", modules)));
-                    } else {
-                        String module = modules.get(0);
-                        cleanFilters(mIncludeFilters, module);
-                        cleanFilters(mExcludeFilters, module);
-                        mIncludeFilters.add(
-                                new TestFilter(mAbiName, module, mTestName).toString());
-                    }
-                } catch (FileNotFoundException e) {
-                    throw new RuntimeException(e);
-                }
-            } else if (mTestName != null) {
-                throw new IllegalArgumentException(
-                        "Test name given without module name. Add --module <module-name>");
-            }
-        }
-    }
-
-    /* Creates a new {@link RetryFilterHelper} from attributes of this object. */
-    protected RetryFilterHelper createRetryFilterHelper(Integer retrySessionId) {
-        return new RetryFilterHelper(mBuildHelper, retrySessionId,
-                mSubPlan, mIncludeFilters, mExcludeFilters, mAbiName, mModuleName, mTestName,
-                mRetryType);
-    }
-
-    /* Helper method designed to remove filters in a list not applicable to the given module */
-    private static void cleanFilters(Set<String> filters, String module) {
-        Set<String> cleanedFilters = new HashSet<String>();
-        for (String filter : filters) {
-            if (module.equals(TestFilter.createFrom(filter).getName())) {
-                cleanedFilters.add(filter); // Module name matches, filter passes
-            }
-        }
-        filters.clear();
-        filters.addAll(cleanedFilters);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Collection<IRemoteTest> split() {
-        if (mShards <= 1) {
-            return null;
-        }
-        mIsLocalSharding = true;
-        List<IRemoteTest> shardQueue = new LinkedList<>();
-        for (int i = 0; i < mShards; i++) {
-            CompatibilityTest test = (CompatibilityTest) getTestShard(mShards, i);
-            test.mIsLocalSharding = true;
-            shardQueue.add(test);
-        }
-        sPreparedLatch = new CountDownLatch(shardQueue.size());
-        return shardQueue;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Collection<IRemoteTest> split(int shardCount) {
-        if (shardCount <= 1 || mIsSharded) {
-            return null;
-        }
-        mIsSharded = true;
-        List<IRemoteTest> shardQueue = new LinkedList<>();
-        for (int i = 0; i < shardCount; i++) {
-            CompatibilityTest test = (CompatibilityTest) getTestShard(shardCount, i);
-            shardQueue.add(test);
-            test.mIsSharded = true;
-        }
-        return shardQueue;
-    }
-
-    private IRemoteTest getTestShard(int shardCount, int shardIndex) {
-        CompatibilityTest test = new CompatibilityTest(shardCount, mModuleRepo, shardIndex);
-        OptionCopier.copyOptionsNoThrow(this, test);
-        // Set the shard count because the copy option on the previous line
-        // copies over the mShard value
-        test.mShards = 0;
-        return test;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setSystemStatusChecker(List<ISystemStatusChecker> systemCheckers) {
-        mListCheckers = systemCheckers;
-    }
-
-    @Override
-    public void setCollectTestsOnly(boolean collectTestsOnly) {
-        mCollectTestsOnly = collectTestsOnly;
-    }
-
-    /**
-     * Sets include-filters for the compatibility test
-     */
-    public void setIncludeFilter(Set<String> includeFilters) {
-        mIncludeFilters.addAll(includeFilters);
-    }
-
-    /**
-     * Sets exclude-filters for the compatibility test
-     */
-    public void setExcludeFilter(Set<String> excludeFilters) {
-        mExcludeFilters.addAll(excludeFilters);
-    }
-
-    @Override
-    public void setInvocationContext(IInvocationContext invocationContext) {
-        mInvocationContext = invocationContext;
-    }
-
-    /**
-     * @return the mSubPlan
-     */
-    protected String getSubPlan() {
-        return mSubPlan;
-    }
-
-    /**
-     * @return the mIncludeFilters
-     */
-    protected Set<String> getIncludeFilters() {
-        return mIncludeFilters;
-    }
-
-    /**
-     * @return the mExcludeFilters
-     */
-    protected Set<String> getExcludeFilters() {
-        return mExcludeFilters;
-    }
-
-    /**
-     * @return the mModuleName
-     */
-    protected String getModuleName() {
-        return mModuleName;
-    }
-
-    /**
-     * @return the mTestName
-     */
-    protected String getTestName() {
-        return mTestName;
-    }
-
-    /**
-     * @return the mModuleArgs
-     */
-    protected List<String> getModuleArgs() {
-        return mModuleArgs;
-    }
-
-    /**
-     * @return the mTestArgs
-     */
-    protected List<String> getTestArgs() {
-        return mTestArgs;
-    }
-
-    /**
-     * @return the mRetryType
-     */
-    protected RetryType getRetryType() {
-        return mRetryType;
-    }
-
-    /**
-     * @return the mAbiName
-     */
-    protected String getAbiName() {
-        return mAbiName;
-    }
-
-    /**
-     * @return the mDeviceTokens
-     */
-    protected List<String> getDeviceTokens() {
-        return mDeviceTokens;
-    }
-
-    /**
-     * @return the mModuleMetadataIncludeFilter
-     */
-    protected MultiMap<String, String> getModuleMetadataIncludeFilter() {
-        return mModuleMetadataIncludeFilter;
-    }
-
-    /**
-     * @return the mModuleMetadataExcludeFilter
-     */
-    protected MultiMap<String, String> getModuleMetadataExcludeFilter() {
-        return mModuleMetadataExcludeFilter;
-    }
-
-    /**
-     * @return the mTotalShards
-     */
-    protected int getTotalShards() {
-        return mTotalShards;
-    }
-
-    /**
-     * @return the mShardIndex
-     */
-    protected Integer getShardIndex() {
-        return mShardIndex;
-    }
-
-    /**
-     * @return the mBuildHelper
-     */
-    protected CompatibilityBuildHelper getBuildHelper() {
-        return mBuildHelper;
-    }
-
-    /**
-     * @return the mInvocationContext
-     */
-    protected IInvocationContext getInvocationContext() {
-        return mInvocationContext;
-    }
-
-    /**
-     * @return the mModuleRepo
-     */
-    protected IModuleRepo getModuleRepo() {
-        return mModuleRepo;
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/FailureListener.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/FailureListener.java
deleted file mode 100644
index d21ef81..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/FailureListener.java
+++ /dev/null
@@ -1,133 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.InputStreamSource;
-import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.result.ResultForwarder;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.util.RunUtil;
-
-public class FailureListener extends ResultForwarder {
-
-    private static final int DEFAULT_MAX_LOGCAT_BYTES = 500 * 1024; // 500K
-    /* Arbitrary upper limit for mMaxLogcatBytes, per b/30720850 */
-    public static final int LOGCAT_BYTE_LIMIT = 20 * 1024 * 1024; // 20 MB
-
-    private ITestDevice mDevice;
-    private boolean mBugReportOnFailure;
-    private boolean mLogcatOnFailure;
-    private boolean mScreenshotOnFailure;
-    private boolean mRebootOnFailure;
-    private int mMaxLogcatBytes;
-
-    public FailureListener(ITestInvocationListener listener, ITestDevice device,
-            boolean bugReportOnFailure, boolean logcatOnFailure, boolean screenshotOnFailure,
-            boolean rebootOnFailure, int maxLogcatBytes) {
-        super(listener);
-        mDevice = device;
-        mBugReportOnFailure = bugReportOnFailure;
-        mLogcatOnFailure = logcatOnFailure;
-        mScreenshotOnFailure = screenshotOnFailure;
-        mRebootOnFailure = rebootOnFailure;
-        if (maxLogcatBytes < 0 ) {
-            CLog.w("FailureListener could not set %s to '%d', using default value %d",
-                    CompatibilityTest.LOGCAT_ON_FAILURE_SIZE_OPTION, maxLogcatBytes,
-                    DEFAULT_MAX_LOGCAT_BYTES);
-            mMaxLogcatBytes = DEFAULT_MAX_LOGCAT_BYTES;
-        } else if (maxLogcatBytes > LOGCAT_BYTE_LIMIT) {
-            CLog.w("Value %d for %s exceeds limit %d, using limit value", maxLogcatBytes,
-                    CompatibilityTest.LOGCAT_ON_FAILURE_SIZE_OPTION, LOGCAT_BYTE_LIMIT);
-            mMaxLogcatBytes = LOGCAT_BYTE_LIMIT;
-        } else {
-            mMaxLogcatBytes = maxLogcatBytes;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void testFailed(TestDescription test, String trace) {
-        super.testFailed(test, trace);
-        CLog.i("FailureListener.testFailed %s %b %b %b",
-                test.toString(), mBugReportOnFailure, mLogcatOnFailure, mScreenshotOnFailure);
-        if (mScreenshotOnFailure) {
-            try {
-                try (InputStreamSource screenSource = mDevice.getScreenshot()) {
-                    super.testLog(String.format("%s-screenshot", test.toString()), LogDataType.PNG,
-                        screenSource);
-                }
-            } catch (DeviceNotAvailableException e) {
-                CLog.e(e);
-                CLog.e("Device %s became unavailable while capturing screenshot",
-                    mDevice.getSerialNumber());
-            }
-        }
-        if (mBugReportOnFailure) {
-            int api = -1;
-            try {
-                api = mDevice.getApiLevel();
-            } catch (DeviceNotAvailableException e) {
-                // ignore, it will be raised later.
-            }
-            if (api < 24) {
-                try (InputStreamSource fallback = mDevice.getBugreport()) {
-                    super.testLog(String.format("%s-bugreport", test.toString()),
-                            LogDataType.BUGREPORT, fallback);
-                }
-            } else {
-                try (InputStreamSource bugSource = mDevice.getBugreportz()) {
-                    if (bugSource != null) {
-                        super.testLog(String.format("%s-bugreportz", test.toString()),
-                                LogDataType.BUGREPORTZ, bugSource);
-                    } else {
-                        CLog.e("Failed to capture bugreport for %s", test.toString());
-                    }
-                }
-            }
-        }
-        if (mLogcatOnFailure) {
-            // sleep 2s to ensure test failure stack trace makes it into logcat capture
-            RunUtil.getDefault().sleep(2 * 1000);
-            try (InputStreamSource logSource = mDevice.getLogcat(mMaxLogcatBytes)) {
-                super.testLog(String.format("%s-logcat", test.toString()), LogDataType.LOGCAT,
-                        logSource);
-            }
-        }
-        if (mRebootOnFailure) {
-            try {
-                // Rebooting on all failures can hide legitimate issues and platform instabilities,
-                // therefore only allowed on "user-debug" and "eng" builds.
-                if ("user".equals(mDevice.getProperty("ro.build.type"))) {
-                    CLog.e("Reboot-on-failure should only be used during development," +
-                            " this is a\" user\" build device");
-                } else {
-                    mDevice.reboot();
-                }
-            } catch (DeviceNotAvailableException e) {
-                CLog.e(e);
-                CLog.e("Device %s became unavailable while rebooting",
-                        mDevice.getSerialNumber());
-            }
-        }
-    }
-
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleDef.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleDef.java
deleted file mode 100644
index 1424e12..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleDef.java
+++ /dev/null
@@ -1,102 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.config.ConfigurationDescriptor;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IDeviceTest;
-import com.android.tradefed.testtype.IInvocationContextReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IRuntimeHintProvider;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.suite.ModuleDefinition;
-
-import java.util.List;
-import java.util.Set;
-
-/**
- * Container for Compatibility test info.
- *
- * @deprecated This class is associated with {@link CompatibilityTest} which is deprecated
- */
-@Deprecated
-public interface IModuleDef
-        extends Comparable<IModuleDef>,
-                IBuildReceiver,
-                IDeviceTest,
-                IRemoteTest,
-                IRuntimeHintProvider,
-                ITestCollector,
-                IInvocationContextReceiver {
-
-    /** key names used for saving module info into {@link IInvocationContext} */
-    // This currently references ModuleDefinition so that there's only once source for String
-    // literals and making it easier to converge IModuleDef and ModuleDefinition later
-    public static String MODULE_NAME = ModuleDefinition.MODULE_NAME;
-    public static String MODULE_ABI = ModuleDefinition.MODULE_ABI;
-    public static String MODULE_ID = ModuleDefinition.MODULE_ID;
-
-    /**
-     * @return The name of this module.
-     */
-    String getName();
-
-    /**
-     * @return a {@link String} to uniquely identify this module.
-     */
-    String getId();
-
-    /**
-     * @return the abi of this test module.
-     */
-    IAbi getAbi();
-
-    /**
-     * @return the {@link Set} of tokens a device must have in order to run this module.
-     */
-    Set<String> getTokens();
-
-    /**
-     * @return the {@link IRemoteTest} that runs the tests.
-     */
-    IRemoteTest getTest();
-
-    /**
-     * Set a list of preparers to allow to run before or after a test. If this list is empty, then
-     * all configured preparers will run.
-     *
-     * @param preparerAllowlist list containing the simple name of the preparer to run.
-     */
-    void setPreparerAllowlist(Set<String> preparerAllowlist);
-
-    /**
-     * Pushes dynamic configuration, then runs the module's precondition checks and setup tasks.
-     * @param skipPrep whether preparation should be skipped
-     * @param preconditionArgs arguments to set on precondition preparers for the module, taking
-     * format arg-name:arg-value. If "arg-value" is unset, the value will default to "true".
-     * @return whether preparation succeeded.
-     */
-    boolean prepare(boolean skipPrep, List<String> preconditionArgs)
-            throws DeviceNotAvailableException;
-
-    /**
-     * Retrieves the {@link ConfigurationDescriptor} associated with module config
-     */
-    ConfigurationDescriptor getConfigurationDescriptor();
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleRepo.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleRepo.java
deleted file mode 100644
index 6989184..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/IModuleRepo.java
+++ /dev/null
@@ -1,80 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.util.MultiMap;
-
-import java.io.File;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Interface for accessing tests from the Compatibility repository.
- *
- * @deprecated This class is associated with {@link CompatibilityTest} which is deprecate
- */
-@Deprecated
-public interface IModuleRepo {
-
-    /**
-     * @return true if this repository has been initialized.
-     */
-    boolean isInitialized();
-
-    /**
-     * Initializes the repository.
-     */
-    void initialize(int shards, Integer shardIndex, File testsDir, Set<IAbi> abis,
-            List<String> deviceTokens, List<String> testArgs, List<String> moduleArgs,
-            Set<String> mIncludeFilters, Set<String> mExcludeFilters,
-            MultiMap<String, String> metadataIncludeFilters,
-            MultiMap<String, String> metadataExcludeFilters,
-            IBuildInfo buildInfo);
-
-    /**
-     * @return a {@link LinkedList} of all modules to run on the device referenced by the given
-     * serial.
-     */
-    LinkedList<IModuleDef> getModules(String serial, int shardIndex);
-
-    /**
-     * @return the number of shards this repo is initialized for.
-     */
-    int getNumberOfShards();
-
-    /**
-     * @return the modules which do not have token and have not been assigned to a device.
-     */
-    List<IModuleDef> getNonTokenModules();
-
-    /**
-     * @return the modules which have token and have not been assigned to a device.
-     */
-    List<IModuleDef> getTokenModules();
-
-    /**
-     * @return An array of all module ids in the repo.
-     */
-    String[] getModuleIds();
-
-    /**
-     * Clean up all internal references.
-     */
-    void tearDown();
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/JarHostTest.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/JarHostTest.java
deleted file mode 100644
index 91b767a..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/JarHostTest.java
+++ /dev/null
@@ -1,117 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.invoker.TestInformation;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.ResultForwarder;
-import com.android.tradefed.testtype.HostTest;
-import com.android.tradefed.util.proto.TfMetricProtoUtil;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Test runner for host-side JUnit tests.
- */
-public class JarHostTest extends HostTest {
-
-    /** {@inheritDoc} */
-    @Override
-    public void run(TestInformation testInfo, ITestInvocationListener listener)
-            throws DeviceNotAvailableException {
-        // Set test information otherwise it might fail to countTestCases.
-        setTestInformation(testInfo);
-        int numTests = 0;
-        RuntimeException bufferedException = null;
-        try {
-            numTests = countTestCases();
-        } catch (RuntimeException e) {
-            bufferedException = e;
-        }
-        long startTime = System.currentTimeMillis();
-        listener.testRunStarted(getClass().getName(), numTests);
-        HostTestListener hostListener = new HostTestListener(listener);
-        try {
-            if (bufferedException != null) {
-                throw bufferedException;
-            }
-            super.run(testInfo, hostListener);
-        } finally {
-            HashMap<String, Metric> metrics = hostListener.getNewMetrics();
-            metrics.putAll(TfMetricProtoUtil.upgradeConvert(hostListener.getMetrics()));
-            listener.testRunEnded(System.currentTimeMillis() - startTime, metrics);
-        }
-    }
-
-    /**
-     * Wrapper listener that forwards all events except testRunStarted() and testRunEnded() to
-     * the embedded listener. Each test class in the jar will invoke these events, which
-     * HostTestListener withholds from listeners for console logging and result reporting.
-     */
-    public class HostTestListener extends ResultForwarder {
-
-        private Map<String, String> mCollectedMetrics = new HashMap<>();
-        private HashMap<String, Metric> mCollectedNewMetrics = new HashMap<>();
-
-        public HostTestListener(ITestInvocationListener listener) {
-            super(listener);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void testRunStarted(String name, int numTests) {
-            CLog.d("HostTestListener.testRunStarted(%s, %d)", name, numTests);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void testRunEnded(long elapsedTime, Map<String, String> metrics) {
-            CLog.d("HostTestListener.testRunEnded(%d, %s)", elapsedTime, metrics.toString());
-            mCollectedMetrics.putAll(metrics);
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void testRunEnded(long elapsedTime, HashMap<String, Metric> metrics) {
-            CLog.d("HostTestListener.testRunEnded(%d, %s)", elapsedTime, metrics.toString());
-            mCollectedNewMetrics.putAll(metrics);
-        }
-
-        /**
-         * Returns all the metrics reported by the tests
-         */
-        Map<String, String> getMetrics() {
-            return mCollectedMetrics;
-        }
-
-        /**
-         * Returns all the proto metrics reported by the tests
-         */
-        HashMap<String, Metric> getNewMetrics() {
-            return mCollectedNewMetrics;
-        }
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleDef.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleDef.java
deleted file mode 100644
index 9e4fde7..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleDef.java
+++ /dev/null
@@ -1,432 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.compatibility.common.tradefed.result.IModuleListener;
-import com.android.compatibility.common.tradefed.result.ModuleListener;
-import com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher;
-import com.android.compatibility.common.tradefed.targetprep.PreconditionPreparer;
-import com.android.compatibility.common.tradefed.targetprep.TokenRequirement;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.ConfigurationDescriptor;
-import com.android.tradefed.config.ConfigurationException;
-import com.android.tradefed.config.OptionSetter;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.ResultForwarder;
-import com.android.tradefed.targetprep.BuildError;
-import com.android.tradefed.targetprep.ITargetCleaner;
-import com.android.tradefed.targetprep.ITargetPreparer;
-import com.android.tradefed.targetprep.TargetSetupError;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IDeviceTest;
-import com.android.tradefed.testtype.IInvocationContextReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IRuntimeHintProvider;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.ITestFilterReceiver;
-import com.android.tradefed.util.AbiUtils;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Container for Compatibility test module info.
- *
- * @deprecated This class is associated with {@link CompatibilityTest} which is deprecate
- */
-@Deprecated
-public class ModuleDef implements IModuleDef {
-
-    private final String mId;
-    private final String mName;
-    private final IAbi mAbi;
-    private final Set<String> mTokens = new HashSet<>();
-    private IRemoteTest mTest = null;
-    private List<ITargetPreparer> mDynamicConfigPreparers = new ArrayList<>();
-    private List<ITargetPreparer> mPreconditions = new ArrayList<>();
-    private List<ITargetPreparer> mPreparers = new ArrayList<>();
-    private List<ITargetCleaner> mCleaners = new ArrayList<>();
-    private IBuildInfo mBuild;
-    private ITestDevice mDevice;
-    private Set<String> mPreparerAllowlist = new HashSet<>();
-    private ConfigurationDescriptor mConfigurationDescriptor;
-    private IInvocationContext mContext;
-
-    public ModuleDef(String name, IAbi abi, IRemoteTest test,
-            List<ITargetPreparer> preparers, ConfigurationDescriptor configurationDescriptor) {
-        mId = AbiUtils.createId(abi.getName(), name);
-        mName = name;
-        mAbi = abi;
-        mTest = test;
-        mConfigurationDescriptor = configurationDescriptor;
-        initializePrepareLists(preparers);
-    }
-
-    /**
-     * Sort preparers into different lists according to their types
-     *
-     * @param preparers target preparers
-     * @throws IllegalArgumentException
-     */
-    protected void initializePrepareLists(List<ITargetPreparer> preparers)
-            throws IllegalArgumentException {
-        boolean hasAbiReceiver = false;
-        for (ITargetPreparer preparer : preparers) {
-            if (preparer instanceof IAbiReceiver) {
-                hasAbiReceiver = true;
-            }
-            // Separate preconditions and dynamicconfigpushers from other target preparers.
-            if (preparer instanceof PreconditionPreparer) {
-                mPreconditions.add(preparer);
-            } else if (preparer instanceof DynamicConfigPusher) {
-                mDynamicConfigPreparers.add(preparer);
-            } else if (preparer instanceof TokenRequirement) {
-                mTokens.addAll(((TokenRequirement) preparer).getTokens());
-            } else {
-                mPreparers.add(preparer);
-            }
-            if (preparer instanceof ITargetCleaner) {
-                mCleaners.add((ITargetCleaner) preparer);
-            }
-        }
-        // Reverse cleaner order
-        Collections.reverse(mCleaners);
-
-        checkRequiredInterfaces(hasAbiReceiver);
-    }
-
-    /**
-     * Check whether required interfaces are implemented.
-     *
-     * @param hasAbiReceiver whether at lease one of the preparers is AbiReceiver
-     * @throws IllegalArgumentException
-     */
-    protected void checkRequiredInterfaces(boolean hasAbiReceiver) throws IllegalArgumentException {
-        // Required interfaces:
-        if (!hasAbiReceiver && !(mTest instanceof IAbiReceiver)) {
-            throw new IllegalArgumentException(mTest + "does not implement IAbiReceiver"
-                    + " - for multi-abi testing (64bit)");
-        } else if (!(mTest instanceof IRuntimeHintProvider)) {
-            throw new IllegalArgumentException(mTest + " does not implement IRuntimeHintProvider"
-                    + " - to provide estimates of test invocation time");
-        } else if (!(mTest instanceof ITestCollector)) {
-            throw new IllegalArgumentException(mTest + " does not implement ITestCollector"
-                    + " - for test list collection");
-        } else if (!(mTest instanceof ITestFilterReceiver)) {
-            throw new IllegalArgumentException(mTest + " does not implement ITestFilterReceiver"
-                    + " - to allow tests to be filtered");
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String toString() {
-        return mId;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getId() {
-        return mId;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getName() {
-        return mName;
-    }
-
-    /** @return the getPreparerAllowlist */
-    protected Set<String> getPreparerAllowlist() {
-        return mPreparerAllowlist;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public IAbi getAbi() {
-        return mAbi;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<String> getTokens() {
-        return mTokens;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public long getRuntimeHint() {
-        if (mTest instanceof IRuntimeHintProvider) {
-            return ((IRuntimeHintProvider) mTest).getRuntimeHint();
-        }
-        return TimeUnit.MINUTES.toMillis(1); // Default 1 minute.
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public IRemoteTest getTest() {
-        return mTest;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public void setPreparerAllowlist(Set<String> preparerAlowlist) {
-        mPreparerAllowlist.addAll(preparerAlowlist);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int compareTo(IModuleDef moduleDef) {
-        return getName().compareTo(moduleDef.getName());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBuild(IBuildInfo build) {
-        mBuild = build;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ITestDevice getDevice() {
-        return mDevice;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setDevice(ITestDevice device) {
-        mDevice = device;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        CLog.d("Running module %s", toString());
-        runPreparerSetups();
-
-        CLog.d("Test: %s", mTest.getClass().getSimpleName());
-        prepareTestClass();
-
-        IModuleListener moduleListener = new ModuleListener(this, listener);
-        // Guarantee events testRunStarted and testRunEnded in case underlying test runner does not
-        ModuleFinisher moduleFinisher = new ModuleFinisher(moduleListener);
-        mTest.run(moduleFinisher);
-        moduleFinisher.finish();
-
-        // Tear down
-        runPreparerTeardowns();
-    }
-
-    /**
-     * Run preparers' teardown functions.
-     */
-    protected void runPreparerTeardowns() throws DeviceNotAvailableException {
-        for (ITargetCleaner cleaner : mCleaners) {
-            CLog.d("Cleaner: %s", cleaner.getClass().getSimpleName());
-            cleaner.tearDown(mDevice, mBuild, null);
-        }
-    }
-
-    /**
-     * Run preparers' setup functions.
-     *
-     * @throws DeviceNotAvailableException
-     */
-    protected void runPreparerSetups() throws DeviceNotAvailableException {
-        // Run DynamicConfigPusher setup once more, in case cleaner has previously
-        // removed dynamic config file from the target (see b/32877809)
-        for (ITargetPreparer preparer : mDynamicConfigPreparers) {
-            runPreparerSetup(preparer);
-        }
-        // Setup
-        for (ITargetPreparer preparer : mPreparers) {
-            runPreparerSetup(preparer);
-        }
-    }
-
-    /**
-     * Set test classes attributes according to their interfaces.
-     */
-    protected void prepareTestClass() {
-        if (mTest instanceof IAbiReceiver) {
-            ((IAbiReceiver) mTest).setAbi(mAbi);
-        }
-        if (mTest instanceof IBuildReceiver) {
-            ((IBuildReceiver) mTest).setBuild(mBuild);
-        }
-        if (mTest instanceof IDeviceTest) {
-            ((IDeviceTest) mTest).setDevice(mDevice);
-        }
-        if (mTest instanceof IInvocationContextReceiver) {
-            ((IInvocationContextReceiver) mTest).setInvocationContext(mContext);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean prepare(boolean skipPrep, List<String> preconditionArgs)
-            throws DeviceNotAvailableException {
-        for (ITargetPreparer preparer : mDynamicConfigPreparers) {
-            runPreparerSetup(preparer);
-        }
-        for (ITargetPreparer preparer : mPreconditions) {
-            setOption(preparer, CompatibilityTest.SKIP_PRECONDITIONS_OPTION,
-                    Boolean.toString(skipPrep));
-            for (String preconditionArg : preconditionArgs) {
-                setOption(preparer, CompatibilityTest.PRECONDITION_ARG_OPTION, preconditionArg);
-            }
-            try {
-                runPreparerSetup(preparer);
-            } catch (RuntimeException e) {
-                CLog.e("Precondition class %s failed", preparer.getClass().getCanonicalName());
-                return false;
-            }
-        }
-        return true;
-    }
-
-    private void runPreparerSetup(ITargetPreparer preparer) throws DeviceNotAvailableException {
-        String preparerName = preparer.getClass().getCanonicalName();
-        if (!mPreparerAllowlist.isEmpty() && !mPreparerAllowlist.contains(preparerName)) {
-            CLog.d(
-                    "Skipping Preparer: %s since it is not in the allowList %s",
-                    preparerName, mPreparerAllowlist);
-            return;
-        }
-        CLog.d("Preparer: %s", preparer.getClass().getSimpleName());
-        if (preparer instanceof IAbiReceiver) {
-            ((IAbiReceiver) preparer).setAbi(mAbi);
-        }
-        try {
-            preparer.setUp(mDevice, mBuild);
-        } catch (BuildError e) {
-            // This should only happen for flashing new build
-            CLog.e("Unexpected BuildError from preparer: %s",
-                    preparer.getClass().getCanonicalName());
-            throw new RuntimeException(e);
-        } catch (TargetSetupError e) {
-            // log preparer class then rethrow & let caller handle
-            CLog.e("TargetSetupError in preparer: %s",
-                    preparer.getClass().getCanonicalName());
-            throw new RuntimeException(e);
-        }
-    }
-
-    private void setOption(Object target, String option, String value) {
-        try {
-            OptionSetter setter = new OptionSetter(target);
-            setter.setOptionValue(option, value);
-        } catch (ConfigurationException e) {
-            CLog.e(e);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setCollectTestsOnly(boolean collectTestsOnly) {
-        ((ITestCollector) mTest).setCollectTestsOnly(collectTestsOnly);
-    }
-
-    /*
-     * ResultForwarder that tracks whether method testRunStarted() has been called for its
-     * listener. If not, invoking finish() will call testRunStarted with 0 tests for this module,
-     * as well as testRunEnded with 0 ms elapsed.
-     */
-    private class ModuleFinisher extends ResultForwarder {
-
-        private boolean mFinished;
-        private ITestInvocationListener mListener;
-
-        public ModuleFinisher(ITestInvocationListener listener) {
-            super(listener);
-            mListener = listener;
-            mFinished = false;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public void testRunStarted(String name, int numTests) {
-            mListener.testRunStarted(name, numTests);
-            mFinished = true;
-        }
-
-        public void finish() {
-            if (!mFinished) {
-                mListener.testRunStarted(mId, 0);
-                mListener.testRunEnded(0, new HashMap<String, Metric>());
-            }
-        }
-    }
-
-    @Override
-    public ConfigurationDescriptor getConfigurationDescriptor() {
-        return mConfigurationDescriptor;
-    }
-
-    /**
-     * @return the {@link IInvocationContext} for the module
-     */
-    protected IInvocationContext getInvocationContext() {
-        return mContext;
-    }
-
-    @Override
-    public void setInvocationContext(IInvocationContext invocationContext) {
-        mContext = invocationContext;
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java
deleted file mode 100644
index 6884a5f..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/testtype/ModuleRepo.java
+++ /dev/null
@@ -1,668 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.compatibility.common.tradefed.result.TestRunHandler;
-import com.android.compatibility.common.tradefed.util.LinearPartition;
-import com.android.compatibility.common.tradefed.util.UniqueModuleCountUtil;
-import com.android.compatibility.common.util.TestFilter;
-import com.android.ddmlib.Log.LogLevel;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.ConfigurationException;
-import com.android.tradefed.config.ConfigurationFactory;
-import com.android.tradefed.config.IConfiguration;
-import com.android.tradefed.config.IConfigurationFactory;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.ITestFileFilterReceiver;
-import com.android.tradefed.testtype.ITestFilterReceiver;
-import com.android.tradefed.util.AbiUtils;
-import com.android.tradefed.util.FileUtil;
-import com.android.tradefed.util.MultiMap;
-import com.android.tradefed.util.TimeUtil;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.File;
-import java.io.FilenameFilter;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Comparator;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-/**
- * Retrieves Compatibility test module definitions from the repository.
- *
- * @deprecated This class is associated with {@link CompatibilityTest} which is deprecate
- */
-@Deprecated
-public class ModuleRepo implements IModuleRepo {
-
-    private static final String CONFIG_EXT = ".config";
-    private static final Map<String, Integer> ENDING_MODULES = new HashMap<>();
-    static {
-      // b/62732298 put testFullDisk in the end to accommodate CTSMediaStressTest temporally
-      ENDING_MODULES.put("CtsAppSecurityHostTestCases", 1);
-      ENDING_MODULES.put("CtsMonkeyTestCases", 2);
-    }
-    // Synchronization objects for Token Modules.
-    private int mInitCount = 0;
-    private Set<IModuleDef> mTokenModuleScheduled;
-    private static Object lock = new Object();
-
-    private int mTotalShards;
-    private Integer mShardIndex;
-
-    private Map<String, Set<String>> mDeviceTokens = new HashMap<>();
-    private Map<String, Map<String, List<String>>> mTestArgs = new HashMap<>();
-    private Map<String, Map<String, List<String>>> mModuleArgs = new HashMap<>();
-    private boolean mIncludeAll;
-    private Map<String, List<TestFilter>> mIncludeFilters = new HashMap<>();
-    private Map<String, List<TestFilter>> mExcludeFilters = new HashMap<>();
-    private IConfigurationFactory mConfigFactory = ConfigurationFactory.getInstance();
-
-    private volatile boolean mInitialized = false;
-
-    // Holds all the tests with tokens waiting to be run. Meaning the DUT must have a specific token.
-    private List<IModuleDef> mTokenModules = new ArrayList<>();
-    private List<IModuleDef> mNonTokenModules = new ArrayList<>();
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getNumberOfShards() {
-        return mTotalShards;
-    }
-
-    /**
-     * Returns the device tokens of this module repo. Exposed for testing.
-     */
-    protected Map<String, Set<String>> getDeviceTokens() {
-        return mDeviceTokens;
-    }
-
-    /**
-     * A {@link FilenameFilter} to find all modules in a directory who match the given pattern.
-     */
-    public static class NameFilter implements FilenameFilter {
-
-        private String mPattern;
-
-        public NameFilter(String pattern) {
-            mPattern = pattern;
-        }
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean accept(File dir, String name) {
-            return name.contains(mPattern) && name.endsWith(CONFIG_EXT);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<IModuleDef> getNonTokenModules() {
-        return mNonTokenModules;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<IModuleDef> getTokenModules() {
-        return mTokenModules;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String[] getModuleIds() {
-        Set<String> moduleIdSet = new HashSet<>();
-        for (IModuleDef moduleDef : mNonTokenModules) {
-            moduleIdSet.add(moduleDef.getId());
-        }
-        for (IModuleDef moduleDef : mTokenModules) {
-            moduleIdSet.add(moduleDef.getId());
-        }
-        return moduleIdSet.toArray(new String[moduleIdSet.size()]);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isInitialized() {
-        return mInitialized;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void initialize(int totalShards, Integer shardIndex, File testsDir, Set<IAbi> abis,
-            List<String> deviceTokens, List<String> testArgs, List<String> moduleArgs,
-            Set<String> includeFilters, Set<String> excludeFilters,
-            MultiMap<String, String> metadataIncludeFilters,
-            MultiMap<String, String> metadataExcludeFilters,
-            IBuildInfo buildInfo) {
-        CLog.d("Initializing ModuleRepo\nShards:%d\nTests Dir:%s\nABIs:%s\nDevice Tokens:%s\n" +
-                "Test Args:%s\nModule Args:%s\nIncludes:%s\nExcludes:%s",
-                totalShards, testsDir.getAbsolutePath(), abis, deviceTokens, testArgs, moduleArgs,
-                includeFilters, excludeFilters);
-        mInitialized = true;
-        mTotalShards = totalShards;
-        mShardIndex = shardIndex;
-        synchronized (lock) {
-            if (mTokenModuleScheduled == null) {
-                mTokenModuleScheduled = new HashSet<>();
-            }
-        }
-
-        for (String line : deviceTokens) {
-            String[] parts = line.split(":");
-            if (parts.length == 2) {
-                String key = parts[0];
-                String value = parts[1];
-                Set<String> list = mDeviceTokens.get(key);
-                if (list == null) {
-                    list = new HashSet<>();
-                    mDeviceTokens.put(key, list);
-                }
-                list.add(value);
-            } else {
-                throw new IllegalArgumentException(
-                        String.format("Could not parse device token: %s", line));
-            }
-        }
-        putArgs(testArgs, mTestArgs);
-        putArgs(moduleArgs, mModuleArgs);
-        mIncludeAll = includeFilters.isEmpty();
-        // Include all the inclusions
-        addFilters(includeFilters, mIncludeFilters, abis);
-        // Exclude all the exclusions
-        addFilters(excludeFilters, mExcludeFilters, abis);
-
-        File[] configFiles = testsDir.listFiles(new ConfigFilter());
-        if (configFiles.length == 0) {
-            throw new IllegalArgumentException(
-                    String.format("No config files found in %s", testsDir.getAbsolutePath()));
-        }
-        Map<String, Integer> shardedTestCounts = new HashMap<>();
-        for (File configFile : configFiles) {
-            final String name = configFile.getName().replace(CONFIG_EXT, "");
-            final String[] pathArg = new String[] { configFile.getAbsolutePath() };
-            try {
-                // Invokes parser to process the test module config file
-                // Need to generate a different config for each ABI as we cannot guarantee the
-                // configs are idempotent. This however means we parse the same file multiple times
-                for (IAbi abi : abis) {
-                    String id = AbiUtils.createId(abi.getName(), name);
-                    if (!shouldRunModule(id)) {
-                        // If the module should not run tests based on the state of filters,
-                        // skip this name/abi combination.
-                        continue;
-                    }
-
-                    IConfiguration config = mConfigFactory.createConfigurationFromArgs(pathArg);
-                    if (!filterByConfigMetadata(config,
-                            metadataIncludeFilters, metadataExcludeFilters)) {
-                        // if the module config did not pass the metadata filters, it's excluded
-                        // from execution
-                        continue;
-                    }
-                    Map<String, List<String>> args = new HashMap<>();
-                    if (mModuleArgs.containsKey(name)) {
-                        args.putAll(mModuleArgs.get(name));
-                    }
-                    if (mModuleArgs.containsKey(id)) {
-                        args.putAll(mModuleArgs.get(id));
-                    }
-                    injectOptionsToConfig(args, config);
-
-                    List<IRemoteTest> tests = config.getTests();
-                    for (IRemoteTest test : tests) {
-                        prepareTestClass(name, abi, config, test);
-                    }
-                    List<IRemoteTest> shardedTests = tests;
-                    if (shardedTests.size() > 1) {
-                        shardedTestCounts.put(id, shardedTests.size());
-                    }
-                    for (IRemoteTest test : shardedTests) {
-                        addModuleDef(name, abi, test, pathArg);
-                    }
-                }
-            } catch (ConfigurationException e) {
-                throw new RuntimeException(String.format("error parsing config file: %s",
-                        configFile.getName()), e);
-            }
-        }
-        mExcludeFilters.clear();
-        TestRunHandler.setTestRuns(new CompatibilityBuildHelper(buildInfo), shardedTestCounts);
-    }
-
-    /**
-     * Prepare to run test classes.
-     *
-     * @param name module name
-     * @param abi IAbi object that contains abi information
-     * @param config IConfiguration object created from config file
-     * @param test test class
-     * @throws ConfigurationException
-     */
-    protected void prepareTestClass(final String name, IAbi abi, IConfiguration config,
-            IRemoteTest test) throws ConfigurationException {
-        String className = test.getClass().getName();
-        Map<String, List<String>> testArgsMap = new HashMap<>();
-        if (mTestArgs.containsKey(className)) {
-            testArgsMap.putAll(mTestArgs.get(className));
-        }
-        injectOptionsToConfig(testArgsMap, config);
-        addFiltersToTest(test, abi, name);
-    }
-
-    /**
-     * Helper to inject options to a config.
-     */
-    @VisibleForTesting
-    void injectOptionsToConfig(Map<String, List<String>> optionMap, IConfiguration config)
-            throws ConfigurationException{
-        for (Entry<String, List<String>> entry : optionMap.entrySet()) {
-            for (String entryValue : entry.getValue()) {
-                String entryName = entry.getKey();
-                if (entryValue.contains(":=")) {
-                    // entryValue is key-value pair
-                    String key = entryValue.substring(0, entryValue.indexOf(":="));
-                    String value = entryValue.substring(entryValue.indexOf(":=") + 2);
-                    config.injectOptionValue(entryName, key, value);
-                } else {
-                    // entryValue is just the argument value
-                    config.injectOptionValue(entryName, entryValue);
-                }
-            }
-        }
-    }
-
-    private void addFilters(Set<String> stringFilters,
-            Map<String, List<TestFilter>> filters, Set<IAbi> abis) {
-        for (String filterString : stringFilters) {
-            TestFilter filter = TestFilter.createFrom(filterString);
-            String abi = filter.getAbi();
-            if (abi == null) {
-                for (IAbi a : abis) {
-                    addFilter(a.getName(), filter, filters);
-                }
-            } else {
-                addFilter(abi, filter, filters);
-            }
-        }
-    }
-
-    private void addFilter(String abi, TestFilter filter,
-            Map<String, List<TestFilter>> filters) {
-        getFilter(filters, AbiUtils.createId(abi, filter.getName())).add(filter);
-    }
-
-    private List<TestFilter> getFilter(Map<String, List<TestFilter>> filters, String id) {
-        List<TestFilter> fs = filters.get(id);
-        if (fs == null) {
-            fs = new ArrayList<>();
-            filters.put(id, fs);
-        }
-        return fs;
-    }
-
-    protected void addModuleDef(String name, IAbi abi, IRemoteTest test, String[] configPaths)
-            throws ConfigurationException {
-        // Invokes parser to process the test module config file
-        IConfiguration config = mConfigFactory.createConfigurationFromArgs(configPaths);
-        addModuleDef(new ModuleDef(name, abi, test, config.getTargetPreparers(),
-                config.getConfigurationDescription()));
-    }
-
-    protected void addModuleDef(IModuleDef moduleDef) {
-        Set<String> tokens = moduleDef.getTokens();
-        if (tokens != null && !tokens.isEmpty()) {
-            mTokenModules.add(moduleDef);
-        } else {
-            mNonTokenModules.add(moduleDef);
-        }
-    }
-
-    private void addFiltersToTest(IRemoteTest test, IAbi abi, String name) {
-        String moduleId = AbiUtils.createId(abi.getName(), name);
-        if (!(test instanceof ITestFilterReceiver)) {
-            throw new IllegalArgumentException(String.format(
-                    "Test in module %s must implement ITestFilterReceiver.", moduleId));
-        }
-        List<TestFilter> mdIncludes = getFilter(mIncludeFilters, moduleId);
-        List<TestFilter> mdExcludes = getFilter(mExcludeFilters, moduleId);
-        if (!mdIncludes.isEmpty()) {
-            addTestIncludes((ITestFilterReceiver) test, mdIncludes, name);
-        }
-        if (!mdExcludes.isEmpty()) {
-            addTestExcludes((ITestFilterReceiver) test, mdExcludes, name);
-        }
-    }
-
-    @VisibleForTesting
-    protected boolean filterByConfigMetadata(IConfiguration config,
-            MultiMap<String, String> include, MultiMap<String, String> exclude) {
-        MultiMap<String, String> metadata = config.getConfigurationDescription().getAllMetaData();
-        boolean shouldInclude = false;
-        for (String key : include.keySet()) {
-            Set<String> filters = new HashSet<>(include.get(key));
-            if (metadata.containsKey(key)) {
-                filters.retainAll(metadata.get(key));
-                if (!filters.isEmpty()) {
-                    // inclusion filter is not empty and there's at least one matching inclusion
-                    // rule so there's no need to match other inclusion rules
-                    shouldInclude = true;
-                    break;
-                }
-            }
-        }
-        if (!include.isEmpty() && !shouldInclude) {
-            // if inclusion filter is not empty and we didn't find a match, the module will not be
-            // included
-            return false;
-        }
-        // Now evaluate exclusion rules, this ordering also means that exclusion rules may override
-        // inclusion rules: a config already matched for inclusion may still be excluded if matching
-        // rules exist
-        for (String key : exclude.keySet()) {
-            Set<String> filters = new HashSet<>(exclude.get(key));
-            if (metadata.containsKey(key)) {
-                filters.retainAll(metadata.get(key));
-                if (!filters.isEmpty()) {
-                    // we found at least one matching exclusion rules, so we are excluding this
-                    // this module
-                    return false;
-                }
-            }
-        }
-        // we've matched at least one inclusion rule (if there's any) AND we didn't match any of the
-        // exclusion rules (if there's any)
-        return true;
-    }
-
-    private boolean shouldRunModule(String moduleId) {
-        List<TestFilter> mdIncludes = getFilter(mIncludeFilters, moduleId);
-        List<TestFilter> mdExcludes = getFilter(mExcludeFilters, moduleId);
-        // if including all modules or includes exist for this module, and there are not excludes
-        // for the entire module, this module should be run.
-        return (mIncludeAll || !mdIncludes.isEmpty()) && !containsModuleExclude(mdExcludes);
-    }
-
-    private void addTestIncludes(ITestFilterReceiver test, List<TestFilter> includes,
-            String name) {
-        if (test instanceof ITestFileFilterReceiver) {
-            File includeFile = createFilterFile(name, ".include", includes);
-            ((ITestFileFilterReceiver)test).setIncludeTestFile(includeFile);
-        } else {
-            // add test includes one at a time
-            for (TestFilter include : includes) {
-                String filterTestName = include.getTest();
-                if (filterTestName != null) {
-                    test.addIncludeFilter(filterTestName);
-                }
-            }
-        }
-    }
-
-    private void addTestExcludes(ITestFilterReceiver test, List<TestFilter> excludes,
-            String name) {
-        if (test instanceof ITestFileFilterReceiver) {
-            File excludeFile = createFilterFile(name, ".exclude", excludes);
-            ((ITestFileFilterReceiver)test).setExcludeTestFile(excludeFile);
-        } else {
-            // add test excludes one at a time
-            for (TestFilter exclude : excludes) {
-                test.addExcludeFilter(exclude.getTest());
-            }
-        }
-    }
-
-    private File createFilterFile(String prefix, String suffix, List<TestFilter> filters) {
-        File filterFile = null;
-        PrintWriter out = null;
-        try {
-            filterFile = FileUtil.createTempFile(prefix, suffix);
-            out = new PrintWriter(filterFile);
-            for (TestFilter filter : filters) {
-                String filterTest = filter.getTest();
-                if (filterTest != null) {
-                    out.println(filterTest);
-                }
-            }
-            out.flush();
-        } catch (IOException e) {
-            throw new RuntimeException("Failed to create filter file");
-        } finally {
-            if (out != null) {
-                out.close();
-            }
-        }
-        filterFile.deleteOnExit();
-        return filterFile;
-    }
-
-    /*
-     * Returns true iff one or more test filters in excludes apply to the entire module.
-     */
-    private boolean containsModuleExclude(Collection<TestFilter> excludes) {
-        for (TestFilter exclude : excludes) {
-            if (exclude.getTest() == null) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * A {@link FilenameFilter} to find all the config files in a directory.
-     */
-    public static class ConfigFilter implements FilenameFilter {
-
-        /**
-         * {@inheritDoc}
-         */
-        @Override
-        public boolean accept(File dir, String name) {
-            CLog.d("%s/%s", dir.getAbsolutePath(), name);
-            return name.endsWith(CONFIG_EXT);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public LinkedList<IModuleDef> getModules(String serial, int shardIndex) {
-        Collections.sort(mNonTokenModules, new ExecutionOrderComparator());
-        List<IModuleDef> modules = getShard(mNonTokenModules, shardIndex, mTotalShards);
-        if (modules == null) {
-            modules = new LinkedList<IModuleDef>();
-        }
-        long estimatedTime = 0;
-        for (IModuleDef def : modules) {
-            estimatedTime += def.getRuntimeHint();
-        }
-
-        // FIXME: Token Modules are the only last part that is not deterministic.
-        synchronized (lock) {
-            // Get tokens from the device
-            Set<String> tokens = mDeviceTokens.get(serial);
-            if (tokens != null && !tokens.isEmpty()) {
-                // if it matches any of the token modules, add them
-                for (IModuleDef def : mTokenModules) {
-                    if (!mTokenModuleScheduled.contains(def)) {
-                        if (tokens.equals(def.getTokens())) {
-                            modules.add(def);
-                            CLog.d("Adding %s to scheduled token", def);
-                            mTokenModuleScheduled.add(def);
-                        }
-                    }
-                }
-            }
-            // the last shard going through may add everything remaining.
-            if (mInitCount == (mTotalShards - 1) &&
-                    mTokenModuleScheduled.size() != mTokenModules.size()) {
-                mTokenModules.removeAll(mTokenModuleScheduled);
-                if (mTotalShards != 1) {
-                    // Only print the warnings if we are sharding.
-                    CLog.e("Could not find any token for %s. Adding to last shard.", mTokenModules);
-                }
-                modules.addAll(mTokenModules);
-            }
-            mInitCount++;
-        }
-        Collections.sort(modules, new ExecutionOrderComparator());
-        int uniqueCount = UniqueModuleCountUtil.countUniqueModules(modules);
-        CLog.logAndDisplay(LogLevel.INFO, "%s running %s test sub-modules, expected to complete "
-                + "in %s.", serial, uniqueCount, TimeUtil.formatElapsedTime(estimatedTime));
-        CLog.d("module list for this shard: %s", modules);
-        LinkedList<IModuleDef> tests = new LinkedList<>();
-        tests.addAll(modules);
-        return tests;
-    }
-
-    /**
-     * Helper to linearly split the list into shards with balanced runtimeHint.
-     * Exposed for testing.
-     */
-    protected List<IModuleDef> getShard(List<IModuleDef> fullList, int shardIndex, int totalShard) {
-        List<List<IModuleDef>> res = LinearPartition.split(fullList, totalShard);
-        if (res.isEmpty()) {
-            return null;
-        }
-        if (shardIndex >= res.size()) {
-            // If we could not shard up to expectation
-            return null;
-        }
-        return res.get(shardIndex);
-    }
-
-    /**
-     * @return the {@link List} of modules whose name contains the given pattern.
-     */
-    public static List<String> getModuleNamesMatching(File directory, String pattern) {
-        String[] names = directory.list(new NameFilter(pattern));
-        List<String> modules = new ArrayList<String>(names.length);
-        for (String name : names) {
-            int index = name.indexOf(CONFIG_EXT);
-            if (index > 0) {
-                String module = name.substring(0, index);
-                if (module.equals(pattern)) {
-                    // Pattern represents a single module, just return a single-item list
-                    modules = new ArrayList<>(1);
-                    modules.add(module);
-                    return modules;
-                }
-                modules.add(module);
-            }
-        }
-        return modules;
-    }
-
-    private static void putArgs(List<String> args,
-            Map<String, Map<String, List<String>>> argsMap) {
-        for (String arg : args) {
-            String[] parts = arg.split(":");
-            String target = parts[0];
-            String name = parts[1];
-            String value;
-            if (parts.length == 4) {
-                // key and value given, keep the pair delimited by ':' and stored as value
-                value = String.format("%s:%s", parts[2], parts[3]);
-            } else {
-                value = parts[2];
-            }
-            Map<String, List<String>> map = argsMap.get(target);
-            if (map == null) {
-                map = new HashMap<>();
-                argsMap.put(target, map);
-            }
-            List<String> valueList = map.get(name);
-            if (valueList == null) {
-                valueList = new ArrayList<>();
-                map.put(name, valueList);
-            }
-            valueList.add(value);
-        }
-    }
-
-    /**
-     * Sort by name and use runtimeHint for separation, shortest test first.
-     */
-    private static class ExecutionOrderComparator implements Comparator<IModuleDef> {
-        @Override
-        public int compare(IModuleDef def1, IModuleDef def2) {
-            int value1 = 0;
-            int value2 = 0;
-            if (ENDING_MODULES.containsKey(def1.getName())) {
-                value1 = ENDING_MODULES.get(def1.getName());
-            }
-            if (ENDING_MODULES.containsKey(def2.getName())) {
-                value2 = ENDING_MODULES.get(def2.getName());
-            }
-            if (value1 == 0 && value2 == 0) {
-                int time = (int) Math.signum(def1.getRuntimeHint() - def2.getRuntimeHint());
-                if (time == 0) {
-                    return def1.getName().compareTo(def2.getName());
-                }
-                return time;
-            }
-            return (int) Math.signum(value1 - value2);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void tearDown() {
-        mNonTokenModules.clear();
-        mTokenModules.clear();
-        mIncludeFilters.clear();
-        mExcludeFilters.clear();
-        mTestArgs.clear();
-        mModuleArgs.clear();
-    }
-
-    /**
-     * @return the mConfigFactory
-     */
-    protected IConfigurationFactory getConfigFactory() {
-        return mConfigFactory;
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/LinearPartition.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/LinearPartition.java
deleted file mode 100644
index a1755bf..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/LinearPartition.java
+++ /dev/null
@@ -1,115 +0,0 @@
-/*
- * 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.compatibility.common.tradefed.util;
-
-import com.android.compatibility.common.tradefed.testtype.IModuleDef;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Helper for the shard splitting. Split linearly a list into N sublist with
- * approximately the same weight.
- * TODO: Can be generalized for any weighted objects.
- */
-public class LinearPartition {
-
-    /**
-     * Split a list of {@link IModuleDef} into k sub list based on the runtime hint.
-     *
-     * @param seq the full list of {@link IModuleDef} to be splitted
-     * @param k the number of sub list we need.
-     * @return the List of sublist.
-     */
-    public static List<List<IModuleDef>> split(List<IModuleDef> seq, int k) {
-        ArrayList<List<IModuleDef>> result = new ArrayList<>();
-
-        if (k <= 0) {
-            ArrayList<IModuleDef> partition = new ArrayList<>();
-            partition.addAll(seq);
-            result.add(partition);
-            return result;
-        }
-
-        int n = seq.size() - 1;
-
-        if (k > n) {
-            for (IModuleDef value : seq) {
-                ArrayList<IModuleDef> partition = new ArrayList<>();
-                partition.add(value);
-                result.add(partition);
-            }
-            return result;
-        }
-
-        int[][] table = buildPartitionTable(seq, k);
-        k = k - 2;
-
-        while (k >= 0) {
-            ArrayList<IModuleDef> partition = new ArrayList<>();
-
-            for (int i = table[n - 1][k] + 1; i < n + 1; i++) {
-                partition.add(seq.get(i));
-            }
-
-            result.add(0, partition);
-            n = table[n - 1][k];
-            k = k - 1;
-        }
-
-        ArrayList<IModuleDef> partition = new ArrayList<>();
-
-        for (int i = 0; i < n + 1; i++) {
-            partition.add(seq.get(i));
-        }
-
-        result.add(0, partition);
-
-        return result;
-    }
-
-    /**
-     * Internal helper to build the partition table of the linear distribution used for splitting.
-     */
-    private static int[][] buildPartitionTable(List<IModuleDef> seq, int k) {
-        int n = seq.size();
-        float[][] table = new float[n][k];
-        int[][] solution = new int[n - 1][k - 1];
-
-        for (int i = 0; i < n; i++) {
-            table[i][0] = seq.get(i).getRuntimeHint() + ((i > 0) ? table[i - 1][0] : 0);
-        }
-
-        for (int j = 0; j < k; j++) {
-            table[0][j] = seq.get(0).getRuntimeHint();
-        }
-
-        for (int i = 1; i < n; i++) {
-            for (int j = 1; j < k; j++) {
-                table[i][j] = Integer.MAX_VALUE;
-                for (int x = 0; x < i; x++) {
-                    float cost = Math.max(table[x][j - 1], table[i][0] - table[x][0]);
-                    if (table[i][j] > cost) {
-                        table[i][j] = cost;
-                        solution[i - 1][j - 1] = x;
-                    }
-                }
-            }
-        }
-
-        return solution;
-    }
-}
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/RetryFilterHelper.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/RetryFilterHelper.java
index f20072a..907ad84 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/RetryFilterHelper.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/RetryFilterHelper.java
@@ -19,7 +19,6 @@
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.compatibility.common.tradefed.result.SubPlanHelper;
 import com.android.compatibility.common.tradefed.testtype.ISubPlan;
-import com.android.compatibility.common.tradefed.testtype.ModuleRepo;
 import com.android.compatibility.common.util.IInvocationResult;
 import com.android.compatibility.common.util.LightInvocationResult;
 import com.android.compatibility.common.util.ResultHandler;
@@ -33,7 +32,10 @@
 
 import com.google.common.annotations.VisibleForTesting;
 
+import java.io.File;
 import java.io.FileNotFoundException;
+import java.io.FilenameFilter;
+import java.util.ArrayList;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -269,8 +271,7 @@
         }
         if (mModuleName != null) {
             try {
-                List<String> modules = ModuleRepo.getModuleNamesMatching(
-                        mBuild.getTestsDir(), mModuleName);
+                List<String> modules = getModuleNamesMatching(mBuild.getTestsDir(), mModuleName);
                 if (modules.size() == 0) {
                     throw new IllegalArgumentException(
                             String.format("No modules found matching %s", mModuleName));
@@ -325,4 +326,40 @@
         mRetryExcludes = null;
         // keep references to buildInfo and session ID
     }
+
+    /** @return the {@link List} of modules whose name contains the given pattern. */
+    public static List<String> getModuleNamesMatching(File directory, String pattern) {
+        String[] names = directory.list(new NameFilter(pattern));
+        List<String> modules = new ArrayList<String>(names.length);
+        for (String name : names) {
+            int index = name.indexOf(".config");
+            if (index > 0) {
+                String module = name.substring(0, index);
+                if (module.equals(pattern)) {
+                    // Pattern represents a single module, just return a single-item list
+                    modules = new ArrayList<>(1);
+                    modules.add(module);
+                    return modules;
+                }
+                modules.add(module);
+            }
+        }
+        return modules;
+    }
+
+    /** A {@link FilenameFilter} to find all modules in a directory who match the given pattern. */
+    public static class NameFilter implements FilenameFilter {
+
+        private String mPattern;
+
+        public NameFilter(String pattern) {
+            mPattern = pattern;
+        }
+
+        /** {@inheritDoc} */
+        @Override
+        public boolean accept(File dir, String name) {
+            return name.contains(mPattern) && name.endsWith(".config");
+        }
+    }
 }
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/UniqueModuleCountUtil.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/UniqueModuleCountUtil.java
deleted file mode 100644
index e801ab3..0000000
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/util/UniqueModuleCountUtil.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.compatibility.common.tradefed.util;
-
-import com.android.compatibility.common.tradefed.testtype.IModuleDef;
-
-import java.util.HashSet;
-import java.util.List;
-
-/**
- * Utility to count the number of unique module from list of {@link IModuleDef}.
- */
-public class UniqueModuleCountUtil {
-
-    /**
-     * Count the number of unique modules within the list using module id. If two IModuleDef have
-     * the same id, they are part of the same module.
-     *
-     * @param listModules list of {@link IModuleDef} to count from
-     * @return the count of unique module.
-     */
-    public static int countUniqueModules(List<IModuleDef> listModules) {
-        HashSet<String> uniqueNames = new HashSet<>();
-        for (IModuleDef subModule : listModules) {
-            uniqueNames.add(subModule.getId());
-        }
-        return uniqueNames.size();
-    }
-}
diff --git a/common/host-side/tradefed/tests/Android.bp b/common/host-side/tradefed/tests/Android.bp
index 57a8fb9..f425bde 100644
--- a/common/host-side/tradefed/tests/Android.bp
+++ b/common/host-side/tradefed/tests/Android.bp
@@ -33,6 +33,7 @@
 
 tradefed_binary_host {
     name: "compatibility-mock-tradefed",
+    visibility: ["//visibility:private"],
     short_name: "TESTS",
     full_name: "Compatibility Tests",
     version: "1",
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
index df0c6c4..ea1b26c 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
@@ -22,14 +22,10 @@
 import com.android.compatibility.common.tradefed.presubmit.ApkPackageNameCheck;
 import com.android.compatibility.common.tradefed.presubmit.CtsConfigLoadingTest;
 import com.android.compatibility.common.tradefed.presubmit.DupFileTest;
-import com.android.compatibility.common.tradefed.presubmit.IntegrationTest;
 import com.android.compatibility.common.tradefed.presubmit.PresubmitSetupValidation;
 import com.android.compatibility.common.tradefed.presubmit.ValidateTestsAbi;
-import com.android.compatibility.common.tradefed.result.ChecksumReporterTest;
 import com.android.compatibility.common.tradefed.result.ConsoleReporterTest;
 import com.android.compatibility.common.tradefed.result.MetadataReporterTest;
-import com.android.compatibility.common.tradefed.result.ResultReporterBuildInfoTest;
-import com.android.compatibility.common.tradefed.result.ResultReporterTest;
 import com.android.compatibility.common.tradefed.result.SubPlanHelperTest;
 import com.android.compatibility.common.tradefed.result.suite.CertificationChecksumHelperTest;
 import com.android.compatibility.common.tradefed.result.suite.CertificationSuiteResultReporterTest;
@@ -43,17 +39,12 @@
 import com.android.compatibility.common.tradefed.targetprep.PropertyCheckTest;
 import com.android.compatibility.common.tradefed.targetprep.SettingsPreparerTest;
 import com.android.compatibility.common.tradefed.targetprep.VtsDeviceInfoCollectorTest;
-import com.android.compatibility.common.tradefed.testtype.CompatibilityTestTest;
-import com.android.compatibility.common.tradefed.testtype.JarHostTestTest;
-import com.android.compatibility.common.tradefed.testtype.ModuleDefTest;
-import com.android.compatibility.common.tradefed.testtype.ModuleRepoTest;
 import com.android.compatibility.common.tradefed.testtype.SubPlanTest;
 import com.android.compatibility.common.tradefed.testtype.retry.RetryFactoryTestTest;
 import com.android.compatibility.common.tradefed.util.CollectorUtilTest;
 import com.android.compatibility.common.tradefed.util.DynamicConfigFileReaderTest;
 import com.android.compatibility.common.tradefed.util.OptionHelperTest;
 import com.android.compatibility.common.tradefed.util.RetryFilterHelperTest;
-import com.android.compatibility.common.tradefed.util.UniqueModuleCountUtilTest;
 
 import org.junit.runner.RunWith;
 import org.junit.runners.Suite;
@@ -80,16 +71,12 @@
     ApkPackageNameCheck.class,
     CtsConfigLoadingTest.class,
     DupFileTest.class,
-    IntegrationTest.class,
     PresubmitSetupValidation.class,
     ValidateTestsAbi.class,
 
     // result
-    ChecksumReporterTest.class,
     ConsoleReporterTest.class,
     MetadataReporterTest.class,
-    ResultReporterBuildInfoTest.class,
-    ResultReporterTest.class,
     SubPlanHelperTest.class,
 
     // result.suite
@@ -109,10 +96,6 @@
     VtsDeviceInfoCollectorTest.class,
 
     // testtype
-    CompatibilityTestTest.class,
-    JarHostTestTest.class,
-    ModuleDefTest.class,
-    ModuleRepoTest.class,
     SubPlanTest.class,
 
     // testtype.retry
@@ -123,7 +106,6 @@
     DynamicConfigFileReaderTest.class,
     OptionHelperTest.class,
     RetryFilterHelperTest.class,
-    UniqueModuleCountUtilTest.class,
 })
 public class UnitTests {
     // empty on purpose
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
index 14ee77b..625da2f 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/CtsConfigLoadingTest.java
@@ -174,16 +174,7 @@
 
     static {
         ALLOWLIST_MODULE_PARAMETERS.add("CtsAccessibilityServiceTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsActivityManagerBackgroundActivityTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsAppOpsTestCases.config");
         ALLOWLIST_MODULE_PARAMETERS.add("CtsCarrierApiTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsContentCaptureServiceTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsDeqpTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsHiddenApiKillswitchDebugClassTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsHiddenApiKillswitchWhitelistTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsHiddenApiKillswitchWildcardTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsLocationTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsLocation2TestCases.config");
         ALLOWLIST_MODULE_PARAMETERS.add("CtsMediaTestCases.config");
         ALLOWLIST_MODULE_PARAMETERS.add("CtsMediaV2TestCases.config");
         ALLOWLIST_MODULE_PARAMETERS.add("CtsOpenGlPerfTestCases.config");
@@ -191,10 +182,6 @@
         ALLOWLIST_MODULE_PARAMETERS.add("CtsPermission2TestCases.config");
         ALLOWLIST_MODULE_PARAMETERS.add("CtsPermissionTestCases.config");
         ALLOWLIST_MODULE_PARAMETERS.add("CtsProviderUiTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsRsBlasTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsSkQPTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsWrapNoWrapTestCases.config");
-        ALLOWLIST_MODULE_PARAMETERS.add("CtsWrapWrapDebugMallocDebugTestCases.config");
     }
 
     /**
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/IntegrationTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/IntegrationTest.java
deleted file mode 100644
index 63e6fab..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/presubmit/IntegrationTest.java
+++ /dev/null
@@ -1,545 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.compatibility.common.tradefed.presubmit;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.compatibility.common.tradefed.result.ResultReporter;
-import com.android.compatibility.common.tradefed.testtype.CompatibilityTest;
-import com.android.compatibility.common.tradefed.testtype.IModuleDef;
-import com.android.compatibility.common.util.IInvocationResult;
-import com.android.compatibility.common.util.TestStatus;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.ConfigurationFactory;
-import com.android.tradefed.config.OptionSetter;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.invoker.InvocationContext;
-import com.android.tradefed.invoker.ShardListener;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.ResultForwarder;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IDeviceTest;
-import com.android.tradefed.testtype.IInvocationContextReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.util.AbiUtils;
-import com.android.tradefed.util.FileUtil;
-
-import org.easymock.EasyMock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Integration tests between {@link CompatibilityTest} and {@link ResultReporter} to ensure proper
- * flow of run and results.
- */
-@RunWith(JUnit4.class)
-public class IntegrationTest {
-
-    private static final String CONFIG =
-            "<configuration description=\"Auto Generated File\">\n" +
-            "<option name=\"config-descriptor:metadata\" key=\"component\" value=\"%s\" />\n" +
-            "<test class=\"com.android.compatibility.common.tradefed.testtype.%s\">\n" +
-            "    <option name=\"report-test\" value=\"%s\" />\n" +
-            "    <option name=\"run-complete\" value=\"%s\" />\n" +
-            "    <option name=\"test-fail\" value=\"%s\" />\n" +
-            "    <option name=\"internal-retry\" value=\"%s\" />\n" +
-            "</test>\n" +
-            "</configuration>";
-    private static final String FILENAME = "%s.config";
-    private static final String TEST_STUB = "TestStub"; // Test stub
-    private static final String SIMPLE_TEST_STUB = "SimpleTestStub"; // Simple test stub
-    private static final String TEST_STUB_SHARDABLE = "TestStubShardable";
-    private static final String COMMAND_LINE = "run cts";
-
-    private CompatibilityTest mTest;
-    private ResultReporter mReporter;
-    private ITestDevice mMockDevice;
-    private IBuildInfo mMockBuildInfo;
-    private IInvocationContext mContext;
-
-    private File mRootDir;
-    private File mAndroidFolder;
-    private File mTestDir;
-    private Map<String, String> mAttributes;
-
-    @Before
-    public void setUp() throws IOException {
-        mAttributes = new HashMap<>();
-        mTest = new CompatibilityTest() {
-            @Override
-            protected Set<String> getAbisForBuildTargetArch() {
-                Set<String> abis = new HashSet<>();
-                abis.add("arm64-v8a");
-                abis.add("armeabi-v7a");
-                return abis;
-            }
-        };
-        mReporter = new ResultReporter();
-        mMockDevice = EasyMock.createMock(ITestDevice.class);
-        mMockBuildInfo = EasyMock.createMock(IBuildInfo.class);
-        mTest.setBuild(mMockBuildInfo);
-        mTest.setDevice(mMockDevice);
-        mRootDir = FileUtil.createTempDir("fake-cts-root-dir");
-        mAndroidFolder = FileUtil.createTempDir("android-", mRootDir);
-        mTestDir = new File(mAndroidFolder, "testcases");
-        mTestDir.mkdirs();
-        String suiteName = mAndroidFolder.getName().split("-")[1];
-        // Create fake build attributes
-        mAttributes.put(CompatibilityBuildHelper.ROOT_DIR, mRootDir.getAbsolutePath());
-        mAttributes.put(CompatibilityBuildHelper.SUITE_NAME, suiteName);
-        mAttributes.put(CompatibilityBuildHelper.START_TIME_MS, "0");
-        mAttributes.put(CompatibilityBuildHelper.SUITE_VERSION, "10");
-        mAttributes.put(CompatibilityBuildHelper.SUITE_PLAN, "cts");
-        mAttributes.put(CompatibilityBuildHelper.SUITE_BUILD, "good-build");
-        mAttributes.put(CompatibilityBuildHelper.COMMAND_LINE_ARGS, COMMAND_LINE);
-
-        // these attributes seems necessary for re-run, not for run
-        mAttributes.put("cts:build_fingerprint", "fingerprint");
-        mAttributes.put("cts:build_product", "product");
-        mAttributes.put("cts:build_id", "bid");
-
-        EasyMock.expect(mMockBuildInfo.getBuildAttributes()).andStubReturn(mAttributes);
-
-        EasyMock.expect(mMockDevice.getSerialNumber()).andStubReturn("SERIAL");
-        EasyMock.expect(mMockBuildInfo.getDeviceSerial()).andStubReturn("SERIAL");
-
-        EasyMock.expect(mMockBuildInfo.getFiles()).andStubReturn(Collections.emptyList());
-
-        mContext = new InvocationContext();
-        mContext.addAllocatedDevice("default", mMockDevice);
-        mContext.addDeviceBuildInfo("default", mMockBuildInfo);
-        mTest.setInvocationContext(mContext);
-    }
-
-    @After
-    public void tearDown() {
-        FileUtil.recursiveDelete(mRootDir);
-    }
-
-    /**
-     * Create a CTS configuration with a fake tests to exercise all cases.
-     *
-     * @param testsDir The testcases/ dir where to put the module
-     * @param name the name of the module.
-     * @param moduleClass the fake test class to use.
-     * @param reportTest True if the test report some tests
-     * @param runComplete True if the test run is complete
-     * @param doesOneTestFail True if one of the test is going to fail
-     * @param internalRetry True if the test will retry the module itself once
-     */
-    private void createConfig(File testsDir, String name, String moduleClass, boolean reportTest,
-            boolean runComplete, boolean doesOneTestFail, boolean internalRetry)
-                    throws IOException {
-        createConfig(testsDir, name, moduleClass, reportTest, runComplete, doesOneTestFail,
-                internalRetry, "foo");
-
-    }
-
-    /**
-     * Create a CTS configuration with a fake tests to exercise all cases.
-     *
-     * @param testsDir The testcases/ dir where to put the module
-     * @param name the name of the module.
-     * @param moduleClass the fake test class to use.
-     * @param reportTest True if the test report some tests
-     * @param runComplete True if the test run is complete
-     * @param doesOneTestFail True if one of the test is going to fail
-     * @param internalRetry True if the test will retry the module itself once
-     * @param component the platform component name that the module can be categorized under
-     */
-    private void createConfig(File testsDir, String name, String moduleClass, boolean reportTest,
-            boolean runComplete, boolean doesOneTestFail, boolean internalRetry, String component)
-                    throws IOException {
-        File config = new File(testsDir, String.format(FILENAME, name));
-        FileUtil.deleteFile(config);
-        if (!config.createNewFile()) {
-            throw new IOException(String.format("Failed to create '%s'", config.getAbsolutePath()));
-        }
-
-        FileUtil.writeToFile(String.format(CONFIG, component, moduleClass, reportTest, runComplete,
-                doesOneTestFail, internalRetry), config);
-    }
-
-    /**
-     * Simple tests running in one module that should be marked complete.
-     */
-    @Test
-    public void testSingleModuleRun() throws Exception {
-        final String moduleName = "module_run";
-        final String mAbi = "arm64-v8a";
-        createConfig(mTestDir, moduleName, TEST_STUB, true, true, true, false);
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-
-        EasyMock.replay(mMockDevice, mMockBuildInfo);
-        mReporter.invocationStarted(mContext);
-        mTest.run(mReporter);
-        mReporter.invocationEnded(500);
-        EasyMock.verify(mMockDevice, mMockBuildInfo);
-        IInvocationResult result = mReporter.getResult();
-        assertEquals(2, result.countResults(TestStatus.PASS));
-        assertEquals(1, result.countResults(TestStatus.FAIL));
-        assertEquals(1, result.getModules().size());
-        assertEquals(1, result.getModuleCompleteCount());
-    }
-
-    /**
-     * Verify that result reporters test run ended callback can receive component name as configured
-     * in module config metadata field.
-     */
-    @Test
-    public void testSingleModuleRun_checkMetadata() throws Exception {
-        final String moduleName = "AwsomeModule";
-        final String mAbi = "arm64-v8a";
-        final String component = "CriticalComponent";
-        final List<String> receivedComponentsTestEnded = new ArrayList<>();
-        final List<String> receivedModuleNameTestEnded = new ArrayList<>();
-        final List<String> receivedAbiTestEnded = new ArrayList<>();
-        final List<String> receivedComponentsTestRunEnded = new ArrayList<>();
-        final List<String> receivedModuleNameTestRunEnded = new ArrayList<>();
-        final List<String> receivedAbiTestRunEnded = new ArrayList<>();
-        createConfig(mTestDir, moduleName, SIMPLE_TEST_STUB, true, true, true, false, component);
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-
-        EasyMock.replay(mMockDevice, mMockBuildInfo);
-        ITestInvocationListener myListener = new ITestInvocationListener() {
-            private IInvocationContext myContext;
-            @Override
-            public void invocationStarted(IInvocationContext context) {
-                myContext = context;
-            }
-            @Override
-            public void testRunEnded(long elapsedTimeMillis, HashMap<String, Metric> runMetrics) {
-                receivedComponentsTestRunEnded.addAll(myContext.getModuleInvocationContext()
-                        .getConfigurationDescriptor().getMetaData("component"));
-                receivedModuleNameTestRunEnded.addAll(myContext.getModuleInvocationContext()
-                        .getAttributes().get(IModuleDef.MODULE_NAME));
-                receivedAbiTestRunEnded.addAll(myContext.getModuleInvocationContext()
-                        .getAttributes().get(IModuleDef.MODULE_ABI));
-            }
-            @Override
-            public void testEnded(TestDescription test, long endTime,
-                    HashMap<String, Metric> testMetrics) {
-                receivedComponentsTestEnded.addAll(myContext.getModuleInvocationContext()
-                        .getConfigurationDescriptor().getMetaData("component"));
-                receivedModuleNameTestEnded.addAll(myContext.getModuleInvocationContext()
-                        .getAttributes().get(IModuleDef.MODULE_NAME));
-                receivedAbiTestEnded.addAll(myContext.getModuleInvocationContext()
-                        .getAttributes().get(IModuleDef.MODULE_ABI));
-            }
-        };
-        myListener.invocationStarted(mContext);
-        mTest.run(myListener);
-        myListener.invocationEnded(500);
-        EasyMock.verify(mMockDevice, mMockBuildInfo);
-        // verify metadata was retrieved during testRunEnded callbacks
-        assertEquals("[testRunEnded] wrong number of metadata collected",
-                1, receivedComponentsTestRunEnded.size());
-        assertEquals("[testRunEnded] wrong component metadata field received",
-                component, receivedComponentsTestRunEnded.get(0));
-        assertEquals("[testRunEnded] wrong number of module name collected",
-                1, receivedModuleNameTestRunEnded.size());
-        assertEquals(moduleName, receivedModuleNameTestRunEnded.get(0));
-        assertEquals("[testEnded] wrong number of module abi collected",
-                1, receivedAbiTestRunEnded.size());
-        assertEquals(mAbi, receivedAbiTestRunEnded.get(0));
-        // verify metadata was retrieved during testEnded callbacks
-        assertEquals("[testEnded] wrong number of metadata collected",
-                1, receivedComponentsTestEnded.size());
-        assertEquals("[testEnded] wrong component metadata field received",
-                component, receivedComponentsTestEnded.get(0));
-        assertEquals("[testEnded] wrong number of module name collected",
-                1, receivedModuleNameTestEnded.size());
-        assertEquals(moduleName, receivedModuleNameTestEnded.get(0));
-        assertEquals("[testEnded] wrong number of module abi collected",
-                1, receivedAbiTestEnded.size());
-        assertEquals(mAbi, receivedAbiTestEnded.get(0));
-    }
-
-    /**
-     * Simple tests running in one module that run some tests but not all of them.
-     */
-    @Test
-    public void testSingleModuleRun_incomplete() throws Exception {
-        final String moduleName = "module_run_incomplete";
-        final String mAbi = "arm64-v8a";
-        createConfig(mTestDir, moduleName, TEST_STUB, true, false, true, false);
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-
-        EasyMock.replay(mMockDevice, mMockBuildInfo);
-        mReporter.invocationStarted(mContext);
-        mTest.run(mReporter);
-        mReporter.invocationEnded(500);
-        EasyMock.verify(mMockDevice, mMockBuildInfo);
-        IInvocationResult result = mReporter.getResult();
-        assertEquals(1, result.countResults(TestStatus.PASS));
-        assertEquals(1, result.countResults(TestStatus.FAIL));
-        // Module should not be seen as complete.
-        assertEquals(1, result.getModules().size());
-        assertEquals(0, result.getModuleCompleteCount());
-    }
-
-    /**
-     * Simple tests running in one module that should be marked complete since it runs all its
-     * tests after an internal retry (like InstrumentationTest).
-     * FIXME: Fix the expectation of this test
-     */
-    @Test
-    public void testSingleModuleRun_completeAfterInternalRetry() throws Exception {
-        final String moduleName = "module_completeAfterRetry";
-        final String mAbi = "arm64-v8a";
-        createConfig(mTestDir, moduleName, TEST_STUB, true, true, true, true);
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-
-        EasyMock.replay(mMockDevice, mMockBuildInfo);
-        mReporter.invocationStarted(mContext);
-        mTest.run(mReporter);
-        mReporter.invocationEnded(500);
-        EasyMock.verify(mMockDevice, mMockBuildInfo);
-        IInvocationResult result = mReporter.getResult();
-        // FIXME: All tests should be marked as executed and not aggregating the count.
-        assertEquals(2, result.countResults(TestStatus.PASS));
-        assertEquals(1, result.countResults(TestStatus.FAIL));
-        // FIXME: Module should be complete since all its test have run.
-        assertEquals(1, result.getModules().size());
-        assertEquals(0, result.getModuleCompleteCount());
-    }
-
-    /**
-     * Simple tests running in one module that run some tests but not all of them, then we
-     * attempt to run it again and they still didn't run.
-     * FIXME: This test expectation needs to be fixed
-     */
-    @Test
-    public void testSingleModuleRun_incomplete_rerun_incomplete() throws Exception {
-        final String moduleName = "module_incomplete_rerun";
-        final String mAbi = "arm64-v8a";
-        createConfig(mTestDir, moduleName, TEST_STUB, true, false, true, false);
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-
-        // extra calls for retry
-        EasyMock.expect(mMockDevice.getProperty("ro.build.fingerprint")).andReturn("fingerprint");
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq("retry_command_line_args"),
-                EasyMock.eq(COMMAND_LINE));
-        EasyMock.expectLastCall();
-
-        EasyMock.replay(mMockDevice, mMockBuildInfo);
-        mReporter.invocationStarted(mContext);
-        mTest.run(mReporter);
-        mReporter.invocationEnded(500);
-
-        IInvocationResult result = mReporter.getResult();
-        assertEquals(1, result.countResults(TestStatus.PASS));
-        assertEquals(1, result.countResults(TestStatus.FAIL));
-        // Module should not be seen as complete.
-        assertEquals(0, result.getModuleCompleteCount());
-
-        // We re-run it
-        mReporter = new ResultReporter();
-        mTest = new CompatibilityTest() {
-            @Override
-            protected Set<String> getAbisForBuildTargetArch() {
-                Set<String> abis = new HashSet<>();
-                abis.add("arm64-v8a");
-                return abis;
-            }
-        };
-        mTest.setDevice(mMockDevice);
-        mTest.setBuild(mMockBuildInfo);
-        mTest.setInvocationContext(mContext);
-        OptionSetter setter = new OptionSetter(mTest, mReporter);
-        setter.setOptionValue("retry", "0");
-
-        mReporter.invocationStarted(mContext);
-        mTest.run(mReporter);
-        mReporter.invocationEnded(500);
-        EasyMock.verify(mMockDevice, mMockBuildInfo);
-
-        // Check retry results
-        result = mReporter.getResult();
-        // FIXME: We should only have 1 not_executed in the retry too. They should not aggregate
-        // from one run to another.
-        assertEquals(1, result.countResults(TestStatus.PASS));
-        assertEquals(1, result.countResults(TestStatus.FAIL));
-        // Module should not be seen as complete.
-        assertEquals(1, result.getModules().size());
-        assertEquals(0, result.getModuleCompleteCount());
-    }
-
-    /**
-     * Simple tests running in one module that run some tests but not all of them, we then attempt
-     * to retry run them and this time the not_executed is executed.
-     */
-    @Test
-    public void testSingleModuleRun_incomplete_rerun_complete() throws Exception {
-        final String moduleName = "module_incom_rerun_complete";
-        final String mAbi = "arm64-v8a";
-        createConfig(mTestDir, moduleName, TEST_STUB, true, false, true, false);
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-
-        // extra calls for retry
-        EasyMock.expect(mMockDevice.getProperty("ro.build.fingerprint")).andReturn("fingerprint");
-        EasyMock.expect(mMockDevice.getProperty("ro.product.cpu.abilist")).andReturn(mAbi);
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq(CompatibilityBuildHelper.MODULE_IDS),
-                EasyMock.eq(AbiUtils.createId(mAbi, moduleName)));
-        EasyMock.expectLastCall();
-        mMockBuildInfo.addBuildAttribute(EasyMock.eq("retry_command_line_args"),
-                EasyMock.eq(COMMAND_LINE));
-        EasyMock.expectLastCall();
-
-        EasyMock.replay(mMockDevice, mMockBuildInfo);
-        mReporter.invocationStarted(mContext);
-        mTest.run(mReporter);
-        mReporter.invocationEnded(500);
-
-        IInvocationResult result = mReporter.getResult();
-        assertEquals(1, result.countResults(TestStatus.PASS));
-        assertEquals(1, result.countResults(TestStatus.FAIL));
-        // Module should not be seen as complete.
-        assertEquals(0, result.getModuleCompleteCount());
-
-        // We replace the config by one that runs all tests without failures.
-        createConfig(mTestDir, moduleName, TEST_STUB, true, true, false, false);
-        // Usually configs do not change during the same session so we clear the map to have
-        // the new version of the config.
-        ((ConfigurationFactory)ConfigurationFactory.getInstance()).clearMapConfig();
-
-        // We re-run it
-        mReporter = new ResultReporter();
-        mTest = new CompatibilityTest() {
-            @Override
-            protected Set<String> getAbisForBuildTargetArch() {
-                Set<String> abis = new HashSet<>();
-                abis.add("arm64-v8a");
-                return abis;
-            }
-        };
-        mTest.setDevice(mMockDevice);
-        mTest.setBuild(mMockBuildInfo);
-        mTest.setInvocationContext(mContext);
-        OptionSetter setter = new OptionSetter(mTest, mReporter);
-        setter.setOptionValue("retry", "0");
-
-        mReporter.invocationStarted(mContext);
-        mTest.run(mReporter);
-        mReporter.invocationEnded(500);
-        EasyMock.verify(mMockDevice, mMockBuildInfo);
-
-        // Check retry results
-        result = mReporter.getResult();
-        assertEquals(3, result.countResults(TestStatus.PASS));
-        assertEquals(0, result.countResults(TestStatus.FAIL));
-        // Module should be marked as complete after retry.
-        assertEquals(1, result.getModules().size());
-        assertEquals(1, result.getModuleCompleteCount());
-    }
-
-    // ***** Case for sharding interaction *****
-
-    /**
-     * Helper to create a shard listener with the original reporter as master.
-     */
-    private ITestInvocationListener getShardListener(ResultReporter masterReporter) {
-        List<ITestInvocationListener> shardListeners = new ArrayList<ITestInvocationListener>();
-        ShardListener origConfigListener = new ShardListener(masterReporter);
-        ResultReporter reporterClone = (ResultReporter) masterReporter.clone();
-        shardListeners.add(reporterClone);
-        shardListeners.add(origConfigListener);
-        ResultForwarder shard = new ResultForwarder(shardListeners);
-        return shard;
-    }
-
-    /**
-     * Helper Thread to run the IShardableTest.
-     */
-    private class ShardThread extends Thread {
-        private IRemoteTest mShardTest;
-        private ResultReporter mMasterReporter;
-        private IBuildInfo mBuild;
-        private ITestDevice mDevice;
-        private IInvocationContext mShardContext;
-
-        public ShardThread(IRemoteTest test, ResultReporter masterReporter, IBuildInfo build,
-                ITestDevice device, IInvocationContext context) {
-            mShardTest = test;
-            mMasterReporter = masterReporter;
-            mBuild = build;
-            mDevice = device;
-            mShardContext = context;
-        }
-
-        @Override
-        public void run() {
-            ITestInvocationListener listener = getShardListener(mMasterReporter);
-            ((IBuildReceiver)mShardTest).setBuild(mBuild);
-            ((IDeviceTest)mShardTest).setDevice(mDevice);
-            ((IInvocationContextReceiver)mShardTest).setInvocationContext(mContext);
-            listener.invocationStarted(mShardContext);
-            try {
-                mShardTest.run(listener);
-            } catch (DeviceNotAvailableException e) {
-                throw new RuntimeException(e);
-            } finally {
-                listener.invocationEnded(500);
-            }
-        }
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ChecksumReporterTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ChecksumReporterTest.java
deleted file mode 100644
index 23fcb9a..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ChecksumReporterTest.java
+++ /dev/null
@@ -1,198 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.result;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
-import com.android.compatibility.common.util.ChecksumReporter;
-import com.android.compatibility.common.util.ChecksumReporter.ChecksumValidationException;
-import com.android.compatibility.common.util.ICaseResult;
-import com.android.compatibility.common.util.IInvocationResult;
-import com.android.compatibility.common.util.IModuleResult;
-import com.android.compatibility.common.util.ITestResult;
-import com.android.compatibility.common.util.ReportLog;
-import com.android.compatibility.common.util.TestStatus;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.OptionSetter;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.invoker.InvocationContext;
-import com.android.tradefed.util.FileUtil;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-import java.io.FileWriter;
-import java.io.IOException;
-
-/**
- * Unit tests for {@link ChecksumReporter}
- */
-public class ChecksumReporterTest extends TestCase {
-
-    private static final String ROOT_PROPERTY = "TESTS_ROOT";
-    private static final String ROOT_DIR_NAME = "root";
-    private static final String SUITE_NAME = "TESTS";
-    private static final String BUILD_NUMBER = "2";
-    private static final String SUITE_PLAN = "cts";
-    private static final String BASE_DIR_NAME = "android-tests";
-    private static final String TESTCASES = "testcases";
-
-    private ChecksumReporter mReporter;
-    private File mRoot = null;
-    private IBuildInfo mBuildInfo;
-    private ReportLog mReportLog = null;
-    private IInvocationResult mInvocationResult;
-    private IModuleResult mModuleResult;
-    private ITestResult mFailedTest;
-
-    @Override
-    public void setUp() throws Exception {
-        mReporter = new ChecksumReporter(100, .001, (short)1);
-        mRoot = FileUtil.createTempDir(ROOT_DIR_NAME);
-        File baseDir = new File(mRoot, BASE_DIR_NAME);
-        baseDir.mkdirs();
-        File testDir = new File(baseDir, TESTCASES);
-        testDir.mkdirs();
-        System.setProperty(ROOT_PROPERTY, mRoot.getAbsolutePath());
-
-        ResultReporter resultReporter = new ResultReporter();
-        CompatibilityBuildProvider provider = new CompatibilityBuildProvider() {
-            @Override
-            protected String getSuiteInfoName() {
-                return SUITE_NAME;
-            }
-            @Override
-            protected String getSuiteInfoBuildNumber() {
-                return BUILD_NUMBER;
-            }
-            @Override
-            protected String getSuiteInfoVersion() {
-                return BUILD_NUMBER;
-            }
-        };
-        OptionSetter setter = new OptionSetter(provider);
-        setter.setOptionValue("plan", SUITE_PLAN);
-        setter.setOptionValue("dynamic-config-url", "");
-        mBuildInfo = provider.getBuild();
-        IInvocationContext context = new InvocationContext();
-        context.addDeviceBuildInfo("fakeDevice", mBuildInfo);
-
-        resultReporter.invocationStarted(context);
-        mInvocationResult = resultReporter.getResult();
-        mModuleResult = mInvocationResult.getOrCreateModule("Module-1");
-        mModuleResult.setDone(true);
-        ICaseResult caseResult = mModuleResult.getOrCreateResult("Case-1");
-        ITestResult test1 = caseResult.getOrCreateResult("Test1");
-        test1.passed(mReportLog);
-        mFailedTest = caseResult.getOrCreateResult("Test2");
-        mFailedTest.failed("stack-trace - error happened");
-
-        IModuleResult moduleResult2 = mInvocationResult.getOrCreateModule("Module-2");
-        ICaseResult caseResult2 = moduleResult2.getOrCreateResult("Case-2");
-        mModuleResult.setDone(false);
-        ITestResult test3 = caseResult2.getOrCreateResult("Test3");
-        test3.passed(mReportLog);
-
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        mReporter = null;
-        FileUtil.recursiveDelete(mRoot);
-    }
-
-    public void testStoreAndRetrieveTestResults() {
-        mReporter.addInvocation(mInvocationResult);
-        VerifyInvocationResults(mInvocationResult, mReporter);
-    }
-
-    /***
-     * By definition this test is flaky since the checksum has a false positive probability of .1%
-     */
-    public void testInvalidChecksums() {
-        mReporter.addInvocation(mInvocationResult);
-        IModuleResult module = mInvocationResult.getModules().get(1);
-        module.setDone(!module.isDone());
-        String fingerprint = mInvocationResult.getBuildFingerprint();
-        assertFalse("Checksum should contain module: " + module.getName(),
-                mReporter.containsModuleResult(module, fingerprint));
-
-        mFailedTest.setResultStatus(TestStatus.PASS);
-        assertFalse("Checksum should not contain test: " + mFailedTest.getName(),
-                mReporter.containsTestResult(mFailedTest, mModuleResult, fingerprint));
-        assertFalse("Module checksum should verify number of tests",
-                mReporter.containsModuleResult(mModuleResult, fingerprint));
-    }
-
-    public void testFileSerialization() throws IOException, ChecksumValidationException {
-        mReporter.addInvocation(mInvocationResult);
-
-        File file1 = new File(mRoot, "file1.txt");
-        try (FileWriter fileWriter = new FileWriter(file1, false)) {
-            fileWriter.append("This is a test file");
-        }
-
-        mReporter.addDirectory(mRoot);
-        mReporter.saveToFile(mRoot);
-
-        ChecksumReporter storedChecksum = ChecksumReporter.load(mRoot);
-        VerifyInvocationResults(mInvocationResult, storedChecksum);
-        assertTrue("Serializing checksum maintains file hash",
-                storedChecksum.containsFile(file1, mRoot.getName()));
-    }
-
-    public void testFileCRCOperations() throws IOException {
-        File subDirectory = new File(mRoot, "child");
-        subDirectory.mkdir();
-        File file1 = new File(mRoot, "file1.txt");
-        try (FileWriter fileWriter = new FileWriter(file1, false)) {
-            fileWriter.append("This is a test file");
-        }
-
-        File file2 = new File(subDirectory, "file2.txt");
-        try (FileWriter fileWriter = new FileWriter(file2, false)) {
-            fileWriter.append("This is another test file with a different crc");
-        }
-
-        mReporter.addDirectory(mRoot);
-        String folderName = mRoot.getName();
-        assertTrue(mReporter.containsFile(file1, folderName));
-        assertTrue(mReporter.containsFile(file2, folderName + "/child"));
-        assertFalse("Should not contain non-existent file",
-                mReporter.containsFile(new File(mRoot, "fake.txt"), folderName));
-
-        File file3 = new File(mRoot, "file3.txt");
-        try (FileWriter fileWriter = new FileWriter(file3, false)) {
-            fileWriter.append("This is a test file added after crc calculated");
-        }
-        assertFalse("Should not contain file created after crc calculated",
-                mReporter.containsFile(file3, mRoot + "/"));
-
-    }
-
-    private void VerifyInvocationResults(IInvocationResult invocation, ChecksumReporter reporter) {
-        for (IModuleResult module : invocation.getModules()) {
-            String buildFingerprint = invocation.getBuildFingerprint();
-            assertTrue("Checksum should contain module: " + module.getName(),
-                    reporter.containsModuleResult(module, buildFingerprint));
-            for (ICaseResult caseResult : module.getResults()) {
-                for (ITestResult result : caseResult.getResults()) {
-                    assertTrue("Checksum should contain test: " + result.getName(),
-                            reporter.containsTestResult(result, module, buildFingerprint));
-                }
-            }
-        }
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterBuildInfoTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterBuildInfoTest.java
deleted file mode 100644
index 6e62c36..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterBuildInfoTest.java
+++ /dev/null
@@ -1,82 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.compatibility.common.tradefed.result;
-
-
-import com.android.compatibility.common.util.IInvocationResult;
-import com.android.compatibility.common.util.InvocationResult;
-import junit.framework.TestCase;
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Unit tests for {@link ResultReporter}, focused on ability to override build info.
- */
-public class ResultReporterBuildInfoTest extends TestCase {
-
-    public void testOverrideBuildProperties() {
-        ResultReporterBuildInfoTester tester = new ResultReporterBuildInfoTester();
-        String manufacture = "custom_manufacture";
-        String brand = "google";
-        String product = "gProduct";
-        String device = "gDevice";
-        String version = "gVersion";
-        String buildId = "123";
-        String model = "gModel";
-        String fingerprint = brand + "/" + product + "/" + device + ":" +
-                version + "/" + buildId + "/userdebug-keys";
-
-        IInvocationResult result = tester.testBuildInfoOverride(fingerprint, manufacture, model);
-        Map<String, String> invocationInfo = result.getInvocationInfo();
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_ID), buildId);
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_BRAND), brand);
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_DEVICE), device);
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_PRODUCT), product);
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_VERSION_RELEASE), version);
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_FINGERPRINT), fingerprint);
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_MANUFACTURER), manufacture);
-        assertEquals(invocationInfo.get(ResultReporter.BUILD_MODEL), model);
-    }
-
-    public static class ResultReporterBuildInfoTester extends ResultReporter {
-
-        public ResultReporterBuildInfoTester() {
-            mResult = new InvocationResult();
-        }
-
-        public IInvocationResult testBuildInfoOverride(String buildFingerprintOverride,
-                String manufactureOverride, String modelOverride) {
-            addDeviceBuildInfoToResult(
-                    buildFingerprintOverride, manufactureOverride, modelOverride);
-            return mResult;
-        }
-
-        @Override
-        protected Map<String, String> mapBuildInfo() {
-            Map<String, String> buildProperties = new HashMap<>();
-            buildProperties.put(BUILD_ID, BUILD_ID);
-            buildProperties.put(BUILD_BRAND, BUILD_BRAND);
-            buildProperties.put(BUILD_DEVICE, BUILD_DEVICE);
-            buildProperties.put(BUILD_PRODUCT, BUILD_PRODUCT);
-            buildProperties.put(BUILD_VERSION_RELEASE, BUILD_VERSION_RELEASE);
-            buildProperties.put(BUILD_FINGERPRINT, BUILD_FINGERPRINT);
-            buildProperties.put(BUILD_MANUFACTURER, BUILD_MANUFACTURER);
-            buildProperties.put(BUILD_MODEL, BUILD_MODEL);
-            return buildProperties;
-        }
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterTest.java
deleted file mode 100644
index 805a2ad..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/result/ResultReporterTest.java
+++ /dev/null
@@ -1,622 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.result;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
-import com.android.compatibility.common.util.DeviceInfo;
-import com.android.compatibility.common.util.ICaseResult;
-import com.android.compatibility.common.util.IInvocationResult;
-import com.android.compatibility.common.util.IModuleResult;
-import com.android.compatibility.common.util.ITestResult;
-import com.android.compatibility.common.util.TestStatus;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.OptionSetter;
-import com.android.tradefed.invoker.IInvocationContext;
-import com.android.tradefed.invoker.InvocationContext;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ByteArrayInputStreamSource;
-import com.android.tradefed.result.InputStreamSource;
-import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.util.AbiUtils;
-import com.android.tradefed.util.FileUtil;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-import java.io.FileFilter;
-import java.util.HashMap;
-import java.util.List;
-
-/**
- * Unit tests for {@link ResultReporter}
- */
-public class ResultReporterTest extends TestCase {
-
-    private static final String ROOT_PROPERTY = "TESTS_ROOT";
-    private static final String SUITE_NAME = "TESTS";
-    private static final String BUILD_NUMBER = "2";
-    private static final String SUITE_PLAN = "cts";
-    private static final String DYNAMIC_CONFIG_URL = "";
-    private static final String ROOT_DIR_NAME = "root";
-    private static final String BASE_DIR_NAME = "android-tests";
-    private static final String TESTCASES = "testcases";
-    private static final String NAME = "ModuleName";
-    private static final String ABI = "mips64";
-    private static final String ID = AbiUtils.createId(ABI, NAME);
-    private static final String CLASS = "android.test.FoorBar";
-    private static final String METHOD_1 = "testBlah1";
-    private static final String METHOD_2 = "testBlah2";
-    private static final String METHOD_3 = "testBlah3";
-    private static final String TEST_1 = String.format("%s#%s", CLASS, METHOD_1);
-    private static final String TEST_2 = String.format("%s#%s", CLASS, METHOD_2);
-    private static final String TEST_3 = String.format("%s#%s", CLASS, METHOD_3);
-    private static final String STACK_TRACE = "Something small is not alright\n " +
-            "at four.big.insects.Marley.sing(Marley.java:10)";
-    private static final String RESULT_DIR = "result123";
-    private static final String[] FORMATTING_FILES = {
-        "compatibility_result.css",
-        "compatibility_result.xsl",
-        "logo.png"};
-
-    private ResultReporter mReporter;
-    private IBuildInfo mBuildInfo;
-    private IInvocationContext mContext;
-    private CompatibilityBuildHelper mBuildHelper;
-
-    private File mRoot = null;
-    private File mBase = null;
-    private File mTests = null;
-
-    @Override
-    public void setUp() throws Exception {
-        mReporter = new ResultReporter();
-        mRoot = FileUtil.createTempDir(ROOT_DIR_NAME);
-        mBase = new File(mRoot, BASE_DIR_NAME);
-        mBase.mkdirs();
-        mTests = new File(mBase, TESTCASES);
-        mTests.mkdirs();
-        System.setProperty(ROOT_PROPERTY, mRoot.getAbsolutePath());
-        CompatibilityBuildProvider provider = new CompatibilityBuildProvider() {
-            @Override
-            protected String getSuiteInfoName() {
-                return SUITE_NAME;
-            }
-            @Override
-            protected String getSuiteInfoBuildNumber() {
-                return BUILD_NUMBER;
-            }
-            @Override
-            protected String getSuiteInfoVersion() {
-                return BUILD_NUMBER;
-            }
-        };
-        OptionSetter setter = new OptionSetter(provider);
-        setter.setOptionValue("plan", SUITE_PLAN);
-        setter.setOptionValue("dynamic-config-url", DYNAMIC_CONFIG_URL);
-        mBuildInfo = provider.getBuild();
-        mBuildHelper = new CompatibilityBuildHelper(mBuildInfo);
-        mContext = new InvocationContext();
-        mContext.addDeviceBuildInfo("fakeDevice", mBuildInfo);
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        mReporter = null;
-        FileUtil.recursiveDelete(mRoot);
-    }
-
-    public void testSetup() throws Exception {
-        mReporter.invocationStarted(mContext);
-        // Should have created a directory for the logs
-        File[] children = mBuildHelper.getLogsDir().listFiles();
-        assertTrue("Didn't create logs dir", children.length == 1 && children[0].isDirectory());
-        // Should have created a directory for the results
-        children = mBuildHelper.getResultsDir().listFiles();
-        assertTrue("Didn't create results dir", children.length == 1 && children[0].isDirectory());
-        mReporter.invocationEnded(10);
-        // Should have created a zip file
-        children = mBuildHelper.getResultsDir().listFiles(new FileFilter() {
-            @Override
-            public boolean accept(File pathname) {
-                return pathname.getName().endsWith(".zip");
-            }
-        });
-        assertTrue("Didn't create results zip",
-                children.length == 1 && children[0].isFile() && children[0].length() > 0);
-    }
-
-    public void testResultReporting() throws Exception {
-        mReporter.invocationStarted(mContext);
-        mReporter.testRunStarted(ID, 2);
-        TestDescription test1 = new TestDescription(CLASS, METHOD_1);
-        mReporter.testStarted(test1);
-        mReporter.testEnded(test1, new HashMap<String, Metric>());
-        TestDescription test2 = new TestDescription(CLASS, METHOD_2);
-        mReporter.testStarted(test2);
-        mReporter.testFailed(test2, STACK_TRACE);
-        TestDescription test3 = new TestDescription(CLASS, METHOD_3);
-        mReporter.testStarted(test3);
-        mReporter.testFailed(test3, STACK_TRACE);
-        mReporter.testEnded(test3, new HashMap<String, Metric>());
-        mReporter.testRunEnded(10, new HashMap<String, Metric>());
-        mReporter.invocationEnded(10);
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 1 pass", 1, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 2 failures", 2, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        assertTrue(module.isDone());
-        assertEquals("Incorrect ID", ID, module.getId());
-        List<ICaseResult> caseResults = module.getResults();
-        assertEquals("Expected 1 test case", 1, caseResults.size());
-        ICaseResult caseResult = caseResults.get(0);
-        List<ITestResult> testResults = caseResult.getResults();
-        assertEquals("Expected 3 tests", 3, testResults.size());
-        ITestResult result1 = caseResult.getResult(METHOD_1);
-        assertNotNull(String.format("Expected result for %s", TEST_1), result1);
-        assertEquals(String.format("Expected pass for %s", TEST_1), TestStatus.PASS,
-                result1.getResultStatus());
-        ITestResult result2 = caseResult.getResult(METHOD_2);
-        assertNotNull(String.format("Expected result for %s", TEST_2), result2);
-        assertEquals(String.format("Expected fail for %s", TEST_2), TestStatus.FAIL,
-                result2.getResultStatus());
-        ITestResult result3 = caseResult.getResult(METHOD_3);
-        assertNotNull(String.format("Expected result for %s", TEST_3), result3);
-        assertEquals(String.format("Expected fail for %s", TEST_3), TestStatus.FAIL,
-                result3.getResultStatus());
-    }
-
-    private void makeTestRun(String[] methods, boolean[] passes) {
-        mReporter.testRunStarted(ID, methods.length);
-
-        for (int i = 0; i < methods.length; i++) {
-            TestDescription test = new TestDescription(CLASS, methods[i]);
-            mReporter.testStarted(test);
-            if (!passes[i]) {
-                mReporter.testFailed(test, STACK_TRACE);
-            }
-            mReporter.testEnded(test, new HashMap<String, Metric>());
-        }
-
-        mReporter.testRunEnded(10, new HashMap<String, Metric>());
-    }
-
-    public void testRepeatedExecutions() throws Exception {
-        String[] methods = new String[] {METHOD_1, METHOD_2, METHOD_3};
-
-        mReporter.invocationStarted(mContext);
-
-        makeTestRun(methods, new boolean[] {true, false, true});
-        makeTestRun(methods, new boolean[] {true, false, false});
-        makeTestRun(methods, new boolean[] {true, true, true});
-
-        mReporter.invocationEnded(10);
-
-        // Verification
-
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 1 pass", 1, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 2 failures", 2, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        assertEquals("Incorrect ID", ID, module.getId());
-        List<ICaseResult> caseResults = module.getResults();
-        assertEquals("Expected 1 test case", 1, caseResults.size());
-        ICaseResult caseResult = caseResults.get(0);
-        List<ITestResult> testResults = caseResult.getResults();
-        assertEquals("Expected 3 tests", 3, testResults.size());
-
-        // Test 1 details
-        ITestResult result1 = caseResult.getResult(METHOD_1);
-        assertNotNull(String.format("Expected result for %s", TEST_1), result1);
-        assertEquals(String.format("Expected pass for %s", TEST_1), TestStatus.PASS,
-                result1.getResultStatus());
-
-        // Test 2 details
-        ITestResult result2 = caseResult.getResult(METHOD_2);
-        assertNotNull(String.format("Expected result for %s", TEST_2), result2);
-        assertEquals(String.format("Expected fail for %s", TEST_2), TestStatus.FAIL,
-                result2.getResultStatus());
-        // TODO: Define requirement. Should this result have multiple stack traces?
-        assertEquals(result2.getStackTrace(), STACK_TRACE);
-
-        // Test 3 details
-        ITestResult result3 = caseResult.getResult(METHOD_3);
-        assertNotNull(String.format("Expected result for %s", TEST_3), result3);
-        assertEquals(String.format("Expected fail for %s", TEST_3), TestStatus.FAIL,
-                result3.getResultStatus());
-        assertEquals(result3.getStackTrace(), STACK_TRACE);
-    }
-
-    public void testRetry() throws Exception {
-        mReporter.invocationStarted(mContext);
-
-        // Set up IInvocationResult with existing results from previous session
-        mReporter.testRunStarted(ID, 2);
-        IInvocationResult invocationResult = mReporter.getResult();
-        IModuleResult moduleResult = invocationResult.getOrCreateModule(ID);
-        ICaseResult caseResult = moduleResult.getOrCreateResult(CLASS);
-        ITestResult testResult1 = caseResult.getOrCreateResult(METHOD_1);
-        testResult1.setResultStatus(TestStatus.PASS);
-        testResult1.setRetry(true);
-        ITestResult testResult2 = caseResult.getOrCreateResult(METHOD_2);
-        testResult2.setResultStatus(TestStatus.FAIL);
-        testResult2.setStackTrace(STACK_TRACE);
-        testResult2.setRetry(true);
-
-        // Flip results for the current session
-        TestDescription test1 = new TestDescription(CLASS, METHOD_1);
-        mReporter.testStarted(test1);
-        mReporter.testFailed(test1, STACK_TRACE);
-        mReporter.testEnded(test1, new HashMap<String, Metric>());
-        TestDescription test2 = new TestDescription(CLASS, METHOD_2);
-        mReporter.testStarted(test2);
-        mReporter.testEnded(test2, new HashMap<String, Metric>());
-
-        mReporter.testRunEnded(10, new HashMap<String, Metric>());
-        mReporter.invocationEnded(10);
-
-        // Verification that results have been overwritten.
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 1 pass", 1, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 1 failure", 1, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        List<ICaseResult> cases = module.getResults();
-        assertEquals("Expected 1 test case", 1, cases.size());
-        ICaseResult case1 = cases.get(0);
-        List<ITestResult> testResults = case1.getResults();
-        assertEquals("Expected 2 tests", 2, testResults.size());
-
-        // Test 1 details
-        ITestResult finalTestResult1 = case1.getResult(METHOD_1);
-        assertNotNull(String.format("Expected result for %s", TEST_1), finalTestResult1);
-        assertEquals(String.format("Expected fail for %s", TEST_1), TestStatus.FAIL,
-                finalTestResult1.getResultStatus());
-        assertEquals(finalTestResult1.getStackTrace(), STACK_TRACE);
-
-        // Test 2 details
-        ITestResult finalTestResult2 = case1.getResult(METHOD_2);
-        assertNotNull(String.format("Expected result for %s", TEST_2), finalTestResult2);
-        assertEquals(String.format("Expected pass for %s", TEST_2), TestStatus.PASS,
-                finalTestResult2.getResultStatus());
-    }
-
-    public void testRetryCanSetDone() throws Exception {
-        mReporter.invocationStarted(mContext);
-        // Set mCanMarkDone directly (otherwise we must build result directory, write XML, and
-        // perform actual retry)
-        mReporter.mCanMarkDone = true;
-        // Set up IInvocationResult with existing results from previous session
-        IInvocationResult invocationResult = mReporter.getResult();
-        IModuleResult moduleResult = invocationResult.getOrCreateModule(ID);
-        moduleResult.initializeDone(false);
-        ICaseResult caseResult = moduleResult.getOrCreateResult(CLASS);
-        ITestResult testResult1 = caseResult.getOrCreateResult(METHOD_1);
-        testResult1.setResultStatus(TestStatus.PASS);
-        testResult1.setRetry(true);
-        ITestResult testResult2 = caseResult.getOrCreateResult(METHOD_2);
-        testResult2.setResultStatus(TestStatus.FAIL);
-        testResult2.setStackTrace(STACK_TRACE);
-        testResult2.setRetry(true);
-
-        // Assume no additional filtering is applied to retry, and all tests for the module have
-        // been collected. Thus, module "done" value should switch.
-        mReporter.testRunStarted(ID, 1);
-
-        TestDescription test2 = new TestDescription(CLASS, METHOD_2);
-        mReporter.testStarted(test2);
-        mReporter.testEnded(test2, new HashMap<String, Metric>());
-
-        mReporter.testRunEnded(10, new HashMap<String, Metric>());
-        mReporter.invocationEnded(10);
-
-        // Verification that results have been overwritten.
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 2 pass", 2, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 0 failures", 0, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        assertTrue("Module should be marked done", module.isDone());
-    }
-
-    public void testRetryCannotSetDone() throws Exception {
-        mReporter.invocationStarted(mContext);
-        // Set mCanMarkDone directly (otherwise we must build result directory, write XML, and
-        // perform actual retry)
-        mReporter.mCanMarkDone = false;
-        // Set up IInvocationResult with existing results from previous session
-        IInvocationResult invocationResult = mReporter.getResult();
-        IModuleResult moduleResult = invocationResult.getOrCreateModule(ID);
-        moduleResult.setDone(false);
-        ICaseResult caseResult = moduleResult.getOrCreateResult(CLASS);
-        ITestResult testResult1 = caseResult.getOrCreateResult(METHOD_1);
-        testResult1.setResultStatus(TestStatus.PASS);
-        testResult1.setRetry(true);
-        ITestResult testResult2 = caseResult.getOrCreateResult(METHOD_2);
-        testResult2.setResultStatus(TestStatus.FAIL);
-        testResult2.setStackTrace(STACK_TRACE);
-        testResult2.setRetry(true);
-
-        // Since using retry-type failed option, we only run previously failed test
-        // and don't run any non-executed tests, so module "done" value should not switch.
-        mReporter.testRunStarted(ID, 1);
-
-        TestDescription test2 = new TestDescription(CLASS, METHOD_2);
-        mReporter.testStarted(test2);
-        mReporter.testEnded(test2, new HashMap<String, Metric>());
-
-        mReporter.testRunEnded(10, new HashMap<String, Metric>());
-        mReporter.invocationEnded(10);
-
-        // Verification that results have been overwritten.
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 2 pass", 2, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 0 failures", 0, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        assertFalse("Module should not be marked done", module.isDone());
-    }
-
-    public void testResultReporting_moduleNotDone() throws Exception {
-        mReporter.invocationStarted(mContext);
-        mReporter.testRunStarted(ID, 2);
-        TestDescription test1 = new TestDescription(CLASS, METHOD_1);
-        mReporter.testStarted(test1);
-        mReporter.testEnded(test1, new HashMap<String, Metric>());
-        mReporter.testRunFailed("error");
-        mReporter.testRunEnded(10, new HashMap<String, Metric>());
-        mReporter.invocationEnded(10);
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 1 pass", 1, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 0 failures", 0, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-
-        // Ensure module is reported as not done
-        assertFalse(module.isDone());
-        assertEquals("Incorrect ID", ID, module.getId());
-        List<ICaseResult> caseResults = module.getResults();
-        assertEquals("Expected 1 test case", 1, caseResults.size());
-        ICaseResult caseResult = caseResults.get(0);
-        List<ITestResult> testResults = caseResult.getResults();
-        assertEquals("Expected 1 tests", 1, testResults.size());
-        ITestResult result1 = caseResult.getResult(METHOD_1);
-        assertNotNull(String.format("Expected result for %s", TEST_1), result1);
-        assertEquals(String.format("Expected pass for %s", TEST_1), TestStatus.PASS,
-                result1.getResultStatus());
-    }
-
-    public void testResultReporting_moduleNotDone_noTests() throws Exception {
-        mReporter.invocationStarted(mContext);
-        mReporter.testRunStarted(ID, 0);
-        mReporter.testRunFailed("error"); // test run failure should prevent marking module "done"
-        mReporter.testRunEnded(10, new HashMap<String, String>());
-        mReporter.invocationEnded(10);
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 0 pass", 0, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 0 failures", 0, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        assertEquals("Incorrect ID", ID, module.getId());
-        // Ensure module is reported as not done
-        assertFalse(module.isDone());
-    }
-
-    public void testResultReporting_moduleDone_noTests() throws Exception {
-        mReporter.invocationStarted(mContext);
-        mReporter.testRunStarted(ID, 0);
-        // Lack of test run failure should allow module to be marked "done"
-        mReporter.testRunEnded(10, new HashMap<String, String>());
-        mReporter.invocationEnded(10);
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 0 pass", 0, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 0 failures", 0, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        assertEquals("Incorrect ID", ID, module.getId());
-        // Ensure module is reported as done
-        assertTrue(module.isDone());
-    }
-
-    public void testCopyFormattingFiles() throws Exception {
-        File resultDir = new File(mBuildHelper.getResultsDir(), RESULT_DIR);
-        resultDir.mkdirs();
-        ResultReporter.copyFormattingFiles(resultDir, SUITE_NAME);
-        for (String filename : FORMATTING_FILES) {
-            File file = new File(resultDir, filename);
-            assertTrue(String.format("%s (%s) was not created", filename, file.getAbsolutePath()),
-                    file.exists() && file.isFile() && file.length() > 0);
-        }
-    }
-
-    /**
-     * Ensure that when {@link ResultReporter#testLog(String, LogDataType, InputStreamSource)} is
-     * called, a single invocation result folder is created and populated.
-     */
-    public void testTestLog() throws Exception {
-        InputStreamSource fakeData = new ByteArrayInputStreamSource("test".getBytes());
-        mReporter.invocationStarted(mContext);
-        mReporter.testLog("test1", LogDataType.LOGCAT, fakeData);
-        // date folder
-        assertEquals(1, mBuildHelper.getLogsDir().list().length);
-        // inv_ folder
-        assertEquals(1, mBuildHelper.getLogsDir().listFiles()[0].list().length);
-        // actual logs
-        assertEquals(1, mBuildHelper.getLogsDir().listFiles()[0].listFiles()[0].list().length);
-        mReporter.testLog("test2", LogDataType.LOGCAT, fakeData);
-        // date folder
-        assertEquals(1, mBuildHelper.getLogsDir().list().length);
-        // inv_ folder
-        assertEquals(1, mBuildHelper.getLogsDir().listFiles()[0].list().length);
-        // actual logs
-        assertEquals(2, mBuildHelper.getLogsDir().listFiles()[0].listFiles()[0].list().length);
-    }
-
-    /**
-     * Ensure that when {@link ResultReporter#testLog(String, LogDataType, InputStreamSource)} is
-     * called for host-side device info, a device info file is created in the result
-     */
-    public void testTestLogWithDeviceInfo() throws Exception {
-        InputStreamSource fakeData = new ByteArrayInputStreamSource("test".getBytes());
-        String deviceInfoName = String.format("Test%s", DeviceInfo.FILE_SUFFIX);
-        mReporter.invocationStarted(mContext);
-        mReporter.testLog(deviceInfoName, LogDataType.TEXT, fakeData);
-        File deviceInfoFolder = new File(mBuildHelper.getResultDir(), DeviceInfo.RESULT_DIR_NAME);
-        // assert device info folder was created
-        assertTrue(deviceInfoFolder.exists());
-        File[] deviceInfoFiles = deviceInfoFolder.listFiles();
-        // assert that one file was written to the folder
-        assertEquals(1, deviceInfoFiles.length);
-        File deviceInfoFile = deviceInfoFiles[0];
-        // assert device info file has been named correctly
-        assertEquals(deviceInfoName, deviceInfoFile.getName());
-        // assert contents of the file
-        assertEquals("test", FileUtil.readStringFromFile(deviceInfoFile));
-    }
-
-    /** Ensure that the module is not marked done if any of the shard fails. */
-    public void testResultReporter_sharded() throws Exception {
-        ResultReporter shard1 = new ResultReporter(mReporter);
-        ResultReporter shard2 = new ResultReporter(mReporter);
-
-        mReporter.invocationStarted(mContext);
-        shard1.invocationStarted(mContext);
-        shard2.invocationStarted(mContext);
-
-        // First shard is good
-        shard1.testRunStarted(ID, 1);
-        TestDescription test1 = new TestDescription(CLASS, METHOD_1);
-        shard1.testStarted(test1);
-        shard1.testEnded(test1, new HashMap<String, Metric>());
-        shard1.testRunEnded(10, new HashMap<String, Metric>());
-        shard1.invocationEnded(10);
-        // Second shard failed
-        shard2.testRunStarted(ID, 2);
-        TestDescription test2 = new TestDescription(CLASS, METHOD_2);
-        shard2.testStarted(test2);
-        shard2.testEnded(test2, new HashMap<String, Metric>());
-        shard2.testRunFailed("error");
-        shard2.testRunEnded(10, new HashMap<String, Metric>());
-        shard2.invocationEnded(10);
-
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 2 pass", 2, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 0 failures", 0, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-
-        // Ensure module is seen as not done and failed
-        assertFalse(module.isDone());
-        assertTrue(module.isFailed());
-
-        assertEquals("Incorrect ID", ID, module.getId());
-        List<ICaseResult> caseResults = module.getResults();
-        assertEquals("Expected 1 test run", 1, caseResults.size());
-        ICaseResult caseResult = caseResults.get(0);
-        List<ITestResult> testResults = caseResult.getResults();
-        assertEquals("Expected 2 test cases", 2, testResults.size());
-        ITestResult result1 = caseResult.getResult(METHOD_1);
-        assertNotNull(String.format("Expected result for %s", TEST_1), result1);
-        assertEquals(
-                String.format("Expected pass for %s", TEST_1),
-                TestStatus.PASS,
-                result1.getResultStatus());
-    }
-
-    /** Ensure that the run history of the current run is added to previous run history. */
-    public void testRetryWithRunHistory() throws Exception {
-        mReporter.invocationStarted(mContext);
-
-        // Set up IInvocationResult with existing results from previous session
-        mReporter.testRunStarted(ID, 2);
-        IInvocationResult invocationResult = mReporter.getResult();
-        IModuleResult moduleResult = invocationResult.getOrCreateModule(ID);
-        ICaseResult caseResult = moduleResult.getOrCreateResult(CLASS);
-        ITestResult testResult1 = caseResult.getOrCreateResult(METHOD_1);
-        testResult1.setResultStatus(TestStatus.PASS);
-        testResult1.setRetry(true);
-        ITestResult testResult2 = caseResult.getOrCreateResult(METHOD_2);
-        testResult2.setResultStatus(TestStatus.FAIL);
-        testResult2.setStackTrace(STACK_TRACE);
-        testResult2.setRetry(true);
-        // Set up IInvocationResult with the run history of previous runs.
-        invocationResult.addInvocationInfo(
-                "run_history", "[{\"startTime\":1,\"endTime\":2},{\"startTime\":3,\"endTime\":4}]");
-
-        // Flip results for the current session
-        TestDescription test1 = new TestDescription(CLASS, METHOD_1);
-        mReporter.testStarted(test1);
-        mReporter.testFailed(test1, STACK_TRACE);
-        mReporter.testEnded(test1, new HashMap<String, Metric>());
-        TestDescription test2 = new TestDescription(CLASS, METHOD_2);
-        mReporter.testStarted(test2);
-        mReporter.testEnded(test2, new HashMap<String, Metric>());
-
-        mReporter.testRunEnded(10, new HashMap<String, Metric>());
-        mReporter.invocationEnded(10);
-
-        // Verification that results have been overwritten.
-        IInvocationResult result = mReporter.getResult();
-        assertEquals("Expected 1 pass", 1, result.countResults(TestStatus.PASS));
-        assertEquals("Expected 1 failure", 1, result.countResults(TestStatus.FAIL));
-        List<IModuleResult> modules = result.getModules();
-        assertEquals("Expected 1 module", 1, modules.size());
-        IModuleResult module = modules.get(0);
-        List<ICaseResult> cases = module.getResults();
-        assertEquals("Expected 1 test case", 1, cases.size());
-        ICaseResult case1 = cases.get(0);
-        List<ITestResult> testResults = case1.getResults();
-        assertEquals("Expected 2 tests", 2, testResults.size());
-
-        long startTime = mReporter.getResult().getStartTime();
-        String expectedRunHistory =
-                String.format(
-                        "[{\"startTime\":1,\"endTime\":2},"
-                                + "{\"startTime\":3,\"endTime\":4},{\"startTime\":%d,\"endTime\":%d}]",
-                        startTime, startTime + 10);
-        assertEquals(expectedRunHistory, invocationResult.getInvocationInfo().get("run_history"));
-
-        // Test 1 details
-        ITestResult finalTestResult1 = case1.getResult(METHOD_1);
-        assertNotNull(String.format("Expected result for %s", TEST_1), finalTestResult1);
-        assertEquals(
-                String.format("Expected fail for %s", TEST_1),
-                TestStatus.FAIL,
-                finalTestResult1.getResultStatus());
-        assertEquals(finalTestResult1.getStackTrace(), STACK_TRACE);
-
-        // Test 2 details
-        ITestResult finalTestResult2 = case1.getResult(METHOD_2);
-        assertNotNull(String.format("Expected result for %s", TEST_2), finalTestResult2);
-        assertEquals(
-                String.format("Expected pass for %s", TEST_2),
-                TestStatus.PASS,
-                finalTestResult2.getResultStatus());
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTestTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTestTest.java
deleted file mode 100644
index b04a4e3..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/CompatibilityTestTest.java
+++ /dev/null
@@ -1,324 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.config.OptionSetter;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-import com.android.tradefed.log.ITestLogger;
-import com.android.tradefed.result.ByteArrayInputStreamSource;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.InputStreamSource;
-import com.android.tradefed.result.LogDataType;
-import com.android.tradefed.suite.checker.ISystemStatusChecker;
-import com.android.tradefed.suite.checker.StatusCheckerResult;
-import com.android.tradefed.suite.checker.StatusCheckerResult.CheckStatus;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.util.AbiUtils;
-
-import junit.framework.TestCase;
-
-import org.easymock.EasyMock;
-
-import java.util.ArrayList;
-import java.util.HashSet;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Set;
-
-/**
- * Test class for {@link CompatibilityTest}
- */
-public class CompatibilityTestTest extends TestCase {
-
-    private static final String FAKE_HOST_ARCH = "arm";
-    private CompatibilityTest mTest;
-    private ITestDevice mMockDevice;
-    private ITestLogger mMockLogger;
-    private ITestInvocationListener mMockListener;
-
-    @Override
-    public void setUp() throws Exception {
-        mTest = new CompatibilityTest() {
-            @Override
-            protected Set<String> getAbisForBuildTargetArch() {
-                return AbiUtils.getAbisForArch(FAKE_HOST_ARCH);
-            }
-        };
-        mMockDevice = EasyMock.createMock(ITestDevice.class);
-        mTest.setDevice(mMockDevice);
-        mMockLogger = EasyMock.createMock(ITestLogger.class);
-        mMockListener = EasyMock.createMock(ITestInvocationListener.class);
-    }
-
-    /**
-     * Test that {@link CompatibilityTest#getAbis()} is returning a proper intersection of CTS
-     * supported architectures and Device supported architectures.
-     */
-    public void testGetAbis() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.product.cpu.abilist")))
-                .andReturn("arm64-v8a,armeabi-v7a,armeabi");
-        Set<String> expectedAbis = new HashSet<>();
-        expectedAbis.add("arm64-v8a");
-        expectedAbis.add("armeabi-v7a");
-        EasyMock.replay(mMockDevice);
-        Set<IAbi> res = mTest.getAbis();
-        assertEquals(2, res.size());
-        for (IAbi abi : res) {
-            assertTrue(expectedAbis.contains(abi.getName()));
-        }
-        EasyMock.verify(mMockDevice);
-    }
-
-    /**
-     * Test that {@link CompatibilityTest#getAbis()} is throwing an exception when none of the
-     * CTS build supported abi match the device abi.
-     */
-    public void testGetAbis_notSupported() throws DeviceNotAvailableException {
-        EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.product.cpu.abilist")))
-                .andReturn("armeabi");
-        EasyMock.replay(mMockDevice);
-        try {
-            mTest.getAbis();
-            fail("Should have thrown an exception");
-        } catch (IllegalArgumentException e) {
-            assertEquals("None of the abi supported by this CTS build ('[armeabi-v7a, arm64-v8a]')"
-                    + " are supported by the device ('[armeabi]').", e.getMessage());
-        }
-        EasyMock.verify(mMockDevice);
-    }
-
-    /**
-     * Test that {@link CompatibilityTest#getAbis()} is returning only the device primary abi.
-     */
-    public void testGetAbis_primaryAbiOnly() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue(CompatibilityTest.PRIMARY_ABI_RUN, "true");
-        EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.product.cpu.abi")))
-                .andReturn("arm64-v8a");
-        Set<String> expectedAbis = new HashSet<>();
-        expectedAbis.add("arm64-v8a");
-        EasyMock.replay(mMockDevice);
-        Set<IAbi> res = mTest.getAbis();
-        assertEquals(1, res.size());
-        for (IAbi abi : res) {
-            assertTrue(expectedAbis.contains(abi.getName()));
-        }
-        EasyMock.verify(mMockDevice);
-    }
-
-    /**
-     * Test that {@link CompatibilityTest#getAbis()} is throwing an exception if the primary
-     * abi is not supported.
-     */
-    public void testGetAbis_primaryAbiOnly_NotSupported() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue(CompatibilityTest.PRIMARY_ABI_RUN, "true");
-        EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.product.cpu.abi")))
-                .andReturn("armeabi");
-        EasyMock.replay(mMockDevice);
-        try {
-            mTest.getAbis();
-            fail("Should have thrown an exception");
-        } catch (IllegalArgumentException e) {
-            assertEquals("Your CTS hasn't been built with abi 'armeabi' support, "
-                    + "this CTS currently supports '[armeabi-v7a, arm64-v8a]'.", e.getMessage());
-        }
-        EasyMock.verify(mMockDevice);
-    }
-
-    /**
-     * Test that {@link CompatibilityTest#getAbis()} is returning the list of abi supported by
-     * Compatibility and the device, and not the particular CTS build.
-     */
-    public void testGetAbis_skipCtsArchCheck() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue(CompatibilityTest.SKIP_HOST_ARCH_CHECK, "true");
-        EasyMock.expect(mMockDevice.getProperty(EasyMock.eq("ro.product.cpu.abilist")))
-                .andReturn("x86_64,x86,armeabi");
-        Set<String> expectedAbis = new HashSet<>();
-        expectedAbis.add("x86_64");
-        expectedAbis.add("x86");
-        EasyMock.replay(mMockDevice);
-        Set<IAbi> res = mTest.getAbis();
-        assertEquals(2, res.size());
-        for (IAbi abi : res) {
-            assertTrue(expectedAbis.contains(abi.getName()));
-        }
-        EasyMock.verify(mMockDevice);
-    }
-
-    /**
-     * Test {@link CompatibilityTest#getAbis()} when we skip the Cts side architecture check and
-     * want to run x86 abi.
-     */
-    public void testGetAbis_skipCtsArchCheck_abiSpecified() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue(CompatibilityTest.SKIP_HOST_ARCH_CHECK, "true");
-        setter.setOptionValue(CompatibilityTest.ABI_OPTION, "x86");
-        Set<String> expectedAbis = new HashSet<>();
-        expectedAbis.add("x86");
-        EasyMock.replay(mMockDevice);
-        Set<IAbi> res = mTest.getAbis();
-        assertEquals(1, res.size());
-        for (IAbi abi : res) {
-            assertTrue(expectedAbis.contains(abi.getName()));
-        }
-        EasyMock.verify(mMockDevice);
-    }
-
-    /**
-     * Test {@link CompatibilityTest#split()} when a shard number is specified.
-     */
-    public void testSplit() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("shards", "4");
-        assertEquals(4, mTest.split().size());
-    }
-
-    /**
-     * Test {@link CompatibilityTest#split()} when no shard number is specified.
-     */
-    public void testSplit_notShardable() throws Exception {
-        assertNull(mTest.split());
-    }
-
-    /**
-     * Test {@link CompatibilityTest#runPreModuleCheck(String, List, ITestDevice, ITestLogger)}
-     * is successful when no system checker fails.
-     */
-    public void testRunPreModuleCheck() throws Exception {
-        List<ISystemStatusChecker> systemCheckers = new ArrayList<>();
-        // add 2 inop status checkers.
-        systemCheckers.add(new ISystemStatusChecker() {});
-        systemCheckers.add(new ISystemStatusChecker() {});
-        EasyMock.replay(mMockDevice, mMockLogger);
-        mTest.runPreModuleCheck("FAKE_MODULE", systemCheckers, mMockDevice, mMockLogger);
-        EasyMock.verify(mMockDevice, mMockLogger);
-    }
-
-    /**
-     * Test {@link CompatibilityTest#runPreModuleCheck(String, List, ITestDevice, ITestLogger)}
-     * is failing and log the failure.
-     */
-    public void testRunPreModuleCheck_failure() throws Exception {
-        List<ISystemStatusChecker> systemCheckers = new ArrayList<>();
-        // add 2 inop status checkers.
-        systemCheckers.add(new ISystemStatusChecker() {});
-        systemCheckers.add(new ISystemStatusChecker() {
-            @Override
-            public StatusCheckerResult preExecutionCheck(ITestDevice device) {
-                // fails
-                return new StatusCheckerResult(CheckStatus.FAILED);
-            }
-        });
-        InputStreamSource res = new ByteArrayInputStreamSource("fake bugreport".getBytes());
-        EasyMock.expect(mMockDevice.getBugreport()).andReturn(res);
-        mMockLogger.testLog(EasyMock.eq("bugreport-checker-pre-module-FAKE_MODULE"),
-                EasyMock.eq(LogDataType.BUGREPORT),
-                EasyMock.same(res));
-        EasyMock.replay(mMockDevice, mMockLogger);
-        mTest.runPreModuleCheck("FAKE_MODULE", systemCheckers, mMockDevice, mMockLogger);
-        EasyMock.verify(mMockDevice, mMockLogger);
-    }
-
-    /**
-     * Test {@link CompatibilityTest#runPostModuleCheck(String, List, ITestDevice, ITestLogger)}
-     * is successful when no system checker fails.
-     */
-    public void testRunPostModuleCheck() throws Exception {
-        List<ISystemStatusChecker> systemCheckers = new ArrayList<>();
-        // add 2 inop status checkers.
-        systemCheckers.add(new ISystemStatusChecker() {});
-        systemCheckers.add(new ISystemStatusChecker() {});
-        EasyMock.replay(mMockDevice, mMockLogger);
-        mTest.runPostModuleCheck("FAKE_MODULE", systemCheckers, mMockDevice, mMockLogger);
-        EasyMock.verify(mMockDevice, mMockLogger);
-    }
-
-    /**
-     * Test {@link CompatibilityTest#runPreModuleCheck(String, List, ITestDevice, ITestLogger)}
-     * is failing and log the failure.
-     */
-    public void testRunPostModuleCheck_failure() throws Exception {
-        List<ISystemStatusChecker> systemCheckers = new ArrayList<>();
-        // add 2 inop status checkers.
-        systemCheckers.add(new ISystemStatusChecker() {});
-        systemCheckers.add(new ISystemStatusChecker() {
-            @Override
-            public StatusCheckerResult postExecutionCheck(ITestDevice device) {
-                // fails
-                return new StatusCheckerResult(CheckStatus.FAILED);
-            }
-        });
-        InputStreamSource res = new ByteArrayInputStreamSource("fake bugreport".getBytes());
-        EasyMock.expect(mMockDevice.getBugreport()).andReturn(res);
-        mMockLogger.testLog(EasyMock.eq("bugreport-checker-post-module-FAKE_MODULE"),
-                EasyMock.eq(LogDataType.BUGREPORT),
-                EasyMock.same(res));
-        EasyMock.replay(mMockDevice, mMockLogger);
-        mTest.runPostModuleCheck("FAKE_MODULE", systemCheckers, mMockDevice, mMockLogger);
-        EasyMock.verify(mMockDevice, mMockLogger);
-    }
-
-    /**
-     * Test {@link CompatibilityTest#run(ITestInvocationListener)} returns with no further
-     * execution when there is no module to run.
-     */
-    public void testRun_noModules() throws Exception {
-        mTest = new CompatibilityTest(1, new ModuleRepo() {
-            @Override
-            public boolean isInitialized() {
-                return true;
-            }
-            @Override
-            public LinkedList<IModuleDef> getModules(String serial, int shardIndex) {
-                return new LinkedList<IModuleDef>();
-            }
-        }, 0);
-        mTest.setDevice(mMockDevice);
-        EasyMock.expect(mMockDevice.getSerialNumber()).andReturn("FAKE_SERIAL").times(2);
-        EasyMock.replay(mMockDevice, mMockListener);
-        mTest.run(mMockListener);
-        EasyMock.verify(mMockDevice, mMockListener);
-    }
-
-    /**
-     * Test {@link CompatibilityTest#checkSystemStatusBlackAndWhiteList()} correctly throws
-     * if a system status is invalid.
-     */
-    public void testCheckSystemStatus_throw() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("system-status-check-whitelist", "com.does.not.exit");
-        try {
-            mTest.checkSystemStatusBlackAndWhiteList();
-            fail("should have thrown an exception");
-        } catch (RuntimeException expected) {
-            // expected.
-        }
-    }
-
-    /**
-     * Test {@link CompatibilityTest#checkSystemStatusBlackAndWhiteList()} does not throw
-     * if a system status is valid.
-     */
-    public void testCheckSystemStatus_pass() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("skip-system-status-check",
-                "com.android.tradefed.suite.checker.KeyguardStatusChecker");
-        mTest.checkSystemStatusBlackAndWhiteList();
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/JarHostTestTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/JarHostTestTest.java
deleted file mode 100644
index 66cef91..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/JarHostTestTest.java
+++ /dev/null
@@ -1,245 +0,0 @@
-/*
- * 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.compatibility.common.tradefed.testtype;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import com.android.tradefed.build.DeviceBuildInfo;
-import com.android.tradefed.config.OptionSetter;
-import com.android.tradefed.invoker.ExecutionFiles.FilesKey;
-import com.android.tradefed.invoker.TestInformation;
-import com.android.tradefed.log.LogUtil.CLog;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.testtype.DeviceJUnit4ClassRunner.TestMetrics;
-import com.android.tradefed.testtype.HostTest;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.util.FileUtil;
-import com.android.tradefed.util.proto.TfMetricProtoUtil;
-
-import org.easymock.EasyMock;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.JUnit4;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.net.MalformedURLException;
-import java.net.URL;
-import java.net.URLClassLoader;
-import java.util.Arrays;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Unit tests for {@link JarHostTest}.
- */
-@RunWith(JUnit4.class)
-public class JarHostTestTest {
-
-    private static final String TEST_JAR1 = "/testtype/testJar1.jar";
-    private JarHostTest mTest;
-    private DeviceBuildInfo mStubBuildInfo;
-    private TestInformation mTestInfo;
-    private File mTestDir = null;
-    private ITestInvocationListener mListener;
-
-    /**
-     * More testable version of {@link JarHostTest}
-     */
-    public static class JarHostTestable extends JarHostTest {
-
-        public static File mTestDir;
-        public JarHostTestable() {}
-
-        public JarHostTestable(File testDir) {
-            mTestDir = testDir;
-        }
-    }
-
-    @Before
-    public void setUp() throws Exception {
-        mTest = new JarHostTest();
-        mTestDir = FileUtil.createTempDir("jarhostest");
-        mListener = EasyMock.createMock(ITestInvocationListener.class);
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("enable-pretty-logs", "false");
-        mStubBuildInfo = new DeviceBuildInfo();
-        mStubBuildInfo.setTestsDir(mTestDir, "v1");
-        mTestInfo = TestInformation.newBuilder().build();
-        mTestInfo.executionFiles().put(FilesKey.TESTS_DIRECTORY, mTestDir);
-    }
-
-    @After
-    public void tearDown() throws Exception {
-        FileUtil.recursiveDelete(mTestDir);
-    }
-
-    /**
-     * Helper to read a file from the res/testtype directory and return it.
-     *
-     * @param filename the name of the file in the res/testtype directory
-     * @param parentDir dir where to put the jar. Null if in default tmp directory.
-     * @return the extracted jar file.
-     */
-    protected File getJarResource(String filename, File parentDir) throws IOException {
-        InputStream jarFileStream = getClass().getResourceAsStream(filename);
-        File jarFile = FileUtil.createTempFile("test", ".jar", parentDir);
-        FileUtil.writeToFile(jarFileStream, jarFile);
-        return jarFile;
-    }
-
-    /**
-     * Test class, we have to annotate with full org.junit.Test to avoid name collision in import.
-     */
-    @RunWith(JUnit4.class)
-    public static class Junit4TestClass  {
-        public Junit4TestClass() {}
-        @org.junit.Test
-        public void testPass1() {}
-    }
-
-    /**
-     * Test class, we have to annotate with full org.junit.Test to avoid name collision in import.
-     */
-    @RunWith(JUnit4.class)
-    public static class Junit4TestClass2  {
-        public Junit4TestClass2() {}
-        @Rule public TestMetrics metrics = new TestMetrics();
-
-        @org.junit.Test
-        public void testPass2() {
-            metrics.addTestMetric("key", "value");
-        }
-    }
-
-    /**
-     * Test that {@link JarHostTest#split()} inherited from {@link HostTest} is still good.
-     */
-    @Test
-    public void testSplit_withoutJar() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("class", "com.android.compatibility.common.tradefed.testtype."
-                + "JarHostTestTest$Junit4TestClass");
-        setter.setOptionValue("class", "com.android.compatibility.common.tradefed.testtype."
-                + "JarHostTestTest$Junit4TestClass2");
-        // sharCount is ignored; will split by number of classes
-        List<IRemoteTest> res = (List<IRemoteTest>) mTest.split(1, mTestInfo);
-        assertEquals(2, res.size());
-        assertTrue(res.get(0) instanceof JarHostTest);
-        assertTrue(res.get(1) instanceof JarHostTest);
-    }
-
-    /**
-     * Test that {@link JarHostTest#split()} can split classes coming from a jar.
-     */
-    @Test
-    public void testSplit_withJar() throws Exception {
-        File testJar = getJarResource(TEST_JAR1, mTestDir);
-        mTest = new JarHostTestable(mTestDir);
-        mTest.setBuild(mStubBuildInfo);
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("enable-pretty-logs", "false");
-        setter.setOptionValue("jar", testJar.getName());
-        // sharCount is ignored; will split by number of classes
-        List<IRemoteTest> res = (List<IRemoteTest>) mTest.split(1, mTestInfo);
-        assertEquals(2, res.size());
-        assertTrue(res.get(0) instanceof JarHostTest);
-        assertEquals("[android.ui.cts.TaskSwitchingTest]",
-                ((JarHostTest)res.get(0)).getClassNames().toString());
-        assertTrue(res.get(1) instanceof JarHostTest);
-        assertEquals("[android.ui.cts.InstallTimeTest]",
-                ((JarHostTest)res.get(1)).getClassNames().toString());
-    }
-
-    /**
-     * Testable version of {@link JarHostTest} that allows adding jar to classpath for testing
-     * purpose.
-     */
-    public static class JarHostTestLoader extends JarHostTestable {
-
-        private static File mTestJar;
-
-        public JarHostTestLoader() {}
-
-        public JarHostTestLoader(File testDir, File jar) {
-            super(testDir);
-            mTestJar = jar;
-        }
-
-        @Override
-        protected ClassLoader getClassLoader() {
-            ClassLoader child = super.getClassLoader();
-            try {
-                child = new URLClassLoader(Arrays.asList(mTestJar.toURI().toURL())
-                        .toArray(new URL[]{}), super.getClassLoader());
-            } catch (MalformedURLException e) {
-                CLog.e(e);
-            }
-            return child;
-        }
-    }
-
-    /**
-     * If a jar file is not found, the countTest will fail but we still want to report a
-     * testRunStart and End pair for results.
-     */
-    @Test
-    public void testCountTestFails() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("jar", "thisjardoesnotexistatall.jar");
-        mListener.testRunStarted(EasyMock.anyObject(), EasyMock.eq(0));
-        mListener.testRunEnded(EasyMock.anyLong(), EasyMock.<HashMap<String, Metric>>anyObject());
-        EasyMock.replay(mListener);
-        try {
-            mTest.run(mTestInfo, mListener);
-            fail("Should have thrown an exception.");
-        } catch(RuntimeException expected) {
-            // expected
-        }
-        EasyMock.verify(mListener);
-    }
-
-    /**
-     * Test that metrics from tests in JarHost are reported and accounted for.
-     */
-    @Test
-    public void testJarHostMetrics() throws Exception {
-        OptionSetter setter = new OptionSetter(mTest);
-        setter.setOptionValue("class", "com.android.compatibility.common.tradefed.testtype."
-                + "JarHostTestTest$Junit4TestClass2");
-        mListener.testRunStarted(EasyMock.anyObject(), EasyMock.eq(1));
-        TestDescription tid = new TestDescription("com.android.compatibility.common.tradefed."
-                + "testtype.JarHostTestTest$Junit4TestClass2", "testPass2");
-        mListener.testStarted(EasyMock.eq(tid), EasyMock.anyLong());
-        Map<String, String> metrics = new HashMap<>();
-        metrics.put("key", "value");
-        mListener.testEnded(EasyMock.eq(tid), EasyMock.anyLong(),
-                EasyMock.eq(TfMetricProtoUtil.upgradeConvert(metrics)));
-        mListener.testRunEnded(EasyMock.anyLong(), EasyMock.<HashMap<String, Metric>>anyObject());
-        EasyMock.replay(mListener);
-        mTest.run(mTestInfo, mListener);
-        EasyMock.verify(mListener);
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleDefTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleDefTest.java
deleted file mode 100644
index d3cbaa2..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleDefTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.config.ConfigurationDescriptor;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.targetprep.ITargetPreparer;
-import com.android.tradefed.testtype.Abi;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IRuntimeHintProvider;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.ITestFilterReceiver;
-import com.android.tradefed.util.AbiUtils;
-
-import junit.framework.TestCase;
-
-import org.easymock.EasyMock;
-
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Set;
-
-public class ModuleDefTest extends TestCase {
-
-    private static final String NAME = "ModuleName";
-    private static final String ABI = "mips64";
-    private static final String ID = AbiUtils.createId(ABI, NAME);
-
-    public void testAccessors() throws Exception {
-        IAbi abi = new Abi(ABI, "");
-        MockRemoteTest mockTest = new MockRemoteTest();
-        IModuleDef def = new ModuleDef(NAME, abi, mockTest, new ArrayList<ITargetPreparer>(),
-                new ConfigurationDescriptor());
-        assertEquals("Incorrect ID", ID, def.getId());
-        assertEquals("Incorrect ABI", ABI, def.getAbi().getName());
-        assertEquals("Incorrect Name", NAME, def.getName());
-    }
-
-    public void testModuleFinisher() throws Exception {
-        IAbi abi = new Abi(ABI, "");
-        MockRemoteTest mockTest = new MockRemoteTest();
-        IModuleDef def = new ModuleDef(NAME, abi, mockTest,
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor());
-        ITestInvocationListener mockListener = EasyMock.createMock(ITestInvocationListener.class);
-        // listener should receive testRunStarted/testRunEnded events even for no-op run() method
-        mockListener.testRunStarted(ID, 0);
-        EasyMock.expectLastCall().once();
-        mockListener.testRunEnded(0, new HashMap<String, Metric>());
-        EasyMock.expectLastCall().once();
-        EasyMock.replay(mockListener);
-        def.run(mockListener);
-        EasyMock.verify(mockListener);
-    }
-
-    private class MockRemoteTest implements IRemoteTest, ITestFilterReceiver, IAbiReceiver,
-            IRuntimeHintProvider, ITestCollector {
-
-        private final List<String> mIncludeFilters = new ArrayList<>();
-        private final List<String> mExcludeFilters = new ArrayList<>();
-
-        @Override
-        public void addIncludeFilter(String filter) {
-            mIncludeFilters.add(filter);
-        }
-
-        @Override
-        public void addAllIncludeFilters(Set<String> filters) {
-            mIncludeFilters.addAll(filters);
-        }
-
-        @Override
-        public void clearIncludeFilters() {
-            mIncludeFilters.clear();
-        }
-
-        @Override
-        public Set<String> getIncludeFilters() {
-            return new HashSet<>(mIncludeFilters);
-        }
-
-        @Override
-        public void addExcludeFilter(String filter) {
-            mExcludeFilters.add(filter);
-        }
-
-        @Override
-        public void addAllExcludeFilters(Set<String> filters) {
-            mExcludeFilters.addAll(filters);
-        }
-
-        @Override
-        public void clearExcludeFilters() {
-            mExcludeFilters.clear();
-        }
-
-        @Override
-        public Set<String> getExcludeFilters() {
-            return new HashSet<>(mExcludeFilters);
-        }
-
-        @Override
-        public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-            // Do nothing
-        }
-
-        @Override
-        public void setAbi(IAbi abi) {
-            // Do nothing
-        }
-
-        @Override
-        public IAbi getAbi() {
-            return null;
-        }
-
-        @Override
-        public long getRuntimeHint() {
-            return 1L;
-        }
-
-        @Override
-        public void setCollectTestsOnly(boolean shouldCollectTest) {
-            // Do nothing
-        }
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java
deleted file mode 100644
index 9e9c540..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ModuleRepoTest.java
+++ /dev/null
@@ -1,806 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.compatibility.common.tradefed.testtype.ModuleRepo.ConfigFilter;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Configuration;
-import com.android.tradefed.config.ConfigurationDescriptor;
-import com.android.tradefed.config.IConfiguration;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.targetprep.ITargetPreparer;
-import com.android.tradefed.testtype.Abi;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IRuntimeHintProvider;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.ITestFilterReceiver;
-import com.android.tradefed.util.AbiUtils;
-import com.android.tradefed.util.FileUtil;
-import com.android.tradefed.util.MultiMap;
-
-import junit.framework.TestCase;
-
-import org.easymock.EasyMock;
-
-import java.io.File;
-import java.io.IOException;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Unit Tests for {@link ModuleRepo}
- */
-public class ModuleRepoTest extends TestCase {
-
-    private static final String TOKEN =
-            "<target_preparer class=\"com.android.compatibility.common.tradefed.targetprep.TokenRequirement\">\n"
-            + "<option name=\"token\" value=\"%s\" />\n"
-            + "</target_preparer>\n";
-    private static final String CONFIG =
-            "<configuration description=\"Auto Generated File\">\n" +
-            "%s" +
-            "<test class=\"com.android.compatibility.common.tradefed.testtype.%s\">\n" +
-            "<option name=\"module\" value=\"%s\" />" +
-            "</test>\n" +
-            "</configuration>";
-    private static final String FOOBAR_TOKEN = "foobar";
-    private static final String SERIAL1 = "abc";
-    private static final String SERIAL2 = "def";
-    private static final String SERIAL3 = "ghi";
-    private static final Set<String> SERIALS = new HashSet<>();
-    private static final Set<IAbi> ABIS = new LinkedHashSet<>();
-    private static final List<String> DEVICE_TOKENS = new ArrayList<>();
-    private static final List<String> TEST_ARGS= new ArrayList<>();
-    private static final List<String> MODULE_ARGS = new ArrayList<>();
-    private static final Set<String> INCLUDES = new HashSet<>();
-    private static final Set<String> EXCLUDES = new HashSet<>();
-    private static final MultiMap<String, String> METADATA_INCLUDES = new MultiMap<>();
-    private static final MultiMap<String, String> METADATA_EXCLUDES = new MultiMap<>();
-    private static final Set<String> FILES = new HashSet<>();
-    private static final String FILENAME = "%s.config";
-    private static final String ROOT_DIR_ATTR = "ROOT_DIR";
-    private static final String SUITE_NAME_ATTR = "SUITE_NAME";
-    private static final String START_TIME_MS_ATTR = "START_TIME_MS";
-    private static final String ABI_32 = "armeabi-v7a";
-    private static final String ABI_64 = "arm64-v8a";
-    private static final String MODULE_NAME_A = "FooModuleA";
-    private static final String MODULE_NAME_B = "FooModuleB";
-    private static final String MODULE_NAME_C = "FooModuleC";
-    private static final String NON_EXISTS_MODULE_NAME = "NonExistModule";
-    private static final String ID_A_32 = AbiUtils.createId(ABI_32, MODULE_NAME_A);
-    private static final String ID_A_64 = AbiUtils.createId(ABI_64, MODULE_NAME_A);
-    private static final String ID_B_32 = AbiUtils.createId(ABI_32, MODULE_NAME_B);
-    private static final String ID_B_64 = AbiUtils.createId(ABI_64, MODULE_NAME_B);
-    private static final String ID_C_32 = AbiUtils.createId(ABI_32, MODULE_NAME_C);
-    private static final String ID_C_64 = AbiUtils.createId(ABI_64, MODULE_NAME_C);
-    private static final String TEST_ARG = TestStub.class.getName() + ":foo:bar";
-    private static final String MODULE_ARG = "%s:blah:foobar";
-    private static final String TEST_STUB = "TestStub"; // Trivial test stub
-    private static final String SHARDABLE_TEST_STUB = "ShardableTestStub"; // Shardable and IBuildReceiver
-    private static final String [] EXPECTED_MODULE_IDS = new String[] {
-        "arm64-v8a FooModuleB",
-        "arm64-v8a FooModuleC",
-        "armeabi-v7a FooModuleA",
-        "arm64-v8a FooModuleA",
-        "armeabi-v7a FooModuleC",
-        "armeabi-v7a FooModuleB"
-    };
-
-    static {
-        SERIALS.add(SERIAL1);
-        SERIALS.add(SERIAL2);
-        SERIALS.add(SERIAL3);
-        ABIS.add(new Abi(ABI_32, "32"));
-        ABIS.add(new Abi(ABI_64, "64"));
-        DEVICE_TOKENS.add(String.format("%s:%s", SERIAL3, FOOBAR_TOKEN));
-        TEST_ARGS.add(TEST_ARG);
-        MODULE_ARGS.add(String.format(MODULE_ARG, MODULE_NAME_A));
-        MODULE_ARGS.add(String.format(MODULE_ARG, MODULE_NAME_B));
-        MODULE_ARGS.add(String.format(MODULE_ARG, MODULE_NAME_C));
-        FILES.add(String.format(FILENAME, MODULE_NAME_A));
-        FILES.add(String.format(FILENAME, MODULE_NAME_B));
-        FILES.add(String.format(FILENAME, MODULE_NAME_C));
-    }
-    private ModuleRepo mRepo;
-    private File mTestsDir;
-    private File mRootDir;
-    private IBuildInfo mMockBuildInfo;
-
-    @Override
-    public void setUp() throws Exception {
-        mTestsDir = setUpConfigs();
-        mRepo = new ModuleRepo();
-        mMockBuildInfo = EasyMock.createMock(IBuildInfo.class);
-        // Flesh out the result directory structure so ModuleRepo can write to the test runs file
-        mRootDir = FileUtil.createTempDir("root");
-        File subRootDir = new File(mRootDir, String.format("android-suite"));
-        File resultsDir = new File(subRootDir, "results");
-        File resultDir = new File(resultsDir, CompatibilityBuildHelper.getDirSuffix(0));
-        resultDir.mkdirs();
-
-        Map<String, String> mockBuildInfoMap = new HashMap<String, String>();
-        mockBuildInfoMap.put(ROOT_DIR_ATTR, mRootDir.getAbsolutePath());
-        mockBuildInfoMap.put(SUITE_NAME_ATTR, "suite");
-        mockBuildInfoMap.put(START_TIME_MS_ATTR, Long.toString(0));
-        EasyMock.expect(mMockBuildInfo.getBuildAttributes()).andReturn(mockBuildInfoMap).anyTimes();
-        EasyMock.replay(mMockBuildInfo);
-    }
-
-    private File setUpConfigs() throws IOException {
-        File testsDir = FileUtil.createTempDir("testcases");
-        createConfig(testsDir, MODULE_NAME_A, null);
-        createConfig(testsDir, MODULE_NAME_B, null);
-        createConfig(testsDir, MODULE_NAME_C, FOOBAR_TOKEN);
-        return testsDir;
-    }
-
-    private void createConfig(File testsDir, String name, String token) throws IOException {
-        createConfig(testsDir, name, token, TEST_STUB);
-    }
-
-    private void createConfig(File testsDir, String name, String token, String moduleClass)
-            throws IOException {
-        File config = new File(testsDir, String.format(FILENAME, name));
-        if (!config.createNewFile()) {
-            throw new IOException(String.format("Failed to create '%s'", config.getAbsolutePath()));
-        }
-        String preparer = "";
-        if (token != null) {
-            preparer = String.format(TOKEN, token);
-        }
-        FileUtil.writeToFile(String.format(CONFIG, preparer, moduleClass, name), config);
-    }
-
-    @Override
-    public void tearDown() throws Exception {
-        FileUtil.recursiveDelete(mTestsDir);
-        tearDownConfigs(mTestsDir);
-        tearDownConfigs(mRootDir);
-    }
-
-    private void tearDownConfigs(File testsDir) {
-        FileUtil.recursiveDelete(testsDir);
-    }
-
-    public void testInitialization() throws Exception {
-        mRepo.initialize(3, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES,
-                EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        assertTrue("Should be initialized", mRepo.isInitialized());
-        assertEquals("Wrong number of shards", 3, mRepo.getNumberOfShards());
-        Map<String, Set<String>> deviceTokens = mRepo.getDeviceTokens();
-        assertEquals("Wrong number of devices with tokens", 1, deviceTokens.size());
-        Set<String> tokens = deviceTokens.get(SERIAL3);
-        assertEquals("Wrong number of tokens", 1, tokens.size());
-        assertTrue("Unexpected device token", tokens.contains(FOOBAR_TOKEN));
-        assertEquals("Wrong number of modules", 4, mRepo.getNonTokenModules().size());
-        List<IModuleDef> tokenModules = mRepo.getTokenModules();
-        assertEquals("Wrong number of modules with tokens", 2, tokenModules.size());
-    }
-
-    public void testGetModules() throws Exception {
-        mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES,
-                EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        assertTrue("Should be initialized", mRepo.isInitialized());
-        assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size());
-        assertEquals("Wrong number of tokens", 4, mRepo.getNonTokenModules().size());
-    }
-
-    /**
-     * Test sharding with 2 shards of the 4 non token modules.
-     */
-    public void testGetModulesSharded() throws Exception {
-        mRepo.initialize(2, null, mTestsDir, ABIS, new ArrayList<String>(), TEST_ARGS, MODULE_ARGS,
-                INCLUDES, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        assertTrue("Should be initialized", mRepo.isInitialized());
-        assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size());
-        assertEquals("Wrong number of tokens", 4, mRepo.getNonTokenModules().size());
-        List<IModuleDef> shard1 = mRepo.getModules(SERIAL1, 0);
-        assertEquals(2, shard1.size());
-        assertEquals("armeabi-v7a FooModuleA", shard1.get(0).getId());
-        assertEquals("arm64-v8a FooModuleA", shard1.get(1).getId());
-        List<IModuleDef> shard2 = mRepo.getModules(SERIAL2, 1);
-        // last shard gets the token modules too
-        assertEquals(4, shard2.size());
-        assertEquals("armeabi-v7a FooModuleB", shard2.get(0).getId());
-        assertEquals("arm64-v8a FooModuleB", shard2.get(1).getId());
-    }
-
-    /**
-     * Test running with only token modules.
-     */
-    public void testGetModules_onlyTokenModules() throws Exception {
-        Set<String> includes = new HashSet<>();
-        includes.add(MODULE_NAME_C);
-        mRepo.initialize(1, null, mTestsDir, ABIS, new ArrayList<String>(), TEST_ARGS, MODULE_ARGS,
-                includes, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        assertTrue("Should be initialized", mRepo.isInitialized());
-        assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size());
-        assertEquals("Wrong number of tokens", 0, mRepo.getNonTokenModules().size());
-        List<IModuleDef> modules = mRepo.getModules(SERIAL1, 0);
-        assertNotNull(modules);
-        assertEquals(2, modules.size());
-    }
-
-    /**
-     * Test running with only token modules, with sharded local run, we specify a token module
-     * for each device, tests should go in the right place.
-     */
-    public void testGetModules_TokenModules_multiDevices() throws Exception {
-        createConfig(mTestsDir, "FooModuleD", "foobar2");
-        Set<String> includes = new HashSet<>();
-        includes.add(MODULE_NAME_C);
-        includes.add("FooModuleD");
-        List<String> tokens = new ArrayList<>();
-        tokens.add(String.format("%s:%s", SERIAL1, FOOBAR_TOKEN));
-        tokens.add(String.format("%s:%s", SERIAL2, "foobar2"));
-        mRepo.initialize(2, null, mTestsDir, ABIS, tokens, TEST_ARGS, MODULE_ARGS,
-                includes, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        assertTrue("Should be initialized", mRepo.isInitialized());
-        assertEquals("Wrong number of tokens", 4, mRepo.getTokenModules().size());
-        assertEquals("Wrong number of tokens", 0, mRepo.getNonTokenModules().size());
-        List<IModuleDef> modules1 = mRepo.getModules(SERIAL1, 0);
-        assertNotNull(modules1);
-        assertEquals(2, modules1.size());
-        // Only module C tokens with serial 1.
-        assertTrue(modules1.get(0).getId().contains(MODULE_NAME_C));
-        assertTrue(modules1.get(1).getId().contains(MODULE_NAME_C));
-        List<IModuleDef> modules2 = mRepo.getModules(SERIAL2, 1);
-        assertNotNull(modules2);
-        assertEquals(2, modules2.size());
-        assertTrue(modules2.get(0).getId().contains("FooModuleD"));
-        assertTrue(modules2.get(1).getId().contains("FooModuleD"));
-    }
-
-    /**
-     * Test sharding with 4 shards of the 6 non token modules + 2 token modules.
-     */
-    public void testGetModulesSharded_uneven() throws Exception {
-        createConfig(mTestsDir, "FooModuleD", null);
-        mRepo.initialize(4, null, mTestsDir, ABIS, new ArrayList<String>(), TEST_ARGS, MODULE_ARGS,
-                INCLUDES, EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        assertTrue("Should be initialized", mRepo.isInitialized());
-        assertEquals("Wrong number of tokens", 2, mRepo.getTokenModules().size());
-        assertEquals("Wrong number of tokens", 6, mRepo.getNonTokenModules().size());
-
-        List<IModuleDef> shard1 = mRepo.getModules(SERIAL1, 0);
-        assertEquals(1, shard1.size());
-        assertEquals("armeabi-v7a FooModuleA", shard1.get(0).getId());
-
-        List<IModuleDef> shard2 = mRepo.getModules(SERIAL2, 1);
-        assertEquals(1, shard2.size());
-        assertEquals("arm64-v8a FooModuleA", shard2.get(0).getId());
-
-        List<IModuleDef> shard3 = mRepo.getModules(SERIAL3, 2);
-        assertEquals(2, shard3.size());
-        assertEquals("armeabi-v7a FooModuleB", shard3.get(0).getId());
-        assertEquals("arm64-v8a FooModuleB", shard3.get(1).getId());
-
-        List<IModuleDef> shard4 = mRepo.getModules(SERIAL2, 3);
-        assertEquals(4, shard4.size());
-        assertEquals("armeabi-v7a FooModuleC", shard4.get(0).getId());
-        assertEquals("arm64-v8a FooModuleC", shard4.get(1).getId());
-        assertEquals("armeabi-v7a FooModuleD", shard4.get(2).getId());
-        assertEquals("arm64-v8a FooModuleD", shard4.get(3).getId());
-    }
-
-    public void testConfigFilter() throws Exception {
-        File[] configFiles = mTestsDir.listFiles(new ConfigFilter());
-        assertEquals("Wrong number of config files found.", 3, configFiles.length);
-        for (File file : configFiles) {
-            assertTrue(String.format("Unrecognised file: %s", file.getAbsolutePath()),
-                    FILES.contains(file.getName()));
-        }
-    }
-
-    public void testFiltering() throws Exception {
-        Set<String> includeFilters = new HashSet<>();
-        includeFilters.add(MODULE_NAME_A);
-        Set<String> excludeFilters = new HashSet<>();
-        excludeFilters.add(ID_A_32);
-        excludeFilters.add(MODULE_NAME_B);
-        mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS,
-                includeFilters, excludeFilters, METADATA_INCLUDES, METADATA_EXCLUDES,
-                mMockBuildInfo);
-        List<IModuleDef> modules = mRepo.getModules(SERIAL1, 0);
-        assertEquals("Incorrect number of modules", 1, modules.size());
-        IModuleDef module = modules.get(0);
-        assertEquals("Incorrect ID", ID_A_64, module.getId());
-        checkArgs(module);
-    }
-
-    /** Test that excluded module shouldn't be loaded. */
-    public void testInitialization_ExcludeModule_SkipLoadingConfig() throws Exception {
-        Set<String> excludeFilters = new HashSet<String>();
-        excludeFilters.add(NON_EXISTS_MODULE_NAME);
-        mRepo.initialize(
-                1,
-                null,
-                mTestsDir,
-                ABIS,
-                DEVICE_TOKENS,
-                TEST_ARGS,
-                MODULE_ARGS,
-                Collections.emptySet(),
-                excludeFilters,
-                METADATA_INCLUDES,
-                METADATA_EXCLUDES,
-                mMockBuildInfo);
-    }
-
-    /**
-     * Test that {@link ModuleRepo#getModules(String, int)} handles well all module being filtered.
-     */
-    public void testFiltering_empty() throws Exception {
-        Set<String> includeFilters = new HashSet<>();
-        Set<String> excludeFilters = new HashSet<>();
-        excludeFilters.add(MODULE_NAME_A);
-        excludeFilters.add(MODULE_NAME_B);
-        excludeFilters.add(MODULE_NAME_C);
-        mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS,
-                includeFilters, excludeFilters,
-                METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        List<IModuleDef> modules = mRepo.getModules(SERIAL1, 0);
-        assertEquals("Incorrect number of modules", 0, modules.size());
-    }
-
-    public void testParsing() throws Exception {
-        mRepo.initialize(1, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES,
-                EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        List<IModuleDef> modules = mRepo.getModules(SERIAL3, 0);
-        Set<String> idSet = new HashSet<>();
-        for (IModuleDef module : modules) {
-            idSet.add(module.getId());
-        }
-        assertEquals("Incorrect number of IDs", 6, idSet.size());
-        assertTrue("Missing ID_A_32", idSet.contains(ID_A_32));
-        assertTrue("Missing ID_A_64", idSet.contains(ID_A_64));
-        assertTrue("Missing ID_B_32", idSet.contains(ID_B_32));
-        assertTrue("Missing ID_B_64", idSet.contains(ID_B_64));
-        assertTrue("Missing ID_C_32", idSet.contains(ID_C_32));
-        assertTrue("Missing ID_C_64", idSet.contains(ID_C_64));
-        for (IModuleDef module : modules) {
-            checkArgs(module);
-        }
-    }
-
-    private void checkArgs(IModuleDef module) {
-        IRemoteTest test = module.getTest();
-        assertTrue("Incorrect test type", test instanceof TestStub);
-        TestStub stub = (TestStub) test;
-        assertEquals("Incorrect test arg", "bar", stub.mFoo);
-        assertEquals("Incorrect module arg", "foobar", stub.mBlah);
-    }
-
-    public void testGetModuleIds() {
-        mRepo.initialize(3, null, mTestsDir, ABIS, DEVICE_TOKENS, TEST_ARGS, MODULE_ARGS, INCLUDES,
-                EXCLUDES, METADATA_INCLUDES, METADATA_EXCLUDES, mMockBuildInfo);
-        assertTrue("Should be initialized", mRepo.isInitialized());
-
-        assertArrayEquals(EXPECTED_MODULE_IDS, mRepo.getModuleIds());
-    }
-
-    private void assertArrayEquals(Object[] expected, Object[] actual) {
-        assertEquals(Arrays.asList(expected), Arrays.asList(actual));
-    }
-
-    /**
-     * Test class to provide runtimeHint.
-     */
-    private class TestRuntime implements IRemoteTest, IRuntimeHintProvider, IAbiReceiver,
-            ITestCollector, ITestFilterReceiver {
-        public long runtimeHint = 0l;
-        @Override
-        public long getRuntimeHint() {
-            return runtimeHint;
-        }
-        // ignore all the other calls
-        @Override
-        public void run(ITestInvocationListener arg0) throws DeviceNotAvailableException {}
-        @Override
-        public void addAllExcludeFilters(Set<String> arg0) {}
-        @Override
-        public void addAllIncludeFilters(Set<String> arg0) {}
-        @Override
-        public void addExcludeFilter(String arg0) {}
-        @Override
-        public void addIncludeFilter(String arg0) {}
-        @Override
-        public void setCollectTestsOnly(boolean arg0) {}
-        @Override
-        public void setAbi(IAbi arg0) {}
-        @Override
-        public IAbi getAbi() {return null;}
-        @Override
-        public Set<String> getIncludeFilters() {
-            return null;
-        }
-        @Override
-        public Set<String> getExcludeFilters() {
-            return null;
-        }
-        @Override
-        public void clearIncludeFilters() {}
-        @Override
-        public void clearExcludeFilters() {}
-    }
-
-    /**
-     * Balance the load of runtime of the modules for the same runtimehint everywhere.
-     */
-    public void testGetshard_allSameRuntime() throws Exception {
-        List<IModuleDef> testList = new ArrayList<>();
-        TestRuntime test1 = new TestRuntime();
-        test1.runtimeHint = 100l;
-        IModuleDef mod1 = new ModuleDef("test1", new Abi("arm", "32"), test1,
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor());
-        testList.add(mod1);
-        TestRuntime test2 = new TestRuntime();
-        test2.runtimeHint = 100l;
-        IModuleDef mod2 = new ModuleDef("test2", new Abi("arm", "32"), test2,
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor());
-        testList.add(mod2);
-        TestRuntime test3 = new TestRuntime();
-        test3.runtimeHint = 100l;
-        IModuleDef mod3 = new ModuleDef("test3", new Abi("arm", "32"), test3,
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor());
-        testList.add(mod3);
-        TestRuntime test4 = new TestRuntime();
-        test4.runtimeHint = 100l;
-        IModuleDef mod4 = new ModuleDef("test4", new Abi("arm", "32"), test4,
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor());
-        testList.add(mod4);
-        // if we don't shard everything is in one shard.
-        List<IModuleDef> res = mRepo.getShard(testList, 0, 1);
-        assertEquals(4, res.size());
-        res = mRepo.getShard(testList, 0, 2);
-        assertEquals(2, res.size());
-        assertEquals(mod1, res.get(0));
-        assertEquals(mod2, res.get(1));
-        res = mRepo.getShard(testList, 1, 2);
-        assertEquals(2, res.size());
-        assertEquals(mod3, res.get(0));
-        assertEquals(mod4, res.get(1));
-    }
-
-    /**
-     * When reaching splitting time, we need to ensure that even after best effort, if we cannot
-     * split into the requested number of shardIndex, we simply return null to report an empty
-     * shard.
-     */
-    public void testGetShard_cannotSplitMore() {
-        List<IModuleDef> testList = new ArrayList<>();
-        TestRuntime test1 = new TestRuntime();
-        test1.runtimeHint = 100l;
-        IModuleDef mod1 = new ModuleDef("test1", new Abi("arm", "32"), test1,
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor());
-        testList.add(mod1);
-        List<IModuleDef> res = mRepo.getShard(testList, 1, 2);
-        assertNull(res);
-    }
-
-    /**
-     * When there are no metadata based filters specified, config should be included
-     * @throws Exception
-     */
-    public void testMetadataFilter_emptyFilters() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        assertTrue("config not included when metadata filters are empty",
-                mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, METADATA_EXCLUDES));
-    }
-
-    /**
-     * When inclusion filter is specified, config matching the filter is included
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchInclude() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("component", "foo");
-        assertTrue("config not included with matching inclusion filter",
-                mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES));
-    }
-
-    /**
-     * When inclusion filter is specified, config not matching the filter is excluded
-     * @throws Exception
-     */
-    public void testMetadataFilter_noMatchInclude_mismatchValue() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("component", "bar");
-        assertFalse("config not excluded with mismatching inclusion filter",
-                mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES));
-    }
-
-    /**
-     * When inclusion filter is specified, config not matching the filter is excluded
-     * @throws Exception
-     */
-    public void testMetadataFilter_noMatchInclude_mismatchKey() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("group", "bar");
-        assertFalse("config not excluded with mismatching inclusion filter",
-                mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES));
-    }
-
-    /**
-     * When exclusion filter is specified, config matching the filter is excluded
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchExclude() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("component", "foo");
-        assertFalse("config not excluded with matching exclusion filter",
-                mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter));
-    }
-
-    /**
-     * When exclusion filter is specified, config not matching the filter is included
-     * @throws Exception
-     */
-    public void testMetadataFilter_noMatchExclude_mismatchKey() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("component", "bar");
-        assertTrue("config not included with mismatching exclusion filter",
-                mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter));
-    }
-
-    /**
-     * When exclusion filter is specified, config not matching the filter is included
-     * @throws Exception
-     */
-    public void testMetadataFilter_noMatchExclude_mismatchValue() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("group", "bar");
-        assertTrue("config not included with mismatching exclusion filter",
-                mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter));
-    }
-
-    /**
-     * When inclusion filter is specified, config with one of the metadata field matching the filter
-     * is included
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchInclude_multipleMetadataField() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        metadata.put("component", "bar");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("component", "foo");
-        assertTrue("config not included with matching inclusion filter",
-                mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES));
-    }
-
-    /**
-     * When exclusion filter is specified, config with one of the metadata field matching the filter
-     * is excluded
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchExclude_multipleMetadataField() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        metadata.put("component", "bar");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("component", "foo");
-        assertFalse("config not excluded with matching exclusion filter",
-                mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter));
-    }
-
-    /**
-     * When inclusion filters are specified, config with metadata field matching one of the filter
-     * is included
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchInclude_multipleFilters() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("component", "foo");
-        includeFilter.put("component", "bar");
-        assertTrue("config not included with matching inclusion filter",
-                mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES));
-    }
-
-    /**
-     * When exclusion filters are specified, config with metadata field matching one of the filter
-     * is excluded
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchExclude_multipleFilters() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("component", "foo");
-        excludeFilter.put("component", "bar");
-        assertFalse("config not excluded with matching exclusion filter",
-                mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter));
-    }
-
-    /**
-     * When inclusion filters are specified, config with metadata field matching one of the filter
-     * is included
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchInclude_multipleMetadataAndFilters() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo1");
-        metadata.put("group", "bar1");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("component", "foo1");
-        includeFilter.put("group", "bar2");
-        assertTrue("config not included with matching inclusion filter",
-                mRepo.filterByConfigMetadata(config, includeFilter, METADATA_EXCLUDES));
-    }
-
-    /**
-     * When exclusion filters are specified, config with metadata field matching one of the filter
-     * is excluded
-     * @throws Exception
-     */
-    public void testMetadataFilter_matchExclude_multipleMetadataAndFilters() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo1");
-        metadata.put("group", "bar1");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("component", "foo1");
-        excludeFilter.put("group", "bar2");
-        assertFalse("config not excluded with matching exclusion filter",
-                mRepo.filterByConfigMetadata(config, METADATA_INCLUDES, excludeFilter));
-    }
-
-    /**
-     * When inclusion and exclusion filters are both specified, config can pass through the filters
-     * as expected.
-     * @throws Exception
-     */
-    public void testMetadataFilter_includeAndExclude() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        metadata.put("group", "bar1");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("component", "foo");
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("group", "bar2");
-        assertTrue("config not included with matching inclusion and mismatching exclusion filters",
-                mRepo.filterByConfigMetadata(config, includeFilter, excludeFilter));
-    }
-
-    /**
-     * When inclusion and exclusion filters are both specified, config be excluded as specified
-     * @throws Exception
-     */
-    public void testMetadataFilter_includeThenExclude() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        ConfigurationDescriptor desc = config.getConfigurationDescription();
-        MultiMap<String, String> metadata = new MultiMap<>();
-        metadata.put("component", "foo");
-        metadata.put("group", "bar");
-        desc.setMetaData(metadata);
-        MultiMap<String, String> includeFilter = new MultiMap<>();
-        includeFilter.put("component", "foo");
-        MultiMap<String, String> excludeFilter = new MultiMap<>();
-        excludeFilter.put("group", "bar");
-        assertFalse("config not excluded with matching inclusion and exclusion filters",
-                mRepo.filterByConfigMetadata(config, includeFilter, excludeFilter));
-    }
-
-    public static class TestInject implements IRemoteTest {
-        @Option(name = "simple-string")
-        public String test = null;
-        @Option(name = "list-string")
-        public List<String> testList = new ArrayList<>();
-        @Option(name = "map-string")
-        public Map<String, String> testMap = new HashMap<>();
-
-        @Override
-        public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        }
-    }
-
-    /**
-     * Test that the different format for module-arg and test-arg can properly be passed to the
-     * configuration.
-     */
-    public void testInjectConfig() throws Exception {
-        IConfiguration config = new Configuration("foo", "bar");
-        TestInject checker = new TestInject();
-        config.setTest(checker);
-        Map<String, List<String>> optionMap = new HashMap<String, List<String>>();
-        List<String> option1 = new ArrayList<>();
-        option1.add("value1");
-        optionMap.put("simple-string", option1);
-
-        List<String> option2 = new ArrayList<>();
-        option2.add("value2");
-        option2.add("value3");
-        option2.add("set-option:moreoption");
-        optionMap.put("list-string", option2);
-
-        List<String> option3 = new ArrayList<>();
-        option3.add("set-option:=moreoption");
-        optionMap.put("map-string", option3);
-
-        mRepo.injectOptionsToConfig(optionMap, config);
-
-        assertEquals("value1", checker.test);
-        assertEquals(option2, checker.testList);
-        Map<String, String> resMap = new HashMap<>();
-        resMap.put("set-option", "moreoption");
-        assertEquals(resMap, checker.testMap);
-    }
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ShardableTestStub.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ShardableTestStub.java
deleted file mode 100644
index 293d0d2..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/ShardableTestStub.java
+++ /dev/null
@@ -1,132 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.Option;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IBuildReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IRuntimeHintProvider;
-import com.android.tradefed.testtype.IShardableTest;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.ITestFilterReceiver;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Set;
-
-public class ShardableTestStub implements IRemoteTest, IShardableTest, IBuildReceiver,
-        IAbiReceiver, IRuntimeHintProvider, ITestCollector, ITestFilterReceiver {
-
-    @Option(name = "module")
-    String mModule;
-    @Option(name = "foo")
-    String mFoo;
-    @Option(name = "blah")
-    String mBlah;
-
-    public IBuildInfo mBuildInfo = null;
-
-    Collection<IRemoteTest> mShards;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBuild(IBuildInfo buildInfo) {
-        mBuildInfo = buildInfo;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        // Do nothing
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Collection<IRemoteTest> split() {
-        mShards = new ArrayList<>();
-        for (int i = 0; i < 3; i++) {
-            mShards.add(new ShardableTestStub());
-        }
-        return mShards;
-    }
-
-    @Override
-    public void setAbi(IAbi abi) {
-        // Do nothing
-    }
-
-    @Override
-    public IAbi getAbi() {
-        return null;
-    }
-
-    @Override
-    public long getRuntimeHint() {
-        return 1L;
-    }
-
-    @Override
-    public void setCollectTestsOnly(boolean shouldCollectTest) {
-        // Do nothing
-    }
-
-    @Override
-    public void addIncludeFilter(String filter) {
-
-    }
-
-    @Override
-    public void addAllIncludeFilters(Set<String> filters) {
-
-    }
-
-    @Override
-    public void addExcludeFilter(String filter) {
-
-    }
-
-    @Override
-    public void addAllExcludeFilters(Set<String> filters) {
-
-    }
-
-    @Override
-    public Set<String> getIncludeFilters() {
-        return null;
-    }
-
-    @Override
-    public Set<String> getExcludeFilters() {
-        return null;
-    }
-
-    @Override
-    public void clearIncludeFilters() {}
-
-    @Override
-    public void clearExcludeFilters() {}
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/SimpleTestStub.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/SimpleTestStub.java
deleted file mode 100644
index effea21..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/SimpleTestStub.java
+++ /dev/null
@@ -1,112 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.config.Option;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IRuntimeHintProvider;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.ITestFilterReceiver;
-
-import java.util.HashMap;
-import java.util.Set;
-
-/**
- * A test Stub that can be used to fake some runs.
- */
-public class SimpleTestStub implements IRemoteTest, IAbiReceiver, IRuntimeHintProvider,
-        ITestCollector, ITestFilterReceiver {
-
-    // options below are unused
-    @Option(name = "report-test")
-    protected boolean mReportTest = false;
-    @Option(name = "run-complete")
-    protected boolean mIsComplete = true;
-    @Option(name = "test-fail")
-    protected boolean mDoesOneTestFail = true;
-    @Option(name = "internal-retry")
-    protected boolean mRetry = false;
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        // We report 1 passing tes
-        listener.testRunStarted("module-run", 1);
-        TestDescription tid = new TestDescription("TestStub", "test1");
-        listener.testStarted(tid);
-        listener.testEnded(tid, new HashMap<String, Metric>());
-        listener.testRunEnded(0, new HashMap<String, Metric>());
-    }
-
-    @Override
-    public void setAbi(IAbi abi) {
-        // Do nothing
-    }
-
-    @Override
-    public long getRuntimeHint() {
-        return 1L;
-    }
-
-    @Override
-    public void setCollectTestsOnly(boolean shouldCollectTest) {
-        // Do nothing
-    }
-
-    @Override
-    public void addIncludeFilter(String filter) {
-
-    }
-
-    @Override
-    public void addAllIncludeFilters(Set<String> filters) {
-
-    }
-
-    @Override
-    public void addExcludeFilter(String filter) {
-
-    }
-
-    @Override
-    public void addAllExcludeFilters(Set<String> filters) {
-
-    }
-
-    @Override
-    public Set<String> getIncludeFilters() {
-        return null;
-    }
-
-    @Override
-    public Set<String> getExcludeFilters() {
-        return null;
-    }
-
-    @Override
-    public void clearIncludeFilters() {}
-
-    @Override
-    public void clearExcludeFilters() {}
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/TestStub.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/TestStub.java
deleted file mode 100644
index f04a1be..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/testtype/TestStub.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.tradefed.testtype;
-
-import com.android.tradefed.config.Option;
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.metrics.proto.MetricMeasurement.Metric;
-import com.android.tradefed.result.ITestInvocationListener;
-import com.android.tradefed.result.TestDescription;
-import com.android.tradefed.testtype.IAbi;
-import com.android.tradefed.testtype.IAbiReceiver;
-import com.android.tradefed.testtype.IRemoteTest;
-import com.android.tradefed.testtype.IRuntimeHintProvider;
-import com.android.tradefed.testtype.ITestCollector;
-import com.android.tradefed.testtype.ITestFilterReceiver;
-
-import java.util.HashMap;
-import java.util.List;
-import java.util.Set;
-
-/**
- * A test Stub that can be used to fake some runs.
- */
-public class TestStub implements IRemoteTest, IAbiReceiver, IRuntimeHintProvider, ITestCollector,
-        ITestFilterReceiver {
-
-    @Option(name = "module")
-    private String mModule;
-    @Option(name = "foo")
-    protected String mFoo;
-    @Option(name = "blah")
-    protected String mBlah;
-    @Option(name = "report-test")
-    protected boolean mReportTest = false;
-    @Option(name = "run-complete")
-    protected boolean mIsComplete = true;
-    @Option(name = "test-fail")
-    protected boolean mDoesOneTestFail = true;
-    @Option(name = "internal-retry")
-    protected boolean mRetry = false;
-
-    protected List<TestDescription> mShardedTestToRun;
-    protected Integer mShardIndex = null;
-
-    /**
-     * Tests attempt.
-     */
-    private void testAttempt(ITestInvocationListener listener) {
-     // We report 3 tests: 2 pass, 1 failed
-        listener.testRunStarted("module-run", 3);
-        TestDescription tid = new TestDescription("TestStub", "test1");
-        listener.testStarted(tid);
-        listener.testEnded(tid, new HashMap<String, Metric>());
-
-        if (mIsComplete) {
-            // possibly skip this one to create some not_executed case.
-            TestDescription tid2 = new TestDescription("TestStub", "test2");
-            listener.testStarted(tid2);
-            listener.testEnded(tid2, new HashMap<String, Metric>());
-        }
-
-        TestDescription tid3 = new TestDescription("TestStub", "test3");
-        listener.testStarted(tid3);
-        if (mDoesOneTestFail) {
-            listener.testFailed(tid3, "ouch this is bad.");
-        }
-        listener.testEnded(tid3, new HashMap<String, Metric>());
-
-        listener.testRunEnded(0, new HashMap<String, Metric>());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void run(ITestInvocationListener listener) throws DeviceNotAvailableException {
-        if (mReportTest) {
-            if (mShardedTestToRun == null) {
-                if (!mRetry) {
-                    testAttempt(listener);
-                } else {
-                    // We fake an internal retry by calling testRunStart/Ended again.
-                    listener.testRunStarted("module-run", 3);
-                    listener.testRunEnded(0, new HashMap<String, Metric>());
-                    testAttempt(listener);
-                }
-            } else {
-                // Run the shard
-                if (mDoesOneTestFail) {
-                    listener.testRunStarted("module-run", mShardedTestToRun.size() + 1);
-                } else {
-                    listener.testRunStarted("module-run", mShardedTestToRun.size());
-                }
-
-                if (mIsComplete) {
-                    for (TestDescription tid : mShardedTestToRun) {
-                        listener.testStarted(tid);
-                        listener.testEnded(tid, new HashMap<String, Metric>());
-                    }
-                } else {
-                    TestDescription tid = mShardedTestToRun.get(0);
-                    listener.testStarted(tid);
-                    listener.testEnded(tid, new HashMap<String, Metric>());
-                }
-
-                if (mDoesOneTestFail) {
-                    TestDescription tid = new TestDescription("TestStub", "failed" + mShardIndex);
-                    listener.testStarted(tid);
-                    listener.testFailed(tid, "shard failed this one.");
-                    listener.testEnded(tid, new HashMap<String, Metric>());
-                }
-                listener.testRunEnded(0, new HashMap<String, Metric>());
-            }
-        }
-    }
-
-    @Override
-    public void setAbi(IAbi abi) {
-        // Do nothing
-    }
-
-    @Override
-    public IAbi getAbi() {
-        return null;
-    }
-
-    @Override
-    public long getRuntimeHint() {
-        return 1L;
-    }
-
-    @Override
-    public void setCollectTestsOnly(boolean shouldCollectTest) {
-        // Do nothing
-    }
-
-    @Override
-    public void addIncludeFilter(String filter) {
-
-    }
-
-    @Override
-    public void addAllIncludeFilters(Set<String> filters) {
-
-    }
-
-    @Override
-    public void addExcludeFilter(String filter) {
-
-    }
-
-    @Override
-    public void addAllExcludeFilters(Set<String> filters) {
-
-    }
-
-    @Override
-    public Set<String> getIncludeFilters() {
-        return null;
-    }
-
-    @Override
-    public Set<String> getExcludeFilters() {
-        return null;
-    }
-
-    @Override
-    public void clearIncludeFilters() {}
-
-    @Override
-    public void clearExcludeFilters() {}
-}
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/util/UniqueModuleCountUtilTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/util/UniqueModuleCountUtilTest.java
deleted file mode 100644
index 8e20133..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/util/UniqueModuleCountUtilTest.java
+++ /dev/null
@@ -1,84 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.compatibility.common.tradefed.util;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.compatibility.common.tradefed.testtype.IModuleDef;
-import com.android.compatibility.common.tradefed.testtype.ModuleDef;
-import com.android.compatibility.common.tradefed.testtype.TestStub;
-import com.android.tradefed.config.ConfigurationDescriptor;
-import com.android.tradefed.targetprep.ITargetPreparer;
-import com.android.tradefed.testtype.Abi;
-
-import org.junit.Test;
-
-import java.util.ArrayList;
-import java.util.List;
-
-/**
- * Unit tests for {@link UniqueModuleCountUtil}.
- */
-public class UniqueModuleCountUtilTest {
-
-    @Test
-    public void testCountEmptyList() {
-        List<IModuleDef> emptyList = new ArrayList<>();
-        assertEquals(0, UniqueModuleCountUtil.countUniqueModules(emptyList));
-    }
-
-    @Test
-    public void testCount_2uniquesModules() {
-        List<IModuleDef> list = new ArrayList<>();
-        list.add(new ModuleDef("moduleA", new Abi("arm64", "64"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleA", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        assertEquals(2, UniqueModuleCountUtil.countUniqueModules(list));
-    }
-
-    @Test
-    public void testCount_2subModules() {
-        List<IModuleDef> list = new ArrayList<>();
-        list.add(new ModuleDef("moduleA", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleA", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        assertEquals(1, UniqueModuleCountUtil.countUniqueModules(list));
-    }
-
-    @Test
-    public void testCount_mix() {
-        List<IModuleDef> list = new ArrayList<>();
-        list.add(new ModuleDef("moduleA", new Abi("arm64", "64"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleA", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleC", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleB", new Abi("arm64", "64"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleB", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleC", new Abi("arm64", "64"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleA", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        list.add(new ModuleDef("moduleC", new Abi("arm32", "32"), new TestStub(),
-                new ArrayList<ITargetPreparer>(), new ConfigurationDescriptor()));
-        assertEquals(6, UniqueModuleCountUtil.countUniqueModules(list));
-    }
-}
diff --git a/common/host-side/util/src/com/android/compatibility/common/util/CpuFeatures.java b/common/host-side/util/src/com/android/compatibility/common/util/CpuFeatures.java
index 896381a..1d67ee8 100644
--- a/common/host-side/util/src/com/android/compatibility/common/util/CpuFeatures.java
+++ b/common/host-side/util/src/com/android/compatibility/common/util/CpuFeatures.java
@@ -55,8 +55,40 @@
      * Return true if architecture is x86.
      */
     public static boolean isX86(ITestDevice device) throws DeviceNotAvailableException {
+        // Possible names: i386, i486, i686, x86_64.
+        return uname(device, UNAME_OPTION_MACHINE_TYPE).contains("86");
+    }
 
-        return uname(device, UNAME_OPTION_MACHINE_TYPE).contains("x86");
+    /* Return true if architecture is x86_64. */
+    public static boolean isX86_64(ITestDevice device) throws DeviceNotAvailableException {
+
+        return uname(device, UNAME_OPTION_MACHINE_TYPE).contains("x86_64");
+    }
+
+    /* Return true if architecture is 32-bit x86. */
+    public static boolean isX86_32(ITestDevice device) throws DeviceNotAvailableException {
+
+        return isX86(device) && !isX86_64(device);
+    }
+
+    /* Return true if ABI is native. */
+    public static boolean isNativeAbi(ITestDevice device, String abi)
+            throws DeviceNotAvailableException {
+      if (isArm32(device) && abi.equals("armeabi-v7a")) {
+          return true;
+      }
+      // Both armeabi-v7a and arm64-v8a are native.
+      if (isArm64(device) && abi.contains("arm")) {
+          return true;
+      }
+      if (isX86_32(device) && abi.equals("x86")) {
+          return true;
+      }
+      // Both x86 and x86_64 are native.
+      if (isX86_64(device) && abi.contains("x86")) {
+          return true;
+      }
+      return false;
     }
 
     /**
diff --git a/common/host-side/util/src/com/android/compatibility/common/util/ShellCommandUtil.java b/common/host-side/util/src/com/android/compatibility/common/util/ShellCommandUtil.java
deleted file mode 100644
index a62a9f5..0000000
--- a/common/host-side/util/src/com/android/compatibility/common/util/ShellCommandUtil.java
+++ /dev/null
@@ -1,30 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.compatibility.common.util;
-
-import com.android.tradefed.device.DeviceNotAvailableException;
-import com.android.tradefed.device.ITestDevice;
-
-/**
- * Device-side compatibility utility class for executing ADB shell commands.
- */
-public class ShellCommandUtil {
-
-    public static void execute(ITestDevice device, String command)
-            throws DeviceNotAvailableException {
-        device.executeShellCommand(command);
-    }
-}
diff --git a/common/util/Android.bp b/common/util/Android.bp
index bc46cdb..a8e2d12 100644
--- a/common/util/Android.bp
+++ b/common/util/Android.bp
@@ -12,31 +12,17 @@
 // See the License for the specific language governing permissions and
 // limitations under the License.
 
-// Build the common utility library for use device-side
-java_library_static {
-    name: "compatibility-common-util-devicesidelib",
-    sdk_version: "current",
-
-    srcs: ["src/**/*.java"],
-
-    static_libs: [
-        "guava",
-        "junit",
-    ],
-}
-
 // Build the common utility library for use host-side
 java_library_host {
     name: "compatibility-common-util-hostsidelib",
+    // Restrict visibility to only those targets that need to access it.
+    visibility: [
+         "//test/suite_harness/common/host-side/util",
+         "//test/suite_harness/common/util/tests"
+    ],
     defaults: ["cts_error_prone_rules"],
 
-    srcs: ["src/**/*.java"],
-
-    libs: [
-        "junit",
-	"guava",
-	"json-prebuilt",
-	"platform-test-annotations",
-	"kxml2-2.3.0",
+    static_libs: [
+       "compatibility-common-util-lib"
     ],
 }
diff --git a/common/util/src/com/android/compatibility/common/util/AbiUtils.java b/common/util/src/com/android/compatibility/common/util/AbiUtils.java
deleted file mode 100644
index c9c82b7..0000000
--- a/common/util/src/com/android/compatibility/common/util/AbiUtils.java
+++ /dev/null
@@ -1,61 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-/**
- * Utility class for handling device ABIs
- */
-public class AbiUtils {
-
-    /**
-     * Creates a unique id from the given ABI and name.
-     * @param abi The ABI to use.
-     * @param name The name to use.
-     * @return a string which uniquely identifies a run.
-     */
-    public static String createId(String abi, String name) {
-        return String.format("%s %s", abi, name);
-    }
-
-    /**
-     * @return the abi portion of the test id.
-     *         e.g. armeabi-v7a android.mytest = armeabi-v7a
-     */
-    public static String parseAbi(String id) {
-        return parseId(id)[0];
-    }
-
-    /**
-     * Parses a unique id into the ABI and name.
-     * @param id The id to parse.
-     * @return a string array containing the ABI and name.
-     */
-    public static String[] parseId(String id) {
-        if (id == null || !id.contains(" ")) {
-            return new String[] {"", ""};
-        }
-        return id.split(" ");
-    }
-
-    /**
-     * @return the test name portion of the test id.
-     *         e.g. armeabi-v7a android.mytest = android.mytest
-     */
-    public static String parseTestName(String id) {
-        return parseId(id)[1];
-    }
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/BackupUtils.java b/common/util/src/com/android/compatibility/common/util/BackupUtils.java
deleted file mode 100644
index c636427..0000000
--- a/common/util/src/com/android/compatibility/common/util/BackupUtils.java
+++ /dev/null
@@ -1,398 +0,0 @@
-/*
- * Copyright (C) 2018 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.compatibility.common.util;
-
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assert.fail;
-
-import com.google.common.annotations.VisibleForTesting;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.nio.charset.StandardCharsets;
-import java.util.Scanner;
-import java.util.concurrent.TimeUnit;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Utility class for backup and restore.
- */
-public abstract class BackupUtils {
-    private static final String LOCAL_TRANSPORT_NAME =
-            "com.android.localtransport/.LocalTransport";
-    private static final String LOCAL_TRANSPORT_NAME_PRE_Q =
-            "android/com.android.internal.backup.LocalTransport";
-    private static final String LOCAL_TRANSPORT_PACKAGE = "com.android.localtransport";
-    public static final String LOCAL_TRANSPORT_TOKEN = "1";
-
-    private static final int BACKUP_PROVISIONING_TIMEOUT_SECONDS = 30;
-    private static final int BACKUP_PROVISIONING_POLL_INTERVAL_SECONDS = 1;
-    private static final long BACKUP_SERVICE_INIT_TIMEOUT_SECS = TimeUnit.MINUTES.toSeconds(2);
-
-    private static final Pattern BACKUP_MANAGER_CURRENTLY_ENABLE_STATUS_PATTERN =
-            Pattern.compile("^Backup Manager currently (enabled|disabled)$");
-    private static final String MATCH_LINE_BACKUP_MANAGER_IS_NOT_PENDING_INIT =
-            "(?s)" + "^Backup Manager is .* not pending init.*";  // DOTALL
-
-    private static final String BACKUP_DUMPSYS_CURRENT_TOKEN_FIELD = "Current:";
-
-    /**
-     * Kicks off adb shell {@param command} and return an {@link InputStream} with the command
-     * output stream.
-     */
-    protected abstract InputStream executeShellCommand(String command) throws IOException;
-
-    public void executeShellCommandSync(String command) throws IOException {
-        StreamUtil.drainAndClose(new InputStreamReader(executeShellCommand(command)));
-    }
-
-    public String getShellCommandOutput(String command) throws IOException {
-        return StreamUtil.readInputStream(executeShellCommand(command));
-    }
-
-    /** Executes shell command "bmgr backupnow <package>" and assert success. */
-    public void backupNowAndAssertSuccess(String packageName) throws IOException {
-        assertBackupIsSuccessful(packageName, backupNow(packageName));
-    }
-
-    /** Executes "bmgr --user <id> backupnow <package>" and assert success. */
-    public void backupNowAndAssertSuccessForUser(String packageName, int userId)
-            throws IOException {
-        assertBackupIsSuccessful(packageName, backupNowForUser(packageName, userId));
-    }
-
-    public void backupNowAndAssertBackupNotAllowed(String packageName) throws IOException {
-        assertBackupNotAllowed(packageName, getBackupNowOutput(packageName));
-    }
-
-    /** Executes shell command "bmgr backupnow <package>" and waits for completion. */
-    public void backupNowSync(String packageName) throws IOException {
-        StreamUtil.drainAndClose(new InputStreamReader(backupNow(packageName)));
-    }
-
-    public String getBackupNowOutput(String packageName) throws IOException {
-        return StreamUtil.readInputStream(backupNow(packageName));
-    }
-
-    /** Executes shell command "bmgr restore <token> <package>" and assert success. */
-    public void restoreAndAssertSuccess(String token, String packageName) throws IOException {
-        assertRestoreIsSuccessful(restore(token, packageName));
-    }
-
-    /** Executes shell command "bmgr --user <id> restore <token> <package>" and assert success. */
-    public void restoreAndAssertSuccessForUser(String token, String packageName, int userId)
-            throws IOException {
-        assertRestoreIsSuccessful(restoreForUser(token, packageName, userId));
-    }
-
-    public void restoreSync(String token, String packageName) throws IOException {
-        StreamUtil.drainAndClose(new InputStreamReader(restore(token, packageName)));
-    }
-
-    public String getRestoreOutput(String token, String packageName) throws IOException {
-        return StreamUtil.readInputStream(restore(token, packageName));
-    }
-
-    public boolean isLocalTransportSelected() throws IOException {
-        return getShellCommandOutput("bmgr list transports")
-                .contains("* " + getLocalTransportName());
-    }
-
-    /**
-     * Executes shell command "bmgr --user <id> list transports" to check the currently selected
-     * transport and returns {@code true} if the local transport is the selected one.
-     */
-    public boolean isLocalTransportSelectedForUser(int userId) throws IOException {
-        return getShellCommandOutput(String.format("bmgr --user %d list transports", userId))
-                .contains("* " + getLocalTransportName());
-    }
-
-    public boolean isBackupEnabled() throws IOException {
-        return getShellCommandOutput("bmgr enabled").contains("currently enabled");
-    }
-
-    /**
-     * Executes shell command "bmgr --user <id> enabled" and returns if backup is enabled for the
-     * user {@code userId}.
-     */
-    public boolean isBackupEnabledForUser(int userId) throws IOException {
-        return getShellCommandOutput(String.format("bmgr --user %d enabled", userId))
-                .contains("currently enabled");
-    }
-
-    public void wakeAndUnlockDevice() throws IOException {
-        executeShellCommandSync("input keyevent KEYCODE_WAKEUP");
-        executeShellCommandSync("wm dismiss-keyguard");
-    }
-
-    /**
-     * Returns {@link #LOCAL_TRANSPORT_NAME} if it's available on the device, or
-     * {@link #LOCAL_TRANSPORT_NAME_PRE_Q} otherwise.
-     */
-    public String getLocalTransportName() throws IOException {
-        return getShellCommandOutput("pm list packages").contains(LOCAL_TRANSPORT_PACKAGE)
-                ? LOCAL_TRANSPORT_NAME : LOCAL_TRANSPORT_NAME_PRE_Q;
-    }
-
-    /** Executes "bmgr backupnow <package>" and returns an {@link InputStream} for its output. */
-    private InputStream backupNow(String packageName) throws IOException {
-        return executeShellCommand("bmgr backupnow " + packageName);
-    }
-
-    /**
-     * Executes "bmgr --user <id> backupnow <package>" and returns an {@link InputStream} for its
-     * output.
-     */
-    private InputStream backupNowForUser(String packageName, int userId) throws IOException {
-        return executeShellCommand(
-                String.format("bmgr --user %d backupnow %s", userId, packageName));
-    }
-
-    /**
-     * Parses the output of "bmgr backupnow" command and checks that {@code packageName} wasn't
-     * allowed to backup.
-     *
-     * Expected format: "Package <packageName> with result:  Backup is not allowed"
-     *
-     * TODO: Read input stream instead of string.
-     */
-    private void assertBackupNotAllowed(String packageName, String backupNowOutput) {
-        Scanner in = new Scanner(backupNowOutput);
-        boolean found = false;
-        while (in.hasNextLine()) {
-            String line = in.nextLine();
-
-            if (line.contains(packageName)) {
-                String result = line.split(":")[1].trim();
-                if ("Backup is not allowed".equals(result)) {
-                    found = true;
-                }
-            }
-        }
-        in.close();
-        assertTrue("Didn't find \'Backup not allowed\' in the output", found);
-    }
-
-    /**
-     * Parses the output of "bmgr backupnow" command checking that the package {@code packageName}
-     * was backed up successfully. Closes the input stream.
-     *
-     * Expected format: "Package <package> with result: Success"
-     */
-    private void assertBackupIsSuccessful(String packageName, InputStream backupNowOutput)
-            throws IOException {
-        BufferedReader reader =
-                new BufferedReader(new InputStreamReader(backupNowOutput, StandardCharsets.UTF_8));
-        try {
-            String line;
-            while ((line = reader.readLine()) != null) {
-                if (line.contains(packageName)) {
-                    String result = line.split(":")[1].trim().toLowerCase();
-                    if ("success".equals(result)) {
-                        return;
-                    }
-                }
-            }
-            fail("Couldn't find package in output or backup wasn't successful");
-        } finally {
-            StreamUtil.drainAndClose(reader);
-        }
-    }
-
-    /**
-     * Executes "bmgr restore <token> <packageName>" and returns an {@link InputStream} for its
-     * output.
-     */
-    private InputStream restore(String token, String packageName) throws IOException {
-        return executeShellCommand(String.format("bmgr restore %s %s", token, packageName));
-    }
-
-    /**
-     * Executes "bmgr --user <id> restore <token> <packageName>" and returns an {@link InputStream}
-     * for its output.
-     */
-    private InputStream restoreForUser(String token, String packageName, int userId)
-            throws IOException {
-        return executeShellCommand(
-                String.format("bmgr --user %d restore %s %s", userId, token, packageName));
-    }
-
-    /**
-     * Parses the output of "bmgr restore" command and checks that the package under test
-     * was restored successfully. Closes the input stream.
-     *
-     * Expected format: "restoreFinished: 0"
-     */
-    private void assertRestoreIsSuccessful(InputStream restoreOutput) throws IOException {
-        BufferedReader reader =
-                new BufferedReader(new InputStreamReader(restoreOutput, StandardCharsets.UTF_8));
-        try {
-            String line;
-            while ((line = reader.readLine()) != null) {
-                if (line.contains("restoreFinished: 0")) {
-                    return;
-                }
-            }
-            fail("Restore not successful");
-        } finally {
-            StreamUtil.drainAndClose(reader);
-        }
-    }
-
-    /**
-     * Execute shell command and return output from this command.
-     */
-    public String executeShellCommandAndReturnOutput(String command) throws IOException {
-        InputStream in = executeShellCommand(command);
-        BufferedReader br = new BufferedReader(
-                new InputStreamReader(in, StandardCharsets.UTF_8));
-        String str;
-        StringBuilder out = new StringBuilder();
-        while ((str = br.readLine()) != null) {
-            out.append(str).append("\n");
-        }
-        return out.toString();
-    }
-
-    // Copied over from BackupQuotaTest
-    public boolean enableBackup(boolean enable) throws Exception {
-        boolean previouslyEnabled;
-        String output = getLineString(executeShellCommand("bmgr enabled"));
-        Matcher matcher = BACKUP_MANAGER_CURRENTLY_ENABLE_STATUS_PATTERN.matcher(output.trim());
-        if (matcher.find()) {
-            previouslyEnabled = "enabled".equals(matcher.group(1));
-        } else {
-            throw new RuntimeException("non-parsable output setting bmgr enabled: " + output);
-        }
-
-        executeShellCommand("bmgr enable " + enable);
-        return previouslyEnabled;
-    }
-
-    /**
-     * Execute shell command "bmgr --user <id> enable <enable> and return previous enabled state.
-     */
-    public boolean enableBackupForUser(boolean enable, int userId) throws IOException {
-        boolean previouslyEnabled = isBackupEnabledForUser(userId);
-        executeShellCommand(String.format("bmgr --user %d enable %b", userId, enable));
-        return previouslyEnabled;
-    }
-
-    /** Execute shell command "bmgr --user <id> activate <activate>." */
-    public boolean activateBackupForUser(boolean activate, int userId) throws IOException {
-        boolean previouslyActivated = isBackupActivatedForUser(userId);
-        executeShellCommandSync(String.format("bmgr --user %d activate %b", userId, activate));
-        return previouslyActivated;
-    }
-
-    /**
-     * Executes shell command "bmgr --user <id> activated" and returns if backup is activated for
-     * the user {@code userId}.
-     */
-    public boolean isBackupActivatedForUser(int userId) throws IOException {
-        return getShellCommandOutput(String.format("bmgr --user %d activated", userId))
-                .contains("currently activated");
-    }
-
-    private String getLineString(InputStream inputStream) throws IOException {
-        BufferedReader reader =
-                new BufferedReader(new InputStreamReader(inputStream, StandardCharsets.UTF_8));
-        String str;
-        try {
-            str = reader.readLine();
-        } finally {
-            StreamUtil.drainAndClose(reader);
-        }
-        return str;
-    }
-
-    public void waitForBackupInitialization() throws IOException {
-        long tryUntilNanos = System.nanoTime()
-                + TimeUnit.SECONDS.toNanos(BACKUP_PROVISIONING_TIMEOUT_SECONDS);
-        while (System.nanoTime() < tryUntilNanos) {
-            String output = getLineString(executeShellCommand("dumpsys backup"));
-            if (output.matches(MATCH_LINE_BACKUP_MANAGER_IS_NOT_PENDING_INIT)) {
-                return;
-            }
-            try {
-                Thread.sleep(TimeUnit.SECONDS.toMillis(BACKUP_PROVISIONING_POLL_INTERVAL_SECONDS));
-            } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-                break;
-            }
-        }
-        throw new IOException("Timed out waiting for backup initialization");
-    }
-
-    public void waitUntilBackupServiceIsRunning(int userId)
-            throws IOException, InterruptedException {
-        waitUntilBackupServiceIsRunning(userId, BACKUP_SERVICE_INIT_TIMEOUT_SECS);
-    }
-
-    @VisibleForTesting
-    void waitUntilBackupServiceIsRunning(int userId, long timeout)
-            throws IOException, InterruptedException {
-        CommonTestUtils.waitUntil(
-                "Backup Manager init timed out",
-                timeout,
-                () -> {
-                    String output = getLineString(executeShellCommand("dumpsys backup users"));
-                    return output.matches(
-                            "Backup Manager is running for users:.* " + userId + "( .*)?");
-                });
-    }
-
-    /**
-     * Executes shell command "bmgr --user <id> list transports" and returns {@code true} if the
-     * user has the {@code transport} available.
-     */
-    public boolean userHasBackupTransport(String transport, int userId) throws IOException {
-        String output =
-                getLineString(
-                        executeShellCommand(
-                                String.format("bmgr --user %d list transports", userId)));
-        for (String t : output.split("\n")) {
-            // Parse out the '*' character used to denote the selected transport.
-            t = t.replace("*", "").trim();
-            if (transport.equals(t)) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /**
-     * Executes shell command "bmgr --user <id> transport <transport>" and returns the old
-     * transport.
-     */
-    public String setBackupTransportForUser(String transport, int userId) throws IOException {
-        String output =
-                executeShellCommandAndReturnOutput(
-                        String.format("bmgr --user %d transport %s", userId, transport));
-        Pattern pattern = Pattern.compile("\\(formerly (.*)\\)$");
-        Matcher matcher = pattern.matcher(output);
-        if (matcher.find()) {
-            return matcher.group(1);
-        } else {
-            throw new RuntimeException("Non-parsable output setting bmgr transport: " + output);
-        }
-    }
-}
-
diff --git a/common/util/src/com/android/compatibility/common/util/BusinessLogic.java b/common/util/src/com/android/compatibility/common/util/BusinessLogic.java
deleted file mode 100644
index f20f43e..0000000
--- a/common/util/src/com/android/compatibility/common/util/BusinessLogic.java
+++ /dev/null
@@ -1,352 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.compatibility.common.util;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-import org.junit.AssumptionViolatedException;
-
-/**
- * Helper and constants accessible to host and device components that enable Business Logic
- * configuration
- */
-public class BusinessLogic {
-
-    // Device location to which business logic data is pushed
-    public static final String DEVICE_FILE = "/sdcard/bl";
-
-    /* A map from testcase name to the business logic rules for the test case */
-    protected Map<String, List<BusinessLogicRulesList>> mRules;
-    /* Feature flag determining if device specific tests are executed. */
-    public boolean mConditionalTestsEnabled;
-    private AuthenticationStatusEnum mAuthenticationStatus = AuthenticationStatusEnum.UNKNOWN;
-
-    // A Date denoting the time of request from the business logic service
-    protected Date mTimestamp;
-
-    // A list of regexes triggering log redaction
-    protected List<String> mRedactionRegexes = new ArrayList<>();
-
-    /**
-     * Determines whether business logic exists for a given test name
-     * @param testName the name of the test case, prefixed by fully qualified class name, then '#'.
-     * For example, "com.android.foo.FooTest#testFoo"
-     * @return whether business logic exists for this test for this suite
-     */
-    public boolean hasLogicFor(String testName) {
-        List<BusinessLogicRulesList> rulesLists = mRules.get(testName);
-        return rulesLists != null && !rulesLists.isEmpty();
-    }
-
-    /**
-     * Return whether multiple rule lists exist in the BusinessLogic for this test name.
-     */
-    private boolean hasLogicsFor(String testName) {
-        List<BusinessLogicRulesList> rulesLists = mRules.get(testName);
-        return rulesLists != null && rulesLists.size() > 1;
-    }
-
-    /**
-     * Apply business logic for the given test.
-     * @param testName the name of the test case, prefixed by fully qualified class name, then '#'.
-     * For example, "com.android.foo.FooTest#testFoo"
-     * @param executor a {@link BusinessLogicExecutor}
-     */
-    public void applyLogicFor(String testName, BusinessLogicExecutor executor) {
-        if (!hasLogicFor(testName)) {
-            return;
-        }
-        if (hasLogicsFor(testName)) {
-            applyLogicsFor(testName, executor); // handle this special case separately
-            return;
-        }
-        // expecting exactly one rules list at this point
-        BusinessLogicRulesList rulesList = mRules.get(testName).get(0);
-        rulesList.invokeRules(executor);
-    }
-
-    /**
-     * Handle special case in which multiple rule lists exist for the test name provided.
-     * Execute each rule list in a sandbox and store an exception for each rule list that
-     * triggers failure or skipping for the test.
-     * If all rule lists trigger skipping, rethrow AssumptionViolatedException to report a 'skip'
-     * for the test as a whole.
-     * If one or more rule lists trigger failure, rethrow RuntimeException with a list containing
-     * each failure.
-     */
-    private void applyLogicsFor(String testName, BusinessLogicExecutor executor) {
-        Map<String, RuntimeException> failedMap = new HashMap<>();
-        Map<String, RuntimeException> skippedMap = new HashMap<>();
-        List<BusinessLogicRulesList> rulesLists = mRules.get(testName);
-        for (int index = 0; index < rulesLists.size(); index++) {
-            BusinessLogicRulesList rulesList = rulesLists.get(index);
-            String description = cleanDescription(rulesList.getDescription(), index);
-            try {
-                rulesList.invokeRules(executor);
-            } catch (RuntimeException re) {
-                if (AssumptionViolatedException.class.isInstance(re)) {
-                    skippedMap.put(description, re);
-                    executor.logInfo("Test %s (%s) skipped for reason: %s", testName, description,
-                            re.getMessage());
-                } else {
-                    failedMap.put(description, re);
-                }
-            }
-        }
-        if (skippedMap.size() == rulesLists.size()) {
-            throwAggregatedException(skippedMap, false);
-        } else if (failedMap.size() > 0) {
-            throwAggregatedException(failedMap, true);
-        } // else this test should be reported as a pure pass
-    }
-
-    /**
-     * Helper to aggregate the messages of many {@link RuntimeException}s, and optionally their
-     * stack traces, before throwing an exception.
-     * @param exceptions a map from description strings to exceptions. The descriptive keySet is
-     * used to differentiate which BusinessLogicRulesList caused which exception
-     * @param failed whether to trigger failure. When false, throws assumption failure instead, and
-     * excludes stack traces from the exception message.
-     */
-    private static void throwAggregatedException(Map<String, RuntimeException> exceptions,
-            boolean failed) {
-        Set<String> keySet = exceptions.keySet();
-        String[] descriptions = keySet.toArray(new String[keySet.size()]);
-        StringBuilder msg = new StringBuilder("");
-        msg.append(String.format("Test %s for cases: ", (failed) ? "failed" : "skipped"));
-        msg.append(Arrays.toString(descriptions));
-        msg.append("\nReasons include:");
-        for (String description : descriptions) {
-            RuntimeException re = exceptions.get(description);
-            msg.append(String.format("\nMessage [%s]: %s", description, re.getMessage()));
-            if (failed) {
-                StringWriter sw = new StringWriter();
-                re.printStackTrace(new PrintWriter(sw));
-                msg.append(String.format("\nStack Trace: %s", sw.toString()));
-            }
-        }
-        if (failed) {
-            throw new RuntimeException(msg.toString());
-        } else {
-            throw new AssumptionViolatedException(msg.toString());
-        }
-    }
-
-    /**
-     * Helper method to generate a meaningful description in case the provided description is null
-     * or empty. In this case, returns a string representation of the index provided.
-     */
-    private String cleanDescription(String description, int index) {
-        return (description == null || description.length() == 0)
-                ? Integer.toString(index)
-                : description;
-    }
-
-    public void setAuthenticationStatus(String authenticationStatus) {
-        try {
-            mAuthenticationStatus = Enum.valueOf(AuthenticationStatusEnum.class,
-                    authenticationStatus);
-        } catch (IllegalArgumentException e) {
-            // Invalid value, set to unknown
-            mAuthenticationStatus = AuthenticationStatusEnum.UNKNOWN;
-        }
-    }
-
-    public boolean isAuthorized() {
-        return AuthenticationStatusEnum.AUTHORIZED.equals(mAuthenticationStatus);
-    }
-
-    public Date getTimestamp() {
-        return mTimestamp;
-    }
-
-    public List<String> getRedactionRegexes() {
-        return new ArrayList<String>(mRedactionRegexes);
-    }
-
-    /**
-     * Builds a user readable string tha explains the authentication status and the effect on tests
-     * which require authentication to execute.
-     */
-    public String getAuthenticationStatusMessage() {
-        switch (mAuthenticationStatus) {
-            case AUTHORIZED:
-                return "Authorized";
-            case NOT_AUTHENTICATED:
-                return "authorization failed, please ensure the service account key is "
-                        + "properly installed.";
-            case NOT_AUTHORIZED:
-                return "service account is not authorized to access information for this device. "
-                        + "Please verify device properties are set correctly and account "
-                        + "permissions are configured to the Business Logic Api.";
-            case NO_DEVICE_INFO:
-                return "unable to read device info files. Retry without --skip-device-info flag.";
-            default:
-                return "something went wrong, please try again.";
-        }
-    }
-
-    /**
-     * A list of BusinessLogicRules, wrapped with an optional description to differentiate rule
-     * lists that apply to the same test.
-     */
-    protected static class BusinessLogicRulesList {
-
-        /* Stored description and rules */
-        protected List<BusinessLogicRule> mRulesList;
-        protected String mDescription;
-
-        public BusinessLogicRulesList(List<BusinessLogicRule> rulesList) {
-            mRulesList = rulesList;
-        }
-
-        public BusinessLogicRulesList(List<BusinessLogicRule> rulesList, String description) {
-            mRulesList = rulesList;
-            mDescription = description;
-        }
-
-        public String getDescription() {
-            return mDescription;
-        }
-
-        public List<BusinessLogicRule> getRules() {
-            return mRulesList;
-        }
-
-        public void invokeRules(BusinessLogicExecutor executor) {
-            for (BusinessLogicRule rule : mRulesList) {
-                // Check conditions
-                if (rule.invokeConditions(executor)) {
-                    rule.invokeActions(executor);
-                }
-            }
-        }
-    }
-
-    /**
-     * Nested class representing an Business Logic Rule. Stores a collection of conditions
-     * and actions for later invokation.
-     */
-    protected static class BusinessLogicRule {
-
-        /* Stored conditions and actions */
-        protected List<BusinessLogicRuleCondition> mConditions;
-        protected List<BusinessLogicRuleAction> mActions;
-
-        public BusinessLogicRule(List<BusinessLogicRuleCondition> conditions,
-                List<BusinessLogicRuleAction> actions) {
-            mConditions = conditions;
-            mActions = actions;
-        }
-
-        /**
-         * Method that invokes all Business Logic conditions for this rule, and returns true
-         * if all conditions evaluate to true.
-         */
-        public boolean invokeConditions(BusinessLogicExecutor executor) {
-            for (BusinessLogicRuleCondition condition : mConditions) {
-                if (!condition.invoke(executor)) {
-                    return false;
-                }
-            }
-            return true;
-        }
-
-        /**
-         * Method that invokes all Business Logic actions for this rule
-         */
-        public void invokeActions(BusinessLogicExecutor executor) {
-            for (BusinessLogicRuleAction action : mActions) {
-                action.invoke(executor);
-            }
-        }
-    }
-
-    /**
-     * Nested class representing an Business Logic Rule Condition. Stores the name of a method
-     * to invoke, as well as String args to use during invokation.
-     */
-    protected static class BusinessLogicRuleCondition {
-
-        /* Stored method name and String args */
-        protected String mMethodName;
-        protected List<String> mMethodArgs;
-        /* Whether or not the boolean result of this condition should be reversed */
-        protected boolean mNegated;
-
-
-        public BusinessLogicRuleCondition(String methodName, List<String> methodArgs,
-                boolean negated) {
-            mMethodName = methodName;
-            mMethodArgs = methodArgs;
-            mNegated = negated;
-        }
-
-        /**
-         * Invoke this Business Logic condition with an executor.
-         */
-        public boolean invoke(BusinessLogicExecutor executor) {
-            // XOR the negated boolean with the return value of the method
-            return (mNegated != executor.executeCondition(mMethodName,
-                    mMethodArgs.toArray(new String[mMethodArgs.size()])));
-        }
-    }
-
-    /**
-     * Nested class representing an Business Logic Rule Action. Stores the name of a method
-     * to invoke, as well as String args to use during invokation.
-     */
-    protected static class BusinessLogicRuleAction {
-
-        /* Stored method name and String args */
-        protected String mMethodName;
-        protected List<String> mMethodArgs;
-
-        public BusinessLogicRuleAction(String methodName, List<String> methodArgs) {
-            mMethodName = methodName;
-            mMethodArgs = methodArgs;
-        }
-
-        /**
-         * Invoke this Business Logic action with an executor.
-         */
-        public void invoke(BusinessLogicExecutor executor) {
-            executor.executeAction(mMethodName,
-                    mMethodArgs.toArray(new String[mMethodArgs.size()]));
-        }
-    }
-
-    /**
-     * Nested enum of the possible authentication statuses.
-     */
-    protected enum AuthenticationStatusEnum {
-        UNKNOWN,
-        NOT_AUTHENTICATED,
-        NOT_AUTHORIZED,
-        AUTHORIZED,
-        NO_DEVICE_INFO
-    }
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java b/common/util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
deleted file mode 100644
index 857ea15..0000000
--- a/common/util/src/com/android/compatibility/common/util/BusinessLogicExecutor.java
+++ /dev/null
@@ -1,227 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License
- */
-
-package com.android.compatibility.common.util;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-import org.junit.AssumptionViolatedException;
-
-/**
- * Resolves methods provided by the BusinessLogicService and invokes them
- */
-public abstract class BusinessLogicExecutor {
-
-    protected static final String LOG_TAG = "BusinessLogicExecutor";
-
-    /** String representations of the String class and String[] class */
-    protected static final String STRING_CLASS = "java.lang.String";
-    protected static final String STRING_ARRAY_CLASS = "[Ljava.lang.String;";
-
-    private static final String REDACTED_PLACEHOLDER = "[redacted]";
-    /* List of regexes indicating a method arg should be redacted in the logs */
-    protected List<String> mRedactionRegexes = new ArrayList<>();
-
-    /**
-     * Execute a business logic condition.
-     * @param method the name of the method to invoke. Must include fully qualified name of the
-     * enclosing class, followed by '.', followed by the name of the method
-     * @param args the string arguments to supply to the method
-     * @return the return value of the method invoked
-     * @throws RuntimeException when failing to resolve or invoke the condition method
-     */
-    public boolean executeCondition(String method, String... args) {
-        logDebug("Executing condition: %s", formatExecutionString(method, args));
-        try {
-            return (Boolean) invokeMethod(method, args);
-        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException |
-                InvocationTargetException | NoSuchMethodException e) {
-            throw new RuntimeException(String.format(
-                    "BusinessLogic: Failed to invoke condition method %s with args: %s", method,
-                    Arrays.toString(args)), e);
-        }
-    }
-
-    /**
-     * Execute a business logic action.
-     * @param method the name of the method to invoke. Must include fully qualified name of the
-     * enclosing class, followed by '.', followed by the name of the method
-     * @param args the string arguments to supply to the method
-     * @throws RuntimeException when failing to resolve or invoke the action method
-     */
-    public void executeAction(String method, String... args) {
-        logDebug("Executing action: %s", formatExecutionString(method, args));
-        try {
-            invokeMethod(method, args);
-        } catch (ClassNotFoundException | IllegalAccessException | InstantiationException |
-                NoSuchMethodException e) {
-            throw new RuntimeException(String.format(
-                    "BusinessLogic: Failed to invoke action method %s with args: %s", method,
-                    Arrays.toString(args)), e);
-        } catch (InvocationTargetException e) {
-            // This action throws an exception, so throw the original exception (e.g.
-            // AssertionFailedError) for a more readable stacktrace.
-            Throwable t = e.getCause();
-            if (AssumptionViolatedException.class.isInstance(t)) {
-                // This is an assumption failure (registered as a "pass") so don't wrap this
-                // throwable in a RuntimeException
-                throw (AssumptionViolatedException) t;
-            } else {
-                RuntimeException re = new RuntimeException(t.getMessage(), t.getCause());
-                re.setStackTrace(t.getStackTrace());
-                throw re;
-            }
-        }
-    }
-
-    /**
-     * Format invokation information as "method(args[0], args[1], ...)".
-     */
-    protected abstract String formatExecutionString(String method, String... args);
-
-    /** Substitute sensitive information with REDACTED_PLACEHOLDER if necessary. */
-    protected String[] formatArgs(String[] args) {
-        List<String> formattedArgs = new ArrayList<>();
-        for (String arg : args) {
-            formattedArgs.add(formatArg(arg));
-        }
-        return formattedArgs.toArray(new String[0]);
-    }
-
-    private String formatArg(String arg) {
-        for (String regex : mRedactionRegexes) {
-            Pattern pattern = Pattern.compile(regex);
-            Matcher matcher = pattern.matcher(arg);
-            if (matcher.find()) {
-                return REDACTED_PLACEHOLDER;
-            }
-        }
-        return arg;
-    }
-
-    /**
-     * Execute a business logic method.
-     * @param method the name of the method to invoke. Must include fully qualified name of the
-     * enclosing class, followed by '.', followed by the name of the method
-     * @param args the string arguments to supply to the method
-     * @return the return value of the method invoked (type Boolean if method is a condition)
-     * @throws RuntimeException when failing to resolve or invoke the method
-     */
-    protected Object invokeMethod(String method, String... args) throws ClassNotFoundException,
-            IllegalAccessException, InstantiationException, InvocationTargetException,
-            NoSuchMethodException {
-        // Method names served by the BusinessLogic service should assume format
-        // classname.methodName, but also handle format classname#methodName since test names use
-        // this format
-        int index = (method.indexOf('#') == -1) ? method.lastIndexOf('.') : method.indexOf('#');
-        if (index == -1) {
-            throw new RuntimeException(String.format("BusinessLogic: invalid method name "
-                    + "\"%s\". Method string must include fully qualified class name. "
-                    + "For example, \"com.android.packagename.ClassName.methodName\".", method));
-        }
-        String className = method.substring(0, index);
-        Class cls = Class.forName(className);
-        Object obj = cls.getDeclaredConstructor().newInstance();
-        if (getTestObject() != null && cls.isAssignableFrom(getTestObject().getClass())) {
-            // The given method is a member of the test class, use the known test class instance
-            obj = getTestObject();
-        }
-        ResolvedMethod rm = getResolvedMethod(cls, method.substring(index + 1), args);
-        return rm.invoke(obj);
-    }
-
-    /**
-     * Log information with whichever logging mechanism is available to the instance. This varies
-     * from host-side to device-side, so implementations are left to subclasses.
-     * See {@link String.format(String, Object...)} for parameter information.
-     */
-    public abstract void logInfo(String format, Object... args);
-
-    /**
-     * Log debugging information to the host or device logs (depending on implementation).
-     * See {@link String.format(String, Object...)} for parameter information.
-     */
-    public abstract void logDebug(String format, Object... args);
-
-    /**
-     * Get the test object. This method is left abstract, since non-abstract subclasses will set
-     * the test object in the constructor.
-     * @return the test case instance
-     */
-    protected abstract Object getTestObject();
-
-    /**
-     * Get the method and list of arguments corresponding to the class, method name, and proposed
-     * argument values, in the form of a {@link ResolvedMethod} object. This object stores all
-     * information required to successfully invoke the method. getResolvedMethod is left abstract,
-     * since argument types differ between device-side (e.g. Context) and host-side
-     * (e.g. ITestDevice) implementations of this class.
-     * @param cls the Class to which the method belongs
-     * @param methodName the name of the method to invoke
-     * @param args the string arguments to use when invoking the method
-     * @return a {@link ResolvedMethod}
-     * @throws ClassNotFoundException
-     */
-    protected abstract ResolvedMethod getResolvedMethod(Class cls, String methodName,
-            String... args) throws ClassNotFoundException;
-
-    /**
-     * Retrieve all methods within a class that match a given name
-     * @param cls the class
-     * @param name the method name
-     * @return a list of method objects
-     */
-    protected List<Method> getMethodsWithName(Class cls, String name) {
-        List<Method> methodList = new ArrayList<>();
-        for (Method m : cls.getMethods()) {
-            if (name.equals(m.getName())) {
-                methodList.add(m);
-            }
-        }
-        return methodList;
-    }
-
-    /**
-     * Helper class for storing a method object, and a list of arguments to use when invoking the
-     * method. The class is also equipped with an "invoke" method for convenience.
-     */
-    protected static class ResolvedMethod {
-        private Method mMethod;
-        List<Object> mArgs;
-
-        public ResolvedMethod(Method method) {
-            mMethod = method;
-            mArgs = new ArrayList<>();
-        }
-
-        /** Add an argument to the argument list for this instance */
-        public void addArg(Object arg) {
-            mArgs.add(arg);
-        }
-
-        /** Invoke the stored method with the stored args on a given object */
-        public Object invoke(Object instance) throws IllegalAccessException,
-                InvocationTargetException {
-            return mMethod.invoke(instance, mArgs.toArray());
-        }
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/BusinessLogicFactory.java b/common/util/src/com/android/compatibility/common/util/BusinessLogicFactory.java
deleted file mode 100644
index b072413..0000000
--- a/common/util/src/com/android/compatibility/common/util/BusinessLogicFactory.java
+++ /dev/null
@@ -1,284 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.compatibility.common.util;
-
-import com.android.compatibility.common.util.BusinessLogic.BusinessLogicRule;
-import com.android.compatibility.common.util.BusinessLogic.BusinessLogicRuleAction;
-import com.android.compatibility.common.util.BusinessLogic.BusinessLogicRuleCondition;
-import com.android.compatibility.common.util.BusinessLogic.BusinessLogicRulesList;
-
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.io.Reader;
-import java.text.ParseException;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Date;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Scanner;
-import java.util.TimeZone;
-
-/**
- * Factory for creating a {@link BusinessLogic}
- */
-public class BusinessLogicFactory {
-
-    // Name of list object storing test-rules pairs
-    private static final String BUSINESS_LOGIC_RULES_LISTS = "businessLogicRulesLists";
-    // Name of test name string
-    private static final String TEST_NAME = "testName";
-    // Name of rules object (one 'rules' object to a single test)
-    private static final String BUSINESS_LOGIC_RULES = "businessLogicRules";
-    // Name of rule conditions array
-    private static final String RULE_CONDITIONS = "ruleConditions";
-    // Name of rule actions array
-    private static final String RULE_ACTIONS = "ruleActions";
-    // Description of a rule list object
-    private static final String RULES_LIST_DESCRIPTION = "description";
-    // Name of method name string
-    private static final String METHOD_NAME = "methodName";
-    // Name of method args array of strings
-    private static final String METHOD_ARGS = "methodArgs";
-    // Name of the field in the response object that stores that the auth status of the request.
-    private static final String AUTHENTICATION_STATUS = "authenticationStatus";
-    public static final String CONDITIONAL_TESTS_ENABLED = "conditionalTestsEnabled";
-    // Name of the timestamp field
-    private static final String TIMESTAMP = "timestamp";
-    // Date and time pattern for raw timestamp string
-    private static final String TIMESTAMP_PATTERN = "yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
-    // Name of the redacted regexes field
-    private static final String REDACTION_REGEXES = "redactionRegexes";
-
-    /**
-     * Create a BusinessLogic instance from a {@link FileInputStream} of business logic data,
-     * formatted in JSON. This format is identical to that which is received from the Android
-     * Partner business logic service.
-     */
-    public static BusinessLogic createFromFile(FileInputStream stream) {
-        try {
-            String businessLogicString = readStream(stream);
-            return createBL(businessLogicString);
-        } catch (IOException e) {
-            throw new RuntimeException("Business Logic failed", e);
-        }
-    }
-
-    /**
-     * Create a BusinessLogic instance from a file of business logic data, formatted in JSON.
-     * This format is identical to that which is received from the Android Partner business logic
-     * service.
-     */
-    public static BusinessLogic createFromFile(File f) {
-        try {
-            String businessLogicString = readFile(f);
-            return createBL(businessLogicString);
-        } catch (IOException e) {
-            throw new RuntimeException("Business Logic failed", e);
-        }
-    }
-
-    private static BusinessLogic createBL(String businessLogicString) {
-        // Populate the map from testname to business rules for this new BusinessLogic instance
-        Map<String, List<BusinessLogicRulesList>> rulesMap = new HashMap<>();
-        BusinessLogic bl = new BusinessLogic();
-        try {
-            JSONObject root = new JSONObject(businessLogicString);
-            JSONArray jsonRulesLists = null;
-            if (root.has(AUTHENTICATION_STATUS)){
-                String authStatus = root.getString(AUTHENTICATION_STATUS);
-                bl.setAuthenticationStatus(authStatus);
-            }
-            if (root.has(CONDITIONAL_TESTS_ENABLED)){
-                boolean enabled = root.getBoolean(CONDITIONAL_TESTS_ENABLED);
-                bl.mConditionalTestsEnabled = enabled;
-            }
-            if (root.has(TIMESTAMP)) {
-                bl.mTimestamp = parseTimestamp(root.getString(TIMESTAMP));
-            }
-            if (root.has(REDACTION_REGEXES)) {
-                bl.mRedactionRegexes = parseRedactionRegexes(root.getJSONArray(REDACTION_REGEXES));
-            }
-            try {
-                jsonRulesLists = root.getJSONArray(BUSINESS_LOGIC_RULES_LISTS);
-            } catch (JSONException e) {
-                bl.mRules = rulesMap;
-                return bl; // no rules defined for this suite, leave internal map empty
-            }
-            for (int i = 0; i < jsonRulesLists.length(); i++) {
-                JSONObject jsonRulesList = jsonRulesLists.getJSONObject(i);
-                String testName = jsonRulesList.getString(TEST_NAME);
-                List<BusinessLogicRulesList> testRulesLists = rulesMap.get(testName);
-                if (testRulesLists == null) {
-                    testRulesLists = new ArrayList<>();
-                }
-                testRulesLists.add(extractRulesList(jsonRulesList));
-                rulesMap.put(testName, testRulesLists);
-            }
-        } catch (JSONException e) {
-            throw new RuntimeException("Business Logic failed", e);
-        }
-        // Return business logic
-        bl.mRules = rulesMap;
-        return bl;
-    }
-
-    private static List<String> parseRedactionRegexes(JSONArray redactionRegexesJSONArray)
-            throws JSONException {
-        List<String> redactionRegexes = new ArrayList<>();
-        for (int i = 0; i < redactionRegexesJSONArray.length(); i++) {
-            redactionRegexes.add(redactionRegexesJSONArray.getString(i));
-        }
-        return redactionRegexes;
-    }
-
-    /* Extract a BusinessLogicRulesList from the representative JSON object */
-    private static BusinessLogicRulesList extractRulesList(JSONObject rulesListJSONObject)
-            throws JSONException {
-        // First, parse the description for this rule list object, if one exists
-        String description = null;
-        try {
-            description = rulesListJSONObject.getString(RULES_LIST_DESCRIPTION);
-        } catch (JSONException e) { /* no description set, leave null */}
-
-        // Next, get the list of rules
-        List<BusinessLogicRule> rules = new ArrayList<>();
-        JSONArray rulesJSONArray = null;
-        try {
-            rulesJSONArray = rulesListJSONObject.getJSONArray(BUSINESS_LOGIC_RULES);
-        } catch (JSONException e) {
-            // no rules defined for this test case, return new, rule-less BusinessLogicRulesList
-            return new BusinessLogicRulesList(rules, description);
-        }
-        for (int j = 0; j < rulesJSONArray.length(); j++) {
-            JSONObject ruleJSONObject = rulesJSONArray.getJSONObject(j);
-            // Build conditions list
-            List<BusinessLogicRuleCondition> ruleConditions =
-                    extractRuleConditionList(ruleJSONObject);
-            // Build actions list
-            List<BusinessLogicRuleAction> ruleActions =
-                    extractRuleActionList(ruleJSONObject);
-            rules.add(new BusinessLogicRule(ruleConditions, ruleActions));
-        }
-        return new BusinessLogicRulesList(rules, description);
-    }
-
-    /* Extract all BusinessLogicRuleConditions from a JSON business logic rule */
-    private static List<BusinessLogicRuleCondition> extractRuleConditionList(
-            JSONObject ruleJSONObject) throws JSONException {
-        List<BusinessLogicRuleCondition> ruleConditions = new ArrayList<>();
-        // Rules do not require a condition, return empty list if no condition is found
-        JSONArray ruleConditionsJSONArray = null;
-        try {
-            ruleConditionsJSONArray = ruleJSONObject.getJSONArray(RULE_CONDITIONS);
-        } catch (JSONException e) {
-            return ruleConditions; // no conditions for this rule, apply in all cases
-        }
-        for (int i = 0; i < ruleConditionsJSONArray.length(); i++) {
-            JSONObject ruleConditionJSONObject = ruleConditionsJSONArray.getJSONObject(i);
-            String methodName = ruleConditionJSONObject.getString(METHOD_NAME);
-            boolean negated = false;
-            if (methodName.startsWith("!")) {
-                methodName = methodName.substring(1); // remove negation from method name string
-                negated = true; // change "negated" property to true
-            }
-            List<String> methodArgs = new ArrayList<>();
-            JSONArray methodArgsJSONArray = null;
-            try {
-                methodArgsJSONArray = ruleConditionJSONObject.getJSONArray(METHOD_ARGS);
-            } catch (JSONException e) {
-                // No method args for this rule condition, add rule condition with empty args list
-                ruleConditions.add(new BusinessLogicRuleCondition(methodName, methodArgs, negated));
-                continue;
-            }
-            for (int j = 0; j < methodArgsJSONArray.length(); j++) {
-                methodArgs.add(methodArgsJSONArray.getString(j));
-            }
-            ruleConditions.add(new BusinessLogicRuleCondition(methodName, methodArgs, negated));
-        }
-        return ruleConditions;
-    }
-
-    /* Extract all BusinessLogicRuleActions from a JSON business logic rule */
-    private static List<BusinessLogicRuleAction> extractRuleActionList(JSONObject ruleJSONObject)
-            throws JSONException {
-        List<BusinessLogicRuleAction> ruleActions = new ArrayList<>();
-        // All rules require at least one action, line below throws JSONException if not
-        JSONArray ruleActionsJSONArray = ruleJSONObject.getJSONArray(RULE_ACTIONS);
-        for (int i = 0; i < ruleActionsJSONArray.length(); i++) {
-            JSONObject ruleActionJSONObject = ruleActionsJSONArray.getJSONObject(i);
-            String methodName = ruleActionJSONObject.getString(METHOD_NAME);
-            List<String> methodArgs = new ArrayList<>();
-            JSONArray methodArgsJSONArray = null;
-            try {
-                methodArgsJSONArray = ruleActionJSONObject.getJSONArray(METHOD_ARGS);
-            } catch (JSONException e) {
-                // No method args for this rule action, add rule action with empty args list
-                ruleActions.add(new BusinessLogicRuleAction(methodName, methodArgs));
-                continue;
-            }
-            for (int j = 0; j < methodArgsJSONArray.length(); j++) {
-                methodArgs.add(methodArgsJSONArray.getString(j));
-            }
-            ruleActions.add(new BusinessLogicRuleAction(methodName, methodArgs));
-        }
-        return ruleActions;
-    }
-
-    /* Pare a timestamp string with format TIMESTAMP_PATTERN to a date object */
-    private static Date parseTimestamp(String timestamp) {
-        SimpleDateFormat format = new SimpleDateFormat(TIMESTAMP_PATTERN);
-        format.setTimeZone(TimeZone.getTimeZone("UTC"));
-        try {
-            return format.parse(timestamp);
-        } catch (ParseException e) {
-            return null;
-        }
-    }
-
-    /* Extract string from file */
-    private static String readFile(File f) throws IOException {
-        StringBuilder sb = new StringBuilder((int) f.length());
-        String lineSeparator = System.getProperty("line.separator");
-        try (Scanner scanner = new Scanner(f)) {
-            while(scanner.hasNextLine()) {
-                sb.append(scanner.nextLine() + lineSeparator);
-            }
-            return sb.toString();
-        }
-    }
-
-    /** Extract string from stream */
-    private static String readStream(FileInputStream stream) throws IOException {
-        int irChar = -1;
-        StringBuilder builder = new StringBuilder();
-        try (Reader ir = new BufferedReader(new InputStreamReader(stream))) {
-            while ((irChar = ir.read()) != -1) {
-                builder.append((char) irChar);
-            }
-        }
-        return builder.toString();
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/CaseResult.java b/common/util/src/com/android/compatibility/common/util/CaseResult.java
deleted file mode 100644
index a7c3318..0000000
--- a/common/util/src/com/android/compatibility/common/util/CaseResult.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Data structure for a Compatibility test case result.
- */
-public class CaseResult implements ICaseResult {
-
-    private String mName;
-
-    private Map<String, ITestResult> mResults = new HashMap<>();
-
-    /**
-     * Creates a {@link CaseResult} for the given name, eg &lt;package-name&gt;.&lt;class-name&gt;
-     */
-    public CaseResult(String name) {
-        mName = name;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getName() {
-        return mName;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ITestResult getOrCreateResult(String testName) {
-        ITestResult result = mResults.get(testName);
-        if (result == null) {
-            result = new TestResult(this, testName);
-            mResults.put(testName, result);
-        }
-        return result;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ITestResult getResult(String testName) {
-        return mResults.get(testName);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<ITestResult> getResults(TestStatus status) {
-        List<ITestResult> results = new ArrayList<>();
-        for (ITestResult result : mResults.values()) {
-            if (result.getResultStatus() == status) {
-                results.add(result);
-            }
-        }
-        return results;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<ITestResult> getResults() {
-        ArrayList<ITestResult> results = new ArrayList<>(mResults.values());
-        Collections.sort(results);
-        return results;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int countResults(TestStatus status) {
-        int total = 0;
-        for (ITestResult result : mResults.values()) {
-            if (result.getResultStatus() == status) {
-                total++;
-            }
-        }
-        return total;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int compareTo(ICaseResult another) {
-        return getName().compareTo(another.getName());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void mergeFrom(ICaseResult otherCaseResult) {
-        if (!otherCaseResult.getName().equals(getName())) {
-            throw new IllegalArgumentException(String.format(
-                "Cannot merge case result with mismatched name. Expected %s, Found %s",
-                        otherCaseResult.getName(), getName()));
-        }
-
-        for (ITestResult otherTestResult : otherCaseResult.getResults()) {
-            mResults.put(otherTestResult.getName(), otherTestResult);
-        }
-    }
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/CddTest.java b/common/util/src/com/android/compatibility/common/util/CddTest.java
deleted file mode 100644
index 34ee663..0000000
--- a/common/util/src/com/android/compatibility/common/util/CddTest.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Marks the type of test with purpose of asserting CDD requirements.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface CddTest {
-    String requirement();
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ChecksumReporter.java b/common/util/src/com/android/compatibility/common/util/ChecksumReporter.java
deleted file mode 100644
index ce39f38..0000000
--- a/common/util/src/com/android/compatibility/common/util/ChecksumReporter.java
+++ /dev/null
@@ -1,393 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-import com.google.common.annotations.VisibleForTesting;
-import com.google.common.base.Joiner;
-import com.google.common.base.Strings;
-import com.google.common.hash.BloomFilter;
-import com.google.common.hash.Funnels;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.ObjectInput;
-import java.io.ObjectInputStream;
-import java.io.ObjectOutput;
-import java.io.ObjectOutputStream;
-import java.io.OutputStream;
-import java.io.Serializable;
-import java.security.DigestException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
-import java.util.Arrays;
-import java.util.HashMap;
-
-/***
- * Calculate and store checksum values for files and test results
- */
-public final class ChecksumReporter implements Serializable {
-
-    public static final String NAME = "checksum.data";
-    public static final String PREV_NAME = "checksum.previous.data";
-
-    private static final double DEFAULT_FPP = 0.05;
-    private static final String SEPARATOR = "/";
-    private static final String ID_SEPARATOR = "@";
-    private static final String NAME_SEPARATOR = ".";
-
-    private static final short CURRENT_VERSION = 1;
-    // Serialized format Id (ie magic number) used to identify serialized data.
-    static final short SERIALIZED_FORMAT_CODE = 650;
-
-    private final BloomFilter<CharSequence> mResultChecksum;
-    private final HashMap<String, byte[]> mFileChecksum;
-    private final short mVersion;
-
-    /***
-     * Calculate checksum of test results and files in result directory and write to disk
-     * @param dir test results directory
-     * @param result test results
-     * @return true if successful, false if unable to calculate or store the checksum
-     */
-    public static boolean tryCreateChecksum(File dir, IInvocationResult result) {
-        try {
-            int totalCount = countTestResults(result);
-            ChecksumReporter checksumReporter =
-                    new ChecksumReporter(totalCount, DEFAULT_FPP, CURRENT_VERSION);
-            checksumReporter.addInvocation(result);
-            checksumReporter.addDirectory(dir);
-            checksumReporter.saveToFile(dir);
-        } catch (Exception e) {
-            return false;
-        }
-        return true;
-    }
-
-    /***
-     * Create Checksum Reporter from data saved on disk
-     * @param directory
-     * @return
-     * @throws ChecksumValidationException
-     */
-    public static ChecksumReporter load(File directory) throws ChecksumValidationException {
-        ChecksumReporter reporter = new ChecksumReporter(directory);
-        if (reporter.getCapacity() > 1.1) {
-            throw new ChecksumValidationException("Capacity exceeded.");
-        }
-        return reporter;
-    }
-
-    /***
-     * Deserialize checksum from file
-     * @param directory the parent directory containing the checksum file
-     * @throws ChecksumValidationException
-     */
-    public ChecksumReporter(File directory) throws ChecksumValidationException {
-        File file = new File(directory, ChecksumReporter.NAME);
-        try (FileInputStream fileStream = new FileInputStream(file);
-            InputStream outputStream = new BufferedInputStream(fileStream);
-            ObjectInput objectInput = new ObjectInputStream(outputStream)) {
-            short magicNumber = objectInput.readShort();
-            switch (magicNumber) {
-                case SERIALIZED_FORMAT_CODE:
-                   mVersion = objectInput.readShort();
-                    mResultChecksum = (BloomFilter<CharSequence>) objectInput.readObject();
-                    mFileChecksum = (HashMap<String, byte[]>) objectInput.readObject();
-                    break;
-                default:
-                    throw new ChecksumValidationException("Unknown format of serialized data.");
-            }
-        } catch (Exception e) {
-            throw new ChecksumValidationException("Unable to load checksum from file", e);
-        }
-        if (mVersion > CURRENT_VERSION) {
-            throw new ChecksumValidationException(
-                    "File contains a newer version of ChecksumReporter");
-        }
-    }
-
-    /***
-     * Create new instance of ChecksumReporter
-     * @param testCount the number of test results that will be stored
-     * @param fpp the false positive percentage for result lookup misses
-     */
-    public ChecksumReporter(int testCount, double fpp, short version) {
-        mResultChecksum = BloomFilter.create(Funnels.unencodedCharsFunnel(),
-                testCount, fpp);
-        mFileChecksum = new HashMap<>();
-        mVersion = version;
-    }
-
-    /***
-     * Add each test result from each module and test case
-     */
-    public void addInvocation(IInvocationResult invocationResult) {
-        for (IModuleResult module : invocationResult.getModules()) {
-            String buildFingerprint = invocationResult.getBuildFingerprint();
-            addModuleResult(module, buildFingerprint);
-            for (ICaseResult caseResult : module.getResults()) {
-                for (ITestResult testResult : caseResult.getResults()) {
-                    addTestResult(testResult, module, buildFingerprint);
-                }
-            }
-        }
-    }
-
-    /***
-     * Calculate CRC of file and store the result
-     * @param file crc calculated on this file
-     * @param path part of the key to identify the files crc
-     */
-    public void addFile(File file, String path) {
-        byte[] crc;
-        try {
-            crc = calculateFileChecksum(file);
-        } catch (ChecksumValidationException e) {
-            crc = new byte[0];
-        }
-        String key = path + SEPARATOR + file.getName();
-        mFileChecksum.put(key, crc);
-    }
-
-    @VisibleForTesting
-    public boolean containsFile(File file, String path) {
-        String key = path + SEPARATOR + file.getName();
-        if (mFileChecksum.containsKey(key))
-        {
-            try {
-                byte[] crc = calculateFileChecksum(file);
-                return Arrays.equals(mFileChecksum.get(key), crc);
-            } catch (ChecksumValidationException e) {
-                return false;
-            }
-        }
-        return false;
-    }
-
-    /***
-     * Adds all child files recursively through all sub directories
-     * @param directory target that is deeply searched for files
-     */
-    public void addDirectory(File directory) {
-        addDirectory(directory, directory.getName());
-    }
-
-    /***
-     * @param path the relative path to the current directory from the base directory
-     */
-    private void addDirectory(File directory, String path) {
-        for(String childName : directory.list()) {
-            File child = new File(directory, childName);
-            if (child.isDirectory()) {
-                addDirectory(child, path + SEPARATOR + child.getName());
-            } else {
-                addFile(child, path);
-            }
-        }
-    }
-
-    /***
-     * Calculate checksum of test result and store the value
-     * @param testResult the target of the checksum
-     * @param moduleResult the module that contains the test result
-     * @param buildFingerprint the fingerprint the test execution is running against
-     */
-    public void addTestResult(
-        ITestResult testResult, IModuleResult moduleResult, String buildFingerprint) {
-
-        String signature = generateTestResultSignature(testResult, moduleResult, buildFingerprint);
-        mResultChecksum.put(signature);
-    }
-
-    @VisibleForTesting
-    public boolean containsTestResult(
-            ITestResult testResult, IModuleResult moduleResult, String buildFingerprint) {
-
-        String signature = generateTestResultSignature(testResult, moduleResult, buildFingerprint);
-        return mResultChecksum.mightContain(signature);
-    }
-
-    /***
-     * Calculate checksm of module result and store value
-     * @param moduleResult  the target of the checksum
-     * @param buildFingerprint the fingerprint the test execution is running against
-     */
-    public void addModuleResult(IModuleResult moduleResult, String buildFingerprint) {
-        mResultChecksum.put(
-                generateModuleResultSignature(moduleResult, buildFingerprint));
-        mResultChecksum.put(
-                generateModuleSummarySignature(moduleResult, buildFingerprint));
-    }
-
-    @VisibleForTesting
-    public Boolean containsModuleResult(IModuleResult moduleResult, String buildFingerprint) {
-        return mResultChecksum.mightContain(
-                generateModuleResultSignature(moduleResult, buildFingerprint));
-    }
-
-    /***
-     * Write the checksum data to disk.
-     * Overwrites existing file
-     * @param directory
-     * @throws IOException
-     */
-    public void saveToFile(File directory) throws IOException {
-        File file = new File(directory, NAME);
-
-        try (FileOutputStream fileStream = new FileOutputStream(file, false);
-             OutputStream outputStream = new BufferedOutputStream(fileStream);
-             ObjectOutput objectOutput = new ObjectOutputStream(outputStream)) {
-            objectOutput.writeShort(SERIALIZED_FORMAT_CODE);
-            objectOutput.writeShort(mVersion);
-            objectOutput.writeObject(mResultChecksum);
-            objectOutput.writeObject(mFileChecksum);
-        }
-    }
-
-    @VisibleForTesting
-    double getCapacity() {
-        // If default FPP changes:
-        // increment the CURRENT_VERSION and set the denominator based on this.mVersion
-        return mResultChecksum.expectedFpp() / DEFAULT_FPP;
-    }
-
-    static String generateTestResultSignature(ITestResult testResult, IModuleResult module,
-            String buildFingerprint) {
-        StringBuilder sb = new StringBuilder();
-        String stacktrace = testResult.getStackTrace();
-
-        stacktrace = stacktrace == null ? "" : stacktrace.trim();
-        // Line endings for stacktraces are somewhat unpredictable and there is no need to
-        // actually read the result they are all removed for consistency.
-        stacktrace = stacktrace.replaceAll("\\r?\\n|\\r", "");
-        sb.append(buildFingerprint).append(SEPARATOR)
-                .append(module.getId()).append(SEPARATOR)
-                .append(testResult.getFullName()).append(SEPARATOR)
-                .append(testResult.getResultStatus().getValue()).append(SEPARATOR)
-                .append(stacktrace).append(SEPARATOR);
-        return sb.toString();
-    }
-
-    static String generateTestResultSignature(
-            String packageName, String suiteName, String caseName, String testName, String abi,
-            String status,
-            String stacktrace,
-            String buildFingerprint) {
-
-        String testId = buildTestId(suiteName, caseName, testName, abi);
-        StringBuilder sb = new StringBuilder();
-
-        stacktrace = stacktrace == null ? "" : stacktrace.trim();
-        // Line endings for stacktraces are somewhat unpredictable and there is no need to
-        // actually read the result they are all removed for consistency.
-        stacktrace = stacktrace.replaceAll("\\r?\\n|\\r", "");
-        sb.append(buildFingerprint)
-                .append(SEPARATOR)
-                .append(packageName)
-                .append(SEPARATOR)
-                .append(testId)
-                .append(SEPARATOR)
-                .append(status)
-                .append(SEPARATOR)
-                .append(stacktrace)
-                .append(SEPARATOR);
-        return sb.toString();
-    }
-
-    private static String buildTestId(
-            String suiteName, String caseName, String testName, String abi) {
-        String name = Joiner.on(NAME_SEPARATOR).skipNulls().join(
-                Strings.emptyToNull(suiteName),
-                Strings.emptyToNull(caseName),
-                Strings.emptyToNull(testName));
-        return Joiner.on(ID_SEPARATOR).skipNulls().join(
-                Strings.emptyToNull(name),
-                Strings.emptyToNull(abi));
-    }
-
-
-    private static String generateModuleResultSignature(IModuleResult module,
-            String buildFingerprint) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(buildFingerprint).append(SEPARATOR)
-                .append(module.getId()).append(SEPARATOR)
-                .append(module.isDone()).append(SEPARATOR)
-                .append(module.countResults(TestStatus.FAIL));
-        return sb.toString();
-    }
-
-    private static String generateModuleSummarySignature(IModuleResult module,
-            String buildFingerprint) {
-        StringBuilder sb = new StringBuilder();
-        sb.append(buildFingerprint).append(SEPARATOR)
-                .append(module.getId()).append(SEPARATOR)
-                .append(module.countResults(TestStatus.FAIL));
-        return sb.toString();
-    }
-
-    static byte[] calculateFileChecksum(File file) throws ChecksumValidationException {
-
-        try (FileInputStream fis = new FileInputStream(file);
-             InputStream inputStream = new BufferedInputStream(fis)) {
-            MessageDigest hashSum = MessageDigest.getInstance("SHA-256");
-            int cnt;
-            int bufferSize = 8192;
-            byte [] buffer = new byte[bufferSize];
-            while ((cnt = inputStream.read(buffer)) != -1) {
-                hashSum.update(buffer, 0, cnt);
-            }
-
-            byte[] partialHash = new byte[32];
-            hashSum.digest(partialHash, 0, 32);
-            return partialHash;
-        } catch (NoSuchAlgorithmException e) {
-            throw new ChecksumValidationException("Unable to hash file.", e);
-        } catch (IOException e) {
-            throw new ChecksumValidationException("Unable to hash file.", e);
-        } catch (DigestException e) {
-            throw new ChecksumValidationException("Unable to hash file.", e);
-        }
-    }
-
-
-    private static int countTestResults(IInvocationResult invocation) {
-        int count = 0;
-        for (IModuleResult module : invocation.getModules()) {
-            // Two entries per module (result & summary)
-            count += 2;
-            for (ICaseResult caseResult : module.getResults()) {
-                count += caseResult.getResults().size();
-            }
-        }
-        return count;
-    }
-
-    public static class ChecksumValidationException extends Exception {
-        public ChecksumValidationException(String detailMessage) {
-            super(detailMessage);
-        }
-
-        public ChecksumValidationException(String detailMessage, Throwable throwable) {
-            super(detailMessage, throwable);
-        }
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/CommonTestUtils.java b/common/util/src/com/android/compatibility/common/util/CommonTestUtils.java
deleted file mode 100644
index 75fa17a..0000000
--- a/common/util/src/com/android/compatibility/common/util/CommonTestUtils.java
+++ /dev/null
@@ -1,42 +0,0 @@
-/*
- * Copyright (C) 2019 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.compatibility.common.util;
-
-import static org.junit.Assert.fail;
-
-// TODO(b/131736394): Remove duplication with HostSideTestUtils.
-/** Utility class for tests. */
-public class CommonTestUtils {
-    @FunctionalInterface
-    public interface BooleanSupplierWithThrow<E extends Throwable> {
-        boolean getAsBoolean() throws E;
-    }
-
-    /** Wait until {@code predicate} is satisfied, or fail, with a given timeout. */
-    public static <E extends Throwable> void waitUntil(
-            String message, long timeoutSeconds, BooleanSupplierWithThrow<E> predicate)
-            throws E, InterruptedException {
-        int sleep = 125;
-        final long timeout = System.currentTimeMillis() + timeoutSeconds * 1000;
-        while (System.currentTimeMillis() < timeout) {
-            if (predicate.getAsBoolean()) {
-                return;
-            }
-            Thread.sleep(sleep);
-        }
-        fail(message);
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/CrashUtils.java b/common/util/src/com/android/compatibility/common/util/CrashUtils.java
deleted file mode 100644
index b397794..0000000
--- a/common/util/src/com/android/compatibility/common/util/CrashUtils.java
+++ /dev/null
@@ -1,261 +0,0 @@
-/*
- * Copyright (C) 2019 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.compatibility.common.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.List;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-import java.math.BigInteger;
-import org.json.JSONArray;
-import org.json.JSONException;
-import org.json.JSONObject;
-
-/** Contains helper functions and shared constants for crash parsing. */
-public class CrashUtils {
-    // used to only detect actual addresses instead of nullptr and other unlikely values
-    public static final BigInteger MIN_CRASH_ADDR = new BigInteger("8000", 16);
-    // Matches the end of a crash
-    public static final Pattern sEndofCrashPattern =
-            Pattern.compile("DEBUG\\s+?:\\s+?backtrace:");
-    public static final String DEVICE_PATH = "/data/local/tmp/CrashParserResults/";
-    public static final String LOCK_FILENAME = "lockFile.loc";
-    public static final String UPLOAD_REQUEST = "Please upload a result file to stagefright";
-    public static final Pattern sUploadRequestPattern =
-            Pattern.compile(UPLOAD_REQUEST);
-    public static final String NEW_TEST_ALERT = "New test starting with name: ";
-    public static final Pattern sNewTestPattern =
-            Pattern.compile(NEW_TEST_ALERT + "(\\w+?)\\(.*?\\)");
-    public static final String SIGNAL = "signal";
-    public static final String NAME = "name";
-    public static final String PROCESS = "process";
-    public static final String PID = "pid";
-    public static final String TID = "tid";
-    public static final String FAULT_ADDRESS = "faultaddress";
-    // Matches the smallest blob that has the appropriate header and footer
-    private static final Pattern sCrashBlobPattern =
-            Pattern.compile("DEBUG\\s+?:( [*]{3})+?.*?DEBUG\\s+?:\\s+?backtrace:", Pattern.DOTALL);
-    // Matches process id and name line and captures them
-    private static final Pattern sPidtidNamePattern =
-            Pattern.compile("pid: (\\d+?), tid: (\\d+?), name: ([^\\s]+?\\s+?)*?>>> (.*?) <<<");
-    // Matches fault address and signal type line
-    private static final Pattern sFaultLinePattern =
-            Pattern.compile(
-                    "\\w+? \\d+? \\((.*?)\\), code -*?\\d+? \\(.*?\\), fault addr "
-                            + "(?:0x(\\p{XDigit}+)|-+)");
-    // Matches the abort message line if it contains CHECK_
-    private static Pattern sAbortMessageCheckPattern =
-            Pattern.compile("(?i)Abort message.*?CHECK_");
-
-    public static final String SIGSEGV = "SIGSEGV";
-    public static final String SIGBUS = "SIGBUS";
-    public static final String SIGABRT = "SIGABRT";
-
-    /**
-     * returns the filename of the process.
-     * e.g. "/system/bin/mediaserver" returns "mediaserver"
-     */
-    public static String getProcessFileName(JSONObject crash) throws JSONException {
-        return new File(crash.getString(PROCESS)).getName();
-    }
-
-    /**
-     * Determines if the given input has a {@link com.android.compatibility.common.util.Crash} that
-     * should fail an sts test
-     *
-     * @param crashes list of crashes to check
-     * @param config crash detection configuration object
-     * @return if a crash is serious enough to fail an sts test
-     */
-    public static boolean securityCrashDetected(JSONArray crashes, Config config) {
-        return matchSecurityCrashes(crashes, config).length() > 0;
-    }
-
-    public static BigInteger getBigInteger(JSONObject source, String name) throws JSONException {
-        if (source.isNull(name)) {
-            return null;
-        }
-        String intString = source.getString(name);
-        BigInteger value = null;
-        try {
-            value = new BigInteger(intString, 16);
-        } catch (NumberFormatException e) {}
-        return value;
-    }
-
-    /**
-     * Determines which given inputs have a {@link com.android.compatibility.common.util.Crash} that
-     * should fail an sts test
-     *
-     * @param crashes list of crashes to check
-     * @param config crash detection configuration object
-     * @return the list of crashes serious enough to fail an sts test
-     */
-    public static JSONArray matchSecurityCrashes(JSONArray crashes, Config config) {
-        JSONArray securityCrashes = new JSONArray();
-        for (int i = 0; i < crashes.length(); i++) {
-            try {
-                JSONObject crash = crashes.getJSONObject(i);
-
-                // match process patterns
-                if (!matchesAny(getProcessFileName(crash), config.processPatterns)) {
-                    continue;
-                }
-
-                // match signal
-                String crashSignal = crash.getString(SIGNAL);
-                if (!config.signals.contains(crashSignal)) {
-                    continue;
-                }
-
-                // if check specified, reject crash if address is unlikely to be security-related
-                if (config.checkMinAddress) {
-                    BigInteger faultAddress = getBigInteger(crash, FAULT_ADDRESS);
-                    if (faultAddress != null
-                            && faultAddress.compareTo(config.minCrashAddress) < 0) {
-                        continue;
-                    }
-                }
-                securityCrashes.put(crash);
-            } catch (JSONException e) {}
-        }
-        return securityCrashes;
-    }
-
-    /**
-     * returns true if the input matches any of the patterns.
-     */
-    private static boolean matchesAny(String input, Collection<Pattern> patterns) {
-        for (Pattern p : patterns) {
-            if (p.matcher(input).matches()) {
-                return true;
-            }
-        }
-        return false;
-    }
-
-    /** Adds all crashes found in the input as JSONObjects to the given JSONArray */
-    public static JSONArray addAllCrashes(String input, JSONArray crashes) {
-        Matcher crashBlobFinder = sCrashBlobPattern.matcher(input);
-        while (crashBlobFinder.find()) {
-            String crashStr = crashBlobFinder.group(0);
-            int tid = 0;
-            int pid = 0;
-            BigInteger faultAddress = null;
-            String name = null;
-            String process = null;
-            String signal = null;
-
-            Matcher pidtidNameMatcher = sPidtidNamePattern.matcher(crashStr);
-            if (pidtidNameMatcher.find()) {
-                try {
-                    pid = Integer.parseInt(pidtidNameMatcher.group(1));
-                } catch (NumberFormatException e) {}
-                try {
-                    tid = Integer.parseInt(pidtidNameMatcher.group(2));
-                } catch (NumberFormatException e) {}
-                name = pidtidNameMatcher.group(3).trim();
-                process = pidtidNameMatcher.group(4).trim();
-            }
-
-            Matcher faultLineMatcher = sFaultLinePattern.matcher(crashStr);
-            if (faultLineMatcher.find()) {
-                signal = faultLineMatcher.group(1);
-                String faultAddrMatch = faultLineMatcher.group(2);
-                if (faultAddrMatch != null) {
-                    try {
-                        faultAddress = new BigInteger(faultAddrMatch, 16);
-                    } catch (NumberFormatException e) {}
-                }
-            }
-            if (!sAbortMessageCheckPattern.matcher(crashStr).find()) {
-                try {
-                    JSONObject crash = new JSONObject();
-                    crash.put(PID, pid);
-                    crash.put(TID, tid);
-                    crash.put(NAME, name);
-                    crash.put(PROCESS, process);
-                    crash.put(FAULT_ADDRESS,
-                            faultAddress == null ? null : faultAddress.toString(16));
-                    crash.put(SIGNAL, signal);
-                    crashes.put(crash);
-                } catch (JSONException e) {}
-            }
-        }
-        return crashes;
-    }
-
-    public static class Config {
-        private boolean checkMinAddress;
-        private BigInteger minCrashAddress;
-        private List<String> signals;
-        private List<Pattern> processPatterns;
-
-        public Config() {
-            checkMinAddress = true;
-            minCrashAddress = MIN_CRASH_ADDR;
-            setSignals(SIGSEGV, SIGBUS);
-            processPatterns = new ArrayList();
-        }
-
-        public Config setMinAddress(BigInteger minCrashAddress) {
-            this.minCrashAddress = minCrashAddress;
-            return this;
-        }
-
-        public Config checkMinAddress(boolean checkMinAddress) {
-            this.checkMinAddress = checkMinAddress;
-            return this;
-        }
-
-        public Config setSignals(String... signals) {
-            this.signals = new ArrayList(Arrays.asList(signals));
-            return this;
-        }
-
-        public Config appendSignals(String... signals) {
-            Collections.addAll(this.signals, signals);
-            return this;
-        }
-
-        public Config setProcessPatterns(String... processPatternStrings) {
-            Pattern[] processPatterns = new Pattern[processPatternStrings.length];
-            for (int i = 0; i < processPatternStrings.length; i++) {
-                processPatterns[i] = Pattern.compile(processPatternStrings[i]);
-            }
-            return setProcessPatterns(processPatterns);
-        }
-
-        public Config setProcessPatterns(Pattern... processPatterns) {
-            this.processPatterns = new ArrayList(Arrays.asList(processPatterns));
-            return this;
-        }
-
-        public List<Pattern> getProcessPatterns() {
-            return Collections.unmodifiableList(processPatterns);
-        }
-
-        public Config appendProcessPatterns(Pattern... processPatterns) {
-            Collections.addAll(this.processPatterns, processPatterns);
-            return this;
-        }
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/CtsDownstreamingTest.java b/common/util/src/com/android/compatibility/common/util/CtsDownstreamingTest.java
deleted file mode 100644
index 5dce31c..0000000
--- a/common/util/src/com/android/compatibility/common/util/CtsDownstreamingTest.java
+++ /dev/null
@@ -1,33 +0,0 @@
-/*
- * Copyright (C) 2019 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.compatibility.common.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation marking a test case as a CTS downstreaming test.
- * <p>
- * Test classes and test cases marked with this annotation will be excluded
- * from CTS runs, and included in GTS releases.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface CtsDownstreamingTest {
-}
diff --git a/common/util/src/com/android/compatibility/common/util/DevicePropertyInfo.java b/common/util/src/com/android/compatibility/common/util/DevicePropertyInfo.java
deleted file mode 100644
index 7435839..0000000
--- a/common/util/src/com/android/compatibility/common/util/DevicePropertyInfo.java
+++ /dev/null
@@ -1,140 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Utility class for collecting device information. This is used to enforce
- * consistent property collection host-side and device-side for CTS reports.
- *
- * Note that properties across sources can differ, e.g. {@code android.os.Build}
- * properties sometimes deviate from the read-only properties that they're based
- * on.
- */
-public final class DevicePropertyInfo {
-
-    private final String mAbi;
-    private final String mAbi2;
-    private final String mAbis;
-    private final String mAbis32;
-    private final String mAbis64;
-    private final String mBoard;
-    private final String mBrand;
-    private final String mDevice;
-    private final String mFingerprint;
-    private final String mId;
-    private final String mManufacturer;
-    private final String mModel;
-    private final String mProduct;
-    private final String mReferenceFingerprint;
-    private final String mVendorFingerprint;
-    private final String mSerial;
-    private final String mTags;
-    private final String mType;
-    private final String mVersionBaseOs;
-    private final String mVersionRelease;
-    private final String mVersionSdk;
-    private final String mVersionSecurityPatch;
-    private final String mVersionIncremental;
-
-    public DevicePropertyInfo(
-            String abi,
-            String abi2,
-            String abis,
-            String abis32,
-            String abis64,
-            String board,
-            String brand,
-            String device,
-            String fingerprint,
-            String vendorFingerprint,
-            String id,
-            String manufacturer,
-            String model,
-            String product,
-            String referenceFingerprint,
-            String serial,
-            String tags,
-            String type,
-            String versionBaseOs,
-            String versionRelease,
-            String versionSdk,
-            String versionSecurityPatch,
-            String versionIncremental) {
-        mAbi = abi;
-        mAbi2 = abi2;
-        mAbis = abis;
-        mAbis32 = abis32;
-        mAbis64 = abis64;
-        mBoard = board;
-        mBrand = brand;
-        mDevice = device;
-        mFingerprint = fingerprint;
-        mVendorFingerprint = vendorFingerprint;
-        mId = id;
-        mManufacturer = manufacturer;
-        mModel = model;
-        mProduct = product;
-        mReferenceFingerprint = referenceFingerprint;
-        mSerial = serial;
-        mTags = tags;
-        mType = type;
-        mVersionBaseOs = versionBaseOs;
-        mVersionRelease = versionRelease;
-        mVersionSdk = versionSdk;
-        mVersionSecurityPatch = versionSecurityPatch;
-        mVersionIncremental = versionIncremental;
-    }
-
-    /**
-     * Return a {@code Map} with property keys prepended with a given prefix
-     * string. This is intended to be used to generate entries for
-     * {@code} Build tag attributes in CTS test results.
-     */
-    public Map<String, String> getPropertytMapWithPrefix(String prefix) {
-        Map<String, String> propertyMap = new HashMap<>();
-
-        propertyMap.put(prefix + "abi", mAbi);
-        propertyMap.put(prefix + "abi2", mAbi2);
-        propertyMap.put(prefix + "abis", mAbis);
-        propertyMap.put(prefix + "abis_32", mAbis32);
-        propertyMap.put(prefix + "abis_64", mAbis64);
-        propertyMap.put(prefix + "board", mBoard);
-        propertyMap.put(prefix + "brand", mBrand);
-        propertyMap.put(prefix + "device", mDevice);
-        propertyMap.put(prefix + "fingerprint", mFingerprint);
-        propertyMap.put(prefix + "vendor_fingerprint", mVendorFingerprint);
-        propertyMap.put(prefix + "id", mId);
-        propertyMap.put(prefix + "manufacturer", mManufacturer);
-        propertyMap.put(prefix + "model", mModel);
-        propertyMap.put(prefix + "product", mProduct);
-        propertyMap.put(prefix + "reference_fingerprint", mReferenceFingerprint);
-        propertyMap.put(prefix + "serial", mSerial);
-        propertyMap.put(prefix + "tags", mTags);
-        propertyMap.put(prefix + "type", mType);
-        propertyMap.put(prefix + "version_base_os", mVersionBaseOs);
-        propertyMap.put(prefix + "version_release", mVersionRelease);
-        propertyMap.put(prefix + "version_sdk", mVersionSdk);
-        propertyMap.put(prefix + "version_security_patch", mVersionSecurityPatch);
-        propertyMap.put(prefix + "version_incremental", mVersionIncremental);
-
-        return propertyMap;
-    }
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/DynamicConfig.java b/common/util/src/com/android/compatibility/common/util/DynamicConfig.java
deleted file mode 100644
index 797afea..0000000
--- a/common/util/src/com/android/compatibility/common/util/DynamicConfig.java
+++ /dev/null
@@ -1,150 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import static org.junit.Assert.assertTrue;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
-
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Load dynamic config for test cases
- */
-public class DynamicConfig {
-
-    //XML constant
-    public static final String NS = null;
-    public static final String CONFIG_TAG = "dynamicConfig";
-    public static final String ENTRY_TAG = "entry";
-    public static final String VALUE_TAG = "value";
-    public static final String KEY_ATTR = "key";
-
-    public static final String REMOTE_CONFIG_REQUIRED_KEY = "remote_config_required";
-    public static final String REMOTE_CONFIG_RETRIEVED_KEY = "remote_config_retrieved";
-    public static final String CONFIG_FOLDER_ON_DEVICE = "/sdcard/dynamic-config-files/";
-
-    protected Map<String, List<String>> mDynamicConfigMap = new HashMap<String, List<String>>();
-
-    public void initializeConfig(File file) throws XmlPullParserException, IOException {
-        mDynamicConfigMap = createConfigMap(file);
-    }
-
-    /** Init using directly a {@link FileInputStream} from the config file. */
-    public void initializeConfig(FileInputStream fileStream)
-            throws XmlPullParserException, IOException {
-        mDynamicConfigMap = createConfigMap(fileStream);
-    }
-
-    public String getValue(String key) {
-        assertRemoteConfigRequirementMet();
-        List<String> singleValue = mDynamicConfigMap.get(key);
-        if (singleValue == null || singleValue.size() == 0 || singleValue.size() > 1) {
-            // key must exist in the map, and map to a list containing exactly one string
-            return null;
-        }
-        return singleValue.get(0);
-    }
-
-    public List<String> getValues(String key) {
-        assertRemoteConfigRequirementMet();
-        return mDynamicConfigMap.get(key);
-    }
-
-    public Set<String> keySet() {
-        assertRemoteConfigRequirementMet();
-        return mDynamicConfigMap.keySet();
-    }
-
-    public boolean remoteConfigRequired() {
-        if (mDynamicConfigMap.containsKey(REMOTE_CONFIG_REQUIRED_KEY)) {
-            String val = mDynamicConfigMap.get(REMOTE_CONFIG_REQUIRED_KEY).get(0);
-            return Boolean.parseBoolean(val);
-        }
-        return true; // require remote configuration by default
-    }
-
-    public boolean remoteConfigRetrieved() {
-        // assume config will always contain exactly one value, populated by DynamicConfigHandler
-        String val = mDynamicConfigMap.get(REMOTE_CONFIG_RETRIEVED_KEY).get(0);
-        return Boolean.parseBoolean(val);
-    }
-
-    public void assertRemoteConfigRequirementMet() {
-        assertTrue("Remote connection to DynamicConfigService required for this test",
-                !remoteConfigRequired() || remoteConfigRetrieved());
-    }
-
-    public static File getConfigFile(File configFolder, String moduleName)
-            throws FileNotFoundException {
-        File config = getConfigFileUnchecked(configFolder, moduleName);
-        if (!config.exists()) {
-            throw new FileNotFoundException(String.format("Cannot find %s.dynamic", moduleName));
-        }
-        return config;
-    }
-
-    public static File getConfigFileUnchecked(File configFolder, String moduleName) {
-        return new File(configFolder, String.format("%s.dynamic", moduleName));
-    }
-
-    public static Map<String, List<String>> createConfigMap(File file)
-            throws XmlPullParserException, IOException {
-        try (FileInputStream stream = new FileInputStream(file)) {
-            return createConfigMap(stream);
-        }
-    }
-
-    public static Map<String, List<String>> createConfigMap(FileInputStream fileStream)
-            throws XmlPullParserException, IOException {
-
-        Map<String, List<String>> dynamicConfigMap = new HashMap<String, List<String>>();
-        XmlPullParser parser = XmlPullParserFactory.newInstance().newPullParser();
-        parser.setInput(new InputStreamReader(fileStream));
-        parser.nextTag();
-        parser.require(XmlPullParser.START_TAG, NS, CONFIG_TAG);
-
-        while (parser.nextTag() == XmlPullParser.START_TAG) {
-            parser.require(XmlPullParser.START_TAG, NS, ENTRY_TAG);
-            String key = parser.getAttributeValue(NS, KEY_ATTR);
-            List<String> valueList = new ArrayList<String>();
-            while (parser.nextTag() == XmlPullParser.START_TAG) {
-                parser.require(XmlPullParser.START_TAG, NS, VALUE_TAG);
-                valueList.add(parser.nextText());
-                parser.require(XmlPullParser.END_TAG, NS, VALUE_TAG);
-            }
-            parser.require(XmlPullParser.END_TAG, NS, ENTRY_TAG);
-            if (key != null && !key.isEmpty()) {
-                dynamicConfigMap.put(key, valueList);
-            }
-        }
-
-        parser.require(XmlPullParser.END_TAG, NS, CONFIG_TAG);
-        return dynamicConfigMap;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/FileUtil.java b/common/util/src/com/android/compatibility/common/util/FileUtil.java
deleted file mode 100644
index b59912b..0000000
--- a/common/util/src/com/android/compatibility/common/util/FileUtil.java
+++ /dev/null
@@ -1,71 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-
-/**
- * A helper class for file related operations
- */
-public class FileUtil {
-
-    /**
-     * Recursively delete given file or directory and all its contents.
-     *
-     * @param rootDir the directory or file to be deleted; can be null
-     */
-    public static void recursiveDelete(File rootDir) {
-        if (rootDir != null) {
-            if (rootDir.isDirectory()) {
-                File[] childFiles = rootDir.listFiles();
-                if (childFiles != null) {
-                    for (File child : childFiles) {
-                        recursiveDelete(child);
-                    }
-                }
-            }
-            rootDir.delete();
-        }
-    }
-
-    /**
-     * A helper method for writing stream data to file
-     *
-     * @param input the unbuffered input stream
-     * @param destFile the dest file to write to
-     */
-    public static void writeToFile(InputStream input, File destFile) throws IOException {
-        InputStream origStream = null;
-        OutputStream destStream = null;
-        try {
-            origStream = new BufferedInputStream(input);
-            destStream = new BufferedOutputStream(new FileOutputStream(destFile));
-            StreamUtil.copyStreams(origStream, destStream);
-        } finally {
-            origStream.close();
-            destStream.flush();
-            destStream.close();
-        }
-    }
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/GmsTest.java b/common/util/src/com/android/compatibility/common/util/GmsTest.java
deleted file mode 100644
index 0032000..0000000
--- a/common/util/src/com/android/compatibility/common/util/GmsTest.java
+++ /dev/null
@@ -1,29 +0,0 @@
-/*
- * Copyright (C) 2020 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.compatibility.common.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/** Marks the type of test with purpose of asserting GMS requirements. */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface GmsTest {
-    String requirement();
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ICaseResult.java b/common/util/src/com/android/compatibility/common/util/ICaseResult.java
deleted file mode 100644
index 5904d69..0000000
--- a/common/util/src/com/android/compatibility/common/util/ICaseResult.java
+++ /dev/null
@@ -1,62 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.util.List;
-
-/**
- * Data structure for a Compatibility test case result.
- */
-public interface ICaseResult extends Comparable<ICaseResult> {
-
-    String getName();
-
-    /**
-     * Gets a {@link ITestResult} for the given test, creating it if it doesn't exist.
-     *
-     * @param testName the name of the test eg &lt;method-name&gt;
-     * @return the {@link ITestResult} or <code>null</code>
-     */
-    ITestResult getOrCreateResult(String testName);
-
-    /**
-     * Gets the {@link ITestResult} for given test.
-     *
-     * @param testName the name of the test eg &lt;method-name&gt;
-     * @return the {@link ITestResult} or <code>null</code>
-     */
-    ITestResult getResult(String testName);
-
-    /**
-     * Gets all results sorted by name.
-     */
-    List<ITestResult> getResults();
-
-    /**
-     * Gets all results which have the given status.
-     */
-    List<ITestResult> getResults(TestStatus status);
-
-    /**
-     * Counts the number of results which have the given status.
-     */
-    int countResults(TestStatus status);
-
-    /**
-     * Merge the case results from otherCaseResult into this caseResult.
-     */
-    void mergeFrom(ICaseResult otherCaseResult);
-}
diff --git a/common/util/src/com/android/compatibility/common/util/IInvocationResult.java b/common/util/src/com/android/compatibility/common/util/IInvocationResult.java
deleted file mode 100644
index 96eca2d..0000000
--- a/common/util/src/com/android/compatibility/common/util/IInvocationResult.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.io.File;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Interface for a the result of a single Compatibility invocation.
- */
-public interface IInvocationResult {
-
-    /**
-     * @return the starting timestamp.
-     */
-    long getStartTime();
-
-    /**
-     * @param time the starting timestamp
-     */
-    void setStartTime(long time);
-
-    /**
-     * Count the number of results with given status.
-     */
-    int countResults(TestStatus result);
-
-    /**
-     * @return the number of tests that have not been executed in this moduleResult.
-     */
-    int getNotExecuted();
-
-    /**
-     * @param plan the plan associated with this result.
-     */
-    void setTestPlan(String plan);
-
-    /**
-     * @return the test plan associated with this result.
-     */
-    String getTestPlan();
-
-    /**
-     * Adds the given device serial to the result.
-     */
-    void addDeviceSerial(String serial);
-
-    /**
-     * @return the device serials associated with result.
-     */
-    Set<String> getDeviceSerials();
-
-    /**
-     * @return the {@link IModuleResult} for the given id, creating one if it doesn't exist
-     */
-    IModuleResult getOrCreateModule(String id);
-
-    /**
-     * @return the {@link IModuleResult}s sorted by id.
-     */
-    List<IModuleResult> getModules();
-
-    /**
-     * Merges a module result to the invocation result.
-     */
-    void mergeModuleResult(IModuleResult moduleResult);
-
-    /**
-     * Adds the given invocation info to the result.
-     */
-    void addInvocationInfo(String key, String value);
-
-    /**
-     * Gets the {@link Map} of invocation info collected.
-     */
-    Map<String, String> getInvocationInfo();
-
-    /**
-     *  Set the string containing the command line arguments to the run command.
-     */
-    void setCommandLineArgs(String setCommandLineArgs);
-
-    /**
-     * Retrieve the command line arguments to the run command.
-     */
-    String getCommandLineArgs();
-
-    /**
-     * @param buildFingerprint the build fingerprint associated with this result.
-     */
-    void setBuildFingerprint(String buildFingerprint);
-
-    /**
-     * @return the device build fingerprint associated with result.
-     */
-    String getBuildFingerprint();
-
-    /**
-     * Return the number of completed test modules for this invocation.
-     */
-    int getModuleCompleteCount();
-
-    /**
-     * Return status of checksum from previous session
-     */
-    RetryChecksumStatus getRetryChecksumStatus();
-
-    /**
-     * Set status of checksum from previous session
-     */
-    void setRetryChecksumStatus(RetryChecksumStatus retryStatus);
-
-    /**
-     * Return the directory of the previous sessions results
-     */
-    File getRetryDirectory();
-
-    /**
-     * Set the directory of the previous sessions results
-     */
-    void setRetryDirectory(File resultDir);
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/IModuleResult.java b/common/util/src/com/android/compatibility/common/util/IModuleResult.java
deleted file mode 100644
index 73188e0..0000000
--- a/common/util/src/com/android/compatibility/common/util/IModuleResult.java
+++ /dev/null
@@ -1,157 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.util.List;
-
-/**
- * Data structure for a Compatibility test module result.
- */
-public interface IModuleResult extends Comparable<IModuleResult> {
-
-    String getId();
-
-    String getName();
-
-    String getAbi();
-
-    void addRuntime(long elapsedTime);
-
-    void resetRuntime();
-
-    long getRuntime();
-
-    /**
-     * Get the estimate of not-executed tests for this module. This estimate is a maximum
-     * not-executed count, assuming all test runs have been started.
-     * @return estimate of not-executed tests
-     */
-    int getNotExecuted();
-
-    /**
-     * Set the estimate of not-executed tests for this module. This estimate is a maximum
-     * not-executed count, assuming all test runs have been started.
-     * @param estimate of not-executed tests
-     */
-    void setNotExecuted(int numTests);
-
-    /**
-     * Whether all expected tests have been executed and all expected test runs have been seen
-     * and completed.
-     *
-     * @return the comprehensive completeness status of the module
-     */
-    boolean isDone();
-
-    /**
-     * Whether all expected tests have been executed for the test runs seen so far.
-     *
-     * @return the completeness status of the module so far
-     */
-    boolean isDoneSoFar();
-
-    /**
-     * Explicitly sets the "done" status for this module. To be used when constructing this
-     * instance from an XML report. The done status for an {@link IModuleResult} can be changed
-     * indiscriminately by method setDone(boolean) immediately after a call to initializeDone,
-     * whereas the status may only be switched to false immediately after a call to setDone.
-     *
-     * @param done the initial completeness status of the module
-     */
-    void initializeDone(boolean done);
-
-    /**
-     * Sets the "done" status for this module. To be used after each test run for the module.
-     * After setDone is used once, subsequent calls to setDone will AND the given value with the
-     * existing done status value. Thus a module with "done" already set to false cannot be marked
-     * done unless re-initialized (see initializeDone).
-     *
-     * @param done the completeness status of the module for a test run
-     */
-    void setDone(boolean done);
-
-    /**
-     * Sets the "in-progress" status for this module. Useful for tracking completion of the module
-     * in the case that a test run begins but never ends.
-     *
-     * @param inProgress whether the module is currently in progress
-     */
-    void inProgress(boolean inProgress);
-
-    /**
-     * @return the number of expected test runs for this module in this invocation
-     */
-    int getExpectedTestRuns();
-
-    /**
-     * @param the number of expected test runs for this module in this invocation
-     */
-    void setExpectedTestRuns(int numRuns);
-
-    /**
-     * @return the number of test runs seen for this module in this invocation
-     */
-    int getTestRuns();
-
-    /**
-     * Adds to the count of test runs seen for this module in this invocation
-     */
-    void addTestRun();
-
-    /**
-     * Reset the count of test runs seen for this module in this invocation. Should be performed
-     * after merging the module into another module, so that future merges do not double-count the
-     * same test runs.
-     */
-    void resetTestRuns();
-
-    /**
-     * Gets a {@link ICaseResult} for the given testcase, creating it if it doesn't exist.
-     *
-     * @param caseName the name of the testcase eg &lt;package-name&gt;&lt;class-name&gt;
-     * @return the {@link ICaseResult} or <code>null</code>
-     */
-    ICaseResult getOrCreateResult(String caseName);
-
-    /**
-     * Gets the {@link ICaseResult} result for given testcase.
-     *
-     * @param caseName the name of the testcase eg &lt;package-name&gt;&lt;class-name&gt;
-     * @return the {@link ITestResult} or <code>null</code>
-     */
-    ICaseResult getResult(String caseName);
-
-    /**
-     * Gets all results sorted by name.
-     */
-    List<ICaseResult> getResults();
-
-    /**
-     * Counts the number of results which have the given status.
-     */
-    int countResults(TestStatus status);
-
-    /** Sets the module as failed. */
-    void setFailed();
-
-    /** Returns whether or not the module has failed. */
-    boolean isFailed();
-
-    /**
-     * Merge the module results from otherModuleResult into this moduleResult.
-     */
-    void mergeFrom(IModuleResult otherModuleResult);
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ITestResult.java b/common/util/src/com/android/compatibility/common/util/ITestResult.java
deleted file mode 100644
index 33340e6..0000000
--- a/common/util/src/com/android/compatibility/common/util/ITestResult.java
+++ /dev/null
@@ -1,173 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.util.List;
-
-/**
- * Represents a single test result.
- */
-public interface ITestResult extends Comparable<ITestResult> {
-
-    /**
-     * @return The name of this test result.
-     */
-    String getName();
-
-    /**
-     * @return The full name of this test result, ie
-     * &lt;package-name&gt;.&lt;class-name&gt;#&lt;method-name&gt;
-     */
-    String getFullName();
-
-    /**
-     * @return The {@link TestStatus} of this result.
-     */
-    TestStatus getResultStatus();
-
-    /**
-     * Sets the {@link TestStatus} of the result and updates the end time of the test.
-     *
-     * @param status The {@link TestStatus} of this result.
-     */
-    void setResultStatus(TestStatus status);
-
-    /**
-     * @return The failure message to display
-     */
-    String getMessage();
-
-    /**
-     * @param message The message to display which describes the failure
-     */
-    void setMessage(String message);
-
-    /**
-     * @return The stack trace generated by the failure
-     */
-    String getStackTrace();
-
-    /**
-     * @param stackTrace the stack trace generated by the failure.
-     */
-    void setStackTrace(String stackTrace);
-
-    /**
-     * @return the metrics report.
-     */
-    ReportLog getReportLog();
-
-    /**
-     * @param report the metrics report.
-     */
-    void setReportLog(ReportLog report);
-
-    /**
-     * @return the path of the bug report generated of the failure.
-     */
-    String getBugReport();
-
-    /**
-     * @param path the path of the bug report generated of the failure.
-     */
-    void setBugReport(String path);
-
-    /**
-     * @return the path of the log file generated of the failure.
-     */
-    String getLog();
-
-    /**
-     * @param path the path of the log file generated of the failure.
-     */
-    void setLog(String path);
-
-    /**
-     * @return the path of the screenshot file generated of the failure.
-     */
-    String getScreenshot();
-
-    /**
-     * @param path the path of the screenshot file generated of the failure.
-     */
-    void setScreenshot(String path);
-
-    /**
-     * Report the test as a failure.
-     *
-     * @param trace the stacktrace of the failure.
-     */
-    void failed(String trace);
-
-    /**
-     * Report that the test has completed.
-     *
-     * @param report A report generated by the test, or null.
-     */
-    void passed(ReportLog report);
-
-    /**
-     * Report that the test was skipped.
-     *
-     * This means that the test is not considered appropriate for the
-     * current device, and thus is never attempted. The test does not require execution,
-     * and nothing more needs to be done.
-     */
-    void skipped();
-
-    /**
-     * Retrieves whether execution for this test result has been determined unnecessary.
-     */
-    boolean isSkipped();
-
-    /**
-     * Resets the result.
-     */
-    void reset();
-
-    /**
-     * Sets whether the test result status has been generated from a previous testing session.
-     */
-    void setRetry(boolean isRetry);
-
-    /**
-     * Retrieves whether the test result status has been generated from a previous testing session.
-     */
-    boolean isRetry();
-
-    /**
-     * Clear the existing result and default to 'failed'
-     */
-    void removeResult();
-
-    /**
-     * This method is to record per-case history for CTS Verifier. If this field is used for large
-     * test suites like CTS, it may cause performance issues in APFE. Thus please do not use this
-     * field in other test suites.
-     *
-     * @return The test result histories
-     */
-    List<TestResultHistory> getTestResultHistories();
-
-    /**
-     * Set test result histories of test item. This method is for per-case history in CTS Verifier.
-     * If this field is used for large test suites like CTS, it may cause performance issues in
-     * APFE. Thus please do not use this field in other test suites.
-     *
-     * @param resultHistories The test result histories.
-     */
-    void setTestResultHistories(List<TestResultHistory> resultHistories);
-}
diff --git a/common/util/src/com/android/compatibility/common/util/InfoStore.java b/common/util/src/com/android/compatibility/common/util/InfoStore.java
deleted file mode 100644
index f677c80..0000000
--- a/common/util/src/com/android/compatibility/common/util/InfoStore.java
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-import java.io.IOException;
-import java.lang.AutoCloseable;
-import java.util.Arrays;
-import java.util.List;
-
-public abstract class InfoStore implements AutoCloseable {
-
-    protected static final int MAX_STRING_LENGTH = 1000;
-    protected static final int MAX_ARRAY_LENGTH = 1000;
-    protected static final int MAX_LIST_LENGTH = 1000;
-
-    /**
-     * Opens the file for storage and creates the writer.
-     */
-    abstract void open() throws IOException;
-
-    /**
-     * Closes the writer.
-     */
-    @Override
-    public abstract void close() throws Exception;
-
-    /**
-     * Start a new group of result.
-     */
-    abstract void startGroup() throws IOException;
-
-    /**
-     * Start a new group of result with specified name.
-     */
-    abstract void startGroup(String name) throws IOException;
-
-    /**
-     * Complete adding result to the last started group.
-     */
-    abstract void endGroup() throws IOException;
-
-    /**
-     * Start a new array of result.
-     */
-    abstract void startArray() throws IOException;
-
-    /**
-     * Start a new array of result with specified name.
-     */
-    abstract void startArray(String name) throws IOException;
-
-    /**
-     * Complete adding result to the last started array.
-     */
-    abstract void endArray() throws IOException;
-
-    /**
-     * Adds a int value to the InfoStore
-     */
-    abstract void addResult(String name, int value) throws IOException;
-
-    /**
-     * Adds a long value to the InfoStore
-     */
-    abstract void addResult(String name, long value) throws IOException;
-
-    /**
-     * Adds a float value to the InfoStore
-     */
-    abstract void addResult(String name, float value) throws IOException;
-
-    /**
-     * Adds a double value to the InfoStore
-     */
-    abstract void addResult(String name, double value) throws IOException;
-
-    /**
-     * Adds a boolean value to the InfoStore
-     */
-    abstract void addResult(String name, boolean value) throws IOException;
-
-    /**
-     * Adds a String value to the InfoStore
-     */
-    abstract void addResult(String name, String value) throws IOException;
-
-    /**
-     * Adds a int array to the InfoStore
-     */
-    abstract void addArrayResult(String name, int[] array) throws IOException;
-
-    /**
-     * Adds a long array to the InfoStore
-     */
-    abstract void addArrayResult(String name, long[] array) throws IOException;
-
-    /**
-     * Adds a float array to the InfoStore
-     */
-    abstract void addArrayResult(String name, float[] array) throws IOException;
-
-    /**
-     * Adds a double array to the InfoStore
-     */
-    abstract void addArrayResult(String name, double[] array) throws IOException;
-
-    /**
-     * Adds a boolean array to the InfoStore
-     */
-    abstract void addArrayResult(String name, boolean[] array) throws IOException;
-
-    /**
-     * Adds a List of String to the InfoStore
-     */
-    abstract void addListResult(String name, List<String> list) throws IOException;
-
-    protected static int[] checkArray(int[] values) {
-        if (values.length > MAX_ARRAY_LENGTH) {
-            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
-        } else {
-            return values;
-        }
-    }
-
-    protected static long[] checkArray(long[] values) {
-        if (values.length > MAX_ARRAY_LENGTH) {
-            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
-        } else {
-            return values;
-        }
-    }
-
-    protected static float[] checkArray(float[] values) {
-        if (values.length > MAX_ARRAY_LENGTH) {
-            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
-        } else {
-            return values;
-        }
-    }
-
-    protected static double[] checkArray(double[] values) {
-        if (values.length > MAX_ARRAY_LENGTH) {
-            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
-        } else {
-            return values;
-        }
-    }
-
-    protected static boolean[] checkArray(boolean[] values) {
-        if (values.length > MAX_ARRAY_LENGTH) {
-            return Arrays.copyOf(values, MAX_ARRAY_LENGTH);
-        } else {
-            return values;
-        }
-    }
-
-    protected static List<String> checkStringList(List<String> list) {
-        if (list.size() > MAX_LIST_LENGTH) {
-            return list.subList(0, MAX_LIST_LENGTH);
-        }
-        return list;
-    }
-
-    protected static String checkString(String value) {
-        if (value == null || value.isEmpty()) {
-            return "";
-        }
-        if (value.length() > MAX_STRING_LENGTH) {
-            return value.substring(0, MAX_STRING_LENGTH);
-        }
-        return value;
-    }
-
-    protected static String checkName(String value) {
-        if (value == null || value.isEmpty()) {
-            throw new NullPointerException();
-        }
-        return value;
-    }
-
-    protected static boolean isDoubleNaNOrInfinite(Double value) {
-        return Double.isNaN(value) || Double.isInfinite(value);
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/InvocationResult.java b/common/util/src/com/android/compatibility/common/util/InvocationResult.java
deleted file mode 100644
index f4f294e..0000000
--- a/common/util/src/com/android/compatibility/common/util/InvocationResult.java
+++ /dev/null
@@ -1,252 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Data structure for the detailed Compatibility test results.
- */
-public class InvocationResult implements IInvocationResult {
-
-    /** Helper object for JSON conversion. */
-    public static final class RunHistory {
-        public long startTime;
-        public long endTime;
-    }
-
-    private Collection<RunHistory> mRunHistories = new ArrayList<>();
-
-    private long mTimestamp;
-    private Map<String, IModuleResult> mModuleResults = new LinkedHashMap<>();
-    private Map<String, String> mInvocationInfo = new HashMap<>();
-    private Set<String> mSerials = new HashSet<>();
-    private String mBuildFingerprint;
-    private String mTestPlan;
-    private String mCommandLineArgs;
-    private RetryChecksumStatus mRetryChecksumStatus = RetryChecksumStatus.NotRetry;
-    private File mRetryDirectory = null;
-
-    /** @return a collection of the run history of previous runs. */
-    public Collection<RunHistory> getRunHistories() {
-        return mRunHistories;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<IModuleResult> getModules() {
-        ArrayList<IModuleResult> modules = new ArrayList<>(mModuleResults.values());
-        Collections.sort(modules);
-        return modules;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int countResults(TestStatus result) {
-        int total = 0;
-        for (IModuleResult m : mModuleResults.values()) {
-            total += m.countResults(result);
-        }
-        return total;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getNotExecuted() {
-        int numTests = 0;
-        for (IModuleResult module : mModuleResults.values()) {
-            numTests += module.getNotExecuted();
-        }
-        return numTests;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public IModuleResult getOrCreateModule(String id) {
-        IModuleResult moduleResult = mModuleResults.get(id);
-        if (moduleResult == null) {
-            moduleResult = new ModuleResult(id);
-            mModuleResults.put(id, moduleResult);
-        }
-        return moduleResult;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void mergeModuleResult(IModuleResult moduleResult) {
-        // Merge the moduleResult with any existing module result
-        IModuleResult existingModuleResult = getOrCreateModule(moduleResult.getId());
-        existingModuleResult.mergeFrom(moduleResult);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addInvocationInfo(String key, String value) {
-        mInvocationInfo.put(key, value);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Map<String, String> getInvocationInfo() {
-        return mInvocationInfo;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setStartTime(long time) {
-        mTimestamp = time;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public long getStartTime() {
-        return mTimestamp;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setTestPlan(String plan) {
-        mTestPlan = plan;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getTestPlan() {
-        return mTestPlan;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addDeviceSerial(String serial) {
-        mSerials.add(serial);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<String> getDeviceSerials() {
-        return mSerials;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setCommandLineArgs(String commandLineArgs) {
-        mCommandLineArgs = commandLineArgs;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getCommandLineArgs() {
-        return mCommandLineArgs;
-    }
-
-    @Override
-    public void setBuildFingerprint(String buildFingerprint) {
-        mBuildFingerprint = buildFingerprint;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getBuildFingerprint() {
-        return mBuildFingerprint;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getModuleCompleteCount() {
-        int completeModules = 0;
-        for (IModuleResult module : mModuleResults.values()) {
-            if (module.isDone()) {
-                completeModules++;
-            }
-        }
-        return completeModules;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public RetryChecksumStatus getRetryChecksumStatus() {
-        return mRetryChecksumStatus;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setRetryChecksumStatus(RetryChecksumStatus retryStatus) {
-        mRetryChecksumStatus = retryStatus;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getRetryDirectory() {
-        return mRetryDirectory;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setRetryDirectory(File resultDir) {
-        mRetryDirectory = resultDir;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/KeyValueArgsParser.java b/common/util/src/com/android/compatibility/common/util/KeyValueArgsParser.java
deleted file mode 100644
index 92a2b18..0000000
--- a/common/util/src/com/android/compatibility/common/util/KeyValueArgsParser.java
+++ /dev/null
@@ -1,49 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-import java.util.HashMap;
-
-/**
- * Parses an array of arguments into a HashMap.
- *
- * This class assumed the arguments are in the form "-<key> <value> ..."
- */
-public class KeyValueArgsParser {
-
-    private KeyValueArgsParser() {}
-
-    public static HashMap<String, String> parse(String[] args) {
-        final HashMap<String, String> map = new HashMap<String, String>();
-        String key = null;
-        for (String s : args) {
-            if (key == null) {
-                if (!s.startsWith("-")) {
-                    throw new RuntimeException("Invalid Key: " + s);
-                }
-                key = s;
-            } else {
-                map.put(key, s);
-                key = null;
-            }
-        }
-        if (key != null) {
-            throw new RuntimeException("Left over key");
-        }
-        return map;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/LightInvocationResult.java b/common/util/src/com/android/compatibility/common/util/LightInvocationResult.java
deleted file mode 100644
index 3c7008e..0000000
--- a/common/util/src/com/android/compatibility/common/util/LightInvocationResult.java
+++ /dev/null
@@ -1,249 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-package com.android.compatibility.common.util;
-
-import java.io.File;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Data structure for storing finalized Compatibility test results with minimum memory.
- * This implementation stores only enough ModuleResult information to return empty modules
- * of the correct ids (names and abis) upon {@link IInvocationResult}'s getModules() method.
- */
-public class LightInvocationResult implements IInvocationResult {
-
-    private long mTimestamp;
-    private Map<String, String> mInvocationInfo;
-    private Set<String> mSerials;
-    private String mBuildFingerprint;
-    private String mTestPlan;
-    private String mCommandLineArgs;
-    private int mNotExecuted;
-    private int mModuleCompleteCount;
-    private RetryChecksumStatus mRetryChecksumStatus;
-    private File mRetryDirectory;
-    private Set<String> mModuleIds;
-    private Map<TestStatus, Integer> mResultCounts;
-
-    /**
-     * Constructor that takes a reference to an existing result (light or complete) and
-     * initializes instance variables accordingly. This class must NOT save any reference to the
-     * result param to remain lightweight.
-     */
-    public LightInvocationResult(IInvocationResult result) {
-        mTimestamp = result.getStartTime();
-        mInvocationInfo = new HashMap<String, String>(result.getInvocationInfo());
-        mSerials = new HashSet<String>(result.getDeviceSerials());
-        mBuildFingerprint = result.getBuildFingerprint();
-        mTestPlan = result.getTestPlan();
-        mCommandLineArgs = result.getCommandLineArgs();
-        mNotExecuted = result.getNotExecuted();
-        mModuleCompleteCount = result.getModuleCompleteCount();
-        mRetryChecksumStatus = RetryChecksumStatus.NotRetry;
-        mRetryDirectory = result.getRetryDirectory();
-        mModuleIds = new HashSet<String>();
-        for (IModuleResult module : result.getModules()) {
-            mModuleIds.add(module.getId());
-        }
-        mResultCounts = new HashMap<TestStatus, Integer>();
-        for (TestStatus status : TestStatus.values()) {
-            mResultCounts.put(status, result.countResults(status));
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<IModuleResult> getModules() {
-        List<IModuleResult> modules = new ArrayList<IModuleResult>();
-        for (String id : mModuleIds) {
-            modules.add(new ModuleResult(id));
-        }
-        return modules; // return empty modules
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int countResults(TestStatus result) {
-        return mResultCounts.get(result);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getNotExecuted() {
-        return mNotExecuted;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public IModuleResult getOrCreateModule(String id) {
-        mModuleIds.add(id);
-        return new ModuleResult(id);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void mergeModuleResult(IModuleResult moduleResult) {
-        mModuleIds.add(moduleResult.getId());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addInvocationInfo(String key, String value) {
-        mInvocationInfo.put(key, value);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Map<String, String> getInvocationInfo() {
-        return mInvocationInfo;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setStartTime(long time) {
-        mTimestamp = time;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public long getStartTime() {
-        return mTimestamp;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setTestPlan(String plan) {
-        mTestPlan = plan;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getTestPlan() {
-        return mTestPlan;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addDeviceSerial(String serial) {
-        mSerials.add(serial);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public Set<String> getDeviceSerials() {
-        return mSerials;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setCommandLineArgs(String commandLineArgs) {
-        mCommandLineArgs = commandLineArgs;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getCommandLineArgs() {
-        return mCommandLineArgs;
-    }
-
-    @Override
-    public void setBuildFingerprint(String buildFingerprint) {
-        mBuildFingerprint = buildFingerprint;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getBuildFingerprint() {
-        return mBuildFingerprint;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getModuleCompleteCount() {
-        return mModuleCompleteCount;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public RetryChecksumStatus getRetryChecksumStatus() {
-        return mRetryChecksumStatus;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setRetryChecksumStatus(RetryChecksumStatus retryStatus) {
-        mRetryChecksumStatus = retryStatus;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public File getRetryDirectory() {
-        return mRetryDirectory;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setRetryDirectory(File resultDir) {
-        mRetryDirectory = resultDir;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/LogcatInspector.java b/common/util/src/com/android/compatibility/common/util/LogcatInspector.java
deleted file mode 100644
index 053db34..0000000
--- a/common/util/src/com/android/compatibility/common/util/LogcatInspector.java
+++ /dev/null
@@ -1,119 +0,0 @@
-package com.android.compatibility.common.util;
-
-import static junit.framework.TestCase.fail;
-
-import com.google.common.base.Joiner;
-import com.google.common.io.Closeables;
-
-import java.io.BufferedReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.util.UUID;
-import java.util.concurrent.TimeUnit;
-
-/**
- * Inherit this class and implement {@link #executeShellCommand(String)} to be able to assert that
- * logcat contains what you want.
- */
-public abstract class LogcatInspector {
-    private static final int SMALL_LOGCAT_DELAY = 1000;
-
-    /**
-     * Should execute adb shell {@param command} and return an {@link InputStream} with the result.
-     */
-    protected abstract InputStream executeShellCommand(String command) throws IOException;
-
-    /**
-     * Logs an unique string using tag {@param tag} and wait until it appears to continue execution.
-     *
-     * @return a unique separator string.
-     * @throws IOException if error while executing command.
-     */
-    public String mark(String tag) throws IOException {
-        String uniqueString = ":::" + UUID.randomUUID().toString();
-        executeShellCommand("log -t " + tag + " " + uniqueString);
-        // This is to guarantee that we only return after the string has been logged, otherwise
-        // in practice the case where calling Log.?(<message1>) right after clearAndMark() resulted
-        // in <message1> appearing before the unique identifier. It's not guaranteed per the docs
-        // that log command will have written when returning, so better be safe. 5s should be fine.
-        assertLogcatContainsInOrder(tag + ":* *:S", 5, uniqueString);
-        return uniqueString;
-    }
-
-    /**
-     * Wait for up to {@param maxTimeoutInSeconds} for the given {@param logcatStrings} strings to
-     * appear in logcat in the given order. By passing the separator returned by {@link
-     * #mark(String)} as the first string you can ensure that only logs emitted after that
-     * call to mark() are found. Repeated strings are not supported.
-     *
-     * @throws AssertionError if the strings are not found in the given time.
-     * @throws IOException if error while reading.
-     */
-    public void assertLogcatContainsInOrder(
-            String filterSpec, int maxTimeoutInSeconds, String... logcatStrings)
-            throws AssertionError, IOException {
-        try {
-            int nextStringIndex =
-                    numberOfLogcatStringsFound(filterSpec, maxTimeoutInSeconds, logcatStrings);
-            if (nextStringIndex < logcatStrings.length) {
-                fail(
-                        "Couldn't find "
-                                + logcatStrings[nextStringIndex]
-                                + (nextStringIndex > 0
-                                        ? " after " + logcatStrings[nextStringIndex - 1]
-                                        : "")
-                                + " within "
-                                + maxTimeoutInSeconds
-                                + " seconds ");
-            }
-        } catch (InterruptedException e) {
-            fail("Thread interrupted unexpectedly: " + e.getMessage());
-        }
-    }
-
-    /**
-     * Wait for up to {@param timeInSeconds}, if all the strings {@param logcatStrings} are found in
-     * order then the assertion fails, otherwise it succeeds.
-     *
-     * @throws AssertionError if all the strings are found in order in the given time.
-     * @throws IOException if error while reading.
-     */
-    public void assertLogcatDoesNotContainInOrder(int timeInSeconds, String... logcatStrings)
-            throws IOException {
-        try {
-            int stringsFound = numberOfLogcatStringsFound("", timeInSeconds, logcatStrings);
-            if (stringsFound == logcatStrings.length) {
-                fail("Found " + Joiner.on(", ").join(logcatStrings) + " that weren't expected");
-            }
-        } catch (InterruptedException e) {
-            fail("Thread interrupted unexpectedly: " + e.getMessage());
-        }
-    }
-
-    private int numberOfLogcatStringsFound(
-            String filterSpec, int timeInSeconds, String... logcatStrings)
-            throws InterruptedException, IOException {
-        long timeout = System.currentTimeMillis() + TimeUnit.SECONDS.toMillis(timeInSeconds);
-        int stringIndex = 0;
-        while (timeout >= System.currentTimeMillis()) {
-            InputStream logcatStream = executeShellCommand("logcat -v brief -d " + filterSpec);
-            BufferedReader logcat = new BufferedReader(new InputStreamReader(logcatStream));
-            String line;
-            while ((line = logcat.readLine()) != null) {
-                if (line.contains(logcatStrings[stringIndex])) {
-                    stringIndex++;
-                    if (stringIndex >= logcatStrings.length) {
-                        StreamUtil.drainAndClose(logcat);
-                        return stringIndex;
-                    }
-                }
-            }
-            Closeables.closeQuietly(logcat);
-            // In case the key has not been found, wait for the log to update before
-            // performing the next search.
-            Thread.sleep(SMALL_LOGCAT_DELAY);
-        }
-        return stringIndex;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/MeasureRun.java b/common/util/src/com/android/compatibility/common/util/MeasureRun.java
deleted file mode 100644
index 2b8905f..0000000
--- a/common/util/src/com/android/compatibility/common/util/MeasureRun.java
+++ /dev/null
@@ -1,31 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-/**
- * Interface for measuring time for each run.
- */
-public abstract class MeasureRun {
-    /**
-     *  Called before each run. not included in time measurement.
-     */
-    public void prepare(int i) throws Exception {
-        // default empty implementation
-    }
-
-    abstract public void run(int i) throws Exception;
-}
diff --git a/common/util/src/com/android/compatibility/common/util/MeasureTime.java b/common/util/src/com/android/compatibility/common/util/MeasureTime.java
deleted file mode 100644
index 102b96a..0000000
--- a/common/util/src/com/android/compatibility/common/util/MeasureTime.java
+++ /dev/null
@@ -1,44 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-/**
- * Provides a mechanism to measure the time taken to run a piece of code.
- *
- * The code will be run multiple times and the time taken by each run will returned.
- */
-public class MeasureTime {
-    /**
-     * measure time taken for each run for given count
-     * @param count
-     * @param run
-     * @return array of time taken in each run in msec.
-     * @throws Exception
-     */
-    public static double[] measure(int count, MeasureRun run) throws Exception {
-        double[] result = new double[count];
-
-        for (int i = 0; i < count; i++) {
-            run.prepare(i);
-            long start = System.currentTimeMillis();
-            run.run(i);
-            long end =  System.currentTimeMillis();
-            result[i] = end - start;
-        }
-        return result;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/MetricsXmlSerializer.java b/common/util/src/com/android/compatibility/common/util/MetricsXmlSerializer.java
deleted file mode 100644
index ce8696b..0000000
--- a/common/util/src/com/android/compatibility/common/util/MetricsXmlSerializer.java
+++ /dev/null
@@ -1,50 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
-
-//TODO(stuartscott): Delete file for v2, ReportLog can serialize itself.
-/**
- * Serialize Metric data from {@link ReportLog} into compatibility report friendly XML
- */
-public final class MetricsXmlSerializer {
-
-    private final XmlSerializer mXmlSerializer;
-
-    public MetricsXmlSerializer(XmlSerializer xmlSerializer) {
-        this.mXmlSerializer = xmlSerializer;
-    }
-
-    public void serialize(ReportLog reportLog) throws IOException {
-        if (reportLog == null) {
-            return;
-        }
-        ReportLog.Metric summary = reportLog.getSummary();
-        // <Summary message="Average" scoreType="lower_better" unit="ms">195.2</Summary>
-        if (summary != null) {
-            mXmlSerializer.startTag(null, "Summary");
-            mXmlSerializer.attribute(null, "message", summary.getMessage());
-            mXmlSerializer.attribute(null, "scoreType", summary.getType().toReportString());
-            mXmlSerializer.attribute(null, "unit", summary.getUnit().toReportString());
-            mXmlSerializer.text(Double.toString(summary.getValues()[0]));
-            mXmlSerializer.endTag(null, "Summary");
-        }
-    }
-}
\ No newline at end of file
diff --git a/common/util/src/com/android/compatibility/common/util/ModuleResult.java b/common/util/src/com/android/compatibility/common/util/ModuleResult.java
deleted file mode 100644
index abb22f8..0000000
--- a/common/util/src/com/android/compatibility/common/util/ModuleResult.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * Data structure for a Compatibility test module result.
- */
-public class ModuleResult implements IModuleResult {
-
-    private String mId;
-    private long mRuntime = 0;
-
-    /* Variables related to completion of the module */
-    private boolean mDone = false;
-    private boolean mHaveSetDone = false;
-    private boolean mInProgress = false;
-    private int mExpectedTestRuns = 0;
-    private int mActualTestRuns = 0;
-    private int mNotExecuted = 0;
-    private boolean mIsFailed = false;
-
-    private Map<String, ICaseResult> mResults = new HashMap<>();
-
-    /**
-     * Creates a {@link ModuleResult} for the given id, created with
-     * {@link AbiUtils#createId(String, String)}
-     */
-    public ModuleResult(String id) {
-        mId = id;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isDone() {
-        // If module is failed, it cannot be marked done.
-        if (isFailed()) {
-            return false;
-        }
-        return mDone && !mInProgress && (mActualTestRuns >= mExpectedTestRuns);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isDoneSoFar() {
-        return mDone && !mInProgress;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void initializeDone(boolean done) {
-        mDone = done;
-        mHaveSetDone = false;
-        if (mDone) {
-            mNotExecuted = 0;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setDone(boolean done) {
-        if (mHaveSetDone) {
-            mDone &= done; // If we've already set done for this instance, AND the received value
-        } else {
-            mDone = done; // If done has only been initialized, overwrite the existing value
-        }
-        mHaveSetDone = true;
-        if (mDone) {
-            mNotExecuted = 0;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void inProgress(boolean inProgress) {
-        mInProgress = inProgress;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getExpectedTestRuns() {
-        return mExpectedTestRuns;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setExpectedTestRuns(int numRuns) {
-        mExpectedTestRuns = numRuns;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getTestRuns() {
-        return mActualTestRuns;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addTestRun() {
-        mActualTestRuns++;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void resetTestRuns() {
-        mActualTestRuns = 0;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int getNotExecuted() {
-        return mNotExecuted;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setNotExecuted(int numTests) {
-        mNotExecuted = numTests;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getId() {
-        return mId;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getName() {
-        return AbiUtils.parseTestName(mId);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getAbi() {
-        return AbiUtils.parseAbi(mId);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void addRuntime(long elapsedTime) {
-        mRuntime += elapsedTime;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void resetRuntime() {
-        mRuntime = 0;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public long getRuntime() {
-        return mRuntime;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ICaseResult getOrCreateResult(String caseName) {
-        ICaseResult result = mResults.get(caseName);
-        if (result == null) {
-            result = new CaseResult(caseName);
-            mResults.put(caseName, result);
-        }
-        return result;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ICaseResult getResult(String caseName) {
-        return mResults.get(caseName);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<ICaseResult> getResults() {
-        ArrayList<ICaseResult> results = new ArrayList<>(mResults.values());
-        Collections.sort(results);
-        return results;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int countResults(TestStatus status) {
-        int total = 0;
-        for (ICaseResult result : mResults.values()) {
-            total += result.countResults(status);
-        }
-        return total;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int compareTo(IModuleResult another) {
-        return getId().compareTo(another.getId());
-    }
-
-    @Override
-    public void setFailed() {
-        mIsFailed = true;
-    }
-
-    @Override
-    public boolean isFailed() {
-        return mIsFailed;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void mergeFrom(IModuleResult otherModuleResult) {
-        if (!otherModuleResult.getId().equals(getId())) {
-            throw new IllegalArgumentException(String.format(
-                "Cannot merge module result with mismatched id. Expected %s, Found %s",
-                        otherModuleResult.getId(), getId()));
-        }
-
-        this.mRuntime += otherModuleResult.getRuntime();
-        this.mNotExecuted += otherModuleResult.getNotExecuted();
-        // Only touch variables related to 'done' status if this module is not already done
-        if (!isDone()) {
-            this.setDone(otherModuleResult.isDoneSoFar());
-            this.mActualTestRuns += otherModuleResult.getTestRuns();
-            // expected test runs are the same across shards, except for shards that do not run
-            // this module at least once (for which the value is not yet set).
-            this.mExpectedTestRuns += otherModuleResult.getExpectedTestRuns();
-        }
-        // If something failed, then the aggregation is failed
-        if (!this.isFailed()) {
-            this.mIsFailed = otherModuleResult.isFailed();
-        }
-        for (ICaseResult otherCaseResult : otherModuleResult.getResults()) {
-            ICaseResult caseResult = getOrCreateResult(otherCaseResult.getName());
-            caseResult.mergeFrom(otherCaseResult);
-        }
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/MultipartForm.java b/common/util/src/com/android/compatibility/common/util/MultipartForm.java
deleted file mode 100644
index c311492..0000000
--- a/common/util/src/com/android/compatibility/common/util/MultipartForm.java
+++ /dev/null
@@ -1,165 +0,0 @@
-/*
- * Copyright (C) 2011 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.compatibility.common.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.OutputStreamWriter;
-import java.io.PrintWriter;
-import java.net.HttpURLConnection;
-import java.net.URL;
-import java.util.HashMap;
-import java.util.Map;
-
-/** Builds a multipart form and submits it. */
-class MultipartForm {
-
-    private static final String FORM_DATA_BOUNDARY = "C75I55u3R3p0r73r";
-
-    /* package */ final String mServerUrl;
-    /* package */ final Map<String, String> mFormValues = new HashMap<String, String>();
-    /* package */ String mName;
-    /* package */ String mFileName;
-    /* package */ byte[] mData;
-
-    /**
-     * Creates a new multi-part form with the given serverUrl.
-     */
-    public MultipartForm(String serverUrl) {
-        mServerUrl = serverUrl;
-    }
-
-    /**
-     * Adds a key value attribute to the form.
-     *
-     * @param name the name of the attribute.
-     * @param value the attribute's value.
-     * @return the {@link MultipartForm} for easy chaining.
-     */
-    public MultipartForm addFormValue(String name, String value) {
-        mFormValues.put(name, value);
-        return this;
-    }
-
-    /**
-     * Adds the file as the payload of the form.
-     *
-     * @param name The name of attribute
-     * @param fileName The file's name
-     * @param data The file's data
-     * @return the {@link MultipartForm} for easy chaining.
-     */
-    public MultipartForm addFormFile(String name, String fileName, byte[] data) {
-        mName = name;
-        mFileName = fileName;
-        mData = data;
-        return this;
-    }
-
-    /**
-     * Submits the form to the server url.
-     *
-     * This will handle a redirection from the server.
-     *
-     * @return response code
-     * @throws IOException
-     */
-    public int submit() throws IOException {
-        return submitForm(mServerUrl);
-    }
-
-    /**
-     * @param serverUrl to post the data to
-     * @return response code
-     * @throws IOException
-     */
-    private int submitForm(String serverUrl) throws IOException {
-        HttpURLConnection connection = null;
-        try {
-            URL url = new URL(serverUrl);
-            connection = (HttpURLConnection) url.openConnection();
-            connection.setInstanceFollowRedirects(false);
-            connection.setRequestMethod("POST");
-            connection.setDoOutput(true);
-            connection.setRequestProperty("Content-Type",
-                    "multipart/form-data; boundary=" + FORM_DATA_BOUNDARY);
-
-            byte[] body = getContentBody();
-            connection.setRequestProperty("Content-Length", Integer.toString(body.length));
-
-            OutputStream output = connection.getOutputStream();
-            try {
-                output.write(body);
-            } finally {
-                output.close();
-            }
-
-            // Open the stream to get a response. Otherwise request will be cancelled.
-            InputStream input = connection.getInputStream();
-            input.close();
-
-            int response = connection.getResponseCode();
-            if (response == 302) {
-                return submitForm(connection.getHeaderField("Location"));
-            }
-            return response;
-        } finally {
-            if (connection != null) {
-                connection.disconnect();
-            }
-        }
-    }
-
-    /* package */ byte[] getContentBody() throws IOException {
-        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream();
-        PrintWriter writer = new PrintWriter(new OutputStreamWriter(byteOutput));
-        writer.println();
-
-        for (Map.Entry<String, String> formValue : mFormValues.entrySet()) {
-            writeFormField(writer, formValue.getKey(), formValue.getValue());
-        }
-
-        if (mData != null) {
-            writeFormFileHeader(writer, mName, mFileName);
-            writer.flush(); // Must flush here before writing to the byte stream!
-            byteOutput.write(mData);
-            writer.println();
-        }
-        writer.append("--").append(FORM_DATA_BOUNDARY).println("--");
-        writer.flush();
-        writer.close();
-        return byteOutput.toByteArray();
-    }
-
-    private void writeFormField(PrintWriter writer, String name, String value) {
-        writer.append("--").println(FORM_DATA_BOUNDARY);
-        writer.append("Content-Disposition: form-data; name=\"").append(name).println("\"");
-        writer.println();
-        writer.println(value);
-    }
-
-    private void writeFormFileHeader(PrintWriter writer, String name, String fileName) {
-        writer.append("--").println(FORM_DATA_BOUNDARY);
-        writer.append("Content-Disposition: form-data; name=\"").append(name);
-        writer.append("\"; filename=\"").append(fileName).println("\"");
-        writer.println("Content-Type: application/x-gzip");
-        writer.println("Content-Transfer-Encoding: binary");
-        writer.println();
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ReadElf.java b/common/util/src/com/android/compatibility/common/util/ReadElf.java
deleted file mode 100644
index b681c1c..0000000
--- a/common/util/src/com/android/compatibility/common/util/ReadElf.java
+++ /dev/null
@@ -1,1341 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.compatibility.common.util;
-
-import java.io.File;
-import java.io.IOException;
-import java.io.RandomAccessFile;
-import java.util.ArrayList;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-
-/**
- * A poor man's implementation of the readelf command. This program is designed to parse ELF
- * (Executable and Linkable Format) files.
- */
-// ToDo: consolidate with com.android.compatibility.common.util
-public class ReadElf implements AutoCloseable {
-    /** The magic values for the ELF identification. */
-    private static final byte[] ELFMAG = {
-        (byte) 0x7F, (byte) 'E', (byte) 'L', (byte) 'F',
-    };
-
-    private static final int EI_NIDENT = 16;
-
-    private static final int EI_CLASS = 4;
-    private static final int EI_DATA = 5;
-
-    public static final int ET_DYN = 3;
-    public static final int EM_386 = 3;
-    public static final int EM_MIPS = 8;
-    public static final int EM_ARM = 40;
-    public static final int EM_X86_64 = 62;
-    // http://en.wikipedia.org/wiki/Qualcomm_Hexagon
-    public static final int EM_QDSP6 = 164;
-    public static final int EM_AARCH64 = 183;
-
-    public static final String ARCH_ARM = "arm";
-    public static final String ARCH_X86 = "x86";
-    public static final String ARCH_MIPS = "mips";
-    public static final String ARCH_UNKNOWN = "unknown";
-    private static final String RODATA = ".rodata";
-
-    private static final int ELFCLASS32 = 1;
-    private static final int ELFCLASS64 = 2;
-
-    private static final int ELFDATA2LSB = 1;
-    private static final int ELFDATA2MSB = 2;
-
-    private static final int EV_CURRENT = 1;
-
-    private static final long PT_LOAD = 1;
-
-    // https://en.wikipedia.org/wiki/Executable_and_Linkable_Format
-    private static final int SHT_PROGBITS = 1;
-    private static final int SHT_SYMTAB = 2;
-    private static final int SHT_STRTAB = 3;
-    private static final int SHT_DYNAMIC = 6;
-    private static final int SHT_DYNSYM = 11;
-    private static final int SHT_GNU_VERDEF = 0x6ffffffd;
-    private static final int SHT_GNU_VERNEED = 0x6ffffffe;
-    private static final int SHT_GNU_VERSYM = 0x6fffffff;
-
-    public static class Symbol {
-        public static final int STB_LOCAL = 0;
-        public static final int STB_GLOBAL = 1;
-        public static final int STB_WEAK = 2;
-        public static final int STB_LOPROC = 13;
-        public static final int STB_HIPROC = 15;
-
-        public static final int STT_NOTYPE = 0;
-        public static final int STT_OBJECT = 1;
-        public static final int STT_FUNC = 2;
-        public static final int STT_SECTION = 3;
-        public static final int STT_FILE = 4;
-        public static final int STT_COMMON = 5;
-        public static final int STT_TLS = 6;
-
-        public static final int SHN_UNDEF = 0;
-        public static final int SHN_ABS = 0xfff1;
-
-        public final String name;
-        public final int bind;
-        public final int type;
-        public final int shndx;
-        public final long value;
-        public final long size;
-        public final int other;
-
-        public VerNeed mVerNeed;
-        public VerDef mVerDef;
-
-        Symbol(String name, int st_info, int st_shndx, long st_value, long st_size, int st_other) {
-            this.name = name;
-            this.bind = (st_info >> 4) & 0x0F;
-            this.type = st_info & 0x0F;
-            this.shndx = st_shndx;
-            this.value = st_value;
-            this.size = st_size;
-            this.other = st_other;
-        }
-
-        @Override
-        public String toString() {
-            return String.format(
-                    "%s, %s, %s, %s, %s, %s",
-                    name,
-                    toBind(),
-                    toType(),
-                    toShndx(),
-                    getExternalLibFileName(),
-                    getExternalLibName());
-        }
-
-        public String toBind() {
-            switch (bind) {
-                case STB_LOCAL:
-                    return "LOCAL";
-                case STB_GLOBAL:
-                    return "GLOBAL";
-                case STB_WEAK:
-                    return "WEAK";
-            }
-            return "STB_??? (" + bind + ")";
-        }
-
-        public String toType() {
-            switch (type) {
-                case STT_NOTYPE:
-                    return "NOTYPE";
-                case STT_OBJECT:
-                    return "OBJECT";
-                case STT_FUNC:
-                    return "FUNC";
-                case STT_SECTION:
-                    return "SECTION";
-                case STT_FILE:
-                    return "FILE";
-                case STT_COMMON:
-                    return "COMMON";
-                case STT_TLS:
-                    return "TLS";
-            }
-            return "STT_??? (" + type + ")";
-        }
-
-        public String toShndx() {
-            switch (shndx) {
-                case SHN_ABS:
-                    return "ABS";
-                case SHN_UNDEF:
-                    return "UND";
-            }
-            return String.valueOf(shndx);
-        }
-
-        // if a symbol is not define locally
-        public boolean isGlobalUnd() {
-            return (bind != STB_LOCAL && shndx == SHN_UNDEF);
-        }
-
-        // if a symbol is extern
-        public boolean isExtern() {
-            return (bind != STB_LOCAL && shndx != SHN_UNDEF);
-        }
-
-        public String getExternalLibFileName() {
-            if (mVerNeed != null) {
-                return mVerNeed.vn_file_name;
-            }
-            return null;
-        }
-
-        public String getExternalLibName() {
-            if (mVerNeed != null) {
-                return mVerNeed.vn_vernaux[0].vna_lib_name;
-            }
-            return null;
-        }
-
-        public int getExternalLibVer() {
-            if (mVerNeed != null) {
-                return mVerNeed.vn_vernaux[0].vna_other;
-            }
-            return -1;
-        }
-
-        public String getVerDefLibName() {
-            if (mVerDef != null) {
-                return mVerDef.vd_verdaux[0].vda_lib_name;
-            }
-            return null;
-        }
-
-        public int getVerDefVersion() {
-            if (mVerDef != null) {
-                return mVerDef.vd_version;
-            }
-            return -1;
-        }
-    }
-
-    public static class SecHeader {
-        public final long sh_name;
-        public final long sh_type;
-        public final long sh_flags;
-        public final long sh_addr;
-        public final long sh_offset;
-        public final long sh_size;
-        public final long sh_link;
-        public final long sh_info;
-        public final long sh_addralign;
-        public final long sh_entsize;
-
-        SecHeader(
-                long name,
-                long type,
-                long flags,
-                long addr,
-                long offset,
-                long size,
-                long link,
-                long info,
-                long addralign,
-                long entsize) {
-            this.sh_name = name;
-            this.sh_type = type;
-            this.sh_flags = flags;
-            this.sh_addr = addr;
-            this.sh_offset = offset;
-            this.sh_size = size;
-            this.sh_link = link;
-            this.sh_info = info;
-            this.sh_addralign = addralign;
-            this.sh_entsize = entsize;
-        }
-
-        @Override
-        public String toString() {
-            return String.format(
-                    "%d, %d, %d, %d, %d, %d, %d, %d, %d, %d",
-                    this.sh_name,
-                    this.sh_type,
-                    this.sh_flags,
-                    this.sh_addr,
-                    this.sh_offset,
-                    this.sh_size,
-                    this.sh_link,
-                    this.sh_info,
-                    this.sh_addralign,
-                    this.sh_entsize);
-        }
-    }
-
-    public static class VerNeed {
-        public final int vn_version;
-        public final int vn_cnt;
-        public final long vn_file;
-        public final long vn_aux;
-        public final long vn_next;
-        public String vn_file_name;
-        public VerNAux[] vn_vernaux;
-
-        VerNeed(String file_name, String lib_name, int ndx) {
-            this.vn_file_name = file_name.toLowerCase();
-            this.vn_vernaux = new VerNAux[1];
-            this.vn_vernaux[0] = new VerNAux(lib_name, ndx);
-
-            this.vn_version = 0;
-            this.vn_cnt = 0;
-            this.vn_file = 0;
-            this.vn_aux = 0;
-            this.vn_next = 0;
-        }
-
-        VerNeed(int ver, int cnt, long file, long aux, long next) {
-            this.vn_version = ver;
-            this.vn_cnt = cnt;
-            this.vn_file = file;
-            this.vn_aux = aux;
-            this.vn_next = next;
-        }
-
-        @Override
-        public String toString() {
-            String vernauxStr = "";
-            for (int i = 0; i < this.vn_cnt; i++) {
-                vernauxStr += String.format("    %s\n", this.vn_vernaux[i].toString());
-            }
-            return String.format(
-                    "%s, %d, %d, %d, %d, %d \n%s",
-                    this.vn_file_name,
-                    this.vn_version,
-                    this.vn_cnt,
-                    this.vn_file,
-                    this.vn_aux,
-                    this.vn_next,
-                    vernauxStr);
-        }
-    }
-
-    public static class VerNAux {
-        public final long vna_hash;
-        public final int vna_flags;
-        public final int vna_other;
-        public final long vna_name;
-        public final long vna_next;
-        public String vna_lib_name;
-
-        VerNAux(String lib_name, int ndx) {
-            this.vna_lib_name = lib_name;
-
-            this.vna_hash = 0;
-            this.vna_flags = 0;
-            this.vna_other = ndx;
-            this.vna_name = 0;
-            this.vna_next = 0;
-        }
-
-        VerNAux(long hash, int flags, int other, long name, long next) {
-            this.vna_hash = hash;
-            this.vna_flags = flags;
-            this.vna_other = other;
-            this.vna_name = name;
-            this.vna_next = next;
-        }
-
-        @Override
-        public String toString() {
-            return String.format(
-                    "%s, %d, %d, %d, %d, %d",
-                    this.vna_lib_name,
-                    this.vna_hash,
-                    this.vna_flags,
-                    this.vna_other,
-                    this.vna_name,
-                    this.vna_next);
-        }
-    }
-
-    public static class VerDef {
-        public final int vd_version;
-        public final int vd_flags;
-        public final int vd_ndx;
-        public final int vd_cnt;
-        public final long vd_hash;
-        public final long vd_aux;
-        public final long vd_next;
-        public VerDAux[] vd_verdaux;
-
-        VerDef(String lib_name) {
-            this.vd_verdaux = new VerDAux[1];
-            this.vd_verdaux[0] = new VerDAux(lib_name);
-
-            this.vd_version = 0;
-            this.vd_flags = 0;
-            this.vd_ndx = 0;
-            this.vd_cnt = 0;
-            this.vd_hash = 0;
-            this.vd_aux = 0;
-            this.vd_next = 0;
-        }
-
-        VerDef(int ver, int flags, int ndx, int cnt, long hash, long aux, long next) {
-            this.vd_version = ver;
-            this.vd_flags = flags;
-            this.vd_ndx = ndx;
-            this.vd_cnt = cnt;
-            this.vd_hash = hash;
-            this.vd_aux = aux;
-            this.vd_next = next;
-        }
-
-        @Override
-        public String toString() {
-            String vStr = "";
-            for (int i = 0; i < this.vd_cnt; i++) {
-                vStr += String.format("    %s\n", this.vd_verdaux[i].toString());
-            }
-            return String.format(
-                    "%s, %d, %d, %d, %d, %d \n%s",
-                    this.vd_verdaux[0].vda_lib_name,
-                    this.vd_version,
-                    this.vd_flags,
-                    this.vd_ndx,
-                    this.vd_cnt,
-                    this.vd_hash,
-                    vStr);
-        }
-    }
-
-    public static class VerDAux {
-        public final long vda_name;
-        public final long vda_next;
-        public String vda_lib_name;
-
-        VerDAux(String lib_name) {
-            this.vda_lib_name = lib_name.toLowerCase();
-
-            this.vda_name = 0;
-            this.vda_next = 0;
-        }
-
-        VerDAux(long name, long next) {
-            this.vda_name = name;
-            this.vda_next = next;
-        }
-
-        @Override
-        public String toString() {
-            return String.format("%s, %d, %d", this.vda_lib_name, this.vda_name, this.vda_next);
-        }
-    }
-
-    // Dynamic Section Entry
-    public static class DynamicEntry {
-        private static final int DT_NEEDED = 1;
-        public final long mTag;
-        public final long mValue;
-
-        DynamicEntry(long tag, long value) {
-            mTag = tag;
-            mValue = value;
-        }
-
-        public boolean isNeeded() {
-            if (mTag == DT_NEEDED) {
-                return true;
-            } else {
-                // System.err.println(String.format("Not Needed: %d, %d", mTag, mValue));
-                return false;
-            }
-        }
-
-        public long getValue() {
-            return mValue;
-        }
-
-        @Override
-        public String toString() {
-            return String.format("%d, %d", this.mTag, this.mValue);
-        }
-    }
-
-    private final String mPath;
-    private final RandomAccessFile mFile;
-    private final byte[] mBuffer = new byte[512];
-    private int mEndian;
-    private boolean mIsDynamic;
-    private boolean mIsPIE;
-    private int mType;
-    private int mAddrSize;
-    private int mMachine;
-
-    /** Symbol Table offset */
-    private long mSymTabOffset;
-
-    /** Symbol Table size */
-    private long mSymTabSize;
-
-    /** Symbol entry count */
-    private int mSymEntCnt;
-
-    /** Dynamic Symbol Table offset */
-    private long mDynSymOffset;
-
-    /** Dynamic Symbol Table size */
-    private long mDynSymSize;
-
-    /** Dynamic entry count */
-    private int mDynSymEntCnt;
-
-    /** Section Header String Table offset */
-    private long mShStrTabOffset;
-
-    /** Section Header String Table size */
-    private long mShStrTabSize;
-
-    /** String Table offset */
-    private long mStrTabOffset;
-
-    /** String Table size */
-    private long mStrTabSize;
-
-    /** Dynamic String Table offset */
-    private long mDynStrOffset;
-
-    /** Dynamic String Table size */
-    private long mDynStrSize;
-
-    /** Dynamic Table offset */
-    private long mDynamicTabOffset;
-
-    /** Dynamic Table size */
-    private long mDynamicTabSize;
-
-    /** Version Symbols Table offset */
-    private long mVerSymTabOffset;
-
-    /** Version Symbols Table size */
-    private long mVerSymTabSize;
-
-    /** Version Needs Table offset */
-    private long mVerNeedTabOffset;
-
-    /** Version Definition Table size */
-    private long mVerNeedTabSize;
-
-    private int mVerNeedEntryCnt;
-
-    /** Version Definition Table offset */
-    private long mVerDefTabOffset;
-
-    /** Version Needs Table size */
-    private long mVerDefTabSize;
-
-    private int mVerDefEntryCnt;
-
-    /** Symbol Table symbol names */
-    private Map<String, Symbol> mSymbols;
-
-    /** Symbol Table symbol array */
-    private Symbol[] mSymArr;
-
-    /** Dynamic Symbol Table symbol names */
-    private Map<String, Symbol> mDynamicSymbols;
-
-    /** Dynamic Symbol Table symbol array */
-    private Symbol[] mDynSymArr;
-
-    /** Version Symbols Table */
-    private int[] mVerSym;
-
-    /** Version Needed Table */
-    private VerNeed[] mVerNeedArr;
-
-    /** Version Definition Table */
-    private VerDef[] mVerDefArr;
-
-    /** Dynamic Table */
-    private List<DynamicEntry> mDynamicArr;
-
-    /** Rodata offset */
-    private boolean mHasRodata;
-
-    /** Rodata offset */
-    private long mRodataOffset;
-
-    /** Rodata size */
-    private int mRodataSize;
-
-    /** Rodata String List */
-    private List<String> mRoStrings;
-
-    /** Rodata byte[] */
-    private byte[] mRoData;
-
-    public static ReadElf read(File file) throws IOException {
-        return new ReadElf(file);
-    }
-
-    public static void main(String[] args) throws IOException {
-        for (String arg : args) {
-            ReadElf elf = ReadElf.read(new File(arg));
-            elf.getDynamicSymbol("x");
-            elf.getSymbol("x");
-
-            Symbol[] symArr;
-            System.out.println("===Symbol===");
-            symArr = elf.getSymArr();
-            for (int i = 0; i < symArr.length; i++) {
-                System.out.println(String.format("%8x: %s", i, symArr[i].toString()));
-            }
-            System.out.println("===Dynamic Symbol===");
-            symArr = elf.getDynSymArr();
-            for (int i = 0; i < symArr.length; i++) {
-                if (elf.mVerNeedEntryCnt > 0) {
-                    System.out.println(
-                            String.format(
-                                    "%8x: %s, %s, %s - %d",
-                                    i,
-                                    symArr[i].toString(),
-                                    symArr[i].getExternalLibName(),
-                                    symArr[i].getExternalLibFileName(),
-                                    symArr[i].getExternalLibVer()));
-                } else {
-                    System.out.println(
-                            String.format(
-                                    "%8x: %s, %s - %d",
-                                    i,
-                                    symArr[i].toString(),
-                                    symArr[i].getVerDefLibName(),
-                                    symArr[i].getVerDefVersion()));
-                }
-            }
-
-            System.out.println("===Dynamic Dependencies===");
-            for (String DynDepEntry : elf.getDynamicDependencies()) {
-                System.out.println(DynDepEntry);
-            }
-
-            System.out.println("===Strings in Read Only(.rodata) section===");
-            for (String roStr : elf.getRoStrings()) {
-                System.out.println(roStr);
-            }
-
-            elf.close();
-        }
-    }
-
-    public static boolean isElf(File file) {
-        try {
-            if (file.length() < EI_NIDENT) {
-                throw new IllegalArgumentException(
-                        "Too small to be an ELF file: " + file.getCanonicalPath());
-            }
-
-            RandomAccessFile raFile = new RandomAccessFile(file, "r");
-            byte[] buffer = new byte[512];
-            raFile.seek(0);
-            raFile.readFully(buffer, 0, EI_NIDENT);
-            if (buffer[0] != ELFMAG[0]
-                    || buffer[1] != ELFMAG[1]
-                    || buffer[2] != ELFMAG[2]
-                    || buffer[3] != ELFMAG[3]) {
-                throw new IllegalArgumentException("Invalid ELF file: " + file.getCanonicalPath());
-            }
-            raFile.close();
-            ;
-            return true;
-        } catch (Exception e) {
-            return false;
-        }
-    }
-
-    public int getBits() {
-        if (mMachine == EM_386
-                || mMachine == EM_MIPS
-                || mMachine == EM_ARM
-                || mMachine == EM_QDSP6) {
-            return 32;
-        } else if (mMachine == EM_AARCH64 || mMachine == EM_X86_64) {
-            return 64;
-        } else {
-            return -1;
-        }
-    }
-
-    public String getArchitecture() {
-        if (mMachine == EM_ARM || mMachine == EM_AARCH64) {
-            return ARCH_ARM;
-        } else if (mMachine == EM_386 || mMachine == EM_X86_64) {
-            return ARCH_X86;
-        } else if (mMachine == EM_MIPS) {
-            return ARCH_MIPS;
-        } else {
-            return ARCH_UNKNOWN;
-        }
-    }
-
-    public Map<String, Symbol> getSymbols() throws IOException {
-        if (mSymbols == null) {
-            getSymbol("");
-        }
-        return mSymbols;
-    }
-
-    public Symbol[] getSymArr() throws IOException {
-        if (mSymArr == null) {
-            getSymbol("");
-        }
-        return mSymArr;
-    }
-
-    public Map<String, Symbol> getDynamicSymbols() throws IOException {
-        if (mDynamicSymbols == null) {
-            getDynamicSymbol("");
-        }
-        return mDynamicSymbols;
-    }
-
-    public Symbol[] getDynSymArr() throws IOException {
-        if (mDynSymArr == null) {
-            getDynamicSymbol("");
-        }
-        return mDynSymArr;
-    }
-
-    public boolean isDynamic() {
-        return mIsDynamic;
-    }
-
-    public int getType() {
-        return mType;
-    }
-
-    public boolean isPIE() {
-        return mIsPIE;
-    }
-
-    private ReadElf(File file) throws IOException {
-        mHasRodata = false;
-        mRoData = null;
-        mPath = file.getPath();
-        mFile = new RandomAccessFile(file, "r");
-
-        if (mFile.length() < EI_NIDENT) {
-            throw new IllegalArgumentException("Too small to be an ELF file: " + file);
-        }
-
-        readHeader();
-    }
-
-    @Override
-    public void close() {
-        try {
-            mFile.close();
-        } catch (IOException ignored) {
-        }
-    }
-
-    @Override
-    protected void finalize() throws Throwable {
-        try {
-            close();
-        } finally {
-            super.finalize();
-        }
-    }
-
-    private void readHeader() throws IOException {
-        mFile.seek(0);
-        mFile.readFully(mBuffer, 0, EI_NIDENT);
-
-        if (mBuffer[0] != ELFMAG[0]
-                || mBuffer[1] != ELFMAG[1]
-                || mBuffer[2] != ELFMAG[2]
-                || mBuffer[3] != ELFMAG[3]) {
-            throw new IllegalArgumentException("Invalid ELF file: " + mPath);
-        }
-
-        int elfClass = mBuffer[EI_CLASS];
-        if (elfClass == ELFCLASS32) {
-            mAddrSize = 4;
-        } else if (elfClass == ELFCLASS64) {
-            mAddrSize = 8;
-        } else {
-            throw new IOException("Invalid ELF EI_CLASS: " + elfClass + ": " + mPath);
-        }
-
-        mEndian = mBuffer[EI_DATA];
-        if (mEndian == ELFDATA2LSB) {
-        } else if (mEndian == ELFDATA2MSB) {
-            throw new IOException("Unsupported ELFDATA2MSB file: " + mPath);
-        } else {
-            throw new IOException("Invalid ELF EI_DATA: " + mEndian + ": " + mPath);
-        }
-
-        mType = readHalf();
-
-        int e_machine = readHalf();
-        if (e_machine != EM_386
-                && e_machine != EM_X86_64
-                && e_machine != EM_AARCH64
-                && e_machine != EM_ARM
-                && e_machine != EM_MIPS
-                && e_machine != EM_QDSP6) {
-            throw new IOException("Invalid ELF e_machine: " + e_machine + ": " + mPath);
-        }
-
-        // AbiTest relies on us rejecting any unsupported combinations.
-        if ((e_machine == EM_386 && elfClass != ELFCLASS32)
-                || (e_machine == EM_X86_64 && elfClass != ELFCLASS64)
-                || (e_machine == EM_AARCH64 && elfClass != ELFCLASS64)
-                || (e_machine == EM_ARM && elfClass != ELFCLASS32)
-                || (e_machine == EM_QDSP6 && elfClass != ELFCLASS32)) {
-            throw new IOException(
-                    "Invalid e_machine/EI_CLASS ELF combination: "
-                            + e_machine
-                            + "/"
-                            + elfClass
-                            + ": "
-                            + mPath);
-        }
-
-        mMachine = e_machine;
-        long e_version = readWord();
-        if (e_version != EV_CURRENT) {
-            throw new IOException("Invalid e_version: " + e_version + ": " + mPath);
-        }
-
-        long e_entry = readAddr();
-
-        long ph_off = readOff();
-        long sh_off = readOff();
-
-        long e_flags = readWord();
-        int e_ehsize = readHalf();
-        int e_phentsize = readHalf();
-        int e_phnum = readHalf();
-        int e_shentsize = readHalf();
-        int e_shnum = readHalf();
-        int e_shstrndx = readHalf();
-
-        readSectionHeaders(sh_off, e_shnum, e_shentsize, e_shstrndx);
-        readProgramHeaders(ph_off, e_phnum, e_phentsize);
-    }
-
-    private void readSectionHeaders(long sh_off, int e_shnum, int e_shentsize, int e_shstrndx)
-            throws IOException {
-        // Read the Section Header String Table offset first.
-        {
-            mFile.seek(sh_off + e_shstrndx * e_shentsize);
-
-            long sh_name = readWord();
-            long sh_type = readWord();
-            long sh_flags = readX(mAddrSize);
-            long sh_addr = readAddr();
-            long sh_offset = readOff();
-            long sh_size = readX(mAddrSize);
-            // ...
-
-            if (sh_type == SHT_STRTAB) {
-                mShStrTabOffset = sh_offset;
-                mShStrTabSize = sh_size;
-            }
-        }
-
-        for (int i = 0; i < e_shnum; ++i) {
-            // Don't bother to re-read the Section Header StrTab.
-            if (i == e_shstrndx) {
-                continue;
-            }
-
-            mFile.seek(sh_off + i * e_shentsize);
-
-            long sh_name = readWord();
-            long sh_type = readWord();
-            long sh_flags = readX(mAddrSize);
-            long sh_addr = readAddr();
-            long sh_offset = readOff();
-            long sh_size = readX(mAddrSize);
-            long sh_link = readWord();
-            long sh_info = readWord();
-            long sh_addralign = readX(mAddrSize);
-            ;
-            long sh_entsize = readX(mAddrSize);
-            ;
-
-            if (sh_type == SHT_SYMTAB || sh_type == SHT_DYNSYM) {
-                final String symTabName = readShStrTabEntry(sh_name);
-                if (".symtab".equals(symTabName)) {
-                    mSymTabOffset = sh_offset;
-                    mSymTabSize = sh_size;
-                    mSymEntCnt = (int) (sh_size / sh_entsize);
-                } else if (".dynsym".equals(symTabName)) {
-                    mDynSymOffset = sh_offset;
-                    mDynSymSize = sh_size;
-                    mDynSymEntCnt = (int) (sh_size / sh_entsize);
-                }
-                System.out.println(
-                        String.format(
-                                "%s, %d, %d, %d, %d, %d",
-                                symTabName, sh_offset, sh_size, sh_link, sh_info, sh_entsize));
-            } else if (sh_type == SHT_STRTAB) {
-                final String strTabName = readShStrTabEntry(sh_name);
-                if (".strtab".equals(strTabName)) {
-                    mStrTabOffset = sh_offset;
-                    mStrTabSize = sh_size;
-                    System.out.println(
-                            String.format(
-                                    "%s, %d, %d, %d, %d",
-                                    strTabName, sh_offset, sh_size, sh_link, sh_info));
-                } else if (".dynstr".equals(strTabName)) {
-                    mDynStrOffset = sh_offset;
-                    mDynStrSize = sh_size;
-                    System.out.println(
-                            String.format(
-                                    "%s, %d, %d, %d, %d",
-                                    strTabName, sh_offset, sh_size, sh_link, sh_info));
-                }
-            } else if (sh_type == SHT_DYNAMIC) {
-                mIsDynamic = true;
-                final String strTabName = readShStrTabEntry(sh_name);
-                mDynamicTabOffset = sh_offset;
-                mDynamicTabSize = sh_size;
-                System.out.println(
-                        String.format(
-                                "%s, %d, %d, %d, %d",
-                                strTabName, sh_offset, sh_size, sh_link, sh_info));
-            } else if (sh_type == SHT_GNU_VERSYM) {
-                final String strTabName = readShStrTabEntry(sh_name);
-                if (".gnu.version".equals(strTabName)) {
-                    mVerSymTabOffset = sh_offset;
-                    mVerSymTabSize = sh_size;
-                }
-                System.out.println(
-                        String.format(
-                                "%s, %d, %d, %d, %d",
-                                strTabName, sh_offset, sh_size, sh_link, sh_info));
-            } else if (sh_type == SHT_GNU_VERNEED) {
-                final String strTabName = readShStrTabEntry(sh_name);
-                if (".gnu.version_r".equals(strTabName)) {
-                    mVerNeedTabOffset = sh_offset;
-                    mVerNeedTabSize = sh_size;
-                    mVerNeedEntryCnt = (int) sh_info;
-                }
-                System.out.println(
-                        String.format(
-                                "%s, %d, %d, %d, %d",
-                                strTabName, sh_offset, sh_size, sh_link, sh_info));
-            } else if (sh_type == SHT_GNU_VERDEF) {
-                final String strTabName = readShStrTabEntry(sh_name);
-                if (".gnu.version_d".equals(strTabName)) {
-                    mVerDefTabOffset = sh_offset;
-                    mVerDefTabSize = sh_size;
-                    mVerDefEntryCnt = (int) sh_info;
-                }
-                System.out.println(
-                        String.format(
-                                "%s, %d, %d, %d, %d",
-                                strTabName, sh_offset, sh_size, sh_link, sh_info));
-            } else if (sh_type == SHT_PROGBITS) {
-                final String strTabName = readShStrTabEntry(sh_name);
-                if (".rodata".equals(strTabName)) {
-                    mHasRodata = true;
-                    mRodataOffset = sh_offset;
-                    mRodataSize = (int) sh_size;
-                }
-                System.out.println(
-                        String.format(
-                                "%s, %d, %d, %d, %d",
-                                strTabName, sh_offset, sh_size, sh_link, sh_info));
-            }
-        }
-    }
-
-    private void readProgramHeaders(long ph_off, int e_phnum, int e_phentsize) throws IOException {
-        for (int i = 0; i < e_phnum; ++i) {
-            mFile.seek(ph_off + i * e_phentsize);
-
-            long p_type = readWord();
-            if (p_type == PT_LOAD) {
-                if (mAddrSize == 8) {
-                    // Only in Elf64_phdr; in Elf32_phdr p_flags is at the end.
-                    long p_flags = readWord();
-                }
-                long p_offset = readOff();
-                long p_vaddr = readAddr();
-                // ...
-
-                if (p_vaddr == 0) {
-                    mIsPIE = true;
-                }
-            }
-        }
-    }
-
-    private HashMap<String, Symbol> readSymbolTable(
-            Symbol[] symArr,
-            boolean isDynSym,
-            long symStrOffset,
-            long symStrSize,
-            long tableOffset,
-            long tableSize)
-            throws IOException {
-        HashMap<String, Symbol> result = new HashMap<String, Symbol>();
-        mFile.seek(tableOffset);
-        int i = 0;
-        while (mFile.getFilePointer() < tableOffset + tableSize) {
-            long st_name = readWord();
-            int st_info;
-            int st_shndx;
-            long st_value;
-            long st_size;
-            int st_other;
-            if (mAddrSize == 8) {
-                st_info = readByte();
-                st_other = readByte();
-                st_shndx = readHalf();
-                st_value = readAddr();
-                st_size = readX(mAddrSize);
-            } else {
-                st_value = readAddr();
-                st_size = readWord();
-                st_info = readByte();
-                st_other = readByte();
-                st_shndx = readHalf();
-            }
-
-            String symName;
-            if (st_name == 0) {
-                symName = "";
-            } else {
-                symName = readStrTabEntry(symStrOffset, symStrSize, st_name);
-            }
-
-            Symbol sym = new Symbol(symName, st_info, st_shndx, st_value, st_size, st_other);
-            if (!symName.equals("")) {
-                result.put(symName, sym);
-            }
-            if (isDynSym) {
-                if (mVerNeedEntryCnt > 0) {
-                    if (sym.type == Symbol.STT_NOTYPE) {
-                        sym.mVerNeed = mVerNeedArr[0];
-                    } else {
-                        sym.mVerNeed = getVerNeed(mVerSym[i]);
-                    }
-                } else if (mVerDefEntryCnt > 0) {
-                    sym.mVerDef = mVerDefArr[mVerSym[i]];
-                }
-            }
-            symArr[i] = sym;
-            i++;
-        }
-        System.out.println(
-                String.format(
-                        "Info readSymbolTable: %s, isDynSym %b, symbol# %d",
-                        mPath, isDynSym, symArr.length));
-        return result;
-    }
-
-    private String readShStrTabEntry(long strOffset) throws IOException {
-        if (mShStrTabOffset == 0 || strOffset < 0 || strOffset >= mShStrTabSize) {
-            return null;
-        }
-        return readString(mShStrTabOffset + strOffset);
-    }
-
-    private String readStrTabEntry(long tableOffset, long tableSize, long strOffset)
-            throws IOException {
-        if (tableOffset == 0 || strOffset < 0 || strOffset >= tableSize) {
-            return null;
-        }
-        return readString(tableOffset + strOffset);
-    }
-
-    private String readDynStrTabEntry(long strOffset) throws IOException {
-        if (mDynStrOffset == 0 || strOffset < 0 || strOffset >= mDynStrSize) {
-            return null;
-        }
-        return readString(mDynStrOffset + strOffset);
-    }
-
-    private int[] getVerSym() throws IOException {
-        if (mVerSym == null) {
-            mFile.seek(mVerSymTabOffset);
-            int cnt = (int) mVerSymTabSize / 2;
-            mVerSym = new int[cnt];
-            for (int i = 0; i < cnt; i++) {
-                mVerSym[i] = readHalf();
-                //System.out.println(String.format("%d, %d", i, mVerSym[i]));
-            }
-        }
-        return mVerSym;
-    }
-
-    public VerNeed getVerNeed(int ndx) throws IOException {
-        // vna_other Contains version index unique for the file which is used in the version symbol table.
-        if (ndx < 2) {
-            return this.mVerNeedArr[ndx];
-        }
-
-        for (int i = 2; i < this.mVerNeedEntryCnt + 2; i++) {
-            for (int j = 0; j < this.mVerNeedArr[i].vn_cnt; j++) {
-                if (this.mVerNeedArr[i].vn_vernaux[j].vna_other == ndx) {
-                    return this.mVerNeedArr[i];
-                }
-            }
-        }
-        System.out.println(String.format("no VerNeed found: %d", ndx));
-        return null;
-    }
-
-    private VerNeed[] getVerNeedArr() throws IOException {
-        if (mVerNeedArr == null) {
-            mVerNeedArr = new VerNeed[mVerNeedEntryCnt + 2];
-
-            // SHT_GNU_versym 0: local
-            mVerNeedArr[0] = new VerNeed("*local*", "*local*", 0);
-            // HT_GNU_versym 1: global
-            mVerNeedArr[1] = new VerNeed("*global*", "*global*", 1);
-
-            long idx = mVerNeedTabOffset;
-            for (int i = 2; i < mVerNeedEntryCnt + 2; i++) {
-                mFile.seek(idx);
-                mVerNeedArr[i] =
-                        new VerNeed(readHalf(), readHalf(), readWord(), readWord(), readWord());
-                mVerNeedArr[i].vn_file_name = readDynStrTabEntry(mVerNeedArr[i].vn_file).toLowerCase();
-
-                mVerNeedArr[i].vn_vernaux = new VerNAux[mVerNeedArr[i].vn_cnt];
-                long idxAux = idx + mVerNeedArr[i].vn_aux;
-                for (int j = 0; j < mVerNeedArr[i].vn_cnt; j++) {
-                    mFile.seek(idxAux);
-                    mVerNeedArr[i].vn_vernaux[j] =
-                            new VerNAux(readWord(), readHalf(), readHalf(), readWord(), readWord());
-                    mVerNeedArr[i].vn_vernaux[j].vna_lib_name =
-                            readDynStrTabEntry(mVerNeedArr[i].vn_vernaux[j].vna_name);
-                    idxAux += mVerNeedArr[i].vn_vernaux[j].vna_next;
-                }
-                idx += mVerNeedArr[i].vn_next;
-                System.out.println(mVerNeedArr[i]);
-            }
-        }
-
-        return mVerNeedArr;
-    }
-
-    private VerDef[] getVerDef() throws IOException {
-        if (mVerDefArr == null) {
-            mVerDefArr = new VerDef[mVerDefEntryCnt + 2];
-
-            // SHT_GNU_versym 0: local
-            mVerDefArr[0] = new VerDef("*local*");
-            // HT_GNU_versym 1: global
-            mVerDefArr[1] = new VerDef("*global*");
-
-            long idx = mVerDefTabOffset;
-            for (int i = 2; i < mVerDefEntryCnt + 2; i++) {
-                mFile.seek(idx);
-                mVerDefArr[i] =
-                        new VerDef(
-                                readHalf(),
-                                readHalf(),
-                                readHalf(),
-                                readHalf(),
-                                readWord(),
-                                readWord(),
-                                readWord());
-
-                mVerDefArr[i].vd_verdaux = new VerDAux[mVerDefArr[i].vd_cnt];
-                long idxAux = idx + mVerDefArr[i].vd_aux;
-                for (int j = 0; j < mVerDefArr[i].vd_cnt; j++) {
-                    mFile.seek(idxAux);
-                    mVerDefArr[i].vd_verdaux[j] = new VerDAux(readWord(), readWord());
-                    mVerDefArr[i].vd_verdaux[j].vda_lib_name =
-                            readDynStrTabEntry(mVerDefArr[i].vd_verdaux[j].vda_name).toLowerCase();
-                    idxAux += mVerDefArr[i].vd_verdaux[j].vda_next;
-                }
-                idx += mVerDefArr[i].vd_next;
-                System.out.println(mVerDefArr[i]);
-            }
-        }
-        return mVerDefArr;
-    }
-
-    private int readHalf() throws IOException {
-        return (int) readX(2);
-    }
-
-    private long readWord() throws IOException {
-        return readX(4);
-    }
-
-    private long readOff() throws IOException {
-        return readX(mAddrSize);
-    }
-
-    private long readAddr() throws IOException {
-        return readX(mAddrSize);
-    }
-
-    private long readX(int byteCount) throws IOException {
-        mFile.readFully(mBuffer, 0, byteCount);
-
-        int answer = 0;
-        if (mEndian == ELFDATA2LSB) {
-            for (int i = byteCount - 1; i >= 0; i--) {
-                answer = (answer << 8) | (mBuffer[i] & 0xff);
-            }
-        } else {
-            final int N = byteCount - 1;
-            for (int i = 0; i <= N; ++i) {
-                answer = (answer << 8) | (mBuffer[i] & 0xff);
-            }
-        }
-
-        return answer;
-    }
-
-    private String readString(long offset) throws IOException {
-        long originalOffset = mFile.getFilePointer();
-        mFile.seek(offset);
-        mFile.readFully(mBuffer, 0, (int) Math.min(mBuffer.length, mFile.length() - offset));
-        mFile.seek(originalOffset);
-
-        for (int i = 0; i < mBuffer.length; ++i) {
-            if (mBuffer[i] == 0) {
-                return new String(mBuffer, 0, i);
-            }
-        }
-
-        return null;
-    }
-
-    private int readByte() throws IOException {
-        return mFile.read() & 0xff;
-    }
-
-    public Symbol getSymbol(String name) {
-        if (mSymbols == null) {
-            try {
-                mSymArr = new Symbol[mSymEntCnt];
-                mSymbols =
-                        readSymbolTable(
-                                mSymArr,
-                                false,
-                                mStrTabOffset,
-                                mStrTabSize,
-                                mSymTabOffset,
-                                mSymTabSize);
-            } catch (IOException e) {
-                return null;
-            }
-        }
-        return mSymbols.get(name);
-    }
-
-    public Symbol getDynamicSymbol(String name) throws IOException {
-        if (mDynamicSymbols == null) {
-            try {
-                int[] verSmyArr = this.getVerSym();
-                VerNeed[] verNeedArr = this.getVerNeedArr();
-                VerDef[] verDefArr = this.getVerDef();
-                mDynSymArr = new Symbol[mDynSymEntCnt];
-                mDynamicSymbols =
-                        readSymbolTable(
-                                mDynSymArr,
-                                true,
-                                mDynStrOffset,
-                                mDynStrSize,
-                                mDynSymOffset,
-                                mDynSymSize);
-            } catch (IOException e) {
-                return null;
-            }
-        }
-        return mDynamicSymbols.get(name);
-    }
-
-    // Get Dynamic Linking Dependency List
-    public List<String> getDynamicDependencies() throws IOException {
-        List<String> result = new ArrayList<>();
-        for (DynamicEntry entry : getDynamicList()) {
-            if (entry.isNeeded()) {
-                result.add(readDynStr(entry.getValue()));
-            }
-        }
-        return result;
-    }
-
-    private List<DynamicEntry> getDynamicList() throws IOException {
-        if (mDynamicArr == null) {
-            int entryNo = 0;
-            mDynamicArr = new ArrayList<>();
-            mFile.seek(mDynamicTabOffset);
-            System.out.println(
-                    String.format(
-                            "mDynamicTabOffset 0x%x, mDynamicTabSize %d",
-                            mDynamicTabOffset, mDynamicTabSize));
-            while (true) {
-                long tag = readX(mAddrSize);
-                long value = readX(mAddrSize);
-                // System.out.println(String.format("%d: 0x%x, %d", entryNo, tag, value));
-                mDynamicArr.add(new DynamicEntry(tag, value));
-                if (tag == 0) {
-                    break;
-                }
-                entryNo++;
-            }
-        }
-        return mDynamicArr;
-    }
-
-    private String readDynStr(long strOffset) throws IOException {
-        int offset = (int) (strOffset & 0xFFFFFFFF);
-        if (mDynStrOffset == 0 || offset < 0 || offset >= mDynStrSize) {
-            System.err.println(
-                    String.format(
-                            "err mDynStrOffset: %d,  mDynStrSize: %d, offset: %d",
-                            mDynStrOffset, mDynStrSize, offset));
-            return String.format("%d", offset);
-        }
-        return readString(mDynStrOffset + offset);
-    }
-
-    /**
-     * Gets a list of string from .rodata section
-     *
-     * @return a String list .rodata section
-     */
-    public List<String> getRoStrings() throws IOException {
-        if (mRoStrings == null) {
-            mRoStrings = new ArrayList<>();
-            byte[] byteArr = getRoData();
-            if (byteArr != null) {
-                int strOffset = 0;
-                for (int i = 0; i < mRodataSize; i++) {
-                    if (byteArr[i] == 0) {
-                        // skip null string
-                        if (i != strOffset) {
-                            String str = new String(byteArr, strOffset, i - strOffset);
-                            mRoStrings.add(str);
-                        }
-                        strOffset = i + 1;
-                    }
-                }
-            }
-        }
-        return mRoStrings;
-    }
-
-    /**
-     * Gets .rodata section
-     *
-     * @return byte [] of .rodata or null if there is none
-     */
-    public byte[] getRoData() throws IOException {
-        if (mHasRodata && mRoData == null) {
-            mRoData = new byte[mRodataSize];
-            mFile.seek(mRodataOffset);
-            mFile.readFully(mRoData);
-        }
-
-        return mRoData;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ReportLog.java b/common/util/src/com/android/compatibility/common/util/ReportLog.java
deleted file mode 100644
index 08b1d76..0000000
--- a/common/util/src/com/android/compatibility/common/util/ReportLog.java
+++ /dev/null
@@ -1,374 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.ByteArrayInputStream;
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.List;
-
-/**
- * Utility class to add results to the report.
- */
-public class ReportLog implements Serializable {
-
-    private static final String ENCODING = "UTF-8";
-    private static final String TYPE = "org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer";
-
-    // XML constants
-    private static final String METRIC_TAG = "Metric";
-    private static final String MESSAGE_ATTR = "message";
-    private static final String SCORETYPE_ATTR = "score_type";
-    private static final String SCOREUNIT_ATTR = "score_unit";
-    private static final String SOURCE_ATTR = "source";
-    private static final String SUMMARY_TAG = "Summary";
-    private static final String VALUE_TAG = "Value";
-    private static final String DEFAULT_NAME = "default";
-
-    protected Metric mSummary;
-    protected String mReportLogName;
-    protected String mStreamName;
-
-    public static class Metric implements Serializable {
-        private static final int MAX_SOURCE_LENGTH = 200;
-        private static final int MAX_MESSAGE_LENGTH = 200;
-        private static final int MAX_NUM_VALUES = 1000;
-        String mSource;
-        String mMessage;
-        double[] mValues;
-        ResultType mType;
-        ResultUnit mUnit;
-
-        Metric(String source, String message, double value, ResultType type, ResultUnit unit) {
-            this(source, message, new double[] { value }, type, unit);
-        }
-
-        /**
-         * Creates a metric array to be included in the report. Each object has a message
-         * describing its values and enums to interpret them. In addition, each result also includes
-         * class, method and line number information about the test which added this result which is
-         * collected by looking at the stack trace.
-         *
-         * @param message A string describing the values
-         * @param values An array of the values
-         * @param type Represents how to interpret the values (eg. A lower score is better)
-         * @param unit Represents the unit in which the values are (eg. Milliseconds)
-         */
-        Metric(String source, String message, double[] values, ResultType type, ResultUnit unit) {
-            int sourceLength = source.length();
-            if (sourceLength > MAX_SOURCE_LENGTH) {
-                // Substring to the end
-                mSource = source.substring(sourceLength - MAX_SOURCE_LENGTH);
-            } else {
-                mSource = source;
-            }
-            int messageLength = message.length();
-            if (messageLength > MAX_MESSAGE_LENGTH) {
-                // Substring from the start
-                mMessage = message.substring(0, MAX_MESSAGE_LENGTH);
-            } else {
-                mMessage = message;
-            }
-            int valuesLength = values.length;
-            if (valuesLength > MAX_NUM_VALUES) {
-                // Subarray from the start
-                mValues = Arrays.copyOf(values, MAX_NUM_VALUES);
-            } else {
-                mValues = values;
-            }
-            mType = type;
-            mUnit = unit;
-        }
-
-        public String getSource() {
-            return mSource;
-        }
-
-        public String getMessage() {
-            return mMessage;
-        }
-
-        public double[] getValues() {
-            return mValues;
-        }
-
-        public ResultType getType() {
-            return mType;
-        }
-
-        public ResultUnit getUnit() {
-            return mUnit;
-        }
-
-        void serialize(XmlSerializer serializer)
-                throws IllegalArgumentException, IllegalStateException, IOException {
-            serializer.startTag(null, METRIC_TAG);
-            serializer.attribute(null, SOURCE_ATTR, getSource());
-            serializer.attribute(null, MESSAGE_ATTR, getMessage());
-            serializer.attribute(null, SCORETYPE_ATTR, getType().toReportString());
-            serializer.attribute(null, SCOREUNIT_ATTR, getUnit().toReportString());
-            for (double d : getValues()) {
-                serializer.startTag(null, VALUE_TAG);
-                serializer.text(Double.toString(d));
-                serializer.endTag(null, VALUE_TAG);
-            }
-            serializer.endTag(null, METRIC_TAG);
-        }
-
-        static Metric parse(XmlPullParser parser)
-                throws XmlPullParserException, IOException {
-            parser.require(XmlPullParser.START_TAG, null, METRIC_TAG);
-            String source = parser.getAttributeValue(null, SOURCE_ATTR);
-            String message = parser.getAttributeValue(null, MESSAGE_ATTR);
-            ResultType type = ResultType.parseReportString(
-                    parser.getAttributeValue(null, SCORETYPE_ATTR));
-            ResultUnit unit = ResultUnit.parseReportString(
-                    parser.getAttributeValue(null, SCOREUNIT_ATTR));
-            List<String> valuesList = new ArrayList<>();
-            while (parser.nextTag() == XmlPullParser.START_TAG) {
-                parser.require(XmlPullParser.START_TAG, null, VALUE_TAG);
-                valuesList.add(parser.nextText());
-                parser.require(XmlPullParser.END_TAG, null, VALUE_TAG);
-            }
-            int length = valuesList.size();
-            double[] values = new double[length];
-            for (int i = 0; i < length; i++) {
-                values[i] = Double.parseDouble(valuesList.get(i));
-            }
-            parser.require(XmlPullParser.END_TAG, null, METRIC_TAG);
-            return new Metric(source, message, values, type, unit);
-        }
-    }
-
-    public ReportLog() {
-        mReportLogName = DEFAULT_NAME;
-    }
-
-    public ReportLog(String reportLogName, String streamName) {
-        mReportLogName = reportLogName;
-        mStreamName = streamName;
-    }
-
-    /**
-     * Adds a double array of metrics to the report.
-     */
-    public void addValues(String message, double[] values, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a double array of metrics to the report.
-     */
-    public void addValues(String source, String message, double[] values, ResultType type,
-            ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a double metric to the report.
-     */
-    public void addValue(String message, double value, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a double metric to the report.
-     */
-    public void addValue(String source, String message, double value, ResultType type,
-            ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds an int metric to the report.
-     */
-    public void addValue(String message, int value, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a long metric to the report.
-     */
-    public void addValue(String message, long value, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a float metric to the report.
-     */
-    public void addValue(String message, float value, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a boolean metric to the report.
-     */
-    public void addValue(String message, boolean value, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a String metric to the report.
-     */
-    public void addValue(String message, String value, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds an int array of metrics to the report.
-     */
-    public void addValues(String message, int[] values, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a long array of metrics to the report.
-     */
-    public void addValues(String message, long[] values, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a float array of metrics to the report.
-     */
-    public void addValues(String message, float[] values, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a boolean array of metrics to the report.
-     */
-    public void addValues(String message, boolean[] values, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * Adds a String List of metrics to the report.
-     */
-    public void addValues(String message, List<String> values, ResultType type, ResultUnit unit) {
-        // Do nothing. Subclasses may implement using InfoStore to write metrics to files.
-    }
-
-    /**
-     * @param elem
-     */
-    /* package */ void setSummary(Metric elem) {
-        mSummary = elem;
-    }
-
-    /**
-     * Sets the double metric summary of the report.
-     *
-     * NOTE: messages over {@value Metric#MAX_MESSAGE_LENGTH} chars will be trimmed.
-     */
-    public void setSummary(String message, double value, ResultType type, ResultUnit unit) {
-        setSummary(new Metric(Stacktrace.getTestCallerClassMethodNameLineNumber(), message, value,
-                type, unit));
-    }
-
-    public Metric getSummary() {
-        return mSummary;
-    }
-
-    /**
-     * Serializes a given {@link ReportLog} to a String.
-     * @throws XmlPullParserException
-     * @throws IOException
-     * @throws IllegalStateException
-     * @throws IllegalArgumentException
-     */
-    public static String serialize(ReportLog reportlog) throws XmlPullParserException,
-            IllegalArgumentException, IllegalStateException, IOException {
-        ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
-        XmlSerializer serializer = XmlPullParserFactory.newInstance(TYPE, null).newSerializer();
-        serializer.setOutput(byteArrayOutputStream, ENCODING);
-        serializer.startDocument(ENCODING, true);
-        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
-        serialize(serializer, reportlog);
-        serializer.endDocument();
-        return byteArrayOutputStream.toString(ENCODING);
-    }
-
-    /**
-     * Serializes a given {@link ReportLog} to XML.
-     * @param serializer
-     * @param reportLog
-     * @throws IOException
-     */
-    public static void serialize(XmlSerializer serializer, ReportLog reportLog)
-            throws IOException {
-        if (reportLog == null) {
-            throw new IllegalArgumentException("Metrics reports was null");
-        }
-        Metric summary = reportLog.getSummary();
-        // Summary is optional. Details are not included in result report.
-        if (summary != null) {
-            serializer.startTag(null, SUMMARY_TAG);
-            summary.serialize(serializer);
-            serializer.endTag(null, SUMMARY_TAG);
-        }
-    }
-
-    /**
-     * Parses a {@link ReportLog} from the given string.
-     * @throws XmlPullParserException
-     * @throws IOException
-     */
-    public static ReportLog parse(String result) throws XmlPullParserException, IOException {
-        if (result == null){
-            throw new IllegalArgumentException("Metrics string was null");
-        }
-        if (result.trim().isEmpty()) {
-            // Empty report.
-            return new ReportLog();
-        }
-        XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
-        XmlPullParser parser = factory.newPullParser();
-        parser.setInput(new ByteArrayInputStream(result.getBytes(ENCODING)), ENCODING);
-        try {
-            parser.nextTag();
-        } catch (XmlPullParserException e) {
-            // Empty Report.
-            return new ReportLog();
-        }
-        return parse(parser);
-    }
-
-    /**
-     * Parses a {@link ReportLog} from the given XML parser.
-     * @param parser
-     * @throws IOException
-     * @throws XmlPullParserException
-     */
-    public static ReportLog parse(XmlPullParser parser) throws XmlPullParserException, IOException {
-        parser.require(XmlPullParser.START_TAG, null, SUMMARY_TAG);
-        parser.nextTag();
-        ReportLog report = new ReportLog();
-        report.setSummary(Metric.parse(parser));
-        parser.nextTag();
-        parser.require(XmlPullParser.END_TAG, null, SUMMARY_TAG);
-        return report;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ResultHandler.java b/common/util/src/com/android/compatibility/common/util/ResultHandler.java
deleted file mode 100644
index 1e57c32..0000000
--- a/common/util/src/com/android/compatibility/common/util/ResultHandler.java
+++ /dev/null
@@ -1,701 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import com.android.compatibility.common.util.ChecksumReporter.ChecksumValidationException;
-
-import com.google.common.base.Strings;
-
-import org.xmlpull.v1.XmlPullParser;
-import org.xmlpull.v1.XmlPullParserException;
-import org.xmlpull.v1.XmlPullParserFactory;
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.File;
-import java.io.FileOutputStream;
-import java.io.FileReader;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.nio.file.FileSystems;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.text.SimpleDateFormat;
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Collections;
-import java.util.Date;
-import java.util.List;
-import java.util.Locale;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-import javax.xml.transform.Transformer;
-import javax.xml.transform.TransformerException;
-import javax.xml.transform.TransformerFactory;
-import javax.xml.transform.stream.StreamResult;
-import javax.xml.transform.stream.StreamSource;
-/**
- * Handles conversion of results to/from files.
- */
-public class ResultHandler {
-
-    private static final String ENCODING = "UTF-8";
-    private static final String TYPE = "org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer";
-    private static final String NS = null;
-    private static final String RESULT_FILE_VERSION = "5.0";
-    public static final String TEST_RESULT_FILE_NAME = "test_result.xml";
-    public static final String FAILURE_REPORT_NAME = "test_result_failures.html";
-    private static final String FAILURE_XSL_FILE_NAME = "compatibility_failures.xsl";
-
-    public static final String[] RESULT_RESOURCES = {
-        "compatibility_result.css",
-        "compatibility_result.xsd",
-        "compatibility_result.xsl",
-        "logo.png"
-    };
-
-    // XML constants
-    private static final String ABI_ATTR = "abi";
-    private static final String BUGREPORT_TAG = "BugReport";
-    private static final String BUILD_FINGERPRINT = "build_fingerprint";
-    private static final String BUILD_FINGERPRINT_UNALTERED = "build_fingerprint_unaltered";
-    private static final String BUILD_ID = "build_id";
-    private static final String BUILD_PRODUCT = "build_product";
-    private static final String BUILD_TAG = "Build";
-    private static final String CASE_TAG = "TestCase";
-    private static final String COMMAND_LINE_ARGS = "command_line_args";
-    private static final String DEVICES_ATTR = "devices";
-    private static final String DONE_ATTR = "done";
-    private static final String END_DISPLAY_TIME_ATTR = "end_display";
-    private static final String END_TIME_ATTR = "end";
-    private static final String FAILED_ATTR = "failed";
-    private static final String FAILURE_TAG = "Failure";
-    private static final String HOST_NAME_ATTR = "host_name";
-    private static final String JAVA_VENDOR_ATTR = "java_vendor";
-    private static final String JAVA_VERSION_ATTR = "java_version";
-    private static final String LOGCAT_TAG = "Logcat";
-    private static final String LOG_URL_ATTR = "log_url";
-    private static final String MESSAGE_ATTR = "message";
-    private static final String MODULE_TAG = "Module";
-    private static final String MODULES_DONE_ATTR = "modules_done";
-    private static final String MODULES_TOTAL_ATTR = "modules_total";
-    private static final String NAME_ATTR = "name";
-    private static final String OS_ARCH_ATTR = "os_arch";
-    private static final String OS_NAME_ATTR = "os_name";
-    private static final String OS_VERSION_ATTR = "os_version";
-    private static final String PASS_ATTR = "pass";
-    private static final String REPORT_VERSION_ATTR = "report_version";
-    private static final String REFERENCE_URL_ATTR = "reference_url";
-    private static final String RESULT_ATTR = "result";
-    private static final String RESULT_TAG = "Result";
-    private static final String RUNTIME_ATTR = "runtime";
-    private static final String RUN_HISTORY_ATTR = "run_history";
-    private static final String RUN_HISTORY_TAG = "RunHistory";
-    private static final String RUN_TAG = "Run";
-    private static final String SCREENSHOT_TAG = "Screenshot";
-    private static final String SKIPPED_ATTR = "skipped";
-    private static final String STACK_TAG = "StackTrace";
-    private static final String START_DISPLAY_TIME_ATTR = "start_display";
-    private static final String START_TIME_ATTR = "start";
-    private static final String SUITE_NAME_ATTR = "suite_name";
-    private static final String SUITE_PLAN_ATTR = "suite_plan";
-    private static final String SUITE_VERSION_ATTR = "suite_version";
-    private static final String SUITE_BUILD_ATTR = "suite_build_number";
-    private static final String SUMMARY_TAG = "Summary";
-    private static final String METRIC_TAG = "Metric";
-    private static final String TEST_TAG = "Test";
-
-    private static final String LATEST_RESULT_DIR = "latest";
-
-    /**
-     * Returns IInvocationResults that can be queried for general reporting information, but that
-     * do not store underlying module data. Useful for summarizing invocation history.
-     * @param resultsDir
-     */
-    public static List<IInvocationResult> getLightResults(File resultsDir) {
-        List<IInvocationResult> results = new ArrayList<>();
-        List<File> files = getResultDirectories(resultsDir);
-        for (File resultDir : files) {
-            if (LATEST_RESULT_DIR.equals(resultDir.getName())) {
-                continue;
-            }
-            IInvocationResult result = getResultFromDir(resultDir, false);
-            if (result != null) {
-                results.add(new LightInvocationResult(result));
-                result = null; // ensure all references are removed to free memory
-            }
-        }
-        // Sort the table entries on each entry's timestamp.
-        Collections.sort(results,  (result1, result2) -> Long.compare(
-                result1.getStartTime(),
-                result2.getStartTime()));
-        return results;
-    }
-
-    /**
-     * @param resultDir
-     * @return an IInvocationResult for this result, or null upon error
-     */
-    public static IInvocationResult getResultFromDir(File resultDir) {
-        return getResultFromDir(resultDir, false);
-    }
-
-    /**
-     * @param resultDir
-     * @param useChecksum
-     * @return an IInvocationResult for this result, or null upon error
-     */
-    public static IInvocationResult getResultFromDir(File resultDir, Boolean useChecksum) {
-        File resultFile = null;
-        try {
-            resultFile = new File(resultDir, TEST_RESULT_FILE_NAME);
-            if (!resultFile.exists()) {
-                return null;
-            }
-            Boolean invocationUseChecksum = useChecksum;
-            IInvocationResult invocation = new InvocationResult();
-            invocation.setRetryDirectory(resultDir);
-            ChecksumReporter checksumReporter = null;
-            if (invocationUseChecksum) {
-                try {
-                    checksumReporter = ChecksumReporter.load(resultDir);
-                    invocation.setRetryChecksumStatus(RetryChecksumStatus.RetryWithChecksum);
-                } catch (ChecksumValidationException e) {
-                    // Unable to read checksum form previous execution
-                    invocation.setRetryChecksumStatus(RetryChecksumStatus.RetryWithoutChecksum);
-                    invocationUseChecksum = false;
-                }
-            }
-            XmlPullParserFactory factory = XmlPullParserFactory.newInstance();
-            XmlPullParser parser = factory.newPullParser();
-            parser.setInput(new FileReader(resultFile));
-
-            parser.nextTag();
-            parser.require(XmlPullParser.START_TAG, NS, RESULT_TAG);
-            invocation.setStartTime(Long.valueOf(
-                    parser.getAttributeValue(NS, START_TIME_ATTR)));
-            invocation.setTestPlan(parser.getAttributeValue(NS, SUITE_PLAN_ATTR));
-            invocation.setCommandLineArgs(parser.getAttributeValue(NS, COMMAND_LINE_ARGS));
-            String deviceList = parser.getAttributeValue(NS, DEVICES_ATTR);
-            for (String device : deviceList.split(",")) {
-                invocation.addDeviceSerial(device);
-            }
-
-            parser.nextTag();
-            parser.require(XmlPullParser.START_TAG, NS, BUILD_TAG);
-            invocation.addInvocationInfo(BUILD_ID, parser.getAttributeValue(NS, BUILD_ID));
-            invocation.addInvocationInfo(BUILD_PRODUCT, parser.getAttributeValue(NS,
-                    BUILD_PRODUCT));
-            String runHistoryValue = parser.getAttributeValue(NS, RUN_HISTORY_ATTR);
-            if (runHistoryValue != null) {
-                invocation.addInvocationInfo(RUN_HISTORY_ATTR, runHistoryValue);
-            }
-
-            // The build fingerprint needs to reflect the true fingerprint of the device under test,
-            // ignoring potential overrides made by test suites (namely STS) for APFE build
-            // association.
-            String reportFingerprint = parser.getAttributeValue(NS, BUILD_FINGERPRINT);
-            String unalteredFingerprint = parser.getAttributeValue(NS, BUILD_FINGERPRINT_UNALTERED);
-            Boolean fingerprintWasAltered = !Strings.isNullOrEmpty(unalteredFingerprint);
-            invocation.setBuildFingerprint(fingerprintWasAltered ? unalteredFingerprint :
-                reportFingerprint );
-
-            // TODO(stuartscott): may want to reload these incase the retry was done with
-            // --skip-device-info flag
-            parser.nextTag();
-            parser.require(XmlPullParser.END_TAG, NS, BUILD_TAG);
-
-            // Parse RunHistory tag.
-            parser.nextTag();
-            boolean hasRunHistoryTag = true;
-            try {
-                parser.require(parser.START_TAG, NS, RUN_HISTORY_TAG);
-            } catch (XmlPullParserException e) {
-                hasRunHistoryTag = false;
-            }
-            if (hasRunHistoryTag) {
-                parseRunHistory(parser);
-            }
-
-            parser.require(XmlPullParser.START_TAG, NS, SUMMARY_TAG);
-            parser.nextTag();
-            parser.require(XmlPullParser.END_TAG, NS, SUMMARY_TAG);
-            while (parser.nextTag() == XmlPullParser.START_TAG) {
-                parser.require(XmlPullParser.START_TAG, NS, MODULE_TAG);
-                String name = parser.getAttributeValue(NS, NAME_ATTR);
-                String abi = parser.getAttributeValue(NS, ABI_ATTR);
-                String moduleId = AbiUtils.createId(abi, name);
-                boolean done = Boolean.parseBoolean(parser.getAttributeValue(NS, DONE_ATTR));
-                IModuleResult module = invocation.getOrCreateModule(moduleId);
-                module.initializeDone(done);
-                long runtime = Long.parseLong(parser.getAttributeValue(NS, RUNTIME_ATTR));
-                module.addRuntime(runtime);
-                while (parser.nextTag() == XmlPullParser.START_TAG) {
-                    parser.require(XmlPullParser.START_TAG, NS, CASE_TAG);
-                    String caseName = parser.getAttributeValue(NS, NAME_ATTR);
-                    ICaseResult testCase = module.getOrCreateResult(caseName);
-                    while (parser.nextTag() == XmlPullParser.START_TAG) {
-                        parser.require(XmlPullParser.START_TAG, NS, TEST_TAG);
-                        String testName = parser.getAttributeValue(NS, NAME_ATTR);
-                        ITestResult test = testCase.getOrCreateResult(testName);
-                        String result = parser.getAttributeValue(NS, RESULT_ATTR);
-                        String skipped = parser.getAttributeValue(NS, SKIPPED_ATTR);
-                        if (skipped != null && Boolean.parseBoolean(skipped)) {
-                            // mark test passed and skipped
-                            test.skipped();
-                        } else {
-                            // only apply result status directly if test was not skipped
-                            test.setResultStatus(TestStatus.getStatus(result));
-                        }
-                        test.setRetry(true);
-                        while (parser.nextTag() == XmlPullParser.START_TAG) {
-                            if (parser.getName().equals(FAILURE_TAG)) {
-                                test.setMessage(parser.getAttributeValue(NS, MESSAGE_ATTR));
-                                if (parser.nextTag() == XmlPullParser.START_TAG) {
-                                    parser.require(XmlPullParser.START_TAG, NS, STACK_TAG);
-                                    test.setStackTrace(parser.nextText());
-                                    parser.require(XmlPullParser.END_TAG, NS, STACK_TAG);
-                                    parser.nextTag();
-                                }
-                                parser.require(XmlPullParser.END_TAG, NS, FAILURE_TAG);
-                            } else if (parser.getName().equals(BUGREPORT_TAG)) {
-                                test.setBugReport(parser.nextText());
-                                parser.require(XmlPullParser.END_TAG, NS, BUGREPORT_TAG);
-                            } else if (parser.getName().equals(LOGCAT_TAG)) {
-                                test.setLog(parser.nextText());
-                                parser.require(XmlPullParser.END_TAG, NS, LOGCAT_TAG);
-                            } else if (parser.getName().equals(SCREENSHOT_TAG)) {
-                                test.setScreenshot(parser.nextText());
-                                parser.require(XmlPullParser.END_TAG, NS, SCREENSHOT_TAG);
-                            } else if (SUMMARY_TAG.equals(parser.getName())) {
-                                test.setReportLog(ReportLog.parse(parser));
-                            } else if (METRIC_TAG.equals(parser.getName())) {
-                                // Ignore the new format in the old parser.
-                                parser.nextText();
-                                parser.require(XmlPullParser.END_TAG, NS, METRIC_TAG);
-                            } else if (RUN_HISTORY_TAG.equals(parser.getName())) {
-                                // Ignore the test result history since it only exists in
-                                // CTS Verifier, which will not use parsing feature.
-                                skipCurrentTag(parser);
-                            } else {
-                                parser.nextTag();
-                            }
-                        }
-                        parser.require(XmlPullParser.END_TAG, NS, TEST_TAG);
-                        // If the fingerprint was altered, then checksum against the fingerprint
-                        // originally reported
-                        Boolean checksumMismatch = invocationUseChecksum &&
-                             !checksumReporter.containsTestResult(test, module, reportFingerprint)
-                             && (fingerprintWasAltered ? !checksumReporter.containsTestResult(
-                                 test, module, unalteredFingerprint) : true);
-                        if (checksumMismatch) {
-                            test.removeResult();
-                        }
-                    }
-                    parser.require(XmlPullParser.END_TAG, NS, CASE_TAG);
-                }
-                parser.require(XmlPullParser.END_TAG, NS, MODULE_TAG);
-                // If the fingerprint was altered, then checksum against the fingerprint
-                // originally reported
-                Boolean checksumMismatch = invocationUseChecksum &&
-                     !checksumReporter.containsModuleResult(module, reportFingerprint) &&
-                     (fingerprintWasAltered ? !checksumReporter.containsModuleResult(
-                         module, unalteredFingerprint) : true);
-                if (checksumMismatch) {
-                    module.initializeDone(false);
-                }
-            }
-            parser.require(XmlPullParser.END_TAG, NS, RESULT_TAG);
-            return invocation;
-        } catch (XmlPullParserException | IOException e) {
-            System.out.println(
-                    String.format("Exception when trying to load %s",
-                            resultFile.getAbsolutePath()));
-            e.printStackTrace();
-            return null;
-        }
-    }
-
-    /** Parse and replay all run history information. */
-    private static void parseRunHistory(XmlPullParser parser)
-            throws IOException, XmlPullParserException {
-        while (parser.nextTag() == XmlPullParser.START_TAG) {
-            parser.require(XmlPullParser.START_TAG, NS, RUN_TAG);
-            parser.nextTag();
-            parser.require(XmlPullParser.END_TAG, NS, RUN_TAG);
-        }
-        parser.require(XmlPullParser.END_TAG, NS, RUN_HISTORY_TAG);
-        parser.nextTag();
-    }
-
-    /** Skip the current XML tags. */
-    private static void skipCurrentTag(XmlPullParser parser)
-            throws XmlPullParserException, IOException {
-        int depth = 1;
-        while (depth != 0) {
-            switch (parser.next()) {
-                case XmlPullParser.END_TAG:
-                    depth--;
-                    break;
-                case XmlPullParser.START_TAG:
-                    depth++;
-                    break;
-            }
-        }
-    }
-
-    /**
-     * @param result
-     * @param resultDir
-     * @param startTime
-     * @param referenceUrl A nullable string that can contain a URL to a related data
-     * @param logUrl A nullable string that can contain a URL to related log files
-     * @param commandLineArgs A string containing the arguments to the run command
-     * @param resultAttributes Extra key-value pairs to be added as attributes and corresponding
-     *     values into the result XML file
-     * @return The result file created.
-     * @throws IOException
-     * @throws XmlPullParserException
-     */
-    public static File writeResults(
-            String suiteName,
-            String suiteVersion,
-            String suitePlan,
-            String suiteBuild,
-            IInvocationResult result,
-            File resultDir,
-            long startTime,
-            long endTime,
-            String referenceUrl,
-            String logUrl,
-            String commandLineArgs,
-            Map<String, String> resultAttributes)
-            throws IOException, XmlPullParserException {
-        int passed = result.countResults(TestStatus.PASS);
-        int failed = result.countResults(TestStatus.FAIL);
-        File resultFile = new File(resultDir, TEST_RESULT_FILE_NAME);
-        OutputStream stream = new FileOutputStream(resultFile);
-        XmlSerializer serializer = XmlPullParserFactory.newInstance(TYPE, null).newSerializer();
-        serializer.setOutput(stream, ENCODING);
-        serializer.startDocument(ENCODING, false);
-        serializer.setFeature("http://xmlpull.org/v1/doc/features.html#indent-output", true);
-        serializer.processingInstruction(
-                "xml-stylesheet type=\"text/xsl\" href=\"compatibility_result.xsl\"");
-        serializer.startTag(NS, RESULT_TAG);
-        serializer.attribute(NS, START_TIME_ATTR, String.valueOf(startTime));
-        serializer.attribute(NS, END_TIME_ATTR, String.valueOf(endTime));
-        serializer.attribute(NS, START_DISPLAY_TIME_ATTR, toReadableDateString(startTime));
-        serializer.attribute(NS, END_DISPLAY_TIME_ATTR, toReadableDateString(endTime));
-
-        serializer.attribute(NS, SUITE_NAME_ATTR, suiteName);
-        serializer.attribute(NS, SUITE_VERSION_ATTR, suiteVersion);
-        serializer.attribute(NS, SUITE_PLAN_ATTR, suitePlan);
-        serializer.attribute(NS, SUITE_BUILD_ATTR, suiteBuild);
-        serializer.attribute(NS, REPORT_VERSION_ATTR, RESULT_FILE_VERSION);
-        serializer.attribute(NS, COMMAND_LINE_ARGS, nullToEmpty(commandLineArgs));
-
-        if (resultAttributes != null) {
-            for (Entry<String, String> entry : resultAttributes.entrySet()) {
-                serializer.attribute(NS, entry.getKey(), entry.getValue());
-            }
-        }
-
-        if (referenceUrl != null) {
-            serializer.attribute(NS, REFERENCE_URL_ATTR, referenceUrl);
-        }
-
-        if (logUrl != null) {
-            serializer.attribute(NS, LOG_URL_ATTR, logUrl);
-        }
-
-        // Device Info
-        Set<String> devices = result.getDeviceSerials();
-        StringBuilder deviceList = new StringBuilder();
-        boolean first = true;
-        for (String device : devices) {
-            if (first) {
-                first = false;
-            } else {
-                deviceList.append(",");
-            }
-            deviceList.append(device);
-        }
-        serializer.attribute(NS, DEVICES_ATTR, deviceList.toString());
-
-        // Host Info
-        String hostName = "";
-        try {
-            hostName = InetAddress.getLocalHost().getHostName();
-        } catch (UnknownHostException ignored) {}
-        serializer.attribute(NS, HOST_NAME_ATTR, hostName);
-        serializer.attribute(NS, OS_NAME_ATTR, System.getProperty("os.name"));
-        serializer.attribute(NS, OS_VERSION_ATTR, System.getProperty("os.version"));
-        serializer.attribute(NS, OS_ARCH_ATTR, System.getProperty("os.arch"));
-        serializer.attribute(NS, JAVA_VENDOR_ATTR, System.getProperty("java.vendor"));
-        serializer.attribute(NS, JAVA_VERSION_ATTR, System.getProperty("java.version"));
-
-        // Build Info
-        serializer.startTag(NS, BUILD_TAG);
-        for (Entry<String, String> entry : result.getInvocationInfo().entrySet()) {
-            serializer.attribute(NS, entry.getKey(), entry.getValue());
-            if (Strings.isNullOrEmpty(result.getBuildFingerprint()) &&
-                entry.getKey().equals(BUILD_FINGERPRINT)) {
-                result.setBuildFingerprint(entry.getValue());
-            }
-        }
-        serializer.endTag(NS, BUILD_TAG);
-
-        // Run history - this contains a list of start and end times of previous runs. More
-        // information may be added in the future.
-        Collection<InvocationResult.RunHistory> runHistories =
-                ((InvocationResult) result).getRunHistories();
-        if (!runHistories.isEmpty()) {
-            serializer.startTag(NS, RUN_HISTORY_TAG);
-            for (InvocationResult.RunHistory runHistory : runHistories) {
-                serializer.startTag(NS, RUN_TAG);
-                serializer.attribute(NS, START_TIME_ATTR, String.valueOf(runHistory.startTime));
-                serializer.attribute(NS, END_TIME_ATTR, String.valueOf(runHistory.endTime));
-                serializer.endTag(NS, RUN_TAG);
-            }
-            serializer.endTag(NS, RUN_HISTORY_TAG);
-        }
-
-        // Summary
-        serializer.startTag(NS, SUMMARY_TAG);
-        serializer.attribute(NS, PASS_ATTR, Integer.toString(passed));
-        serializer.attribute(NS, FAILED_ATTR, Integer.toString(failed));
-        serializer.attribute(NS, MODULES_DONE_ATTR,
-                Integer.toString(result.getModuleCompleteCount()));
-        serializer.attribute(NS, MODULES_TOTAL_ATTR,
-                Integer.toString(result.getModules().size()));
-        serializer.endTag(NS, SUMMARY_TAG);
-
-        // Results
-        for (IModuleResult module : result.getModules()) {
-            serializer.startTag(NS, MODULE_TAG);
-            serializer.attribute(NS, NAME_ATTR, module.getName());
-            serializer.attribute(NS, ABI_ATTR, module.getAbi());
-            serializer.attribute(NS, RUNTIME_ATTR, String.valueOf(module.getRuntime()));
-            serializer.attribute(NS, DONE_ATTR, Boolean.toString(module.isDone()));
-            serializer.attribute(NS, PASS_ATTR,
-                    Integer.toString(module.countResults(TestStatus.PASS)));
-            for (ICaseResult cr : module.getResults()) {
-                serializer.startTag(NS, CASE_TAG);
-                serializer.attribute(NS, NAME_ATTR, cr.getName());
-                for (ITestResult r : cr.getResults()) {
-                    TestStatus status = r.getResultStatus();
-                    if (status == null) {
-                        continue; // test was not executed, don't report
-                    }
-                    serializer.startTag(NS, TEST_TAG);
-                    serializer.attribute(NS, RESULT_ATTR, status.getValue());
-                    serializer.attribute(NS, NAME_ATTR, r.getName());
-                    if (r.isSkipped()) {
-                        serializer.attribute(NS, SKIPPED_ATTR, Boolean.toString(true));
-                    }
-                    String message = r.getMessage();
-                    if (message != null) {
-                        serializer.startTag(NS, FAILURE_TAG);
-                        serializer.attribute(NS, MESSAGE_ATTR, message);
-                        String stackTrace = r.getStackTrace();
-                        if (stackTrace != null) {
-                            serializer.startTag(NS, STACK_TAG);
-                            serializer.text(stackTrace);
-                            serializer.endTag(NS, STACK_TAG);
-                        }
-                        serializer.endTag(NS, FAILURE_TAG);
-                    }
-                    String bugreport = r.getBugReport();
-                    if (bugreport != null) {
-                        serializer.startTag(NS, BUGREPORT_TAG);
-                        serializer.text(bugreport);
-                        serializer.endTag(NS, BUGREPORT_TAG);
-                    }
-                    String logcat = r.getLog();
-                    if (logcat != null) {
-                        serializer.startTag(NS, LOGCAT_TAG);
-                        serializer.text(logcat);
-                        serializer.endTag(NS, LOGCAT_TAG);
-                    }
-                    String screenshot = r.getScreenshot();
-                    if (screenshot != null) {
-                        serializer.startTag(NS, SCREENSHOT_TAG);
-                        serializer.text(screenshot);
-                        serializer.endTag(NS, SCREENSHOT_TAG);
-                    }
-                    ReportLog report = r.getReportLog();
-                    if (report != null) {
-                        ReportLog.serialize(serializer, report);
-                    }
-
-                    // Test result history contains a list of execution time for each test item.
-                    List<TestResultHistory> testResultHistories = r.getTestResultHistories();
-                    if (testResultHistories != null) {
-                        for (TestResultHistory resultHistory : testResultHistories) {
-                            TestResultHistory.serialize(serializer, resultHistory, r.getName());
-                        }
-                    }
-
-                    serializer.endTag(NS, TEST_TAG);
-                }
-                serializer.endTag(NS, CASE_TAG);
-            }
-            serializer.endTag(NS, MODULE_TAG);
-        }
-        serializer.endDocument();
-        createChecksum(resultDir, result);
-        return resultFile;
-    }
-
-    /**
-     * Generate html report listing an failed tests
-     */
-    public static File createFailureReport(File inputXml) {
-        File failureReport = new File(inputXml.getParentFile(), FAILURE_REPORT_NAME);
-        try (InputStream xslStream = ResultHandler.class.getResourceAsStream(
-                String.format("/report/%s", FAILURE_XSL_FILE_NAME));
-             OutputStream outputStream = new FileOutputStream(failureReport)) {
-
-            Transformer transformer = TransformerFactory.newInstance().newTransformer(
-                    new StreamSource(xslStream));
-            transformer.transform(new StreamSource(inputXml), new StreamResult(outputStream));
-        } catch (IOException | TransformerException ignored) { }
-        return failureReport;
-    }
-
-    private static void createChecksum(File resultDir, IInvocationResult invocationResult) {
-        RetryChecksumStatus retryStatus = invocationResult.getRetryChecksumStatus();
-        switch (retryStatus) {
-            case NotRetry: case RetryWithChecksum:
-                // Do not disrupt the process if there is a problem generating checksum.
-                ChecksumReporter.tryCreateChecksum(resultDir, invocationResult);
-                break;
-            case RetryWithoutChecksum:
-                // If the previous run has an invalid checksum file,
-                // copy it into current results folder for future troubleshooting
-                File retryDirectory = invocationResult.getRetryDirectory();
-                Path retryChecksum = FileSystems.getDefault().getPath(
-                        retryDirectory.getAbsolutePath(), ChecksumReporter.NAME);
-                if (!retryChecksum.toFile().exists()) {
-                    // if no checksum file, check for a copy from a previous retry
-                    retryChecksum = FileSystems.getDefault().getPath(
-                            retryDirectory.getAbsolutePath(), ChecksumReporter.PREV_NAME);
-                }
-
-                if (retryChecksum.toFile().exists()) {
-                    File checksumCopy = new File(resultDir, ChecksumReporter.PREV_NAME);
-                    try (FileOutputStream stream = new FileOutputStream(checksumCopy)) {
-                        Files.copy(retryChecksum, stream);
-                    } catch (IOException e) {
-                        // Do not disrupt the process if there is a problem copying checksum
-                    }
-                }
-        }
-    }
-
-
-    /**
-     * Find the IInvocationResult for the given sessionId.
-     */
-    public static IInvocationResult findResult(File resultsDir, Integer sessionId) {
-        return findResult(resultsDir, sessionId, true);
-    }
-
-    /**
-     * Find the IInvocationResult for the given sessionId.
-     */
-    private static IInvocationResult findResult(
-            File resultsDir, Integer sessionId, Boolean useChecksum) {
-        if (sessionId < 0) {
-            throw new IllegalArgumentException(
-                String.format("Invalid session id [%d] ", sessionId));
-        }
-        File resultDir = getResultDirectory(resultsDir, sessionId);
-        IInvocationResult result = getResultFromDir(resultDir, useChecksum);
-        if (result == null) {
-            throw new RuntimeException(String.format("Could not find session [%d]", sessionId));
-        }
-        return result;
-    }
-
-    /**
-     * Get the result directory for the given sessionId.
-     */
-    public static File getResultDirectory(File resultsDir, Integer sessionId) {
-        if (sessionId < 0) {
-            throw new IllegalArgumentException(
-                String.format("Invalid session id [%d] ", sessionId));
-        }
-        List<File> allResultDirs = getResultDirectories(resultsDir);
-        if (sessionId >= allResultDirs.size()) {
-            throw new IllegalArgumentException(String.format("Invalid session id [%d], results " +
-                    "directory (%s) contains only %d results",
-                    sessionId, resultsDir.getAbsolutePath(), allResultDirs.size()));
-        }
-        return allResultDirs.get(sessionId);
-    }
-
-    /**
-     * Get a list of child directories that contain test invocation results
-     * @param resultsDir the root test result directory
-     * @return the list of {@link File} results directory.
-     */
-    public static List<File> getResultDirectories(File resultsDir) {
-        List<File> directoryList = new ArrayList<>();
-        File[] files = resultsDir.listFiles();
-        if (files == null || files.length == 0) {
-            // No results, just return the empty list
-            return directoryList;
-        }
-        for (File resultDir : files) {
-            if (!resultDir.isDirectory()) {
-                continue;
-            }
-            // Only include if it contain results file
-            File resultFile = new File(resultDir, TEST_RESULT_FILE_NAME);
-            if (!resultFile.exists()) {
-                continue;
-            }
-            directoryList.add(resultDir);
-        }
-        Collections.sort(directoryList, (d1, d2) -> d1.getName().compareTo(d2.getName()));
-        return directoryList;
-    }
-
-    /**
-     * Return the given time as a {@link String} suitable for displaying.
-     * <p/>
-     * Example: Fri Aug 20 15:13:03 PDT 2010
-     *
-     * @param time the epoch time in ms since midnight Jan 1, 1970
-     */
-    static String toReadableDateString(long time) {
-    SimpleDateFormat dateFormat =
-        new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy", Locale.ENGLISH);
-        return dateFormat.format(new Date(time));
-    }
-
-    /**
-     * When nullable is null, return an empty string. Otherwise, return the value in nullable.
-     */
-    private static String nullToEmpty(String nullable) {
-        return nullable == null ? "" : nullable;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ResultType.java b/common/util/src/com/android/compatibility/common/util/ResultType.java
deleted file mode 100644
index 9d0a5fa..0000000
--- a/common/util/src/com/android/compatibility/common/util/ResultType.java
+++ /dev/null
@@ -1,45 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-/**
- * Enum for distinguishing results.
- */
-public enum ResultType {
-    /** Lower score is better. */
-    LOWER_BETTER,
-    /** Higher score is better. */
-    HIGHER_BETTER,
-    /** This value is not directly correlated with score. */
-    NEUTRAL,
-    /** Presence of this type requires some attention although it may not be an error. */
-    WARNING;
-
-    /**
-     * @return a string to be used in the report.
-     */
-    public String toReportString() {
-        return name().toLowerCase();
-    }
-
-    /**
-     * Returns a {@link ResultType} given a string from the report.
-     */
-    public static ResultType parseReportString(String value) {
-        return ResultType.valueOf(value.toUpperCase());
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ResultUnit.java b/common/util/src/com/android/compatibility/common/util/ResultUnit.java
deleted file mode 100644
index 131ba8f..0000000
--- a/common/util/src/com/android/compatibility/common/util/ResultUnit.java
+++ /dev/null
@@ -1,59 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-/**
- * Enum for representing the unit of results.
- */
-public enum ResultUnit {
-    /** for value with no unit */
-    NONE,
-    /** milli-seconds */
-    MS,
-    /** frames per second */
-    FPS,
-    /** operations per second */
-    OPS,
-    /** kilo-bytes-per-second, not bits-per-second */
-    KBPS,
-    /** mega-bytes-per-second */
-    MBPS,
-    /** amount of data, bytes */
-    BYTE,
-    /** tell how many times it did happen. */
-    COUNT,
-    /** unit for benchmarking with generic score. */
-    SCORE,
-    /** radian */
-    RADIAN,
-    /** Audio or Video frames count, dropped, repeated, etc... */
-    FRAMES;
-
-    /**
-     * @return a string to be used in the report.
-     */
-    public String toReportString() {
-        return name().toLowerCase();
-    }
-
-    /**
-     * Returns a {@link ResultUnit} given a string from the report.
-     */
-    public static ResultUnit parseReportString(String value) {
-        return ResultUnit.valueOf(value.toUpperCase());
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ResultUploader.java b/common/util/src/com/android/compatibility/common/util/ResultUploader.java
deleted file mode 100644
index 7348284..0000000
--- a/common/util/src/com/android/compatibility/common/util/ResultUploader.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.io.ByteArrayOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.util.zip.GZIPOutputStream;
-
-/**
- * Uploads a result through a HTTP POST multipart/form-data request containing
- * the test result XML.
- */
-public class ResultUploader {
-
-    private static final int RESULT_XML_BYTES = 500 * 1024;
-
-    /* package */ MultipartForm mMultipartForm;
-
-    public ResultUploader(String serverUrl, String suiteName) {
-        mMultipartForm = new MultipartForm(serverUrl).addFormValue("suite", suiteName);
-    }
-
-    /**
-     * Uploads the given file to the server.
-     *
-     * @param reportFile The file to upload.
-     * @param referenceUrl A reference url to use.
-     * @throws IOException
-     */
-    public int uploadResult(File reportFile, String referenceUrl) throws IOException {
-        InputStream input = new FileInputStream(reportFile);
-        try {
-            byte[] data = getBytes(input);
-            mMultipartForm.addFormFile("resultXml", "test-result.xml.gz", data);
-            if (referenceUrl != null && !referenceUrl.trim().isEmpty()) {
-                mMultipartForm.addFormValue("referenceUrl", referenceUrl);
-            }
-            return mMultipartForm.submit();
-        } finally {
-            input.close();
-        }
-    }
-
-    private static byte[] getBytes(InputStream input) throws IOException {
-        ByteArrayOutputStream byteOutput = new ByteArrayOutputStream(RESULT_XML_BYTES);
-        GZIPOutputStream gzipOutput = new GZIPOutputStream(byteOutput);
-        byte[] buffer = new byte[1024];
-        int count;
-        while ((count = input.read(buffer)) > 0) {
-            gzipOutput.write(buffer, 0, count);
-        }
-        gzipOutput.close();
-        return byteOutput.toByteArray();
-    }
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/RetryChecksumStatus.java b/common/util/src/com/android/compatibility/common/util/RetryChecksumStatus.java
deleted file mode 100644
index a86ab37..0000000
--- a/common/util/src/com/android/compatibility/common/util/RetryChecksumStatus.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package com.android.compatibility.common.util;
-
-
-public enum RetryChecksumStatus {
-    NotRetry,
-    RetryWithChecksum,
-    RetryWithoutChecksum
-}
diff --git a/common/util/src/com/android/compatibility/common/util/Stacktrace.java b/common/util/src/com/android/compatibility/common/util/Stacktrace.java
deleted file mode 100644
index 27bf9ca..0000000
--- a/common/util/src/com/android/compatibility/common/util/Stacktrace.java
+++ /dev/null
@@ -1,70 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-/**
- * Helper methods for dealing with stack traces
- */
-public class Stacktrace {
-
-    private static final int SAFETY_DEPTH = 4;
-    private static final String TEST_POSTFIX = "Test";
-
-    private Stacktrace() {}
-
-    /**
-     * @return classname#methodname from call stack of the current thread
-     */
-    public static String getTestCallerClassMethodName() {
-        return getTestCallerClassMethodName(false /*includeLineNumber*/);
-    }
-
-    /**
-     * @return classname#methodname from call stack of the current thread
-     */
-    public static String getTestCallerClassMethodNameLineNumber() {
-        return getTestCallerClassMethodName(true /*includeLineNumber*/);
-    }
-
-    /**
-     * @return classname#methodname from call stack of the current thread
-     */
-    private static String getTestCallerClassMethodName(boolean includeLineNumber) {
-        StackTraceElement[] elements = Thread.currentThread().getStackTrace();
-        // Look for the first class name in the elements array that ends with Test
-        for (int i = 0; i < elements.length; i++) {
-            if (elements[i].getClassName().endsWith(TEST_POSTFIX)) {
-                return buildClassMethodName(elements, i, includeLineNumber);
-            }
-        }
-
-        // Use a reasonable default if the test name isn't found
-        return buildClassMethodName(elements, SAFETY_DEPTH, includeLineNumber);
-    }
-
-    private static String buildClassMethodName(
-            StackTraceElement[] elements, int depth, boolean includeLineNumber) {
-        depth = Math.min(depth, elements.length - 1);
-        StringBuilder builder = new StringBuilder();
-        builder.append(elements[depth].getClassName()).append("#")
-                .append(elements[depth].getMethodName());
-        if (includeLineNumber) {
-            builder.append(":").append(elements[depth].getLineNumber());
-        }
-        return builder.toString();
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/Stat.java b/common/util/src/com/android/compatibility/common/util/Stat.java
deleted file mode 100644
index 9748440..0000000
--- a/common/util/src/com/android/compatibility/common/util/Stat.java
+++ /dev/null
@@ -1,182 +0,0 @@
-/*
- * Copyright (C) 2014 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.compatibility.common.util;
-
-import java.util.Arrays;
-
-/**
- * Utilities for doing statistics
- */
-public class Stat {
-    /**
-     * Private constructor for static class.
-     */
-    private Stat() {}
-
-    /**
-     * Collection of statistical propertirs like average, max, min, and stddev
-     */
-    public static class StatResult {
-        public double mAverage;
-        public double mMin;
-        public double mMax;
-        public double mStddev;
-        public int mDataCount;
-        public StatResult(double average, double min, double max, double stddev, int dataCount) {
-            mAverage = average;
-            mMin = min;
-            mMax = max;
-            mStddev = stddev;
-            mDataCount = dataCount;
-        }
-    }
-
-    /**
-     * Calculate statistics properties likes average, min, max, and stddev for the given array
-     */
-    public static StatResult getStat(double[] data) {
-        double average = data[0];
-        double min = data[0];
-        double max = data[0];
-        for (int i = 1; i < data.length; i++) {
-            average += data[i];
-            if (data[i] > max) {
-                max = data[i];
-            }
-            if (data[i] < min) {
-                min = data[i];
-            }
-        }
-        average /= data.length;
-        double sumOfSquares = 0.0;
-        for (int i = 0; i < data.length; i++) {
-            double diff = average - data[i];
-            sumOfSquares += diff * diff;
-        }
-        double variance = sumOfSquares / (data.length - 1);
-        double stddev = Math.sqrt(variance);
-        return new StatResult(average, min, max, stddev, data.length);
-    }
-
-    /**
-     * Calculate statistics properties likes average, min, max, and stddev for the given array
-     * while rejecting outlier +/- median * rejectionThreshold.
-     * rejectionThreshold should be bigger than 0.0 and be lowerthan 1.0
-     */
-    public static StatResult getStatWithOutlierRejection(double[] data, double rejectionThreshold) {
-        double[] dataCopied = Arrays.copyOf(data, data.length);
-        Arrays.sort(dataCopied);
-        int medianIndex = dataCopied.length / 2;
-        double median;
-        if (dataCopied.length % 2 == 1) {
-            median = dataCopied[medianIndex];
-        } else {
-            median = (dataCopied[medianIndex - 1] + dataCopied[medianIndex]) / 2.0;
-        }
-        double thresholdMin = median * (1.0 - rejectionThreshold);
-        double thresholdMax = median * (1.0 + rejectionThreshold);
-
-        double[] validData = new double[data.length];
-        int index = 0;
-        for (int i = 0; i < data.length; i++) {
-            if ((data[i] > thresholdMin) && (data[i] < thresholdMax)) {
-                validData[index] = data[i];
-                index++;
-            }
-            // TODO report rejected data
-        }
-        return getStat(Arrays.copyOf(validData, index));
-    }
-
-    /**
-     * return the average value of the passed array
-     */
-    public static double getAverage(double[] data) {
-        double sum = data[0];
-        for (int i = 1; i < data.length; i++) {
-            sum += data[i];
-        }
-        return sum / data.length;
-    }
-
-    /**
-     * return the minimum value of the passed array
-     */
-    public static double getMin(double[] data) {
-        double min = data[0];
-        for (int i = 1; i < data.length; i++) {
-            if (data[i] < min) {
-                min = data[i];
-            }
-        }
-        return min;
-    }
-
-    /**
-     * return the maximum value of the passed array
-     */
-    public static double getMax(double[] data) {
-        double max = data[0];
-        for (int i = 1; i < data.length; i++) {
-            if (data[i] > max) {
-                max = data[i];
-            }
-        }
-        return max;
-    }
-
-    /**
-     * Calculate rate per sec for given change happened during given timeInMSec.
-     * timeInSec with 0 value will be changed to small value to prevent divide by zero.
-     * @param change total change of quality for the given duration timeInMSec.
-     * @param timeInMSec
-     */
-    public static double calcRatePerSec(double change, double timeInMSec) {
-        if (timeInMSec == 0) {
-            return change * 1000.0 / 0.001; // do not allow zero
-        } else {
-            return change * 1000.0 / timeInMSec;
-        }
-    }
-
-    /**
-     * array version of calcRatePerSecArray
-     */
-    public static double[] calcRatePerSecArray(double change, double[] timeInMSec) {
-        double[] result = new double[timeInMSec.length];
-        change *= 1000.0;
-        for (int i = 0; i < timeInMSec.length; i++) {
-            if (timeInMSec[i] == 0) {
-                result[i] = change / 0.001;
-            } else {
-                result[i] = change / timeInMSec[i];
-            }
-        }
-        return result;
-    }
-
-    /**
-     * Get the value of the 95th percentile using nearest rank algorithm.
-     */
-    public static double get95PercentileValue(double[] values) {
-        Arrays.sort(values);
-        // zero-based array index
-        int index = (int) Math.round(values.length * 0.95 + .5) - 1;
-        return values[index];
-    }
-
-}
diff --git a/common/util/src/com/android/compatibility/common/util/StreamUtil.java b/common/util/src/com/android/compatibility/common/util/StreamUtil.java
deleted file mode 100644
index 1909c21..0000000
--- a/common/util/src/com/android/compatibility/common/util/StreamUtil.java
+++ /dev/null
@@ -1,72 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-import com.google.common.io.Closeables;
-
-import java.io.ByteArrayOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.io.Reader;
-import java.nio.charset.StandardCharsets;
-
-
-public class StreamUtil {
-
-    // 16K buffer size
-    private static final int BUFFER_SIZE = 16 * 1024;
-    /**
-     * Copies contents of origStream to destStream.
-     * <p/>
-     * Recommended to provide a buffered stream for input and output
-     *
-     * @param inStream the {@link InputStream}
-     * @param outStream the {@link OutputStream}
-     * @throws IOException
-     */
-    public static void copyStreams(InputStream inStream, OutputStream outStream)
-            throws IOException {
-        byte[] buf = new byte[BUFFER_SIZE];
-        int size = -1;
-        while ((size = inStream.read(buf)) != -1) {
-            outStream.write(buf, 0, size);
-        }
-    }
-
-    /**
-     * Reads {@code inputStream} converting it into a string. Does NOT close it.
-     *
-     * @throws IOException
-     */
-    public static String readInputStream(InputStream inputStream) throws IOException {
-        ByteArrayOutputStream result = new ByteArrayOutputStream();
-        byte[] buffer = new byte[1024];
-        int length;
-        while ((length = inputStream.read(buffer)) != -1) {
-            result.write(buffer, 0, length);
-        }
-        return result.toString(StandardCharsets.UTF_8.name());
-    }
-
-    public static void drainAndClose(Reader reader) {
-        try {
-            while (reader.read() >= 0) {}
-        } catch (IOException ignored) {}
-        Closeables.closeQuietly(reader);
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/TestResult.java b/common/util/src/com/android/compatibility/common/util/TestResult.java
deleted file mode 100644
index d2a9ca9..0000000
--- a/common/util/src/com/android/compatibility/common/util/TestResult.java
+++ /dev/null
@@ -1,302 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-import java.util.List;
-
-/**
- * Represents a single test result.
- */
-public class TestResult implements ITestResult {
-
-    private final ICaseResult mParent;
-    private final String mTestName;
-    private TestStatus mResult;
-    private String mMessage;
-    private String mStackTrace;
-    private ReportLog mReport;
-    private String mBugReport;
-    private String mLog;
-    private String mScreenshot;
-    private boolean mIsRetry;
-    private boolean mSkipped;
-    private List<TestResultHistory> mTestResultHistories;
-
-    /**
-     * Create a {@link TestResult} for the given test name.
-     */
-    public TestResult(ICaseResult parent, String name) {
-        mParent = parent;
-        mTestName = name;
-        reset();
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getName() {
-        return mTestName;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getFullName() {
-        return String.format("%s#%s", mParent.getName(), getName());
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public TestStatus getResultStatus() {
-        return mResult;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setResultStatus(TestStatus status) {
-        mResult = status;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getMessage() {
-        return mMessage;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setMessage(String message) {
-        mMessage = message;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getStackTrace() {
-        return mStackTrace;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setStackTrace(String stackTrace) {
-        mStackTrace = sanitizeStackTrace(stackTrace);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public ReportLog getReportLog() {
-        return mReport;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setReportLog(ReportLog report) {
-        mReport = report;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getBugReport() {
-        return mBugReport;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setBugReport(String path) {
-        mBugReport = path;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getLog() {
-        return mLog;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setLog(String path) {
-        mLog = path;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public String getScreenshot() {
-        return mScreenshot;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setScreenshot(String path) {
-        mScreenshot = path;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void failed(String trace) {
-        mSkipped = false;
-        setResultStatus(TestStatus.FAIL);
-        int index = trace.indexOf('\n');
-        if (index < 0) {
-            // Trace is a single line, just set the message to be the same as the stacktrace.
-            setMessage(trace);
-        } else {
-            setMessage(trace.substring(0, index));
-        }
-        setStackTrace(trace);
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void passed(ReportLog report) {
-        mSkipped = false;
-        if (getResultStatus() != TestStatus.FAIL) {
-            setResultStatus(TestStatus.PASS);
-            if (report != null) {
-                setReportLog(report);
-            }
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void skipped() {
-        if (getResultStatus() == null) {
-            mSkipped = true;
-            setResultStatus(TestStatus.PASS);
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isSkipped() {
-        return mSkipped;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void reset() {
-        mResult = null;
-        mMessage = null;
-        mStackTrace = null;
-        mReport = null;
-        mBugReport = null;
-        mLog = null;
-        mScreenshot = null;
-        mIsRetry = false;
-        mSkipped = false;
-        mTestResultHistories = null;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setRetry(boolean isRetry) {
-        mIsRetry = isRetry;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public boolean isRetry() {
-        return mIsRetry;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void removeResult() {
-        setResultStatus(TestStatus.FAIL);
-        setStackTrace("");
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public int compareTo(ITestResult another) {
-        return getName().compareTo(another.getName());
-    }
-
-    /**
-     * Strip out any invalid XML characters that might cause the report to be unviewable.
-     * http://www.w3.org/TR/REC-xml/#dt-character
-     */
-    static String sanitizeStackTrace(String trace) {
-        if (trace != null) {
-            return trace.replaceAll("[^\\u0009\\u000A\\u000D\\u0020-\\uD7FF\\uE000-\\uFFFD]", "");
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public List<TestResultHistory> getTestResultHistories() {
-        return mTestResultHistories;
-    }
-
-    /**
-     * {@inheritDoc}
-     */
-    @Override
-    public void setTestResultHistories(List<TestResultHistory> resultHistories) {
-        mTestResultHistories = resultHistories;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/TestResultHistory.java b/common/util/src/com/android/compatibility/common/util/TestResultHistory.java
deleted file mode 100644
index 73096cb..0000000
--- a/common/util/src/com/android/compatibility/common/util/TestResultHistory.java
+++ /dev/null
@@ -1,185 +0,0 @@
-/*
- * Copyright (C) 2019 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.compatibility.common.util;
-
-import org.xmlpull.v1.XmlSerializer;
-
-import java.io.IOException;
-import java.io.Serializable;
-import java.util.Objects;
-import java.util.Set;
-
-/**
- * Utility class to add test case result history to the report. This class records per-case history
- * for CTS Verifier. If this field is used for large test suites like CTS, it may cause performance
- * issues in APFE. Thus please do not use this class in other test suites.
- */
-public class TestResultHistory implements Serializable {
-
-    private static final long serialVersionUID = 10L;
-
-    private static final String ENCODING = "UTF-8";
-    private static final String TYPE = "org.kxml2.io.KXmlParser,org.kxml2.io.KXmlSerializer";
-
-    // XML constants
-    private static final String SUB_TEST_ATTR = "subtest";
-    private static final String RUN_HISTORY_TAG = "RunHistory";
-    private static final String RUN_TAG = "Run";
-    private static final String START_TIME_ATTR = "start";
-    private static final String END_TIME_ATTR = "end";
-    private static final String IS_AUTOMATED_ATTR = "isAutomated";
-
-    private final String mTestName;
-    private final Set<ExecutionRecord> mExecutionRecords;
-
-    /**
-     * Constructor of test result history.
-     *
-     * @param testName a string of test name.
-     * @param executionRecords a Set of ExecutionRecords.
-     */
-    public TestResultHistory(String testName, Set<ExecutionRecord> executionRecords) {
-        this.mTestName = testName;
-        this.mExecutionRecords = executionRecords;
-    }
-
-    /** Get test name */
-    public String getTestName() {
-        return mTestName;
-    }
-
-    /** Get a set of ExecutionRecords. */
-    public Set<ExecutionRecord> getExecutionRecords() {
-        return mExecutionRecords;
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        TestResultHistory that = (TestResultHistory) o;
-        return Objects.equals(mTestName, that.mTestName)
-                && Objects.equals(mExecutionRecords, that.mExecutionRecords);
-    }
-
-    /** {@inheritDoc} */
-    @Override
-    public int hashCode() {
-        return Objects.hash(mTestName, mExecutionRecords);
-    }
-
-    /**
-     * Serializes a given {@link TestResultHistory} to XML.
-     *
-     * @param serializer given serializer.
-     * @param resultHistory test result history with test name and execution record.
-     * @param testName top-level test name.
-     * @throws IOException
-     */
-    public static void serialize(
-            XmlSerializer serializer, TestResultHistory resultHistory, String testName)
-            throws IOException {
-        if (resultHistory == null) {
-            throw new IllegalArgumentException("Test result history was null");
-        }
-
-        serializer.startTag(null, RUN_HISTORY_TAG);
-        // Only show sub-test names in test attribute in run history node.
-        String name = getSubTestName(testName, resultHistory.getTestName());
-        if (!name.isEmpty() && !name.equalsIgnoreCase(testName)) {
-            serializer.attribute(null, SUB_TEST_ATTR, name);
-        }
-
-        for (ExecutionRecord execRecord : resultHistory.getExecutionRecords()) {
-            serializer.startTag(null, RUN_TAG);
-            serializer.attribute(null, START_TIME_ATTR, String.valueOf(execRecord.getStartTime()));
-            serializer.attribute(null, END_TIME_ATTR, String.valueOf(execRecord.getEndTime()));
-            serializer.attribute(
-                    null, IS_AUTOMATED_ATTR, String.valueOf(execRecord.getIsAutomated()));
-            serializer.endTag(null, RUN_TAG);
-        }
-        serializer.endTag(null, RUN_HISTORY_TAG);
-    }
-
-    /**
-     * Get subtest name by replacing top-level test name.
-     *
-     * @param testName top-level test name.
-     * @param fullTestName test name with the combination of top-level and subtest name.
-     * @return subtest name without top-level test name
-     */
-    protected static String getSubTestName(String testName, String fullTestName) {
-        // Handle test name with brackets, like [folded] as the suffix for foldable test plan.
-        testName = testName.replace("[", "\\[").replace("]", "\\]");
-        String subTestName = fullTestName.replaceFirst(testName + ":", "");
-        return subTestName;
-    }
-
-    /** Execution Record about start time, end time and isAutomated */
-    public static class ExecutionRecord implements Serializable {
-
-        private static final long serialVersionUID = 0L;
-        // Start time of test case.
-        private final long startTime;
-        // End time of test case.
-        private final long endTime;
-        // Whether test case was executed through automation.
-        private final boolean isAutomated;
-
-        public ExecutionRecord(long startTime, long endTime, boolean isAutomated) {
-            this.startTime = startTime;
-            this.endTime = endTime;
-            this.isAutomated = isAutomated;
-        }
-
-        public long getStartTime() {
-            return startTime;
-        }
-
-        public long getEndTime() {
-            return endTime;
-        }
-
-        public boolean getIsAutomated() {
-            return isAutomated;
-        }
-
-        @Override
-        public boolean equals(Object o) {
-            if (this == o) {
-                return true;
-            }
-            if (o == null || getClass() != o.getClass()) {
-                return false;
-            }
-            ExecutionRecord that = (ExecutionRecord) o;
-            return startTime == that.startTime
-                    && endTime == that.endTime
-                    && isAutomated == that.isAutomated;
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(startTime, endTime, isAutomated);
-        }
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/TestStatus.java b/common/util/src/com/android/compatibility/common/util/TestStatus.java
deleted file mode 100644
index 5a9b170..0000000
--- a/common/util/src/com/android/compatibility/common/util/TestStatus.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.common.util;
-
-/**
- * An enum of possible test statuses.
- */
-public enum TestStatus {
-    PASS("pass"),
-    FAIL("fail");
-
-    private final String mValue;
-
-    private TestStatus(String storedValue) {
-        mValue = storedValue;
-    }
-
-    /**
-     * Get the String representation of this test status that should be stored in
-     * xml
-     */
-    public String getValue() {
-       return mValue;
-    }
-
-    /**
-     * Find the {@link TestStatus} corresponding to given string value
-     * <p/>
-     * Performs a case insensitive search
-     *
-     * @param value
-     * @return the {@link TestStatus} or <code>null</code> if it could not be found
-     */
-    static TestStatus getStatus(String value) {
-        for (TestStatus status : TestStatus.values()) {
-            if (value.compareToIgnoreCase(status.getValue()) == 0) {
-                return status;
-            }
-        }
-        return null;
-    }
-}
diff --git a/common/util/src/com/android/compatibility/common/util/VendorInterfaceTest.java b/common/util/src/com/android/compatibility/common/util/VendorInterfaceTest.java
deleted file mode 100644
index 5bcaf0c..0000000
--- a/common/util/src/com/android/compatibility/common/util/VendorInterfaceTest.java
+++ /dev/null
@@ -1,35 +0,0 @@
-/*
- * Copyright (C) 2017 The Android Open Source Project
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
- *
- *      http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing, software
- * distributed under the License is distributed on an "AS IS" BASIS,
- * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
- * See the License for the specific language governing permissions and
- * limitations under the License.
- */
-
-package com.android.compatibility.common.util;
-
-import java.lang.annotation.ElementType;
-import java.lang.annotation.Retention;
-import java.lang.annotation.RetentionPolicy;
-import java.lang.annotation.Target;
-
-/**
- * Annotation marking a test case as part of the cts-vendor-interface plan for VTS's CTS on
- * AOSP requirement.
- * <p>
- * Test classes and test cases marked with this annotation will be included in the
- * cts-vendor-interface plan
- * by default.
- */
-@Retention(RetentionPolicy.RUNTIME)
-@Target({ElementType.METHOD, ElementType.TYPE})
-public @interface VendorInterfaceTest {
-}
diff --git a/common/util/src/com/android/compatibility/common/util/VersionCodes.java b/common/util/src/com/android/compatibility/common/util/VersionCodes.java
deleted file mode 100644
index 224b6c8..0000000
--- a/common/util/src/com/android/compatibility/common/util/VersionCodes.java
+++ /dev/null
@@ -1,52 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-public class VersionCodes {
-    public static final int CUR_DEVELOPMENT = 10000;
-    public static final int BASE = 1;
-    public static final int BASE_1_1 = 2;
-    public static final int CUPCAKE = 3;
-    public static final int DONUT = 4;
-    public static final int ECLAIR = 5;
-    public static final int ECLAIR_0_1 = 6;
-    public static final int ECLAIR_MR1 = 7;
-    public static final int FROYO = 8;
-    public static final int GINGERBREAD = 9;
-    public static final int GINGERBREAD_MR1 = 10;
-    public static final int HONEYCOMB = 11;
-    public static final int HONEYCOMB_MR1 = 12;
-    public static final int HONEYCOMB_MR2 = 13;
-    public static final int ICE_CREAM_SANDWICH = 14;
-    public static final int ICE_CREAM_SANDWICH_MR1 = 15;
-    public static final int JELLY_BEAN = 16;
-    public static final int JELLY_BEAN_MR1 = 17;
-    public static final int JELLY_BEAN_MR2 = 18;
-    public static final int KITKAT = 19;
-    public static final int KITKAT_WATCH = 20;
-    public static final int L = 21;
-    public static final int LOLLIPOP = 21;
-    public static final int LOLLIPOP_MR1 = 22;
-    public static final int M = 23;
-    public static final int N = 24;
-    public static final int N_MR1 = 25;
-    public static final int O = 26;
-    public static final int O_MR1 = 27;
-    public static final int P = 28;
-    public static final int Q = 29;
-    public static final int R = 30;
-    public static final int S = CUR_DEVELOPMENT;
-}
diff --git a/common/util/src/com/android/compatibility/common/util/ZipUtil.java b/common/util/src/com/android/compatibility/common/util/ZipUtil.java
deleted file mode 100644
index b44fd46..0000000
--- a/common/util/src/com/android/compatibility/common/util/ZipUtil.java
+++ /dev/null
@@ -1,129 +0,0 @@
-/*
- * 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.compatibility.common.util;
-
-import java.io.BufferedInputStream;
-import java.io.BufferedOutputStream;
-import java.io.File;
-import java.io.FileInputStream;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.OutputStream;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-
-public class ZipUtil {
-
-    /**
-     * Utility method to create a zip file containing the given directory and
-     * all its contents.
-     *
-     * @param dir the directory to zip
-     * @param zipFile the zip file to create - it should not already exist
-     * @throws IOException if failed to create zip file
-     */
-    public static void createZip(File dir, File zipFile) throws IOException {
-        ZipOutputStream out = null;
-        try {
-            FileOutputStream fileStream = new FileOutputStream(zipFile);
-            out = new ZipOutputStream(new BufferedOutputStream(fileStream));
-            addToZip(out, dir, new LinkedList<String>());
-        } catch (IOException e) {
-            zipFile.delete();
-            throw e;
-        } catch (RuntimeException e) {
-            zipFile.delete();
-            throw e;
-        } finally {
-            out.close();
-        }
-    }
-
-    /**
-     * Recursively adds given file and its contents to ZipOutputStream
-     *
-     * @param out the {@link ZipOutputStream}
-     * @param file the {@link File} to add to the stream
-     * @param relativePathSegs the relative path of file, including separators
-     * @throws IOException if failed to add file to zip
-     */
-    public static void addToZip(ZipOutputStream out, File file, List<String> relativePathSegs)
-            throws IOException {
-        relativePathSegs.add(file.getName());
-        if (file.isDirectory()) {
-            // note: it appears even on windows, ZipEntry expects '/' as a path separator
-            relativePathSegs.add("/");
-        }
-        ZipEntry zipEntry = new ZipEntry(buildPath(relativePathSegs));
-        out.putNextEntry(zipEntry);
-        if (file.isFile()) {
-            writeToStream(file, out);
-        }
-        out.closeEntry();
-        if (file.isDirectory()) {
-            // recursively add contents
-            File[] subFiles = file.listFiles();
-            if (subFiles == null) {
-                throw new IOException(String.format("Could not read directory %s",
-                        file.getAbsolutePath()));
-            }
-            for (File subFile : subFiles) {
-                addToZip(out, subFile, relativePathSegs);
-            }
-            // remove the path separator
-            relativePathSegs.remove(relativePathSegs.size()-1);
-        }
-        // remove the last segment, added at beginning of method
-        relativePathSegs.remove(relativePathSegs.size()-1);
-    }
-
-    /**
-     * Builds a file system path from a stack of relative path segments
-     *
-     * @param relativePathSegs the list of relative paths
-     * @return a {@link String} containing all relativePathSegs
-     */
-    private static String buildPath(List<String> relativePathSegs) {
-        StringBuilder pathBuilder = new StringBuilder();
-        for (String segment : relativePathSegs) {
-            pathBuilder.append(segment);
-        }
-        return pathBuilder.toString();
-    }
-
-    /**
-     * Helper method to write input file contents to output stream.
-     *
-     * @param file the input {@link File}
-     * @param out the {@link OutputStream}
-     *
-     * @throws IOException
-     */
-    private static void writeToStream(File file, OutputStream out) throws IOException {
-        InputStream inputStream = null;
-        try {
-            inputStream = new BufferedInputStream(new FileInputStream(file));
-            StreamUtil.copyStreams(inputStream, out);
-        } finally {
-            inputStream.close();
-        }
-    }
-
-}
diff --git a/common/util/tests/Android.bp b/common/util/tests/Android.bp
index 2943a79..da4cfed 100644
--- a/common/util/tests/Android.bp
+++ b/common/util/tests/Android.bp
@@ -14,9 +14,14 @@
 
 java_test_host {
     name: "compatibility-common-util-tests",
+    // Restrict visibility to only those targets that need to access it.
+    visibility: ["//visibility:private"],
     defaults: ["cts_error_prone_rules"],
 
     srcs: ["src/**/*.java"],
+    test_options: {
+        unit_test: true,
+    },
 
     libs: [
         "junit",
diff --git a/test_defs.sh b/test_defs.sh
deleted file mode 100644
index 1d9cf57..0000000
--- a/test_defs.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/bash
-
-# Copyright (C) 2015 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.
-
-# Common tools for running unit tests of the compatibility libs
-
-JAR_DIR=${ANDROID_HOST_OUT}/framework
-TF_CONSOLE=com.android.tradefed.command.Console
-
-COMMON_JARS="
-    ddmlib-prebuilt\
-    tradefed"
-
-checkFile() {
-    if [ ! -f "$1" ]; then
-        echo "Unable to locate $1"
-        exit
-    fi;
-}
-
-build_jar_path() {
-    JAR_PATH=
-    for JAR in ${2} ${COMMON_JARS}; do
-        checkFile ${1}/${JAR}.jar
-        JAR_PATH=${JAR_PATH}:${1}/${JAR}.jar
-    done
-}
-
-run_tests() {
-    build_jar_path "${JAR_DIR}" "${2}"
-    for CLASS in ${1}; do
-        java $RDBG_FLAG -cp ${JAR_PATH} ${TF_CONSOLE} run singleCommand host -n --class ${CLASS} ${3}
-    done
-}
diff --git a/tools/cts-test-metrics/CtsCameraTestCases.reportlog.json b/tools/cts-test-metrics/CtsCameraTestCases.reportlog.json
deleted file mode 100644
index 81a9ef1..0000000
--- a/tools/cts-test-metrics/CtsCameraTestCases.reportlog.json
+++ /dev/null
@@ -1 +0,0 @@
-{"test_reprocessing_throughput":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[237.0,102.0,99.0,105.0,124.0,92.0],"camera_reprocessing_average_latency":126.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[206.0,91.0,92.0,89.0,119.0,84.0],"camera_reprocessing_average_latency":113.5},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[216.0,84.0,80.0,83.0,93.0,76.0],"camera_reprocessing_average_latency":105.33333333333333},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[212.0,83.0,71.0,80.0,93.0,74.0],"camera_reprocessing_average_latency":102.16666666666667},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[228.0,105.0,85.0,86.0,116.0,83.0],"camera_reprocessing_average_latency":117.16666666666667},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[195.0,89.0,94.0,94.0,116.0,86.0],"camera_reprocessing_average_latency":112.33333333333333},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency","latency":[150.0,83.0,75.0,75.0,102.0,76.0],"camera_reprocessing_average_latency":93.5},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency","latency":[198.0,85.0,78.0,71.0,95.0,77.0],"camera_reprocessing_average_latency":100.66666666666667}],"test_camera_launch_average":[{"camera_launch_average_time_for_all_cameras":326.1},{"camera_launch_average_time_for_all_cameras":321.8}],"test_reprocessing_latency":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[303.0,254.0,259.0,196.0,201.0,195.0],"camera_reprocessing_shot_to_shot_average_latency":234.66666666666666},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[248.0,172.0,209.0,188.0,201.0,204.0],"camera_reprocessing_shot_to_shot_average_latency":203.66666666666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[190.0,238.0,220.0,213.0,144.0,154.0],"camera_reprocessing_shot_to_shot_average_latency":193.16666666666666},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[237.0,166.0,153.0,148.0,162.0,140.0],"camera_reprocessing_shot_to_shot_average_latency":167.66666666666666},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[302.0,262.0,256.0,197.0,200.0,201.0],"camera_reprocessing_shot_to_shot_average_latency":236.33333333333334},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[251.0,166.0,199.0,199.0,213.0,201.0],"camera_reprocessing_shot_to_shot_average_latency":204.83333333333334},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency","latency":[199.0,153.0,159.0,164.0,152.0,166.0],"camera_reprocessing_shot_to_shot_average_latency":165.5},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency","latency":[210.0,143.0,161.0,162.0,158.0,156.0],"camera_reprocessing_shot_to_shot_average_latency":165.0}],"test_high_quality_reprocessing_latency":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[479.0,398.0,351.0,487.0,461.0,395.0],"camera_reprocessing_shot_to_shot_average_latency":428.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[355.0,324.0,335.0,334.0,336.0,347.0],"camera_reprocessing_shot_to_shot_average_latency":338.5},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[235.0,220.0,223.0,228.0,222.0,227.0],"camera_reprocessing_shot_to_shot_average_latency":225.83333333333334},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[256.0,186.0,230.0,215.0,226.0,242.0],"camera_reprocessing_shot_to_shot_average_latency":225.83333333333334},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[415.0,327.0,336.0,340.0,323.0,332.0],"camera_reprocessing_shot_to_shot_average_latency":345.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[381.0,302.0,331.0,332.0,336.0,333.0],"camera_reprocessing_shot_to_shot_average_latency":335.8333333333333},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[231.0,222.0,223.0,227.0,227.0,223.0],"camera_reprocessing_shot_to_shot_average_latency":225.5},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"shot to shot latency for High Quality noise reduction and edge modes","latency":[275.0,178.0,222.0,224.0,249.0,204.0],"camera_reprocessing_shot_to_shot_average_latency":225.33333333333334}],"test_single_capture":[{"camera_id":"0","camera_capture_latency":[476.0,639.0,654.0,639.0,665.0],"camera_capture_result_latency":[260.0,465.0,490.0,471.0,474.0]},{"camera_id":"1","camera_capture_latency":[461.0,639.0,627.0,637.0,631.0],"camera_capture_result_latency":[341.0,530.0,533.0,533.0,535.0]},{"camera_id":"0","camera_capture_latency":[465.0,643.0,660.0,649.0,642.0],"camera_capture_result_latency":[251.0,467.0,491.0,474.0,475.0]},{"camera_id":"1","camera_capture_latency":[457.0,541.0,533.0,546.0,534.0],"camera_capture_result_latency":[338.0,475.0,467.0,477.0,471.0]}],"test_single_capture_average":[{"camera_capture_result_average_latency_for_all_cameras":463.2},{"camera_capture_result_average_latency_for_all_cameras":438.6}],"test_reprocessing_capture_stall":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[66.929849,66.927076,66.827072],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":66.89466566666665},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[66.838494,66.862969,67.054342],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":66.91860166666667},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[75.091,75.156,75.092],"capture_average_frame_duration":[75.08460800000003,75.08460800000003,75.08460800000003],"camera_reprocessing_average_max_capture_timestamp_gaps":75.113},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[75.096,75.09,75.091],"capture_average_frame_duration":[75.08460800000003,75.08460800000003,75.08460800000003],"camera_reprocessing_average_max_capture_timestamp_gaps":75.09233333333333},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[66.810656,67.101617,66.811857],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":66.90804333333334},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[133.322575,66.919741,66.95088],"capture_average_frame_duration":[66.742792,66.742792,66.742792],"camera_reprocessing_average_max_capture_timestamp_gaps":89.06439866666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","max_capture_timestamp_gaps":[80.088,80.091,80.089],"capture_average_frame_duration":[80.08507200000001,80.08507200000001,80.08507200000001],"camera_reprocessing_average_max_capture_timestamp_gaps":80.08933333333333},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","max_capture_timestamp_gaps":[80.092,80.091,80.091],"capture_average_frame_duration":[80.08507200000001,80.08507200000001,80.08507200000001],"camera_reprocessing_average_max_capture_timestamp_gaps":80.09133333333334}],"test_camera_launch":[{"camera_id":"0","camera_open_time":[116.0,85.0,88.0,83.0,86.0],"camera_configure_stream_time":[20.0,11.0,11.0,10.0,10.0],"camera_start_preview_time":[312.0,224.0,223.0,219.0,230.0],"camera_camera_stop_preview":[278.0,255.0,265.0,268.0,267.0],"camera_camera_close_time":[107.0,124.0,103.0,108.0,127.0],"camera_launch_time":[448.0,320.0,322.0,312.0,326.0]},{"camera_id":"1","camera_open_time":[72.0,67.0,67.0,67.0,65.0],"camera_configure_stream_time":[12.0,10.0,11.0,10.0,11.0],"camera_start_preview_time":[227.0,231.0,224.0,226.0,233.0],"camera_camera_stop_preview":[167.0,162.0,171.0,170.0,168.0],"camera_camera_close_time":[96.0,87.0,91.0,85.0,90.0],"camera_launch_time":[311.0,308.0,302.0,303.0,309.0]},{"camera_id":"0","camera_open_time":[96.0,85.0,89.0,89.0,84.0],"camera_configure_stream_time":[14.0,10.0,10.0,10.0,10.0],"camera_start_preview_time":[262.0,220.0,224.0,221.0,226.0],"camera_camera_stop_preview":[259.0,251.0,271.0,257.0,265.0],"camera_camera_close_time":[117.0,153.0,120.0,122.0,118.0],"camera_launch_time":[372.0,315.0,323.0,320.0,320.0]},{"camera_id":"1","camera_open_time":[71.0,67.0,68.0,70.0,69.0],"camera_configure_stream_time":[11.0,10.0,10.0,10.0,10.0],"camera_start_preview_time":[228.0,235.0,233.0,237.0,239.0],"camera_camera_stop_preview":[167.0,169.0,169.0,162.0,173.0],"camera_camera_close_time":[95.0,89.0,93.0,94.0,103.0],"camera_launch_time":[310.0,312.0,311.0,317.0,318.0]}],"test_high_quality_reprocessing_throughput":[{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[272.0,246.0,211.0,210.0,235.0,202.0],"camera_reprocessing_average_latency":229.33333333333334},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[304.0,210.0,206.0,209.0,226.0,229.0],"camera_reprocessing_average_latency":230.66666666666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[246.0,123.0,116.0,114.0,131.0,109.0],"camera_reprocessing_average_latency":139.83333333333334},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[211.0,112.0,116.0,112.0,123.0,110.0],"camera_reprocessing_average_latency":130.66666666666666},{"camera_id":"0","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[349.0,215.0,214.0,214.0,238.0,213.0],"camera_reprocessing_average_latency":240.5},{"camera_id":"0","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[326.0,206.0,204.0,206.0,225.0,232.0],"camera_reprocessing_average_latency":233.16666666666666},{"camera_id":"1","format":35,"reprocess_type":"YUV reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[238.0,119.0,130.0,116.0,130.0,114.0],"camera_reprocessing_average_latency":141.16666666666666},{"camera_id":"1","format":34,"reprocess_type":"opaque reprocessing","capture_message":"capture latency for High Quality noise reduction and edge modes","latency":[249.0,117.0,122.0,113.0,129.0,119.0],"camera_reprocessing_average_latency":141.5}]}
\ No newline at end of file
diff --git a/tools/cts-test-metrics/CtsUiHostTestCases.reportlog.json b/tools/cts-test-metrics/CtsUiHostTestCases.reportlog.json
deleted file mode 100644
index 6355fe3..0000000
--- a/tools/cts-test-metrics/CtsUiHostTestCases.reportlog.json
+++ /dev/null
@@ -1 +0,0 @@
-{"test_install_time":[{"install_time":[1950.0,1722.0,1762.0,1678.0,1738.0,1694.0,1787.0,1797.0,1799.0,1786.0],"install_time_average":1771.3},{"install_time":[1976.0,1986.0,1930.0,1729.0,1859.0,1875.0,1904.0,1805.0,1748.0,1875.0],"install_time_average":1868.7}]}
\ No newline at end of file
diff --git a/tools/cts-test-metrics/README b/tools/cts-test-metrics/README
deleted file mode 100644
index cb68f3a..0000000
--- a/tools/cts-test-metrics/README
+++ /dev/null
@@ -1,14 +0,0 @@
-The parse_test_metrics.py script can be used to parse test metrics json files. Run the following
-command to see a demo:
-python parse_test_metrics.py CtsCameraTestCases.reportlog.json
-
-To parse multiple files, list all files as arguments. Try the following:
-python parse_test_metrics.py CtsCameraTestCases.reportlog.json CtsUiHostTestCases.reportlog.json
-python parse_test_metrics.py *.json
-
-Test metrics json files can be found in $CTS_ROOT/repository/results/$RESULT_DIR/report-log-files/
-directory.
-
-The MetricsParser class defines functions to parse a json file. The _Parse function takes a filename
-as input, reads the json file and adds the json object to json_data. The _PrintJson function
-takes the filename and corresponding json_data and prints out the streams as key, value pairs.
diff --git a/tools/cts-test-metrics/parse_test_metrics.py b/tools/cts-test-metrics/parse_test_metrics.py
deleted file mode 100755
index 839e372..0000000
--- a/tools/cts-test-metrics/parse_test_metrics.py
+++ /dev/null
@@ -1,58 +0,0 @@
-#!/usr/bin/python
-# 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.
-#
-
-import argparse, json, sys
-
-class MetricsParser(object):
-  """Executor of this utility"""
-
-  def __init__(self):
-    self._parser = argparse.ArgumentParser('Parse CTS Test metrics jsons')
-    self._parser.add_argument('filenames', metavar='filenames', nargs='+',
-                              help='filenames of metrics jsons to be parsed')
-    self._metrics = []
-
-  def _ParseArgs(self):
-    self._args = self._parser.parse_args()
-
-  def _Parse(self, filename):
-    json_file = open(filename)
-    json_data = json.load(json_file)
-    self._metrics.append(json_data)
-    self._PrintJson(filename, json_data)
-
-  def _PrintJson(self, filename, json_data):
-    print "\nFilename: %s" % filename
-    stream_names = json_data.keys()
-    for stream_name in stream_names:
-      metrics_list = json_data.get(stream_name)
-      for metrics in metrics_list:
-        print "\nStream Name: %s" % stream_name
-        for key in metrics.keys():
-          print "Key: %s \t Value: %s" % (key, str(metrics.get(key)))
-
-  def Run(self):
-    self._ParseArgs()
-    try:
-      for filename in self._args.filenames:
-        self._Parse(filename)
-    except (IOError, ValueError) as e:
-      print >> sys.stderr, e
-      raise KeyboardInterrupt
-
-if __name__ == '__main__':
-  MetricsParser().Run()
-
diff --git a/tools/cts-tradefed/Android.bp b/tools/cts-tradefed/Android.bp
deleted file mode 100644
index 93c2062..0000000
--- a/tools/cts-tradefed/Android.bp
+++ /dev/null
@@ -1,36 +0,0 @@
-// Copyright (C) 2015 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.
-
-java_library_host {
-    name: "cts-tradefed-harness",
-
-    java_resource_dirs: ["res"],
-    libs: [
-        "tradefed",
-        "compatibility-host-util",
-    ],
-    static_libs: [
-        "compatibility-tradefed",
-    ],
-}
-
-tradefed_binary_host {
-    name: "cts-tradefed",
-    wrapper: "etc/cts-tradefed",
-    short_name: "CTS",
-    full_name: "Compatibility Test Suite",
-    version: "11_r2",
-    static_libs: ["cts-tradefed-harness"],
-    required: ["compatibility-host-util"],
-}
diff --git a/tools/cts-tradefed/DynamicConfig.xml b/tools/cts-tradefed/DynamicConfig.xml
deleted file mode 100644
index 60b0e98..0000000
--- a/tools/cts-tradefed/DynamicConfig.xml
+++ /dev/null
@@ -1,21 +0,0 @@
-<!-- Copyright (C) 2015 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.
--->
-
-<!--TODO(b/117957288): Remove dynamic config from suite-level.-->
-<dynamicConfig>
-    <entry key="media_files_url">
-         <value>https://dl.google.com/dl/android/cts/android-cts-media-1.4.zip</value>
-    </entry>
-</dynamicConfig>
diff --git a/tools/cts-tradefed/README b/tools/cts-tradefed/README
deleted file mode 100644
index 99d155a..0000000
--- a/tools/cts-tradefed/README
+++ /dev/null
@@ -1,83 +0,0 @@
-CTS Trade Federation
----------------------
-
-CTS Trade Federation, cts-tradefed for short, is the next
-generation test harness for CTS.
-
-cts-tradefed is built on top of the Android Trade Federation test harness.
-
-It works in a similar manner to the prior CTS harness, but supports some
-advanced features such as:
-
-  - modular, flexible extensible design. cts-tradefed can be extended to
-support running CTS in a continuous test environment.
-  - supports sharding a CTS test run across multiple devices in parallel
-  - automatically continue a CTS test run on another device if connection
-is lost
-
-Configuring cts-tradefed
-------------------------
-
-1. Ensure 'adb' is in your current PATH. adb can be found in the
-Android SDK available from http://developer.android.com
-
-Example:
-  PATH=$PATH:/home/myuser/android-sdk-linux_x86/platform-tools
-
-2. Follow the 'Setting up your device' steps documented in the
-CTS User Manual. The CTS User Manual can be downloaded at
-http://source.android.com/compatibility/downloads.html
-
-3. Connect the device to the host machine.
-
-4. Ensure device is visible via 'adb devices'
-
-Using cts-tradefed
--------------------
-
-To run a test plan on a single device:
-
-1. Make sure you have at least one device connected
-2. Launch the cts-tradefed console by running the 'cts-tradefed'. If you've
-downloaded and extracted the CTS zip, the script can be found at
-  android-cts/tools/cts-tradefed
-Or else if you are working from the Android source tree and have run make cts,
-the script can be found at
-  out/host/linux-x86/cts/android-cts/tools/cts-tradefed
-3. Type:
-'run cts' to run the default CTS plan
-
-Some other useful commands are
-
-To run a test module:
-'run cts --module <module_name>'
-
-To run a specific test:
-'run cts --module <module_name> --test <test_name>'
-
-To shard a plan test run on multiple devices
-'run cts --shard-count <number of shards>
-note: all connected devices must be running the same build
-
-For more options:
-'run cts --help'
-
-CTS Tradefed Development
-------------------------
-See http://source.android.com for instructions on obtaining the Android
-platform source code and setting up a build environment.
-
-The source for the CTS extensions for tradefed can be found at
-<android source root>/cts/tools/tradefed-host
-
-The source for the tradefed framework can be found on the 'tradefed' branch.
-
-Perform these steps to build and run cts-tradefed from the development
-environment:
-cd <path to android source root>
-make cts
-cts-tradefed
-
-More documentation and details on using and extending trade federation will
-be forthcoming in the near future.
-
diff --git a/tools/cts-tradefed/etc/cts-tradefed b/tools/cts-tradefed/etc/cts-tradefed
deleted file mode 100755
index ed62d05..0000000
--- a/tools/cts-tradefed/etc/cts-tradefed
+++ /dev/null
@@ -1,142 +0,0 @@
-#!/bin/bash
-
-# Copyright (C) 2015 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.
-
-# launcher script for cts-tradefed harness
-# can be used from an Android build environment, or a standalone cts zip
-
-checkFile() {
-    if [ ! -f "$1" ]; then
-        echo "Unable to locate $1"
-        exit
-    fi;
-}
-
-checkPath() {
-    if ! type -P $1 &> /dev/null; then
-        echo "Unable to find $1 in path."
-        exit
-    fi;
-}
-
-# readlink does not work on MacOS so rely on our own realpath
-realpath() {
-    [[ $1 = /* ]] && echo "$1" || echo "$PWD/${1#./}"
-}
-
-checkPath aapt
-checkPath adb
-checkPath java
-
-# check java version
-JAVA_VERSION=$(java -version 2>&1 | grep -m 1 'version [ "]\(1\.8\|9\|11\).*[ "]')
-if [ "${JAVA_VERSION}" == "" ]; then
-    echo "Wrong java version. 1.8, 9, or 11 is required."
-    exit
-fi
-
-# check debug flag and set up remote debugging
-if [ -n "${TF_DEBUG}" ]; then
-  if [ -z "${TF_DEBUG_PORT}" ]; then
-    TF_DEBUG_PORT=10088
-  fi
-  RDBG_FLAG=-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=${TF_DEBUG_PORT}
-fi
-
-JAVA_BINARY=${CTS_ROOT}/android-cts/jdk/bin/java
-
-if [ ! -f "${JAVA_BINARY}" ]; then
-    JAVA_BINARY=java
-fi
-
-# get OS
-HOST=`uname`
-if [ "$HOST" == "Linux" ]; then
-    OS="linux-x86"
-elif [ "$HOST" == "Darwin" ]; then
-    OS="darwin-x86"
-    # Bundled java is for linux so use host JDK on Darwin
-    JAVA_BINARY=java
-else
-    echo "Unrecognized OS"
-    exit
-fi
-
-# check if in Android build env
-if [ ! -z "${ANDROID_BUILD_TOP}" ]; then
-    if [ ! -z "${ANDROID_HOST_OUT}" ]; then
-      CTS_ROOT=${ANDROID_HOST_OUT}/cts
-    else
-      CTS_ROOT=${ANDROID_BUILD_TOP}/${OUT_DIR:-out}/host/${OS}/cts
-    fi
-    if [ ! -d ${CTS_ROOT} ]; then
-        echo "Could not find $CTS_ROOT in Android build environment. Try 'make cts'"
-        exit
-    fi;
-fi;
-
-if [ -z ${CTS_ROOT} ]; then
-    # assume we're in an extracted cts install
-    CTS_ROOT="$(dirname $(realpath $0))/../.."
-fi;
-
-JAR_DIR=${CTS_ROOT}/android-cts/tools
-JARS="tradefed
-  tradefed-test-framework
-  loganalysis
-  compatibility-host-util
-  compatibility-host-util-tests
-  cts-tradefed
-  cts-tradefed-tests
-  compatibility-common-util-tests
-  compatibility-tradefed-tests"
-
-for JAR in $JARS; do
-    checkFile ${JAR_DIR}/${JAR}.jar
-    JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
-done
-JAR_PATH=${JAR_PATH:1} # Strip off leading ':'
-
-OPTIONAL_JARS="
-  google-tradefed
-  google-tradefed-tests
-  google-tf-prod-tests"
-
-STANDALONE_JAR_DIR=${ANDROID_HOST_OUT}/framework
-for JAR in $OPTIONAL_JARS; do
-    if [ -f "${JAR_DIR}/${JAR}.jar" ]; then
-        JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
-    elif [ -f "${STANDALONE_JAR_DIR}/${JAR}.jar" ]; then
-        JAR_PATH=${JAR_PATH}:${STANDALONE_JAR_DIR}/${JAR}.jar
-    fi;
-done
-
-# load any shared libraries for host-side executables
-LIB_DIR=${CTS_ROOT}/android-cts/lib
-if [ "$HOST" == "Linux" ]; then
-    LD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${LD_LIBRARY_PATH}
-    export LD_LIBRARY_PATH
-elif [ "$HOST" == "Darwin" ]; then
-    DYLD_LIBRARY_PATH=${LIB_DIR}:${LIB_DIR}64:${DYLD_LIBRARY_PATH}
-    export DYLD_LIBRARY_PATH
-fi
-
-# include any host-side test jars
-for j in ${CTS_ROOT}/android-cts/testcases/*.jar; do
-    JAR_PATH=${JAR_PATH}:$j
-done
-
-${JAVA_BINARY} $RDBG_FLAG -Xmx6g -XX:+HeapDumpOnOutOfMemoryError -cp ${JAR_PATH} -DCTS_ROOT=${CTS_ROOT} com.android.compatibility.common.tradefed.command.CompatibilityConsole "$@"
-
diff --git a/tools/cts-tradefed/res/config/basic-reporters.xml b/tools/cts-tradefed/res/config/basic-reporters.xml
deleted file mode 100644
index 6fddf24..0000000
--- a/tools/cts-tradefed/res/config/basic-reporters.xml
+++ /dev/null
@@ -1,17 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Configuration with basic CTS reporters" >
-</configuration>
diff --git a/tools/cts-tradefed/res/config/collect-tests-only.xml b/tools/cts-tradefed/res/config/collect-tests-only.xml
deleted file mode 100644
index a3769a9..0000000
--- a/tools/cts-tradefed/res/config/collect-tests-only.xml
+++ /dev/null
@@ -1,35 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Runs CTS from a pre-existing CTS installation">
-
-    <include name="cts" />
-
-    <!-- This tells cts-tradefed and the server what the plan name is, reports that have this plan
-         name should not be accepted, as it doesn't actually run the tests it simply marks all of
-         them as passed.
-         Obviously no one would modify the report before uploading to falsify this
-         information, as that would be dishonest, and dishonesty kills kittens :'( -->
-    <option name="plan" value="collect-tests-only" />
-
-    <option name="skip-preconditions" value="true" />
-    <option name="skip-system-status-check" value="com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker" />
-    <option name="preparer-whitelist" value="com.android.tradefed.targetprep.suite.SuiteApkInstaller" />
-    <option name="preparer-whitelist" value="com.android.compatibility.common.tradefed.targetprep.ApkInstaller" />
-    <option name="preparer-whitelist" value="com.android.compatibility.common.tradefed.targetprep.FilePusher" />
-
-    <option name="compatibility:collect-tests-only" value="true" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/csi-known-failures.xml b/tools/cts-tradefed/res/config/csi-known-failures.xml
deleted file mode 100644
index bbb98b7..0000000
--- a/tools/cts-tradefed/res/config/csi-known-failures.xml
+++ /dev/null
@@ -1,115 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Known fialures on CSI">
-    <!-- Troublesome tests that often crash the system -->
-    <option name="compatibility:exclude-filter" value="CtsAppExitTestCases android.app.cts.ActivityManagerAppExitInfoTest#testCrash" />
-    <option name="compatibility:exclude-filter" value="CtsAppExitTestCases android.app.cts.ActivityManagerAppExitInfoTest#testNativeCrash" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testMediaEscalation28" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testMediaEscalation29" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testMediaEscalation" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerFgsBgStartTest#testFgsLocationPendingIntent" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.NotificationManagerTest#testNotificationManagerBubble_checkActivityFlagsDocumentLaunchMode" />
-    <option name="compatibility:exclude-filter" value="CtsDeviceIdleHostTestCases com.android.cts.deviceidle.DeviceIdleWhitelistTest#testRemovesPersistedAcrossReboots" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testProxyPacProxyTest" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testPackageInstallUserRestrictions" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestEmptyRoleThenDeniedAutomatically" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.metric.MetricActivationTests#testRestart" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.metric.MetricActivationTests#testMultipleActivations" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.UidAtomTests#testANROccurred" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.UidAtomTests#testAppCrashOccurred" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.SurfaceViewTests#testMovingWhiteSurfaceView" />
-
-    <!-- Exclude known failure of CtsMediaTestCases (mostly on some Pixel phones) -->
-    <!-- CSI doesn't seem to include ringtones. -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.RingtoneManagerTest" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.RingtoneTest" />
-
-    <!-- Following failures take about 10 min each, so exclude them to reduce test time. -->
-    <!-- CSI on Goldfish can pass the following tests in StreamingMediaPlayerTest. -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.StreamingMediaPlayerTest#testHTTP_H263_AMR_Video2" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.StreamingMediaPlayerTest#testHTTP_H264Base_AAC_Video2" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.StreamingMediaPlayerTest#testHTTP_MPEG4SP_AAC_Video2" />
-
-    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoCodecTest. -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoCodecTest#testParallelEncodingAndDecodingAVC" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoCodecTest#testParallelEncodingAndDecodingHEVC" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoCodecTest#testParallelEncodingAndDecodingVP8" />
-
-    <!-- Failures will crash the test harness, so exclude it here (even though only failed with VP9 decoder). -->
-    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoDecoderRotationTest. -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderRotationTest" />
-
-    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoDecoderPerfTest. -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther0Perf0320x0240" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther0Perf0720x0480" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther0Perf1280x0720" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf0320x0240" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf0720x0480" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf1280x0720" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testAvcOther1Perf1920x1080" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf0352x0288" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf0640x0360" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf0720x0480" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf1280x0720" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther0Perf1920x1080" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf0352x0288" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf0640x0360" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf0720x0480" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf1280x0720" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf1920x1080" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoDecoderPerfTest#testHevcOther1Perf3840x2160" />
-
-    <!-- CSI on Cuttlefish and Goldfish can pass the following tests in VideoEncoderTest. -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH263SurfMinMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfArbitraryH" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfArbitraryW" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfMaxMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfNearMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfNearMaxMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfNearMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogH265SurfQCIF" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfArbitraryH" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfArbitraryW" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMaxMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogMpeg4SurfNearMinMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8Surf480p" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfArbitraryH" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfArbitraryW" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfMaxMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfNearMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfNearMaxMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfNearMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP8SurfQCIF" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9Surf480p" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfArbitraryH" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfArbitraryW" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfMaxMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfNearMaxMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfNearMaxMin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfNearMinMax" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VideoEncoderTest#testGoogVP9SurfQCIF" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-automated.xml b/tools/cts-tradefed/res/config/cts-automated.xml
deleted file mode 100644
index 150f8b9..0000000
--- a/tools/cts-tradefed/res/config/cts-automated.xml
+++ /dev/null
@@ -1,32 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Runs CTS with common options set for an automated run on userdebug/eng builds">
-
-    <include name="cts" />
-
-    <option name="plan" value="cts" />
-
-    <option name="skip-preconditions" value="false" />
-    <option name="skip-system-status-check" value="com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker" />
-
-    <!-- Tell all AndroidJUnitTests to exclude certain annotations -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
-
-    <!-- Tell all HostTests to exclude certain annotations -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-camera.xml b/tools/cts-tradefed/res/config/cts-camera.xml
deleted file mode 100644
index 47377b4..0000000
--- a/tools/cts-tradefed/res/config/cts-camera.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<configuration description="Runs CTS-camera from a pre-existing CTS installation">
-
-    <include name="cts" />
-
-    <option name="plan" value="cts-camera" />
-
-    <!-- All camera CTS tests -->
-    <option name="compatibility:include-filter" value="CtsCameraTestCases" />
-
-    <!-- Other camera related CTS tests -->
-    <option name="compatibility:include-filter"
-        value="CtsAppTestCases android.app.cts.SystemFeaturesTest#testCameraFeatures"/>
-    <option name="compatibility:include-filter"
-        value="CtsPermissionTestCases android.permission.cts.CameraPermissionTest"/>
-    <option name="compatibility:include-filter"
-        value="CtsPermissionTestCases android.permission.cts.Camera2PermissionTest"/>
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-common.xml b/tools/cts-tradefed/res/config/cts-common.xml
deleted file mode 100644
index c1dffd2..0000000
--- a/tools/cts-tradefed/res/config/cts-common.xml
+++ /dev/null
@@ -1,62 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<configuration description="Common configuration for cts and cts-reference-aosp">
-
-    <include name="everything" />
-    <option name="compatibility:run-suite-tag" value="cts" />
-    <!-- Enable module parameterization to run instant_app modules in main CTS -->
-    <option name="compatibility:enable-parameterized-modules" value="true" />
-    <include name="cts-preconditions" />
-    <include name="cts-system-checkers" />
-    <include name="cts-known-failures" />
-
-    <option name="test-tag" value="cts" />
-
-    <option name="enable-root" value="false" />
-    <!-- retain 200MB of host log -->
-    <option name="max-log-size" value="200" />
-    <!--  retain 200MB of logcat -->
-    <option name="max-tmp-logcat-file" value="209715200" />
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value="settings put global package_verifier_enable 0" />
-        <option name="teardown-command" value="settings put global package_verifier_enable 1"/>
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PropertyCheck">
-        <option name="property-name" value="ro.build.type" />
-        <option name="expected-value" value="user"/> <!-- Device should have user build -->
-        <option name="throw-error" value="false"/> <!-- Only print warning if not user build -->
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PropertyCheck">
-        <option name="property-name" value="ro.product.locale" />
-        <option name="expected-value" value="en-US"/> <!-- Device locale should be US English -->
-        <option name="throw-error" value="false"/> <!-- Only print warning if not en-US -->
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PropertyCheck">
-        <option name="property-name" value="persist.sys.test_harness" />
-        <option name="expected-value" value="false"/> <!-- Device shouldn't be in test harness mode -->
-        <option name="throw-error" value="true"/>
-    </target_preparer>
-
-    <template-include name="reporters" default="basic-reporters" />
-
-    <!-- Include additional test metadata output. -->
-    <template-include name="metadata-reporters" default="empty" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-dev.xml b/tools/cts-tradefed/res/config/cts-dev.xml
deleted file mode 100644
index 11c1052..0000000
--- a/tools/cts-tradefed/res/config/cts-dev.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Runs CTS with common options set developer workflow: skips most checks">
-
-    <include name="cts" />
-
-    <option name="log-level" value="verbose" />
-    <option name="skip-preconditions" value="true" />
-    <option name="skip-device-info" value="true" />
-    <option name="result-reporter:compress-logs" value="false" />
-
-    <option name="plan" value="cts-dev" />
-    <option name="compatibility:skip-all-system-status-check" value="true" />
-    <option name="compatibility:primary-abi-only" value="true" />
-    <!-- Avoid module parameterization in cts-dev -->
-    <option name="compatibility:enable-parameterized-modules" value="false" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-device-files.xml b/tools/cts-tradefed/res/config/cts-device-files.xml
deleted file mode 100644
index 6acf7bb..0000000
--- a/tools/cts-tradefed/res/config/cts-device-files.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<configuration description="CTS device files collection">
-    <option name="plan" value="cts-device-files" />
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DeviceFileCollector">
-        <option name="src-file" value="/sys/fs/selinux/policy" />
-        <option name="dest-file" value="vintf-files/sepolicy"/>
-        <option name="property" key="ro.treble.enabled" value="true"/>
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DeviceFileCollector">
-        <option name="src-file" value="/proc/config.gz" />
-        <option name="dest-file" value="vintf-files/proc_config.gz"/>
-        <option name="property" key="ro.treble.enabled" value="true"/>
-    </target_preparer>
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-exclude-instant.xml b/tools/cts-tradefed/res/config/cts-exclude-instant.xml
deleted file mode 100644
index 402d227..0000000
--- a/tools/cts-tradefed/res/config/cts-exclude-instant.xml
+++ /dev/null
@@ -1,20 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Excluded tests applicable only to instant mode">
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.AppModeInstant" />
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.AppModeInstant" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.AppModeInstant" />
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-exclude.xml b/tools/cts-tradefed/res/config/cts-exclude.xml
deleted file mode 100644
index f6899a4..0000000
--- a/tools/cts-tradefed/res/config/cts-exclude.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<configuration description="Excluded tests from main CTS runs">
-    <!-- b/64127136 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForBinderInVendorBan" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForSocketsBetweenCoreAndVendorBan" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForVendorExecutingCore" />
-
-    <!-- Test Harness Mode tests are not a part of CTS. They are a part
-         of their own testing plan, as they reset the device during the
-         test. It's possible and ideal in the future to incorporate the
-         tests into CTS, but until then, they should be excluded. -->
-    <option name="compatibility:exclude-filter" value="CtsTestHarnessModeTestCases" />
-
-    <!-- Exclude downstreaming tests from CTS, i.e. tests added after the
-         first major release for this API level (They are pulled into GTS
-         instead). -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:com.android.compatibility.common.util.CtsDownstreamingTest" />
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:com.android.compatibility.common.util.CtsDownstreamingTest" />
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-filtered-sample.xml b/tools/cts-tradefed/res/config/cts-filtered-sample.xml
deleted file mode 100644
index e4f454b..0000000
--- a/tools/cts-tradefed/res/config/cts-filtered-sample.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<configuration description="Runs CTS from a pre-existing CTS installation">
-
-    <include name="common-compatibility-config" />
-
-    <option name="plan" value="cts-filtered-sample" />
-
-    <!-- Tell all AndroidJUnitTests to only run the medium sized tests -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:size:medium" />
-
-    <!-- Include 64bit CtsContentTestCases and tell it which timeout to use -->
-    <option name="compatibility:include-filter" value="arm64-v8a CtsContentTestCases" />
-    <option name="compatibility:module-arg" value="arm64-v8a CtsContentTestCases:test-timeout:600" />
-
-    <!-- Include CtsGestureTestCases but only run the tests on arm32 -->
-    <option name="compatibility:include-filter" value="armeabi-v7a CtsGestureTestCases" />
-
-    <!-- Exclude CtsMediaStressTestCases -->
-    <option name="compatibility:exclude-filter" value="CtsMediaStressTestCases" />
-
-    <!-- Include CtsUtilTestCases but only run the small tests -->
-    <option name="compatibility:include-filter" value="CtsUtilTestCases" />
-    <option name="compatibility:module-arg" value="CtsUtilTestCases:size:small" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-foldable.xml b/tools/cts-tradefed/res/config/cts-foldable.xml
deleted file mode 100644
index 1a3e256..0000000
--- a/tools/cts-tradefed/res/config/cts-foldable.xml
+++ /dev/null
@@ -1,26 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="CTS plan for foldable devices">
-
-    <include name="cts" />
-
-    <option name="plan" value="cts-foldable" />
-    <option name="result-attribute" key="display_mode" value="1" />
-
-    <!-- CTS tests to be excluded in this plan-->
-    <option name="compatibility:exclude-filter" value="CtsDeqpTestCases" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-global-presubmit.xml b/tools/cts-tradefed/res/config/cts-global-presubmit.xml
deleted file mode 100644
index 5a858e7..0000000
--- a/tools/cts-tradefed/res/config/cts-global-presubmit.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2017 The Android Open Source Project
-
-     Licensed under the Apache License, Version 2.0 (the "License");
-     you may not use this file except in compliance with the License.
-     You may obtain a copy of the License at
-
-          http://www.apache.org/licenses/LICENSE-2.0
-
-     Unless required by applicable law or agreed to in writing, software
-     distributed under the License is distributed on an "AS IS" BASIS,
-     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-     See the License for the specific language governing permissions and
-     limitations under the License.
--->
-<configuration description="Runs CTS global presubmit test cases">
-
-    <include name="cts-automated" />
-
-    <option name="plan" value="cts" />
-
-    <!-- Include modules with presubmit test cases, repeat for each applicable module -->
-    <!--option name="compatibility:include-filter" value="<CTS module name goes here>" /-->
-
-    <!-- Only run tests with @GlobalPresubmit annotation. -->
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:include-annotation:android.platform.test.annotations.GlobalPresubmit" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.GlobalPresubmit" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:include-annotation:android.platform.test.annotations.GlobalPresubmit" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-java.xml b/tools/cts-tradefed/res/config/cts-java.xml
deleted file mode 100644
index 722d8f7..0000000
--- a/tools/cts-tradefed/res/config/cts-java.xml
+++ /dev/null
@@ -1,28 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Runs Core Java Tests from a pre-existing CTS installation">
-
-    <include name="cts" />
-
-    <option name="plan" value="cts-java" />
-
-    <!-- Include CtsLibcoreTestCases -->
-    <option name="compatibility:include-filter" value="CtsLibcoreTestCases" />
-
-    <!-- Exclude CtsLibcoreTestCases harmony -->
-    <option name="compatibility:exclude-filter" value="CtsLibcoreTestCases android.core.tests.libcore.package.harmony" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-jvmti.xml b/tools/cts-tradefed/res/config/cts-jvmti.xml
deleted file mode 100644
index ce60582..0000000
--- a/tools/cts-tradefed/res/config/cts-jvmti.xml
+++ /dev/null
@@ -1,114 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Runs JVMTI Tests from a pre-existing CTS installation">
-
-    <!-- Using cts-dev to avoid system checkers. -->
-    <include name="cts-dev" />
-
-    <option name="plan" value="cts-jvmti" />
-
-    <!-- Include all JVMTI test cases -->
-    <option name="compatibility:include-filter" value="CtsJvmtiAttachingHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRedefineClassesHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest902HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest903HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest904HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest905HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest906HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest907HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest908HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest910HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest911HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest912HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest913HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest914HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest915HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest917HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest918HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest919HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest920HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest922HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest923HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest924HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest926HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest927HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest928HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest930HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest931HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest932HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest940HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest942HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest944HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest945HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest947HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest951HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest982HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest983HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest984HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest985HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest986HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest988HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest989HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest990HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest991HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest992HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest993HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest994HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest995HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest996HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest997HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1900HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1901HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1902HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1903HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1904HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1906HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1907HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1908HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1909HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1910HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1911HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1912HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1913HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1914HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1915HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1916HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1917HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1920HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1921HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1922HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1923HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1924HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1925HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1926HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1927HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1928HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1930HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1931HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1932HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1933HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1934HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1936HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1937HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1939HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1941HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1942HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1943HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1953HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiTaggingHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiTrackingHostTestCases" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-known-failures.xml b/tools/cts-tradefed/res/config/cts-known-failures.xml
deleted file mode 100644
index de90e52..0000000
--- a/tools/cts-tradefed/res/config/cts-known-failures.xml
+++ /dev/null
@@ -1,222 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Configuration with CTS known failures" >
-    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME" /> Excludes whole module -->
-    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME PACKAGE_NAME" /> Excludes whole package -->
-    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME PACKAGE_NAME.CLASS_NAME" /> Excludes whole class -->
-    <!-- <option name="compatibility:exclude-filter" value="MODULE_NAME PACKAGE_NAME.CLASS_NAME#TEST_NAME" /> Excludes individual test -->
-
-    <!-- b/38182235 -->
-    <option name="compatibility:exclude-filter" value="CtsLocationTestCases android.location.cts.GnssTtffTests#testTtffWithNetwork" />
-    <option name="compatibility:exclude-filter" value="CtsLocationTestCases[instant] android.location.cts.GnssTtffTests#testTtffWithNetwork" />
-
-    <!-- b/23776893 -->
-    <option name="compatibility:exclude-filter" value="CtsDumpsysHostTestCases android.dumpsys.cts.DumpsysHostTest#testBatterystatsOutput" />
-    <option name="compatibility:exclude-filter" value="CtsDumpsysHostTestCases android.dumpsys.cts.DumpsysHostTest#testGfxinfoFramestats" />
-
-    <!-- b/16720689 -->
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch001" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch002" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch003" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowDebuggerLaunchTest#testDebuggerLaunch004" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowLaunchDebugger001#testDebugger002" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.DebuggerOnDemand.OnthrowLaunchDebugger002#testDebugger" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.ClassUnloadTest#testClassUnloadEvent" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorContendedEnteredTest#testMonitorContendedEnteredForClassMatch" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorContendedEnterTest#testMonitorContendedEnterForClassMatch" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassExclude" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassMatchExact" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassMatchFirst" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassMatchSecond" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitedTest#testMonitorWaitedForClassOnly" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassExclude" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassMatchExact" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassMatchFirst" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassMatchSecond" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.Events.MonitorWaitTest#testMonitorWaitForClassOnly" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.ReferenceType.ClassFileVersionTest#testClassFileVersion001" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.ReferenceType.NestedTypesTest#testNestedTypes001" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.ThreadReference.StopTest#testStop001" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.VirtualMachine.HoldEventsTest#testHoldEvents001" />
-    <option name="compatibility:exclude-filter" value="CtsJdwp org.apache.harmony.jpda.tests.jdwp.VirtualMachine.ReleaseEventsTest#testReleaseEvents001" />
-
-    <!-- b/21262226 -->
-    <option name="compatibility:exclude-filter" value="CtsJobSchedulerTestCases android.jobscheduler.cts.ConnectivityConstraintTest#testConnectivityConstraintExecutes_withMobile" />
-    <option name="compatibility:exclude-filter" value="CtsJobSchedulerTestCases android.jobscheduler.cts.ConnectivityConstraintTest#testUnmeteredConstraintFails_withMobile" />
-
-    <!-- b/18682315 -->
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_bind" />
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_simple" />
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.SSLCertificateSocketFactoryTest#test_createSocket_wrapping" />
-
-    <!-- b/17394321 -->
-    <option name="compatibility:exclude-filter" value="CtsOpenGlPerfTestCases android.openglperf.cts.GlAppSwitchTest#testGlActivitySwitchingFast" />
-    <option name="compatibility:exclude-filter" value="CtsOpenGlPerfTestCases android.openglperf.cts.GlAppSwitchTest#testGlActivitySwitchingSlow" />
-
-    <!-- b/113071420-->
-    <option name="compatibility:exclude-filter" value="x86 CtsPerfettoTestCases PerfettoTest#TestFtraceProducer" />
-
-    <!-- b/18461670 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_getStreamVolumeLeak" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_isStreamActive" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_isStreamActiveRemotely" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_startAudioSource" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_startOutput" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.AudioPolicyBinderTest#test_stopOutput" />
-    <!-- b/27218502 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.MediaCryptoTest#testMediaCryptoClearKey" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.MediaCryptoTest#testMediaCryptoWidevine" />
-
-    <!-- b/63916274 -->
-    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.WiredHeadsetTest" />
-
-    <!-- b/62302163 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityBulletinHostTestCases android.security.cts.Poc17_04#testPocCVE_2017_0564" />
-
-    <!-- b/72460579 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityBulletinHostTestCases android.security.cts.Poc17_05#testPocCVE_2017_0630" />
-
-    <!-- b/27873815 -->
-    <option name="compatibility:exclude-filter" value="arm64-v8a CtsRenderscriptLegacyTestCases" />
-    <option name="compatibility:exclude-filter" value="x86_64 CtsRenderscriptLegacyTestCases" />
-    <option name="compatibility:exclude-filter" value="mips64 CtsRenderscriptLegacyTestCases" />
-
-    <!-- b/17536113 -->
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.UsageStatsTest#testNoAccessSilentlyFails" />
-
-    <!-- b/26235244 -->
-    <option name="compatibility:exclude-filter" value="android.util.cts.EventLogTest#testWriteEventWithOversizeValue" />
-
-    <!-- b/63115400 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospFileContexts" />
-    <!-- b/64221494 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospPropertyContexts" />
-    <!-- b/64221494 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testAospSeappContexts" />
-
-    <!-- b/63378294 b/64382381 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxNeverallowRulesTest#testNeverallowRules440" />
-
-    <!-- b/36686383 -->
-    <option name="compatibility:exclude-filter" value="CtsIncidentHostTestCases com.android.server.cts.ErrorsTest#testANR" />
-
-    <!-- b/33090965 -->
-    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf0320x0180" />
-    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf0640x0360" />
-    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf1280x0720" />
-    <option name="compatibility:exclude-filter" value="CtsVideoTestCases android.video.cts.VideoEncoderDecoderTest#testVp9Goog0Perf1920x1080" />
-
-    <!-- b/63916274 -->
-    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.WiredHeadsetTest" />
-
-    <!-- b/38463882 -->
-    <option name="compatibility:exclude-filter" value="x86_64 CtsLiblogTestCases liblog#event_log_tags" />
-
-    <!-- b/38464828 -->
-    <option name="compatibility:exclude-filter" value="CtsFileSystemTestCases android.filesystem.cts.AlmostFullTest" />
-
-    <!-- b/37271927 -->
-    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.ViewTest#testUpdateDragShadow" />
-
-    <!-- b/62481870 -->
-    <option name="compatibility:exclude-filter" value="CtsNativeMediaAAudioTestCases android.nativemedia.aaudio.AAudioOutputStreamCallbackTest#testPlayback" />
-
-    <!-- b/134654621 -->
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testTaskCloseRestoreFreeOrientation" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testAppOrientationRequestConfigClears" />
-
-    <!-- b/62976713 -->
-    <option name="compatibility:exclude-filter" value="arm64-v8a CtsMediaBitstreamsTestCases" />
-    <option name="compatibility:exclude-filter" value="x86_64 CtsMediaBitstreamsTestCases" />
-    <option name="compatibility:exclude-filter" value="mips64 CtsMediaBitstreamsTestCases" />
-
-    <!-- b/38420898 -->
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelMultiChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroMultiChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyMagMultiChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelMultiMode" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroMultiMode" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyMagMultiMode" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRegisterMultipleChannelsUsingSameMemory" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testCloseWithoutConfigStop" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelGyroSingleChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelMagSingleChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroMagSingleChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyAccelUncalAccelSingleChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyGyroUncalGyroSingleChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRateIndependencyMagUncalMagSingleChannel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testTimestampAccel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testTimestampGyro" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testTimestampMag" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testAtomicCounterAccel" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testAtomicCounterGyro" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testAtomicCounterMag" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testRegisterMultipleChannels" />
-    <option name="compatibility:exclude-filter" value="CtsSensorTestCases android.hardware.cts.SensorDirectReportTest#testReconfigure" />
-
-    <!-- b/65843095 -->
-    <option name="compatibility:exclude-filter" value="CtsLogdTestCases logd#statistics" />
-    <option name="compatibility:exclude-filter" value="CtsLogdTestCases logd#sepolicy_rate_limiter" />
-
-    <!-- b/67377433 -->
-    <!-- fails only on angler/bullhead userdebug -->
-    <option name="compatibility:exclude-filter" value="CtsLiblogTestCases liblog#wrap_mode_blocks" />
-
-    <!-- b/132274449 -->
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.validation.BatteryStatsValidationTests#testConnectivityStateChange" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases[instant] android.cts.statsd.validation.BatteryStatsValidationTests#testConnectivityStateChange" />
-
-    <!-- b/148080781 -->
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.UidAtomTests#testForegroundServiceState" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases[instant] android.cts.statsd.atom.UidAtomTests#testForegroundServiceState" />
-
-    <!-- b/110354076 -->
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testCreateAndManageUser_DontSkipSetupWizard" />
-
-    <!-- b/123280814 -->
-    <option name="compatibility:exclude-filter" value="CtsLocation2TestCases android.location2.cts.LocationManagerTest#testGetCoarseLocationUpdates_withListener" />
-    <option name="compatibility:exclude-filter" value="CtsLocation2TestCases android.location2.cts.LocationManagerTest#testGetNetworkProviderLocationUpdates_withListener" />
-
-    <!-- b/116002979 -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.ListeningPortsTest" />
-
-    <!-- b/117107760 -->
-    <option name="compatibility:exclude-filter" value="CtsHarmfulAppWarningHostTestCases android.harmfulappwarning.cts.HarmfulAppWarningTest#testDismissDialog" />
-    <option name="compatibility:exclude-filter" value="CtsHarmfulAppWarningHostTestCases android.harmfulappwarning.cts.HarmfulAppWarningTest#testLaunchAnyway" />
-    <option name="compatibility:exclude-filter" value="CtsHarmfulAppWarningHostTestCases android.harmfulappwarning.cts.HarmfulAppWarningTest#testUninstall" />
-
-    <!-- b/119312212 -->
-    <option name="compatibility:exclude-filter" value="CtsAngleIntegrationHostTestCases android.angle.cts.CtsAngleDebugOptionHostTest#testDebugOptionOn" />
-
-    <!-- b/129859594 -->
-    <option name="compatibility:exclude-filter" value="CtsAtomicInstallTestCases com.android.tests.atomicinstall.AtomicInstallTest#testFailInconsistentMultiPackageCommit" />
-
-    <!-- b/126548816 -->
-    <option name="compatibility:exclude-filter" value="CtsRcsTestCases" />
-
-    <!-- b/112688380 -->
-    <option name="compatibility:exclude-filter" value="CtsActivityManagerDeviceTestCases android.server.am.ActivityManagerAppConfigurationTests#testAppOrientationRequestConfigClears" />
-    <option name="compatibility:exclude-filter" value="CtsActivityManagerDeviceTestCases android.server.am.ActivityManagerAppConfigurationTests#testTaskCloseRestoreFreeOrientation" />
-    <!-- b/112688380, b/139936670 -->
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testAppOrientationRequestConfigClears" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AppConfigurationTests#testTaskCloseRestoreFreeOrientation" />
-
-    <!-- b/167931576 -->
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.ActivityVisibilityTests#testTurnScreenOnAttrNoLockScreen" />
-
-    <!-- b/135533962 -->
-    <option name="compatibility:exclude-filter" value="arm64-v8a CtsWrapWrapDebugMallocDebugTestCases" />
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-meerkat.xml b/tools/cts-tradefed/res/config/cts-meerkat.xml
deleted file mode 100644
index e2f25ac..0000000
--- a/tools/cts-tradefed/res/config/cts-meerkat.xml
+++ /dev/null
@@ -1,73 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Tests monitored by Meerkat Platform team (anti-abuse related).">
-
-    <include name="cts" />
-
-    <option name="plan" value="cts-meerkat" />
-
-    <!-- Disable instant tests -->
-    <option name="compatibility:enable-parameterized-modules" value="false" />
-
-    <!-- Overlays & touches -->
-    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.WindowInputTests"/>
-    <option name="compatibility:include-filter" value="CtsSecurityTestCases android.security.cts.MotionEventTest"/>
-
-    <!-- System Alert Window (SAW) -->
-    <option name="compatibility:include-filter" value="CtsSystemIntentTestCases"/>
-    <option name="compatibility:include-filter" value="CtsMediaTestCases android.media.cts.MediaProjectionTest"/>
-
-    <!-- Toasts -->
-    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.ToastWindowTest"/>
-    <option name="compatibility:include-filter" value="CtsWidgetTestCases android.widget.cts.ToastTest"/>
-    <option name="compatibility:include-filter" value="CtsWidgetTestCases29 android.widget.cts29.ToastTest"/>
-    <option name="compatibility:include-filter" value="CtsToastTestCases android.widget.toast.cts.LegacyToastTest"/>
-
-    <!-- Background activity launch -->
-    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.lifecycle.ActivityStarterTests"/>
-    <option name="compatibility:include-filter" value="CtsActivityManagerBackgroundActivityTestCases android.server.wm.BackgroundActivityLaunchTest"/>
-
-    <!-- Icon hiding -->
-    <option name="compatibility:include-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.LimitAppIconHidingTest"/>
-    <option name="compatibility:include-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest"/>
-    <option name="compatibility:include-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.LauncherAppsProfileTest"/>
-
-    <!-- App ops -->
-    <option name="compatibility:include-filter" value="CtsAppOpsTestCases android.app.appops.cts.AppOpsTest"/>
-    <option name="compatibility:include-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AlertWindowsTests"/>
-    <option name="compatibility:include-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityLoggingTest"/>
-    <option name="compatibility:include-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.SessionTest"/>
-    <option name="compatibility:include-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.ExternalSourcesTestAppOpAllowed"/>
-    <option name="compatibility:include-filter" value="CtsPackageUninstallTestCases"/>
-
-    <!-- Tests that we've added for b/72485440 and in ag/3789406 -->
-    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.cts.ContextTest"/>
-    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.cts.ContextMoreTest"/>
-    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.cts.ContextWrapperTest"/>
-
-    <!-- Tests that we've added for b/73451844 -->
-    <option name="compatibility:include-filter" value="CtsContentTestCases android.content.pm.cts.PackageManagerTest"/>
-
-    <!-- Network watchlist tests -->
-    <option name="compatibility:include-filter" value="CtsNetTestCases android.net.cts.NetworkWatchlistTest"/>
-
-    <!-- App data isolation -->
-    <option name="compatibility:include-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AppDataIsolationTests"/>
-
-    <!-- Install attribution -->
-    <option name="compatibility:include-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AppSecurityTests"/>
-    <option name="compatibility:include-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.InstallSourceInfoTest"/>
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi-cf.xml b/tools/cts-tradefed/res/config/cts-on-csi-cf.xml
deleted file mode 100644
index 787ab93..0000000
--- a/tools/cts-tradefed/res/config/cts-on-csi-cf.xml
+++ /dev/null
@@ -1,25 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Excluded tests for Cuttlefish">
-
-    <!-- Inherit from cts-on-csi for exclude list common for all CSI devices -->
-    <include name="cts-on-csi" />
-
-    <!-- Troublesome tests that often crash the system -->
-    <option name="compatibility:exclude-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.IntentTest#packageNotInstalledSecureFrp" />
-    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionReviewTest#testReviewPermissionWhenServiceIsBound" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi-no-apks.xml b/tools/cts-tradefed/res/config/cts-on-csi-no-apks.xml
deleted file mode 100644
index b10f519..0000000
--- a/tools/cts-tradefed/res/config/cts-on-csi-no-apks.xml
+++ /dev/null
@@ -1,195 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Excluded tests for APKs not in CSI">
-
-    <!-- No Browser2 -->
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.EphemeralTest#testEphemeralQuery" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testViewNormalUrl" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testViewSecureUrl" />
-    <option name="compatibility:exclude-filter" value="CtsMatchFlagTestCases android.matchflags.cts.MatchFlagTests#startNoBrowserRequireDefault" />
-    <option name="compatibility:exclude-filter" value="CtsMatchFlagTestCases android.matchflags.cts.MatchFlagTests#startNoBrowserIntentWithNoMatchingApps" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppDetailsAndSetDefaultAppThenIsDefaultApp" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndAllowThenIsRoleHolder" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#dontAddRoleHolderThenIsNotRoleHolder" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppListAndSetDefaultAppThenIsDefaultApp" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyThenHasDontAskAgain" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainThenDeniedAutomatically" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainAndReinstallThenShowsUiWithoutDontAskAgain" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppDetailsAndSetDefaultAppAndSetAnotherThenIsNotDefaultApp" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainAndClearDataThenShowsUiWithoutDontAskAgain" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppListAndSetDefaultAppThenIsDefaultAppInList" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleFirstTimeNoDontAskAgain" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestHoldingRoleThenAllowedAutomatically" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppDetailsThenIsNotDefaultApp" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#addAndRemoveRoleHolderThenRoleIsNotHeld" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#dontAddRoleHolderThenRoleIsNotHeld" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#addAndClearRoleHoldersThenIsNotRoleHolder" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#addAndRemoveRoleHolderThenIsNotRoleHolder" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyThenIsNotRoleHolder" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#requestRoleAndDenyWithDontAskAgainReturnsCanceled" />
-
-    <!-- No Calendar -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testCalendarAddAppointment" />
-
-    <!-- No Camera2 -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testCamera" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testImageCaptureIntentsHandledBySystem" />
-
-    <!-- No Contacts -->
-    <option name="compatibility:exclude-filter" value="CtsContactsProviderTestCases android.provider.cts.contacts.ContactsContractIntentsTest#testPickContactDir" />
-    <option name="compatibility:exclude-filter" value="CtsContactsProviderTestCases android.provider.cts.contacts.ContactsContractIntentsTest#testViewContactDir" />
-    <option name="compatibility:exclude-filter" value="CtsContactsProviderTestCases android.provider.cts.contacts.ContactsContract_ContactsTest#testContentUri" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testContactsCallLogs" />
-
-    <!-- No DeskClock -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockDismissAlarm" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockSetAlarm" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockSetTimer" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockShowAlarms" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockShowTimers" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAlarmClockSnoozeAlarm" />
-
-    <!-- No Dialer -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testDialPhoneNumber" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testDialVoicemail" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testLockTask_defaultDialer" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedProfileOwnerTest#testLockTask_defaultDialer" />
-    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.DefaultDialerOperationsTest#testActionDialHandling" />
-    <option name="compatibility:exclude-filter" value="CtsTelecomTestCases android.telecom.cts.DefaultDialerOperationsTest#testDialerUI" />
-
-    <!-- No Gallery2 -->
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ExternalStorageHostTest#testSystemGalleryExists" />
-    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.StrictModeTest#testFileUriExposure" />
-    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.StrictModeTest#testVmPenaltyListener" />
-    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.StrictModeTest#testContentUriWithoutPermission" />
-
-    <!-- No Gallery2, Music -->
-    <option name="compatibility:exclude-filter" value="CtsProviderTestCases android.provider.cts.media.MediaStoreIntentsTest" />
-
-    <!-- No Launcher and Home -->
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityEmbeddedDisplayTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityEmbeddedHierarchyTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityEndToEndTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityFocusAndInputFocusSyncTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityGestureDispatchTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityGlobalActionsTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityMagnificationTest#testA11yNodeInfoVisibility_whenOutOfMagnifiedArea_shouldVisible" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityPaneTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityTakeScreenshotTest#testTakeScreenshotWithSecureWindow_GetScreenshotAndVerifyBitmap" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityTextActionTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityTextTraversalTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityViewTreeReportingTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityWindowQueryTest" />
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityWindowReportingTest" />
-    <option name="compatibility:exclude-filter" value="CtsAdminPackageInstallerTestCases android.packageinstaller.admin.cts.SessionCommitBroadcastTest#testBroadcastNotReceivedForDifferentLauncher" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerProcessStateTest#testBgRestrictedForegroundService" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerProcessStateTest#testCantSaveStateLaunchAndBackground" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerProcessStateTest#testCantSaveStateLaunchAndSwitch" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testKillingPidsOnImperceptible" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testTimeTrackingAPI_ChainedActivityExit" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testTimeTrackingAPI_SimpleStartExit" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityManagerTest#testTimeTrackingAPI_SwitchAwayTriggers" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.BooleanTileServiceTest" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.TileServiceTest" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.QuietModeHostsideTest" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher1" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher2" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher3" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerLauncher4" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage1" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage2" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage3" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerPackage4" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerTestCases" />
-    <option name="compatibility:exclude-filter" value="CtsShortcutManagerThrottlingTest" />
-
-    <!-- No Music -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testMusicPlayback" />
-
-    <!-- No QuickSearchBox -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testWebSearchNormalUrl" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testWebSearchPlainText" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testWebSearchSecureUrl" />
-
-    <!-- No Settings -->
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilitySettingsTest" />
-    <option name="compatibility:exclude-filter" value="CtsAdminTestCases android.admin.cts.DeviceAdminActivationTest" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.StorageHostTest#testFullDisk" />
-    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.SettingsIntentTest" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testAddNetworksIntent" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testEasyConnectIntent" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testInteractAcrossProfilesSettings" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testLocationScanningSettings" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testNotificationPolicyDetailIntent" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testPictureInPictureSettings" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testPowerUsageSummarySettings" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testRequestSetAutofillServiceIntent" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testSettings" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testTapAnPaySettings" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testUsageAccessSettings" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceInputSettingsIntent" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.ManagedProfileTest#testSettingsIntents" />
-    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.AutoRevokeTest#testAutoRevoke_userWhitelisting" />
-    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.AutoRevokeTest#testInstallGrants_notRevokedImmediately" />
-    <option name="compatibility:exclude-filter" value="CtsPackageInstallTestCases android.packageinstaller.install.cts.ExternalSourcesTestAppOpAllowed#testManageUnknownSourcesExists" />
-    <option name="compatibility:exclude-filter" value="CtsProviderTestCases android.provider.cts.SettingsPanelTest" />
-    <option name="compatibility:exclude-filter" value="CtsProviderTestCases android.provider.cts.settings.SettingsTest#testUserDictionarySettingsExists" />
-    <option name="compatibility:exclude-filter" value="CtsSettingsHostTestCases" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleControllerManagerTest#settingsIsNotVisibleForHomeRole" />
-    <option name="compatibility:exclude-filter" value="CtsRoleTestCases android.app.role.cts.RoleManagerTest#openDefaultAppListThenIsNotDefaultAppInList" />
-
-    <!-- No SettingsIntelligence -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testSettingsSearchIntent" />
-
-    <!-- No StorageManager -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testManageStorage" />
-
-    <!-- No SystemUI -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.AudioPlaybackCaptureTest" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaProjectionTest" />
-    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest22#testCompatRevoked" />
-    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testGranted" />
-    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testRevokeAffectsWholeGroup" />
-    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testGrantPreviouslyRevokedWithPrejudiceShowsPrompt" />
-    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionTest23#testNoResidualPermissionsOnUninstall" />
-    <option name="compatibility:exclude-filter" value="CtsPermission3TestCases android.permission3.cts.PermissionUpgradeTest#testRevokePropagatedOnUpgradeOldToNewModel" />
-
-    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.SurfaceViewSyncTest" />
-    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.ASurfaceControlTest" />
-
-    <!-- No WebView -->
-    <option name="compatibility:exclude-filter" value="CtsAssistTestCases android.assist.cts.WebViewTest#testWebView" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.EphemeralTest#testWebViewLoads" />
-    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.inline.InlineWebViewActivityTest" />
-    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.WebViewActivityTest" />
-    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.WebViewMultiScreenLoginActivityTest" />
-    <option name="compatibility:exclude-filter" value="CtsAutoFillServiceTestCases android.autofillservice.cts.inline.InlineWebViewActivityTest" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.ManagedProfileProvisioningTest#testWebview" />
-    <option name="compatibility:exclude-filter" value="CtsHostsideWebViewTests" />
-    <option name="compatibility:exclude-filter" value="CtsInputMethodTestCases android.view.inputmethod.cts.KeyboardVisibilityControlTest#testShowHideKeyboardOnWebView" />
-    <option name="compatibility:exclude-filter" value="CtsTextTestCases android.text.cts.EmojiTest" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewScaledWithParentLayer" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithAlpha" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithAlphaLayer" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithLayer" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithOffsetLayer" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithParentLayer" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithUnclippedLayer" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithUnclippedLayerAndComplexClip" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.PathClippingTests#testWebViewClipWithCircle" />
-    <option name="compatibility:exclude-filter" value="CtsWebkitTestCases" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi-wmd.xml b/tools/cts-tradefed/res/config/cts-on-csi-wmd.xml
deleted file mode 100644
index 240a149..0000000
--- a/tools/cts-tradefed/res/config/cts-on-csi-wmd.xml
+++ /dev/null
@@ -1,39 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Excluded tests for CtsWindowManagerDeviceTestCases">
-
-    <!-- Troublesome tests that often crash the system -->
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.ActivityVisibilityTests#testTurnScreenOnActivity_withRelayout" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.AnrTests" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySecurityTests#testNoInputConnectionForUntrustedVirtualDisplay" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testImeApiForBug118341760" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testCrossDisplayBasicImeOperations" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.StartActivityTests#testStartActivityByNavigateUpToFromDiffUid" />
-
-    <!-- No Home -->
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchHomeActivityOnSecondaryDisplayWithoutDecorations" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchSingleSecondaryHomeActivityOnDisplayWithDecorations" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchSingleHomeActivityOnDisplayWithDecorations" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchHomeActivityOnUntrustedVirtualSecondaryDisplay" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchSecondaryHomeActivityOnDisplayWithDecorations" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.MultiDisplaySystemDecorationTests#testLaunchHomeActivityOnDisplayWithDecorations" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.StartActivityTests#testStartHomeIfNoActivities" />
-
-    <!-- No SystemUI -->
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.SurfaceControlTest" />
-    <option name="compatibility:exclude-filter" value="CtsWindowManagerDeviceTestCases android.server.wm.SurfaceViewSurfaceValidatorTest" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-csi.xml b/tools/cts-tradefed/res/config/cts-on-csi.xml
deleted file mode 100644
index 7ec61d1..0000000
--- a/tools/cts-tradefed/res/config/cts-on-csi.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Runs a subset of CTS-on-GSI tests using a core system image (CSI)">
-
-    <include name="cts-on-gsi" />
-    <include name="cts-on-csi-no-apks" />
-    <include name="csi-known-failures" />
-
-    <!--
-    CtsWindowManagerDeviceTestCases has about two hundred failed tests on CSI,
-    so it has its own exclude list.
-    -->
-    <include name="cts-on-csi-wmd" />
-
-    <option name="plan" value="cts-on-csi" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml b/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml
deleted file mode 100644
index 092074a..0000000
--- a/tools/cts-tradefed/res/config/cts-on-gsi-exclude.xml
+++ /dev/null
@@ -1,278 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 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.
--->
-<configuration description="Excluded tests from cts-on-gsi">
-    <!-- Tell all AndroidJUnitTests to exclude certain annotations -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
-
-    <!-- Tell all HostTests to exclude certain annotations -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.RestrictedBuildTest" />
-
-    <!-- Radio system of a general system image is not checked -->
-    <option name="compatibility:exclude-filter" value="CtsTelephonyTestCases" />
-    <option name="compatibility:exclude-filter" value="CtsTelephony2TestCases" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.SystemFeaturesTest#testLocationFeatures" />
-
-    <!-- Exclude telephony related testcases -->
-    <option name="compatibility:exclude-filter" value="CtsNetTestCasesLegacyApi22 android.net.cts.legacy.api22.ConnectivityManagerLegacyTest#testStartUsingNetworkFeature_enableHipri" />
-    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testAppSpecificSmsToken" />
-    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.NoReceiveSmsPermissionTest#testReceiveTextMessage" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForBinderInVendorBan" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForSocketsBetweenCoreAndVendorBan" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityHostTestCases android.security.cts.SELinuxHostTest#testNoExemptionsForVendorExecutingCore" />
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testAppDetails" />
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testAppSummary" />
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testCallback" />
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testDeviceSummary" />
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testTagDetails" />
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUidDetails" />
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUserSummary" />
-
-    <!-- Exclude not applicable testcases-->
-    <option name="compatibility:exclude-filter" value="CtsSignatureTestCases" />
-
-    <!--
-        Exclude testcases failing on Pixel devices
-        TODO(jaeshin@): b/68300743
-    -->
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceCommand" />
-    <option name="compatibility:exclude-filter" value="CtsContentTestCases android.content.cts.AvailableIntentsTest#testVoiceSearchHandsFree" />
-
-    <!-- Excluded tese case - TODO(jiyong): b/67739526 to reenable that -->
-    <option name="compatibility:exclude-filter" value="CtsJniTestCases android.jni.cts.JniStaticTest#test_linker_namespaces" />
-
-    <!-- b/68190722: Remove testcases that require RRO which is planned for Pi -->
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActionBarTest#testOpenOptionsMenu" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActionBarTest#testOptionsMenuKey" />
-    <option name="compatibility:exclude-filter" value="CtsAppTestCases android.app.cts.ActivityKeyboardShortcutsTest#testRequestShowKeyboardShortcuts" />
-
-    <!-- b/71958344: Exclude until CTS releases it -->
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.OverlayHostTest#testInstallingOverlayHasNoEffect" />
-
-    <!-- b/161837932: Fix MediaPlayerTests that use "too small" resolution -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testOnSubtitleDataListener" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testChangeSubtitleTrack" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testDeselectTrackForSubtitleTracks" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.MediaPlayerTest#testGetTrackInfoForVideoWithSubtitleTracks" />
-
-    <!-- b/74583365: CtsAppSecurityHostTestCases flaky -->
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testApps " />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testEjected" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testPackageInstaller" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.AdoptableHostTest#testPrimaryStorage" />
-
-    <!-- b/152359655: ResumeOnReboot can't work on GSI -->
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.ResumeOnRebootHostTest" />
-
-    <!-- b/77175538: CtsViewTestCases failure flaky -->
-    <option name="compatibility:exclude-filter" value="CtsViewTestCases android.view.cts.PixelCopyTest#testWindowProducerCopyToRGBA16F" />
-
-    <!-- b/73727333: CtsSystemUiTestCases failure flaky -->
-    <option name="compatibility:exclude-filter" value="CtsSystemUiTestCases android.systemui.cts.LightBarTests#testLightNavigationBar" />
-    <option name="compatibility:exclude-filter" value="CtsSystemUiTestCases android.systemui.cts.LightBarThemeTest#testNavigationBarDivider" />
-
-    <!-- b/80388296: CtsDevicePolicyManagerTestCases failure flaky -->
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testDisallowAutofill_allowed" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPackageInstallUserRestrictions" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionAppUpdate" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionGrant" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionMixedPolicies" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testPermissionPolicy" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testSuspendPackage" />
-
-    <!-- b/80407835: CtsServicesHostTestCases failure flaky -->
-    <option name="compatibility:exclude-filter" value="CtsServicesHostTestCases android.server.cts.KeyguardTests#testDialogShowWhenLockedActivity" />
-    <option name="compatibility:exclude-filter" value="CtsServicesHostTestCases android.server.cts.KeyguardTests#testTranslucentShowWhenLockedActivity" />
-
-    <!-- b/80388295: CtsAccessibilityServiceTestCases failure flaky -->
-    <option name="compatibility:exclude-filter" value="CtsAccessibilityServiceTestCases android.accessibilityservice.cts.AccessibilityGestureDispatchTest#testClickWhenMagnified_matchesActualTouch" />
-
-    <!-- b/80284482: Flaky tests -->
-    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testAllowWhileIdleAlarms" />
-    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testBucketUpgradeToNoDelay" />
-    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testBucketUpgradeToSmallerDelay" />
-    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testFrequentDelay" />
-    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testRareDelay" />
-    <option name="compatibility:exclude-filter" value="CtsAlarmManagerTestCases android.alarmmanager.cts.AppStandbyTests#testWorkingSetDelay" />
-
-    <!-- b/110260628: A confirmed GSI incompatibility (waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testCreateAndManageUser_DontSkipSetupWizard" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.DeviceOwnerTest#testSecurityLoggingWithSingleUser" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testKeyManagement" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedProfileOwnerTest#testKeyManagement" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedManagedProfileOwnerTest#testKeyManagement" />
-
-    <!-- b/110405497: Flaky tests (waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testDeviceIdAttestation" />
-
-    <!-- b/141113818: Allows unlock for CTS-on-GSI -->
-    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testEcAttestation_DeviceLocked" />
-    <option name="compatibility:exclude-filter" value="CtsKeystoreTestCases android.keystore.cts.KeyAttestationTest#testRsaAttestation_DeviceLocked" />
-
-    <!-- b/110385515: Flaky due to a particular SIM card requirement (excluded) -->
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.ConnectivityManagerTest#testOpenConnection" />
-    <option name="compatibility:exclude-filter" value="CtsWifiTestCases android.net.wifi.rtt.cts.WifiRttTest#testRangingToTestAp" />
-
-    <!-- b/110261912: Flaky tests -->
-    <option name="compatibility:exclude-filter" value="CtsProviderTestCases android.provider.cts.BlockedNumberContractTest#testProviderInteractionsAsRegularApp_fails" />
-
-    <!-- b/80077839: Incompatibility with GSI (waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.HostAtomTests#testBluetoothActivityInfo" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.atom.HostAtomTests#testScreenStateChangedAtom" />
-    <option name="compatibility:exclude-filter" value="CtsStatsdHostTestCases android.cts.statsd.validation.ValidationTests#testPartialWakelock" />
-
-    <!-- b/110417203: Flaky tests -->
-    <option name="compatibility:exclude-filter" value="CtsUsageStatsTestCases android.app.usage.cts.NetworkUsageStatsTest#testUidTagStateDetails" />
-
-    <!-- b/80077786: MyVerizonServices fail -->
-    <option name="compatibility:exclude-filter" value="CtsPermission2TestCases android.permission2.cts.PrivappPermissionsTest#testPrivappPermissionsEnforcement" />
-
-    <!-- b/111101428: CtsOsTestCases irrelevant test cases -->
-    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.BuildTest#testIsSecureUserBuild" />
-    <option name="compatibility:exclude-filter" value="CtsOsTestCases android.os.cts.BuildVersionTest#testBuildFingerprint" />
-
-    <!-- b/111147583: CtsSecurityTestCases irrelevant test cases -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.VerifiedBootTest#testVerifiedBootSupport" />
-
-    <!-- b/110405126: CtsPermissionTestCases flaky (due to SIM card setting) -->
-    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetDeviceId" />
-    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetImei" />
-    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetLine1Number" />
-    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetSimSerialNumber" />
-    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testGetSubscriberId" />
-    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testSetDataEnabled" />
-    <option name="compatibility:exclude-filter" value="CtsPermissionTestCases android.permission.cts.TelephonyManagerPermissionTest#testVoiceMailNumber" />
-
-    <!-- b/111967702: CtsSecurityTestCases irrelevant test cases -->
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.BannedFilesTest#testNoSu" />
-    <option name="compatibility:exclude-filter" value="CtsSecurityTestCases android.security.cts.BannedFilesTest#testNoSuInPath" />
-
-    <!-- b/116170534: CtsMediaTestCases regression (9.0 R4 waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.DecoderTest#testH265HDR10StaticMetadata" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerCornerCase" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerCornerCase2" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerCubicMonotonic" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerDuck" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerJoin" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerRamp" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerRunDuringPauseStop" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerStepRamp" />
-    <option name="compatibility:exclude-filter" value="CtsMediaTestCases android.media.cts.VolumeShaperTest#testPlayerTwoShapers" />
-
-    <!-- b/157286547 CtsIncidentHostTestCases ErrorsTest failure -->
-    <option name="compatibility:exclude-filter" value="CtsIncidentHostTestCases com.android.server.cts.ErrorsTest#testThrowException" />
-    <option name="compatibility:exclude-filter" value="CtsIncidentHostTestCases com.android.server.cts.ErrorsTest#testNativeCrash" />
-
-    <!-- b/112450846: CtsAppSecurityHostTestCases multi-user, fixing on Q -->
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.StorageHostTest#testCache" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.StorageHostTest#testVerifyAppStats" />
-    <option name="compatibility:exclude-filter" value="CtsAppSecurityHostTestCases android.appsecurity.cts.StorageHostTest#testVerifyStats" />
-
-    <!-- b/111167329: CtsCameraTestCases failure -->
-    <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.hardware.camera2.cts.SurfaceViewPreviewTest#testSurfaceSet"/>
-
-    <!-- b/135588722: CtsUsesLibraryHostTestCases (10_r1 waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsUsesLibraryHostTestCases android.classloaders.cts.UsesLibraryHostTest#testMissingLibrary_full"/>
-    <option name="compatibility:exclude-filter" value="CtsUsesLibraryHostTestCases android.classloaders.cts.UsesLibraryHostTest#testUsesLibrary_full"/>
-    <option name="compatibility:exclude-filter" value="CtsCompilationTestCases android.compilation.cts.AdbRootDependentCompilationTest"/>
-
-    <!-- b/145371681: CtsContentSuggestionsTestCases and CtsAppPredictionServiceTestCases (10_r2 waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsAppPredictionServiceTestCases" />
-    <option name="compatibility:exclude-filter" value="CtsContentSuggestionsTestCases" />
-
-    <!-- b/143513519: CtsCameraTestCases (10_r3 waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsCameraTestCases android.camera.cts.HeifWriterTest#testHeif"/>
-
-    <!-- b/155107044: CtsNetTestCases -->
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testInterfaceCountersUdp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testInterfaceCountersUdp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptTcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptUdp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthUdp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptUdp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthUdp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptTcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha1Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptTcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthUdp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testIkeOverUdpEncapSocket"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testInterfaceCountersUdp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Tcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthTcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthTcp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Tcp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm128Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testCryptUdp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAuthTcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacMd5Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha256Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Udp4"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha384Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm64Udp6"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesGcm96Udp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.IpSecManagerTest#testAesCbcHmacSha512Tcp4UdpEncap"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.TrafficStatsTest#testTrafficStatsForLocalhost"/>
-    <option name="compatibility:exclude-filter" value="CtsNetTestCases android.net.cts.TrafficStatsTest#testValidTotalStats"/>
-
-    <!-- b/150807956: Temporarily disabled due to bad experiment channel -->
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.LayerTests#testWebViewWithLayerAndComplexClip" />
-    <option name="compatibility:exclude-filter" value="CtsUiRenderingTestCases android.uirendering.cts.testclasses.PathClippingTests#testWebViewClipWithCircle" />
-
-    <!-- b/159295445, b/159294948: CtsDevicePolicyManagerTestCases -->
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.MixedDeviceOwnerTest#testDelegatedCertInstallerDeviceIdAttestation" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.OrgOwnedProfileOwnerTest#testDelegatedCertInstallerDeviceIdAttestation" />
-    <option name="compatibility:exclude-filter" value="CtsDevicePolicyManagerTestCases com.android.cts.devicepolicy.OrgOwnedProfileOwnerTest#testDeviceIdAttestationForProfileOwner" />
-
-    <!-- b/153032202: CtsSystemUiTestCases (10_r3 waiver) -->
-    <option name="compatibility:exclude-filter" value="CtsSystemUiTestCases android.systemui.cts.WindowInsetsBehaviorTests#swipeOutsideLimit_systemUiVisible_allEventsCanceled"/>
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-presubmit.xml b/tools/cts-tradefed/res/config/cts-on-gsi-presubmit.xml
deleted file mode 100644
index 3c42a12..0000000
--- a/tools/cts-tradefed/res/config/cts-on-gsi-presubmit.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 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.
--->
-<configuration description="Runs a subset of CTS-on-GSI tests selected for presubmit testing">
-    <option name="plan" value="cts-on-gsi-presubmit" />
-    <include name="cts-automated" />
-    <!-- CTS-on-GSI is not expected to run parameterized modules -->
-    <option name="compatibility:enable-parameterized-modules" value="false" />
-    <option name="compatibility:primary-abi-only" value="true" />
-
-    <include name="cts-on-gsi-exclude" />
-
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:include-annotation:android.platform.test.annotations.Presubmit" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.Presubmit" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:include-annotation:android.platform.test.annotations.Presubmit" />
-</configuration>
-
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml b/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml
deleted file mode 100644
index 5150942..0000000
--- a/tools/cts-tradefed/res/config/cts-on-gsi-sim.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Runs cts-on-gsi on device with SIM card">
-
-    <include name="cts-on-gsi" />
-
-    <include name="cts-sim-include" />
-
-    <option name="plan" value="cts-on-gsi-sim" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-on-gsi.xml b/tools/cts-tradefed/res/config/cts-on-gsi.xml
deleted file mode 100644
index a87ba2e..0000000
--- a/tools/cts-tradefed/res/config/cts-on-gsi.xml
+++ /dev/null
@@ -1,33 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2019 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.
--->
-<configuration description="Runs a subset of CTS tests using a general system image (GSI)">
-    <!-- Enforce collecting vendor build information -->
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.VtsDeviceInfoCollector" />
-
-    <!-- Common CTS config -->
-    <include name="cts" />
-
-    <!-- CTS-on-GSI is not expected to run parameterized modules -->
-    <option name="compatibility:enable-parameterized-modules" value="false" />
-    <option name="compatibility:primary-abi-only" value="true" />
-
-    <include name="cts-on-gsi-exclude" />
-    <!-- Overwrite the "cts" plan configured in cts.xml -->
-    <option name="plan" value="cts-on-gsi" />
-
-    <!-- For CTS-on-GSI, override the suite name to VTS for the R release only -->
-    <option name="cts-on-gsi-variant" value="true" />
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-preconditions.xml b/tools/cts-tradefed/res/config/cts-preconditions.xml
deleted file mode 100644
index 6a4f47e..0000000
--- a/tools/cts-tradefed/res/config/cts-preconditions.xml
+++ /dev/null
@@ -1,83 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<configuration description="CTS precondition configs">
-
-    <include name="cts-device-files" />
-
-    <option name="plan" value="cts-preconditions" />
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DynamicConfigPusher">
-        <option name="target" value="host" />
-        <!-- the name under which to find the configuration -->
-        <option name="config-filename" value="cts" />
-        <option name="extract-from-resource" value="true" />
-        <!-- the name of the resource inside the jar -->
-        <option name="dynamic-resource-name" value="cts-tradefed" />
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.StayAwakePreparer" />
-
-    <!-- Disable "Android Beta Program" -->
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.PackageDisabler" >
-        <option name="package" value="com.android.yadayada"/>
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.SettingsPreparer">
-        <option name="device-setting" value="verifier_verify_adb_installs"/>
-        <option name="setting-type" value="global"/>
-        <option name="set-value" value="0"/>
-    </target_preparer>
-
-    <!-- Disable crash error dialogs to avoid affecting following tests -->
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.SettingsPreparer">
-        <option name="device-setting" value="hide_error_dialogs"/>
-        <option name="setting-type" value="global"/>
-        <option name="set-value" value="1"/>
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ApkPreconditionCheck">
-        <option name="apk" value="CtsPreconditions.apk"/>
-        <option name="package" value="com.android.preconditions.cts"/>
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.WifiCheck" />
-
-    <target_preparer class="com.android.tradefed.targetprep.RunCommandTargetPreparer">
-        <option name="run-command" value="rm -rf /sdcard/device-info-files" />
-        <option name="run-command" value="rm -rf /sdcard/report-log-files" />
-        <!-- Disable keyguard -->
-        <option name="run-command" value="locksettings set-disabled true"/>
-    </target_preparer>
-
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.DeviceInfoCollector">
-        <option name="apk" value="CtsDeviceInfo.apk"/>
-        <option name="package" value="com.android.compatibility.common.deviceinfo"/>
-        <option name="src-dir" value="/sdcard/device-info-files/"/>
-        <option name="dest-dir" value="device-info-files/"/>
-        <option name="temp-dir" value="temp-device-info-files/"/>
-        <option name="throw-error" value="false"/>
-    </target_preparer>
-
-    <!-- The following values are used in cts/common/device-side/util/DeviceReportLog.java,
-    cts/harness/common/host-side/util/MetricsReportLog.java and tools/tradefed-host/util/ReportLogUtil.java.
-    Any change in these values must also be translated to the stated files.
-    -->
-    <target_preparer class="com.android.compatibility.common.tradefed.targetprep.ReportLogCollector">
-        <option name="src-dir" value="/sdcard/report-log-files/"/>
-        <option name="dest-dir" value="report-log-files/"/>
-        <option name="temp-dir" value="temp-report-logs/"/>
-    </target_preparer>
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-presubmit.xml b/tools/cts-tradefed/res/config/cts-presubmit.xml
deleted file mode 100644
index 5997779..0000000
--- a/tools/cts-tradefed/res/config/cts-presubmit.xml
+++ /dev/null
@@ -1,29 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Runs CTS presubmit test cases">
-
-    <include name="cts-automated" />
-
-    <!-- Only run tests with @Presubmit annotation -->
-    <!-- This serve as a base config for CTS tests used for presubmit;
-         additional filtering parameters should be applied to further narrow
-         down the choice of tests, e.g. module filter
-    -->
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:include-annotation:android.platform.test.annotations.Presubmit" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.Presubmit" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:include-annotation:android.platform.test.annotations.Presubmit" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-sim-include.xml b/tools/cts-tradefed/res/config/cts-sim-include.xml
deleted file mode 100644
index 1614c18..0000000
--- a/tools/cts-tradefed/res/config/cts-sim-include.xml
+++ /dev/null
@@ -1,45 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Include CTS test that require SIM card">
-
-    <!-- CTS tests that need SIM card-->
-    <option name="compatibility:include-filter" value="signed-CtsOmapiTestCases" />
-    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases1" />
-    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases2" />
-    <option name="compatibility:include-filter" value="signed-CtsSecureElementAccessControlTestCases3" />
-    <option name="compatibility:include-filter" value="CtsCarrierApiTestCases" />
-    <option name="compatibility:include-filter" value="CtsJobSchedulerTestCases" />
-    <option name="compatibility:include-filter" value="CtsNetTestCases" />
-    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyApi22" />
-    <option name="compatibility:include-filter" value="CtsOmapiTestCases" />
-    <option name="compatibility:include-filter" value="CtsPermissionTestCases" />
-    <option name="compatibility:include-filter" value="CtsPermission2TestCases" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases1" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases2" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases3" />
-    <option name="compatibility:include-filter" value="CtsSimRestrictedApisTestCases" />
-    <option name="compatibility:include-filter" value="CtsStatsdHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsTelecomTestCases" />
-    <option name="compatibility:include-filter" value="CtsTelecomTestCases2" />
-    <option name="compatibility:include-filter" value="CtsTelecomTestCases3" />
-    <option name="compatibility:include-filter" value="CtsTelephonyTestCases" />
-    <option name="compatibility:include-filter" value="CtsTelephony2TestCases" />
-    <option name="compatibility:include-filter" value="CtsTelephony3TestCases" />
-    <option name="compatibility:include-filter" value="CtsTelephonySdk28TestCases" />
-    <option name="compatibility:include-filter" value="CtsTetheringTest" />
-    <option name="compatibility:include-filter" value="CtsUsageStatsTestCases" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-sim.xml b/tools/cts-tradefed/res/config/cts-sim.xml
deleted file mode 100644
index 234c33f..0000000
--- a/tools/cts-tradefed/res/config/cts-sim.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Runs CTS-sim on device with SIM card">
-
-    <include name="cts" />
-
-    <include name="cts-sim-include" />
-
-    <option name="plan" value="cts-sim" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-system-checkers.xml b/tools/cts-tradefed/res/config/cts-system-checkers.xml
deleted file mode 100644
index 7639bf9..0000000
--- a/tools/cts-tradefed/res/config/cts-system-checkers.xml
+++ /dev/null
@@ -1,30 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="CTS system checker configs">
-    <system_checker class="com.android.tradefed.suite.checker.UserChecker" />
-    <system_checker class="com.android.compatibility.common.tradefed.targetprep.NetworkConnectivityChecker" />
-    <system_checker class="com.android.tradefed.suite.checker.ShellStatusChecker" />
-    <system_checker class="com.android.tradefed.suite.checker.EnforcedSeLinuxChecker">
-        <!-- We expect selinux enforced for CTS -->
-        <option name="expect-enforced" value="true" />
-    </system_checker>
-    <system_checker class="com.android.tradefed.suite.checker.KeyguardStatusChecker" />
-    <system_checker class="com.android.tradefed.suite.checker.LeakedThreadStatusChecker" />
-    <system_checker class="com.android.tradefed.suite.checker.TimeStatusChecker" />
-    <system_checker class="com.android.tradefed.suite.checker.DeviceSettingChecker" />
-    <system_checker class="com.android.tradefed.suite.checker.SystemServerStatusChecker" />
-    <system_checker class="com.android.tradefed.suite.checker.SystemServerFileDescriptorChecker" />
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-virtual-device-stable.xml b/tools/cts-tradefed/res/config/cts-virtual-device-stable.xml
deleted file mode 100644
index 512e8a2..0000000
--- a/tools/cts-tradefed/res/config/cts-virtual-device-stable.xml
+++ /dev/null
@@ -1,222 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2020 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.
--->
-<configuration description="Runs stable set of CTS tests for virtual devices">
-
-    <include name="cts-virtual-device" />
-
-    <option name="plan" value="cts-virtual-device-stable" />
-
-    <!-- CTS tests shown to be stable on virtual devices-->
-    <option name="compatibility:include-filter" value="CtsAccelerationTestCases" />
-    <option name="compatibility:include-filter" value="CtsAlarmClockTestCases" />
-    <option name="compatibility:include-filter" value="CtsAndroidTestBase27ApiSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsAndroidTestMockCurrentApiSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsAndroidTestRunnerCurrentApiSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsAnimationTestCases" />
-    <option name="compatibility:include-filter" value="CtsApacheHttpLegacy27ApiSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsApacheHttpLegacyCurrentApiSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsApacheHttpLegacyUsesLibraryApiSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsAppComponentFactoryTestCases" />
-    <option name="compatibility:include-filter" value="CtsAppUsageHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsAslrMallocTestCases" />
-    <option name="compatibility:include-filter" value="CtsAtraceHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsBackgroundRestrictionsTestCases" />
-    <option name="compatibility:include-filter" value="CtsBionicTestCases" />
-    <option name="compatibility:include-filter" value="CtsCalendarcommon2TestCases" />
-    <option name="compatibility:include-filter" value="CtsClassLoaderFactoryInMemoryDexClassLoaderTestCases" />
-    <option name="compatibility:include-filter" value="CtsClassLoaderFactoryPathClassLoaderTestCases" />
-    <option name="compatibility:include-filter" value="CtsCompilationTestCases" />
-    <option name="compatibility:include-filter" value="CtsContactsProviderWipe" />
-    <option name="compatibility:include-filter" value="CtsCppToolsTestCases" />
-    <option name="compatibility:include-filter" value="CtsCurrentApiSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsDatabaseTestCases" />
-    <option name="compatibility:include-filter" value="CtsDebugTestCases" />
-    <option name="compatibility:include-filter" value="CtsDeviceIdleHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsDexMetadataHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsDreamsTestCases" />
-    <option name="compatibility:include-filter" value="CtsDynamicLinkerTestCases" />
-    <option name="compatibility:include-filter" value="CtsEdiHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsExtendedMockingTestCases" />
-    <option name="compatibility:include-filter" value="CtsFragmentTestCases" />
-    <option name="compatibility:include-filter" value="CtsFragmentTestCasesSdk26" />
-    <option name="compatibility:include-filter" value="CtsGestureTestCases" />
-    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistApi27TestCases" />
-    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistApi28TestCases" />
-    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistCurrentApiTestCases" />
-    <option name="compatibility:include-filter" value="CtsHiddenApiBlocklistDebugClassTestCases" />
-    <option name="compatibility:include-filter" value="CtsHiddenApiKillswitchDebugClassTestCases" />
-    <option name="compatibility:include-filter" value="CtsHiddenApiKillswitchSdkListTestCases" />
-    <option name="compatibility:include-filter" value="CtsHiddenApiKillswitchWildcardTestCases" />
-    <option name="compatibility:include-filter" value="CtsHostsideNumberBlockingTestCases" />
-    <option name="compatibility:include-filter" value="CtsHostsideTvTests" />
-    <option name="compatibility:include-filter" value="CtsHostsideWebViewTests" />
-    <option name="compatibility:include-filter" value="CtsHostTzDataTests" />
-    <option name="compatibility:include-filter" value="CtsIcuTestCases" />
-    <option name="compatibility:include-filter" value="CtsInlineMockingTestCases" />
-    <option name="compatibility:include-filter" value="CtsInputMethodTestCases" />
-    <option name="compatibility:include-filter" value="CtsIntentSignatureTestCases" />
-    <option name="compatibility:include-filter" value="CtsJankDeviceTestCases" />
-    <option name="compatibility:include-filter" value="CtsJdwpSecurityHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJdwpTestCases" />
-    <option name="compatibility:include-filter" value="CtsJniTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiAttachingHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiAttachingTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRedefineClassesHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1900HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1901HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1902HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1903HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1904HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1906HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1907HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1908HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1909HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1910HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1911HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1912HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1913HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1914HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1915HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1916HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1917HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1920HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1921HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1922HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1923HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1924HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1925HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1926HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1927HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1928HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1930HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1931HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1932HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1933HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1934HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1936HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1937HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1939HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1941HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1942HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1943HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1953HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest1958HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest902HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest903HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest904HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest905HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest906HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest907HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest908HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest910HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest911HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest912HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest913HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest914HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest915HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest917HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest918HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest919HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest920HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest922HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest923HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest924HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest926HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest927HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest928HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest930HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest931HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest932HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest940HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest942HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest944HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest945HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest947HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest951HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest982HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest983HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest984HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest985HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest986HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest988HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest989HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest990HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest991HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest992HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest993HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest994HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest996HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiRunTest997HostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiTaggingHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsJvmtiTrackingHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsKernelConfigTestCases" />
-    <option name="compatibility:include-filter" value="CtsLeanbackJankTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreApiEvolutionTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreCoreApiTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreCorePlatformApiTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreJsr166TestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreLegacy22TestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreOjTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreOkHttpTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreSimpleMModuleTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreSimpleModuleTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreWycheproofBCTestCases" />
-    <option name="compatibility:include-filter" value="CtsLibcoreWycheproofConscryptTestCases" />
-    <option name="compatibility:include-filter" value="CtsLiblogTestCases" />
-    <option name="compatibility:include-filter" value="CtsLocationFineTestCases" />
-    <option name="compatibility:include-filter" value="CtsLocationCoarseTestCases" />
-    <option name="compatibility:include-filter" value="CtsLocationNoneTestCases" />
-    <option name="compatibility:include-filter" value="CtsLogdTestCases" />
-    <option name="compatibility:include-filter" value="CtsMockingDebuggableTestCases" />
-    <option name="compatibility:include-filter" value="CtsMockingTestCases" />
-    <option name="compatibility:include-filter" value="CtsMultiUserHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsNativeNetTestCases" />
-    <option name="compatibility:include-filter" value="CtsNativeNetTestCases" />
-    <option name="compatibility:include-filter" value="CtsNdefTestCases" />
-    <option name="compatibility:include-filter" value="CtsNdkBinderTestCases" />
-    <option name="compatibility:include-filter" value="CtsNetTestCasesLegacyPermission22" />
-    <option name="compatibility:include-filter" value="CtsNNAPITestCases" />
-    <option name="compatibility:include-filter" value="CtsOmapiTestCases" />
-    <option name="compatibility:include-filter" value="CtsPdfTestCases" />
-    <option name="compatibility:include-filter" value="CtsPermissionTestCasesSdk28" />
-    <option name="compatibility:include-filter" value="CtsPreference2TestCases" />
-    <option name="compatibility:include-filter" value="CtsPreferenceTestCases" />
-    <option name="compatibility:include-filter" value="CtsProtoTestCases" />
-    <option name="compatibility:include-filter" value="CtsRenderscriptLegacyTestCases" />
-    <option name="compatibility:include-filter" value="CtsRsBlasTestCases" />
-    <option name="compatibility:include-filter" value="CtsRsCppTestCases" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases1" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases2" />
-    <option name="compatibility:include-filter" value="CtsSecureElementAccessControlTestCases3" />
-    <option name="compatibility:include-filter" value="CtsSliceTestCases" />
-    <option name="compatibility:include-filter" value="CtsSustainedPerformanceHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsSystemApiAnnotationTestCases" />
-    <option name="compatibility:include-filter" value="CtsTelecomTestCases2" />
-    <option name="compatibility:include-filter" value="CtsTelephony2TestCases" />
-    <option name="compatibility:include-filter" value="CtsTelephony3TestCases" />
-    <option name="compatibility:include-filter" value="CtsTextTestCases" />
-    <option name="compatibility:include-filter" value="CtsToastTestCases" />
-    <option name="compatibility:include-filter" value="CtsTransitionTestCases" />
-    <option name="compatibility:include-filter" value="CtsTvProviderTestCases" />
-    <option name="compatibility:include-filter" value="CtsUiDeviceTestCases" />
-    <option name="compatibility:include-filter" value="CtsUsbTests" />
-    <option name="compatibility:include-filter" value="CtsVoiceInteractionTestCases" />
-    <option name="compatibility:include-filter" value="CtsVrTestCases" />
-    <option name="compatibility:include-filter" value="CtsWifiBroadcastsHostTestCases" />
-    <option name="compatibility:include-filter" value="CtsWrapWrapDebugMallocDebugTestCases" />
-    <option name="compatibility:include-filter" value="CtsWrapWrapDebugTestCases" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts-virtual-device.xml b/tools/cts-tradefed/res/config/cts-virtual-device.xml
deleted file mode 100644
index 697ee2f..0000000
--- a/tools/cts-tradefed/res/config/cts-virtual-device.xml
+++ /dev/null
@@ -1,36 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Runs CTS with common options set for an automated run on userdebug/eng builds, and per module rules suitable for virtual devices">
-
-    <include name="cts-automated" />
-
-    <!-- Tell all AndroidJUnitTests to exclude certain annotations -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.support.test.filters.RequiresDevice" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:androidx.test.filters.RequiresDevice" />
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:exclude-annotation:android.platform.test.annotations.RequiresDevice" />
-
-    <!-- Tell all HostTests to exclude certain annotations -->
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.HostTest:exclude-annotation:android.platform.test.annotations.RequiresDevice" />
-    <option name="compatibility:test-arg" value="com.android.compatibility.common.tradefed.testtype.JarHostTest:exclude-annotation:android.platform.test.annotations.RequiresDevice" />
-
-    <!-- add per module rules for virtual devices below -->
-    <option name="compatibility:module-arg" value="CtsDeqpTestCases:include-filter:dEQP-GLES2.functional.prerequisite#*" />
-    <option name="compatibility:module-arg" value="CtsDeqpTestCases:include-filter:dEQP-EGL.*" />
-    <option name="compatibility:module-arg" value="CtsLibcoreTestCases:core-expectation:/virtualdeviceknownfailures.txt" />
-
-    <!-- Virtual devices usually run as root -->
-    <option name="compatibility:skip-system-status-check" value="com.android.tradefed.suite.checker.ShellStatusChecker" />
-</configuration>
diff --git a/tools/cts-tradefed/res/config/cts.xml b/tools/cts-tradefed/res/config/cts.xml
deleted file mode 100644
index bc5c447..0000000
--- a/tools/cts-tradefed/res/config/cts.xml
+++ /dev/null
@@ -1,24 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2015 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.
--->
-<configuration description="Runs CTS from a pre-existing CTS installation">
-
-    <include name="cts-common" />
-    <include name="cts-exclude" />
-    <include name="cts-exclude-instant" />
-
-    <option name="plan" value="cts" />
-
-</configuration>
diff --git a/tools/cts-tradefed/res/config/retry.xml b/tools/cts-tradefed/res/config/retry.xml
deleted file mode 100644
index 0a01dc3..0000000
--- a/tools/cts-tradefed/res/config/retry.xml
+++ /dev/null
@@ -1,23 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- Copyright (C) 2018 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.
--->
-<configuration description="Runs a retry of a previous CTS session.">
-    <object type="previous_loader" class="com.android.compatibility.common.tradefed.result.suite.PreviousResultLoader" />
-    <test class="com.android.tradefed.testtype.suite.retry.RetryRescheduler" />
-
-    <logger class="com.android.tradefed.log.FileLogger">
-        <option name="log-level-display" value="WARN" />
-    </logger>
-</configuration>
diff --git a/tools/cts-tradefed/res/config/security-bulletin.xml b/tools/cts-tradefed/res/config/security-bulletin.xml
deleted file mode 100644
index 02175a9..0000000
--- a/tools/cts-tradefed/res/config/security-bulletin.xml
+++ /dev/null
@@ -1,31 +0,0 @@
-<?xml version="1.0" encoding="utf-8"?>
-<!-- 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.
--->
-<configuration description="Runs Security Patch test cases">
-
-    <option name="plan" value="security-bulletin" />
-
-    <include name="cts"/>
-
-    <option name="compatibility:include-filter" value="CtsSecurityTestCases" />
-
-    <option name="compatibility:include-filter" value="CtsSecurityHostTestCases" />
-
-    <!-- Only run tests with @SecurityTest annotation. -->
-    <option name="compatibility:module-arg" value="CtsSecurityHostTestCases:include-annotation:android.platform.test.annotations.SecurityTest"/>
-
-    <option name="compatibility:test-arg" value="com.android.tradefed.testtype.AndroidJUnitTest:include-annotation:android.platform.test.annotations.SecurityTest" />
-
-</configuration>
diff --git a/tools/cts-tradefed/tests/Android.bp b/tools/cts-tradefed/tests/Android.bp
deleted file mode 100644
index 0d0bcea..0000000
--- a/tools/cts-tradefed/tests/Android.bp
+++ /dev/null
@@ -1,26 +0,0 @@
-// Copyright (C) 2015 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.
-
-java_library_host {
-    name: "cts-tradefed-tests",
-
-    srcs: ["src/**/*.java"],
-
-    libs: [
-        "tradefed",
-        "cts-tradefed",
-    ],
-    // We ship the Deqp Runner tests with the CTS one to validate them.
-    static_libs: ["CtsDeqpRunnerTests"],
-}
diff --git a/tools/cts-tradefed/tests/run_cts_tests.sh b/tools/cts-tradefed/tests/run_cts_tests.sh
deleted file mode 100755
index 428b9ec..0000000
--- a/tools/cts-tradefed/tests/run_cts_tests.sh
+++ /dev/null
@@ -1,28 +0,0 @@
-#!/bin/bash
-
-# Copyright (C) 2018 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.
-
-# A simple helper script that runs the CTS harness unit tests
-
-CTS_DIR=`dirname $0`/../etc
-
-${CTS_DIR}/cts-tradefed run singleCommand host -n \
-  --console-result-reporter:suppress-passed-tests \
-  --class com.android.compatibility.common.tradefed.UnitTests \
-  --class com.android.compatibility.common.util.HostUnitTests \
-  --class com.android.compatibility.common.util.UnitTests \
-  --class com.android.compatibility.tradefed.CtsTradefedTest \
-  --class com.drawelements.deqp.runner.DeqpTestRunnerTest \
-  "$@"
diff --git a/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java b/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java
deleted file mode 100644
index 5d5df59..0000000
--- a/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java
+++ /dev/null
@@ -1,73 +0,0 @@
-/*
- * Copyright (C) 2015 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.compatibility.tradefed;
-
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
-import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
-import com.android.tradefed.build.IBuildInfo;
-import com.android.tradefed.config.OptionSetter;
-import com.android.tradefed.util.FileUtil;
-
-import junit.framework.TestCase;
-
-import java.io.File;
-
-/**
- * Tests for cts-tradefed.
- */
-public class CtsTradefedTest extends TestCase {
-
-    private static final String PROPERTY_NAME = "CTS_ROOT";
-    private static final String SUITE_FULL_NAME = "Compatibility Test Suite";
-    private static final String SUITE_NAME = "CTS";
-    private static final String SUITE_PLAN = "cts";
-    private static final String DYNAMIC_CONFIG_URL = "";
-
-    private String mOriginalProperty = null;
-
-    @Override
-    protected void setUp() throws Exception {
-        super.setUp();
-        mOriginalProperty = System.getProperty(PROPERTY_NAME);
-    }
-
-    @Override
-    protected void tearDown() throws Exception {
-        if (mOriginalProperty != null) {
-            System.setProperty(PROPERTY_NAME, mOriginalProperty);
-        }
-        super.tearDown();
-    }
-
-    public void testSuiteInfoLoad() throws Exception {
-        // Test the values in the manifest can be loaded
-        File root = FileUtil.createTempDir("root");
-        System.setProperty(PROPERTY_NAME, root.getAbsolutePath());
-        File base = new File(root, "android-cts");
-        base.mkdirs();
-        File tests = new File(base, "testcases");
-        tests.mkdirs();
-        CompatibilityBuildProvider provider = new CompatibilityBuildProvider();
-        OptionSetter setter = new OptionSetter(provider);
-        setter.setOptionValue("plan", SUITE_PLAN);
-        setter.setOptionValue("dynamic-config-url", DYNAMIC_CONFIG_URL);
-        IBuildInfo info = provider.getBuild();
-        CompatibilityBuildHelper helper = new CompatibilityBuildHelper(info);
-        assertEquals("Incorrect suite full name", SUITE_FULL_NAME, helper.getSuiteFullName());
-        assertEquals("Incorrect suite name", SUITE_NAME, helper.getSuiteName());
-        FileUtil.recursiveDelete(root);
-    }
-}
