diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/CacheTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Cache/CacheTestBase.php
new file mode 100644
index 0000000..e8a6b6f
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/CacheTestBase.php
@@ -0,0 +1,115 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Cache\CacheTestBase.
+ */
+
+namespace Drupal\system\Tests\Cache;
+
+use Drupal\simpletest\WebTestBase;
+
+/**
+ * Provides helper methods for cache tests.
+ */
+class CacheTestBase extends WebTestBase {
+  protected $default_bin = 'page';
+  protected $default_cid = 'test_temporary';
+  protected $default_value = 'CacheTest';
+
+  /**
+   * Check whether or not a cache entry exists.
+   *
+   * @param $cid
+   *   The cache id.
+   * @param $var
+   *   The variable the cache should contain.
+   * @param $bin
+   *   The bin the cache item was stored in.
+   * @return
+   *   TRUE on pass, FALSE on fail.
+   */
+  protected function checkCacheExists($cid, $var, $bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+
+    $cached = cache($bin)->get($cid);
+
+    return isset($cached->data) && $cached->data == $var;
+  }
+
+  /**
+   * Assert or a cache entry exists.
+   *
+   * @param $message
+   *   Message to display.
+   * @param $var
+   *   The variable the cache should contain.
+   * @param $cid
+   *   The cache id.
+   * @param $bin
+   *   The bin the cache item was stored in.
+   */
+  protected function assertCacheExists($message, $var = NULL, $cid = NULL, $bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+    if ($cid == NULL) {
+      $cid = $this->default_cid;
+    }
+    if ($var == NULL) {
+      $var = $this->default_value;
+    }
+
+    $this->assertTrue($this->checkCacheExists($cid, $var, $bin), $message);
+  }
+
+  /**
+   * Assert or a cache entry has been removed.
+   *
+   * @param $message
+   *   Message to display.
+   * @param $cid
+   *   The cache id.
+   * @param $bin
+   *   The bin the cache item was stored in.
+   */
+  function assertCacheRemoved($message, $cid = NULL, $bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+    if ($cid == NULL) {
+      $cid = $this->default_cid;
+    }
+
+    $cached = cache($bin)->get($cid);
+    $this->assertFalse($cached, $message);
+  }
+
+  /**
+   * Perform the general wipe.
+   * @param $bin
+   *   The bin to perform the wipe on.
+   */
+  protected function generalWipe($bin = NULL) {
+    if ($bin == NULL) {
+      $bin = $this->default_bin;
+    }
+
+    cache($bin)->expire();
+  }
+
+  /**
+   * Setup the lifetime settings for caching.
+   *
+   * @param $time
+   *   The time in seconds the cache should minimal live.
+   */
+  protected function setupLifetime($time) {
+    $config = config('system.performance');
+    $config->set('cache_lifetime', $time);
+    $config->save();
+    variable_set('cache_flush', 0);
+  }
+}
diff --git a/core/modules/system/tests/cache.test b/core/modules/system/lib/Drupal/system/Tests/Cache/ClearTest.php
similarity index 39%
rename from core/modules/system/tests/cache.test
rename to core/modules/system/lib/Drupal/system/Tests/Cache/ClearTest.php
index 8a5d9ff..c028bb5 100644
--- a/core/modules/system/tests/cache.test
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/ClearTest.php
@@ -1,233 +1,16 @@
 <?php
 
