diff --git a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
index 2dd7ace..b2a94b0 100644
--- a/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
+++ b/core/lib/Drupal/Core/Config/Entity/ConfigStorageController.php
@@ -428,7 +428,7 @@ protected function invokeHook($hook, EntityInterface $entity) {
    * Implements Drupal\Core\Entity\EntityStorageControllerInterface::getQueryServicename().
    */
   public function getQueryServicename() {
-    throw new \LogicException('Querying configuration entities is not supported.');
+    return 'entity.query.config';
   }
 
   /**
diff --git a/core/modules/block/custom_block/custom_block.info b/core/modules/block/custom_block/custom_block.info
index f38e540..3dafb61 100644
--- a/core/modules/block/custom_block/custom_block.info
+++ b/core/modules/block/custom_block/custom_block.info
@@ -1,5 +1,5 @@
 name = Custom Block
-description = Allows the creation of custom blocks through the user interface.
+description = Allows the creaation of custom blocks through the user interface.
 package = Core
 version = VERSION
 core = 8.x
diff --git a/core/modules/config/tests/config_test/lib/Drupal/config_test/Plugin/Core/Entity/ConfigQueryTest.php b/core/modules/config/tests/config_test/lib/Drupal/config_test/Plugin/Core/Entity/ConfigQueryTest.php
new file mode 100644
index 0000000..fe9ed9b
--- /dev/null
+++ b/core/modules/config/tests/config_test/lib/Drupal/config_test/Plugin/Core/Entity/ConfigQueryTest.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\config_test\Plugin\Core\Entity\ConfigQueryTest.
+ */
+
+namespace Drupal\config_test\Plugin\Core\Entity;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\Core\Annotation\Translation;
+
+/**
+ * Defines the ConfigQueryTest configuration entity used by the query test.
+ *
+ * @Plugin(
+ *   id = "config_query_test",
+ *   label = @Translation("Test configuration for query"),
+ *   module = "config_test",
+ *   controller_class = "Drupal\config_test\ConfigTestStorageController",
+ *   list_controller_class = "Drupal\Core\Config\Entity\ConfigEntityListController",
+ *   form_controller_class = {
+ *     "default" = "Drupal\config_test\ConfigTestFormController"
+ *   },
+ *   uri_callback = "config_test_uri",
+ *   config_prefix = "config_query_test.dynamic",
+ *   entity_keys = {
+ *     "id" = "id",
+ *     "label" = "label",
+ *     "uuid" = "uuid"
+ *   }
+ * )
+ *
+ * @see \Drupal\entity\Tests\ConfigEntityQueryTest
+ */
+class ConfigQueryTest extends ConfigTest {
+
+  /**
+   * A number used by the sort tests.
+   */
+  public $number;
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/ConfigQuery/Condition.php b/core/modules/entity/lib/Drupal/entity/ConfigQuery/Condition.php
new file mode 100644
index 0000000..c69728e
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/ConfigQuery/Condition.php
@@ -0,0 +1,126 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\ConfigQuery\Condition.
+ */
+
+namespace Drupal\entity\ConfigQuery;
+
+use Drupal\Core\Entity\Query\ConditionBase;
+use Drupal\Core\Entity\Query\ConditionInterface;
+
+class Condition extends ConditionBase {
+
+  /**
+   * Implements \Drupal\Core\Entity\Query\ConditionInterface::compile().
+   */
+  public function compile($holder) {
+    $and = strtoupper($this->conjunction) == 'AND';
+    $simple_conditions = array();
+    $complex_conditions = array();
+    foreach ($this->conditions as $condition) {
+      if ($condition['field'] instanceOf ConditionInterface) {
+        $complex_conditions[] = $condition;
+      }
+      else {
+        $simple_conditions[] = $condition;
+      }
+    }
+    $return = array();
+    if ($simple_conditions) {
+      foreach ($holder->entities as $entity_id => $entity) {
+        // Iterate over all conditions and act based on whether they are a condition
+        // group or a single condition.
+        foreach ($simple_conditions as &$condition) {
+          if (!isset($condition['operator'])) {
+            $condition['operator'] = is_array($condition['value']) ? 'IN' : '=';
+          }
+          if (isset($entity->{$condition['field']})) {
+            $value = $entity->{$condition['field']};
+            switch ($condition['operator']) {
+              case '=':
+                $match = $value == $condition['value'];
+                break;
+              case '>':
+                $match = $value > $condition['value'];
+                break;
+              case '<':
+                $match = $value < $condition['value'];
+                break;
+              case '>=':
+                $match = $value >= $condition['value'];
+                break;
+              case '<=':
+                $match = $value <= $condition['value'];
+                break;
+              case 'IN':
+                $match = array_search($value, $condition['value']) !== FALSE;
+                break;
+              case 'NOT IN':
+                $match = array_search($value, $condition['value']) === FALSE;
+                break;
+              case 'STARTS_WITH':
+                $match = strpos($value, $condition['value']) === 0;
+                break;
+              case 'CONTAINS':
+                $match = strpos($value, $condition['value']) !== FALSE;
+                break;
+              case 'ENDS_WITH':
+                $match = substr($value, -strlen($condition['value'])) === (string) $condition['value'];
+                break;
+              case 'IS NOT NULL':
+                $match = TRUE;
+                break;
+            }
+          }
+          else {
+            $match= $condition['operator'] === 'IS NULL';
+          }
+          // If AND and it's not matching, then we know it will never match.
+          // If OR and it is matching, we know it already matches.
+          if ($and != $match ) {
+            break;
+          }
+        }
+        if ($match) {
+          $return[$entity_id] = $entity;
+        }
+      }
+    }
+    elseif (!$complex_conditions || $and) {
+      // If there were no simple conditions then either:
+      // - Complex conditions, AND: need to start from all entities.
+      // - Complex conditions, OR: need to start from no entities.
+      // - No complex conditions (AND/OR doesn't matter): need to return all
+      //   entities.
+      $return = $holder->entities;
+    }
+    foreach ($complex_conditions as $condition) {
+      $group_entities = $condition['field']->compile($holder);
+      if ($and) {
+        $return = array_intersect_key($return, $group_entities);
+      }
+      else {
+        $return = $return + $group_entities;
+      }
+    }
+
+    return $return;
+  }
+
+  /**
+   * Implements \Drupal\Core\Entity\Query\ConditionInterface::exists().
+   */
+  public function exists($field, $langcode = NULL) {
+    return $this->condition($field, NULL, 'IS NOT NULL', $langcode);
+  }
+
+  /**
+   * Implements \Drupal\Core\Entity\Query\ConditionInterface::notExists().
+   */
+  public function notExists($field, $langcode = NULL) {
+    return $this->condition($field, NULL, 'IS NULL', $langcode);
+  }
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/ConfigQuery/Query.php b/core/modules/entity/lib/Drupal/entity/ConfigQuery/Query.php
new file mode 100644
index 0000000..7598492
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/ConfigQuery/Query.php
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\ConfigQuery\Query.
+ */
+
+namespace Drupal\entity\ConfigQuery;
+
+use Drupal\Core\Entity\Query\QueryBase;
+
+/**
+ * Defines the entity query for configuration entities.
+ */
+class Query extends QueryBase {
+
+  /**
+   * Implements \Drupal\Core\Entity\Query\QueryInterface::conditionGroupFactory().
+   */
+  public function conditionGroupFactory($conjunction = 'AND') {
+    return new Condition($conjunction);
+  }
+
+  /**
+   * Implements \Drupal\Core\Entity\Query\QueryInterface::execute().
+   */
+  public function execute() {
+    $holder = new \stdClass();
+    $holder->sort = $this->sort;
+    $holder->entities = entity_load_multiple($this->entityType);;
+    $entities = $this->condition->compile($holder);
+
+    // Apply sort settings.
+    foreach ($this->sort as $property => $sort) {
+      $direction = $sort['direction'] == 'ASC' ? -1 : 1;
+      uasort($entities, function(&$a, &$b) use ($property, $direction) {
+        $value_a = isset($a->{$property}) ? $a->{$property} : '';
+        $value_b = isset($b->{$property}) ? $b->{$property} : '';
+        return ($value_a <= $value_b) ? $direction : -$direction;
+      });
+    }
+
+    // Let the pager do it's work.
+    $this->initializePager();
+
+    if ($this->range) {
+      $entities = array_slice($entities, $this->range['start'], $this->range['length'], TRUE);
+    }
+    if ($this->count) {
+      return count($entities);
+    }
+
+    return drupal_map_assoc(array_keys($entities));
+  }
+}
diff --git a/core/modules/entity/lib/Drupal/entity/ConfigQuery/QueryFactory.php b/core/modules/entity/lib/Drupal/entity/ConfigQuery/QueryFactory.php
new file mode 100644
index 0000000..ec7b9f9
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/ConfigQuery/QueryFactory.php
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\ConfigQuery\QueryFactory.
+ */
+
+namespace Drupal\entity\ConfigQuery;
+
+/**
+ * Factory class creating entity query objects for the config backend.
+ */
+class QueryFactory {
+
+  /**
+   * Instantiate a entity query for a certain entity type.
+   *
+   * @param string $entity_type
+   *   The entity type for the query.
+   * @param string $conjunction
+   *   The operator to use to combine conditions: 'AND' or 'OR'.
+   *
+   * @return \Drupal\entity\ConfigQuery\Query
+   *   A entity query for a specific configuration entity type.
+   */
+  function get($entity_type, $conjunction = 'AND') {
+    return new Query($entity_type, $conjunction);
+  }
+}
diff --git a/core/modules/entity/lib/Drupal/entity/EntityBundle.php b/core/modules/entity/lib/Drupal/entity/EntityBundle.php
new file mode 100644
index 0000000..070857b
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/EntityBundle.php
@@ -0,0 +1,26 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\EntityBundle.
+ */
+
+namespace Drupal\entity;
+
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\DependencyInjection\Reference;
+
+/**
+ * Bundle class for entity services.
+ */
+class EntityBundle extends Bundle {
+
+  /**
+   * Implements \Symfony\Component\HttpKernel\Bundle\BundleInterface::build().
+   */
+  public function build(ContainerBuilder $container) {
+    $container->register('entity.query.config', 'Drupal\entity\ConfigQuery\QueryFactory');
+  }
+
+}
diff --git a/core/modules/entity/lib/Drupal/entity/Tests/ConfigEntityQueryTest.php b/core/modules/entity/lib/Drupal/entity/Tests/ConfigEntityQueryTest.php
new file mode 100644
index 0000000..ab603be
--- /dev/null
+++ b/core/modules/entity/lib/Drupal/entity/Tests/ConfigEntityQueryTest.php
@@ -0,0 +1,433 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\entity\Tests\ConfigEntityQueryTest.
+ */
+
+namespace Drupal\entity\Tests;
+
+use Drupal\simpletest\DrupalUnitTestBase;
+
+/**
+ * Tests the config entity query.
+ *
+ * @see \Drupal\Core\entity\Query
+ */
+class ConfigEntityQueryTest extends DrupalUnitTestBase {
+
+  static $modules = array('config_test');
+
+  /**
+   * Stores the search results for alter comparision.
+   *
+   * @var array
+   */
+  protected $queryResults;
+
+  /**
+   * The query factory used to construct all queries in the test.
+   *
+   * @var \Drupal\entity\ConfigQuery\QueryFactory
+   */
+  protected $factory;
+
+  /**
+   * Stores all config entities created for that test.
+   *
+   * @var array
+   */
+  protected $entities;
+
+  public static function getInfo() {
+    return array(
+      'name' => 'Config Entity Query',
+      'description' => 'Tests Config Entity Query functionality.',
+      'group' => 'Configuration',
+    );
+  }
+
+  protected function setUp() {
+    $this->kernelEnvironment = 'config_entity_query';
+    parent::setUp();
+    $this->enableModules(array('entity'), TRUE);
+    $this->factory = $this->container->get('entity.query');
+
+    $this->entities = array();
+    $entity = entity_create('config_query_test', array(
+        'label' => $this->randomName(),
+        'id' => 1,
+        'number' => 31,
+      )
+    );
+    $this->entities[] = $entity;
+    $entity->enforceIsNew();
+    $entity->save();
+
+    $entity = entity_create('config_query_test', array(
+        'label' => $this->randomName(),
+        'id' => 2,
+        'number' => 41,
+      )
+    );
+    $this->entities[] = $entity;
+    $entity->enforceIsNew();
+    $entity->save();
+
+    $entity = entity_create('config_query_test', array(
+        'label' => 'test_prefix_' . $this->randomName(),
+        'id' => 3,
+        'number' => 59,
+      )
+    );
+    $this->entities[] = $entity;
+    $entity->enforceIsNew();
+    $entity->save();
+
+    $entity = entity_create('config_query_test', array(
+        'label' => $this->randomName() . '_test_suffix',
+        'id' => 4,
+        'number' => 26,
+      )
+    );
+    $this->entities[] = $entity;
+    $entity->enforceIsNew();
+    $entity->save();
+
+    $entity = entity_create('config_query_test', array(
+        'label' => $this->randomName() . '_test_contains_' . $this->randomName(),
+        'id' => 5,
+        'number' => 53,
+      )
+    );
+    $this->entities[] = $entity;
+    $entity->enforceIsNew();
+    $entity->save();
+  }
+
+
+  /**
+   * Test basic functionality.
+   */
+  public function testConfigEntityQuery() {
+    // Run a test without any condition.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->execute();
+    $this->assertEqual(count($this->queryResults), count($this->entities));
+    // No conditions, OR.
+    $count = $this->factory->get('config_query_test', 'OR')
+      ->count()
+      ->execute();
+    $this->assertEqual($count, count($this->entities));
+
+    // Filter by ID with equality.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 3)
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 1);
+
+    // Filter by label with a known prefix.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('label', 'test_prefix', 'STARTS_WITH')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 1);
+    $this->assertEqual($this->queryResults[3], '3');
+
+    // Filter by label with a known suffix.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('label', 'test_suffix', 'ENDS_WITH')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 1);
+    $this->assertEqual($this->queryResults[4], 4);
+
+    // Filter by label with a known containing word.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('label', 'test_contains', 'CONTAINS')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 1);
+    $this->assertEqual($this->queryResults[5], 5);
+
+    // Filter by ID with the IN operator.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', array(2, 3), 'IN')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 2);
+    $this->assertResults(array(2, 3));
+
+    // Filter by ID with the implicit IN operator.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', array(2, 3))
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 2);
+    $this->assertResults(array(2, 3));
+
+    // Filter by ID with the > operator.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 3, '>')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 2);
+    $this->assertResults(array(4, 5));
+
+    // Filter by ID with the >= operator.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 3, '>=')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 3);
+    $this->assertResults(array(3, 4, 5));
+
+    // Filter by ID with the < operator.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 3, '<')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 2);
+    $this->assertResults(array(1, 2));
+
+    // Filter by ID with the <= operator.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 3, '<=')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 3);
+    $this->assertResults(array(1, 2, 3));
+
+    // Filter by two conditions on the same field.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('label', 'test_pref', 'STARTS_WITH')
+      ->condition('label', 'test_prefix', 'STARTS_WITH')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 1);
+    $this->assertResults(array(3));
+
+    // Filter by two conditions on different fields. The first query matches for
+    // a different ID, so the result is empty.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('label', 'test_prefix', 'STARTS_WITH')
+      ->condition('id', 5)
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 0);
+
+    // Filter by two different conditions on different fields. This time the
+    // first condition matches on one item, but the second one does as well.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('label', 'test_prefix', 'STARTS_WITH')
+      ->condition('id', 3)
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 1);
+    $this->assertResults(array(3));
+
+    // Filter by two different conditions, of which the first one matches for
+    // every entry, the second one as well, but just the third one filters so
+    // that just two are left.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 1, '>=')
+      ->condition('number', 10, '>=')
+      ->condition('number', 50, '>=')
+      ->execute();
+
+    $this->assertEqual(count($this->queryResults), 2);
+    $this->assertResults(array(3, 5));
+
+    // Filter with an OR condition group.
+    $this->queryResults = $this->factory->get('config_query_test', 'OR')
+      ->condition('id', 1)
+      ->condition('id', 2)
+      ->execute();
+    $this->assertEqual(count($this->queryResults), 2);
+    $this->assertResults(array(1, 2));
+
+    // Simplify it with IN.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', array(1, 2))
+      ->execute();
+    $this->assertResults(array(1, 2));
+    // Try explicit IN.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', array(1, 2), 'IN')
+      ->execute();
+    $this->assertResults(array(1, 2));
+    // Try not IN.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', array(1, 2), 'NOT IN')
+      ->execute();
+    $this->assertResults(array(3, 4, 5));
+
+    // Filter with an OR condition group on different fields.
+    $this->queryResults = $this->factory->get('config_query_test', 'OR')
+      ->condition('id', 1)
+      ->condition('number', 41)
+      ->execute();
+    $this->assertEqual(count($this->queryResults), 2);
+    $this->assertResults(array(1, 2));
+
+    // Filter with an OR condition group on different fields but matching on the
+    // same entity.
+    $this->queryResults = $this->factory->get('config_query_test', 'OR')
+      ->condition('id', 1)
+      ->condition('number', 31)
+      ->execute();
+    $this->assertResults(array(1));
+
+    // NO simple conditions, YES complex conditions, 'AND'.
+    $query = $this->factory->get('config_query_test', 'AND');
+    $and_condition_1 = $query->orConditionGroup()
+      ->condition('id', 2)
+      ->condition('label', $this->entities[0]->label);
+    $and_condition_2 = $query->orConditionGroup()
+      ->condition('id', 1)
+      ->condition('label', $this->entities[3]->label);
+    $this->queryResults = $query
+      ->condition($and_condition_1)
+      ->condition($and_condition_2)
+      ->execute();
+    $this->assertResults(array(1));
+
+    // NO simple conditions, YES complex conditions, 'OR'.
+    $query = $this->factory->get('config_query_test', 'OR');
+    $and_condition_1 = $query->andConditionGroup()
+      ->condition('id', 1)
+      ->condition('label', $this->entities[0]->label);
+    $and_condition_2 = $query->andConditionGroup()
+      ->condition('id', 2)
+      ->condition('label', $this->entities[1]->label);
+    $this->queryResults = $query
+      ->condition($and_condition_1)
+      ->condition($and_condition_2)
+      ->execute();
+    $this->assertResults(array(1, 2));
+
+    // YES simple conditions, YES complex conditions, 'AND'.
+    $query = $this->factory->get('config_query_test', 'AND');
+    $and_condition_1 = $query->orConditionGroup()
+      ->condition('id', 2)
+      ->condition('label', $this->entities[0]->label);
+    $and_condition_2 = $query->orConditionGroup()
+      ->condition('id', 1)
+      ->condition('label', $this->entities[3]->label);
+    $this->queryResults = $query
+      ->condition('number', 31)
+      ->condition($and_condition_1)
+      ->condition($and_condition_2)
+      ->execute();
+    $this->assertResults(array(1));
+
+    // YES simple conditions, YES complex conditions, 'OR'.
+    $query = $this->factory->get('config_query_test', 'OR');
+    $and_condition_1 = $query->orConditionGroup()
+      ->condition('id', 2)
+      ->condition('label', $this->entities[0]->label);
+    $and_condition_2 = $query->orConditionGroup()
+      ->condition('id', 1)
+      ->condition('label', $this->entities[3]->label);
+    $this->queryResults = $query
+      ->condition('number', 53)
+      ->condition($and_condition_1)
+      ->condition($and_condition_2)
+      ->execute();
+    $this->assertResults(array(1, 2, 4, 5));
+  }
+
+  /**
+   * Test count query.
+   */
+  protected function testCount() {
+    // Test count on no conditions.
+    $count = $this->factory->get('config_query_test')
+      ->count()
+      ->execute();
+    $this->assertEqual($count, count($this->entities));
+
+    // Test count on a complex query.
+    $query = $this->factory->get('config_query_test', 'OR');
+    $and_condition_1 = $query->andConditionGroup()
+      ->condition('id', 1)
+      ->condition('label', $this->entities[0]->label);
+    $and_condition_2 = $query->andConditionGroup()
+      ->condition('id', 2)
+      ->condition('label', $this->entities[1]->label);
+    $this->queryResults = $query
+      ->condition($and_condition_1)
+      ->condition($and_condition_2)
+      ->count()
+      ->execute();
+    $this->assertEqual($this->queryResults, 2);
+  }
+
+  /**
+   * Tests sorting and range on config entity queries.
+   */
+  protected function testSortRange() {
+    // Sort by simple ascending/descending.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->sort('number', 'DESC')
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(3, 5, 2, 1, 4));
+
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->sort('number', 'ASC')
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(4, 1, 2, 5, 3));
+
+    // Apply some filters and sort.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 3, '>')
+      ->sort('number', 'DESC')
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(5, 4));
+
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->condition('id', 3, '>')
+      ->sort('number', 'ASC')
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(4, 5));
+
+    // Apply a pager and sort.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->sort('number', 'DESC')
+      ->range(2, 2)
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(2, 1));
+
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->sort('number', 'ASC')
+      ->range(2, 2)
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(2, 5));
+
+    // Add a range to a query without a start parameter.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->range(0, 3)
+      ->sort('id', 'ASC')
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(1, 2, 3));
+
+    // Apply a pager with limit 4.
+    $this->queryResults = $this->factory->get('config_query_test')
+      ->pager(4, 0)
+      ->sort('id', 'ASC')
+      ->execute();
+    $this->assertEqual(array_keys($this->queryResults), array(1, 2, 3, 4));
+  }
+
+  /**
+   * Asserts the results as expected regardless of order.
+   *
+   * @param $expected
+   *   Array of expected entity IDs.
+   */
+  function assertResults($expected) {
+    $result = array_keys($this->queryResults);
+    $this->assertEqual(sort($result), $expected);
+  }
+}
diff --git a/core/modules/user/tests/modules/user_custom_phpass_params_test/lib/Drupal/user_custom_phpass_params_test/UserCustomPhpassParamsTestBundle.php b/core/modules/user/tests/modules/user_custom_phpass_params_test/lib/Drupal/user_custom_phpass_params_test/UserCustomPhpassParamsTestBundle.php
deleted file mode 100644
index ab68d2e..0000000
--- a/core/modules/user/tests/modules/user_custom_phpass_params_test/lib/Drupal/user_custom_phpass_params_test/UserCustomPhpassParamsTestBundle.php
+++ /dev/null
@@ -1,20 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\user_custom_phpass_params_test\UserCustomPhpassParamsTestBundle
- */
-
-namespace Drupal\user_custom_phpass_params_test;
-
-use Symfony\Component\DependencyInjection\ContainerBuilder;
-use Symfony\Component\HttpKernel\Bundle\Bundle;
-
-class UserCustomPhpassParamsTestBundle extends Bundle
-{
-  public function build(ContainerBuilder $container) {
-    // Override the default password hashing service parameters
-    $container->register('password', 'Drupal\Core\Password\PhpassHashedPassword')
-      ->addArgument(19);
-  }
-}
diff --git a/core/modules/user/tests/modules/user_custom_phpass_params_test/user_custom_phpass_params_test.info b/core/modules/user/tests/modules/user_custom_phpass_params_test/user_custom_phpass_params_test.info
deleted file mode 100644
index 3e13f80..0000000
--- a/core/modules/user/tests/modules/user_custom_phpass_params_test/user_custom_phpass_params_test.info
+++ /dev/null
@@ -1,6 +0,0 @@
-name = "User custom phpass params test"
-description = "Support module for testing custom phpass password algorithm parameters."
-package = Testing
-version = VERSION
-core = 8.x
-hidden = TRUE
diff --git a/core/modules/user/tests/modules/user_custom_phpass_params_test/user_custom_phpass_params_test.module b/core/modules/user/tests/modules/user_custom_phpass_params_test/user_custom_phpass_params_test.module
deleted file mode 100644
index e69de29..0000000
diff --git a/core/modules/user/tests/modules/user_form_test/user_form_test.info b/core/modules/user/tests/modules/user_form_test/user_form_test.info
deleted file mode 100644
index ed2f39e..0000000
--- a/core/modules/user/tests/modules/user_form_test/user_form_test.info
+++ /dev/null
@@ -1,6 +0,0 @@
-name = "User module form tests"
-description = "Support module for user form testing."
-package = Testing
-version = VERSION
-core = 8.x
-hidden = TRUE
diff --git a/core/modules/user/tests/modules/user_form_test/user_form_test.module b/core/modules/user/tests/modules/user_form_test/user_form_test.module
deleted file mode 100644
index 5702c53..0000000
--- a/core/modules/user/tests/modules/user_form_test/user_form_test.module
+++ /dev/null
@@ -1,64 +0,0 @@
-<?php
-
-/**
- * @file
- * Dummy module implementing a form to test user password validation
- */
-
-/**
- * Implements hook_menu().
- *
- * Sets up a form that allows a user to validate password.
- */
-function user_form_test_menu() {
-  $items = array();
-  $items['user_form_test_current_password/%user'] = array(
-    'title' => 'User form test for current password validation',
-    'page callback' => 'drupal_get_form',
-    'page arguments' => array('user_form_test_current_password',1),
-    'access arguments' => array('administer users'),
-    'type' => MENU_SUGGESTED_ITEM,
-  );
-  return $items;
-}
-
-/**
- * A test form for user_validate_current_pass().
- */
-function user_form_test_current_password($form, &$form_state, $account) {
-  $account->user_form_test_field = '';
-  $form_state['user'] = $account;
-
-  $form['user_form_test_field'] = array(
-    '#type' => 'textfield',
-    '#title' => t('Test field'),
-    '#description' => t('A field that would require a correct password to change.'),
-    '#required' => TRUE,
-  );
-
-  $form['current_pass'] = array(
-    '#type' => 'password',
-    '#title' => t('Current password'),
-    '#size' => 25,
-    '#description' => t('Enter your current password'),
-  );
-
-  $form['current_pass_required_values'] = array(
-    '#type' => 'value',
-    '#value' => array('user_form_test_field' => t('Test field')),
-  );
-
-  $form['#validate'][] = 'user_validate_current_pass';
-  $form['submit'] = array(
-    '#type' => 'submit',
-    '#value' => t('Test'),
-  );
-  return $form;
-}
-
-/**
- * Submit function for the test form for user_validate_current_pass().
- */
-function user_form_test_current_password_submit($form, &$form_state) {
-  drupal_set_message(t('The password has been validated and the form submitted successfully.'));
-}
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_access_perm.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_access_perm.yml
deleted file mode 100644
index cab4e3f..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_access_perm.yml
+++ /dev/null
@@ -1,28 +0,0 @@
-base_table: node
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        type: perm
-        options:
-          perm: 'views_test_data test permission'
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      pager:
-        type: full
-      style:
-        type: default
-      row:
-        type: fields
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-human_name: ''
-id: test_access_perm
-tag: ''
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_access_role.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_access_role.yml
deleted file mode 100644
index e8df49d..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_access_role.yml
+++ /dev/null
@@ -1,26 +0,0 @@
-base_table: node
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        type: role
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      pager:
-        type: full
-      style:
-        type: default
-      row:
-        type: fields
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-human_name: ''
-id: test_access_role
-tag: ''
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_groupwise_user.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_groupwise_user.yml
deleted file mode 100644
index 8b09600..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_groupwise_user.yml
+++ /dev/null
@@ -1,75 +0,0 @@
-base_field: uid
-base_table: users
-core: 8.0-dev
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        perm: 'access user profiles'
-        type: perm
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      fields:
-        name:
-          field: name
-          id: name
-          table: users
-        nid:
-          field: nid
-          id: nid
-          relationship: uid_representative
-          table: node
-      filters:
-        status:
-          expose:
-            operator: '0'
-          field: status
-          group: '1'
-          id: status
-          table: users
-          value: '1'
-      pager:
-        options:
-          items_per_page: '10'
-        type: full
-      query:
-        type: views_query
-      relationships:
-        uid_representative:
-          admin_label: ''
-          field: uid_representative
-          group_type: group
-          id: uid_representative
-          label: 'Representative node'
-          relationship: none
-          required: '0'
-          subquery_namespace: ''
-          subquery_order: DESC
-          subquery_regenerate: '1'
-          subquery_sort: node.nid
-          subquery_view: ''
-          table: users
-      row:
-        type: fields
-      sorts:
-        created:
-          field: created
-          id: created
-          order: DESC
-          table: users
-      style:
-        type: default
-      title: test_groupwise_user
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: {  }
-human_name: test_groupwise_user
-langcode: und
-module: views
-id: test_groupwise_user
-tag: default
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_plugin_argument_default_current_user.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_plugin_argument_default_current_user.yml
deleted file mode 100644
index 40b8ff1..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_plugin_argument_default_current_user.yml
+++ /dev/null
@@ -1,55 +0,0 @@
-base_table: node
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        type: none
-      arguments:
-        'null':
-          default_action: default
-          default_argument_type: current_user
-          field: 'null'
-          id: 'null'
-          must_not_be: '0'
-          style_plugin: default_summary
-          table: views
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      fields:
-        title:
-          alter:
-            alter_text: '0'
-            ellipsis: '1'
-            html: '0'
-            make_link: '0'
-            strip_tags: '0'
-            trim: '0'
-            word_boundary: '1'
-          empty_zero: '0'
-          field: title
-          hide_empty: '0'
-          id: title
-          link_to_node: '0'
-          table: node
-      pager:
-        options:
-          id: '0'
-          items_per_page: '10'
-          offset: '0'
-        type: full
-      style:
-        type: default
-      row:
-        type: fields
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-human_name: ''
-id: test_plugin_argument_default_current_user
-tag: ''
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_name.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_name.yml
deleted file mode 100644
index 3288594..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_name.yml
+++ /dev/null
@@ -1,52 +0,0 @@
-base_table: users
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        type: none
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      pager:
-        type: full
-      row:
-        type: fields
-      style:
-        type: default
-      fields:
-        name:
-          id: uid
-          table: users
-          field: uid
-      filters:
-        uid:
-          id: uid
-          table: users
-          field: uid
-          exposed: true
-          expose:
-            operator_id: uid_op
-            label: Name
-            operator: uid_op
-            identifier: uid
-            remember_roles:
-              authenticated: authenticated
-              anonymous: 0
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-  page_1:
-    display_options:
-      path: test_user_name
-    display_plugin: page
-    display_title: Page
-    id: page_1
-    position: '0'
-human_name: ''
-id: test_user_name
-tag: ''
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_relationship.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_relationship.yml
deleted file mode 100644
index 3c19d4e..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_relationship.yml
+++ /dev/null
@@ -1,101 +0,0 @@
-base_table: node
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        type: perm
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      fields:
-        name:
-          alter:
-            absolute: '0'
-            alter_text: '0'
-            ellipsis: '1'
-            external: '0'
-            html: '0'
-            make_link: '0'
-            nl2br: '0'
-            replace_spaces: '0'
-            strip_tags: '0'
-            trim: '0'
-            trim_whitespace: '0'
-            word_boundary: '1'
-          element_default_classes: '1'
-          element_label_colon: '1'
-          empty_zero: '0'
-          field: name
-          hide_alter_empty: '0'
-          hide_empty: '0'
-          id: name
-          link_to_user: '1'
-          overwrite_anonymous: '0'
-          table: users
-        title:
-          alter:
-            absolute: '0'
-            alter_text: '0'
-            ellipsis: '0'
-            html: '0'
-            make_link: '0'
-            strip_tags: '0'
-            trim: '0'
-            word_boundary: '0'
-          empty_zero: '0'
-          field: title
-          hide_empty: '0'
-          id: title
-          label: ''
-          link_to_node: '1'
-          table: node
-        uid:
-          alter:
-            absolute: '0'
-            alter_text: '0'
-            ellipsis: '1'
-            external: '0'
-            html: '0'
-            make_link: '0'
-            nl2br: '0'
-            replace_spaces: '0'
-            strip_tags: '0'
-            trim: '0'
-            trim_whitespace: '0'
-            word_boundary: '1'
-          element_default_classes: '1'
-          element_label_colon: '1'
-          empty_zero: '0'
-          field: uid
-          hide_alter_empty: '0'
-          hide_empty: '0'
-          id: uid
-          link_to_user: '1'
-          table: users
-      pager:
-        options:
-          items_per_page: '10'
-        type: full
-      query:
-        options:
-          query_comment: '0'
-        type: views_query
-      title: test_user_relationship
-      style:
-        type: default
-      row:
-        type: fields
-        options:
-          default_field_elements: '1'
-          hide_empty: '0'
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-human_name: test_user_relationship
-id: test_user_relationship
-tag: default
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_uid_argument.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_uid_argument.yml
deleted file mode 100644
index 6309f8a..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_user_uid_argument.yml
+++ /dev/null
@@ -1,25 +0,0 @@
-base_table: users
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      fields:
-        uid:
-          id: uid
-          table: users
-          field: uid
-      arguments:
-        uid:
-          id: uid
-          table: users
-          field: uid
-          title_enable: true
-          title: %1
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-human_name:
-id: test_user_uid_argument
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_view_argument_validate_user.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_view_argument_validate_user.yml
deleted file mode 100644
index dba19db..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_view_argument_validate_user.yml
+++ /dev/null
@@ -1,36 +0,0 @@
-base_table: node
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        type: none
-      arguments:
-        'null':
-          default_argument_type: fixed
-          field: 'null'
-          id: 'null'
-          must_not_be: '0'
-          style_plugin: default_summary
-          table: views
-          validate:
-            type: user
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      pager:
-        type: full
-      style:
-        type: default
-      row:
-        type: fields
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-human_name: ''
-id: test_view_argument_validate_user
-tag: ''
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_views_handler_field_role.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_views_handler_field_role.yml
deleted file mode 100644
index 193c15b..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_views_handler_field_role.yml
+++ /dev/null
@@ -1,153 +0,0 @@
-base_field: uid
-base_table: users
-core: 8.x
-description: ''
-disabled: '0'
-display:
-  default:
-    display_plugin: default
-    id: default
-    display_title: Master
-    position: ''
-    display_options:
-      access:
-        type: perm
-        perm: 'access user profiles'
-      cache:
-        type: none
-      query:
-        type: views_query
-      exposed_form:
-        type: basic
-      pager:
-        type: none
-        options:
-          items_per_page: ''
-      style:
-        type: default
-      row:
-        type: fields
-      fields:
-        name:
-          id: name
-          table: users
-          field: name
-          relationship: none
-          group_type: group
-          admin_label: ''
-          label: Name
-          exclude: '0'
-          alter:
-            alter_text: '0'
-            text: ''
-            make_link: '0'
-            path: ''
-            absolute: '0'
-            external: '0'
-            replace_spaces: '0'
-            path_case: none
-            trim_whitespace: '0'
-            alt: ''
-            rel: ''
-            link_class: ''
-            prefix: ''
-            suffix: ''
-            target: ''
-            nl2br: '0'
-            max_length: ''
-            word_boundary: '1'
-            ellipsis: '1'
-            more_link: '0'
-            more_link_text: ''
-            more_link_path: ''
-            strip_tags: '0'
-            trim: '0'
-            preserve_tags: ''
-            html: '0'
-          element_type: ''
-          element_class: ''
-          element_label_type: ''
-          element_label_class: ''
-          element_label_colon: '1'
-          element_wrapper_type: ''
-          element_wrapper_class: ''
-          element_default_classes: '1'
-          empty: ''
-          hide_empty: '0'
-          empty_zero: '0'
-          hide_alter_empty: '1'
-          link_to_user: '1'
-          overwrite_anonymous: '0'
-          anonymous_text: ''
-          format_username: '1'
-        rid:
-          id: rid
-          table: users_roles
-          field: rid
-          relationship: none
-          group_type: group
-          admin_label: ''
-          label: Roles
-          exclude: '0'
-          alter:
-            alter_text: '0'
-            text: ''
-            make_link: '0'
-            path: ''
-            absolute: '0'
-            external: '0'
-            replace_spaces: '0'
-            path_case: none
-            trim_whitespace: '0'
-            alt: ''
-            rel: ''
-            link_class: ''
-            prefix: ''
-            suffix: ''
-            target: ''
-            nl2br: '0'
-            max_length: ''
-            word_boundary: '1'
-            ellipsis: '1'
-            more_link: '0'
-            more_link_text: ''
-            more_link_path: ''
-            strip_tags: '0'
-            trim: '0'
-            preserve_tags: ''
-            html: '0'
-          element_type: ''
-          element_class: ''
-          element_label_type: ''
-          element_label_class: ''
-          element_label_colon: '1'
-          element_wrapper_type: ''
-          element_wrapper_class: ''
-          element_default_classes: '1'
-          empty: ''
-          hide_empty: '0'
-          empty_zero: '0'
-          hide_alter_empty: '1'
-          type: separator
-          separator: ''
-      filters:
-        status:
-          value: '1'
-          table: users
-          field: status
-          id: status
-          expose:
-            operator: '0'
-          group: '1'
-      sorts: {  }
-      title: test_user_role
-  page_1:
-    display_plugin: page
-    id: page_1
-    display_title: Page
-    position: ''
-    display_options:
-      path: test-views-handler-field-role
-human_name: test_views_handler_field_role
-id: test_views_handler_field_role
-tag: ''
diff --git a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_views_handler_field_user_name.yml b/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_views_handler_field_user_name.yml
deleted file mode 100644
index f068501..0000000
--- a/core/modules/user/tests/modules/user_test_views/test_views/views.view.test_views_handler_field_user_name.yml
+++ /dev/null
@@ -1,49 +0,0 @@
-base_table: users
-core: '8'
-description: ''
-disabled: '0'
-display:
-  default:
-    display_options:
-      access:
-        type: none
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      fields:
-        name:
-          alter:
-            absolute: '0'
-            alter_text: '0'
-            ellipsis: '0'
-            html: '0'
-            make_link: '0'
-            strip_tags: '0'
-            trim: '0'
-            word_boundary: '0'
-          empty_zero: '0'
-          field: name
-          hide_empty: '0'
-          id: name
-          label: ''
-          link_to_user: '1'
-          overwrite_anonymous: '0'
-          table: users
-      pager:
-        type: full
-      query:
-        options:
-          query_comment: '0'
-        type: views_query
-      style:
-        type: default
-      row:
-        type: fields
-    display_plugin: default
-    display_title: Master
-    id: default
-    position: '0'
-human_name: test_views_handler_field_user_name
-id: test_views_handler_field_user_name
-tag: default
diff --git a/core/modules/user/tests/modules/user_test_views/user_test_views.info b/core/modules/user/tests/modules/user_test_views/user_test_views.info
deleted file mode 100644
index 52edbbb..0000000
--- a/core/modules/user/tests/modules/user_test_views/user_test_views.info
+++ /dev/null
@@ -1,8 +0,0 @@
-name = User test views
-description = Provides default views for views user tests.
-package = Testing
-version = VERSION
-core = 8.x
-dependencies[] = user
-dependencies[] = views
-hidden = TRUE
diff --git a/core/modules/user/tests/modules/user_test_views/user_test_views.module b/core/modules/user/tests/modules/user_test_views/user_test_views.module
deleted file mode 100644
index b3d9bbc..0000000
--- a/core/modules/user/tests/modules/user_test_views/user_test_views.module
+++ /dev/null
@@ -1 +0,0 @@
-<?php
diff --git a/core/modules/user/tests/user_custom_phpass_params_test/lib/Drupal/user_custom_phpass_params_test/UserCustomPhpassParamsTestBundle.php b/core/modules/user/tests/user_custom_phpass_params_test/lib/Drupal/user_custom_phpass_params_test/UserCustomPhpassParamsTestBundle.php
new file mode 100644
index 0000000..ab68d2e
--- /dev/null
+++ b/core/modules/user/tests/user_custom_phpass_params_test/lib/Drupal/user_custom_phpass_params_test/UserCustomPhpassParamsTestBundle.php
@@ -0,0 +1,20 @@
+<?php
+
+/**
+ * @file
+ * Definition of Drupal\user_custom_phpass_params_test\UserCustomPhpassParamsTestBundle
+ */
+
+namespace Drupal\user_custom_phpass_params_test;
+
+use Symfony\Component\DependencyInjection\ContainerBuilder;
+use Symfony\Component\HttpKernel\Bundle\Bundle;
+
+class UserCustomPhpassParamsTestBundle extends Bundle
+{
+  public function build(ContainerBuilder $container) {
+    // Override the default password hashing service parameters
+    $container->register('password', 'Drupal\Core\Password\PhpassHashedPassword')
+      ->addArgument(19);
+  }
+}
diff --git a/core/modules/user/tests/user_custom_phpass_params_test/user_custom_phpass_params_test.info b/core/modules/user/tests/user_custom_phpass_params_test/user_custom_phpass_params_test.info
new file mode 100644
index 0000000..3e13f80
--- /dev/null
+++ b/core/modules/user/tests/user_custom_phpass_params_test/user_custom_phpass_params_test.info
@@ -0,0 +1,6 @@
+name = "User custom phpass params test"
+description = "Support module for testing custom phpass password algorithm parameters."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/user/tests/user_custom_phpass_params_test/user_custom_phpass_params_test.module b/core/modules/user/tests/user_custom_phpass_params_test/user_custom_phpass_params_test.module
new file mode 100644
index 0000000..e69de29
diff --git a/core/modules/user/tests/user_form_test.info b/core/modules/user/tests/user_form_test.info
new file mode 100644
index 0000000..ed2f39e
--- /dev/null
+++ b/core/modules/user/tests/user_form_test.info
@@ -0,0 +1,6 @@
+name = "User module form tests"
+description = "Support module for user form testing."
+package = Testing
+version = VERSION
+core = 8.x
+hidden = TRUE
diff --git a/core/modules/user/tests/user_form_test.module b/core/modules/user/tests/user_form_test.module
new file mode 100644
index 0000000..5702c53
--- /dev/null
+++ b/core/modules/user/tests/user_form_test.module
@@ -0,0 +1,64 @@
+<?php
+
+/**
+ * @file
+ * Dummy module implementing a form to test user password validation
+ */
+
+/**
+ * Implements hook_menu().
+ *
+ * Sets up a form that allows a user to validate password.
+ */
+function user_form_test_menu() {
+  $items = array();
+  $items['user_form_test_current_password/%user'] = array(
+    'title' => 'User form test for current password validation',
+    'page callback' => 'drupal_get_form',
+    'page arguments' => array('user_form_test_current_password',1),
+    'access arguments' => array('administer users'),
+    'type' => MENU_SUGGESTED_ITEM,
+  );
+  return $items;
+}
+
+/**
+ * A test form for user_validate_current_pass().
+ */
+function user_form_test_current_password($form, &$form_state, $account) {
+  $account->user_form_test_field = '';
+  $form_state['user'] = $account;
+
+  $form['user_form_test_field'] = array(
+    '#type' => 'textfield',
+    '#title' => t('Test field'),
+    '#description' => t('A field that would require a correct password to change.'),
+    '#required' => TRUE,
+  );
+
+  $form['current_pass'] = array(
+    '#type' => 'password',
+    '#title' => t('Current password'),
+    '#size' => 25,
+    '#description' => t('Enter your current password'),
+  );
+
+  $form['current_pass_required_values'] = array(
+    '#type' => 'value',
+    '#value' => array('user_form_test_field' => t('Test field')),
+  );
+
+  $form['#validate'][] = 'user_validate_current_pass';
+  $form['submit'] = array(
+    '#type' => 'submit',
+    '#value' => t('Test'),
+  );
+  return $form;
+}
+
+/**
+ * Submit function for the test form for user_validate_current_pass().
+ */
+function user_form_test_current_password_submit($form, &$form_state) {
+  drupal_set_message(t('The password has been validated and the form submitted successfully.'));
+}
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_access_perm.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_access_perm.yml
new file mode 100644
index 0000000..cab4e3f
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_access_perm.yml
@@ -0,0 +1,28 @@
+base_table: node
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: perm
+        options:
+          perm: 'views_test_data test permission'
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      pager:
+        type: full
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name: ''
+id: test_access_perm
+tag: ''
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_access_role.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_access_role.yml
new file mode 100644
index 0000000..e8df49d
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_access_role.yml
@@ -0,0 +1,26 @@
+base_table: node
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: role
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      pager:
+        type: full
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name: ''
+id: test_access_role
+tag: ''
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_groupwise_user.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_groupwise_user.yml
new file mode 100644
index 0000000..8b09600
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_groupwise_user.yml
@@ -0,0 +1,75 @@
+base_field: uid
+base_table: users
+core: 8.0-dev
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        perm: 'access user profiles'
+        type: perm
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        name:
+          field: name
+          id: name
+          table: users
+        nid:
+          field: nid
+          id: nid
+          relationship: uid_representative
+          table: node
+      filters:
+        status:
+          expose:
+            operator: '0'
+          field: status
+          group: '1'
+          id: status
+          table: users
+          value: '1'
+      pager:
+        options:
+          items_per_page: '10'
+        type: full
+      query:
+        type: views_query
+      relationships:
+        uid_representative:
+          admin_label: ''
+          field: uid_representative
+          group_type: group
+          id: uid_representative
+          label: 'Representative node'
+          relationship: none
+          required: '0'
+          subquery_namespace: ''
+          subquery_order: DESC
+          subquery_regenerate: '1'
+          subquery_sort: node.nid
+          subquery_view: ''
+          table: users
+      row:
+        type: fields
+      sorts:
+        created:
+          field: created
+          id: created
+          order: DESC
+          table: users
+      style:
+        type: default
+      title: test_groupwise_user
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: {  }
+human_name: test_groupwise_user
+langcode: und
+module: views
+id: test_groupwise_user
+tag: default
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_plugin_argument_default_current_user.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_plugin_argument_default_current_user.yml
new file mode 100644
index 0000000..40b8ff1
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_plugin_argument_default_current_user.yml
@@ -0,0 +1,55 @@
+base_table: node
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: none
+      arguments:
+        'null':
+          default_action: default
+          default_argument_type: current_user
+          field: 'null'
+          id: 'null'
+          must_not_be: '0'
+          style_plugin: default_summary
+          table: views
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        title:
+          alter:
+            alter_text: '0'
+            ellipsis: '1'
+            html: '0'
+            make_link: '0'
+            strip_tags: '0'
+            trim: '0'
+            word_boundary: '1'
+          empty_zero: '0'
+          field: title
+          hide_empty: '0'
+          id: title
+          link_to_node: '0'
+          table: node
+      pager:
+        options:
+          id: '0'
+          items_per_page: '10'
+          offset: '0'
+        type: full
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name: ''
+id: test_plugin_argument_default_current_user
+tag: ''
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_user_name.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_user_name.yml
new file mode 100644
index 0000000..3288594
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_user_name.yml
@@ -0,0 +1,52 @@
+base_table: users
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: none
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      pager:
+        type: full
+      row:
+        type: fields
+      style:
+        type: default
+      fields:
+        name:
+          id: uid
+          table: users
+          field: uid
+      filters:
+        uid:
+          id: uid
+          table: users
+          field: uid
+          exposed: true
+          expose:
+            operator_id: uid_op
+            label: Name
+            operator: uid_op
+            identifier: uid
+            remember_roles:
+              authenticated: authenticated
+              anonymous: 0
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+  page_1:
+    display_options:
+      path: test_user_name
+    display_plugin: page
+    display_title: Page
+    id: page_1
+    position: '0'
+human_name: ''
+id: test_user_name
+tag: ''
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_user_relationship.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_user_relationship.yml
new file mode 100644
index 0000000..3c19d4e
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_user_relationship.yml
@@ -0,0 +1,101 @@
+base_table: node
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: perm
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        name:
+          alter:
+            absolute: '0'
+            alter_text: '0'
+            ellipsis: '1'
+            external: '0'
+            html: '0'
+            make_link: '0'
+            nl2br: '0'
+            replace_spaces: '0'
+            strip_tags: '0'
+            trim: '0'
+            trim_whitespace: '0'
+            word_boundary: '1'
+          element_default_classes: '1'
+          element_label_colon: '1'
+          empty_zero: '0'
+          field: name
+          hide_alter_empty: '0'
+          hide_empty: '0'
+          id: name
+          link_to_user: '1'
+          overwrite_anonymous: '0'
+          table: users
+        title:
+          alter:
+            absolute: '0'
+            alter_text: '0'
+            ellipsis: '0'
+            html: '0'
+            make_link: '0'
+            strip_tags: '0'
+            trim: '0'
+            word_boundary: '0'
+          empty_zero: '0'
+          field: title
+          hide_empty: '0'
+          id: title
+          label: ''
+          link_to_node: '1'
+          table: node
+        uid:
+          alter:
+            absolute: '0'
+            alter_text: '0'
+            ellipsis: '1'
+            external: '0'
+            html: '0'
+            make_link: '0'
+            nl2br: '0'
+            replace_spaces: '0'
+            strip_tags: '0'
+            trim: '0'
+            trim_whitespace: '0'
+            word_boundary: '1'
+          element_default_classes: '1'
+          element_label_colon: '1'
+          empty_zero: '0'
+          field: uid
+          hide_alter_empty: '0'
+          hide_empty: '0'
+          id: uid
+          link_to_user: '1'
+          table: users
+      pager:
+        options:
+          items_per_page: '10'
+        type: full
+      query:
+        options:
+          query_comment: '0'
+        type: views_query
+      title: test_user_relationship
+      style:
+        type: default
+      row:
+        type: fields
+        options:
+          default_field_elements: '1'
+          hide_empty: '0'
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name: test_user_relationship
+id: test_user_relationship
+tag: default
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_user_uid_argument.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_user_uid_argument.yml
new file mode 100644
index 0000000..6309f8a
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_user_uid_argument.yml
@@ -0,0 +1,25 @@
+base_table: users
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      fields:
+        uid:
+          id: uid
+          table: users
+          field: uid
+      arguments:
+        uid:
+          id: uid
+          table: users
+          field: uid
+          title_enable: true
+          title: %1
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name:
+id: test_user_uid_argument
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_view_argument_validate_user.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_view_argument_validate_user.yml
new file mode 100644
index 0000000..dba19db
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_view_argument_validate_user.yml
@@ -0,0 +1,36 @@
+base_table: node
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: none
+      arguments:
+        'null':
+          default_argument_type: fixed
+          field: 'null'
+          id: 'null'
+          must_not_be: '0'
+          style_plugin: default_summary
+          table: views
+          validate:
+            type: user
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      pager:
+        type: full
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name: ''
+id: test_view_argument_validate_user
+tag: ''
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_role.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_role.yml
new file mode 100644
index 0000000..193c15b
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_role.yml
@@ -0,0 +1,153 @@
+base_field: uid
+base_table: users
+core: 8.x
+description: ''
+disabled: '0'
+display:
+  default:
+    display_plugin: default
+    id: default
+    display_title: Master
+    position: ''
+    display_options:
+      access:
+        type: perm
+        perm: 'access user profiles'
+      cache:
+        type: none
+      query:
+        type: views_query
+      exposed_form:
+        type: basic
+      pager:
+        type: none
+        options:
+          items_per_page: ''
+      style:
+        type: default
+      row:
+        type: fields
+      fields:
+        name:
+          id: name
+          table: users
+          field: name
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: Name
+          exclude: '0'
+          alter:
+            alter_text: '0'
+            text: ''
+            make_link: '0'
+            path: ''
+            absolute: '0'
+            external: '0'
+            replace_spaces: '0'
+            path_case: none
+            trim_whitespace: '0'
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: '0'
+            max_length: ''
+            word_boundary: '1'
+            ellipsis: '1'
+            more_link: '0'
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: '0'
+            trim: '0'
+            preserve_tags: ''
+            html: '0'
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: '1'
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: '1'
+          empty: ''
+          hide_empty: '0'
+          empty_zero: '0'
+          hide_alter_empty: '1'
+          link_to_user: '1'
+          overwrite_anonymous: '0'
+          anonymous_text: ''
+          format_username: '1'
+        rid:
+          id: rid
+          table: users_roles
+          field: rid
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: Roles
+          exclude: '0'
+          alter:
+            alter_text: '0'
+            text: ''
+            make_link: '0'
+            path: ''
+            absolute: '0'
+            external: '0'
+            replace_spaces: '0'
+            path_case: none
+            trim_whitespace: '0'
+            alt: ''
+            rel: ''
+            link_class: ''
+            prefix: ''
+            suffix: ''
+            target: ''
+            nl2br: '0'
+            max_length: ''
+            word_boundary: '1'
+            ellipsis: '1'
+            more_link: '0'
+            more_link_text: ''
+            more_link_path: ''
+            strip_tags: '0'
+            trim: '0'
+            preserve_tags: ''
+            html: '0'
+          element_type: ''
+          element_class: ''
+          element_label_type: ''
+          element_label_class: ''
+          element_label_colon: '1'
+          element_wrapper_type: ''
+          element_wrapper_class: ''
+          element_default_classes: '1'
+          empty: ''
+          hide_empty: '0'
+          empty_zero: '0'
+          hide_alter_empty: '1'
+          type: separator
+          separator: ''
+      filters:
+        status:
+          value: '1'
+          table: users
+          field: status
+          id: status
+          expose:
+            operator: '0'
+          group: '1'
+      sorts: {  }
+      title: test_user_role
+  page_1:
+    display_plugin: page
+    id: page_1
+    display_title: Page
+    position: ''
+    display_options:
+      path: test-views-handler-field-role
+human_name: test_views_handler_field_role
+id: test_views_handler_field_role
+tag: ''
diff --git a/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_user_name.yml b/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_user_name.yml
new file mode 100644
index 0000000..f068501
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/test_views/views.view.test_views_handler_field_user_name.yml
@@ -0,0 +1,49 @@
+base_table: users
+core: '8'
+description: ''
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: none
+      cache:
+        type: none
+      exposed_form:
+        type: basic
+      fields:
+        name:
+          alter:
+            absolute: '0'
+            alter_text: '0'
+            ellipsis: '0'
+            html: '0'
+            make_link: '0'
+            strip_tags: '0'
+            trim: '0'
+            word_boundary: '0'
+          empty_zero: '0'
+          field: name
+          hide_empty: '0'
+          id: name
+          label: ''
+          link_to_user: '1'
+          overwrite_anonymous: '0'
+          table: users
+      pager:
+        type: full
+      query:
+        options:
+          query_comment: '0'
+        type: views_query
+      style:
+        type: default
+      row:
+        type: fields
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: '0'
+human_name: test_views_handler_field_user_name
+id: test_views_handler_field_user_name
+tag: default
diff --git a/core/modules/user/tests/user_test_views/user_test_views.info b/core/modules/user/tests/user_test_views/user_test_views.info
new file mode 100644
index 0000000..52edbbb
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/user_test_views.info
@@ -0,0 +1,8 @@
+name = User test views
+description = Provides default views for views user tests.
+package = Testing
+version = VERSION
+core = 8.x
+dependencies[] = user
+dependencies[] = views
+hidden = TRUE
diff --git a/core/modules/user/tests/user_test_views/user_test_views.module b/core/modules/user/tests/user_test_views/user_test_views.module
new file mode 100644
index 0000000..b3d9bbc
--- /dev/null
+++ b/core/modules/user/tests/user_test_views/user_test_views.module
@@ -0,0 +1 @@
+<?php
