diff --git a/core/includes/config.inc b/core/includes/config.inc
index cb81acc..2a3d66a 100644
--- a/core/includes/config.inc
+++ b/core/includes/config.inc
@@ -17,7 +17,7 @@ function config_get_config_directory() {
   global $config_directory_name;
 
   if ($test_prefix = drupal_valid_test_ua()) {
-    // @see DrupalWebTestCase::setUp()
+    // @see Drupal\simpletest\WebTest::setUp()
     $path = conf_path() . '/files/simpletest/' . substr($test_prefix, 10) . '/config';
   }
   else {
diff --git a/core/modules/aggregator/aggregator.test b/core/modules/aggregator/aggregator.test
index 61ad16b..d73c52d 100644
--- a/core/modules/aggregator/aggregator.test
+++ b/core/modules/aggregator/aggregator.test
@@ -5,7 +5,9 @@
  * Tests for aggregator.module.
  */
 
-class AggregatorTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class AggregatorTestCase extends WebTest {
   function setUp() {
     parent::setUp(array('node', 'block', 'aggregator', 'aggregator_test'));
 
diff --git a/core/modules/block/block.test b/core/modules/block/block.test
index a5bde42..c6a3160 100644
--- a/core/modules/block/block.test
+++ b/core/modules/block/block.test
@@ -5,7 +5,10 @@
  * Tests for block.module.
  */
 
-class BlockTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
+class BlockTestCase extends WebTest {
   protected $regions;
   protected $admin_user;
 
@@ -398,7 +401,7 @@ class BlockTestCase extends DrupalWebTestCase {
   }
 }
 
-class NonDefaultBlockAdmin extends DrupalWebTestCase {
+class NonDefaultBlockAdmin extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Non default theme admin',
@@ -426,7 +429,7 @@ class NonDefaultBlockAdmin extends DrupalWebTestCase {
 /**
  * Test blocks correctly initialized when picking a new default theme.
  */
-class NewDefaultThemeBlocks extends DrupalWebTestCase {
+class NewDefaultThemeBlocks extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'New default theme blocks',
@@ -481,7 +484,7 @@ class NewDefaultThemeBlocks extends DrupalWebTestCase {
 /**
  * Test the block system with admin themes.
  */
-class BlockAdminThemeTestCase extends DrupalWebTestCase {
+class BlockAdminThemeTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Admin theme block admin accessibility',
@@ -517,7 +520,7 @@ class BlockAdminThemeTestCase extends DrupalWebTestCase {
 /**
  * Test block caching.
  */
-class BlockCacheTestCase extends DrupalWebTestCase {
+class BlockCacheTestCase extends WebTest {
   protected $admin_user;
   protected $normal_user;
   protected $normal_user_alt;
@@ -704,7 +707,7 @@ class BlockCacheTestCase extends DrupalWebTestCase {
 /**
  * Test block HTML id validity.
  */
-class BlockHTMLIdTestCase extends DrupalWebTestCase {
+class BlockHTMLIdTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -743,7 +746,7 @@ class BlockHTMLIdTestCase extends DrupalWebTestCase {
 /**
  * Unit tests for template_preprocess_block().
  */
-class BlockTemplateSuggestionsUnitTest extends DrupalUnitTestCase {
+class BlockTemplateSuggestionsUnitTest extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Block template suggestions',
@@ -788,7 +791,7 @@ class BlockTemplateSuggestionsUnitTest extends DrupalUnitTestCase {
 /**
  * Tests that hidden regions do not inherit blocks when a theme is enabled.
  */
-class BlockHiddenRegionTestCase extends DrupalWebTestCase {
+class BlockHiddenRegionTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Blocks not in hidden region',
diff --git a/core/modules/book/book.test b/core/modules/book/book.test
index f7d8280..bff419b 100644
--- a/core/modules/book/book.test
+++ b/core/modules/book/book.test
@@ -6,8 +6,9 @@
  */
 
 use Drupal\node\Node;
+use Drupal\simpletest\WebTest;
 
-class BookTestCase extends DrupalWebTestCase {
+class BookTestCase extends WebTest {
   protected $book;
   // $book_author is a user with permission to create and edit books.
   protected $book_author;
diff --git a/core/modules/color/color.test b/core/modules/color/color.test
index 616d19a..15846ad 100644
--- a/core/modules/color/color.test
+++ b/core/modules/color/color.test
@@ -5,10 +5,12 @@
  * Tests for color module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests the Color module functionality.
  */
-class ColorTestCase extends DrupalWebTestCase {
+class ColorTestCase extends WebTest {
   protected $big_user;
   protected $themes;
   protected $colorTests;
diff --git a/core/modules/comment/comment.test b/core/modules/comment/comment.test
index 1fc8297..8a4b4b8 100644
--- a/core/modules/comment/comment.test
+++ b/core/modules/comment/comment.test
@@ -5,7 +5,9 @@
  * Tests for the Comment module.
  */
 
-class CommentHelperCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class CommentHelperCase extends WebTest {
   protected $profile = 'standard';
 
   protected $admin_user;
@@ -814,7 +816,7 @@ class CommentInterfaceTest extends CommentHelperCase {
     user_role_change_permissions($rid, $perms);
 
     // Output verbose debugging information.
-    // @see DrupalTestCase::error()
+    // @see Drupal\simpletest\Test::error()
     $t_form = array(
       COMMENT_FORM_BELOW => 'below',
       COMMENT_FORM_SEPARATE_PAGE => 'separate page',
@@ -1511,7 +1513,7 @@ class CommentNodeAccessTest extends CommentHelperCase {
   }
 
   function setUp() {
-    DrupalWebTestCase::setUp('comment', 'search', 'node_access_test');
+    WebTest::setUp('comment', 'search', 'node_access_test');
     node_access_rebuild();
 
     // Create users and test node.
diff --git a/core/modules/config/config.test b/core/modules/config/config.test
index a164108..60c74ca 100644
--- a/core/modules/config/config.test
+++ b/core/modules/config/config.test
@@ -6,11 +6,12 @@
  */
 
 use Drupal\Core\Config\SignedFileStorage;
+use Drupal\simpletest\WebTest;
 
 /**
  * Tests the secure file writer.
  */
-class ConfigFileSecurityTestCase extends DrupalWebTestCase {
+class ConfigFileSecurityTestCase extends WebTest {
   protected $profile = 'testing';
 
   protected $filename = 'foo.bar';
@@ -89,7 +90,7 @@ class ConfigFileSecurityTestCase extends DrupalWebTestCase {
 /**
  * Tests reading and writing file contents.
  */
-class ConfigFileContentTestCase extends DrupalWebTestCase {
+class ConfigFileContentTestCase extends WebTest {
   protected $profile = 'testing';
 
   protected $fileExtension = 'xml';
@@ -272,7 +273,7 @@ class ConfigFileContentTestCase extends DrupalWebTestCase {
   /**
    * Tests configuration overriding from settings.php.
    */
-class ConfOverrideTestCase extends DrupalWebTestCase {
+class ConfOverrideTestCase extends WebTest {
   protected $testContent = 'Good morning, Denver!';
 
   public static function getInfo() {
@@ -300,7 +301,7 @@ class ConfOverrideTestCase extends DrupalWebTestCase {
 /**
  * Tests function providing configuration upgrade from Drupal 7 to 8.
  */
-class ConfUpdate7to8TestCase extends DrupalWebTestCase {
+class ConfUpdate7to8TestCase extends WebTest {
   protected $testContent = 'Olá, Sao Paulo!';
 
   public static function getInfo() {
diff --git a/core/modules/contact/contact.test b/core/modules/contact/contact.test
index 490d8f8..1aef9c0 100644
--- a/core/modules/contact/contact.test
+++ b/core/modules/contact/contact.test
@@ -4,10 +4,12 @@
  * Tests for the Contact module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests the site-wide contact form.
  */
-class ContactSitewideTestCase extends DrupalWebTestCase {
+class ContactSitewideTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Site-wide contact form',
@@ -298,7 +300,7 @@ class ContactSitewideTestCase extends DrupalWebTestCase {
 /**
  * Tests the personal contact form.
  */
-class ContactPersonalTestCase extends DrupalWebTestCase {
+class ContactPersonalTestCase extends WebTest {
   private $admin_user;
   private $web_user;
   private $contact_user;
diff --git a/core/modules/contextual/contextual.test b/core/modules/contextual/contextual.test
index 734f7cf..60cb832 100644
--- a/core/modules/contextual/contextual.test
+++ b/core/modules/contextual/contextual.test
@@ -5,10 +5,12 @@
  * Tests for contextual.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests accessible links after inaccessible links on dynamic context.
  */
-class ContextualDynamicContextTestCase extends DrupalWebTestCase {
+class ContextualDynamicContextTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Contextual links on node lists',
diff --git a/core/modules/dashboard/dashboard.test b/core/modules/dashboard/dashboard.test
index ff37d57..8ed8c83 100644
--- a/core/modules/dashboard/dashboard.test
+++ b/core/modules/dashboard/dashboard.test
@@ -5,10 +5,13 @@
  * Tests for dashboard.module.
  */
 
+
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests the Dashboard module blocks.
  */
-class DashboardBlocksTestCase extends DrupalWebTestCase {
+class DashboardBlocksTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Dashboard blocks',
@@ -106,7 +109,7 @@ class DashboardBlocksTestCase extends DrupalWebTestCase {
   }
 }
 
-class DashboardBlockAvailabilityTestCase extends DrupalWebTestCase {
+class DashboardBlockAvailabilityTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
diff --git a/core/modules/dblog/dblog.test b/core/modules/dblog/dblog.test
index 77765d7..44871a3 100644
--- a/core/modules/dblog/dblog.test
+++ b/core/modules/dblog/dblog.test
@@ -5,7 +5,10 @@
  * Tests for dblog.module.
  */
 
-class DBLogTestCase extends DrupalWebTestCase {
+
+use Drupal\simpletest\WebTest;
+
+class DBLogTestCase extends WebTest {
   protected $profile = 'standard';
 
   protected $big_user;
diff --git a/core/modules/entity/tests/entity.test b/core/modules/entity/tests/entity.test
index cd9b879..8d05ae4 100644
--- a/core/modules/entity/tests/entity.test
+++ b/core/modules/entity/tests/entity.test
@@ -5,10 +5,12 @@
  * Entity CRUD API tests.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests the basic Entity API.
  */
-class EntityAPITestCase extends DrupalWebTestCase {
+class EntityAPITestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -92,7 +94,7 @@ class EntityAPITestCase extends DrupalWebTestCase {
 /**
  * Tests entity translation.
  */
-class EntityTranslationTestCase extends DrupalWebTestCase {
+class EntityTranslationTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -201,7 +203,7 @@ class EntityTranslationTestCase extends DrupalWebTestCase {
 /**
  * Tests Entity API base functionality.
  */
-class EntityAPIInfoTestCase extends DrupalWebTestCase  {
+class EntityAPIInfoTestCase extends WebTest  {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/entity/tests/entity_crud_hook_test.test b/core/modules/entity/tests/entity_crud_hook_test.test
index 33dbb2e..42c79b9 100644
--- a/core/modules/entity/tests/entity_crud_hook_test.test
+++ b/core/modules/entity/tests/entity_crud_hook_test.test
@@ -5,6 +5,8 @@
  * CRUD hook tests for the Entity CRUD API.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests invocation of hooks when performing an action.
  *
@@ -17,7 +19,7 @@
  * As well as all type-specific hooks, like hook_node_insert(),
  * hook_comment_update(), etc.
  */
-class EntityCrudHookTestCase extends DrupalWebTestCase {
+class EntityCrudHookTestCase extends WebTest {
 
   protected $ids = array();
 
diff --git a/core/modules/entity/tests/entity_query.test b/core/modules/entity/tests/entity_query.test
index c7ac575..2fe0608 100644
--- a/core/modules/entity/tests/entity_query.test
+++ b/core/modules/entity/tests/entity_query.test
@@ -5,10 +5,12 @@
  * Unit test file for the entity API.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests EntityFieldQuery.
  */
-class EntityFieldQueryTestCase extends DrupalWebTestCase {
+class EntityFieldQueryTestCase extends WebTest {
 
 
   public static function getInfo() {
diff --git a/core/modules/field/modules/field_sql_storage/field_sql_storage.test b/core/modules/field/modules/field_sql_storage/field_sql_storage.test
index 87c388a..4dab1b3 100644
--- a/core/modules/field/modules/field_sql_storage/field_sql_storage.test
+++ b/core/modules/field/modules/field_sql_storage/field_sql_storage.test
@@ -1,6 +1,7 @@
 <?php
 
 use Drupal\Core\Database\Database;
+use Drupal\simpletest\WebTest;
 
 /**
  * @file
@@ -13,7 +14,7 @@ use Drupal\Core\Database\Database;
 /**
  * Tests field storage.
  */
-class FieldSqlStorageTestCase extends DrupalWebTestCase {
+class FieldSqlStorageTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name'  => 'Field SQL Storage tests',
diff --git a/core/modules/field/modules/list/tests/list.test b/core/modules/field/modules/list/tests/list.test
index f441f4d..330a64b 100644
--- a/core/modules/field/modules/list/tests/list.test
+++ b/core/modules/field/modules/list/tests/list.test
@@ -5,6 +5,8 @@
  * Tests for list.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests for the 'List' field types.
  */
diff --git a/core/modules/field/modules/number/number.test b/core/modules/field/modules/number/number.test
index 99ec6f0..a5f805d 100644
--- a/core/modules/field/modules/number/number.test
+++ b/core/modules/field/modules/number/number.test
@@ -5,10 +5,12 @@
  * Tests for number.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests for number field types.
  */
-class NumberFieldTestCase extends DrupalWebTestCase {
+class NumberFieldTestCase extends WebTest {
   protected $field;
   protected $instance;
   protected $web_user;
diff --git a/core/modules/field/modules/options/options.test b/core/modules/field/modules/options/options.test
index be446cd..f427c58 100644
--- a/core/modules/field/modules/options/options.test
+++ b/core/modules/field/modules/options/options.test
@@ -5,6 +5,8 @@
  * Tests for options.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 class OptionsWidgetsTestCase extends FieldTestCase {
   public static function getInfo() {
     return array(
diff --git a/core/modules/field/modules/text/text.test b/core/modules/field/modules/text/text.test
index 0dbaccc..7c97a65 100644
--- a/core/modules/field/modules/text/text.test
+++ b/core/modules/field/modules/text/text.test
@@ -5,7 +5,9 @@
  * Tests for text.module.
  */
 
-class TextFieldTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class TextFieldTestCase extends WebTest {
   protected $instance;
   protected $admin_user;
   protected $web_user;
@@ -237,7 +239,7 @@ class TextFieldTestCase extends DrupalWebTestCase {
   }
 }
 
-class TextSummaryTestCase extends DrupalWebTestCase {
+class TextSummaryTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -407,7 +409,7 @@ class TextSummaryTestCase extends DrupalWebTestCase {
   }
 }
 
-class TextTranslationTestCase extends DrupalWebTestCase {
+class TextTranslationTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
diff --git a/core/modules/field/tests/field.test b/core/modules/field/tests/field.test
index fc277a5..d473957 100644
--- a/core/modules/field/tests/field.test
+++ b/core/modules/field/tests/field.test
@@ -5,10 +5,12 @@
  * Tests for field.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Parent class for Field API tests.
  */
-class FieldTestCase extends DrupalWebTestCase {
+class FieldTestCase extends WebTest {
   var $default_storage = 'field_sql_storage';
 
   /**
@@ -16,7 +18,7 @@ class FieldTestCase extends DrupalWebTestCase {
    */
   function setUp() {
     // Since this is a base class for many test cases, support the same
-    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // flexibility that WebTest::setUp() has for the modules to be
     // passed in as either an array or a variable number of string arguments.
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -74,7 +76,7 @@ class FieldTestCase extends DrupalWebTestCase {
 class FieldAttachTestCase extends FieldTestCase {
   function setUp() {
     // Since this is a base class for many test cases, support the same
-    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // flexibility that WebTest::setUp() has for the modules to be
     // passed in as either an array or a variable number of string arguments.
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
diff --git a/core/modules/field_ui/field_ui.test b/core/modules/field_ui/field_ui.test
index fb71c5d..eb7bc52 100644
--- a/core/modules/field_ui/field_ui.test
+++ b/core/modules/field_ui/field_ui.test
@@ -6,15 +6,16 @@
  */
 
 use Drupal\node\Node;
+use Drupal\simpletest\WebTest;
 
 /**
  * Provides common functionality for the Field UI test classes.
  */
-class FieldUITestCase extends DrupalWebTestCase {
+class FieldUITestCase extends WebTest {
 
   function setUp() {
     // Since this is a base class for many test cases, support the same
-    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // flexibility that WebTest::setUp() has for the modules to be
     // passed in as either an array or a variable number of string arguments.
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -685,7 +686,7 @@ class FieldUIManageDisplayTestCase extends FieldUITestCase {
     $output = drupal_render($element);
     $this->verbose(t('Rendered node - view mode: @view_mode', array('@view_mode' => $view_mode)) . '<hr />'. $output);
 
-    // Assign content so that DrupalWebTestCase functions can be used.
+    // Assign content so that WebTest functions can be used.
     $this->drupalSetContent($output);
     $method = ($not_exists ? 'assertNoText' : 'assertText');
     $return = $this->{$method}((string) $text, $message);
@@ -700,7 +701,7 @@ class FieldUIManageDisplayTestCase extends FieldUITestCase {
 /**
  * Tests custom widget hooks and callbacks on the field administration pages.
  */
-class FieldUIAlterTestCase extends DrupalWebTestCase {
+class FieldUIAlterTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Widget customization',
diff --git a/core/modules/file/tests/file.test b/core/modules/file/tests/file.test
index 92b7ef3..f209c29 100644
--- a/core/modules/file/tests/file.test
+++ b/core/modules/file/tests/file.test
@@ -5,17 +5,19 @@
  * Tests for file.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Provides methods specifically for testing File module's field handling.
  */
-class FileFieldTestCase extends DrupalWebTestCase {
+class FileFieldTestCase extends WebTest {
   protected $profile = 'standard';
 
   protected $admin_user;
 
   function setUp() {
     // Since this is a base class for many test cases, support the same
-    // flexibility that DrupalWebTestCase::setUp() has for the modules to be
+    // flexibility that WebTest::setUp() has for the modules to be
     // passed in as either an array or a variable number of string arguments.
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
diff --git a/core/modules/filter/filter.test b/core/modules/filter/filter.test
index a387f1f..c3e5865 100644
--- a/core/modules/filter/filter.test
+++ b/core/modules/filter/filter.test
@@ -5,10 +5,13 @@
  * Tests for filter.module.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * Tests for text format and filter CRUD operations.
  */
-class FilterCRUDTestCase extends DrupalWebTestCase {
+class FilterCRUDTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Filter CRUD operations',
@@ -160,7 +163,7 @@ class FilterCRUDTestCase extends DrupalWebTestCase {
   }
 }
 
-class FilterAdminTestCase extends DrupalWebTestCase {
+class FilterAdminTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -415,7 +418,7 @@ class FilterAdminTestCase extends DrupalWebTestCase {
   }
 }
 
-class FilterFormatAccessTestCase extends DrupalWebTestCase {
+class FilterFormatAccessTestCase extends WebTest {
   protected $admin_user;
   protected $filter_admin_user;
   protected $web_user;
@@ -662,7 +665,7 @@ class FilterFormatAccessTestCase extends DrupalWebTestCase {
   }
 }
 
-class FilterDefaultFormatTestCase extends DrupalWebTestCase {
+class FilterDefaultFormatTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Default text format functionality',
@@ -722,7 +725,7 @@ class FilterDefaultFormatTestCase extends DrupalWebTestCase {
   }
 }
 
-class FilterNoFormatTestCase extends DrupalWebTestCase {
+class FilterNoFormatTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Unassigned text format functionality',
@@ -745,7 +748,7 @@ class FilterNoFormatTestCase extends DrupalWebTestCase {
 /**
  * Security tests for missing/vanished text formats or filters.
  */
-class FilterSecurityTestCase extends DrupalWebTestCase {
+class FilterSecurityTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Security',
@@ -809,7 +812,7 @@ class FilterSecurityTestCase extends DrupalWebTestCase {
 /**
  * Unit tests for core filters.
  */
-class FilterUnitTestCase extends DrupalUnitTestCase {
+class FilterUnitTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Filter module filters',
@@ -1795,7 +1798,7 @@ body {color:red}
 /**
  * Tests for filter hook invocation.
  */
-class FilterHooksTestCase extends DrupalWebTestCase {
+class FilterHooksTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Filter format hooks',
@@ -1857,7 +1860,7 @@ class FilterHooksTestCase extends DrupalWebTestCase {
 /**
  * Tests filter settings.
  */
-class FilterSettingsTestCase extends DrupalWebTestCase {
+class FilterSettingsTestCase extends WebTest {
   protected $profile = 'testing';
 
   public static function getInfo() {
diff --git a/core/modules/forum/forum.test b/core/modules/forum/forum.test
index 135f551..e43a184 100644
--- a/core/modules/forum/forum.test
+++ b/core/modules/forum/forum.test
@@ -6,9 +6,10 @@
  */
 
 use Drupal\node\Node;
+use Drupal\simpletest\WebTest;
 
-class ForumTestCase extends DrupalWebTestCase {
-  protected $admin_user;
+class ForumTestCase extends WebTest {
+  erotected $admin_user;
   protected $edit_own_topics_user;
   protected $edit_any_topics_user;
   protected $web_user;
diff --git a/core/modules/help/help.test b/core/modules/help/help.test
index 7bffe70..b1e205d 100644
--- a/core/modules/help/help.test
+++ b/core/modules/help/help.test
@@ -5,10 +5,12 @@
  * Tests for help.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests help display and user access for all modules implementing help.
  */
-class HelpTestCase extends DrupalWebTestCase {
+class HelpTestCase extends WebTest {
   // Tests help implementations of many arbitrary core modules.
   protected $profile = 'standard';
 
@@ -108,7 +110,7 @@ class HelpTestCase extends DrupalWebTestCase {
 /**
  * Tests a module without help to verify it is not listed in the help page.
  */
-class NoHelpTestCase extends DrupalWebTestCase {
+class NoHelpTestCase extends WebTest {
   /**
    * The user who will be created.
    */
diff --git a/core/modules/image/image.test b/core/modules/image/image.test
index d3b3374..dcf090e 100644
--- a/core/modules/image/image.test
+++ b/core/modules/image/image.test
@@ -5,6 +5,9 @@
  * Tests for image.module.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * TODO: Test the following functions.
  *
@@ -28,7 +31,7 @@
 /**
  * This class provides methods specifically for testing Image's field handling.
  */
-class ImageFieldTestCase extends DrupalWebTestCase {
+class ImageFieldTestCase extends WebTest {
   protected $admin_user;
 
   function setUp() {
@@ -118,7 +121,7 @@ class ImageFieldTestCase extends DrupalWebTestCase {
 /**
  * Tests the functions for generating paths and URLs for image styles.
  */
-class ImageStylesPathAndUrlUnitTest extends DrupalWebTestCase {
+class ImageStylesPathAndUrlUnitTest extends WebTest {
   protected $style_name;
   protected $image_info;
   protected $image_filepath;
@@ -897,7 +900,7 @@ class ImageFieldValidateTestCase extends ImageFieldTestCase {
 /**
  * Tests that images have correct dimensions when styled.
  */
-class ImageDimensionsUnitTest extends DrupalWebTestCase {
+class ImageDimensionsUnitTest extends WebTest {
   protected $profile = 'testing';
 
   public static function getInfo() {
@@ -1120,7 +1123,7 @@ class ImageDimensionsUnitTest extends DrupalWebTestCase {
 /**
  * Tests image_dimensions_scale().
  */
-class ImageDimensionsScaleTestCase extends DrupalUnitTestCase {
+class ImageDimensionsScaleTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'image_dimensions_scale()',
diff --git a/core/modules/language/language.test b/core/modules/language/language.test
index f0000e1..6e18176 100644
--- a/core/modules/language/language.test
+++ b/core/modules/language/language.test
@@ -9,10 +9,12 @@
  *  - comparison of $GLOBALS default language against dependency injection;
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Functional tests for the language list configuration forms.
  */
-class LanguageListTest extends DrupalWebTestCase {
+class LanguageListTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Language list configuration',
@@ -167,7 +169,7 @@ class LanguageListTest extends DrupalWebTestCase {
 /**
  * Test for dependency injected language object.
  */
-class LanguageDependencyInjectionTest extends DrupalWebTestCase {
+class LanguageDependencyInjectionTest extends WebTest {
   public static function getInfo() {
     return array(
         'name' => 'Language dependency injection',
@@ -249,3 +251,4 @@ class LanguageDependencyInjectionTest extends DrupalWebTestCase {
     variable_del('language_default');
   }
 }
+
diff --git a/core/modules/locale/locale.test b/core/modules/locale/locale.test
index fa78e14..03c8a50 100644
--- a/core/modules/locale/locale.test
+++ b/core/modules/locale/locale.test
@@ -20,11 +20,13 @@
  *  - a functional test fot language types/negotiation info.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
 
 /**
  * Functional tests for language configuration's effect on negotiation setup.
  */
-class LocaleConfigurationTest extends DrupalWebTestCase {
+class LocaleConfigurationTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Language negotiation autoconfiguration',
@@ -90,7 +92,7 @@ class LocaleConfigurationTest extends DrupalWebTestCase {
 /**
  * Functional tests for JavaScript parsing for translatable strings.
  */
-class LocaleJavascriptTranslationTest extends DrupalWebTestCase {
+class LocaleJavascriptTranslationTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Javascript translation',
@@ -179,7 +181,7 @@ class LocaleJavascriptTranslationTest extends DrupalWebTestCase {
 /**
  * Functional test for string translation and validation.
  */
-class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
+class LocaleTranslationFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'String translate, search and validate',
@@ -587,7 +589,7 @@ class LocaleTranslationFunctionalTest extends DrupalWebTestCase {
 /**
  * Tests plural format handling functionality.
  */
-class LocalePluralFormatTest extends DrupalWebTestCase {
+class LocalePluralFormatTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Plural handling',
@@ -900,7 +902,7 @@ EOF;
 /**
  * Functional tests for the import of translation files.
  */
-class LocaleImportFunctionalTest extends DrupalWebTestCase {
+class LocaleImportFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Translation import',
@@ -1377,7 +1379,7 @@ EOF;
 /**
  * Functional tests for the export of translation files.
  */
-class LocaleExportFunctionalTest extends DrupalWebTestCase {
+class LocaleExportFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Translation export',
@@ -1519,7 +1521,7 @@ EOF;
 /**
  * Tests for the st() function.
  */
-class LocaleInstallTest extends DrupalWebTestCase {
+class LocaleInstallTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'String translation using st()',
@@ -1548,7 +1550,7 @@ class LocaleInstallTest extends DrupalWebTestCase {
 /**
  * Locale uninstall with English UI functional test.
  */
-class LocaleUninstallFunctionalTest extends DrupalWebTestCase {
+class LocaleUninstallFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Locale uninstall (EN)',
@@ -1694,7 +1696,7 @@ class LocaleUninstallFrenchFunctionalTest extends LocaleUninstallFunctionalTest
 /**
  * Functional tests for the language switching feature.
  */
-class LocaleLanguageSwitchingFunctionalTest extends DrupalWebTestCase {
+class LocaleLanguageSwitchingFunctionalTest extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1772,7 +1774,7 @@ class LocaleLanguageSwitchingFunctionalTest extends DrupalWebTestCase {
 /**
  * Test browser language detection.
  */
-class LocaleBrowserDetectionTest extends DrupalUnitTestCase {
+class LocaleBrowserDetectionTest extends UnitTest {
 
   public static function getInfo() {
     return array(
@@ -1893,7 +1895,7 @@ class LocaleBrowserDetectionTest extends DrupalUnitTestCase {
 /**
  * Functional tests for a user's ability to change their default language.
  */
-class LocaleUserLanguageFunctionalTest extends DrupalWebTestCase {
+class LocaleUserLanguageFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User language settings',
@@ -1958,7 +1960,7 @@ class LocaleUserLanguageFunctionalTest extends DrupalWebTestCase {
 /**
  * Functional test for language handling during user creation.
  */
-class LocaleUserCreationTest extends DrupalWebTestCase {
+class LocaleUserCreationTest extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -2062,7 +2064,7 @@ class LocaleUserCreationTest extends DrupalWebTestCase {
 /**
  * Functional tests for configuring a different path alias per language.
  */
-class LocalePathFunctionalTest extends DrupalWebTestCase {
+class LocalePathFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Path language settings',
@@ -2201,7 +2203,7 @@ class LocalePathFunctionalTest extends DrupalWebTestCase {
 /**
  * Functional tests for multilingual support on nodes.
  */
-class LocaleContentFunctionalTest extends DrupalWebTestCase {
+class LocaleContentFunctionalTest extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -2424,7 +2426,7 @@ class LocaleContentFunctionalTest extends DrupalWebTestCase {
  *        http://example.cn/admin/config
  *          UI language in Chinese
  */
-class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
+class LocaleUILanguageNegotiationTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'UI language negotiation',
@@ -2718,7 +2720,7 @@ class LocaleUILanguageNegotiationTest extends DrupalWebTestCase {
 /**
  * Test that URL rewriting works as expected.
  */
-class LocaleUrlRewritingTest extends DrupalWebTestCase {
+class LocaleUrlRewritingTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'URL rewriting',
@@ -2790,7 +2792,7 @@ class LocaleUrlRewritingTest extends DrupalWebTestCase {
 /**
  * Functional test for multilingual fields.
  */
-class LocaleMultilingualFieldsFunctionalTest extends DrupalWebTestCase {
+class LocaleMultilingualFieldsFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Multilingual fields',
@@ -2917,7 +2919,7 @@ class LocaleMultilingualFieldsFunctionalTest extends DrupalWebTestCase {
 /**
  * Functional tests for comment language.
  */
-class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
+class LocaleCommentLanguageFunctionalTest extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -3012,7 +3014,7 @@ class LocaleCommentLanguageFunctionalTest extends DrupalWebTestCase {
 /**
  * Functional tests for localizing date formats.
  */
-class LocaleDateFormatsFunctionalTest extends DrupalWebTestCase {
+class LocaleDateFormatsFunctionalTest extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -3084,7 +3086,7 @@ class LocaleDateFormatsFunctionalTest extends DrupalWebTestCase {
 /**
  * Functional test for language types/negotiation info.
  */
-class LocaleLanguageNegotiationInfoFunctionalTest extends DrupalWebTestCase {
+class LocaleLanguageNegotiationInfoFunctionalTest extends WebTest {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/menu/menu.test b/core/modules/menu/menu.test
index e1f2aa9..42788a9 100644
--- a/core/modules/menu/menu.test
+++ b/core/modules/menu/menu.test
@@ -5,7 +5,9 @@
  * Tests for menu.module.
  */
 
-class MenuTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class MenuTestCase extends WebTest {
   protected $profile = 'standard';
 
   protected $big_user;
@@ -583,7 +585,7 @@ class MenuTestCase extends DrupalWebTestCase {
 /**
  * Test menu settings for nodes.
  */
-class MenuNodeTestCase extends DrupalWebTestCase {
+class MenuNodeTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
diff --git a/core/modules/node/node.test b/core/modules/node/node.test
index 655bc0b..b375af6 100644
--- a/core/modules/node/node.test
+++ b/core/modules/node/node.test
@@ -1,13 +1,14 @@
 <?php
 
 use Drupal\Core\Database\Database;
+use Drupal\simpletest\WebTest;
 
 /**
  * @file
  * Tests for node.module.
  */
 
-class NodeWebTestCase extends DrupalWebTestCase {
+class NodeWebTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -1768,7 +1769,7 @@ class NodeTitleTestCase extends NodeWebTestCase {
 /**
  * Test the node_feed() functionality.
  */
-class NodeFeedTestCase extends DrupalWebTestCase {
+class NodeFeedTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Node feed',
@@ -1928,7 +1929,7 @@ class NodeBlockFunctionalTest extends NodeWebTestCase {
 /**
  * Test multistep node forms basic options.
  */
-class MultiStepNodeFormBasicOptionsTest extends DrupalWebTestCase {
+class MultiStepNodeFormBasicOptionsTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Multistep node form basic options',
@@ -2423,7 +2424,7 @@ class NodeRevisionPermissionsTestCase extends NodeWebTestCase {
 /**
  * Tests pagination with a node access module enabled.
  */
-class NodeAccessPagerTestCase extends DrupalWebTestCase {
+class NodeAccessPagerTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/openid/openid.test b/core/modules/openid/openid.test
index 1beea00..4f5e96c 100644
--- a/core/modules/openid/openid.test
+++ b/core/modules/openid/openid.test
@@ -5,10 +5,12 @@
  * Tests for openid.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Base class for OpenID tests.
  */
-abstract class OpenIDWebTestCase extends DrupalWebTestCase {
+abstract class OpenIDWebTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -695,7 +697,7 @@ class OpenIDRegistrationTestCase extends OpenIDWebTestCase {
 /**
  * Test internal helper functions.
  */
-class OpenIDUnitTest extends DrupalWebTestCase {
+class OpenIDUnitTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'OpenID helper functions',
diff --git a/core/modules/path/path.test b/core/modules/path/path.test
index a3f5820..5ca4d15 100644
--- a/core/modules/path/path.test
+++ b/core/modules/path/path.test
@@ -5,10 +5,12 @@
  * Tests for the Path module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Provides a base class for testing the Path module.
  */
-class PathTestCase extends DrupalWebTestCase {
+class PathTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
diff --git a/core/modules/php/php.test b/core/modules/php/php.test
index f6009c7..f9abe8c 100644
--- a/core/modules/php/php.test
+++ b/core/modules/php/php.test
@@ -5,10 +5,12 @@
  * Tests for php.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Defines a base PHP test case class.
  */
-class PHPTestCase extends DrupalWebTestCase {
+class PHPTestCase extends WebTest {
   protected $php_code_format;
 
   function setUp() {
diff --git a/core/modules/poll/poll.test b/core/modules/poll/poll.test
index cba67ba..6232645 100644
--- a/core/modules/poll/poll.test
+++ b/core/modules/poll/poll.test
@@ -5,7 +5,9 @@
  * Tests for poll.module.
  */
 
-class PollWebTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class PollWebTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -93,7 +95,7 @@ class PollWebTestCase extends DrupalWebTestCase {
    * @return
    *   An indexed array containing:
    *   - The generated POST values, suitable for
-   *     DrupalWebTestCase::drupalPost().
+   *     WebTest::drupalPost().
    *   - The number of poll choices contained in 'edit', for potential re-usage
    *     in subsequent invocations of this function.
    */
@@ -434,7 +436,7 @@ class PollBlockTestCase extends PollWebTestCase {
 /**
  * Test adding new choices.
  */
-class PollJSAddChoice extends DrupalWebTestCase {
+class PollJSAddChoice extends WebTest {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/rdf/rdf.test b/core/modules/rdf/rdf.test
index c160ccb..eb0e9b9 100644
--- a/core/modules/rdf/rdf.test
+++ b/core/modules/rdf/rdf.test
@@ -6,8 +6,9 @@
  */
 
 use Drupal\node\Node;
+use Drupal\simpletest\WebTest;
 
-class RdfMappingHookTestCase extends DrupalWebTestCase {
+class RdfMappingHookTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'RDF mapping hook',
@@ -43,7 +44,7 @@ class RdfMappingHookTestCase extends DrupalWebTestCase {
 /**
  * Test RDFa markup generation.
  */
-class RdfRdfaMarkupTestCase extends DrupalWebTestCase {
+class RdfRdfaMarkupTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -212,7 +213,7 @@ class RdfRdfaMarkupTestCase extends DrupalWebTestCase {
   }
 }
 
-class RdfCrudTestCase extends DrupalWebTestCase {
+class RdfCrudTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'RDF mapping CRUD functions',
@@ -578,7 +579,7 @@ class RdfCommentAttributesTestCase extends CommentHelperCase {
   }
 }
 
-class RdfTrackerAttributesTestCase extends DrupalWebTestCase {
+class RdfTrackerAttributesTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -695,7 +696,7 @@ class RdfTrackerAttributesTestCase extends DrupalWebTestCase {
 /**
  * Tests for RDF namespaces declaration with hook_rdf_namespaces().
  */
-class RdfGetRdfNamespacesTestCase extends DrupalWebTestCase {
+class RdfGetRdfNamespacesTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'RDF namespaces',
@@ -725,7 +726,7 @@ class RdfGetRdfNamespacesTestCase extends DrupalWebTestCase {
 /**
  * Tests for RDF namespaces XML serialization.
  */
-class DrupalGetRdfNamespacesTestCase extends DrupalWebTestCase {
+class DrupalGetRdfNamespacesTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'RDF namespaces serialization test',
diff --git a/core/modules/search/search.test b/core/modules/search/search.test
index dd63ec4..3e5812b 100644
--- a/core/modules/search/search.test
+++ b/core/modules/search/search.test
@@ -11,7 +11,10 @@ const SEARCH_TYPE = '_test_';
 const SEARCH_TYPE_2 = '_test2_';
 const SEARCH_TYPE_JPN = '_test3_';
 
-class SearchWebTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
+class SearchWebTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -971,7 +974,7 @@ class SearchCommentTestCase extends SearchWebTestCase {
  *
  * @see http://drupal.org/node/419388 (issue)
  */
-class SearchExpressionInsertExtractTestCase extends DrupalUnitTestCase {
+class SearchExpressionInsertExtractTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Search expression insert/extract',
@@ -1589,7 +1592,7 @@ class SearchConfigSettingsForm extends SearchWebTestCase {
 /**
  * Tests the search_excerpt() function.
  */
-class SearchExcerptTestCase extends DrupalUnitTestCase {
+class SearchExcerptTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Search excerpt extraction',
diff --git a/core/modules/shortcut/shortcut.test b/core/modules/shortcut/shortcut.test
index 550c10c..fc1b933 100644
--- a/core/modules/shortcut/shortcut.test
+++ b/core/modules/shortcut/shortcut.test
@@ -5,10 +5,12 @@
  * Tests for shortcut.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Defines base class for shortcut test cases.
  */
-class ShortcutTestCase extends DrupalWebTestCase {
+class ShortcutTestCase extends WebTest {
 
   /**
    * User with permission to administer shortcuts.
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/Test.php b/core/modules/simpletest/lib/Drupal/simpletest/Test.php
new file mode 100644
index 0000000..81245b9
--- /dev/null
+++ b/core/modules/simpletest/lib/Drupal/simpletest/Test.php
@@ -0,0 +1,676 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\simpletest\Test.
+ */
+
+namespace Drupal\simpletest;
+
+use Drupal\Core\Database\Database;
+use Drupal\Core\Database\ConnectionNotDefinedException;
+use ReflectionMethod;
+use ReflectionObject;
+
+/**
+ * Base class for Drupal tests.
+ *
+ * Do not extend this class, use one of the subclasses in this file.
+ */
+abstract class Test {
+  /**
+   * The test run ID.
+   *
+   * @var string
+   */
+  protected $testId;
+
+  /**
+   * The database prefix of this test run.
+   *
+   * @var string
+   */
+  protected $databasePrefix = NULL;
+
+  /**
+   * The original file directory, before it was changed for testing purposes.
+   *
+   * @var string
+   */
+  protected $originalFileDirectory = NULL;
+
+  /**
+   * Time limit for the test.
+   */
+  protected $timeLimit = 500;
+
+  /**
+   * Current results of this test case.
+   *
+   * @var Array
+   */
+  public $results = array(
+    '#pass' => 0,
+    '#fail' => 0,
+    '#exception' => 0,
+    '#debug' => 0,
+  );
+
+  /**
+   * Assertions thrown in that test case.
+   *
+   * @var Array
+   */
+  protected $assertions = array();
+
+  /**
+   * This class is skipped when looking for the source of an assertion.
+   *
+   * When displaying which function an assert comes from, it's not too useful
+   * to see "WebTest->drupalLogin()', we would like to see the test
+   * that called it. So we need to skip the classes defining these helper
+   * methods.
+   */
+  protected $skipClasses = array(__CLASS__ => TRUE);
+
+  /**
+   * Flag to indicate whether the test has been set up.
+   *
+   * The setUp() method isolates the test from the parent Drupal site by
+   * creating a random prefix for the database and setting up a clean file
+   * storage directory. The tearDown() method then cleans up this test
+   * environment. We must ensure that setUp() has been run. Otherwise,
+   * tearDown() will act on the parent Drupal site rather than the test
+   * environment, destroying live data.
+   */
+  protected $setup = FALSE;
+
+  /**
+   * Constructor for Test.
+   *
+   * @param $test_id
+   *   Tests with the same id are reported together.
+   */
+  public function __construct($test_id = NULL) {
+    $this->testId = $test_id;
+  }
+
+  /**
+   * Checks the matching requirements for Test.
+   *
+   * @return
+   *   Array of errors containing a list of unmet requirements.
+   */
+  protected function checkRequirements() {
+    return array();
+  }
+
+  /**
+   * Internal helper: stores the assert.
+   *
+   * @param $status
+   *   Can be 'pass', 'fail', 'exception'.
+   *   TRUE is a synonym for 'pass', FALSE for 'fail'.
+   * @param $message
+   *   The message string.
+   * @param $group
+   *   Which group this assert belongs to.
+   * @param $caller
+   *   By default, the assert comes from a function whose name starts with
+   *   'test'. Instead, you can specify where this assert originates from
+   *   by passing in an associative array as $caller. Key 'file' is
+   *   the name of the source file, 'line' is the line number and 'function'
+   *   is the caller function itself.
+   */
+  protected function assert($status, $message = '', $group = 'Other', array $caller = NULL) {
+    // Convert boolean status to string status.
+    if (is_bool($status)) {
+      $status = $status ? 'pass' : 'fail';
+    }
+
+    // Increment summary result counter.
+    $this->results['#' . $status]++;
+
+    // Get the function information about the call to the assertion method.
+    if (!$caller) {
+      $caller = $this->getAssertionCall();
+    }
+
+    // Creation assertion array that can be displayed while tests are running.
+    $this->assertions[] = $assertion = array(
+      'test_id' => $this->testId,
+      'test_class' => get_class($this),
+      'status' => $status,
+      'message' => $message,
+      'message_group' => $group,
+      'function' => $caller['function'],
+      'line' => $caller['line'],
+      'file' => $caller['file'],
+    );
+
+    // Store assertion for display after the test has completed.
+    try {
+      $connection = Database::getConnection('default', 'simpletest_original_default');
+    }
+    catch (ConnectionNotDefinedException $e) {
+      // If the test was not set up, the simpletest_original_default
+      // connection does not exist.
+      $connection = Database::getConnection('default', 'default');
+    }
+    $connection
+      ->insert('simpletest')
+      ->fields($assertion)
+      ->execute();
+
+    // We do not use a ternary operator here to allow a breakpoint on
+    // test failure.
+    if ($status == 'pass') {
+      return TRUE;
+    }
+    else {
+      return FALSE;
+    }
+  }
+
+  /**
+   * Store an assertion from outside the testing context.
+   *
+   * This is useful for inserting assertions that can only be recorded after
+   * the test case has been destroyed, such as PHP fatal errors. The caller
+   * information is not automatically gathered since the caller is most likely
+   * inserting the assertion on behalf of other code. In all other respects
+   * the method behaves just like Test::assert() in terms of storing
+   * the assertion.
+   *
+   * @return
+   *   Message ID of the stored assertion.
+   *
+   * @see Test::assert()
+   * @see Test::deleteAssert()
+   */
+  public static function insertAssert($test_id, $test_class, $status, $message = '', $group = 'Other', array $caller = array()) {
+    // Convert boolean status to string status.
+    if (is_bool($status)) {
+      $status = $status ? 'pass' : 'fail';
+    }
+
+    $caller += array(
+      'function' => t('Unknown'),
+      'line' => 0,
+      'file' => t('Unknown'),
+    );
+
+    $assertion = array(
+      'test_id' => $test_id,
+      'test_class' => $test_class,
+      'status' => $status,
+      'message' => $message,
+      'message_group' => $group,
+      'function' => $caller['function'],
+      'line' => $caller['line'],
+      'file' => $caller['file'],
+    );
+
+    return db_insert('simpletest')
+      ->fields($assertion)
+      ->execute();
+  }
+
+  /**
+   * Delete an assertion record by message ID.
+   *
+   * @param $message_id
+   *   Message ID of the assertion to delete.
+   * @return
+   *   TRUE if the assertion was deleted, FALSE otherwise.
+   *
+   * @see Test::insertAssert()
+   */
+  public static function deleteAssert($message_id) {
+    return (bool) db_delete('simpletest')
+      ->condition('message_id', $message_id)
+      ->execute();
+  }
+
+  /**
+   * Cycles through backtrace until the first non-assertion method is found.
+   *
+   * @return
+   *   Array representing the true caller.
+   */
+  protected function getAssertionCall() {
+    $backtrace = debug_backtrace();
+
+    // The first element is the call. The second element is the caller.
+    // We skip calls that occurred in one of the methods of our base classes
+    // or in an assertion function.
+   while (($caller = $backtrace[1]) &&
+         ((isset($caller['class']) && isset($this->skipClasses[$caller['class']])) ||
+           substr($caller['function'], 0, 6) == 'assert')) {
+      // We remove that call.
+      array_shift($backtrace);
+    }
+
+    return _drupal_get_last_caller($backtrace);
+  }
+
+  /**
+   * Check to see if a value is not false (not an empty string, 0, NULL, or FALSE).
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertTrue($value, $message = '', $group = 'Other') {
+    return $this->assert((bool) $value, $message ? $message : t('Value @value is TRUE.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if a value is false (an empty string, 0, NULL, or FALSE).
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertFalse($value, $message = '', $group = 'Other') {
+    return $this->assert(!$value, $message ? $message : t('Value @value is FALSE.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if a value is NULL.
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNull($value, $message = '', $group = 'Other') {
+    return $this->assert(!isset($value), $message ? $message : t('Value @value is NULL.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if a value is not NULL.
+   *
+   * @param $value
+   *   The value on which the assertion is to be done.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNotNull($value, $message = '', $group = 'Other') {
+    return $this->assert(isset($value), $message ? $message : t('Value @value is not NULL.', array('@value' => var_export($value, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are equal.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertEqual($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first == $second, $message ? $message : t('Value @first is equal to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are not equal.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNotEqual($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first != $second, $message ? $message : t('Value @first is not equal to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are identical.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertIdentical($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first === $second, $message ? $message : t('Value @first is identical to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Check to see if two values are not identical.
+   *
+   * @param $first
+   *   The first value to check.
+   * @param $second
+   *   The second value to check.
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE if the assertion succeeded, FALSE otherwise.
+   */
+  protected function assertNotIdentical($first, $second, $message = '', $group = 'Other') {
+    return $this->assert($first !== $second, $message ? $message : t('Value @first is not identical to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
+  }
+
+  /**
+   * Fire an assertion that is always positive.
+   *
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   TRUE.
+   */
+  protected function pass($message = NULL, $group = 'Other') {
+    return $this->assert(TRUE, $message, $group);
+  }
+
+  /**
+   * Fire an assertion that is always negative.
+   *
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @return
+   *   FALSE.
+   */
+  protected function fail($message = NULL, $group = 'Other') {
+    return $this->assert(FALSE, $message, $group);
+  }
+
+  /**
+   * Fire an error assertion.
+   *
+   * @param $message
+   *   The message to display along with the assertion.
+   * @param $group
+   *   The type of assertion - examples are "Browser", "PHP".
+   * @param $caller
+   *   The caller of the error.
+   * @return
+   *   FALSE.
+   */
+  protected function error($message = '', $group = 'Other', array $caller = NULL) {
+    if ($group == 'User notice') {
+      // Since 'User notice' is set by trigger_error() which is used for debug
+      // set the message to a status of 'debug'.
+      return $this->assert('debug', $message, 'Debug', $caller);
+    }
+
+    return $this->assert('exception', $message, $group, $caller);
+  }
+
+  /**
+   * Logs verbose message in a text file.
+   *
+   * The a link to the vebose message will be placed in the test results via
+   * as a passing assertion with the text '[verbose message]'.
+   *
+   * @param $message
+   *   The verbose message to be stored.
+   *
+   * @see simpletest_verbose()
+   */
+  protected function verbose($message) {
+    if ($id = simpletest_verbose($message)) {
+      $url = file_create_url($this->originalFileDirectory . '/simpletest/verbose/' . get_class($this) . '-' . $id . '.html');
+      $this->error(l(t('Verbose message'), $url, array('attributes' => array('target' => '_blank'))), 'User notice');
+    }
+  }
+
+  /**
+   * Run all tests in this class.
+   *
+   * Regardless of whether $methods are passed or not, only method names
+   * starting with "test" are executed.
+   *
+   * @param $methods
+   *   (optional) A list of method names in the test case class to run; e.g.,
+   *   array('testFoo', 'testBar'). By default, all methods of the class are
+   *   taken into account, but it can be useful to only run a few selected test
+   *   methods during debugging.
+   */
+  public function run(array $methods = array()) {
+    // Initialize verbose debugging.
+    simpletest_verbose(NULL, variable_get('file_public_path', conf_path() . '/files'), get_class($this));
+
+    // HTTP auth settings (<username>:<password>) for the simpletest browser
+    // when sending requests to the test site.
+    $this->httpauth_method = variable_get('simpletest_httpauth_method', CURLAUTH_BASIC);
+    $username = variable_get('simpletest_httpauth_username', NULL);
+    $password = variable_get('simpletest_httpauth_password', NULL);
+    if ($username && $password) {
+      $this->httpauth_credentials = $username . ':' . $password;
+    }
+
+    set_error_handler(array($this, 'errorHandler'));
+    $class = get_class($this);
+    // Iterate through all the methods in this class, unless a specific list of
+    // methods to run was passed.
+    $class_methods = get_class_methods($class);
+    if ($methods) {
+      $class_methods = array_intersect($class_methods, $methods);
+    }
+    $missing_requirements = $this->checkRequirements();
+    if (!empty($missing_requirements)) {
+      $missing_requirements_object = new ReflectionObject($this);
+      $caller = array(
+        'file' => $missing_requirements_object->getFileName(),
+      );
+      foreach ($missing_requirements as $missing_requirement) {
+        Test::insertAssert($this->testId, $class, FALSE, $missing_requirement, 'Requirements check.', $caller);
+      }
+    }
+    else {
+      foreach ($class_methods as $method) {
+        // If the current method starts with "test", run it - it's a test.
+        if (strtolower(substr($method, 0, 4)) == 'test') {
+          // Insert a fail record. This will be deleted on completion to ensure
+          // that testing completed.
+          $method_info = new ReflectionMethod($class, $method);
+          $caller = array(
+            'file' => $method_info->getFileName(),
+            'line' => $method_info->getStartLine(),
+            'function' => $class . '->' . $method . '()',
+          );
+          $completion_check_id = Test::insertAssert($this->testId, $class, FALSE, t('The test did not complete due to a fatal error.'), 'Completion check', $caller);
+          $this->setUp();
+          if ($this->setup) {
+            try {
+              $this->$method();
+              // Finish up.
+            }
+            catch (Exception $e) {
+              $this->exceptionHandler($e);
+            }
+            $this->tearDown();
+          }
+          else {
+            $this->fail(t("The test cannot be executed because it has not been set up properly."));
+          }
+          // Remove the completion check record.
+          Test::deleteAssert($completion_check_id);
+        }
+      }
+    }
+    // Clear out the error messages and restore error handler.
+    drupal_get_messages();
+    restore_error_handler();
+  }
+
+  /**
+   * Handle errors during test runs.
+   *
+   * Because this is registered in set_error_handler(), it has to be public.
+   * @see set_error_handler
+   */
+  public function errorHandler($severity, $message, $file = NULL, $line = NULL) {
+    if ($severity & error_reporting()) {
+      $error_map = array(
+        E_STRICT => 'Run-time notice',
+        E_WARNING => 'Warning',
+        E_NOTICE => 'Notice',
+        E_CORE_ERROR => 'Core error',
+        E_CORE_WARNING => 'Core warning',
+        E_USER_ERROR => 'User error',
+        E_USER_WARNING => 'User warning',
+        E_USER_NOTICE => 'User notice',
+        E_RECOVERABLE_ERROR => 'Recoverable error',
+      );
+
+      $backtrace = debug_backtrace();
+      $this->error($message, $error_map[$severity], _drupal_get_last_caller($backtrace));
+    }
+    return TRUE;
+  }
+
+  /**
+   * Handle exceptions.
+   *
+   * @see set_exception_handler
+   */
+  protected function exceptionHandler($exception) {
+    $backtrace = $exception->getTrace();
+    // Push on top of the backtrace the call that generated the exception.
+    array_unshift($backtrace, array(
+      'line' => $exception->getLine(),
+      'file' => $exception->getFile(),
+    ));
+    require_once DRUPAL_ROOT . '/core/includes/errors.inc';
+    // The exception message is run through check_plain() by _drupal_decode_exception().
+    $this->error(t('%type: !message in %function (line %line of %file).', _drupal_decode_exception($exception)), 'Uncaught exception', _drupal_get_last_caller($backtrace));
+  }
+
+  /**
+   * Generates a random string of ASCII characters of codes 32 to 126.
+   *
+   * The generated string includes alpha-numeric characters and common misc
+   * characters. Use this method when testing general input where the content
+   * is not restricted.
+   *
+   * @param $length
+   *   Length of random string to generate.
+   * @return
+   *   Randomly generated string.
+   */
+  public static function randomString($length = 8) {
+    $str = '';
+    for ($i = 0; $i < $length; $i++) {
+      $str .= chr(mt_rand(32, 126));
+    }
+    return $str;
+  }
+
+  /**
+   * Generates a random string containing letters and numbers.
+   *
+   * The string will always start with a letter. The letters may be upper or
+   * lower case. This method is better for restricted inputs that do not
+   * accept certain characters. For example, when testing input fields that
+   * require machine readable values (i.e. without spaces and non-standard
+   * characters) this method is best.
+   *
+   * @param $length
+   *   Length of random string to generate.
+   * @return
+   *   Randomly generated string.
+   */
+  public static function randomName($length = 8) {
+    $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
+    $max = count($values) - 1;
+    $str = chr(mt_rand(97, 122));
+    for ($i = 1; $i < $length; $i++) {
+      $str .= chr($values[mt_rand(0, $max)]);
+    }
+    return $str;
+  }
+
+  /**
+   * Converts a list of possible parameters into a stack of permutations.
+   *
+   * Takes a list of parameters containing possible values, and converts all of
+   * them into a list of items containing every possible permutation.
+   *
+   * Example:
+   * @code
+   * $parameters = array(
+   *   'one' => array(0, 1),
+   *   'two' => array(2, 3),
+   * );
+   * $permutations = $this->permute($parameters);
+   * // Result:
+   * $permutations == array(
+   *   array('one' => 0, 'two' => 2),
+   *   array('one' => 1, 'two' => 2),
+   *   array('one' => 0, 'two' => 3),
+   *   array('one' => 1, 'two' => 3),
+   * )
+   * @endcode
+   *
+   * @param $parameters
+   *   An associative array of parameters, keyed by parameter name, and whose
+   *   values are arrays of parameter values.
+   *
+   * @return
+   *   A list of permutations, which is an array of arrays. Each inner array
+   *   contains the full list of parameters that have been passed, but with a
+   *   single value only.
+   */
+  public static function generatePermutations($parameters) {
+    $all_permutations = array(array());
+    foreach ($parameters as $parameter => $values) {
+      $new_permutations = array();
+      // Iterate over all values of the parameter.
+      foreach ($values as $value) {
+        // Iterate over all existing permutations.
+        foreach ($all_permutations as $permutation) {
+          // Add the new parameter value to existing permutations.
+          $new_permutations[] = $permutation + array($parameter => $value);
+        }
+      }
+      // Replace the old permutations with the new permutations.
+      $all_permutations = $new_permutations;
+    }
+    return $all_permutations;
+  }
+}
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/UnitTest.php b/core/modules/simpletest/lib/Drupal/simpletest/UnitTest.php
new file mode 100644
index 0000000..728098e
--- /dev/null
+++ b/core/modules/simpletest/lib/Drupal/simpletest/UnitTest.php
@@ -0,0 +1,92 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\simpletest\UnitTest.
+ */
+
+namespace Drupal\simpletest;
+
+use Drupal\Core\Database\Database;
+use Drupal\Core\Database\ConnectionNotDefinedException;
+
+/**
+ * Test case for Drupal unit tests.
+ *
+ * These tests can not access the database nor files. Calling any Drupal
+ * function that needs the database will throw exceptions. These include
+ * watchdog(), module_implements(), module_invoke_all() etc.
+ */
+abstract class UnitTest extends Test {
+
+  /**
+   * Constructor for UnitTest.
+   */
+  function __construct($test_id = NULL) {
+    parent::__construct($test_id);
+    $this->skipClasses[__CLASS__] = TRUE;
+  }
+
+  /**
+   * Sets up unit test environment.
+   *
+   * Unlike WebTest::setUp(), UnitTest::setUp() does not
+   * install modules because tests are performed without accessing the database.
+   * Any required files must be explicitly included by the child class setUp()
+   * method.
+   */
+  protected function setUp() {
+    global $conf;
+
+    // Store necessary current values before switching to the test environment.
+    $this->originalFileDirectory = variable_get('file_public_path', conf_path() . '/files');
+
+    // Reset all statics so that test is performed with a clean environment.
+    drupal_static_reset();
+
+    // Generate temporary prefixed database to ensure that tests have a clean starting point.
+    $this->databasePrefix = Database::getConnection()->prefixTables('{simpletest' . mt_rand(1000, 1000000) . '}');
+
+    // Create test directory.
+    $public_files_directory = $this->originalFileDirectory . '/simpletest/' . substr($this->databasePrefix, 10);
+    file_prepare_directory($public_files_directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
+    $conf['file_public_path'] = $public_files_directory;
+
+    // Clone the current connection and replace the current prefix.
+    $connection_info = Database::getConnectionInfo('default');
+    Database::renameConnection('default', 'simpletest_original_default');
+    foreach ($connection_info as $target => $value) {
+      $connection_info[$target]['prefix'] = array(
+        'default' => $value['prefix']['default'] . $this->databasePrefix,
+      );
+    }
+    Database::addConnectionInfo('default', 'default', $connection_info['default']);
+
+    // Set user agent to be consistent with web test case.
+    $_SERVER['HTTP_USER_AGENT'] = $this->databasePrefix;
+
+    // If locale is enabled then t() will try to access the database and
+    // subsequently will fail as the database is not accessible.
+    $module_list = module_list();
+    if (isset($module_list['locale'])) {
+      $this->originalModuleList = $module_list;
+      unset($module_list['locale']);
+      module_list(TRUE, FALSE, FALSE, $module_list);
+    }
+    $this->setup = TRUE;
+  }
+
+  protected function tearDown() {
+    global $conf;
+
+    // Get back to the original connection.
+    Database::removeConnection('default');
+    Database::renameConnection('simpletest_original_default', 'default');
+
+    $conf['file_public_path'] = $this->originalFileDirectory;
+    // Restore modules if necessary.
+    if (isset($this->originalModuleList)) {
+      module_list(TRUE, FALSE, FALSE, $this->originalModuleList);
+    }
+  }
+}
diff --git a/core/modules/simpletest/drupal_web_test_case.php b/core/modules/simpletest/lib/Drupal/simpletest/WebTest.php
similarity index 79%
rename from core/modules/simpletest/drupal_web_test_case.php
rename to core/modules/simpletest/lib/Drupal/simpletest/WebTest.php
index 540dc0e..75cd981 100644
--- a/core/modules/simpletest/drupal_web_test_case.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/WebTest.php
@@ -1,768 +1,25 @@
 <?php
 
-use Drupal\Core\Database\Database;
-use Drupal\Core\Database\ConnectionNotDefinedException;
-
-/**
- * Global variable that holds information about the tests being run.
- *
- * An array, with the following keys:
- *  - 'test_run_id': the ID of the test being run, in the form 'simpletest_%"
- *  - 'in_child_site': TRUE if the current request is a cURL request from
- *     the parent site.
- *
- * @var array
- */
-global $drupal_test_info;
-
-/**
- * Base class for Drupal tests.
- *
- * Do not extend this class, use one of the subclasses in this file.
- */
-abstract class DrupalTestCase {
-  /**
-   * The test run ID.
-   *
-   * @var string
-   */
-  protected $testId;
-
-  /**
-   * The database prefix of this test run.
-   *
-   * @var string
-   */
-  protected $databasePrefix = NULL;
-
-  /**
-   * The original file directory, before it was changed for testing purposes.
-   *
-   * @var string
-   */
-  protected $originalFileDirectory = NULL;
-
-  /**
-   * Time limit for the test.
-   */
-  protected $timeLimit = 500;
-
-  /**
-   * Current results of this test case.
-   *
-   * @var Array
-   */
-  public $results = array(
-    '#pass' => 0,
-    '#fail' => 0,
-    '#exception' => 0,
-    '#debug' => 0,
-  );
-
-  /**
-   * Assertions thrown in that test case.
-   *
-   * @var Array
-   */
-  protected $assertions = array();
-
-  /**
-   * This class is skipped when looking for the source of an assertion.
-   *
-   * When displaying which function an assert comes from, it's not too useful
-   * to see "drupalWebTestCase->drupalLogin()', we would like to see the test
-   * that called it. So we need to skip the classes defining these helper
-   * methods.
-   */
-  protected $skipClasses = array(__CLASS__ => TRUE);
-
-  /**
-   * Flag to indicate whether the test has been set up.
-   *
-   * The setUp() method isolates the test from the parent Drupal site by
-   * creating a random prefix for the database and setting up a clean file
-   * storage directory. The tearDown() method then cleans up this test
-   * environment. We must ensure that setUp() has been run. Otherwise,
-   * tearDown() will act on the parent Drupal site rather than the test
-   * environment, destroying live data.
-   */
-  protected $setup = FALSE;
-
-  /**
-   * Constructor for DrupalTestCase.
-   *
-   * @param $test_id
-   *   Tests with the same id are reported together.
-   */
-  public function __construct($test_id = NULL) {
-    $this->testId = $test_id;
-  }
-
-  /**
-   * Checks the matching requirements for DrupalTestCase.
-   *
-   * @return
-   *   Array of errors containing a list of unmet requirements.
-   */
-  protected function checkRequirements() {
-    return array();
-  }
-
-  /**
-   * Internal helper: stores the assert.
-   *
-   * @param $status
-   *   Can be 'pass', 'fail', 'exception'.
-   *   TRUE is a synonym for 'pass', FALSE for 'fail'.
-   * @param $message
-   *   The message string.
-   * @param $group
-   *   Which group this assert belongs to.
-   * @param $caller
-   *   By default, the assert comes from a function whose name starts with
-   *   'test'. Instead, you can specify where this assert originates from
-   *   by passing in an associative array as $caller. Key 'file' is
-   *   the name of the source file, 'line' is the line number and 'function'
-   *   is the caller function itself.
-   */
-  protected function assert($status, $message = '', $group = 'Other', array $caller = NULL) {
-    // Convert boolean status to string status.
-    if (is_bool($status)) {
-      $status = $status ? 'pass' : 'fail';
-    }
-
-    // Increment summary result counter.
-    $this->results['#' . $status]++;
-
-    // Get the function information about the call to the assertion method.
-    if (!$caller) {
-      $caller = $this->getAssertionCall();
-    }
-
-    // Creation assertion array that can be displayed while tests are running.
-    $this->assertions[] = $assertion = array(
-      'test_id' => $this->testId,
-      'test_class' => get_class($this),
-      'status' => $status,
-      'message' => $message,
-      'message_group' => $group,
-      'function' => $caller['function'],
-      'line' => $caller['line'],
-      'file' => $caller['file'],
-    );
-
-    // Store assertion for display after the test has completed.
-    try {
-      $connection = Database::getConnection('default', 'simpletest_original_default');
-    }
-    catch (ConnectionNotDefinedException $e) {
-      // If the test was not set up, the simpletest_original_default
-      // connection does not exist.
-      $connection = Database::getConnection('default', 'default');
-    }
-    $connection
-      ->insert('simpletest')
-      ->fields($assertion)
-      ->execute();
-
-    // We do not use a ternary operator here to allow a breakpoint on
-    // test failure.
-    if ($status == 'pass') {
-      return TRUE;
-    }
-    else {
-      return FALSE;
-    }
-  }
-
-  /**
-   * Store an assertion from outside the testing context.
-   *
-   * This is useful for inserting assertions that can only be recorded after
-   * the test case has been destroyed, such as PHP fatal errors. The caller
-   * information is not automatically gathered since the caller is most likely
-   * inserting the assertion on behalf of other code. In all other respects
-   * the method behaves just like DrupalTestCase::assert() in terms of storing
-   * the assertion.
-   *
-   * @return
-   *   Message ID of the stored assertion.
-   *
-   * @see DrupalTestCase::assert()
-   * @see DrupalTestCase::deleteAssert()
-   */
-  public static function insertAssert($test_id, $test_class, $status, $message = '', $group = 'Other', array $caller = array()) {
-    // Convert boolean status to string status.
-    if (is_bool($status)) {
-      $status = $status ? 'pass' : 'fail';
-    }
-
-    $caller += array(
-      'function' => t('Unknown'),
-      'line' => 0,
-      'file' => t('Unknown'),
-    );
-
-    $assertion = array(
-      'test_id' => $test_id,
-      'test_class' => $test_class,
-      'status' => $status,
-      'message' => $message,
-      'message_group' => $group,
-      'function' => $caller['function'],
-      'line' => $caller['line'],
-      'file' => $caller['file'],
-    );
-
-    return db_insert('simpletest')
-      ->fields($assertion)
-      ->execute();
-  }
-
-  /**
-   * Delete an assertion record by message ID.
-   *
-   * @param $message_id
-   *   Message ID of the assertion to delete.
-   * @return
-   *   TRUE if the assertion was deleted, FALSE otherwise.
-   *
-   * @see DrupalTestCase::insertAssert()
-   */
-  public static function deleteAssert($message_id) {
-    return (bool) db_delete('simpletest')
-      ->condition('message_id', $message_id)
-      ->execute();
-  }
-
-  /**
-   * Cycles through backtrace until the first non-assertion method is found.
-   *
-   * @return
-   *   Array representing the true caller.
-   */
-  protected function getAssertionCall() {
-    $backtrace = debug_backtrace();
-
-    // The first element is the call. The second element is the caller.
-    // We skip calls that occurred in one of the methods of our base classes
-    // or in an assertion function.
-   while (($caller = $backtrace[1]) &&
-         ((isset($caller['class']) && isset($this->skipClasses[$caller['class']])) ||
-           substr($caller['function'], 0, 6) == 'assert')) {
-      // We remove that call.
-      array_shift($backtrace);
-    }
-
-    return _drupal_get_last_caller($backtrace);
-  }
-
-  /**
-   * Check to see if a value is not false (not an empty string, 0, NULL, or FALSE).
-   *
-   * @param $value
-   *   The value on which the assertion is to be done.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertTrue($value, $message = '', $group = 'Other') {
-    return $this->assert((bool) $value, $message ? $message : t('Value @value is TRUE.', array('@value' => var_export($value, TRUE))), $group);
-  }
-
-  /**
-   * Check to see if a value is false (an empty string, 0, NULL, or FALSE).
-   *
-   * @param $value
-   *   The value on which the assertion is to be done.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertFalse($value, $message = '', $group = 'Other') {
-    return $this->assert(!$value, $message ? $message : t('Value @value is FALSE.', array('@value' => var_export($value, TRUE))), $group);
-  }
-
-  /**
-   * Check to see if a value is NULL.
-   *
-   * @param $value
-   *   The value on which the assertion is to be done.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertNull($value, $message = '', $group = 'Other') {
-    return $this->assert(!isset($value), $message ? $message : t('Value @value is NULL.', array('@value' => var_export($value, TRUE))), $group);
-  }
-
-  /**
-   * Check to see if a value is not NULL.
-   *
-   * @param $value
-   *   The value on which the assertion is to be done.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertNotNull($value, $message = '', $group = 'Other') {
-    return $this->assert(isset($value), $message ? $message : t('Value @value is not NULL.', array('@value' => var_export($value, TRUE))), $group);
-  }
-
-  /**
-   * Check to see if two values are equal.
-   *
-   * @param $first
-   *   The first value to check.
-   * @param $second
-   *   The second value to check.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertEqual($first, $second, $message = '', $group = 'Other') {
-    return $this->assert($first == $second, $message ? $message : t('Value @first is equal to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
-  }
-
-  /**
-   * Check to see if two values are not equal.
-   *
-   * @param $first
-   *   The first value to check.
-   * @param $second
-   *   The second value to check.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertNotEqual($first, $second, $message = '', $group = 'Other') {
-    return $this->assert($first != $second, $message ? $message : t('Value @first is not equal to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
-  }
-
-  /**
-   * Check to see if two values are identical.
-   *
-   * @param $first
-   *   The first value to check.
-   * @param $second
-   *   The second value to check.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertIdentical($first, $second, $message = '', $group = 'Other') {
-    return $this->assert($first === $second, $message ? $message : t('Value @first is identical to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
-  }
-
-  /**
-   * Check to see if two values are not identical.
-   *
-   * @param $first
-   *   The first value to check.
-   * @param $second
-   *   The second value to check.
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE if the assertion succeeded, FALSE otherwise.
-   */
-  protected function assertNotIdentical($first, $second, $message = '', $group = 'Other') {
-    return $this->assert($first !== $second, $message ? $message : t('Value @first is not identical to value @second.', array('@first' => var_export($first, TRUE), '@second' => var_export($second, TRUE))), $group);
-  }
-
-  /**
-   * Fire an assertion that is always positive.
-   *
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   TRUE.
-   */
-  protected function pass($message = NULL, $group = 'Other') {
-    return $this->assert(TRUE, $message, $group);
-  }
-
-  /**
-   * Fire an assertion that is always negative.
-   *
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @return
-   *   FALSE.
-   */
-  protected function fail($message = NULL, $group = 'Other') {
-    return $this->assert(FALSE, $message, $group);
-  }
-
-  /**
-   * Fire an error assertion.
-   *
-   * @param $message
-   *   The message to display along with the assertion.
-   * @param $group
-   *   The type of assertion - examples are "Browser", "PHP".
-   * @param $caller
-   *   The caller of the error.
-   * @return
-   *   FALSE.
-   */
-  protected function error($message = '', $group = 'Other', array $caller = NULL) {
-    if ($group == 'User notice') {
-      // Since 'User notice' is set by trigger_error() which is used for debug
-      // set the message to a status of 'debug'.
-      return $this->assert('debug', $message, 'Debug', $caller);
-    }
-
-    return $this->assert('exception', $message, $group, $caller);
-  }
-
-  /**
-   * Logs verbose message in a text file.
-   *
-   * The a link to the vebose message will be placed in the test results via
-   * as a passing assertion with the text '[verbose message]'.
-   *
-   * @param $message
-   *   The verbose message to be stored.
-   *
-   * @see simpletest_verbose()
-   */
-  protected function verbose($message) {
-    if ($id = simpletest_verbose($message)) {
-      $url = file_create_url($this->originalFileDirectory . '/simpletest/verbose/' . get_class($this) . '-' . $id . '.html');
-      $this->error(l(t('Verbose message'), $url, array('attributes' => array('target' => '_blank'))), 'User notice');
-    }
-  }
-
-  /**
-   * Run all tests in this class.
-   *
-   * Regardless of whether $methods are passed or not, only method names
-   * starting with "test" are executed.
-   *
-   * @param $methods
-   *   (optional) A list of method names in the test case class to run; e.g.,
-   *   array('testFoo', 'testBar'). By default, all methods of the class are
-   *   taken into account, but it can be useful to only run a few selected test
-   *   methods during debugging.
-   */
-  public function run(array $methods = array()) {
-    // Initialize verbose debugging.
-    simpletest_verbose(NULL, variable_get('file_public_path', conf_path() . '/files'), get_class($this));
-
-    // HTTP auth settings (<username>:<password>) for the simpletest browser
-    // when sending requests to the test site.
-    $this->httpauth_method = variable_get('simpletest_httpauth_method', CURLAUTH_BASIC);
-    $username = variable_get('simpletest_httpauth_username', NULL);
-    $password = variable_get('simpletest_httpauth_password', NULL);
-    if ($username && $password) {
-      $this->httpauth_credentials = $username . ':' . $password;
-    }
-
-    set_error_handler(array($this, 'errorHandler'));
-    $class = get_class($this);
-    // Iterate through all the methods in this class, unless a specific list of
-    // methods to run was passed.
-    $class_methods = get_class_methods($class);
-    if ($methods) {
-      $class_methods = array_intersect($class_methods, $methods);
-    }
-    $missing_requirements = $this->checkRequirements();
-    if (!empty($missing_requirements)) {
-      $missing_requirements_object = new ReflectionObject($this);
-      $caller = array(
-        'file' => $missing_requirements_object->getFileName(),
-      );
-      foreach ($missing_requirements as $missing_requirement) {
-        DrupalTestCase::insertAssert($this->testId, $class, FALSE, $missing_requirement, 'Requirements check.', $caller);
-      }
-    }
-    else {
-      foreach ($class_methods as $method) {
-        // If the current method starts with "test", run it - it's a test.
-        if (strtolower(substr($method, 0, 4)) == 'test') {
-          // Insert a fail record. This will be deleted on completion to ensure
-          // that testing completed.
-          $method_info = new ReflectionMethod($class, $method);
-          $caller = array(
-            'file' => $method_info->getFileName(),
-            'line' => $method_info->getStartLine(),
-            'function' => $class . '->' . $method . '()',
-          );
-          $completion_check_id = DrupalTestCase::insertAssert($this->testId, $class, FALSE, t('The test did not complete due to a fatal error.'), 'Completion check', $caller);
-          $this->setUp();
-          if ($this->setup) {
-            try {
-              $this->$method();
-              // Finish up.
-            }
-            catch (Exception $e) {
-              $this->exceptionHandler($e);
-            }
-            $this->tearDown();
-          }
-          else {
-            $this->fail(t("The test cannot be executed because it has not been set up properly."));
-          }
-          // Remove the completion check record.
-          DrupalTestCase::deleteAssert($completion_check_id);
-        }
-      }
-    }
-    // Clear out the error messages and restore error handler.
-    drupal_get_messages();
-    restore_error_handler();
-  }
-
-  /**
-   * Handle errors during test runs.
-   *
-   * Because this is registered in set_error_handler(), it has to be public.
-   * @see set_error_handler
-   */
-  public function errorHandler($severity, $message, $file = NULL, $line = NULL) {
-    if ($severity & error_reporting()) {
-      $error_map = array(
-        E_STRICT => 'Run-time notice',
-        E_WARNING => 'Warning',
-        E_NOTICE => 'Notice',
-        E_CORE_ERROR => 'Core error',
-        E_CORE_WARNING => 'Core warning',
-        E_USER_ERROR => 'User error',
-        E_USER_WARNING => 'User warning',
-        E_USER_NOTICE => 'User notice',
-        E_RECOVERABLE_ERROR => 'Recoverable error',
-      );
-
-      $backtrace = debug_backtrace();
-      $this->error($message, $error_map[$severity], _drupal_get_last_caller($backtrace));
-    }
-    return TRUE;
-  }
-
-  /**
-   * Handle exceptions.
-   *
-   * @see set_exception_handler
-   */
-  protected function exceptionHandler($exception) {
-    $backtrace = $exception->getTrace();
-    // Push on top of the backtrace the call that generated the exception.
-    array_unshift($backtrace, array(
-      'line' => $exception->getLine(),
-      'file' => $exception->getFile(),
-    ));
-    require_once DRUPAL_ROOT . '/core/includes/errors.inc';
-    // The exception message is run through check_plain() by _drupal_decode_exception().
-    $this->error(t('%type: !message in %function (line %line of %file).', _drupal_decode_exception($exception)), 'Uncaught exception', _drupal_get_last_caller($backtrace));
-  }
-
-  /**
-   * Generates a random string of ASCII characters of codes 32 to 126.
-   *
-   * The generated string includes alpha-numeric characters and common misc
-   * characters. Use this method when testing general input where the content
-   * is not restricted.
-   *
-   * @param $length
-   *   Length of random string to generate.
-   * @return
-   *   Randomly generated string.
-   */
-  public static function randomString($length = 8) {
-    $str = '';
-    for ($i = 0; $i < $length; $i++) {
-      $str .= chr(mt_rand(32, 126));
-    }
-    return $str;
-  }
-
-  /**
-   * Generates a random string containing letters and numbers.
-   *
-   * The string will always start with a letter. The letters may be upper or
-   * lower case. This method is better for restricted inputs that do not
-   * accept certain characters. For example, when testing input fields that
-   * require machine readable values (i.e. without spaces and non-standard
-   * characters) this method is best.
-   *
-   * @param $length
-   *   Length of random string to generate.
-   * @return
-   *   Randomly generated string.
-   */
-  public static function randomName($length = 8) {
-    $values = array_merge(range(65, 90), range(97, 122), range(48, 57));
-    $max = count($values) - 1;
-    $str = chr(mt_rand(97, 122));
-    for ($i = 1; $i < $length; $i++) {
-      $str .= chr($values[mt_rand(0, $max)]);
-    }
-    return $str;
-  }
-
-  /**
-   * Converts a list of possible parameters into a stack of permutations.
-   *
-   * Takes a list of parameters containing possible values, and converts all of
-   * them into a list of items containing every possible permutation.
-   *
-   * Example:
-   * @code
-   * $parameters = array(
-   *   'one' => array(0, 1),
-   *   'two' => array(2, 3),
-   * );
-   * $permutations = $this->permute($parameters);
-   * // Result:
-   * $permutations == array(
-   *   array('one' => 0, 'two' => 2),
-   *   array('one' => 1, 'two' => 2),
-   *   array('one' => 0, 'two' => 3),
-   *   array('one' => 1, 'two' => 3),
-   * )
-   * @endcode
-   *
-   * @param $parameters
-   *   An associative array of parameters, keyed by parameter name, and whose
-   *   values are arrays of parameter values.
-   *
-   * @return
-   *   A list of permutations, which is an array of arrays. Each inner array
-   *   contains the full list of parameters that have been passed, but with a
-   *   single value only.
-   */
-  public static function generatePermutations($parameters) {
-    $all_permutations = array(array());
-    foreach ($parameters as $parameter => $values) {
-      $new_permutations = array();
-      // Iterate over all values of the parameter.
-      foreach ($values as $value) {
-        // Iterate over all existing permutations.
-        foreach ($all_permutations as $permutation) {
-          // Add the new parameter value to existing permutations.
-          $new_permutations[] = $permutation + array($parameter => $value);
-        }
-      }
-      // Replace the old permutations with the new permutations.
-      $all_permutations = $new_permutations;
-    }
-    return $all_permutations;
-  }
-}
-
 /**
- * Test case for Drupal unit tests.
- *
- * These tests can not access the database nor files. Calling any Drupal
- * function that needs the database will throw exceptions. These include
- * watchdog(), module_implements(), module_invoke_all() etc.
+ * @file
+ * Definition of Drupal\simpletest\WebTest.
  */
-class DrupalUnitTestCase extends DrupalTestCase {
-
-  /**
-   * Constructor for DrupalUnitTestCase.
-   */
-  function __construct($test_id = NULL) {
-    parent::__construct($test_id);
-    $this->skipClasses[__CLASS__] = TRUE;
-  }
-
-  /**
-   * Sets up unit test environment.
-   *
-   * Unlike DrupalWebTestCase::setUp(), DrupalUnitTestCase::setUp() does not
-   * install modules because tests are performed without accessing the database.
-   * Any required files must be explicitly included by the child class setUp()
-   * method.
-   */
-  protected function setUp() {
-    global $conf;
-
-    // Store necessary current values before switching to the test environment.
-    $this->originalFileDirectory = variable_get('file_public_path', conf_path() . '/files');
-
-    // Reset all statics so that test is performed with a clean environment.
-    drupal_static_reset();
 
-    // Generate temporary prefixed database to ensure that tests have a clean starting point.
-    $this->databasePrefix = Database::getConnection()->prefixTables('{simpletest' . mt_rand(1000, 1000000) . '}');
+namespace Drupal\simpletest;
 
-    // Create test directory.
-    $public_files_directory = $this->originalFileDirectory . '/simpletest/' . substr($this->databasePrefix, 10);
-    file_prepare_directory($public_files_directory, FILE_CREATE_DIRECTORY | FILE_MODIFY_PERMISSIONS);
-    $conf['file_public_path'] = $public_files_directory;
-
-    // Clone the current connection and replace the current prefix.
-    $connection_info = Database::getConnectionInfo('default');
-    Database::renameConnection('default', 'simpletest_original_default');
-    foreach ($connection_info as $target => $value) {
-      $connection_info[$target]['prefix'] = array(
-        'default' => $value['prefix']['default'] . $this->databasePrefix,
-      );
-    }
-    Database::addConnectionInfo('default', 'default', $connection_info['default']);
-
-    // Set user agent to be consistent with web test case.
-    $_SERVER['HTTP_USER_AGENT'] = $this->databasePrefix;
-
-    // If locale is enabled then t() will try to access the database and
-    // subsequently will fail as the database is not accessible.
-    $module_list = module_list();
-    if (isset($module_list['locale'])) {
-      $this->originalModuleList = $module_list;
-      unset($module_list['locale']);
-      module_list(TRUE, FALSE, FALSE, $module_list);
-    }
-    $this->setup = TRUE;
-  }
-
-  protected function tearDown() {
-    global $conf;
-
-    // Get back to the original connection.
-    Database::removeConnection('default');
-    Database::renameConnection('simpletest_original_default', 'default');
-
-    $conf['file_public_path'] = $this->originalFileDirectory;
-    // Restore modules if necessary.
-    if (isset($this->originalModuleList)) {
-      module_list(TRUE, FALSE, FALSE, $this->originalModuleList);
-    }
-  }
-}
+use Drupal\Core\Database\Database;
+use Drupal\Core\Database\ConnectionNotDefinedException;
+use PDO;
+use stdClass;
+use DOMDocument;
+use DOMXPath;
+use SimpleXMLElement;
 
 /**
  * Test case for typical Drupal tests.
  */
-class DrupalWebTestCase extends DrupalTestCase {
+abstract class WebTest extends Test {
+
   /**
    * The profile to install as a basis for testing.
    *
@@ -837,7 +94,7 @@ class DrupalWebTestCase extends DrupalTestCase {
   /**
    * Additional cURL options.
    *
-   * DrupalWebTestCase itself never sets this but always obeys what is set.
+   * WebTest itself never sets this but always obeys what is set.
    */
   protected $additionalCurlOptions = array();
 
@@ -886,7 +143,7 @@ class DrupalWebTestCase extends DrupalTestCase {
   protected $redirect_count;
 
   /**
-   * Constructor for DrupalWebTestCase.
+   * Constructor for WebTest.
    */
   function __construct($test_id = NULL) {
     parent::__construct($test_id);
@@ -1452,7 +709,7 @@ class DrupalWebTestCase extends DrupalTestCase {
   /**
    * Preload the registry from the testing site.
    *
-   * This method is called by DrupalWebTestCase::setUp(), and preloads the
+   * This method is called by WebTest::setUp(), and preloads the
    * registry from the testing site to cut down on the time it takes to
    * set up a clean environment for the current test run.
    */
@@ -1488,7 +745,7 @@ class DrupalWebTestCase extends DrupalTestCase {
   /**
    * Reset all data structures after having enabled new modules.
    *
-   * This method is called by DrupalWebTestCase::setUp() after enabling
+   * This method is called by WebTest::setUp() after enabling
    * the requested modules. It must be called again when additional modules
    * are enabled later.
    */
@@ -1738,9 +995,9 @@ class DrupalWebTestCase extends DrupalTestCase {
 
     // Errors are being sent via X-Drupal-Assertion-* headers,
     // generated by _drupal_log_error() in the exact form required
-    // by DrupalWebTestCase::error().
+    // by WebTest::error().
     if (preg_match('/^X-Drupal-Assertion-[0-9]+: (.*)$/', $header, $matches)) {
-      // Call DrupalWebTestCase::error() with the parameters from the header.
+      // Call WebTest::error() with the parameters from the header.
       call_user_func_array(array(&$this, 'error'), unserialize(urldecode($matches[1])));
     }
 
@@ -3565,8 +2822,8 @@ class DrupalWebTestCase extends DrupalTestCase {
  * @return
  *   The ID of the message to be placed in related assertion messages.
  *
- * @see DrupalTestCase->originalFileDirectory
- * @see DrupalWebTestCase->verbose()
+ * @see Drupal\simpletest\Test->originalFileDirectory()
+ * @see WebTest->verbose()
  */
 function simpletest_verbose($message, $original_file_directory = NULL, $test_class = NULL) {
   static $file_directory = NULL, $class = NULL, $id = 1, $verbose = NULL;
diff --git a/core/modules/simpletest/simpletest.api.php b/core/modules/simpletest/simpletest.api.php
index 04c080b..7985186 100644
--- a/core/modules/simpletest/simpletest.api.php
+++ b/core/modules/simpletest/simpletest.api.php
@@ -6,6 +6,18 @@
  */
 
 /**
+ * Global variable that holds information about the tests being run.
+ *
+ * An array, with the following keys:
+ *  - 'test_run_id': the ID of the test being run, in the form 'simpletest_%"
+ *  - 'in_child_site': TRUE if the current request is a cURL request from
+ *     the parent site.
+ *
+ * @var array
+ */
+global $drupal_test_info;
+
+/**
  * @addtogroup hooks
  * @{
  */
@@ -47,9 +59,9 @@ function hook_test_group_finished() {
  * This hook is called when an individual test has finished.
  *
  * @param
- *   $results The results of the test as gathered by DrupalWebTestCase.
+ *   $results The results of the test as gathered by WebTest.
  *
- * @see DrupalWebTestCase->results
+ * @see WebTest->results
  */
 function hook_test_finished($results) {
 }
diff --git a/core/modules/simpletest/simpletest.module b/core/modules/simpletest/simpletest.module
index 9bd735e..fcbdbe7 100644
--- a/core/modules/simpletest/simpletest.module
+++ b/core/modules/simpletest/simpletest.module
@@ -1,6 +1,7 @@
 <?php
 
 use Drupal\Core\Database\Database;
+use Drupal\simpletest\Test;
 
 /**
  * @file
@@ -176,6 +177,10 @@ function _simpletest_batch_operation($test_list_init, $test_id, &$context) {
 
   // Perform the next test.
   $test_class = array_shift($test_list);
+  // Prefix test classes with \ if it is missing.
+  if (strpos($test_class, '\\') === FALSE) {
+    $test_class = '\\' . $test_class;
+  }
   $test = new $test_class($test_id);
   $test->run();
   $size = count($test_list);
@@ -272,11 +277,11 @@ function simpletest_log_read($test_id, $prefix, $test_class, $during_test = FALS
           'line' => $match[4],
           'file' => $match[3],
         );
-        DrupalTestCase::insertAssert($test_id, $test_class, FALSE, $match[2], $match[1], $caller);
+        Test::insertAssert($test_id, $test_class, FALSE, $match[2], $match[1], $caller);
       }
       else {
         // Unknown format, place the entire message in the log.
-        DrupalTestCase::insertAssert($test_id, $test_class, FALSE, $line, 'Fatal error');
+        Test::insertAssert($test_id, $test_class, FALSE, $line, 'Fatal error');
       }
       $found = TRUE;
     }
@@ -565,3 +570,51 @@ function simpletest_mail_alter(&$message) {
     $message['send'] = FALSE;
   }
 }
+
+/**
+ * Logs verbose message in a text file.
+ *
+ * If verbose mode is enabled then page requests will be dumped to a file and
+ * presented on the test result screen. The messages will be placed in a file
+ * located in the simpletest directory in the original file system.
+ *
+ * @param $message
+ *   The verbose message to be stored.
+ * @param $original_file_directory
+ *   The original file directory, before it was changed for testing purposes.
+ * @param $test_class
+ *   The active test case class.
+ *
+ * @return
+ *   The ID of the message to be placed in related assertion messages.
+ *
+ * @see Drupal\simpletest\Test->originalFileDirectory()
+ * @see Drupal\simpletest\WebTest->verbose()
+ */
+function simpletest_verbose($message, $original_file_directory = NULL, $test_class = NULL) {
+  static $file_directory = NULL, $class = NULL, $id = 1, $verbose = NULL;
+
+  // Will pass first time during setup phase, and when verbose is TRUE.
+  if (!isset($original_file_directory) && !$verbose) {
+    return FALSE;
+  }
+
+  if ($message && $file_directory) {
+    $message = '<hr />ID #' . $id . ' (<a href="' . $class . '-' . ($id - 1) . '.html">Previous</a> | <a href="' . $class . '-' . ($id + 1) . '.html">Next</a>)<hr />' . $message;
+    file_put_contents($file_directory . "/simpletest/verbose/$class-$id.html", $message, FILE_APPEND);
+    return $id++;
+  }
+
+  if ($original_file_directory) {
+    $file_directory = $original_file_directory;
+    $class = $test_class;
+    $verbose = variable_get('simpletest_verbose', TRUE);
+    $directory = $file_directory . '/simpletest/verbose';
+    $writable = file_prepare_directory($directory, FILE_CREATE_DIRECTORY);
+    if ($writable && !file_exists($directory . '/.htaccess')) {
+      file_put_contents($directory . '/.htaccess', "<IfModule mod_expires.c>\nExpiresActive Off\n</IfModule>\n");
+    }
+    return $writable;
+  }
+  return FALSE;
+}
diff --git a/core/modules/simpletest/simpletest.test b/core/modules/simpletest/simpletest.test
index 4cecbe6..e87f5be 100644
--- a/core/modules/simpletest/simpletest.test
+++ b/core/modules/simpletest/simpletest.test
@@ -5,7 +5,10 @@
  * Tests for simpletest.module.
  */
 
-class SimpleTestFunctionalTest extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
+class SimpleTestFunctionalTest extends WebTest {
   /**
    * The results array that has been parsed by getTestResults().
    */
@@ -323,7 +326,7 @@ class SimpleTestFunctionalTest extends DrupalWebTestCase {
 /**
  * Test internal testing framework browser.
  */
-class SimpleTestBrowserTestCase extends DrupalWebTestCase {
+class SimpleTestBrowserTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'SimpleTest browser',
@@ -338,7 +341,7 @@ class SimpleTestBrowserTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Test DrupalWebTestCase::getAbsoluteUrl().
+   * Test WebTest::getAbsoluteUrl().
    */
   function testGetAbsoluteUrl() {
     // Testbed runs with Clean URLs disabled, so disable it here.
@@ -384,7 +387,7 @@ EOF;
   }
 }
 
-class SimpleTestMailCaptureTestCase extends DrupalWebTestCase {
+class SimpleTestMailCaptureTestCase extends WebTest {
   /**
    * Implement getInfo().
    */
@@ -463,7 +466,7 @@ class SimpleTestMailCaptureTestCase extends DrupalWebTestCase {
 /**
  * Test Folder creation
  */
-class SimpleTestFolderTestCase extends DrupalWebTestCase {
+class SimpleTestFolderTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Testing SimpleTest setUp',
@@ -485,7 +488,7 @@ class SimpleTestFolderTestCase extends DrupalWebTestCase {
 /**
  * Test required modules for tests.
  */
-class SimpleTestMissingDependentModuleUnitTest extends DrupalUnitTestCase {
+class SimpleTestMissingDependentModuleUnitTest extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Testing dependent module test',
@@ -507,12 +510,12 @@ class SimpleTestMissingDependentModuleUnitTest extends DrupalUnitTestCase {
  * Tests a test case that does not run parent::setUp() in its setUp() method.
  *
  * If a test case does not call parent::setUp(), running
- * DrupalTestCase::tearDown() would destroy the main site's database tables.
+ * Test::tearDown() would destroy the main site's database tables.
  * Therefore, we ensure that tests which are not set up properly are skipped.
  *
- * @see DrupalTestCase
+ * @see Drupal\simpletest\Test
  */
-class SimpleTestBrokenSetUp extends DrupalWebTestCase {
+class SimpleTestBrokenSetUp extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Broken SimpleTest method',
@@ -573,7 +576,7 @@ class SimpleTestBrokenSetUp extends DrupalWebTestCase {
 /**
  * Tests missing requirements to run test.
  */
-class SimpleTestMissingCheckedRequirements extends DrupalWebTestCase {
+class SimpleTestMissingCheckedRequirements extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Broken requirements test',
@@ -622,7 +625,7 @@ class SimpleTestMissingCheckedRequirements extends DrupalWebTestCase {
 /**
  * Verifies that tests bundled with installation profile modules are found.
  */
-class SimpleTestInstallationProfileModuleTestsTestCase extends DrupalWebTestCase {
+class SimpleTestInstallationProfileModuleTestsTestCase extends WebTest {
   /**
    * Use the Testing profile.
    *
@@ -671,7 +674,7 @@ class SimpleTestInstallationProfileModuleTestsTestCase extends DrupalWebTestCase
  *
  * @see SimpleTestInstallationProfileModuleTestsTestCase
  */
-class SimpleTestOtherInstallationProfileModuleTestsTestCase extends DrupalWebTestCase {
+class SimpleTestOtherInstallationProfileModuleTestsTestCase extends WebTest {
   /**
    * Use the Minimal profile.
    *
diff --git a/core/modules/statistics/statistics.test b/core/modules/statistics/statistics.test
index 6f19e37..01e6bf0 100644
--- a/core/modules/statistics/statistics.test
+++ b/core/modules/statistics/statistics.test
@@ -5,10 +5,12 @@
  * Tests for the Statistics module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Defines a base class for testing the Statistics module.
  */
-class StatisticsTestCase extends DrupalWebTestCase {
+class StatisticsTestCase extends WebTest {
 
   function setUp() {
     parent::setUp(array('node', 'block', 'statistics'));
@@ -53,10 +55,10 @@ class StatisticsTestCase extends DrupalWebTestCase {
 /**
  * Tests that logging via statistics_exit() works for all pages.
  *
- * We subclass DrupalWebTestCase rather than StatisticsTestCase, because we
+ * We subclass WebTest rather than StatisticsTestCase, because we
  * want to test requests from an anonymous user.
  */
-class StatisticsLoggingTestCase extends DrupalWebTestCase {
+class StatisticsLoggingTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Statistics logging tests',
@@ -314,7 +316,7 @@ class StatisticsBlockVisitorsTestCase extends StatisticsTestCase {
 /**
  * Tests the statistics administration screen.
  */
-class StatisticsAdminTestCase extends DrupalWebTestCase {
+class StatisticsAdminTestCase extends WebTest {
 
   /**
    * A user that has permission to administer and access statistics.
diff --git a/core/modules/syslog/syslog.test b/core/modules/syslog/syslog.test
index 1f7ab2e..b823bcb 100644
--- a/core/modules/syslog/syslog.test
+++ b/core/modules/syslog/syslog.test
@@ -5,10 +5,12 @@
  * Tests for syslog.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests the Syslog module functionality.
  */
-class SyslogTestCase extends DrupalWebTestCase {
+class SyslogTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Syslog functionality',
diff --git a/core/modules/system/system.test b/core/modules/system/system.test
index 16348cc..3083416 100644
--- a/core/modules/system/system.test
+++ b/core/modules/system/system.test
@@ -2,6 +2,8 @@
 
 use Drupal\Core\Database\Database;
 use Drupal\Component\Graph\Graph;
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
 
 /**
  * @file
@@ -11,7 +13,7 @@ use Drupal\Component\Graph\Graph;
 /**
  * Helper class for module test cases.
  */
-class ModuleTestCase extends DrupalWebTestCase {
+class ModuleTestCase extends WebTest {
   protected $admin_user;
 
   function setUp() {
@@ -709,7 +711,7 @@ class ModuleRequiredTestCase extends ModuleTestCase {
   }
 }
 
-class IPAddressBlockingTestCase extends DrupalWebTestCase {
+class IPAddressBlockingTestCase extends WebTest {
   protected $blocking_user;
 
   /**
@@ -788,7 +790,7 @@ class IPAddressBlockingTestCase extends DrupalWebTestCase {
   }
 }
 
-class CronRunTestCase extends DrupalWebTestCase {
+class CronRunTestCase extends WebTest {
   /**
    * Implement getInfo().
    */
@@ -923,7 +925,7 @@ class CronRunTestCase extends DrupalWebTestCase {
   }
 }
 
-class AdminMetaTagTestCase extends DrupalWebTestCase {
+class AdminMetaTagTestCase extends WebTest {
   /**
    * Implement getInfo().
    */
@@ -946,7 +948,7 @@ class AdminMetaTagTestCase extends DrupalWebTestCase {
   }
 }
 
-class DefaultMobileMetaTagsTestCase extends DrupalWebTestCase {
+class DefaultMobileMetaTagsTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Default mobile meta tags',
@@ -990,7 +992,7 @@ class DefaultMobileMetaTagsTestCase extends DrupalWebTestCase {
 /**
  * Tests custom access denied functionality.
  */
-class AccessDeniedTestCase extends DrupalWebTestCase {
+class AccessDeniedTestCase extends WebTest {
   protected $admin_user;
 
   public static function getInfo() {
@@ -1067,7 +1069,7 @@ class AccessDeniedTestCase extends DrupalWebTestCase {
   }
 }
 
-class PageNotFoundTestCase extends DrupalWebTestCase {
+class PageNotFoundTestCase extends WebTest {
   protected $admin_user;
 
   public static function getInfo() {
@@ -1107,7 +1109,7 @@ class PageNotFoundTestCase extends DrupalWebTestCase {
 /**
  * Tests site maintenance functionality.
  */
-class SiteMaintenanceTestCase extends DrupalWebTestCase {
+class SiteMaintenanceTestCase extends WebTest {
   protected $admin_user;
 
   public static function getInfo() {
@@ -1211,7 +1213,7 @@ class SiteMaintenanceTestCase extends DrupalWebTestCase {
 /**
  * Tests generic date and time handling capabilities of Drupal.
  */
-class DateTimeFunctionalTest extends DrupalWebTestCase {
+class DateTimeFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Date and time',
@@ -1404,7 +1406,7 @@ class DateTimeFunctionalTest extends DrupalWebTestCase {
   }
 }
 
-class PageTitleFiltering extends DrupalWebTestCase {
+class PageTitleFiltering extends WebTest {
   protected $content_user;
   protected $saved_title;
 
@@ -1513,7 +1515,7 @@ class PageTitleFiltering extends DrupalWebTestCase {
 /**
  * Test front page functionality and administration.
  */
-class FrontPageTestCase extends DrupalWebTestCase {
+class FrontPageTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1567,7 +1569,7 @@ class FrontPageTestCase extends DrupalWebTestCase {
   }
 }
 
-class SystemBlockTestCase extends DrupalWebTestCase {
+class SystemBlockTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Block functionality',
@@ -1634,7 +1636,7 @@ class SystemBlockTestCase extends DrupalWebTestCase {
 /**
  * Test main content rendering fallback provided by system module.
  */
-class SystemMainContentFallback extends DrupalWebTestCase {
+class SystemMainContentFallback extends WebTest {
   protected $admin_user;
   protected $web_user;
 
@@ -1712,7 +1714,7 @@ class SystemMainContentFallback extends DrupalWebTestCase {
 /**
  * Tests for the theme interface functionality.
  */
-class SystemThemeFunctionalTest extends DrupalWebTestCase {
+class SystemThemeFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Theme interface functionality',
@@ -1936,7 +1938,7 @@ class SystemThemeFunctionalTest extends DrupalWebTestCase {
 /**
  * Test token replacement in strings.
  */
-class TokenReplaceTestCase extends DrupalWebTestCase {
+class TokenReplaceTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Token replacement',
@@ -2092,7 +2094,7 @@ class TokenReplaceTestCase extends DrupalWebTestCase {
   }
 }
 
-class InfoFileParserTestCase extends DrupalUnitTestCase {
+class InfoFileParserTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Info file format parser',
@@ -2166,7 +2168,7 @@ array_space[a b] = Value';
 /**
  * Tests the effectiveness of hook_system_info_alter().
  */
-class SystemInfoAlterTestCase extends DrupalWebTestCase {
+class SystemInfoAlterTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'System info alter',
@@ -2233,7 +2235,7 @@ class SystemInfoAlterTestCase extends DrupalWebTestCase {
 /**
  * Tests for the update system functionality.
  */
-class UpdateScriptFunctionalTest extends DrupalWebTestCase {
+class UpdateScriptFunctionalTest extends WebTest {
   private $update_url;
   private $update_user;
 
@@ -2402,7 +2404,7 @@ class UpdateScriptFunctionalTest extends DrupalWebTestCase {
 /**
  * Functional tests for the flood control mechanism.
  */
-class FloodFunctionalTest extends DrupalWebTestCase {
+class FloodFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Flood control mechanism',
@@ -2440,7 +2442,7 @@ class FloodFunctionalTest extends DrupalWebTestCase {
 /**
  * Test HTTP file downloading capability.
  */
-class RetrieveFileTestCase extends DrupalWebTestCase {
+class RetrieveFileTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'HTTP file retrieval',
@@ -2489,7 +2491,7 @@ class RetrieveFileTestCase extends DrupalWebTestCase {
 /**
  * Functional tests shutdown functions.
  */
-class ShutdownFunctionsTest extends DrupalWebTestCase {
+class ShutdownFunctionsTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Shutdown functions',
@@ -2521,7 +2523,7 @@ class ShutdownFunctionsTest extends DrupalWebTestCase {
 /**
  * Tests administrative overview pages.
  */
-class SystemAdminTestCase extends DrupalWebTestCase {
+class SystemAdminTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Administrative pages',
@@ -2636,7 +2638,7 @@ class SystemAdminTestCase extends DrupalWebTestCase {
  *
  * @see Drupal\Component\Graph\Graph
  */
-class GraphUnitTest extends DrupalUnitTestCase {
+class GraphUnitTest extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Directed acyclic graph manipulation',
@@ -2821,7 +2823,7 @@ class GraphUnitTest extends DrupalUnitTestCase {
 /**
  * Tests authorize.php and related hooks.
  */
-class SystemAuthorizeCase extends DrupalWebTestCase {
+class SystemAuthorizeCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Authorize API',
@@ -2874,7 +2876,7 @@ class SystemAuthorizeCase extends DrupalWebTestCase {
 /**
  * Test the handling of requests containing 'index.php'.
  */
-class SystemIndexPhpTest extends DrupalWebTestCase {
+class SystemIndexPhpTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Index.php handling',
diff --git a/core/modules/system/tests/actions.test b/core/modules/system/tests/actions.test
index afcb686..36ae19a 100644
--- a/core/modules/system/tests/actions.test
+++ b/core/modules/system/tests/actions.test
@@ -1,6 +1,8 @@
 <?php
 
-class ActionsConfigurationTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class ActionsConfigurationTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Actions configuration',
@@ -66,7 +68,7 @@ class ActionsConfigurationTestCase extends DrupalWebTestCase {
 /**
  * Test actions executing in a potential loop, and make sure they abort properly.
  */
-class ActionLoopTestCase extends DrupalWebTestCase {
+class ActionLoopTestCase extends WebTest {
   protected $aid;
 
   public static function getInfo() {
diff --git a/core/modules/system/tests/ajax.test b/core/modules/system/tests/ajax.test
index 4f254f8..9a1da2b 100644
--- a/core/modules/system/tests/ajax.test
+++ b/core/modules/system/tests/ajax.test
@@ -1,6 +1,9 @@
 <?php
 
-class AJAXTestCase extends DrupalWebTestCase {
+
+use Drupal\simpletest\WebTest;
+
+class AJAXTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
diff --git a/core/modules/system/tests/batch.test b/core/modules/system/tests/batch.test
index 1e9b31b..05730a8 100644
--- a/core/modules/system/tests/batch.test
+++ b/core/modules/system/tests/batch.test
@@ -5,10 +5,14 @@
  * Tests for the Batch API.
  */
 
+
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * Tests for the Batch API.
  */
-class BatchProcessingTestCase extends DrupalWebTestCase {
+class BatchProcessingTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Batch processing',
@@ -277,7 +281,7 @@ class BatchProcessingTestCase extends DrupalWebTestCase {
 /**
  * Tests for the Batch API Progress page.
  */
-class BatchPageTestCase extends DrupalWebTestCase {
+class BatchPageTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Batch progress page',
@@ -316,7 +320,7 @@ class BatchPageTestCase extends DrupalWebTestCase {
  * Tests the function _batch_api_percentage() to make sure that the rounding
  * works properly in all cases.
  */
-class BatchPercentagesUnitTestCase extends DrupalUnitTestCase {
+class BatchPercentagesUnitTestCase extends UnitTest {
   protected $testCases = array();
 
   public static function getInfo() {
diff --git a/core/modules/system/tests/bootstrap.test b/core/modules/system/tests/bootstrap.test
index 371031a..2bff932 100644
--- a/core/modules/system/tests/bootstrap.test
+++ b/core/modules/system/tests/bootstrap.test
@@ -1,6 +1,9 @@
 <?php
 
-class BootstrapIPAddressTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
+class BootstrapIPAddressTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -98,7 +101,7 @@ class BootstrapIPAddressTestCase extends DrupalWebTestCase {
   }
 }
 
-class BootstrapPageCacheTestCase extends DrupalWebTestCase {
+class BootstrapPageCacheTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -231,7 +234,7 @@ class BootstrapPageCacheTestCase extends DrupalWebTestCase {
   }
 }
 
-class BootstrapVariableTestCase extends DrupalWebTestCase {
+class BootstrapVariableTestCase extends WebTest {
 
   function setUp() {
     parent::setUp('system_test');
@@ -281,7 +284,7 @@ class BootstrapVariableTestCase extends DrupalWebTestCase {
 /**
  * Test hook_boot() and hook_exit().
  */
-class HookBootExitTestCase extends DrupalWebTestCase {
+class HookBootExitTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -336,7 +339,7 @@ class HookBootExitTestCase extends DrupalWebTestCase {
 /**
  * Test drupal_get_filename()'s availability.
  */
-class BootstrapGetFilenameTestCase extends DrupalUnitTestCase {
+class BootstrapGetFilenameTestCase extends UnitTest {
 
   public static function getInfo() {
     return array(
@@ -378,7 +381,7 @@ class BootstrapGetFilenameTestCase extends DrupalUnitTestCase {
   }
 }
 
-class BootstrapTimerTestCase extends DrupalUnitTestCase {
+class BootstrapTimerTestCase extends UnitTest {
 
   public static function getInfo() {
     return array(
@@ -413,7 +416,7 @@ class BootstrapTimerTestCase extends DrupalUnitTestCase {
 /**
  * Test that resetting static variables works.
  */
-class BootstrapResettableStaticTestCase extends DrupalUnitTestCase {
+class BootstrapResettableStaticTestCase extends UnitTest {
 
   public static function getInfo() {
     return array(
@@ -452,7 +455,7 @@ class BootstrapResettableStaticTestCase extends DrupalUnitTestCase {
 /**
  * Test miscellaneous functions in bootstrap.inc.
  */
-class BootstrapMiscTestCase extends DrupalUnitTestCase {
+class BootstrapMiscTestCase extends UnitTest {
 
   public static function getInfo() {
     return array(
@@ -477,7 +480,7 @@ class BootstrapMiscTestCase extends DrupalUnitTestCase {
 /**
  * Tests for overriding server variables via the API.
  */
-class BootstrapOverrideServerVariablesTestCase extends DrupalUnitTestCase {
+class BootstrapOverrideServerVariablesTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Overriding server variables',
diff --git a/core/modules/system/tests/cache.test b/core/modules/system/tests/cache.test
index e5d4435..87f9e4f 100644
--- a/core/modules/system/tests/cache.test
+++ b/core/modules/system/tests/cache.test
@@ -1,6 +1,8 @@
 <?php
 
-class CacheTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class CacheTestCase extends WebTest {
   protected $default_bin = 'page';
   protected $default_cid = 'test_temporary';
   protected $default_value = 'CacheTest';
diff --git a/core/modules/system/tests/common.test b/core/modules/system/tests/common.test
index f0ac957..7d1a35a 100644
--- a/core/modules/system/tests/common.test
+++ b/core/modules/system/tests/common.test
@@ -5,10 +5,13 @@
  * Tests for common.inc functionality.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * Tests for URL generation functions.
  */
-class CommonDrupalAlterTestCase extends DrupalWebTestCase {
+class CommonDrupalAlterTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Alter hook functionality',
@@ -73,7 +76,7 @@ class CommonDrupalAlterTestCase extends DrupalWebTestCase {
  * url() calls module_implements(), which may issue a db query, which requires
  * inheriting from a web test case rather than a unit test case.
  */
-class CommonURLUnitTestCase extends DrupalWebTestCase {
+class CommonURLUnitTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'URL generation tests',
@@ -355,7 +358,7 @@ class CommonURLUnitTestCase extends DrupalWebTestCase {
 /**
  * Tests for check_plain(), filter_xss(), format_string(), and check_url().
  */
-class CommonXssUnitTestCase extends DrupalUnitTestCase {
+class CommonXssUnitTestCase extends UnitTest {
 
   public static function getInfo() {
     return array(
@@ -427,7 +430,7 @@ class CommonXssUnitTestCase extends DrupalUnitTestCase {
 /**
  * Tests file size parsing and formatting functions.
  */
-class CommonSizeUnitTestCase extends DrupalUnitTestCase {
+class CommonSizeUnitTestCase extends UnitTest {
   protected $exact_test_cases;
   protected $rounded_test_cases;
 
@@ -527,7 +530,7 @@ class CommonSizeUnitTestCase extends DrupalUnitTestCase {
 /**
  * Test drupal_explode_tags() and drupal_implode_tags().
  */
-class CommonAutocompleteTagsTestCase extends DrupalUnitTestCase {
+class CommonAutocompleteTagsTestCase extends UnitTest {
   var $validTags = array(
     'Drupal' => 'Drupal',
     'Drupal with some spaces' => 'Drupal with some spaces',
@@ -584,7 +587,7 @@ class CommonAutocompleteTagsTestCase extends DrupalUnitTestCase {
 /**
  * Test the Drupal CSS system.
  */
-class CommonCascadingStylesheetsTestCase extends DrupalWebTestCase {
+class CommonCascadingStylesheetsTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Cascading stylesheets',
@@ -818,7 +821,7 @@ class CommonCascadingStylesheetsTestCase extends DrupalWebTestCase {
 /**
  * Test for cleaning HTML identifiers.
  */
-class CommonHTMLIdentifierTestCase extends DrupalUnitTestCase {
+class CommonHTMLIdentifierTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'HTML identifiers',
@@ -878,7 +881,7 @@ class CommonHTMLIdentifierTestCase extends DrupalUnitTestCase {
 /**
  * CSS Unit Tests.
  */
-class CommonCascadingStylesheetsUnitTestCase extends DrupalUnitTestCase {
+class CommonCascadingStylesheetsUnitTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'CSS Unit Tests',
@@ -930,7 +933,7 @@ class CommonCascadingStylesheetsUnitTestCase extends DrupalUnitTestCase {
 /**
  * Test drupal_http_request().
  */
-class CommonDrupalHTTPRequestTestCase extends DrupalWebTestCase {
+class CommonDrupalHTTPRequestTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Drupal HTTP request',
@@ -1062,7 +1065,7 @@ class CommonDrupalHTTPRequestTestCase extends DrupalWebTestCase {
 /**
  * Tests drupal_add_region_content() and drupal_get_region_content().
  */
-class CommonRegionContentTestCase extends DrupalWebTestCase {
+class CommonRegionContentTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Region content',
@@ -1107,7 +1110,7 @@ class CommonRegionContentTestCase extends DrupalWebTestCase {
 /**
  * Tests drupal_goto() and hook_drupal_goto_alter().
  */
-class CommonDrupalGotoTestCase extends DrupalWebTestCase {
+class CommonDrupalGotoTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Redirect functionality',
@@ -1176,7 +1179,7 @@ class CommonDrupalGotoTestCase extends DrupalWebTestCase {
 /**
  * Tests for the JavaScript system.
  */
-class CommonJavaScriptTestCase extends DrupalWebTestCase {
+class CommonJavaScriptTestCase extends WebTest {
   /**
    * Store configured value for JavaScript preprocessing.
    */
@@ -1632,7 +1635,7 @@ class CommonJavaScriptTestCase extends DrupalWebTestCase {
 /**
  * Tests for drupal_render().
  */
-class CommonDrupalRenderTestCase extends DrupalWebTestCase {
+class CommonDrupalRenderTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'drupal_render()',
@@ -1908,7 +1911,7 @@ class CommonDrupalRenderTestCase extends DrupalWebTestCase {
       . '<hr />' . $this->drupalGetContent()
     );
 
-    // @see DrupalWebTestCase::xpath()
+    // @see WebTest::xpath()
     $xpath = $this->buildXPathQuery($xpath, $xpath_args);
     $element += array('#value' => NULL);
     $this->assertFieldByXPath($xpath, $element['#value'], t('#type @type was properly rendered.', array(
@@ -1951,7 +1954,7 @@ class CommonDrupalRenderTestCase extends DrupalWebTestCase {
 /**
  * Tests URL validation by valid_url().
  */
-class CommonValidUrlUnitTestCase extends DrupalUnitTestCase {
+class CommonValidUrlUnitTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'URL validation',
@@ -2059,7 +2062,7 @@ class CommonValidUrlUnitTestCase extends DrupalUnitTestCase {
 /**
  * Tests number step validation by valid_number_step().
  */
-class CommonValidNumberStepUnitTestCase extends DrupalUnitTestCase {
+class CommonValidNumberStepUnitTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Number step validation',
@@ -2126,7 +2129,7 @@ class CommonValidNumberStepUnitTestCase extends DrupalUnitTestCase {
 /**
  * Tests writing of data records with drupal_write_record().
  */
-class CommonDrupalWriteRecordTestCase extends DrupalWebTestCase {
+class CommonDrupalWriteRecordTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Data record write functionality',
@@ -2262,13 +2265,13 @@ class CommonDrupalWriteRecordTestCase extends DrupalWebTestCase {
 /**
  * Tests SimpleTest error and exception collector.
  */
-class CommonSimpleTestErrorCollectorTestCase extends DrupalWebTestCase {
+class CommonSimpleTestErrorCollectorTestCase extends WebTest {
 
   /**
    * Errors triggered during the test.
    *
    * Errors are intercepted by the overriden implementation
-   * of DrupalWebTestCase::error below.
+   * of WebTest::error below.
    *
    * @var Array
    */
@@ -2353,7 +2356,7 @@ class CommonSimpleTestErrorCollectorTestCase extends DrupalWebTestCase {
 /**
  * Tests the drupal_parse_info_file() API function.
  */
-class CommonDrupalParseInfoFileTestCase extends DrupalUnitTestCase {
+class CommonDrupalParseInfoFileTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Parsing .info files',
@@ -2376,7 +2379,7 @@ class CommonDrupalParseInfoFileTestCase extends DrupalUnitTestCase {
 /**
  * Tests scanning system directories in drupal_system_listing().
  */
-class CommonDrupalSystemListingTestCase extends DrupalWebTestCase {
+class CommonDrupalSystemListingTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Drupal system listing',
@@ -2431,7 +2434,7 @@ class CommonDrupalSystemListingTestCase extends DrupalWebTestCase {
 /**
  * Tests the format_date() function.
  */
-class CommonFormatDateTestCase extends DrupalWebTestCase {
+class CommonFormatDateTestCase extends WebTest {
 
   /**
    * Arbitrary langcode for a custom language.
@@ -2560,7 +2563,7 @@ class CommonFormatDateTestCase extends DrupalWebTestCase {
 /**
  * Tests the drupal_attributes() functionality.
  */
-class CommonDrupalAttributesUnitTestCase extends DrupalUnitTestCase {
+class CommonDrupalAttributesUnitTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'HTML Attributes',
@@ -2600,7 +2603,7 @@ class CommonDrupalAttributesUnitTestCase extends DrupalUnitTestCase {
 /**
  * Tests the various drupal_array_* helper functions.
  */
-class CommonDrupalArrayUnitTest extends DrupalUnitTestCase {
+class CommonDrupalArrayUnitTest extends UnitTest {
 
   /**
    * Form array to check.
@@ -2712,7 +2715,7 @@ class CommonDrupalArrayUnitTest extends DrupalUnitTestCase {
 /**
  * Tests the drupal_json_encode() and drupal_json_decode() functions.
  */
-class CommonJSONUnitTestCase extends DrupalUnitTestCase {
+class CommonJSONUnitTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'JSON',
@@ -2776,7 +2779,7 @@ class CommonJSONUnitTestCase extends DrupalUnitTestCase {
 /**
  * Basic tests for drupal_add_feed().
  */
-class CommonDrupalAddFeedTestCase extends DrupalWebTestCase {
+class CommonDrupalAddFeedTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'drupal_add_feed() tests',
diff --git a/core/modules/system/tests/error.test b/core/modules/system/tests/error.test
index ead3526..141679c 100644
--- a/core/modules/system/tests/error.test
+++ b/core/modules/system/tests/error.test
@@ -3,7 +3,10 @@
 /**
  * Tests Drupal error and exception handlers.
  */
-class DrupalErrorHandlerUnitTest extends DrupalWebTestCase {
+
+use Drupal\simpletest\WebTest;
+
+class DrupalErrorHandlerUnitTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Drupal error handlers',
diff --git a/core/modules/system/tests/file.test b/core/modules/system/tests/file.test
index 173d05a..bd0991c 100644
--- a/core/modules/system/tests/file.test
+++ b/core/modules/system/tests/file.test
@@ -6,6 +6,8 @@
  *  These include FileValidateTest and FileSaveTest.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Helper validator that returns the $errors parameter.
  */
@@ -46,7 +48,7 @@ function file_test_file_scan_callback_reset() {
  * Base class for file tests that adds some additional file specific
  * assertions and helper functions.
  */
-class FileTestCase extends DrupalWebTestCase {
+class FileTestCase extends WebTest {
 
   function setUp() {
     $modules = func_get_args();
@@ -374,7 +376,7 @@ class FileSpaceUsedTest extends FileTestCase {
 /**
  *  This will run tests against the file validation functions (file_validate_*).
  */
-class FileValidatorTest extends DrupalWebTestCase {
+class FileValidatorTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'File validator tests',
@@ -2626,7 +2628,7 @@ class FileNameMungingTest extends FileTestCase {
 /**
  * Tests for file_get_mimetype().
  */
-class FileMimeTypeTest extends DrupalWebTestCase {
+class FileMimeTypeTest extends WebTest {
   function setUp() {
     parent::setUp('file_test');
   }
@@ -2711,7 +2713,7 @@ class FileMimeTypeTest extends DrupalWebTestCase {
 /**
  * Tests stream wrapper functions.
  */
-class StreamWrapperTest extends DrupalWebTestCase {
+class StreamWrapperTest extends WebTest {
 
   protected $scheme = 'dummy';
   protected $classname = 'DrupalDummyStreamWrapper';
diff --git a/core/modules/system/tests/filetransfer.test b/core/modules/system/tests/filetransfer.test
index 8f447d9..30586e5 100644
--- a/core/modules/system/tests/filetransfer.test
+++ b/core/modules/system/tests/filetransfer.test
@@ -2,8 +2,9 @@
 
 use Drupal\Core\FileTransfer\FileTransfer;
 use Drupal\Core\FileTransfer\FileTransferException;
+use Drupal\simpletest\WebTest;
 
-class FileTranferTest extends DrupalWebTestCase {
+class FileTranferTest extends WebTest {
   protected $hostname = 'localhost';
   protected $username = 'drupal';
   protected $password = 'password';
diff --git a/core/modules/system/tests/form.test b/core/modules/system/tests/form.test
index b64fdd7..d5670f5 100644
--- a/core/modules/system/tests/form.test
+++ b/core/modules/system/tests/form.test
@@ -5,7 +5,9 @@
  * Unit tests for the Drupal Form API.
  */
 
-class FormsTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class FormsTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -544,7 +546,7 @@ class FormsTestCase extends DrupalWebTestCase {
 /**
  * Tests building and processing of core form elements.
  */
-class FormElementTestCase extends DrupalWebTestCase {
+class FormElementTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Element processing',
@@ -625,7 +627,7 @@ class FormElementTestCase extends DrupalWebTestCase {
 /**
  * Test form alter hooks.
  */
-class FormAlterTestCase extends DrupalWebTestCase {
+class FormAlterTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Form alter hooks',
@@ -659,7 +661,7 @@ class FormAlterTestCase extends DrupalWebTestCase {
 /**
  * Test form validation handlers.
  */
-class FormValidationTestCase extends DrupalWebTestCase {
+class FormValidationTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Form validation handlers',
@@ -775,7 +777,7 @@ class FormValidationTestCase extends DrupalWebTestCase {
 /**
  * Test form element labels, required markers and associated output.
  */
-class FormsElementsLabelsTestCase extends DrupalWebTestCase {
+class FormsElementsLabelsTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -862,7 +864,7 @@ class FormsElementsLabelsTestCase extends DrupalWebTestCase {
 /**
  * Test the tableselect form element for expected behavior.
  */
-class FormsElementsTableSelectFunctionalTest extends DrupalWebTestCase {
+class FormsElementsTableSelectFunctionalTest extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1088,7 +1090,7 @@ class FormsElementsTableSelectFunctionalTest extends DrupalWebTestCase {
 /**
  * Test the vertical_tabs form element for expected behavior.
  */
-class FormsElementsVerticalTabsFunctionalTest extends DrupalWebTestCase {
+class FormsElementsVerticalTabsFunctionalTest extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1124,7 +1126,7 @@ class FormsElementsVerticalTabsFunctionalTest extends DrupalWebTestCase {
  * when a validation error occurs, it makes sure that changed form element
  * values aren't lost due to a wrong form rebuild.
  */
-class FormsFormStorageTestCase extends DrupalWebTestCase {
+class FormsFormStorageTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1268,7 +1270,7 @@ class FormsFormStorageTestCase extends DrupalWebTestCase {
 /**
  * Test wrapper form callbacks.
  */
-class FormsFormWrapperTestCase extends DrupalWebTestCase {
+class FormsFormWrapperTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Form wrapper callback',
@@ -1294,7 +1296,7 @@ class FormsFormWrapperTestCase extends DrupalWebTestCase {
 /**
  * Test $form_state clearance.
  */
-class FormStateValuesCleanTestCase extends DrupalWebTestCase {
+class FormStateValuesCleanTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Form state values clearance',
@@ -1342,7 +1344,7 @@ class FormStateValuesCleanTestCase extends DrupalWebTestCase {
 /**
  * Tests $form_state clearance with form elements having buttons.
  */
-class FormStateValuesCleanAdvancedTestCase extends DrupalWebTestCase {
+class FormStateValuesCleanAdvancedTestCase extends WebTest {
   /**
    * An image file path for uploading.
    */
@@ -1389,7 +1391,7 @@ class FormStateValuesCleanAdvancedTestCase extends DrupalWebTestCase {
  *
  * @todo Add tests for other aspects of form rebuilding.
  */
-class FormsRebuildTestCase extends DrupalWebTestCase {
+class FormsRebuildTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Form rebuilding',
@@ -1483,7 +1485,7 @@ class FormsRebuildTestCase extends DrupalWebTestCase {
 /**
  * Test the programmatic form submission behavior.
  */
-class FormsProgrammaticTestCase extends DrupalWebTestCase {
+class FormsProgrammaticTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1572,7 +1574,7 @@ class FormsProgrammaticTestCase extends DrupalWebTestCase {
 /**
  * Test that FAPI correctly determines $form_state['triggering_element'].
  */
-class FormsTriggeringElementTestCase extends DrupalWebTestCase {
+class FormsTriggeringElementTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1670,7 +1672,7 @@ class FormsTriggeringElementTestCase extends DrupalWebTestCase {
 /**
  * Tests rebuilding of arbitrary forms by altering them.
  */
-class FormsArbitraryRebuildTestCase extends DrupalWebTestCase {
+class FormsArbitraryRebuildTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Rebuild arbitrary forms',
@@ -1736,7 +1738,7 @@ class FormsArbitraryRebuildTestCase extends DrupalWebTestCase {
 /**
  * Tests form API file inclusion.
  */
-class FormsFileInclusionTestCase extends DrupalWebTestCase {
+class FormsFileInclusionTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1770,7 +1772,7 @@ class FormsFileInclusionTestCase extends DrupalWebTestCase {
 /**
  * Tests checkbox element.
  */
-class FormCheckboxTestCase extends DrupalWebTestCase {
+class FormCheckboxTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1851,7 +1853,7 @@ class FormCheckboxTestCase extends DrupalWebTestCase {
 /**
  * Tests email element.
  */
-class FormEmailTestCase extends DrupalWebTestCase {
+class FormEmailTestCase extends WebTest {
   protected $profile = 'testing';
 
   public static function getInfo() {
@@ -1895,7 +1897,7 @@ class FormEmailTestCase extends DrupalWebTestCase {
 /**
  * Tests url element.
  */
-class FormUrlTestCase extends DrupalWebTestCase {
+class FormUrlTestCase extends WebTest {
   protected $profile = 'testing';
 
   public static function getInfo() {
diff --git a/core/modules/system/tests/image.test b/core/modules/system/tests/image.test
index deead57..716232c 100644
--- a/core/modules/system/tests/image.test
+++ b/core/modules/system/tests/image.test
@@ -5,10 +5,12 @@
  * Tests for core image handling API.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Base class for image manipulation testing.
  */
-class ImageToolkitTestCase extends DrupalWebTestCase {
+class ImageToolkitTestCase extends WebTest {
   protected $toolkit;
   protected $file;
   protected $image;
@@ -194,7 +196,7 @@ class ImageToolkitUnitTest extends ImageToolkitTestCase {
 /**
  * Test the core GD image manipulation functions.
  */
-class ImageToolkitGdTestCase extends DrupalWebTestCase {
+class ImageToolkitGdTestCase extends WebTest {
   // Colors that are used in testing.
   protected $black       = array(0, 0, 0, 0);
   protected $red         = array(255, 0, 0, 0);
diff --git a/core/modules/system/tests/installer.test b/core/modules/system/tests/installer.test
index 82e9957..34d1fbc 100644
--- a/core/modules/system/tests/installer.test
+++ b/core/modules/system/tests/installer.test
@@ -5,10 +5,12 @@
  * Tests for the installer.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests installer language detection.
  */
-class InstallerLanguageTestCase extends DrupalWebTestCase {
+class InstallerLanguageTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/system/tests/lock.test b/core/modules/system/tests/lock.test
index c92846b..7c02bce 100644
--- a/core/modules/system/tests/lock.test
+++ b/core/modules/system/tests/lock.test
@@ -3,7 +3,10 @@
 /**
  * Tests for the lock system.
  */
-class LockFunctionalTest extends DrupalWebTestCase {
+
+use Drupal\simpletest\WebTest;
+
+class LockFunctionalTest extends WebTest {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/system/tests/mail.test b/core/modules/system/tests/mail.test
index 5d33102..230a3a9 100644
--- a/core/modules/system/tests/mail.test
+++ b/core/modules/system/tests/mail.test
@@ -6,11 +6,12 @@
  */
 
 use Drupal\Core\Mail\MailInterface;
+use Drupal\simpletest\WebTest;
 
 /**
  * Defines a mail class used for testing.
  */
-class MailTestCase extends DrupalWebTestCase implements MailInterface {
+class MailTestCase extends WebTest implements MailInterface {
   /**
    * The most recent message that was sent through the test case.
    *
@@ -91,7 +92,7 @@ class MailTestCase extends DrupalWebTestCase implements MailInterface {
 /**
  * Unit tests for drupal_html_to_text().
  */
-class DrupalHtmlToTextTestCase extends DrupalWebTestCase {
+class DrupalHtmlToTextTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name'  => 'HTML to text conversion',
diff --git a/core/modules/system/tests/menu.test b/core/modules/system/tests/menu.test
index 0a10ec8..24bd30d 100644
--- a/core/modules/system/tests/menu.test
+++ b/core/modules/system/tests/menu.test
@@ -5,7 +5,10 @@
  * Provides SimpleTests for menu.inc.
  */
 
-class MenuWebTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
+class MenuWebTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -18,13 +21,13 @@ class MenuWebTestCase extends DrupalWebTestCase {
    * Assert that a given path shows certain breadcrumb links.
    *
    * @param string $goto
-   *   (optional) A system path to pass to DrupalWebTestCase::drupalGet().
+   *   (optional) A system path to pass to WebTest::drupalGet().
    * @param array $trail
    *   An associative array whose keys are expected breadcrumb link paths and
    *   whose values are expected breadcrumb link texts (not sanitized).
    * @param string $page_title
    *   (optional) A page title to additionally assert via
-   *   DrupalWebTestCase::assertTitle(). Without site name suffix.
+   *   WebTest::assertTitle(). Without site name suffix.
    * @param array $tree
    *   (optional) An associative array whose keys are link paths and whose
    *   values are link titles (not sanitized) of an expected active trail in a
@@ -121,7 +124,7 @@ class MenuWebTestCase extends DrupalWebTestCase {
   }
 }
 
-class MenuRouterTestCase extends DrupalWebTestCase {
+class MenuRouterTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Menu router',
@@ -664,7 +667,7 @@ class MenuRouterTestCase extends DrupalWebTestCase {
 /**
  * Tests for menu links.
  */
-class MenuLinksUnitTestCase extends DrupalWebTestCase {
+class MenuLinksUnitTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Menu links',
@@ -880,7 +883,7 @@ class MenuLinksUnitTestCase extends DrupalWebTestCase {
 /**
  * Tests rebuilding the menu by setting 'menu_rebuild_needed.'
  */
-class MenuRebuildTestCase extends DrupalWebTestCase {
+class MenuRebuildTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Menu rebuild test',
@@ -918,7 +921,7 @@ class MenuRebuildTestCase extends DrupalWebTestCase {
 /**
  * Menu tree data related tests.
  */
-class MenuTreeDataTestCase extends DrupalUnitTestCase {
+class MenuTreeDataTestCase extends UnitTest {
   /**
    * Dummy link structure acceptable for menu_tree_data().
    */
@@ -973,7 +976,7 @@ class MenuTreeDataTestCase extends DrupalUnitTestCase {
 /**
  * Menu tree output related tests.
  */
-class MenuTreeOutputTestCase extends DrupalWebTestCase {
+class MenuTreeOutputTestCase extends WebTest {
   /**
    * Dummy link structure acceptable for menu_tree_output().
    */
diff --git a/core/modules/system/tests/module.test b/core/modules/system/tests/module.test
index 19acf60..d5ba2b2 100644
--- a/core/modules/system/tests/module.test
+++ b/core/modules/system/tests/module.test
@@ -5,10 +5,12 @@
  * Tests for the module API.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Unit tests for the module API.
  */
-class ModuleUnitTest extends DrupalWebTestCase {
+class ModuleUnitTest extends WebTest {
   // Requires Standard profile modules/dependencies.
   protected $profile = 'standard';
 
@@ -241,7 +243,7 @@ class ModuleUnitTest extends DrupalWebTestCase {
 /**
  * Tests class loading.
  */
-class ModuleClassLoaderTestCase extends DrupalWebTestCase {
+class ModuleClassLoaderTestCase extends WebTest {
   protected $profile = 'testing';
 
   public static function getInfo() {
@@ -279,7 +281,7 @@ class ModuleClassLoaderTestCase extends DrupalWebTestCase {
 /**
  * Unit tests for module installation.
  */
-class ModuleInstallTestCase extends DrupalWebTestCase {
+class ModuleInstallTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Module installation',
@@ -316,7 +318,7 @@ class ModuleInstallTestCase extends DrupalWebTestCase {
 /**
  * Unit tests for module uninstallation and related hooks.
  */
-class ModuleUninstallTestCase extends DrupalWebTestCase {
+class ModuleUninstallTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Module uninstallation',
diff --git a/core/modules/system/tests/modules/database_test/database_test.test b/core/modules/system/tests/modules/database_test/database_test.test
index bec0c16..459ddfc 100644
--- a/core/modules/system/tests/modules/database_test/database_test.test
+++ b/core/modules/system/tests/modules/database_test/database_test.test
@@ -8,6 +8,7 @@ use Drupal\Core\Database\TransactionNoActiveException;
 use Drupal\Core\Database\Query\Merge;
 use Drupal\Core\Database\Query\InvalidMergeQueryException;
 use Drupal\Core\Database\Query\NoFieldsException;
+use Drupal\simpletest\WebTest;
 
 /**
  * Dummy class for fetching into a class.
@@ -24,7 +25,7 @@ class FakeRecord { }
  * Because all database tests share the same test data, we can centralize that
  * here.
  */
-class DatabaseTestCase extends DrupalWebTestCase {
+class DatabaseTestCase extends WebTest {
   function setUp() {
     $modules = func_get_args();
     if (isset($modules[0]) && is_array($modules[0])) {
@@ -2958,7 +2959,7 @@ class DatabaseSerializeQueryTestCase extends DatabaseTestCase {
 /**
  * Range query tests.
  */
-class DatabaseRangeQueryTestCase extends DrupalWebTestCase {
+class DatabaseRangeQueryTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Range query test',
@@ -2989,7 +2990,7 @@ class DatabaseRangeQueryTestCase extends DrupalWebTestCase {
 /**
  * Temporary query tests.
  */
-class DatabaseTemporaryQueryTestCase extends DrupalWebTestCase {
+class DatabaseTemporaryQueryTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Temporary query test',
@@ -3747,7 +3748,7 @@ class DatabaseTransactionTestCase extends DatabaseTestCase {
 /**
  * Check the sequences API.
  */
-class DatabaseNextIdCase extends DrupalWebTestCase {
+class DatabaseNextIdCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => t('Sequences API'),
@@ -3774,7 +3775,7 @@ class DatabaseNextIdCase extends DrupalWebTestCase {
 /**
  * Tests the empty pseudo-statement class.
  */
-class DatabaseEmptyStatementTestCase extends DrupalWebTestCase {
+class DatabaseEmptyStatementTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => t('Empty statement'),
diff --git a/core/modules/system/tests/pager.test b/core/modules/system/tests/pager.test
index 6fdeec5..adcdba1 100644
--- a/core/modules/system/tests/pager.test
+++ b/core/modules/system/tests/pager.test
@@ -5,10 +5,12 @@
  * Tests for pager functionality.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests pager functionality.
  */
-class PagerFunctionalWebTestCase extends DrupalWebTestCase {
+class PagerFunctionalWebTestCase extends WebTest {
   protected $profile = 'testing';
 
   public static function getInfo() {
diff --git a/core/modules/system/tests/password.test b/core/modules/system/tests/password.test
index 2797786..9356462 100644
--- a/core/modules/system/tests/password.test
+++ b/core/modules/system/tests/password.test
@@ -5,10 +5,12 @@
  * Provides unit tests for password.inc.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Unit tests for password hashing API.
  */
-class PasswordHashingTest extends DrupalWebTestCase {
+class PasswordHashingTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Password hashing',
diff --git a/core/modules/system/tests/path.test b/core/modules/system/tests/path.test
index fe6f734..1972289 100644
--- a/core/modules/system/tests/path.test
+++ b/core/modules/system/tests/path.test
@@ -5,12 +5,14 @@
  * Tests for path.inc.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Unit tests for the drupal_match_path() function in path.inc.
  *
  * @see drupal_match_path().
  */
-class DrupalMatchPathTestCase extends DrupalWebTestCase {
+class DrupalMatchPathTestCase extends WebTest {
   protected $front;
 
   public static function getInfo() {
@@ -129,7 +131,7 @@ class DrupalMatchPathTestCase extends DrupalWebTestCase {
 /**
  * Tests hook_url_alter functions.
  */
-class UrlAlterFunctionalTest extends DrupalWebTestCase {
+class UrlAlterFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => t('URL altering'),
@@ -247,7 +249,7 @@ class UrlAlterFunctionalTest extends DrupalWebTestCase {
 /**
  * Unit test for drupal_lookup_path().
  */
-class PathLookupTest extends DrupalWebTestCase {
+class PathLookupTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => t('Path lookup'),
@@ -337,7 +339,7 @@ class PathLookupTest extends DrupalWebTestCase {
 /**
  * Tests the path_save() function.
  */
-class PathSaveTest extends DrupalWebTestCase {
+class PathSaveTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => t('Path save'),
diff --git a/core/modules/system/tests/queue.test b/core/modules/system/tests/queue.test
index e8f4c2c..5809e86 100644
--- a/core/modules/system/tests/queue.test
+++ b/core/modules/system/tests/queue.test
@@ -2,11 +2,12 @@
 
 use Drupal\Core\Queue\Memory;
 use Drupal\Core\Queue\System;
+use Drupal\simpletest\WebTest;
 
 /**
  * Tests the basic queue functionality.
  */
-class QueueTestCase extends DrupalWebTestCase {
+class QueueTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Queue functionality',
diff --git a/core/modules/system/tests/registry.test b/core/modules/system/tests/registry.test
index bcd8d4e..9a74e5f 100644
--- a/core/modules/system/tests/registry.test
+++ b/core/modules/system/tests/registry.test
@@ -1,6 +1,8 @@
 <?php
 
-class RegistryParseFileTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class RegistryParseFileTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Registry parse file test',
@@ -45,7 +47,7 @@ CONTENTS;
 
 }
 
-class RegistryParseFilesTestCase extends DrupalWebTestCase {
+class RegistryParseFilesTestCase extends WebTest {
   protected $fileTypes = array('new', 'existing_changed');
 
   public static function getInfo() {
diff --git a/core/modules/system/tests/schema.test b/core/modules/system/tests/schema.test
index 5a10567..0c4b888 100644
--- a/core/modules/system/tests/schema.test
+++ b/core/modules/system/tests/schema.test
@@ -1,6 +1,7 @@
 <?php
 
 use Drupal\Core\Database\Database;
+use Drupal\simpletest\WebTest;
 
 /**
  * @file
@@ -10,7 +11,7 @@ use Drupal\Core\Database\Database;
 /**
  * Unit tests for the Schema API.
  */
-class SchemaTestCase extends DrupalWebTestCase {
+class SchemaTestCase extends WebTest {
   /**
    * A global counter for table and field creation.
    */
diff --git a/core/modules/system/tests/session.test b/core/modules/system/tests/session.test
index 5cc8fe9..119e6bf 100644
--- a/core/modules/system/tests/session.test
+++ b/core/modules/system/tests/session.test
@@ -5,7 +5,9 @@
  * Provides SimpleTests for core session handling functionality.
  */
 
-class SessionTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class SessionTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Session tests',
@@ -293,7 +295,7 @@ class SessionTestCase extends DrupalWebTestCase {
 /**
  * Ensure that when running under https two session cookies are generated.
  */
-class SessionHttpsTestCase extends DrupalWebTestCase {
+class SessionHttpsTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/system/tests/symfony.test b/core/modules/system/tests/symfony.test
index 8a7ecb9..cdf4edf 100644
--- a/core/modules/system/tests/symfony.test
+++ b/core/modules/system/tests/symfony.test
@@ -5,10 +5,12 @@
  * Tests for Symfony2-related functionality.
  */
 
+use Drupal\simpletest\UnitTest;
+
 /**
  * Tests related to Symfony class loading.
  */
-class SymfonyClassLoaderTestCase extends DrupalUnitTestCase {
+class SymfonyClassLoaderTestCase extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Class loader',
diff --git a/core/modules/system/tests/tablesort.test b/core/modules/system/tests/tablesort.test
index 9c068f8..221e381 100644
--- a/core/modules/system/tests/tablesort.test
+++ b/core/modules/system/tests/tablesort.test
@@ -5,10 +5,13 @@
  * Various tablesort tests.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * Test unicode handling features implemented in unicode.inc.
  */
-class TableSortTest extends DrupalUnitTestCase {
+class TableSortTest extends UnitTest {
 
   /**
    * Storage for initial value of $_GET.
diff --git a/core/modules/system/tests/theme.test b/core/modules/system/tests/theme.test
index c1ba08f..557aefd 100644
--- a/core/modules/system/tests/theme.test
+++ b/core/modules/system/tests/theme.test
@@ -5,10 +5,13 @@
  * Tests for the theme API.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * Unit tests for the Theme API.
  */
-class ThemeUnitTest extends DrupalWebTestCase {
+class ThemeUnitTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Theme API',
@@ -172,7 +175,7 @@ class ThemeUnitTest extends DrupalWebTestCase {
 /**
  * Unit tests for theme_table().
  */
-class ThemeTableUnitTest extends DrupalWebTestCase {
+class ThemeTableUnitTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Theme Table',
@@ -232,7 +235,7 @@ class ThemeTableUnitTest extends DrupalWebTestCase {
 /**
  * Tests for common theme functions.
  */
-class ThemeFunctionsTestCase extends DrupalWebTestCase {
+class ThemeFunctionsTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Theme functions',
@@ -490,7 +493,7 @@ class ThemeFunctionsTestCase extends DrupalWebTestCase {
 /**
  * Functional test for initialization of the theme system in hook_init().
  */
-class ThemeHookInitUnitTest extends DrupalWebTestCase {
+class ThemeHookInitUnitTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Theme initialization in hook_init()',
@@ -519,7 +522,7 @@ class ThemeHookInitUnitTest extends DrupalWebTestCase {
 /**
  * Tests autocompletion not loading registry.
  */
-class ThemeFastTestCase extends DrupalWebTestCase {
+class ThemeFastTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Theme fast initialization',
@@ -546,7 +549,7 @@ class ThemeFastTestCase extends DrupalWebTestCase {
 /**
  * Unit tests for theme_html_tag().
  */
-class ThemeHtmlTag extends DrupalUnitTestCase {
+class ThemeHtmlTag extends UnitTest {
   public static function getInfo() {
     return array(
       'name' => 'Theme HTML Tag',
@@ -572,7 +575,7 @@ class ThemeHtmlTag extends DrupalUnitTestCase {
 /**
  * Functional test for attributes of html.tpl.php.
  */
-class ThemeHtmlTplPhpAttributesTestCase extends DrupalWebTestCase {
+class ThemeHtmlTplPhpAttributesTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'html.tpl.php html and body attributes',
@@ -600,7 +603,7 @@ class ThemeHtmlTplPhpAttributesTestCase extends DrupalWebTestCase {
 /**
  * Tests for the ThemeRegistry class.
  */
-class ThemeRegistryTestCase extends DrupalWebTestCase {
+class ThemeRegistryTestCase extends WebTest {
   protected $profile = 'testing';
   public static function getInfo() {
     return array(
@@ -651,7 +654,7 @@ class ThemeRegistryTestCase extends DrupalWebTestCase {
 /**
  * Tests for theme_datetime().
  */
-class ThemeDatetime extends DrupalWebTestCase {
+class ThemeDatetime extends WebTest {
   protected $profile = 'testing';
 
   public static function getInfo() {
diff --git a/core/modules/system/tests/unicode.test b/core/modules/system/tests/unicode.test
index c50a437..1213700 100644
--- a/core/modules/system/tests/unicode.test
+++ b/core/modules/system/tests/unicode.test
@@ -5,10 +5,13 @@
  * Various unicode handling tests.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * Test unicode handling features implemented in unicode.inc.
  */
-class UnicodeUnitTest extends DrupalUnitTestCase {
+class UnicodeUnitTest extends UnitTest {
 
   /**
    * Whether to run the extended version of the tests (including non latin1 characters).
diff --git a/core/modules/system/tests/update.test b/core/modules/system/tests/update.test
index abbab47..80e576a 100644
--- a/core/modules/system/tests/update.test
+++ b/core/modules/system/tests/update.test
@@ -5,10 +5,12 @@
  * Tests for the update system.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests for the update dependency ordering system.
  */
-class UpdateDependencyOrderingTestCase extends DrupalWebTestCase {
+class UpdateDependencyOrderingTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Update dependency ordering',
@@ -58,7 +60,7 @@ class UpdateDependencyOrderingTestCase extends DrupalWebTestCase {
 /**
  * Tests for missing update dependencies.
  */
-class UpdateDependencyMissingTestCase extends DrupalWebTestCase {
+class UpdateDependencyMissingTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Missing update dependencies',
@@ -88,7 +90,7 @@ class UpdateDependencyMissingTestCase extends DrupalWebTestCase {
 /**
  * Tests for the invocation of hook_update_dependencies().
  */
-class UpdateDependencyHookInvocationTestCase extends DrupalWebTestCase {
+class UpdateDependencyHookInvocationTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Update dependency hook invocation',
diff --git a/core/modules/system/tests/upgrade/upgrade.language.test b/core/modules/system/tests/upgrade/upgrade.language.test
index e473c63..6162575 100644
--- a/core/modules/system/tests/upgrade/upgrade.language.test
+++ b/core/modules/system/tests/upgrade/upgrade.language.test
@@ -4,6 +4,8 @@
  * Upgrade tests for the Language module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Tests upgrading a filled database with language data.
  *
diff --git a/core/modules/system/tests/upgrade/upgrade.test b/core/modules/system/tests/upgrade/upgrade.test
index e4045be..972cea0 100644
--- a/core/modules/system/tests/upgrade/upgrade.test
+++ b/core/modules/system/tests/upgrade/upgrade.test
@@ -1,11 +1,12 @@
 <?php
 
 use Drupal\Core\Database\Database;
+use Drupal\simpletest\WebTest;
 
 /**
  * Perform end-to-end tests of the upgrade path.
  */
-abstract class UpgradePathTestCase extends DrupalWebTestCase {
+abstract class UpgradePathTestCase extends WebTest {
 
   /**
    * The file path(s) to the dumped database(s) to load into the child site.
@@ -42,7 +43,7 @@ abstract class UpgradePathTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Override of DrupalWebTestCase::setUp() specialized for upgrade testing.
+   * Override of WebTest::setUp() specialized for upgrade testing.
    */
   protected function setUp() {
     global $user, $language_interface, $conf;
@@ -146,7 +147,7 @@ abstract class UpgradePathTestCase extends DrupalWebTestCase {
   }
 
   /**
-   * Override of DrupalWebTestCase::tearDown() specialized for upgrade testing.
+   * Override of WebTest::tearDown() specialized for upgrade testing.
    */
   protected function tearDown() {
     global $user, $language_interface;
diff --git a/core/modules/system/tests/upgrade/upgrade_bare.test b/core/modules/system/tests/upgrade/upgrade_bare.test
index 71553d3..dcb3ce8 100644
--- a/core/modules/system/tests/upgrade/upgrade_bare.test
+++ b/core/modules/system/tests/upgrade/upgrade_bare.test
@@ -1,5 +1,7 @@
 <?php
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Upgrade test for the bare database..
  *
diff --git a/core/modules/system/tests/upgrade/upgrade_filled.test b/core/modules/system/tests/upgrade/upgrade_filled.test
index 947d830..68ea7a8 100644
--- a/core/modules/system/tests/upgrade/upgrade_filled.test
+++ b/core/modules/system/tests/upgrade/upgrade_filled.test
@@ -1,5 +1,7 @@
 <?php
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Upgrade test for the filled database..
  *
diff --git a/core/modules/system/tests/uuid.test b/core/modules/system/tests/uuid.test
index 0e1d679..47cfe4f 100644
--- a/core/modules/system/tests/uuid.test
+++ b/core/modules/system/tests/uuid.test
@@ -1,11 +1,13 @@
 <?php
 
 use Drupal\Component\Uuid\Uuid;
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
 
 /**
  * Tests the Drupal\Component\Uuid\Uuid class.
  */
-class UuidUnitTestCase extends DrupalUnitTestCase {
+class UuidUnitTestCase extends UnitTest {
 
   /**
    * The UUID object to be used for generating UUIDs.
diff --git a/core/modules/system/tests/xmlrpc.test b/core/modules/system/tests/xmlrpc.test
index 60b9624..556b9a4 100644
--- a/core/modules/system/tests/xmlrpc.test
+++ b/core/modules/system/tests/xmlrpc.test
@@ -1,9 +1,11 @@
 <?php
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Perform basic XML-RPC tests that do not require addition callbacks.
  */
-class XMLRPCBasicTestCase extends DrupalWebTestCase {
+class XMLRPCBasicTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -80,7 +82,7 @@ class XMLRPCBasicTestCase extends DrupalWebTestCase {
   }
 }
 
-class XMLRPCValidator1IncTestCase extends DrupalWebTestCase {
+class XMLRPCValidator1IncTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'XML-RPC validator',
@@ -194,7 +196,7 @@ class XMLRPCValidator1IncTestCase extends DrupalWebTestCase {
   }
 }
 
-class XMLRPCMessagesTestCase extends DrupalWebTestCase {
+class XMLRPCMessagesTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name'  => 'XML-RPC message and alteration',
diff --git a/core/modules/taxonomy/taxonomy.test b/core/modules/taxonomy/taxonomy.test
index 5c16884..b13eb2e 100644
--- a/core/modules/taxonomy/taxonomy.test
+++ b/core/modules/taxonomy/taxonomy.test
@@ -5,10 +5,12 @@
  * Tests for taxonomy.module.
  */
 
+use Drupal\simpletest\WebTest;
+
 /**
  * Provides common helper methods for Taxonomy module tests.
  */
-class TaxonomyWebTestCase extends DrupalWebTestCase {
+class TaxonomyWebTestCase extends WebTest {
 
   function setUp() {
     $modules = func_get_args();
diff --git a/core/modules/tracker/lib/Drupal/tracker/Tests/TrackerTest.php b/core/modules/tracker/lib/Drupal/tracker/Tests/TrackerTest.php
index 5e689ff..b0f51f4 100644
--- a/core/modules/tracker/lib/Drupal/tracker/Tests/TrackerTest.php
+++ b/core/modules/tracker/lib/Drupal/tracker/Tests/TrackerTest.php
@@ -7,12 +7,12 @@
 
 namespace Drupal\tracker\Tests;
 
-use DrupalWebTestCase;
+use Drupal\simpletest\WebTest;
 
 /**
  * Defines a base class for testing tracker.module.
  */
-class TrackerTest extends DrupalWebTestCase {
+class TrackerTest extends WebTest {
 
   /**
    * The main user for testing.
diff --git a/core/modules/translation/translation.test b/core/modules/translation/translation.test
index 15a324e..3ba561f 100644
--- a/core/modules/translation/translation.test
+++ b/core/modules/translation/translation.test
@@ -6,11 +6,12 @@
  */
 
 use Drupal\node\Node;
+use Drupal\simpletest\WebTest;
 
 /**
  * Functional tests for the Translation module.
  */
-class TranslationTestCase extends DrupalWebTestCase {
+class TranslationTestCase extends WebTest {
   protected $profile = 'standard';
 
   protected $book;
diff --git a/core/modules/update/update.test b/core/modules/update/update.test
index c8cfdd4..dd12579 100644
--- a/core/modules/update/update.test
+++ b/core/modules/update/update.test
@@ -19,10 +19,13 @@
  * initial state and availability scenario.
  */
 
+use Drupal\simpletest\WebTest;
+use Drupal\simpletest\UnitTest;
+
 /**
  * Base class to define some shared functions used by all update tests.
  */
-class UpdateTestHelper extends DrupalWebTestCase {
+class UpdateTestHelper extends WebTest {
   /**
    * Refresh the update status based on the desired available update scenario.
    *
@@ -725,7 +728,7 @@ class UpdateTestUploadCase extends UpdateTestHelper {
 
 }
 
-class UpdateCoreUnitTestCase extends DrupalUnitTestCase {
+class UpdateCoreUnitTestCase extends UnitTest {
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/user/user.test b/core/modules/user/user.test
index c911088..2a5aa86 100644
--- a/core/modules/user/user.test
+++ b/core/modules/user/user.test
@@ -5,7 +5,9 @@
  * Tests for user.module.
  */
 
-class UserRegistrationTestCase extends DrupalWebTestCase {
+use Drupal\simpletest\WebTest;
+
+class UserRegistrationTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User registration',
@@ -258,7 +260,7 @@ class UserRegistrationTestCase extends DrupalWebTestCase {
   }
 }
 
-class UserValidationTestCase extends DrupalWebTestCase {
+class UserValidationTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'Username/e-mail validation',
@@ -298,7 +300,7 @@ class UserValidationTestCase extends DrupalWebTestCase {
 /**
  * Functional tests for user logins, including rate limiting of login attempts.
  */
-class UserLoginTestCase extends DrupalWebTestCase {
+class UserLoginTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User login',
@@ -441,7 +443,7 @@ class UserLoginTestCase extends DrupalWebTestCase {
 /**
  * Tests resetting a user password.
  */
-class UserPasswordResetTestCase extends DrupalWebTestCase {
+class UserPasswordResetTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -493,7 +495,7 @@ class UserPasswordResetTestCase extends DrupalWebTestCase {
 /**
  * Test cancelling a user.
  */
-class UserCancelTestCase extends DrupalWebTestCase {
+class UserCancelTestCase extends WebTest {
   protected $profile = 'standard';
 
   public static function getInfo() {
@@ -919,7 +921,7 @@ class UserCancelTestCase extends DrupalWebTestCase {
   }
 }
 
-class UserPictureTestCase extends DrupalWebTestCase {
+class UserPictureTestCase extends WebTest {
   protected $user;
   protected $_directory_test;
 
@@ -1228,7 +1230,7 @@ class UserPictureTestCase extends DrupalWebTestCase {
 }
 
 
-class UserPermissionsTestCase extends DrupalWebTestCase {
+class UserPermissionsTestCase extends WebTest {
   protected $admin_user;
   protected $rid;
 
@@ -1326,7 +1328,7 @@ class UserPermissionsTestCase extends DrupalWebTestCase {
   }
 }
 
-class UserAdminTestCase extends DrupalWebTestCase {
+class UserAdminTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User administration',
@@ -1415,7 +1417,7 @@ class UserAdminTestCase extends DrupalWebTestCase {
 /**
  * Tests for user-configurable time zones.
  */
-class UserTimeZoneFunctionalTest extends DrupalWebTestCase {
+class UserTimeZoneFunctionalTest extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User time zones',
@@ -1475,7 +1477,7 @@ class UserTimeZoneFunctionalTest extends DrupalWebTestCase {
 /**
  * Test user autocompletion.
  */
-class UserAutocompleteTestCase extends DrupalWebTestCase {
+class UserAutocompleteTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User autocompletion',
@@ -1516,7 +1518,7 @@ class UserAutocompleteTestCase extends DrupalWebTestCase {
 /**
  * Test user-links in secondary menu.
  */
-class UserAccountLinksUnitTests extends DrupalWebTestCase {
+class UserAccountLinksUnitTests extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User account links',
@@ -1565,7 +1567,7 @@ class UserAccountLinksUnitTests extends DrupalWebTestCase {
 /**
  * Test user blocks.
  */
-class UserBlocksUnitTests extends DrupalWebTestCase {
+class UserBlocksUnitTests extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User blocks',
@@ -1673,7 +1675,7 @@ class UserBlocksUnitTests extends DrupalWebTestCase {
 /**
  * Tests user_save() behavior.
  */
-class UserSaveTestCase extends DrupalWebTestCase {
+class UserSaveTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1715,7 +1717,7 @@ class UserSaveTestCase extends DrupalWebTestCase {
 /**
  * Test the create user administration page.
  */
-class UserCreateTestCase extends DrupalWebTestCase {
+class UserCreateTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1761,7 +1763,7 @@ class UserCreateTestCase extends DrupalWebTestCase {
 /**
  * Tests the user edit form.
  */
-class UserEditTestCase extends DrupalWebTestCase {
+class UserEditTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1853,7 +1855,7 @@ class UserEditTestCase extends DrupalWebTestCase {
 /**
  * Test case for user signatures.
  */
-class UserSignatureTestCase extends DrupalWebTestCase {
+class UserSignatureTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User signatures',
@@ -1957,7 +1959,7 @@ class UserSignatureTestCase extends DrupalWebTestCase {
 /*
  * Test that a user, having editing their own account, can still log in.
  */
-class UserEditedOwnAccountTestCase extends DrupalWebTestCase {
+class UserEditedOwnAccountTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -1993,7 +1995,7 @@ class UserEditedOwnAccountTestCase extends DrupalWebTestCase {
 /**
  * Test case to test adding, editing and deleting roles.
  */
-class UserRoleAdminTestCase extends DrupalWebTestCase {
+class UserRoleAdminTestCase extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -2078,7 +2080,7 @@ class UserRoleAdminTestCase extends DrupalWebTestCase {
 /**
  * Test user token replacement in strings.
  */
-class UserTokenReplaceTestCase extends DrupalWebTestCase {
+class UserTokenReplaceTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User token replacement',
@@ -2143,7 +2145,7 @@ class UserTokenReplaceTestCase extends DrupalWebTestCase {
 /**
  * Test user search.
  */
-class UserUserSearchTestCase extends DrupalWebTestCase {
+class UserUserSearchTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User search',
@@ -2179,7 +2181,7 @@ class UserUserSearchTestCase extends DrupalWebTestCase {
 /**
  * Test role assignment.
  */
-class UserRolesAssignmentTestCase extends DrupalWebTestCase {
+class UserRolesAssignmentTestCase extends WebTest {
   protected $admin_user;
 
   public static function getInfo() {
@@ -2269,7 +2271,7 @@ class UserRolesAssignmentTestCase extends DrupalWebTestCase {
 /**
  * Unit test for authmap assignment.
  */
-class UserAuthmapAssignmentTestCase extends DrupalWebTestCase {
+class UserAuthmapAssignmentTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => t('Authmap assignment'),
@@ -2328,7 +2330,7 @@ class UserAuthmapAssignmentTestCase extends DrupalWebTestCase {
 /**
  * Tests user_validate_current_pass on a custom form.
  */
-class UserValidateCurrentPassCustomForm extends DrupalWebTestCase {
+class UserValidateCurrentPassCustomForm extends WebTest {
 
   public static function getInfo() {
     return array(
@@ -2373,7 +2375,7 @@ class UserValidateCurrentPassCustomForm extends DrupalWebTestCase {
 /**
  * Test user entity callbacks.
  */
-class UserEntityCallbacksTestCase extends DrupalWebTestCase {
+class UserEntityCallbacksTestCase extends WebTest {
   public static function getInfo() {
     return array(
       'name' => 'User entity callback tests',
diff --git a/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test
index 198c1d8..8c873df 100644
--- a/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test
+++ b/profiles/testing/modules/drupal_system_listing_compatible_test/drupal_system_listing_compatible_test.test
@@ -1,9 +1,12 @@
 <?php
 
+
+use Drupal\simpletest\WebTest;
+
 /**
  * Helper to verify tests in installation profile modules.
  */
-class DrupalSystemListingCompatibleTestCase extends DrupalWebTestCase {
+class DrupalSystemListingCompatibleTestCase extends WebTest {
   /**
    * Use the Minimal profile.
    *