-use Drupal\Core\Cache\DatabaseBackend;
-use Drupal\Core\Cache\InstallBackend;
-use Drupal\simpletest\WebTestBase;
-
-class CacheTestCase extends WebTestBase {
-  protected $default_bin = 'page';
-  protected $default_cid = 'test_temporary';
-  protected $default_value = 'CacheTest';
-
-  /**
-   * Check whether or not a cache entry exists.
-   *
-   * @param $cid
-   *   The cache id.
-   * @param $var
-   *   The variable the cache should contain.
-   * @param $bin
-   *   The bin the cache item was stored in.
-   * @return
-   *   TRUE on pass, FALSE on fail.
-   */
-  protected function checkCacheExists($cid, $var, $bin = NULL) {
-    if ($bin == NULL) {
-      $bin = $this->default_bin;
-    }
-
-    $cached = cache($bin)->get($cid);
-
-    return isset($cached->data) && $cached->data == $var;
-  }
-
-  /**
-   * Assert or a cache entry exists.
-   *
-   * @param $message
-   *   Message to display.
-   * @param $var
-   *   The variable the cache should contain.
-   * @param $cid
-   *   The cache id.
-   * @param $bin
-   *   The bin the cache item was stored in.
-   */
-  protected function assertCacheExists($message, $var = NULL, $cid = NULL, $bin = NULL) {
-    if ($bin == NULL) {
-      $bin = $this->default_bin;
-    }
-    if ($cid == NULL) {
-      $cid = $this->default_cid;
-    }
-    if ($var == NULL) {
-      $var = $this->default_value;
-    }
-
-    $this->assertTrue($this->checkCacheExists($cid, $var, $bin), $message);
-  }
-
-  /**
-   * Assert or a cache entry has been removed.
-   *
-   * @param $message
-   *   Message to display.
-   * @param $cid
-   *   The cache id.
-   * @param $bin
-   *   The bin the cache item was stored in.
-   */
-  function assertCacheRemoved($message, $cid = NULL, $bin = NULL) {
-    if ($bin == NULL) {
-      $bin = $this->default_bin;
-    }
-    if ($cid == NULL) {
-      $cid = $this->default_cid;
-    }
-
-    $cached = cache($bin)->get($cid);
-    $this->assertFalse($cached, $message);
-  }
-
-  /**
-   * Perform the general wipe.
-   * @param $bin
-   *   The bin to perform the wipe on.
-   */
-  protected function generalWipe($bin = NULL) {
-    if ($bin == NULL) {
-      $bin = $this->default_bin;
-    }
-
-    cache($bin)->expire();
-  }
-
-  /**
-   * Setup the lifetime settings for caching.
-   *
-   * @param $time
-   *   The time in seconds the cache should minimal live.
-   */
-  protected function setupLifetime($time) {
-    $config = config('system.performance');
-    $config->set('cache_lifetime', $time);
-    $config->save();
-    variable_set('cache_flush', 0);
-  }
-}
-
-class CacheSavingCase extends CacheTestCase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Cache saving test',
-      'description' => 'Check our variables are saved and restored the right way.',
-      'group' => 'Cache'
-    );
-  }
-
-  /**
-   * Test the saving and restoring of a string.
-   */
-  function testString() {
-    $this->checkVariable($this->randomName(100));
-  }
-
-  /**
-   * Test the saving and restoring of an integer.
-   */
-  function testInteger() {
-    $this->checkVariable(100);
-  }
-
-  /**
-   * Test the saving and restoring of a double.
-   */
-  function testDouble() {
-    $this->checkVariable(1.29);
-  }
-
-  /**
-   * Test the saving and restoring of an array.
-   */
-  function testArray() {
-    $this->checkVariable(array('drupal1', 'drupal2' => 'drupal3', 'drupal4' => array('drupal5', 'drupal6')));
-  }
-
-  /**
-   * Test the saving and restoring of an object.
-   */
-  function testObject() {
-    $test_object = new stdClass();
-    $test_object->test1 = $this->randomName(100);
-    $test_object->test2 = 100;
-    $test_object->test3 = array('drupal1', 'drupal2' => 'drupal3', 'drupal4' => array('drupal5', 'drupal6'));
-
-
-    cache()->set('test_object', $test_object);
-    $cached = cache()->get('test_object');
-    $this->assertTrue(isset($cached->data) && $cached->data == $test_object, t('Object is saved and restored properly.'));
-  }
-
-  /**
-   * Check or a variable is stored and restored properly.
-   */
-  function checkVariable($var) {
-    cache()->set('test_var', $var);
-    $cached = cache()->get('test_var');
-    $this->assertTrue(isset($cached->data) && $cached->data === $var, t('@type is saved and restored properly.', array('@type' => ucfirst(gettype($var)))));
-  }
-
-  /**
-   * Test no empty cids are written in cache table.
-   */
-  function testNoEmptyCids() {
-    $this->drupalGet('user/register');
-    $this->assertFalse(cache()->get(''), t('No cache entry is written with an empty cid.'));
-  }
-}
-
 /**
- * Test getMultiple().
+ * @file
+ * Definition of Drupal\system\Tests\Cache\ClearTest.
  */
