diff --git a/build/compatibility_test_suite.mk b/build/compatibility_test_suite.mk
new file mode 100644
index 0000000..6430efa
--- /dev/null
+++ b/build/compatibility_test_suite.mk
@@ -0,0 +1,51 @@
+# 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.
+
+#
+# Builds a compatibility test suite.
+#
+
+# Generate the SuiteInfo.java
+suite_info_java := $(call intermediates-dir-for,JAVA_LIBRARIES,$(LOCAL_MODULE),true,COMMON)/com/android/compatibility/SuiteInfo.java
+$(suite_info_java): PRIVATE_SUITE_BUILD_NUMBER := $(LOCAL_SUITE_BUILD_NUMBER)
+$(suite_info_java): PRIVATE_SUITE_NAME := $(LOCAL_SUITE_NAME)
+$(suite_info_java): PRIVATE_SUITE_FULLNAME := $(LOCAL_SUITE_FULLNAME)
+$(suite_info_java): PRIVATE_SUITE_VERSION := $(LOCAL_SUITE_VERSION)
+$(suite_info_java): cts/build/compatibility_test_suite.mk $(LOCAL_MODULE_MAKEFILE)
+	@echo Generating: $@
+	$(hide) mkdir -p $(dir $@)
+	$(hide) echo "/* This file is auto generated by Android.mk.  Do not modify. */" > $@
+	$(hide) echo "package com.android.compatibility;" >> $@
+	$(hide) echo "public class SuiteInfo {" >> $@
+	$(hide) echo "    public static final String BUILD_NUMBER = \"$(PRIVATE_SUITE_BUILD_NUMBER)\";" >> $@
+	$(hide) echo "    public static final String NAME = \"$(PRIVATE_SUITE_NAME)\";" >> $@
+	$(hide) echo "    public static final String FULLNAME = \"$(PRIVATE_SUITE_FULLNAME)\";" >> $@
+	$(hide) echo "    public static final String VERSION = \"$(PRIVATE_SUITE_VERSION)\";" >> $@
+	$(hide) echo "}" >> $@
+
+# Reset variables
+LOCAL_SUITE_BUILD_NUMBER :=
+LOCAL_SUITE_NAME :=
+LOCAL_SUITE_FULLNAME :=
+LOCAL_SUITE_VERSION :=
+
+# Include the SuiteInfo.java
+LOCAL_GENERATED_SOURCES := $(suite_info_java)
+
+# Add the base libraries
+LOCAL_JAVA_LIBRARIES += tradefed-prebuilt hosttestlib compatibility-host-util
+
+LOCAL_MODULE_TAGS := optional
+
+include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/build/config.mk b/build/config.mk
index cded802..eae7c00 100644
--- a/build/config.mk
+++ b/build/config.mk
@@ -40,6 +40,7 @@
 CTS_MODULE_TEST_CONFIG := AndroidTest.xml
 
 # CTS build rules
+BUILD_COMPATIBILITY_SUITE := cts/build/compatibility_test_suite.mk
 BUILD_CTS_EXECUTABLE := cts/build/test_executable.mk
 BUILD_CTS_PACKAGE := cts/build/test_package.mk
 BUILD_CTS_GTEST_PACKAGE := cts/build/test_gtest_package.mk
diff --git a/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivityTest.java b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivityTest.java
index fb1062a..5b834c7 100644
--- a/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivityTest.java
+++ b/common/device-side/device-info/tests/src/com/android/compatibility/common/deviceinfo/DeviceInfoActivityTest.java
@@ -54,7 +54,7 @@
     public void testJsonFile() throws IOException {
         String errorMessage = mActivity.getErrorMessage();
         // Check no errors
-        assertNull("Expected no errors", errorMessage);
+        assertEquals("Expected no errors", null, errorMessage);
         String resultFilePath = mActivity.getResultFilePath();
         // Check file path exist
         assertNotNull("Expected a non-null resultFilePath", resultFilePath);
diff --git a/common/host-side/tradefed/Android.mk b/common/host-side/tradefed/Android.mk
index 9faabed..3ed225ed 100644
--- a/common/host-side/tradefed/Android.mk
+++ b/common/host-side/tradefed/Android.mk
@@ -1,4 +1,4 @@
-# Copyright (C) 2014 The Android Open Source Project
+# 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.
@@ -12,20 +12,4 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-LOCAL_PATH := $(call my-dir)
-
-include $(CLEAR_VARS)
-
-LOCAL_SRC_FILES := $(call all-java-files-under, src)
-
-LOCAL_JAVA_RESOURCE_DIRS := res
-
-LOCAL_MODULE := compatibility-tradefed
-
-LOCAL_MODULE_TAGS := optional
-
-LOCAL_JAVA_LIBRARIES := tradefed-prebuilt hosttestlib compatibility-host-util
-
-include $(BUILD_HOST_JAVA_LIBRARY)
-
-include $(call all-makefiles-under,$(LOCAL_PATH))
\ No newline at end of file
+include $(call all-subdir-makefiles)
\ No newline at end of file
diff --git a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelper.java b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelper.java
index 4af16bb..39a5ca6 100644
--- a/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelper.java
+++ b/common/host-side/tradefed/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelper.java
@@ -15,6 +15,7 @@
  */
 package com.android.compatibility.common.tradefed.build;
 
+import com.android.compatibility.SuiteInfo;
 import com.android.tradefed.build.IFolderBuildInfo;
 
 import java.io.File;
@@ -54,22 +55,20 @@
             return;
         }
         mInitialized = true;
