diff --git a/test-base/Android.bp b/test-base/Android.bp
index 70a9540..d65a4e4 100644
--- a/test-base/Android.bp
+++ b/test-base/Android.bp
@@ -14,37 +14,22 @@
 // limitations under the License.
 //
 
+package {
+    default_applicable_licenses: ["Android-Apache-2.0"],
+}
+
 // Build the android.test.base library
 // ===================================
 // This contains the junit.framework and android.test classes that were in
 // Android API level 25 excluding those from android.test.runner.
 // Also contains the com.android.internal.util.Predicate[s] classes.
-package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "frameworks_base_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-Apache-2.0
-    //   SPDX-license-identifier-CPL-1.0
-    default_applicable_licenses: ["frameworks_base_test-base_license"],
-}
-
-license {
-    name: "frameworks_base_test-base_license",
-    visibility: [":__subpackages__"],
-    license_kinds: [
-        "SPDX-license-identifier-Apache-2.0",
-        "SPDX-license-identifier-CPL-1.0",
-    ],
-    license_text: [
-        "src/junit/cpl-v10.html",
-    ],
-}
-
 java_sdk_library {
     name: "android.test.base",
 
-    srcs: [":android-test-base-sources"],
+    srcs: [
+        ":android-test-base-sources",
+        ":frameworks-base-test-junit-framework",
+    ],
 
     errorprone: {
         javacflags: ["-Xep:DepAnn:ERROR"],
@@ -84,7 +69,10 @@
     ],
     installable: false,
 
-    srcs: [":android-test-base-sources"],
+    srcs: [
+        ":android-test-base-sources",
+        ":frameworks-base-test-junit-framework",
+    ],
 
     errorprone: {
         javacflags: ["-Xep:DepAnn:ERROR"],
@@ -104,8 +92,7 @@
     name: "android.test.base-minus-junit",
 
     srcs: [
-        "src/android/**/*.java",
-        "src/com/**/*.java",
+        "src/**/*.java",
     ],
 
     sdk_version: "current",
diff --git a/test-base/hiddenapi/Android.bp b/test-base/hiddenapi/Android.bp
index 1466590..4c59b10 100644
--- a/test-base/hiddenapi/Android.bp
+++ b/test-base/hiddenapi/Android.bp
@@ -15,12 +15,7 @@
 //
 
 package {
-    // See: http://go/android-license-faq
-    // A large-scale-change added 'default_applicable_licenses' to import
-    // all of the 'license_kinds' from "frameworks_base_license"
-    // to get the below license kinds:
-    //   SPDX-license-identifier-Apache-2.0
-    default_applicable_licenses: ["frameworks_base_license"],
+    default_applicable_licenses: ["Android-Apache-2.0"],
 }
 
 // Provided solely to contribute information about which hidden parts of the android.test.base
diff --git a/test-base/src/junit/MODULE_LICENSE_CPL b/test-base/src/junit/MODULE_LICENSE_CPL
deleted file mode 100644
index e69de29..0000000
--- a/test-base/src/junit/MODULE_LICENSE_CPL
+++ /dev/null
diff --git a/test-base/src/junit/README.android b/test-base/src/junit/README.android
deleted file mode 100644
index 1384a1f..0000000
--- a/test-base/src/junit/README.android
+++ /dev/null
@@ -1,11 +0,0 @@
-URL: https://github.com/junit-team/junit4
-License: Common Public License Version 1.0
-License File: cpl-v10.html
-
-This is JUnit 4.10 source that was previously part of the Android Public API.
-Where necessary it has been patched to be compatible (according to Android API
-requirements) with JUnit 3.8.
-
-These are copied here to ensure that the android.test.runner target remains
-compatible with the last version of the Android API (25) that contained these
-classes even when external/junit is upgraded to a later version.
diff --git a/test-base/src/junit/cpl-v10.html b/test-base/src/junit/cpl-v10.html
deleted file mode 100644
index 36aa208..0000000
--- a/test-base/src/junit/cpl-v10.html
+++ /dev/null
@@ -1,125 +0,0 @@
-<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0//EN">
-<HTML>
-<HEAD>
-<TITLE>Common Public License - v 1.0</TITLE>
-<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
-</HEAD>
-
-<BODY BGCOLOR="#FFFFFF" VLINK="#800000">
-
-
-<P ALIGN="CENTER"><B>Common Public License - v 1.0</B>
-<P><B></B><FONT SIZE="3"></FONT>
-<P><FONT SIZE="3"></FONT><FONT SIZE="2">THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT").  ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>1.  DEFINITIONS</B></FONT>
-<P><FONT SIZE="2">"Contribution" means:</FONT>
-
-<UL><FONT SIZE="2">a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and<BR CLEAR="LEFT">
-b) in the case of each subsequent Contributor:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	 	changes to the Program, and</FONT></UL>
-
-
-<UL><FONT SIZE="2">ii)		additions to the Program;</FONT></UL>
-
-
-<UL><FONT SIZE="2">where such changes and/or additions to the Program originate from and are distributed by that particular Contributor.  </FONT><FONT SIZE="2">A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf.  </FONT><FONT SIZE="2">Contributions do not include additions to the Program which:  (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Contributor" means any person or entity that distributes the Program.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.  </FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">"Program" means the Contributions distributed in accordance with this Agreement.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.</FONT>
-<P><FONT SIZE="2"><B></B></FONT>
-<P><FONT SIZE="2"><B>2.  GRANT OF RIGHTS</B></FONT>
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">a)	</FONT><FONT SIZE="2">Subject to the terms of this Agreement, each Contributor hereby grants</FONT><FONT SIZE="2"> Recipient a non-exclusive, worldwide, royalty-free copyright license to</FONT><FONT SIZE="2" COLOR="#FF0000"> </FONT><FONT SIZE="2">reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT><FONT SIZE="2">b) 	Subject to the terms of this Agreement, each Contributor hereby grants </FONT><FONT SIZE="2">Recipient a non-exclusive, worldwide,</FONT><FONT SIZE="2" COLOR="#008000"> </FONT><FONT SIZE="2">royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form.  This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents.  The patent license shall not apply to any other combinations which include the Contribution.  No hardware per se is licensed hereunder.   </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">c)	Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity.  Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise.  As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any.  For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.</FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-
-<UL><FONT SIZE="2">d)	Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement. </FONT></UL>
-
-
-<UL><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2"><B>3.  REQUIREMENTS</B></FONT>
-<P><FONT SIZE="2"><B></B>A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:</FONT>
-
-<UL><FONT SIZE="2">a)	it complies with the terms and conditions of this Agreement; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	its license agreement:</FONT></UL>
-
-
-<UL><FONT SIZE="2">i)	effectively disclaims</FONT><FONT SIZE="2"> on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose; </FONT></UL>
-
-
-<UL><FONT SIZE="2">ii) 	effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits; </FONT></UL>
-
-
-<UL><FONT SIZE="2">iii)</FONT><FONT SIZE="2">	states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and</FONT></UL>
-
-
-<UL><FONT SIZE="2">iv)	states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.</FONT><FONT SIZE="2" COLOR="#0000FF"> </FONT><FONT SIZE="2" COLOR="#FF0000"></FONT></UL>
-
-
-<UL><FONT SIZE="2" COLOR="#FF0000"></FONT><FONT SIZE="2"></FONT></UL>
-
-<P><FONT SIZE="2">When the Program is made available in source code form:</FONT>
-
-<UL><FONT SIZE="2">a)	it must be made available under this Agreement; and </FONT></UL>
-
-
-<UL><FONT SIZE="2">b)	a copy of this Agreement must be included with each copy of the Program.  </FONT></UL>
-
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"><STRIKE></STRIKE></FONT><FONT SIZE="2">Contributors may not remove or alter any copyright notices contained within the Program.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.  </FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>4.  COMMERCIAL DISTRIBUTION</B></FONT>
-<P><FONT SIZE="2">Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like.  While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors.   Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering.  The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement.  In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations.  The Indemnified Contributor may participate in any such claim at its own expense.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">For example, a Contributor might include the Program in a commercial product offering, Product X.  That Contributor is then a Commercial Contributor.  If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone.  Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2" COLOR="#0000FF"></FONT>
-<P><FONT SIZE="2" COLOR="#0000FF"></FONT><FONT SIZE="2"><B>5.  NO WARRANTY</B></FONT>
-<P><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is</FONT><FONT SIZE="2"> solely responsible for determining the appropriateness of using and distributing </FONT><FONT SIZE="2">the Program</FONT><FONT SIZE="2"> and assumes all risks associated with its exercise of rights under this Agreement</FONT><FONT SIZE="2">, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, </FONT><FONT SIZE="2">programs or equipment, and unavailability or interruption of operations</FONT><FONT SIZE="2">.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"><B>6.  DISCLAIMER OF LIABILITY</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES </FONT><FONT SIZE="2">(INCLUDING WITHOUT LIMITATION LOST PROFITS),</FONT><FONT SIZE="2"> HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"><B>7.  GENERAL</B></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed.  In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed. </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance.  If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable.  However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.  </FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2">Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted  and may only be modified in the following manner. The Agreement Steward reserves the right to </FONT><FONT SIZE="2">publish new versions (including revisions) of this Agreement from time to </FONT><FONT SIZE="2">time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward.   IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity.  </FONT><FONT SIZE="2">Each new version of the Agreement will be given a distinguishing version number.  The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new </FONT><FONT SIZE="2">version.  </FONT><FONT SIZE="2">Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, </FONT><FONT SIZE="2">by implication, estoppel or otherwise</FONT><FONT SIZE="2">.</FONT><FONT SIZE="2">  All rights in the Program not expressly granted under this Agreement are reserved.</FONT>
-<P><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2">This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose.  Each party waives its rights to a jury trial in any resulting litigation.</FONT>
-<P><FONT SIZE="2"></FONT><FONT SIZE="2"></FONT>
-<P><FONT SIZE="2"></FONT>
-
-</BODY>
-
-</HTML>
\ No newline at end of file
diff --git a/test-base/src/junit/framework/Assert.java b/test-base/src/junit/framework/Assert.java
deleted file mode 100644
index 3dcc23d..0000000
--- a/test-base/src/junit/framework/Assert.java
+++ /dev/null
@@ -1,296 +0,0 @@
-package junit.framework;
-
-/**
- * A set of assert methods.  Messages are only displayed when an assert fails.
- */
-
-public class Assert {
-	/**
-	 * Protect constructor since it is a static only class
-	 */
-	protected Assert() {
-	}
-
-	/**
-	 * Asserts that a condition is true. If it isn't it throws
-	 * an AssertionFailedError with the given message.
-	 */
-	static public void assertTrue(String message, boolean condition) {
-		if (!condition)
-			fail(message);
-	}
-	/**
-	 * Asserts that a condition is true. If it isn't it throws
-	 * an AssertionFailedError.
-	 */
-	static public void assertTrue(boolean condition) {
-		assertTrue(null, condition);
-	}
-	/**
-	 * Asserts that a condition is false. If it isn't it throws
-	 * an AssertionFailedError with the given message.
-	 */
-	static public void assertFalse(String message, boolean condition) {
-		assertTrue(message, !condition);
-	}
-	/**
-	 * Asserts that a condition is false. If it isn't it throws
-	 * an AssertionFailedError.
-	 */
-	static public void assertFalse(boolean condition) {
-		assertFalse(null, condition);
-	}
-	/**
-	 * Fails a test with the given message.
-	 */
-	static public void fail(String message) {
-		if (message == null) {
-			throw new AssertionFailedError();
-		}
-		throw new AssertionFailedError(message);
-	}
-	/**
-	 * Fails a test with no message.
-	 */
-	static public void fail() {
-		fail(null);
-	}
-	/**
-	 * Asserts that two objects are equal. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-	static public void assertEquals(String message, Object expected, Object actual) {
-		if (expected == null && actual == null)
-			return;
-		if (expected != null && expected.equals(actual))
-			return;
-		failNotEquals(message, expected, actual);
-	}
-	/**
-	 * Asserts that two objects are equal. If they are not
-	 * an AssertionFailedError is thrown.
-	 */
-	static public void assertEquals(Object expected, Object actual) {
-	    assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that two Strings are equal. 
-	 */
-	static public void assertEquals(String message, String expected, String actual) {
-		if (expected == null && actual == null)
-			return;
-		if (expected != null && expected.equals(actual))
-			return;
-		String cleanMessage= message == null ? "" : message;
-		throw new ComparisonFailure(cleanMessage, expected, actual);
-	}
-	/**
-	 * Asserts that two Strings are equal. 
-	 */
-	static public void assertEquals(String expected, String actual) {
-	    assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that two doubles are equal concerning a delta.  If they are not
-	 * an AssertionFailedError is thrown with the given message.  If the expected
-	 * value is infinity then the delta value is ignored.
-	 */
-	static public void assertEquals(String message, double expected, double actual, double delta) {
-		if (Double.compare(expected, actual) == 0)
-			return;
-		if (!(Math.abs(expected-actual) <= delta))
-			failNotEquals(message, new Double(expected), new Double(actual));
-	}
-	/**
-	 * Asserts that two doubles are equal concerning a delta. If the expected
-	 * value is infinity then the delta value is ignored.
-	 */
-	static public void assertEquals(double expected, double actual, double delta) {
-	    assertEquals(null, expected, actual, delta);
-	}
-	/**
-	 * Asserts that two floats are equal concerning a positive delta. If they
-	 * are not an AssertionFailedError is thrown with the given message. If the
-	 * expected value is infinity then the delta value is ignored.
-	 */
-	static public void assertEquals(String message, float expected, float actual, float delta) {
-		if (Float.compare(expected, actual) == 0)
-			return;
-		if (!(Math.abs(expected - actual) <= delta))
-				failNotEquals(message, new Float(expected), new Float(actual));
-	}
-	/**
-	 * Asserts that two floats are equal concerning a delta. If the expected
-	 * value is infinity then the delta value is ignored.
-	 */
-	static public void assertEquals(float expected, float actual, float delta) {
-		assertEquals(null, expected, actual, delta);
-	}
-	/**
-	 * Asserts that two longs are equal. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-	static public void assertEquals(String message, long expected, long actual) {
-	    assertEquals(message, new Long(expected), new Long(actual));
-	}
-	/**
-	 * Asserts that two longs are equal.
-	 */
-	static public void assertEquals(long expected, long actual) {
-	    assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that two booleans are equal. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-	static public void assertEquals(String message, boolean expected, boolean actual) {
-    		assertEquals(message, Boolean.valueOf(expected), Boolean.valueOf(actual));
-  	}
-	/**
-	 * Asserts that two booleans are equal.
- 	 */
-	static public void assertEquals(boolean expected, boolean actual) {
-		assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that two bytes are equal. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-  	static public void assertEquals(String message, byte expected, byte actual) {
-		assertEquals(message, new Byte(expected), new Byte(actual));
-	}
-	/**
-   	 * Asserts that two bytes are equal.
-	 */
-	static public void assertEquals(byte expected, byte actual) {
-		assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that two chars are equal. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-  	static public void assertEquals(String message, char expected, char actual) {
-    		assertEquals(message, new Character(expected), new Character(actual));
-  	}
-	/**
-	 * Asserts that two chars are equal.
-	 */
-  	static public void assertEquals(char expected, char actual) {
-		assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that two shorts are equal. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-	static public void assertEquals(String message, short expected, short actual) {
-    		assertEquals(message, new Short(expected), new Short(actual));
-	}
-  	/**
-	 * Asserts that two shorts are equal.
-	 */
-	static public void assertEquals(short expected, short actual) {
-		assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that two ints are equal. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-  	static public void assertEquals(String message, int expected, int actual) {
-		assertEquals(message, new Integer(expected), new Integer(actual));
-  	}
-  	/**
-   	 * Asserts that two ints are equal.
-	 */
-  	static public void assertEquals(int expected, int actual) {
-  		assertEquals(null, expected, actual);
-	}
-	/**
-	 * Asserts that an object isn't null.
-	 */
-	static public void assertNotNull(Object object) {
-		assertNotNull(null, object);
-	}
-	/**
-	 * Asserts that an object isn't null. If it is
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-	static public void assertNotNull(String message, Object object) {
-		assertTrue(message, object != null);
-	}
-	/**
-	 * Asserts that an object is null. If it isn't an {@link AssertionError} is
-	 * thrown.
-	 * Message contains: Expected: <null> but was: object
-	 * 
-	 * @param object
-	 *            Object to check or <code>null</code>
-	 */
-	static public void assertNull(Object object) {
-		String message = "Expected: <null> but was: " + String.valueOf(object);
-		assertNull(message, object);
-	}
-	/**
-	 * Asserts that an object is null.  If it is not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-	static public void assertNull(String message, Object object) {
-		assertTrue(message, object == null);
-	}
-	/**
-	 * Asserts that two objects refer to the same object. If they are not
-	 * an AssertionFailedError is thrown with the given message.
-	 */
-	static public void assertSame(String message, Object expected, Object actual) {
-		if (expected == actual)
-			return;
-		failNotSame(message, expected, actual);
-	}
-	/**
-	 * Asserts that two objects refer to the same object. If they are not
-	 * the same an AssertionFailedError is thrown.
-	 */
-	static public void assertSame(Object expected, Object actual) {
-	    assertSame(null, expected, actual);
-	}
-	/**
-	 * Asserts that two objects do not refer to the same object. If they do
-	 * refer to the same object an AssertionFailedError is thrown with the
-	 * given message.
-	 */
-	static public void assertNotSame(String message, Object expected, Object actual) {
-		if (expected == actual)
-			failSame(message);
-	}
-	/**
-	 * Asserts that two objects do not refer to the same object. If they do
-	 * refer to the same object an AssertionFailedError is thrown.
-	 */
-	static public void assertNotSame(Object expected, Object actual) {
-		assertNotSame(null, expected, actual);
-	}
-
-	static public void failSame(String message) {
-		String formatted= "";
- 		if (message != null)
- 			formatted= message+" ";
- 		fail(formatted+"expected not same");
-	}
-
-	static public void failNotSame(String message, Object expected, Object actual) {
-		String formatted= "";
-		if (message != null)
-			formatted= message+" ";
-		fail(formatted+"expected same:<"+expected+"> was not:<"+actual+">");
-	}
-
-	static public void failNotEquals(String message, Object expected, Object actual) {
-		fail(format(message, expected, actual));
-	}
-
-	public static String format(String message, Object expected, Object actual) {
-		String formatted= "";
-		if (message != null && message.length() > 0)
-			formatted= message+" ";
-		return formatted+"expected:<"+expected+"> but was:<"+actual+">";
-	}
-}
diff --git a/test-base/src/junit/framework/AssertionFailedError.java b/test-base/src/junit/framework/AssertionFailedError.java
deleted file mode 100644
index 0d7802c..0000000
--- a/test-base/src/junit/framework/AssertionFailedError.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package junit.framework;
-
-/**
- * Thrown when an assertion failed.
- */
-public class AssertionFailedError extends AssertionError {
-
-	private static final long serialVersionUID= 1L;
-
-	public AssertionFailedError() {
-	}
-
-	public AssertionFailedError(String message) {
-		super(defaultString(message));
-	}
-
-	private static String defaultString(String message) {
-		return message == null ? "" : message;
-	}
-}
\ No newline at end of file
diff --git a/test-base/src/junit/framework/ComparisonCompactor.java b/test-base/src/junit/framework/ComparisonCompactor.java
deleted file mode 100644
index e540f03..0000000
--- a/test-base/src/junit/framework/ComparisonCompactor.java
+++ /dev/null
@@ -1,87 +0,0 @@
-package junit.framework;
-
-// android-changed add @hide
-/**
- * @hide not needed for public API
- */
-public class ComparisonCompactor {
-
-	private static final String ELLIPSIS= "...";
-	private static final String DELTA_END= "]";
-	private static final String DELTA_START= "[";
-	
-	private int fContextLength;
-	private String fExpected;
-	private String fActual;
-	private int fPrefix;
-	private int fSuffix;
-
-	public ComparisonCompactor(int contextLength, String expected, String actual) {
-		fContextLength= contextLength;
-		fExpected= expected;
-		fActual= actual;
-	}
-
-	public String compact(String message) {
-		if (fExpected == null || fActual == null || areStringsEqual()) {
-			// android-changed use local method instead of Assert.format, since
-			// the later is not part of Android API till API 16
-			return format(message, fExpected, fActual);
-		}
-		findCommonPrefix();
-		findCommonSuffix();
-		String expected= compactString(fExpected);
-		String actual= compactString(fActual);
-		// android-changed use local format method
-		return format(message, expected, actual);
-	}
-
-	private String compactString(String source) {
-		String result= DELTA_START + source.substring(fPrefix, source.length() - fSuffix + 1) + DELTA_END;
-		if (fPrefix > 0)
-			result= computeCommonPrefix() + result;
-		if (fSuffix > 0)
-			result= result + computeCommonSuffix();
-		return result;
-	}
-
-	private void findCommonPrefix() {
-		fPrefix= 0;
-		int end= Math.min(fExpected.length(), fActual.length());
-		for (; fPrefix < end; fPrefix++) {
-			if (fExpected.charAt(fPrefix) != fActual.charAt(fPrefix))
-				break;
-		}
-	}
-
-	private void findCommonSuffix() {
-		int expectedSuffix= fExpected.length() - 1;
-		int actualSuffix= fActual.length() - 1;
-		for (; actualSuffix >= fPrefix && expectedSuffix >= fPrefix; actualSuffix--, expectedSuffix--) {
-			if (fExpected.charAt(expectedSuffix) != fActual.charAt(actualSuffix))
-				break;
-		}
-		fSuffix=  fExpected.length() - expectedSuffix;
-	}
-
-	private String computeCommonPrefix() {
-		return (fPrefix > fContextLength ? ELLIPSIS : "") + fExpected.substring(Math.max(0, fPrefix - fContextLength), fPrefix);
-	}
-
-	private String computeCommonSuffix() {
-		int end= Math.min(fExpected.length() - fSuffix + 1 + fContextLength, fExpected.length());
-		return fExpected.substring(fExpected.length() - fSuffix + 1, end) + (fExpected.length() - fSuffix + 1 < fExpected.length() - fContextLength ? ELLIPSIS : "");
-	}
-
-	private boolean areStringsEqual() {
-		return fExpected.equals(fActual);
-	}
-
-	// android-changed copy of Assert.format for reasons described above
-	private static String format(String message, Object expected, Object actual) {
-        	String formatted= "";
-        	if (message != null && message.length() > 0)
-            		formatted= message+" ";
-        	return formatted+"expected:<"+expected+"> but was:<"+actual+">";
-	}
-}
diff --git a/test-base/src/junit/framework/ComparisonFailure.java b/test-base/src/junit/framework/ComparisonFailure.java
deleted file mode 100644
index 5077993..0000000
--- a/test-base/src/junit/framework/ComparisonFailure.java
+++ /dev/null
@@ -1,52 +0,0 @@
-package junit.framework;
-
-/**
- * Thrown when an assert equals for Strings failed.
- * 
- * Inspired by a patch from Alex Chaffee mailto:alex@purpletech.com
- */
-public class ComparisonFailure extends AssertionFailedError {
-	private static final int MAX_CONTEXT_LENGTH= 20;
-	private static final long serialVersionUID= 1L;
-	
-	private String fExpected;
-	private String fActual;
-
-	/**
-	 * Constructs a comparison failure.
-	 * @param message the identifying message or null
-	 * @param expected the expected string value
-	 * @param actual the actual string value
-	 */
-	public ComparisonFailure (String message, String expected, String actual) {
-		super (message);
-		fExpected= expected;
-		fActual= actual;
-	}
-	
-	/**
-	 * Returns "..." in place of common prefix and "..." in
-	 * place of common suffix between expected and actual.
-	 * 
-	 * @see Throwable#getMessage()
-	 */
-	@Override
-	public String getMessage() {
-		return new ComparisonCompactor(MAX_CONTEXT_LENGTH, fExpected, fActual).compact(super.getMessage());
-	}
-	
-	/**
-	 * Gets the actual string value
-	 * @return the actual string value
-	 */
-	public String getActual() {
-		return fActual;
-	}
-	/**
-	 * Gets the expected string value
-	 * @return the expected string value
-	 */
-	public String getExpected() {
-		return fExpected;
-	}
-}
\ No newline at end of file
diff --git a/test-base/src/junit/framework/Protectable.java b/test-base/src/junit/framework/Protectable.java
deleted file mode 100644
index e143237..0000000
--- a/test-base/src/junit/framework/Protectable.java
+++ /dev/null
@@ -1,14 +0,0 @@
-package junit.framework;
-
-/**
- * A <em>Protectable</em> can be run and can throw a Throwable.
- *
- * @see TestResult
- */
-public interface Protectable {
-
-	/**
-	 * Run the the following method protected.
-	 */
-	public abstract void protect() throws Throwable;
-}
\ No newline at end of file
diff --git a/test-base/src/junit/framework/Test.java b/test-base/src/junit/framework/Test.java
deleted file mode 100644
index a016ee8..0000000
--- a/test-base/src/junit/framework/Test.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package junit.framework;
-
-/**
- * A <em>Test</em> can be run and collect its results.
- *
- * @see TestResult
- */
-public interface Test {
-	/**
-	 * Counts the number of test cases that will be run by this test.
-	 */
-	public abstract int countTestCases();
-	/**
-	 * Runs a test and collects its result in a TestResult instance.
-	 */
-	public abstract void run(TestResult result);
-}
\ No newline at end of file
diff --git a/test-base/src/junit/framework/TestCase.java b/test-base/src/junit/framework/TestCase.java
deleted file mode 100644
index b047ec9..0000000
--- a/test-base/src/junit/framework/TestCase.java
+++ /dev/null
@@ -1,212 +0,0 @@
-package junit.framework;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-
-/**
- * A test case defines the fixture to run multiple tests. To define a test case<br/>
- * <ol>
- *   <li>implement a subclass of <code>TestCase</code></li>
- *   <li>define instance variables that store the state of the fixture</li>
- *   <li>initialize the fixture state by overriding {@link #setUp()}</li>
- *   <li>clean-up after a test by overriding {@link #tearDown()}.</li>
- * </ol>
- * Each test runs in its own fixture so there
- * can be no side effects among test runs.
- * Here is an example:
- * <pre>
- * public class MathTest extends TestCase {
- *    protected double fValue1;
- *    protected double fValue2;
- *
- *    protected void setUp() {
- *       fValue1= 2.0;
- *       fValue2= 3.0;
- *    }
- * }
- * </pre>
- *
- * For each test implement a method which interacts
- * with the fixture. Verify the expected results with assertions specified
- * by calling {@link junit.framework.Assert#assertTrue(String, boolean)} with a boolean.
- * <pre>
- *    public void testAdd() {
- *       double result= fValue1 + fValue2;
- *       assertTrue(result == 5.0);
- *    }
- * </pre>
- * 
- * Once the methods are defined you can run them. The framework supports
- * both a static type safe and more dynamic way to run a test.
- * In the static way you override the runTest method and define the method to
- * be invoked. A convenient way to do so is with an anonymous inner class.
- * <pre>
- * TestCase test= new MathTest("add") {
- *    public void runTest() {
- *       testAdd();
- *    }
- * };
- * test.run();
- * </pre>
- * 
- * The dynamic way uses reflection to implement {@link #runTest()}. It dynamically finds
- * and invokes a method.
- * In this case the name of the test case has to correspond to the test method
- * to be run.
- * <pre>
- * TestCase test= new MathTest("testAdd");
- * test.run();
- * </pre>
- * 
- * The tests to be run can be collected into a TestSuite. JUnit provides
- * different <i>test runners</i> which can run a test suite and collect the results.
- * A test runner either expects a static method <code>suite</code> as the entry
- * point to get a test to run or it will extract the suite automatically.
- * <pre>
- * public static Test suite() {
- *    suite.addTest(new MathTest("testAdd"));
- *    suite.addTest(new MathTest("testDivideByZero"));
- *    return suite;
- * }
- * </pre>
- * @see TestResult
- * @see TestSuite
- */
-public abstract class TestCase extends Assert implements Test {
-	/**
-	 * the name of the test case
-	 */
-	private String fName;
-
-	/**
-	 * No-arg constructor to enable serialization. This method
-	 * is not intended to be used by mere mortals without calling setName().
-	 */
-	public TestCase() {
-		fName= null;
-	}
-	/**
-	 * Constructs a test case with the given name.
-	 */
-	public TestCase(String name) {
-		fName= name;
-	}
-	/**
-	 * Counts the number of test cases executed by run(TestResult result).
-	 */
-	public int countTestCases() {
-		return 1;
-	}
-	/**
-	 * Creates a default TestResult object
-	 *
-	 * @see TestResult
-	 */
-	protected TestResult createResult() {
-	    return new TestResult();
-	}
-	/**
-	 * A convenience method to run this test, collecting the results with a
-	 * default TestResult object.
-	 *
-	 * @see TestResult
-	 */
-	public TestResult run() {
-		TestResult result= createResult();
-		run(result);
-		return result;
-	}
-	/**
-	 * Runs the test case and collects the results in TestResult.
-	 */
-	public void run(TestResult result) {
-		result.run(this);
-	}
-	/**
-	 * Runs the bare test sequence.
-	 * @throws Throwable if any exception is thrown
-	 */
-	public void runBare() throws Throwable {
-		Throwable exception= null;
-		setUp();
-		try {
-			runTest();
-		} catch (Throwable running) {
-			exception= running;
-		}
-		finally {
-			try {
-				tearDown();
-			} catch (Throwable tearingDown) {
-				if (exception == null) exception= tearingDown;
-			}
-		}
-		if (exception != null) throw exception;
-	}
-	/**
-	 * Override to run the test and assert its state.
-	 * @throws Throwable if any exception is thrown
-	 */
-	protected void runTest() throws Throwable {
-		assertNotNull("TestCase.fName cannot be null", fName); // Some VMs crash when calling getMethod(null,null);
-		Method runMethod= null;
-		try {
-			// use getMethod to get all public inherited
-			// methods. getDeclaredMethods returns all
-			// methods of this class but excludes the
-			// inherited ones.
-			runMethod= getClass().getMethod(fName, (Class[])null);
-		} catch (NoSuchMethodException e) {
-			fail("Method \""+fName+"\" not found");
-		}
-		if (!Modifier.isPublic(runMethod.getModifiers())) {
-			fail("Method \""+fName+"\" should be public");
-		}
-
-		try {
-			runMethod.invoke(this);
-		}
-		catch (InvocationTargetException e) {
-			e.fillInStackTrace();
-			throw e.getTargetException();
-		}
-		catch (IllegalAccessException e) {
-			e.fillInStackTrace();
-			throw e;
-		}
-	}
-	/**
-	 * Sets up the fixture, for example, open a network connection.
-	 * This method is called before a test is executed.
-	 */
-	protected void setUp() throws Exception {
-	}
-	/**
-	 * Tears down the fixture, for example, close a network connection.
-	 * This method is called after a test is executed.
-	 */
-	protected void tearDown() throws Exception {
-	}
-	/**
-	 * Returns a string representation of the test case
-	 */
-	@Override
-	public String toString() {
-	    return getName() + "(" + getClass().getName() + ")";
-	}
-	/**
-	 * Gets the name of a TestCase
-	 * @return the name of the TestCase
-	 */
-	public String getName() {
-		return fName;
-	}
-	/**
-	 * Sets the name of a TestCase
-	 * @param name the name to set
-	 */
-	public void setName(String name) {
-		fName= name;
-	}
-}
diff --git a/test-base/src/junit/framework/TestFailure.java b/test-base/src/junit/framework/TestFailure.java
deleted file mode 100644
index 6662b1f..0000000
--- a/test-base/src/junit/framework/TestFailure.java
+++ /dev/null
@@ -1,58 +0,0 @@
-package junit.framework;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-
-
-/**
- * A <code>TestFailure</code> collects a failed test together with
- * the caught exception.
- * @see TestResult
- */
-public class TestFailure extends Object {
-	protected Test fFailedTest;
-	protected Throwable fThrownException;
-	
-
-	/**
-	 * Constructs a TestFailure with the given test and exception.
-	 */
-	public TestFailure(Test failedTest, Throwable thrownException) {
-		fFailedTest= failedTest;
-		fThrownException= thrownException;
-	}
-	/**
-	 * Gets the failed test.
-	 */
-	public Test failedTest() {
-	    return fFailedTest;
-	}
-	/**
-	 * Gets the thrown exception.
-	 */
-	public Throwable thrownException() {
-	    return fThrownException;
-	}
-	/**
-	 * Returns a short description of the failure.
-	 */
-	@Override
-	public String toString() {
-	    StringBuffer buffer= new StringBuffer();
-	    buffer.append(fFailedTest+": "+fThrownException.getMessage());
-	    return buffer.toString();
-	}
-	public String trace() {
-		StringWriter stringWriter= new StringWriter();
-		PrintWriter writer= new PrintWriter(stringWriter);
-		thrownException().printStackTrace(writer);
-		StringBuffer buffer= stringWriter.getBuffer();
-		return buffer.toString();
-	}
-	public String exceptionMessage() {
-		return thrownException().getMessage();
-	}
-	public boolean isFailure() {
-		return thrownException() instanceof AssertionFailedError;
-	}
-}
\ No newline at end of file
diff --git a/test-base/src/junit/framework/TestListener.java b/test-base/src/junit/framework/TestListener.java
deleted file mode 100644
index 9b69443..0000000
--- a/test-base/src/junit/framework/TestListener.java
+++ /dev/null
@@ -1,23 +0,0 @@
-package junit.framework;
-
-/**
- * A Listener for test progress
- */
-public interface TestListener {
-	/**
- 	 * An error occurred.
- 	 */
-	public void addError(Test test, Throwable t);
-	/**
- 	 * A failure occurred.
- 	 */
- 	public void addFailure(Test test, AssertionFailedError t);  
-	/**
-	 * A test ended.
-	 */
- 	public void endTest(Test test); 
-	/**
-	 * A test started.
-	 */
-	public void startTest(Test test);
-}
\ No newline at end of file
diff --git a/test-base/src/junit/framework/TestResult.java b/test-base/src/junit/framework/TestResult.java
deleted file mode 100644
index 3052e94..0000000
--- a/test-base/src/junit/framework/TestResult.java
+++ /dev/null
@@ -1,174 +0,0 @@
-package junit.framework;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Vector;
-
-/**
- * A <code>TestResult</code> collects the results of executing
- * a test case. It is an instance of the Collecting Parameter pattern.
- * The test framework distinguishes between <i>failures</i> and <i>errors</i>.
- * A failure is anticipated and checked for with assertions. Errors are
- * unanticipated problems like an {@link ArrayIndexOutOfBoundsException}.
- *
- * @see Test
- */
-public class TestResult extends Object {
-	// BEGIN android-changed changed types from List<> to Vector<> for API compatibility
-	protected Vector<TestFailure> fFailures;
-	protected Vector<TestFailure> fErrors;
-	protected Vector<TestListener> fListeners;
-	// END android-changed
-	protected int fRunTests;
-	private boolean fStop;
-	
-	public TestResult() {
-		// BEGIN android-changed to Vector
-		fFailures= new Vector<TestFailure>();
-		fErrors= new Vector<TestFailure>();
-		fListeners= new Vector<TestListener>();
-		// END android-changed
-		fRunTests= 0;
-		fStop= false;
-	}
-	/**
-	 * Adds an error to the list of errors. The passed in exception
-	 * caused the error.
-	 */
-	public synchronized void addError(Test test, Throwable t) {
-		fErrors.add(new TestFailure(test, t));
-		for (TestListener each : cloneListeners())
-			each.addError(test, t);
-	}
-	/**
-	 * Adds a failure to the list of failures. The passed in exception
-	 * caused the failure.
-	 */
-	public synchronized void addFailure(Test test, AssertionFailedError t) {
-		fFailures.add(new TestFailure(test, t));
-		for (TestListener each : cloneListeners())
-			each.addFailure(test, t);
-	}
-	/**
-	 * Registers a TestListener
-	 */
-	public synchronized void addListener(TestListener listener) {
-		fListeners.add(listener);
-	}
-	/**
-	 * Unregisters a TestListener
-	 */
-	public synchronized void removeListener(TestListener listener) {
-		fListeners.remove(listener);
-	}
-	/**
-	 * Returns a copy of the listeners.
-	 */
-	private synchronized List<TestListener> cloneListeners() {
-		List<TestListener> result= new ArrayList<TestListener>();
-		result.addAll(fListeners);
-		return result;
-	}
-	/**
-	 * Informs the result that a test was completed.
-	 */
-	public void endTest(Test test) {
-		for (TestListener each : cloneListeners())
-			each.endTest(test);
-	}
-	/**
-	 * Gets the number of detected errors.
-	 */
-	public synchronized int errorCount() {
-		return fErrors.size();
-	}
-	/**
-	 * Returns an Enumeration for the errors
-	 */
-	public synchronized Enumeration<TestFailure> errors() {
-		return Collections.enumeration(fErrors);
-	}
-	
-
-	/**
-	 * Gets the number of detected failures.
-	 */
-	public synchronized int failureCount() {
-		return fFailures.size();
-	}
-	/**
-	 * Returns an Enumeration for the failures
-	 */
-	public synchronized Enumeration<TestFailure> failures() {
-		return Collections.enumeration(fFailures);
-	}
-	
-	/**
-	 * Runs a TestCase.
-	 */
-	protected void run(final TestCase test) {
-		startTest(test);
-		Protectable p= new Protectable() {
-			public void protect() throws Throwable {
-				test.runBare();
-			}
-		};
-		runProtected(test, p);
-
-		endTest(test);
-	}
-	/**
-	 * Gets the number of run tests.
-	 */
-	public synchronized int runCount() {
-		return fRunTests;
-	}
-	/**
-	 * Runs a TestCase.
-	 */
-	public void runProtected(final Test test, Protectable p) {
-		try {
-			p.protect();
-		} 
-		catch (AssertionFailedError e) {
-			addFailure(test, e);
-		}
-		catch (ThreadDeath e) { // don't catch ThreadDeath by accident
-			throw e;
-		}
-		catch (Throwable e) {
-			addError(test, e);
-		}
-	}
-	/**
-	 * Checks whether the test run should stop
-	 */
-	public synchronized boolean shouldStop() {
-		return fStop;
-	}
-	/**
-	 * Informs the result that a test will be started.
-	 */
-	public void startTest(Test test) {
-		final int count= test.countTestCases();
-		synchronized(this) {
-			fRunTests+= count;
-		}
-		for (TestListener each : cloneListeners())
-			each.startTest(test);
-	}
-	/**
-	 * Marks that the test run should stop.
-	 */
-	public synchronized void stop() {
-		fStop= true;
-	}
-	/**
-	 * Returns whether the entire test was successful or not.
-	 */
-	public synchronized boolean wasSuccessful() {
-		return failureCount() == 0 && errorCount() == 0;
-	}
-}
diff --git a/test-base/src/junit/framework/TestSuite.java b/test-base/src/junit/framework/TestSuite.java
deleted file mode 100644
index 336efd1..0000000
--- a/test-base/src/junit/framework/TestSuite.java
+++ /dev/null
@@ -1,307 +0,0 @@
-package junit.framework;
-
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.lang.reflect.Modifier;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.Vector;
-
-/**
- * <p>A <code>TestSuite</code> is a <code>Composite</code> of Tests.
- * It runs a collection of test cases. Here is an example using
- * the dynamic test definition.
- * <pre>
- * TestSuite suite= new TestSuite();
- * suite.addTest(new MathTest("testAdd"));
- * suite.addTest(new MathTest("testDivideByZero"));
- * </pre>
- * </p>
- * 
- * <p>Alternatively, a TestSuite can extract the tests to be run automatically.
- * To do so you pass the class of your TestCase class to the
- * TestSuite constructor.
- * <pre>
- * TestSuite suite= new TestSuite(MathTest.class);
- * </pre>
- * </p>
- * 
- * <p>This constructor creates a suite with all the methods
- * starting with "test" that take no arguments.</p>
- * 
- * <p>A final option is to do the same for a large array of test classes.
- * <pre>
- * Class[] testClasses = { MathTest.class, AnotherTest.class }
- * TestSuite suite= new TestSuite(testClasses);
- * </pre>
- * </p>
- *
- * @see Test
- */
-public class TestSuite implements Test {
-
-	/**
-	 * ...as the moon sets over the early morning Merlin, Oregon
-	 * mountains, our intrepid adventurers type...
-	 */
-	static public Test createTest(Class<?> theClass, String name) {
-		Constructor<?> constructor;
-		try {
-			constructor= getTestConstructor(theClass);
-		} catch (NoSuchMethodException e) {
-			return warning("Class "+theClass.getName()+" has no public constructor TestCase(String name) or TestCase()");
-		}
-		Object test;
-		try {
-			if (constructor.getParameterTypes().length == 0) {
-				test= constructor.newInstance(new Object[0]);
-				if (test instanceof TestCase)
-					((TestCase) test).setName(name);
-			} else {
-				test= constructor.newInstance(new Object[]{name});
-			}
-		} catch (InstantiationException e) {
-			return(warning("Cannot instantiate test case: "+name+" ("+exceptionToString(e)+")"));
-		} catch (InvocationTargetException e) {
-			return(warning("Exception in constructor: "+name+" ("+exceptionToString(e.getTargetException())+")"));
-		} catch (IllegalAccessException e) {
-			return(warning("Cannot access test case: "+name+" ("+exceptionToString(e)+")"));
-		}
-		return (Test) test;
-	}
-	
-	/**
-	 * Gets a constructor which takes a single String as
-	 * its argument or a no arg constructor.
-	 */
-	public static Constructor<?> getTestConstructor(Class<?> theClass) throws NoSuchMethodException {
-		try {
-			return theClass.getConstructor(String.class);	
-		} catch (NoSuchMethodException e) {
-			// fall through
-		}
-		return theClass.getConstructor(new Class[0]);
-	}
-
-	/**
-	 * Returns a test which will fail and log a warning message.
-	 */
-	public static Test warning(final String message) {
-		return new TestCase("warning") {
-			@Override
-			protected void runTest() {
-				fail(message);
-			}
-		};
-	}
-
-	/**
-	 * Converts the stack trace into a string
-	 */
-	private static String exceptionToString(Throwable t) {
-		StringWriter stringWriter= new StringWriter();
-		PrintWriter writer= new PrintWriter(stringWriter);
-		t.printStackTrace(writer);
-		return stringWriter.toString();
-	}
-	
-	private String fName;
-
-	private Vector<Test> fTests= new Vector<Test>(10); // Cannot convert this to List because it is used directly by some test runners
-
-    /**
-	 * Constructs an empty TestSuite.
-	 */
-	public TestSuite() {
-	}
-	
-	/**
-	 * Constructs a TestSuite from the given class. Adds all the methods
-	 * starting with "test" as test cases to the suite.
-	 * Parts of this method were written at 2337 meters in the Hueffihuette,
-	 * Kanton Uri
-	 */
-	public TestSuite(final Class<?> theClass) {
-		addTestsFromTestCase(theClass);
-	}
-
-	private void addTestsFromTestCase(final Class<?> theClass) {
-		fName= theClass.getName();
-		try {
-			getTestConstructor(theClass); // Avoid generating multiple error messages
-		} catch (NoSuchMethodException e) {
-			addTest(warning("Class "+theClass.getName()+" has no public constructor TestCase(String name) or TestCase()"));
-			return;
-		}
-
-		if (!Modifier.isPublic(theClass.getModifiers())) {
-			addTest(warning("Class "+theClass.getName()+" is not public"));
-			return;
-		}
-
-		Class<?> superClass= theClass;
-		List<String> names= new ArrayList<String>();
-		while (Test.class.isAssignableFrom(superClass)) {
-			for (Method each : superClass.getDeclaredMethods())
-				addTestMethod(each, names, theClass);
-			superClass= superClass.getSuperclass();
-		}
-		if (fTests.size() == 0)
-			addTest(warning("No tests found in "+theClass.getName()));
-	}
-	
-	/**
-	 * Constructs a TestSuite from the given class with the given name.
-	 * @see TestSuite#TestSuite(Class)
-	 */
-	public TestSuite(Class<? extends TestCase>  theClass, String name) {
-		this(theClass);
-		setName(name);
-	}
-	
-   	/**
-	 * Constructs an empty TestSuite.
-	 */
-	public TestSuite(String name) {
-		setName(name);
-	}
-	
-	/**
-	 * Constructs a TestSuite from the given array of classes.  
-	 * @param classes {@link TestCase}s
-	 */
-	public TestSuite (Class<?>... classes) {
-		for (Class<?> each : classes)
-			addTest(testCaseForClass(each));
-	}
-
-	private Test testCaseForClass(Class<?> each) {
-		if (TestCase.class.isAssignableFrom(each))
-			return new TestSuite(each.asSubclass(TestCase.class));
-		else
-			return warning(each.getCanonicalName() + " does not extend TestCase");
-	}
-	
-	/**
-	 * Constructs a TestSuite from the given array of classes with the given name.
-	 * @see TestSuite#TestSuite(Class[])
-	 */
-	public TestSuite(Class<? extends TestCase>[] classes, String name) {
-		this(classes);
-		setName(name);
-	}
-	
-	/**
-	 * Adds a test to the suite.
-	 */
-	public void addTest(Test test) {
-		fTests.add(test);
-	}
-
-	/**
-	 * Adds the tests from the given class to the suite
-	 */
-	public void addTestSuite(Class<? extends TestCase> testClass) {
-		addTest(new TestSuite(testClass));
-	}
-	
-	/**
-	 * Counts the number of test cases that will be run by this test.
-	 */
-	public int countTestCases() {
-		int count= 0;
-		for (Test each : fTests)
-			count+=  each.countTestCases();
-		return count;
-	}
-
-	/**
-	 * Returns the name of the suite. Not all
-	 * test suites have a name and this method
-	 * can return null.
-	 */
-	public String getName() {
-		return fName;
-	}
-	 
-	/**
-	 * Runs the tests and collects their result in a TestResult.
-	 */
-	public void run(TestResult result) {
-		for (Test each : fTests) {
-	  		if (result.shouldStop() )
-	  			break;
-			runTest(each, result);
-		}
-	}
-
-	public void runTest(Test test, TestResult result) {
-		test.run(result);
-	}
-	 
-	/**
-	 * Sets the name of the suite.
-	 * @param name the name to set
-	 */
-	public void setName(String name) {
-		fName= name;
-	}
-
-	/**
-	 * Returns the test at the given index
-	 */
-	public Test testAt(int index) {
-		return fTests.get(index);
-	}
-	
-	/**
-	 * Returns the number of tests in this suite
-	 */
-	public int testCount() {
-		return fTests.size();
-	}
-	
-	/**
-	 * Returns the tests as an enumeration
-	 */
-	public Enumeration<Test> tests() {
-		return fTests.elements();
-	}
-	
-	/**
-	 */
-	@Override
-	public String toString() {
-		if (getName() != null)
-			return getName();
-		return super.toString();
-	 }
-
-	private void addTestMethod(Method m, List<String> names, Class<?> theClass) {
-		String name= m.getName();
-		if (names.contains(name))
-			return;
-		if (! isPublicTestMethod(m)) {
-			if (isTestMethod(m))
-				addTest(warning("Test method isn't public: "+ m.getName() + "(" + theClass.getCanonicalName() + ")"));
-			return;
-		}
-		names.add(name);
-		addTest(createTest(theClass, name));
-	}
-
-	private boolean isPublicTestMethod(Method m) {
-		return isTestMethod(m) && Modifier.isPublic(m.getModifiers());
-	 }
-	 
-	private boolean isTestMethod(Method m) {
-		return 
-			m.getParameterTypes().length == 0 && 
-			m.getName().startsWith("test") && 
-			m.getReturnType().equals(Void.TYPE);
-	 }
-}
\ No newline at end of file