-class CacheGetMultipleUnitTest extends CacheTestCase {
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Fetching multiple cache items',
-      'description' => 'Confirm that multiple records are fetched correctly.',
-      'group' => 'Cache',
-    );
-  }
-
-  function setUp() {
-    $this->default_bin = 'page';
-    parent::setUp();
-  }
 
-  /**
-   * Test getMultiple().
-   */
-  function testCacheMultiple() {
-    $item1 = $this->randomName(10);
-    $item2 = $this->randomName(10);
-    $cache = cache($this->default_bin);
-    $cache->set('item1', $item1);
-    $cache->set('item2', $item2);
-    $this->assertTrue($this->checkCacheExists('item1', $item1), t('Item 1 is cached.'));
-    $this->assertTrue($this->checkCacheExists('item2', $item2), t('Item 2 is cached.'));
-
-    // Fetch both records from the database with getMultiple().
-    $item_ids = array('item1', 'item2');
-    $items = $cache->getMultiple($item_ids);
-    $this->assertEqual($items['item1']->data, $item1, t('Item was returned from cache successfully.'));
-    $this->assertEqual($items['item2']->data, $item2, t('Item was returned from cache successfully.'));
-
-    // Remove one item from the cache.
-    $cache->delete('item2');
-
-    // Confirm that only one item is returned by getMultiple().
-    $item_ids = array('item1', 'item2');
-    $items = $cache->getMultiple($item_ids);
-    $this->assertEqual($items['item1']->data, $item1, t('Item was returned from cache successfully.'));
-    $this->assertFalse(isset($items['item2']), t('Item was not returned from the cache.'));
-    $this->assertTrue(count($items) == 1, t('Only valid cache entries returned.'));
-  }
-}
+namespace Drupal\system\Tests\Cache;
 
 /**
- * Test cache clearing methods.
+ * Tests cache clearing methods.
  */