-        Package pkg = Package.getPackage("com.android.compatibility.tradefed.command");
-        String suiteFullName = pkg.getSpecificationTitle();
-        String suiteName = pkg.getSpecificationVendor();
-        String suiteVersion = pkg.getSpecificationVersion();
-        String suiteBuild = pkg.getImplementationVersion();
-        mBuildInfo.addBuildAttribute(SUITE_BUILD, suiteBuild);
-        mBuildInfo.addBuildAttribute(SUITE_NAME, suiteName);
-        mBuildInfo.addBuildAttribute(SUITE_FULL_NAME, suiteFullName);
-        mBuildInfo.addBuildAttribute(SUITE_VERSION, suiteVersion);
+        mBuildInfo.addBuildAttribute(SUITE_BUILD, SuiteInfo.BUILD_NUMBER);
+        mBuildInfo.addBuildAttribute(SUITE_NAME, SuiteInfo.NAME);
+        mBuildInfo.addBuildAttribute(SUITE_FULL_NAME, SuiteInfo.FULLNAME);
+        mBuildInfo.addBuildAttribute(SUITE_VERSION, SuiteInfo.VERSION);
         mBuildInfo.addBuildAttribute(SUITE_PLAN, suitePlan);
-        String mRootDirPath = System.getProperty(String.format("%s_ROOT", suiteName));
+        String mRootDirPath = System.getProperty(String.format("%s_ROOT", SuiteInfo.NAME));
         if (mRootDirPath == null || mRootDirPath.trim().equals("")) {
-            mRootDirPath = mBuildInfo.getRootDir().getAbsolutePath();
-            if (mRootDirPath == null || mRootDirPath.equals("")) {
+            File root = mBuildInfo.getRootDir();
+            if (root != null) {
+                mRootDirPath = root.getAbsolutePath();
+            }
+            if (mRootDirPath == null || mRootDirPath.trim().equals("")) {
                 throw new IllegalArgumentException(
-                        String.format("Missing install path property %s_ROOT", suiteName));
+                        String.format("Missing install path property %s_ROOT", SuiteInfo.NAME));
             }
         }
         File rootDir = new File(mRootDirPath);
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 099fdeb..95fc891 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
@@ -15,6 +15,7 @@
  */
 package com.android.compatibility.common.tradefed.command;
 
+import com.android.compatibility.SuiteInfo;
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
 import com.android.compatibility.common.tradefed.result.IInvocationResultRepo;
@@ -24,6 +25,7 @@
 import com.android.compatibility.common.util.TestStatus;
 import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.command.Console;
+import com.android.tradefed.config.ConfigurationException;
 import com.android.tradefed.util.ArrayUtil;
 import com.android.tradefed.util.FileUtil;
 import com.android.tradefed.util.RegexTrie;
@@ -32,7 +34,6 @@
 
 import java.io.File;
 import java.io.FileNotFoundException;
-import java.io.IOException;
 import java.io.PrintWriter;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -43,18 +44,17 @@
 /**
  * An extension of Tradefed's console which adds features specific to compatibility testing.
  */