-class CacheClearCase extends CacheTestCase {
+class ClearTest extends CacheTestBase {
   public static function getInfo() {
     return array(
       'name' => 'Cache clear test',
@@ -421,182 +204,3 @@ class CacheClearCase extends CacheTestCase {
     $this->assertTrue($this->checkCacheExists('test_cid_clear1', $this->default_value), 'Cached items not matching tag were not cleared.');
   }
 }
-
-/**
- * Test isEmpty() method.
- */
-class CacheIsEmptyCase extends CacheTestCase {
-  public static function getInfo() {
-    return array(
-      'name' => 'Cache emptiness test',
-      'description' => 'Check if a cache bin is empty after performing clear operations.',
-      'group' => 'Cache'
-    );
-  }
-
-  function setUp() {
-    $this->default_bin = 'page';
-    $this->default_value = $this->randomName(10);
-
-    parent::setUp();
-  }
-
-  /**
-   * Test clearing using a cid.
-   */
-  function testIsEmpty() {
-    // Clear the cache bin.
-    $cache = cache($this->default_bin);
-    $cache->flush();
-    $this->assertTrue($cache->isEmpty(), t('The cache bin is empty'));
-    // Add some data to the cache bin.
-    $cache->set($this->default_cid, $this->default_value);
-    $this->assertCacheExists(t('Cache was set.'), $this->default_value, $this->default_cid);
-    $this->assertFalse($cache->isEmpty(), t('The cache bin is not empty'));
-    // Remove the cached data.
-    $cache->delete($this->default_cid);
-    $this->assertCacheRemoved(t('Cache was removed.'), $this->default_cid);
-    $this->assertTrue($cache->isEmpty(), t('The cache bin is empty'));
-  }
-}
-
-/**
- * Tests the behavior of the cache backend used for installing Drupal.
- */
-class CacheInstallTestCase extends CacheTestCase {
-  protected $profile = 'testing';
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Cache install test',
-      'description' => 'Confirm that the cache backend used for installing Drupal works correctly.',
-      'group' => 'Cache',
-    );
-  }
-
-  function setUp() {
-    parent::setUp(array('cache_test'));
-  }
-
-  /**
-   * Tests the behavior of the cache backend used for installing Drupal.
-   *
-   * While Drupal is being installed, the cache system must deal with the fact
-   * that the database is not initially available, and, after it is available,
-   * the fact that other requests that take place while Drupal is being
-   * installed (for example, Ajax requests triggered via the installer's user
-   * interface) may cache data in the database, which needs to be cleared when
-   * the installer makes changes that would result in it becoming stale.
-   *
-   * We cannot test this process directly, so instead we test it by switching
-   * between the normal database cache (Drupal\Core\Cache\DatabaseBackend) and
-   * the installer cache (Drupal\Core\Cache\InstallBackend) while setting and
-   * clearing various items in the cache.
-   */
-  function testCacheInstall() {
-    $database_cache = new DatabaseBackend('test');
-    $install_cache = new InstallBackend('test');
-
-    // Store an item in the database cache, and confirm that the installer's
-    // cache backend recognizes that the cache is not empty.
-    $database_cache->set('cache_one', 'One');
-    $this->assertFalse($install_cache->isEmpty());
-    $database_cache->delete('cache_one');
-    $this->assertTrue($install_cache->isEmpty());
-
-    // Store an item in the database cache, then use the installer's cache
-    // backend to delete it. Afterwards, confirm that it is no longer in the
-    // database cache.
-    $database_cache->set('cache_one', 'One');
-    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
-    $install_cache->delete('cache_one');
-    $this->assertFalse($database_cache->get('cache_one'));
-
-    // Store multiple items in the database cache, then use the installer's
-    // cache backend to delete them. Afterwards, confirm that they are no
-    // longer in the database cache.
-    $database_cache->set('cache_one', 'One');
-    $database_cache->set('cache_two', 'Two');
-    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
-    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
-    $install_cache->deleteMultiple(array('cache_one', 'cache_two'));
-    $this->assertFalse($database_cache->get('cache_one'));
-    $this->assertFalse($database_cache->get('cache_two'));
-
-    // Store multiple items in the database cache, then use the installer's
-    // cache backend to delete them via a wildcard prefix. Afterwards, confirm
-    // that they are no longer in the database cache.
-    $database_cache->set('cache_one', 'One');
-    $database_cache->set('cache_two', 'Two');
-    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
-    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
-    $install_cache->deletePrefix('cache_');
-    $this->assertFalse($database_cache->get('cache_one'));
-    $this->assertFalse($database_cache->get('cache_two'));
-
-    // Store multiple items in the database cache, then use the installer's
-    // cache backend to flush the cache. Afterwards, confirm that they are no
-    // longer in the database cache.
-    $database_cache->set('cache_one', 'One');
-    $database_cache->set('cache_two', 'Two');
-    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
-    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
-    $install_cache->flush();
-    $this->assertFalse($database_cache->get('cache_one'));
-    $this->assertFalse($database_cache->get('cache_two'));
-
-    // Store multiple items in the database cache with a temporary expiration,
-    // then use the installer's cache backend to expire outdated items.
-    // Afterwards, confirm that they are no longer in the database cache.
-    $database_cache->set('cache_one', 'One', CACHE_TEMPORARY);
-    $database_cache->set('cache_two', 'Two', CACHE_TEMPORARY);
-    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
-    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
-    $install_cache->expire();
-    $this->assertFalse($database_cache->get('cache_one'));
-    $this->assertFalse($database_cache->get('cache_two'));
-
-    // Store multiple items in the database cache with a temporary expiration,
-    // then use the installer's cache backend to perform garbage collection.
-    // Afterwards, confirm that they are no longer in the database cache.
-    $database_cache->set('cache_one', 'One', CACHE_TEMPORARY);
-    $database_cache->set('cache_two', 'Two', CACHE_TEMPORARY);
-    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
-    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
-    // After we've checked that the items are in the cache, we need to enable
-    // garbage collection before running the garbage collector.
-    config('system.performance')->set('cache_lifetime', 1)->save();
-    variable_set('cache_flush_cache_test', 1);
-    $install_cache->garbageCollection();
-    $this->assertFalse($database_cache->get('cache_one'));
-    $this->assertFalse($database_cache->get('cache_two'));
-
-    // Invalidate a tag using the installer cache, then check that the
-    // invalidation was recorded correctly in the database.
-    $install_cache->invalidateTags(array('tag'));
-    $invalidations = db_query("SELECT invalidations FROM {cache_tags} WHERE tag = 'tag'")->fetchField();
-    $this->assertEqual($invalidations, 1);
-
-    // For each cache clearing event that we tried above, try it again after
-    // dropping the {cache_test} table. This simulates the early stages of the
-    // installer (when the database cache tables won't be available yet) and
-    // thereby confirms that the installer's cache backend does not produce
-    // errors if the installer ever calls any code early on that tries to clear
-    // items from the cache.
-    db_drop_table('cache_test');
-    try {
-      $install_cache->isEmpty();
-      $install_cache->delete('cache_one');
-      $install_cache->deleteMultiple(array('cache_one', 'cache_two'));
-      $install_cache->deletePrefix('cache_');
-      $install_cache->flush();
-      $install_cache->expire();
-      $install_cache->garbageCollection();
-      $install_cache->invalidateTags(array('tag'));
-      $this->pass("The installer's cache backend can be used even when the cache database tables are unavailable.");
-    }
-    catch (Exception $e) {
-      $this->fail("The installer's cache backend can be used even when the cache database tables are unavailable.");
-    }
-  }
-}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/GetMultipleTest.php b/core/modules/system/lib/Drupal/system/Tests/Cache/GetMultipleTest.php
new file mode 100644
index 0000000..f981212
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/GetMultipleTest.php
@@ -0,0 +1,56 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Cache\GetMultipleTest.
+ */
+
+namespace Drupal\system\Tests\Cache;
+
+/**
+ * Tests getMultiple().
+ */
+class GetMultipleTest extends CacheTestBase {
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Fetching multiple cache items',
+      'description' => 'Confirm that multiple records are fetched correctly.',
+      'group' => 'Cache',
+    );
+  }
+
+  function setUp() {
+    $this->default_bin = 'page';
+    parent::setUp();
+  }
+
+  /**
+   * Test getMultiple().
+   */
+  function testCacheMultiple() {
+    $item1 = $this->randomName(10);
+    $item2 = $this->randomName(10);
+    $cache = cache($this->default_bin);
+    $cache->set('item1', $item1);
+    $cache->set('item2', $item2);
+    $this->assertTrue($this->checkCacheExists('item1', $item1), t('Item 1 is cached.'));
+    $this->assertTrue($this->checkCacheExists('item2', $item2), t('Item 2 is cached.'));
+
+    // Fetch both records from the database with getMultiple().
+    $item_ids = array('item1', 'item2');
+    $items = $cache->getMultiple($item_ids);
+    $this->assertEqual($items['item1']->data, $item1, t('Item was returned from cache successfully.'));
+    $this->assertEqual($items['item2']->data, $item2, t('Item was returned from cache successfully.'));
+
+    // Remove one item from the cache.
+    $cache->delete('item2');
+
+    // Confirm that only one item is returned by getMultiple().
+    $item_ids = array('item1', 'item2');
+    $items = $cache->getMultiple($item_ids);
+    $this->assertEqual($items['item1']->data, $item1, t('Item was returned from cache successfully.'));
+    $this->assertFalse(isset($items['item2']), t('Item was not returned from the cache.'));
+    $this->assertTrue(count($items) == 1, t('Only valid cache entries returned.'));
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/InstallTest.php b/core/modules/system/lib/Drupal/system/Tests/Cache/InstallTest.php
new file mode 100644
index 0000000..1f2a5fd
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/InstallTest.php
@@ -0,0 +1,152 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Cache\InstallTest.
+ */
+
+namespace Drupal\system\Tests\Cache;
+
+use Drupal\Core\Cache\DatabaseBackend;
+use Drupal\Core\Cache\InstallBackend;
+
+/**
+ * Tests the behavior of the cache backend used for installing Drupal.
+ */
+class InstallTest extends CacheTestBase {
+  protected $profile = 'testing';
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Cache install test',
+      'description' => 'Confirm that the cache backend used for installing Drupal works correctly.',
+      'group' => 'Cache',
+    );
+  }
+
+  function setUp() {
+    parent::setUp(array('cache_test'));
+  }
+
+  /**
+   * Tests the behavior of the cache backend used for installing Drupal.
+   *
+   * While Drupal is being installed, the cache system must deal with the fact
+   * that the database is not initially available, and, after it is available,
+   * the fact that other requests that take place while Drupal is being
+   * installed (for example, Ajax requests triggered via the installer's user
+   * interface) may cache data in the database, which needs to be cleared when
+   * the installer makes changes that would result in it becoming stale.
+   *
+   * We cannot test this process directly, so instead we test it by switching
+   * between the normal database cache (Drupal\Core\Cache\DatabaseBackend) and
+   * the installer cache (Drupal\Core\Cache\InstallBackend) while setting and
+   * clearing various items in the cache.
+   */
+  function testCacheInstall() {
+    $database_cache = new DatabaseBackend('test');
+    $install_cache = new InstallBackend('test');
+
+    // Store an item in the database cache, and confirm that the installer's
+    // cache backend recognizes that the cache is not empty.
+    $database_cache->set('cache_one', 'One');
+    $this->assertFalse($install_cache->isEmpty());
+    $database_cache->delete('cache_one');
+    $this->assertTrue($install_cache->isEmpty());
+
+    // Store an item in the database cache, then use the installer's cache
+    // backend to delete it. Afterwards, confirm that it is no longer in the
+    // database cache.
+    $database_cache->set('cache_one', 'One');
+    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
+    $install_cache->delete('cache_one');
+    $this->assertFalse($database_cache->get('cache_one'));
+
+    // Store multiple items in the database cache, then use the installer's
+    // cache backend to delete them. Afterwards, confirm that they are no
+    // longer in the database cache.
+    $database_cache->set('cache_one', 'One');
+    $database_cache->set('cache_two', 'Two');
+    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
+    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
+    $install_cache->deleteMultiple(array('cache_one', 'cache_two'));
+    $this->assertFalse($database_cache->get('cache_one'));
+    $this->assertFalse($database_cache->get('cache_two'));
+
+    // Store multiple items in the database cache, then use the installer's
+    // cache backend to delete them via a wildcard prefix. Afterwards, confirm
+    // that they are no longer in the database cache.
+    $database_cache->set('cache_one', 'One');
+    $database_cache->set('cache_two', 'Two');
+    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
+    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
+    $install_cache->deletePrefix('cache_');
+    $this->assertFalse($database_cache->get('cache_one'));
+    $this->assertFalse($database_cache->get('cache_two'));
+
+    // Store multiple items in the database cache, then use the installer's
+    // cache backend to flush the cache. Afterwards, confirm that they are no
+    // longer in the database cache.
+    $database_cache->set('cache_one', 'One');
+    $database_cache->set('cache_two', 'Two');
+    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
+    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
+    $install_cache->flush();
+    $this->assertFalse($database_cache->get('cache_one'));
+    $this->assertFalse($database_cache->get('cache_two'));
+
+    // Store multiple items in the database cache with a temporary expiration,
+    // then use the installer's cache backend to expire outdated items.
+    // Afterwards, confirm that they are no longer in the database cache.
+    $database_cache->set('cache_one', 'One', CACHE_TEMPORARY);
+    $database_cache->set('cache_two', 'Two', CACHE_TEMPORARY);
+    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
+    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
+    $install_cache->expire();
+    $this->assertFalse($database_cache->get('cache_one'));
+    $this->assertFalse($database_cache->get('cache_two'));
+
+    // Store multiple items in the database cache with a temporary expiration,
+    // then use the installer's cache backend to perform garbage collection.
+    // Afterwards, confirm that they are no longer in the database cache.
+    $database_cache->set('cache_one', 'One', CACHE_TEMPORARY);
+    $database_cache->set('cache_two', 'Two', CACHE_TEMPORARY);
+    $this->assertEqual($database_cache->get('cache_one')->data, 'One');
+    $this->assertEqual($database_cache->get('cache_two')->data, 'Two');
+    // After we've checked that the items are in the cache, we need to enable
+    // garbage collection before running the garbage collector.
+    config('system.performance')->set('cache_lifetime', 1)->save();
+    variable_set('cache_flush_cache_test', 1);
+    $install_cache->garbageCollection();
+    $this->assertFalse($database_cache->get('cache_one'));
+    $this->assertFalse($database_cache->get('cache_two'));
+
+    // Invalidate a tag using the installer cache, then check that the
+    // invalidation was recorded correctly in the database.
+    $install_cache->invalidateTags(array('tag'));
+    $invalidations = db_query("SELECT invalidations FROM {cache_tags} WHERE tag = 'tag'")->fetchField();
+    $this->assertEqual($invalidations, 1);
+
+    // For each cache clearing event that we tried above, try it again after
+    // dropping the {cache_test} table. This simulates the early stages of the
+    // installer (when the database cache tables won't be available yet) and
+    // thereby confirms that the installer's cache backend does not produce
+    // errors if the installer ever calls any code early on that tries to clear
+    // items from the cache.
+    db_drop_table('cache_test');
+    try {
+      $install_cache->isEmpty();
+      $install_cache->delete('cache_one');
+      $install_cache->deleteMultiple(array('cache_one', 'cache_two'));
+      $install_cache->deletePrefix('cache_');
+      $install_cache->flush();
+      $install_cache->expire();
+      $install_cache->garbageCollection();
+      $install_cache->invalidateTags(array('tag'));
+      $this->pass("The installer's cache backend can be used even when the cache database tables are unavailable.");
+    }
+    catch (Exception $e) {
+      $this->fail("The installer's cache backend can be used even when the cache database tables are unavailable.");
+    }
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/IsEmptyTest.php b/core/modules/system/lib/Drupal/system/Tests/Cache/IsEmptyTest.php
new file mode 100644
index 0000000..bd0d6ca
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/IsEmptyTest.php
@@ -0,0 +1,46 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Cache\IsEmptyTest.
+ */
+
+namespace Drupal\system\Tests\Cache;
+
+/**
+ * Tests the isEmpty() method.
+ */
+class IsEmptyTest extends CacheTestBase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Cache emptiness test',
+      'description' => 'Check if a cache bin is empty after performing clear operations.',
+      'group' => 'Cache'
+    );
+  }
+
+  function setUp() {
+    $this->default_bin = 'page';
+    $this->default_value = $this->randomName(10);
+
+    parent::setUp();
+  }
+
+  /**
+   * Test clearing using a cid.
+   */
+  function testIsEmpty() {
+    // Clear the cache bin.
+    $cache = cache($this->default_bin);
+    $cache->flush();
+    $this->assertTrue($cache->isEmpty(), t('The cache bin is empty'));
+    // Add some data to the cache bin.
+    $cache->set($this->default_cid, $this->default_value);
+    $this->assertCacheExists(t('Cache was set.'), $this->default_value, $this->default_cid);
+    $this->assertFalse($cache->isEmpty(), t('The cache bin is not empty'));
+    // Remove the cached data.
+    $cache->delete($this->default_cid);
+    $this->assertCacheRemoved(t('Cache was removed.'), $this->default_cid);
+    $this->assertTrue($cache->isEmpty(), t('The cache bin is empty'));
+  }
+}
diff --git a/core/modules/system/lib/Drupal/system/Tests/Cache/SavingTest.php b/core/modules/system/lib/Drupal/system/Tests/Cache/SavingTest.php
new file mode 100644
index 0000000..410de25
--- /dev/null
+++ b/core/modules/system/lib/Drupal/system/Tests/Cache/SavingTest.php
@@ -0,0 +1,83 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\system\Tests\Cache\SavingTest.
+ */
+
+namespace Drupal\system\Tests\Cache;
+
+use stdClass;
+
+/**
+ * Tests that variables are saved and restored in the right way.
+ */
+class SavingTest extends CacheTestBase {
+  public static function getInfo() {
+    return array(
+      'name' => 'Cache saving test',
+      'description' => 'Check our variables are saved and restored the right way.',
+      'group' => 'Cache'
+    );
+  }
+
+  /**
+   * Test the saving and restoring of a string.
+   */
+  function testString() {
+    $this->checkVariable($this->randomName(100));
+  }
+
+  /**
+   * Test the saving and restoring of an integer.
+   */
+  function testInteger() {
+    $this->checkVariable(100);
+  }
+
+  /**
+   * Test the saving and restoring of a double.
+   */
+  function testDouble() {
+    $this->checkVariable(1.29);
+  }
+
+  /**
+   * Test the saving and restoring of an array.
+   */
+  function testArray() {
+    $this->checkVariable(array('drupal1', 'drupal2' => 'drupal3', 'drupal4' => array('drupal5', 'drupal6')));
+  }
+
+  /**
+   * Test the saving and restoring of an object.
+   */
+  function testObject() {
+    $test_object = new stdClass();
+    $test_object->test1 = $this->randomName(100);
+    $test_object->test2 = 100;
+    $test_object->test3 = array('drupal1', 'drupal2' => 'drupal3', 'drupal4' => array('drupal5', 'drupal6'));
+
+
+    cache()->set('test_object', $test_object);
+    $cached = cache()->get('test_object');
+    $this->assertTrue(isset($cached->data) && $cached->data == $test_object, t('Object is saved and restored properly.'));
+  }
+
+  /**
+   * Check or a variable is stored and restored properly.
+   */
+  function checkVariable($var) {
+    cache()->set('test_var', $var);
+    $cached = cache()->get('test_var');
+    $this->assertTrue(isset($cached->data) && $cached->data === $var, t('@type is saved and restored properly.', array('@type' => ucfirst(gettype($var)))));
+  }
+
+  /**
+   * Test no empty cids are written in cache table.
+   */
+  function testNoEmptyCids() {
+    $this->drupalGet('user/register');
+    $this->assertFalse(cache()->get(''), t('No cache entry is written with an empty cid.'));
+  }
+}