-public abstract class CompatibilityConsole extends Console {
+public class CompatibilityConsole extends Console {
 
-    private CompatibilityBuildHelper mBuildHelper = null;
+    private CompatibilityBuildHelper mBuildHelper;
 
     /**
      * {@inheritDoc}
      */
     @Override
     public void run() {
-        CompatibilityBuildHelper buildHelper = getCompatibilityBuildHelper();
-        printLine(String.format("Android %s %s (%s)", buildHelper.getSuiteName(),
-                buildHelper.getSuiteVersion(), buildHelper.getSuiteBuild()));
+        printLine(String.format("Android %s %s (%s)", SuiteInfo.FULLNAME, SuiteInfo.VERSION,
+                SuiteInfo.BUILD_NUMBER));
         super.run();
     }
 
@@ -67,28 +67,19 @@
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CompatibilityBuildHelper buildHelper = getCompatibilityBuildHelper();
-                if (buildHelper != null) {
-                    // TODO(stuartscott)" listPlans(buildHelper);
-                }
+                // TODO(stuartscott)" listPlans(buildHelper);
             }
         }, LIST_PATTERN, "p(?:lans)?");
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CompatibilityBuildHelper buildHelper = getCompatibilityBuildHelper();
-                if (buildHelper != null) {
-                    listModules(buildHelper);
-                }
+                listModules();
             }
         }, LIST_PATTERN, "m(?:odules)?");
         trie.put(new Runnable() {
             @Override
             public void run() {
-                CompatibilityBuildHelper buildHelper = getCompatibilityBuildHelper();
-                if (buildHelper != null) {
-                    listResults(buildHelper);
-                }
+                listResults();
             }
         }, LIST_PATTERN, "r(?:esults)?");
 
@@ -110,8 +101,7 @@
      */
     @Override
     protected String getConsolePrompt() {
-        return String.format("%s-tf > ",
-                getCompatibilityBuildHelper().getSuiteName().toLowerCase());
+        return String.format("%s-tf > ", SuiteInfo.NAME.toLowerCase());
     }
 
     /**
@@ -119,11 +109,10 @@
      */
     @Override
     protected String getGenericHelpString(List<String> genericHelp) {
-        CompatibilityBuildHelper buildHelper = getCompatibilityBuildHelper();
         StringBuilder helpBuilder = new StringBuilder();
-        helpBuilder.append(buildHelper.getSuiteFullName());
+        helpBuilder.append(SuiteInfo.FULLNAME);
         helpBuilder.append("\n\n");
-        helpBuilder.append(buildHelper.getSuiteName());
+        helpBuilder.append(SuiteInfo.NAME);
         helpBuilder.append(" is the test harness for running the Android Compatibility Suite, ");
         helpBuilder.append("built on top of Trade Federation.\n\n");
         helpBuilder.append("Available commands and options\n");
@@ -152,7 +141,7 @@
         helpBuilder.append("independent chunks, to run on multiple devices in parallel\n");
         helpBuilder.append(runPrompt);
         helpBuilder.append("--help/--help-all: get help for ");
-        helpBuilder.append(buildHelper.getSuiteFullName());
+        helpBuilder.append(SuiteInfo.FULLNAME);
         helpBuilder.append("\n");
         helpBuilder.append("List:\n");
         helpBuilder.append("  l/list d/devices: list connected devices and their state\n");
@@ -170,10 +159,10 @@
         return helpBuilder.toString();
     }
 
-    private void listModules(CompatibilityBuildHelper buildHelper) {
+    private void listModules() {
         File[] files = null;
         try {
-            files = buildHelper.getTestsDir().listFiles(new ModuleRepo.ConfigFilter());
+            files = getBuildHelper().getTestsDir().listFiles(new ModuleRepo.ConfigFilter());
         } catch (FileNotFoundException e) {
             printLine(e.getMessage());
             e.printStackTrace();
@@ -192,7 +181,7 @@
         }
     }
 
-    private void listResults(CompatibilityBuildHelper buildHelper) {
+    private void listResults() {
         TableFormatter tableFormatter = new TableFormatter();
         List<List<String>> table = new ArrayList<>();
         table.add(Arrays.asList("Session","Pass", "Fail", "Not Executed", "Start Time", "Test Plan",
@@ -200,7 +189,7 @@
         IInvocationResultRepo testResultRepo = null;
         List<IInvocationResult> results = null;
         try {
-            testResultRepo = new InvocationResultRepo(buildHelper.getResultsDir());
+            testResultRepo = new InvocationResultRepo(getBuildHelper().getResultsDir());
             results = testResultRepo.getResults();
         } catch (FileNotFoundException e) {
             printLine(e.getMessage());
@@ -223,20 +212,18 @@
         }
     }
 
-    public CompatibilityBuildHelper getCompatibilityBuildHelper() {
+    private CompatibilityBuildHelper getBuildHelper() {
         if (mBuildHelper == null) {
             CompatibilityBuildProvider buildProvider = new CompatibilityBuildProvider();
             IFolderBuildInfo buildInfo = (IFolderBuildInfo) buildProvider.getBuild();
-            try {
-                File file = File.createTempFile("root", "tmp");
-                file.deleteOnExit();
-                buildInfo.setRootDir(file);
-            } catch (IOException e) {
-                e.printStackTrace();
-            }
             mBuildHelper = new CompatibilityBuildHelper(buildInfo);
-            mBuildHelper.init(""/* plan */, ""/* dynamic config url */);
+            mBuildHelper.init("" /* suite plan */, "" /* dynamic config url */);
         }
         return mBuildHelper;
     }
+
+    public static void main(String[] args) throws InterruptedException, ConfigurationException {
+        Console console = new CompatibilityConsole();
+        Console.startConsole(console, args);
+    }
 }
diff --git a/common/host-side/tradefed/tests/Android.mk b/common/host-side/tradefed/tests/Android.mk
index 959aff5..b07fa1e 100644
--- a/common/host-side/tradefed/tests/Android.mk
+++ b/common/host-side/tradefed/tests/Android.mk
@@ -12,18 +12,32 @@
 # See the License for the specific language governing permissions and
 # limitations under the License.
 
-LOCAL_PATH:= $(call my-dir)
+# Make a mock compatibility suite to test
+LOCAL_PATH := $(call my-dir)
 
 include $(CLEAR_VARS)
 
+LOCAL_SRC_FILES := $(call all-java-files-under, ../src)
+LOCAL_JAVA_RESOURCE_DIRS := ../res
+
+LOCAL_SUITE_BUILD_NUMBER := 2
+LOCAL_SUITE_NAME := TESTS
+LOCAL_SUITE_FULLNAME := "Compatibility Tests"
+LOCAL_SUITE_VERSION := 1
+
+LOCAL_MODULE := compatibility-mock-tradefed
+
+include $(BUILD_COMPATIBILITY_SUITE)
+
+# Make the tests
+include $(CLEAR_VARS)
+
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_MODULE := compatibility-tradefed-tests
 
-LOCAL_JAR_MANIFEST := MANIFEST.mf
-
 LOCAL_MODULE_TAGS := optional
 
-LOCAL_JAVA_LIBRARIES := tradefed-prebuilt compatibility-tradefed junit compatibility-host-util
+LOCAL_JAVA_LIBRARIES := tradefed-prebuilt compatibility-mock-tradefed junit compatibility-host-util
 
 include $(BUILD_HOST_JAVA_LIBRARY)
diff --git a/common/host-side/tradefed/tests/MANIFEST.mf b/common/host-side/tradefed/tests/MANIFEST.mf
deleted file mode 100644
index 017dc9f..0000000
--- a/common/host-side/tradefed/tests/MANIFEST.mf
+++ /dev/null
@@ -1,6 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: com.android.compatibility.tradefed.command.MockConsole
-Specification-Title: Compatibility Tests
-Specification-Vendor: TESTS
-Specification-Version: 1
-Implementation-Version: 2
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
new file mode 100644
index 0000000..588936a
--- /dev/null
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/UnitTests.java
@@ -0,0 +1,48 @@
+/*
+ * 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;
+
+import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelperTest;
+import com.android.compatibility.common.tradefed.command.CompatibilityConsoleTest;
+import com.android.compatibility.common.tradefed.result.ResultReporterTest;
+import com.android.compatibility.common.tradefed.testtype.CompatibilityTestTest;
+import com.android.compatibility.common.tradefed.testtype.ModuleDefTest;
+import com.android.compatibility.common.tradefed.testtype.ModuleRepoTest;
+
+import junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * A test suite for all compatibility tradefed unit tests.
+ * <p/>
+ * All tests listed here should be self-contained, and do not require any external dependencies.
+ */
+public class UnitTests extends TestSuite {
+
+    public UnitTests() {
+        super();
+        addTestSuite(CompatibilityBuildHelperTest.class);
+        addTestSuite(CompatibilityConsoleTest.class);
+        addTestSuite(ResultReporterTest.class);
+        addTestSuite(CompatibilityTestTest.class);
+        addTestSuite(ModuleDefTest.class);
+        addTestSuite(ModuleRepoTest.class);
+    }
+
+    public static Test suite() {
+        return new UnitTests();
+    }
+}
\ No newline at end of file
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelperTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelperTest.java
index 897514e..99847f5 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelperTest.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/build/CompatibilityBuildHelperTest.java
@@ -16,7 +16,6 @@
 
 package com.android.compatibility.common.tradefed.build;
 
-import com.android.compatibility.tradefed.command.MockConsole;
 import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.util.FileUtil;
 
@@ -28,7 +27,7 @@
 public class CompatibilityBuildHelperTest extends TestCase {
 
     private static final String ROOT_PROPERTY = "TESTS_ROOT";
-    private static final String BUILD_ID = "2";
+    private static final String BUILD_NUMBER = "2";
     private static final String SUITE_NAME = "TESTS";
     private static final String SUITE_FULL_NAME = "Compatibility Tests";
     private static final String SUITE_VERSION = "1";
@@ -38,10 +37,6 @@
     private static final String BASE_DIR_NAME = "android-tests";
     private static final String TESTCASES = "testcases";
 
-    // Make sure the mock is in the ClassLoader
-    @SuppressWarnings("unused")
-    private MockConsole mMockConsole;
-
     private File mRoot = null;
     private File mBase = null;
     private File mTests = null;
@@ -50,7 +45,6 @@
 
     @Override
     public void setUp() throws Exception {
-        mMockConsole = new MockConsole();
         mRoot = FileUtil.createTempDir(ROOT_DIR_NAME);
         CompatibilityBuildProvider provider = new CompatibilityBuildProvider();
         mBuild = (IFolderBuildInfo) provider.getBuild();
@@ -60,7 +54,6 @@
     @Override
     public void tearDown() throws Exception {
         setProperty(null);
-        mMockConsole = null;
         FileUtil.recursiveDelete(mRoot);
         mRoot = null;
         mBase = null;
@@ -74,10 +67,10 @@
         mTests.mkdirs();
     }
 
-    public void testManifestLoad() throws Exception {
+    public void testSuiteInfoLoad() throws Exception {
         setProperty(mRoot.getAbsolutePath());
         mHelper.init(SUITE_PLAN, DYNAMIC_CONFIG_URL);
-        assertEquals("Incorrect suite build id", BUILD_ID, mHelper.getSuiteBuild());
+        assertEquals("Incorrect suite build number", BUILD_NUMBER, mHelper.getSuiteBuild());
         assertEquals("Incorrect suite name", SUITE_NAME, mHelper.getSuiteName());
         assertEquals("Incorrect suite full name", SUITE_FULL_NAME, mHelper.getSuiteFullName());
         assertEquals("Incorrect suite version", SUITE_VERSION, mHelper.getSuiteVersion());
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/command/CompatibilityConsoleTest.java b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/command/CompatibilityConsoleTest.java
index af57215..55c1651 100644
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/command/CompatibilityConsoleTest.java
+++ b/common/host-side/tradefed/tests/src/com/android/compatibility/common/tradefed/command/CompatibilityConsoleTest.java
@@ -17,26 +17,19 @@
 package com.android.compatibility.common.tradefed.command;
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelperTest;
-import com.android.compatibility.tradefed.command.MockConsole;
 
 import junit.framework.TestCase;
 
 public class CompatibilityConsoleTest extends TestCase {
 
-    // Make sure the mock is in the ClassLoader
-    @SuppressWarnings("unused")
-    private MockConsole mMockConsole;
-
     @Override
     public void setUp() throws Exception {
         CompatibilityBuildHelperTest.setProperty("/tmp/foobar");
-        mMockConsole = new MockConsole();
     }
 
     @Override
     public void tearDown() throws Exception {
         CompatibilityBuildHelperTest.setProperty(null);
-        mMockConsole = null;
     }
 
     public void testHelpExists() throws Exception {
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
index 0b9bf92..989e255 100644
--- 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
@@ -23,7 +23,6 @@
 import com.android.compatibility.common.util.IModuleResult;
 import com.android.compatibility.common.util.ITestResult;
 import com.android.compatibility.common.util.TestStatus;
-import com.android.compatibility.tradefed.command.MockConsole;
 import com.android.ddmlib.testrunner.TestIdentifier;
 import com.android.tradefed.build.FolderBuildInfo;
 import com.android.tradefed.build.IFolderBuildInfo;
@@ -39,7 +38,7 @@
 public class ResultReporterTest extends TestCase {
 
     private static final String ROOT_PROPERTY = "TESTS_ROOT";
-    private static final String BUILD_ID = "2";
+    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";
@@ -65,10 +64,6 @@
         "logo.png",
         "newrule-green.png"};
 
-    // Make sure the mock is in the ClassLoader
-    @SuppressWarnings("unused")
-    private MockConsole mMockConsole;
-
     private ResultReporter mReporter;
     private IFolderBuildInfo mBuildInfo;
     private CompatibilityBuildHelper mBuildHelper;
@@ -79,7 +74,6 @@
 
     @Override
     public void setUp() throws Exception {
-        mMockConsole = new MockConsole();
         mReporter = new ResultReporter();
         mRoot = FileUtil.createTempDir(ROOT_DIR_NAME);
         mBase = new File(mRoot, BASE_DIR_NAME);
@@ -87,14 +81,13 @@
         mTests = new File(mBase, TESTCASES);
         mTests.mkdirs();
         System.setProperty(ROOT_PROPERTY, mRoot.getAbsolutePath());
-        mBuildInfo = new FolderBuildInfo(BUILD_ID, "", "");
+        mBuildInfo = new FolderBuildInfo(BUILD_NUMBER, "", "");
         mBuildHelper = new CompatibilityBuildHelper(mBuildInfo);
         mBuildHelper.init(SUITE_PLAN, DYNAMIC_CONFIG_URL);
     }
 
     @Override
     public void tearDown() throws Exception {
-        mMockConsole = null;
         mReporter = null;
         FileUtil.recursiveDelete(mRoot);
     }
diff --git a/common/host-side/tradefed/tests/src/com/android/compatibility/tradefed/command/MockConsole.java b/common/host-side/tradefed/tests/src/com/android/compatibility/tradefed/command/MockConsole.java
deleted file mode 100644
index 20fab72..0000000
--- a/common/host-side/tradefed/tests/src/com/android/compatibility/tradefed/command/MockConsole.java
+++ /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.
- */
-package com.android.compatibility.tradefed.command;
-
-/**
- * This console is not used for any purpose other than creating the package name space from which
- * the suite-specific values in the MANIFEST.mf can be read; replicating what a test suite.
- */
-public class MockConsole {
-
-}
diff --git a/common/host-side/util/tests/src/com/android/compatibility/common/util/HostUnitTests.java b/common/host-side/util/tests/src/com/android/compatibility/common/util/HostUnitTests.java
new file mode 100644
index 0000000..8cf1e3f
--- /dev/null
+++ b/common/host-side/util/tests/src/com/android/compatibility/common/util/HostUnitTests.java
@@ -0,0 +1,37 @@
+/*
+ * 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 junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * A test suite for all host util unit tests.
+ * <p/>
+ * All tests listed here should be self-contained, and do not require any external dependencies.
+ */
+public class HostUnitTests extends TestSuite {
+
+    public HostUnitTests() {
+        super();
+        addTestSuite(DynamicConfigHandlerTest.class);
+        addTestSuite(MetricsStoreTest.class);
+    }
+
+    public static Test suite() {
+        return new HostUnitTests();
+    }
+}
\ No newline at end of file
diff --git a/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java b/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
new file mode 100644
index 0000000..1d367fe
--- /dev/null
+++ b/common/util/tests/src/com/android/compatibility/common/util/UnitTests.java
@@ -0,0 +1,46 @@
+/*
+ * 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 junit.framework.Test;
+import junit.framework.TestSuite;
+
+/**
+ * A test suite for all util unit tests.
+ * <p/>
+ * All tests listed here should be self-contained, and do not require any external dependencies.
+ */
+public class UnitTests extends TestSuite {
+
+    public UnitTests() {
+        super();
+        addTestSuite(AbiUtilsTest.class);
+        addTestSuite(CaseResultTest.class);
+        addTestSuite(DynamicConfigTest.class);
+        addTestSuite(MetricsXmlSerializerTest.class);
+        addTestSuite(ModuleResultTest.class);
+        addTestSuite(MultipartFormTest.class);
+        addTestSuite(ReportLogTest.class);
+        addTestSuite(StatTest.class);
+        addTestSuite(TestFilterTest.class);
+        addTestSuite(TestResultTest.class);
+        addTestSuite(XmlResultHandlerTest.class);
+    }
+
+    public static Test suite() {
+        return new UnitTests();
+    }
+}
\ No newline at end of file
diff --git a/hostsidetests/sample/Android.mk b/hostsidetests/sample/Android.mk
index 644621d..8a76a8b 100644
--- a/hostsidetests/sample/Android.mk
+++ b/hostsidetests/sample/Android.mk
@@ -25,7 +25,7 @@
 
 LOCAL_MODULE := CtsSampleHostTestCases
 
-LOCAL_JAVA_LIBRARIES := compatibility-host-util compatibility-tradefed tradefed-prebuilt
+LOCAL_JAVA_LIBRARIES := compatibility-host-util cts-tradefed_v2 tradefed-prebuilt
 
 include $(BUILD_HOST_JAVA_LIBRARY)
 
diff --git a/run_unit_tests.sh b/run_unit_tests.sh
index d4b210e..b3dab1e 100755
--- a/run_unit_tests.sh
+++ b/run_unit_tests.sh
@@ -36,20 +36,13 @@
     fi;
 fi;
 
+############### Run the device side tests ###############
 JAR_DIR=${ANDROID_HOST_OUT}/framework
 JARS="
-    compatibility-common-util-hostsidelib\
-    compatibility-common-util-tests\
-    compatibility-host-util\
-    compatibility-host-util-tests\
-    compatibility-tradefed-tests\
-    compatibility-tradefed\
-    cts-tradefed-tests_v2\
-    cts-tradefed_v2\
     ddmlib-prebuilt\
     hosttestlib\
     tradefed-prebuilt"
-
+JAR_PATH=
 for JAR in $JARS; do
     checkFile ${JAR_DIR}/${JAR}.jar
     JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
@@ -65,25 +58,48 @@
 java $RDBG_FLAG -cp ${JAR_PATH} ${TF_CONSOLE} run singleCommand instrument --package ${COMMON_PACKAGE} --runner ${RUNNER}
 adb uninstall ${COMMON_PACKAGE}
 
+############### Run the host side tests ###############
+JARS="
+    compatibility-common-util-hostsidelib\
+    compatibility-common-util-tests\
+    compatibility-host-util\
+    compatibility-host-util-tests\
+    compatibility-mock-tradefed\
+    compatibility-tradefed-tests\
+    ddmlib-prebuilt\
+    hosttestlib\
+    tradefed-prebuilt"
+JAR_PATH=
+for JAR in $JARS; do
+    checkFile ${JAR_DIR}/${JAR}.jar
+    JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
+done
+
 TEST_CLASSES="
-    com.android.compatibility.common.tradefed.build.CompatibilityBuildHelperTest\
-    com.android.compatibility.common.tradefed.command.CompatibilityConsoleTest\
-    com.android.compatibility.common.tradefed.result.ResultReporterTest\
-    com.android.compatibility.common.tradefed.testtype.CompatibilityTestTest\
-    com.android.compatibility.common.tradefed.testtype.ModuleDefTest\
-    com.android.compatibility.common.tradefed.testtype.ModuleRepoTest\
-    com.android.compatibility.common.util.AbiUtilsTest\
-    com.android.compatibility.common.util.CaseResultTest\
-    com.android.compatibility.common.util.DynamicConfigTest\
-    com.android.compatibility.common.util.MetricsStoreTest\
-    com.android.compatibility.common.util.MetricsXmlSerializerTest\
-    com.android.compatibility.common.util.ModuleResultTest\
-    com.android.compatibility.common.util.MultipartFormTest\
-    com.android.compatibility.common.util.ReportLogTest\
-    com.android.compatibility.common.util.StatTest\
-    com.android.compatibility.common.util.TestFilterTest\
-    com.android.compatibility.common.util.TestResultTest\
-    com.android.compatibility.common.util.XmlResultHandlerTest\
+    com.android.compatibility.common.tradefed.UnitTests\
+    com.android.compatibility.common.util.HostUnitTests\
+    com.android.compatibility.common.util.UnitTests"
+
+for CLASS in ${TEST_CLASSES}; do
+    java $RDBG_FLAG -cp ${JAR_PATH} ${TF_CONSOLE} run singleCommand host -n --class ${CLASS} "$@"
+done
+
+############### Run the cts tests ###############
+JARS="
+    compatibility-common-util-hostsidelib\
+    compatibility-host-util\
+    cts-tradefed-tests_v2\
+    cts-tradefed_v2\
+    ddmlib-prebuilt\
+    hosttestlib\
+    tradefed-prebuilt"
+JAR_PATH=
+for JAR in $JARS; do
+    checkFile ${JAR_DIR}/${JAR}.jar
+    JAR_PATH=${JAR_PATH}:${JAR_DIR}/${JAR}.jar
+done
+
+TEST_CLASSES="
     com.android.compatibility.tradefed.CtsTradefedTest"
 
 for CLASS in ${TEST_CLASSES}; do
diff --git a/tools/cts-tradefed/Android.mk b/tools/cts-tradefed/Android.mk
index 1cf7599..ee54b65 100644
--- a/tools/cts-tradefed/Android.mk
+++ b/tools/cts-tradefed/Android.mk
@@ -17,18 +17,19 @@
 include $(CLEAR_VARS)
 
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
+LOCAL_SRC_FILES += $(call all-java-files-under, ../../common/host-side/tradefed/src)
 
 LOCAL_JAVA_RESOURCE_DIRS := res
+LOCAL_JAVA_RESOURCE_DIRS += ../../common/host-side/tradefed/res
 
-LOCAL_JAR_MANIFEST := MANIFEST.mf
+LOCAL_SUITE_BUILD_NUMBER := $(BUILD_NUMBER)
+LOCAL_SUITE_NAME := CTS_V2
+LOCAL_SUITE_FULLNAME := "Compatibility Test Suite"
+LOCAL_SUITE_VERSION := 5.0
 
 LOCAL_MODULE := cts-tradefed_v2
-LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := tradefed-prebuilt hosttestlib compatibility-tradefed
 
-LOCAL_ADDITIONAL_DEPENDENCIES := $(LOCAL_PATH)/Android.mk
-
-include $(BUILD_HOST_JAVA_LIBRARY)
+include $(BUILD_COMPATIBILITY_SUITE)
 
 # Build all sub-directories
 include $(call all-makefiles-under,$(LOCAL_PATH))
diff --git a/tools/cts-tradefed/MANIFEST.mf b/tools/cts-tradefed/MANIFEST.mf
deleted file mode 100644
index 5bac62a..0000000
--- a/tools/cts-tradefed/MANIFEST.mf
+++ /dev/null
@@ -1,6 +0,0 @@
-Manifest-Version: 1.0
-Main-Class: com.android.compatibility.tradefed.command.CtsConsole
-Specification-Title: Compatibility Test Suite
-Specification-Vendor: CTS_V2
-Specification-Version: 5.0_r1.91
-Implementation-Version: %BUILD_NUMBER%
diff --git a/tools/cts-tradefed/etc/cts-tradefed_v2 b/tools/cts-tradefed/etc/cts-tradefed_v2
index cccd4b9..e501e7f 100755
--- a/tools/cts-tradefed/etc/cts-tradefed_v2
+++ b/tools/cts-tradefed/etc/cts-tradefed_v2
@@ -82,7 +82,6 @@
 JARS="tradefed-prebuilt
   hosttestlib
   compatibility-host-util
-  compatibility-tradefed
   cts-tradefed_v2"
 
 for JAR in $JARS; do
@@ -105,5 +104,5 @@
 
 CLASS_PATH=${JAR_PATH}:${HOST_TEST_JAR_PATH}
 
-java $RDBG_FLAG -cp ${CLASS_PATH} -DCTS_V2_ROOT=${CTS_V2_ROOT} com.android.compatibility.tradefed.command.CtsConsole "$@"
+java $RDBG_FLAG -cp ${CLASS_PATH} -DCTS_V2_ROOT=${CTS_V2_ROOT} com.android.compatibility.common.tradefed.command.CompatibilityConsole "$@"
 
diff --git a/tools/cts-tradefed/src/com/android/compatibility/tradefed/command/CtsConsole.java b/tools/cts-tradefed/src/com/android/compatibility/tradefed/command/CtsConsole.java
deleted file mode 100644
index fcd9f94..0000000
--- a/tools/cts-tradefed/src/com/android/compatibility/tradefed/command/CtsConsole.java
+++ /dev/null
@@ -1,34 +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.command;
-
-import com.android.compatibility.common.tradefed.command.CompatibilityConsole;
-import com.android.tradefed.command.Console;
-import com.android.tradefed.config.ConfigurationException;
-
-/**
- * An extension of {@link CompatibilityConsole} for running CTS tests.
- *
- * This file mainly exists to provide package name space from which the suite-specific values in the
- * MANIFEST.mf can be read.
- */
-public class CtsConsole extends CompatibilityConsole {
-
-    public static void main(String[] args) throws InterruptedException, ConfigurationException {
-        Console console = new CtsConsole();
-        Console.startConsole(console, args);
-    }
-}
diff --git a/tools/cts-tradefed/tests/Android.mk b/tools/cts-tradefed/tests/Android.mk
index 454c9d6..7314fdb 100644
--- a/tools/cts-tradefed/tests/Android.mk
+++ b/tools/cts-tradefed/tests/Android.mk
@@ -16,11 +16,10 @@
 
 include $(CLEAR_VARS)
 
-# Only compile source java files in this lib.
 LOCAL_SRC_FILES := $(call all-java-files-under, src)
 
 LOCAL_MODULE := cts-tradefed-tests_v2
 LOCAL_MODULE_TAGS := optional
-LOCAL_JAVA_LIBRARIES := tradefed-prebuilt cts-tradefed_v2 compatibility-tradefed
+LOCAL_JAVA_LIBRARIES := tradefed-prebuilt cts-tradefed_v2
 
 include $(BUILD_HOST_JAVA_LIBRARY)
\ No newline at end of file
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
index db5d42f..2dcf1c9 100644
--- a/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java
+++ b/tools/cts-tradefed/tests/src/com/android/compatibility/tradefed/CtsTradefedTest.java
@@ -17,7 +17,6 @@
 
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildHelper;
 import com.android.compatibility.common.tradefed.build.CompatibilityBuildProvider;
-import com.android.compatibility.tradefed.command.CtsConsole;
 import com.android.tradefed.build.IFolderBuildInfo;
 import com.android.tradefed.util.FileUtil;
 
@@ -36,7 +35,7 @@
     private static final String SUITE_PLAN = "cts";
     private static final String DYNAMIC_CONFIG_URL = "";
 
-    public void testManifest() throws Exception {
+    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());
@@ -44,7 +43,6 @@
         base.mkdirs();
         File tests = new File(base, "testcases");
         tests.mkdirs();
-        CtsConsole c = new CtsConsole();
         CompatibilityBuildProvider provider = new CompatibilityBuildProvider();
         IFolderBuildInfo info = (IFolderBuildInfo) provider.getBuild();
         CompatibilityBuildHelper helper = new CompatibilityBuildHelper(info);
