diff --git a/core/INSTALL.txt b/core/INSTALL.txt
index a4b88ed..514e528 100644
--- a/core/INSTALL.txt
+++ b/core/INSTALL.txt
@@ -158,26 +158,30 @@ INSTALLATION
 
    b. Missing settings file.
 
-      Drupal will try to automatically create a settings.php configuration file,
-      which is normally in the directory sites/default (to avoid problems when
-      upgrading, Drupal is not packaged with this file). If auto-creation fails,
-      you will need to create this file yourself, using the file
-      sites/default/default.settings.php as a template.
+      Drupal will try to automatically create settings.php and services.yml
+      files, which are normally in the directory sites/default (to avoid
+      problems when upgrading, Drupal is not packaged with this file). If
+      auto-creation of either file fails, you will need to create the file
+      yourself. Use the template sites/default/default.settings.php or
+      sites/default/default.services.yml respectively.
 
       For example, on a Unix/Linux command line, you can make a copy of the
-      default.settings.php file with the command:
+      default.settings.php and default.services.yml files with the commands:
 
         cp sites/default/default.settings.php sites/default/settings.php
+        cp sites/default/default.services.yml sites/default/services.yml
 
       Next, grant write privileges to the file to everyone (including the web
       server) with the command:
 
         chmod a+w sites/default/settings.php
+        chmod a+w sites/default/services.yml
 
       Be sure to set the permissions back after the installation is finished!
       Sample command:
 
         chmod go-w sites/default/settings.php
+        chmod go-w sites/default/services.yml
 
    c. Write permissions after install.
 
@@ -187,6 +191,7 @@ INSTALLATION
       from a Unix/Linux command line:
 
         chmod go-w sites/default/settings.php
+        chmod go-w sites/default/services.yml
         chmod go-w sites/default
 
 4. Verify that the site is working.
diff --git a/core/core.services.yml b/core/core.services.yml
index 1aadb75..bc94ced 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -1,13 +1,6 @@
 parameters:
-  session.storage.options:
-    gc_probability: 1
-    gc_divisor: 100
-    gc_maxlifetime: 200000
-    cookie_lifetime: 2000000
-  twig.config:
-    debug: false
-    auto_reload: null
-    cache: true
+  session.storage.options: {}
+  twig.config: {}
   renderer.config:
     required_cache_contexts: ['languages:language_interface', 'theme', 'user.permissions']
     auto_placeholder_conditions:
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 0a9e9be..cc903e6 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -343,9 +343,6 @@ function t($string, array $args = array(), array $options = array()) {
  * @see \Drupal\Component\Utility\SafeMarkup::format()
  * @see t()
  * @ingroup sanitization
- *
- * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
- *   Use \Drupal\Component\Utility\SafeMarkup::format().
  */
 function format_string($string, array $args) {
   return SafeMarkup::format($string, $args);
@@ -376,9 +373,6 @@ function format_string($string, array $args) {
  *   TRUE if the text is valid UTF-8, FALSE if not.
  *
  * @see \Drupal\Component\Utility\Unicode::validateUtf8()
- *
- * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
- *   Use \Drupal\Component\Utility\Unicode::validateUtf8().
  */
 function drupal_validate_utf8($text) {
   return Unicode::validateUtf8($text);
diff --git a/core/includes/common.inc b/core/includes/common.inc
index 7e86eb2..006c58f 100644
--- a/core/includes/common.inc
+++ b/core/includes/common.inc
@@ -367,9 +367,6 @@ function format_size($size, $langcode = NULL) {
  *   A translated date string in the requested format.
  *
  * @see \Drupal\Core\Datetime\DateFormatter::format()
- *
- * @deprecated in Drupal 8.0.0, will be removed before Drupal 9.0.0.
- *   Use \Drupal::service('date.formatter')->format().
  */
 function format_date($timestamp, $type = 'medium', $format = '', $timezone = NULL, $langcode = NULL) {
   return \Drupal::service('date.formatter')->format($timestamp, $type, $format, $timezone, $langcode);
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index 3b4c4ab..db35fd7 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -2092,6 +2092,13 @@ function install_check_requirements($install_state) {
     'description_default' => t('The default settings file does not exist.'),
     'title' => t('Settings file'),
   );
+  $default_files['services.yml'] = array(
+    'file' => 'services.yml',
+    'file_default' => 'default.services.yml',
+    'title_default' => t('Default services file'),
+    'description_default' => t('The default services file does not exist.'),
+    'title' => t('Services file'),
+  );
 
   foreach ($default_files as $default_file_info) {
     $readable = FALSE;
diff --git a/core/lib/Drupal/Core/Cache/CacheableJsonResponse.php b/core/lib/Drupal/Core/Cache/CacheableJsonResponse.php
deleted file mode 100644
index bc7d2a3..0000000
--- a/core/lib/Drupal/Core/Cache/CacheableJsonResponse.php
+++ /dev/null
@@ -1,26 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Cache\CacheableResponse.
- */
-
-namespace Drupal\Core\Cache;
-
-use Symfony\Component\HttpFoundation\JsonResponse;
-
-/**
- * A JsonResponse that contains and can expose cacheability metadata.
- *
- * Supports Drupal's caching concepts: cache tags for invalidation and cache
- * contexts for variations.
- *
- * @see \Drupal\Core\Cache\Cache
- * @see \Drupal\Core\Cache\CacheableMetadata
- * @see \Drupal\Core\Cache\CacheableResponseTrait
- */
-class CacheableJsonResponse extends JsonResponse implements CacheableResponseInterface {
-
-  use CacheableResponseTrait;
-
-}
diff --git a/core/lib/Drupal/Core/Database/Connection.php b/core/lib/Drupal/Core/Database/Connection.php
index 18283ce..a56bcf6 100644
--- a/core/lib/Drupal/Core/Database/Connection.php
+++ b/core/lib/Drupal/Core/Database/Connection.php
@@ -529,7 +529,7 @@ public function makeComment($comments) {
    *   A sanitized version of the query comment string.
    */
   protected function filterComment($comment = '') {
-    return strtr($comment, ['*' => ' * ']);
+    return preg_replace('/(\/\*\s*)|(\s*\*\/)/', '', $comment);
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php b/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
index ff38a22..ac0184b 100644
--- a/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
+++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Connection.php
@@ -383,22 +383,6 @@ public function rollbackSavepoint($savepoint_name = 'mimic_implicit_commit') {
       $this->rollback($savepoint_name);
     }
   }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function upsert($table, array $options = array()) {
-    // Use the (faster) native Upsert implementation for PostgreSQL >= 9.5.
-    if (version_compare($this->version(), '9.5', '>=')) {
-      $class = $this->getDriverClass('NativeUpsert');
-    }
-    else {
-      $class = $this->getDriverClass('Upsert');
-    }
-
-    return new $class($this, $table, $options);
-  }
-
 }
 
 /**
diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/NativeUpsert.php b/core/lib/Drupal/Core/Database/Driver/pgsql/NativeUpsert.php
deleted file mode 100644
index d1c6d11..0000000
--- a/core/lib/Drupal/Core/Database/Driver/pgsql/NativeUpsert.php
+++ /dev/null
@@ -1,116 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\Core\Database\Driver\pgsql\NativeUpsert.
- */
-
-namespace Drupal\Core\Database\Driver\pgsql;
-
-use Drupal\Core\Database\Query\Upsert as QueryUpsert;
-
-/**
- * Implements the native Upsert query for the PostgreSQL database driver.
- *
- * @see http://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT
- */
-class NativeUpsert extends QueryUpsert {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function execute() {
-    if (!$this->preExecute()) {
-      return NULL;
-    }
-
-    $stmt = $this->connection->prepareQuery((string) $this);
-
-    // Fetch the list of blobs and sequences used on that table.
-    $table_information = $this->connection->schema()->queryTableInformation($this->table);
-
-    $max_placeholder = 0;
-    $blobs = [];
-    $blob_count = 0;
-    foreach ($this->insertValues as $insert_values) {
-      foreach ($this->insertFields as $idx => $field) {
-        if (isset($table_information->blob_fields[$field])) {
-          $blobs[$blob_count] = fopen('php://memory', 'a');
-          fwrite($blobs[$blob_count], $insert_values[$idx]);
-          rewind($blobs[$blob_count]);
-
-          $stmt->bindParam(':db_insert_placeholder_' . $max_placeholder++, $blobs[$blob_count], \PDO::PARAM_LOB);
-
-          // Pre-increment is faster in PHP than increment.
-          ++$blob_count;
-        }
-        else {
-          $stmt->bindParam(':db_insert_placeholder_' . $max_placeholder++, $insert_values[$idx]);
-        }
-      }
-      // Check if values for a serial field has been passed.
-      if (!empty($table_information->serial_fields)) {
-        foreach ($table_information->serial_fields as $index => $serial_field) {
-          $serial_key = array_search($serial_field, $this->insertFields);
-          if ($serial_key !== FALSE) {
-            $serial_value = $insert_values[$serial_key];
-
-            // Sequences must be greater than or equal to 1.
-            if ($serial_value === NULL || !$serial_value) {
-              $serial_value = 1;
-            }
-            // Set the sequence to the bigger value of either the passed
-            // value or the max value of the column. It can happen that another
-            // thread calls nextval() which could lead to a serial number being
-            // used twice. However, trying to insert a value into a serial
-            // column should only be done in very rare cases and is not thread
-            // safe by definition.
-            $this->connection->query("SELECT setval('" . $table_information->sequences[$index] . "', GREATEST(MAX(" . $serial_field . "), :serial_value)) FROM {" . $this->table . "}", array(':serial_value' => (int)$serial_value));
-          }
-        }
-      }
-    }
-
-    $options = $this->queryOptions;
-    if (!empty($table_information->sequences)) {
-      $options['sequence_name'] = $table_information->sequences[0];
-    }
-
-    $this->connection->query($stmt, [], $options);
-
-    // Re-initialize the values array so that we can re-use this query.
-    $this->insertValues = [];
-
-    return TRUE;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function __toString() {
-    // Create a sanitized comment string to prepend to the query.
-    $comments = $this->connection->makeComment($this->comments);
-
-    // Default fields are always placed first for consistency.
-    $insert_fields = array_merge($this->defaultFields, $this->insertFields);
-    $insert_fields = array_map(function($f) { return $this->connection->escapeField($f); }, $insert_fields);
-
-    $query = $comments . 'INSERT INTO {' . $this->table . '} (' . implode(', ', $insert_fields) . ') VALUES ';
-
-    $values = $this->getInsertPlaceholderFragment($this->insertValues, $this->defaultFields);
-    $query .= implode(', ', $values);
-
-    // Updating the unique / primary key is not necessary.
-    unset($insert_fields[$this->key]);
-
-    $update = [];
-    foreach ($insert_fields as $field) {
-      $update[] = "$field = EXCLUDED.$field";
-    }
-
-    $query .= ' ON CONFLICT (' . $this->connection->escapeField($this->key) . ') DO UPDATE SET ' . implode(', ', $update);
-
-    return $query;
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Database/Driver/pgsql/Upsert.php b/core/lib/Drupal/Core/Database/Driver/pgsql/Upsert.php
index e23092d..a0a9de8 100644
--- a/core/lib/Drupal/Core/Database/Driver/pgsql/Upsert.php
+++ b/core/lib/Drupal/Core/Database/Driver/pgsql/Upsert.php
@@ -29,38 +29,68 @@ public function execute() {
 
     // Default fields are always placed first for consistency.
     $insert_fields = array_merge($this->defaultFields, $this->insertFields);
+    $insert_fields_escaped = array_map(function($f) { return $this->connection->escapeField($f); }, $insert_fields);
 
     $table = $this->connection->escapeTable($this->table);
+    $unique_key = $this->connection->escapeField($this->key);
 
     // We have to execute multiple queries, therefore we wrap everything in a
     // transaction so that it is atomic where possible.
     $transaction = $this->connection->startTransaction();
 
     try {
-      // First, lock the table we're upserting into.
-      $this->connection->query('LOCK TABLE {' . $table . '} IN SHARE ROW EXCLUSIVE MODE', [], $this->queryOptions);
-
-      // Second, delete all items first so we can do one insert.
-      $unique_key_position = array_search($this->key, $insert_fields);
-      $delete_ids = [];
-      foreach ($this->insertValues as $insert_values) {
-        $delete_ids[] = $insert_values[$unique_key_position];
-      }
-
-      // Delete in chunks when a large array is passed.
-      foreach (array_chunk($delete_ids, 1000) as $delete_ids_chunk) {
-        $this->connection->delete($this->table, $this->queryOptions)
-          ->condition($this->key, $delete_ids_chunk, 'IN')
-          ->execute();
-      }
-
-      // Third, insert all the values.
-      $insert = $this->connection->insert($this->table, $this->queryOptions)
+      // First, create a temporary table with the same schema as the table we
+      // are trying to upsert in. This results in the following query:
+      //
+      // CREATE TEMP TABLE temp_table AS SELECT * FROM table_name LIMIT 0;
+      $query = 'SELECT * FROM {' . $table . '} LIMIT 0';
+      $temp_table = $this->connection->queryTemporary($query, [], $this->queryOptions);
+
+      // Second, insert the data in the temporary table.
+      $insert = $this->connection->insert($temp_table, $this->queryOptions)
         ->fields($insert_fields);
       foreach ($this->insertValues as $insert_values) {
         $insert->values($insert_values);
       }
       $insert->execute();
+
+      // Third, lock the table we're upserting into.
+      $this->connection->query('LOCK TABLE {' . $table . '} IN EXCLUSIVE MODE', [], $this->queryOptions);
+
+      // Fourth, update any rows that can be updated. This results in the
+      // following query:
+      //
+      // UPDATE table_name
+      // SET column1 = temp_table.column1 [, column2 = temp_table.column2, ...]
+      // FROM temp_table
+      // WHERE table_name.id = temp_table.id;
+      $update = [];
+      foreach ($insert_fields_escaped as $field) {
+        if ($field !== $unique_key) {
+          $update[] = "$field = {" . $temp_table . "}.$field";
+        }
+      }
+
+      $update_query = 'UPDATE {' . $table . '} SET ' . implode(', ', $update);
+      $update_query .= ' FROM {' . $temp_table . '}';
+      $update_query .= ' WHERE {' . $temp_table . '}.' . $unique_key . ' = {' . $table . '}.' . $unique_key;
+      $this->connection->query($update_query, [], $this->queryOptions);
+
+      // Fifth, insert the remaining rows. This results in the following query:
+      //
+      // INSERT INTO table_name
+      // SELECT temp_table.primary_key, temp_table.column1 [, temp_table.column2 ...]
+      // FROM temp_table
+      // LEFT OUTER JOIN table_name ON (table_name.id = temp_table.id)
+      // WHERE table_name.id IS NULL;
+      $select = $this->connection->select($temp_table, 'temp_table', $this->queryOptions)
+        ->fields('temp_table', $insert_fields);
+      $select->leftJoin($this->table, 'actual_table', 'actual_table.' . $this->key . ' = temp_table.' . $this->key);
+      $select->isNull('actual_table.' . $this->key);
+
+      $this->connection->insert($this->table, $this->queryOptions)
+        ->from($select)
+        ->execute();
     }
     catch (\Exception $e) {
       // One of the queries failed, rollback the whole batch.
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index 89a77e1..cd0c19e 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -538,7 +538,9 @@ public function discoverServiceProviders() {
         }
       }
     }
-    $this->addServiceFiles(Settings::get('container_yamls', []));
+    if (!$this->addServiceFiles(Settings::get('container_yamls'))) {
+      throw new \Exception('The container_yamls setting is missing from settings.php');
+    }
   }
 
   /**
@@ -1443,10 +1445,17 @@ protected static function setupTrustedHosts(Request $request, $host_patterns) {
   /**
    * Add service files.
    *
-   * @param string[] $service_yamls
+   * @param $service_yamls
    *   A list of service files.
+   *
+   * @return bool
+   *   TRUE if the list was an array, FALSE otherwise.
    */
-  protected function addServiceFiles(array $service_yamls) {
-    $this->serviceYamls['site'] = array_filter($service_yamls, 'file_exists');
+  protected function addServiceFiles($service_yamls) {
+    if (is_array($service_yamls)) {
+      $this->serviceYamls['site'] = array_filter($service_yamls, 'file_exists');
+      return TRUE;
+    }
+    return FALSE;
   }
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php
index d1d44d6..07dce6e 100644
--- a/core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/MainContentViewSubscriber.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\Core\EventSubscriber;
 
-use Drupal\Core\Cache\CacheableMetadata;
-use Drupal\Core\Cache\CacheableResponseInterface;
 use Drupal\Core\DependencyInjection\ClassResolverInterface;
 use Drupal\Core\Routing\RouteMatchInterface;
 use Symfony\Component\EventDispatcher\EventSubscriberInterface;
@@ -92,14 +90,7 @@ public function onViewRenderArray(GetResponseForControllerResultEvent $event) {
       $wrapper = isset($this->mainContentRenderers[$wrapper]) ? $wrapper : 'html';
 
       $renderer = $this->classResolver->getInstanceFromDefinition($this->mainContentRenderers[$wrapper]);
-      $response = $renderer->renderResponse($result, $request, $this->routeMatch);
-      // The main content render array is rendered into a different Response
-      // object, depending on the specified wrapper format.
-      if ($response instanceof CacheableResponseInterface) {
-        $main_content_view_subscriber_cacheability = (new CacheableMetadata())->setCacheContexts(['url.query_args:' . static::WRAPPER_FORMAT]);
-        $response->addCacheableDependency($main_content_view_subscriber_cacheability);
-      }
-      $event->setResponse($response);
+      $event->setResponse($renderer->renderResponse($result, $request, $this->routeMatch));
     }
   }
 
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/PasswordItem.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/PasswordItem.php
index 621bb63..7de771a 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/PasswordItem.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/PasswordItem.php
@@ -63,16 +63,4 @@ public function preSave() {
       }
     }
   }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isEmpty() {
-    // We cannot use the parent implementation from StringItem as it does not
-    // consider the additional 'existing' property that PasswordItem contains.
-    $value = $this->get('value')->getValue();
-    $existing = $this->get('existing')->getValue();
-    return $value === NULL && $existing === NULL;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php
index 065310c..4772983 100644
--- a/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php
+++ b/core/lib/Drupal/Core/Field/Plugin/Field/FieldType/StringItemBase.php
@@ -40,12 +40,4 @@ public static function propertyDefinitions(FieldStorageDefinitionInterface $fiel
     return $properties;
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function isEmpty() {
-    $value = $this->get('value')->getValue();
-    return $value === NULL || $value === '';
-  }
-
 }
diff --git a/core/lib/Drupal/Core/Installer/InstallerKernel.php b/core/lib/Drupal/Core/Installer/InstallerKernel.php
index a00febf..cd3977c 100644
--- a/core/lib/Drupal/Core/Installer/InstallerKernel.php
+++ b/core/lib/Drupal/Core/Installer/InstallerKernel.php
@@ -38,4 +38,11 @@ public function resetConfigStorage() {
     $this->configStorage = NULL;
   }
 
+  /**
+   * {@inheritdoc}
+   */
+  protected function addServiceFiles($service_yamls) {
+    // In the beginning there is no settings.php and no service YAMLs.
+    return parent::addServiceFiles($service_yamls ?: []);
+  }
 }
diff --git a/core/lib/Drupal/Core/Utility/ProjectInfo.php b/core/lib/Drupal/Core/Utility/ProjectInfo.php
index 89d50ad..a2cf7a4 100644
--- a/core/lib/Drupal/Core/Utility/ProjectInfo.php
+++ b/core/lib/Drupal/Core/Utility/ProjectInfo.php
@@ -19,8 +19,9 @@ class ProjectInfo {
   /**
    * Populates an array of project data.
    *
-   * @todo https://www.drupal.org/node/2553909 update class since extensions can
-   *   no longer be disabled.
+   * @todo https://www.drupal.org/node/2338167 update class since extensions can
+   *   no longer be hidden, enabled or disabled. Additionally, base themes have
+   *   to be installed for sub themes to work.
    *
    * This iterates over a list of the installed modules or themes and groups
    * them by project and status. A few parts of this function assume that
@@ -28,12 +29,10 @@ class ProjectInfo {
    * modules or themes are being processed (there is a setting to control if
    * disabled code should be included in the Available updates report or not),
    * those are only processed after $projects has been populated with
-   * information about the enabled code. 'Hidden' modules and themes are
-   * ignored if they are not installed. 'Hidden' Modules and themes in the
-   * "Testing" package are ignored regardless of installation status.
-   *
-   * This function also records the latest change time on the .info.yml files
-   * for each module or theme, which is important data which is used when
+   * information about the enabled code. 'Hidden' modules are always ignored.
+   * 'Hidden' themes are ignored only if they have no enabled sub-themes.
+   * This function also records the latest change time on the .info.yml
+   * files for each module or theme, which is important data which is used when
    * deciding if the available update data should be invalidated.
    *
    * @param array $projects
@@ -51,8 +50,25 @@ class ProjectInfo {
    */
   function processInfoList(array &$projects, array $list, $project_type, $status, array $additional_whitelist = array()) {
     foreach ($list as $file) {
-      // Just projects with a matching status should be listed.
-      if ($file->status != $status) {
+      // A disabled or hidden base theme of an enabled sub-theme still has all
+      // of its code run by the sub-theme, so we include it in our "enabled"
+      // projects list.
+      if ($status && !empty($file->sub_themes)) {
+        foreach ($file->sub_themes as $key => $name) {
+          // Build a list of installed sub-themes.
+          if ($list[$key]->status) {
+            $file->installed_sub_themes[$key] = $name;
+          }
+        }
+        // If the theme is uninstalled and there are no installed subthemes, we
+        // should ignore this base theme for the installed case. If the site is
+        // trying to display uninstalled themes, we'll catch it then.
+        if (!$file->status && empty($file->installed_sub_themes)) {
+          continue;
+        }
+      }
+      // Otherwise, just add projects of the proper status to our list.
+      elseif ($file->status != $status) {
         continue;
       }
 
@@ -61,15 +77,9 @@ function processInfoList(array &$projects, array $list, $project_type, $status,
         continue;
       }
 
-      // Skip if it's a hidden project and the project is not installed.
-      if (!empty($file->info['hidden']) && empty($status)) {
-        continue;
-      }
-
-      // Skip if it's a hidden project and the project is a test project. Tests
-      // should use hook_system_info_alter() to test ProjectInfo's
-      // functionality.
-      if (!empty($file->info['hidden']) && isset($file->info['package']) && $file->info['package'] == 'Testing') {
+      // Skip if it's a hidden module or hidden theme without installed
+      // sub-themes.
+      if (!empty($file->info['hidden']) && empty($file->installed_sub_themes)) {
         continue;
       }
 
@@ -110,10 +120,25 @@ function processInfoList(array &$projects, array $list, $project_type, $status,
       else {
         $project_display_type = $project_type;
       }
-      if (empty($status)) {
+      if (empty($status) && empty($file->installed_sub_themes)) {
         // If we're processing disabled modules or themes, append a suffix.
+        // However, we don't do this to a base theme with installed
+        // subthemes, since we treat that case as if it is installed.
         $project_display_type .= '-disabled';
       }
+      // Add a list of sub-themes that "depend on" the project and a list of base
+      // themes that are "required by" the project.
+      if ($project_name == 'drupal') {
+        // Drupal core is always required, so this extra info would be noise.
+        $sub_themes = array();
+        $base_themes = array();
+      }
+      else {
+        // Add list of installed sub-themes.
+        $sub_themes = !empty($file->installed_sub_themes) ? $file->installed_sub_themes : array();
+        // Add list of base themes.
+        $base_themes = !empty($file->base_themes) ? $file->base_themes : array();
+      }
       if (!isset($projects[$project_name])) {
         // Only process this if we haven't done this project, since a single
         // project can have multiple modules or themes.
@@ -126,6 +151,8 @@ function processInfoList(array &$projects, array $list, $project_type, $status,
           'includes' => array($file->getName() => $file->info['name']),
           'project_type' => $project_display_type,
           'project_status' => $status,
+          'sub_themes' => $sub_themes,
+          'base_themes' => $base_themes,
         );
       }
       elseif ($projects[$project_name]['project_type'] == $project_display_type) {
@@ -137,6 +164,12 @@ function processInfoList(array &$projects, array $list, $project_type, $status,
         $projects[$project_name]['includes'][$file->getName()] = $file->info['name'];
         $projects[$project_name]['info']['_info_file_ctime'] = max($projects[$project_name]['info']['_info_file_ctime'], $file->info['_info_file_ctime']);
         $projects[$project_name]['datestamp'] = max($projects[$project_name]['datestamp'], $file->info['datestamp']);
+        if (!empty($sub_themes)) {
+          $projects[$project_name]['sub_themes'] += $sub_themes;
+        }
+        if (!empty($base_themes)) {
+          $projects[$project_name]['base_themes'] += $base_themes;
+        }
       }
       elseif (empty($status)) {
         // If we have a project_name that matches, but the project_display_type
diff --git a/core/modules/aggregator/src/Tests/FeedProcessorPluginTest.php b/core/modules/aggregator/src/Tests/FeedProcessorPluginTest.php
index 2584021..5142da5 100644
--- a/core/modules/aggregator/src/Tests/FeedProcessorPluginTest.php
+++ b/core/modules/aggregator/src/Tests/FeedProcessorPluginTest.php
@@ -47,10 +47,9 @@ public function testProcess() {
    */
   public function testDelete() {
     $feed = $this->createFeed();
-    $description = $feed->description->value ?: '';
     $this->updateAndDelete($feed, NULL);
     // Make sure the feed title is changed.
-    $entities = entity_load_multiple_by_properties('aggregator_feed', array('description' => $description));
+    $entities = entity_load_multiple_by_properties('aggregator_feed', array('description' => $feed->description->value));
     $this->assertTrue(empty($entities));
   }
 
diff --git a/core/modules/book/src/Tests/BookUninstallTest.php b/core/modules/book/src/Tests/BookUninstallTest.php
index 2d2f7da..c3739d8 100644
--- a/core/modules/book/src/Tests/BookUninstallTest.php
+++ b/core/modules/book/src/Tests/BookUninstallTest.php
@@ -57,7 +57,7 @@ public function testBookUninstall() {
     $allowed_types[] = $content_type->id();
     $book_config->set('allowed_types', $allowed_types)->save();
 
-    $node = Node::create(array('title' => $this->randomString(), 'type' => $content_type->id()));
+    $node = Node::create(array('type' => $content_type->id()));
     $node->book['bid'] = 'new';
     $node->save();
 
@@ -65,7 +65,7 @@ public function testBookUninstall() {
     $validation_reasons = \Drupal::service('module_installer')->validateUninstall(['book']);
     $this->assertEqual(['To uninstall Book, delete all content that is part of a book'], $validation_reasons['book']);
 
-    $book_node = Node::create(array('title' => $this->randomString(), 'type' => 'book'));
+    $book_node = Node::create(array('type' => 'book'));
     $book_node->book['bid'] = FALSE;
     $book_node->save();
 
@@ -84,7 +84,7 @@ public function testBookUninstall() {
     $module_data = _system_rebuild_module_data();
     $this->assertFalse(isset($module_data['book']->info['required']), 'The book module is not required.');
 
-    $node = Node::create(array('title' => $this->randomString(), 'type' => $content_type->id()));
+    $node = Node::create(array('type' => $content_type->id()));
     $node->save();
     // One node exists but is not part of a book therefore the book module is
     // not required.
diff --git a/core/modules/comment/src/Tests/CommentTranslationUITest.php b/core/modules/comment/src/Tests/CommentTranslationUITest.php
index 6397c69..f7b508a 100644
--- a/core/modules/comment/src/Tests/CommentTranslationUITest.php
+++ b/core/modules/comment/src/Tests/CommentTranslationUITest.php
@@ -39,7 +39,6 @@ class CommentTranslationUITest extends ContentTranslationUITestBase {
     'languages:language_interface',
     'theme',
     'timezone',
-    'url.query_args:_wrapper_format',
     'url.query_args.pagers:0',
     'user'
   ];
diff --git a/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php b/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php
index fb28074..cd23f6a 100644
--- a/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php
+++ b/core/modules/comment/src/Tests/Migrate/d6/MigrateCommentTest.php
@@ -44,7 +44,6 @@ protected function setUp() {
     $node = entity_create('node', array(
       'type' => 'story',
       'nid' => 1,
-      'title' => $this->randomString(),
     ));
     $node->enforceIsNew();
     $node->save();
diff --git a/core/modules/comment/src/Tests/Views/CommentUserNameTest.php b/core/modules/comment/src/Tests/Views/CommentUserNameTest.php
index e26d7dc..8b05c84 100644
--- a/core/modules/comment/src/Tests/Views/CommentUserNameTest.php
+++ b/core/modules/comment/src/Tests/Views/CommentUserNameTest.php
@@ -50,7 +50,6 @@ protected function setUp($import_test_views = TRUE) {
     $storage
       ->create(array(
         'uid' => 0,
-        'name' => '',
         'status' => 0,
       ))
       ->save();
@@ -76,7 +75,6 @@ protected function setUp($import_test_views = TRUE) {
     $comment = Comment::create([
       'subject' => 'My comment title',
       'uid' => $this->adminUser->id(),
-      'name' => $this->adminUser->label(),
       'entity_type' => 'entity_test',
       'comment_type' => 'entity_test',
       'status' => 1,
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationMetadataFieldsTest.php b/core/modules/content_translation/src/Tests/ContentTranslationMetadataFieldsTest.php
index 4c18c95..437be68 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationMetadataFieldsTest.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationMetadataFieldsTest.php
@@ -61,7 +61,7 @@ public function testSkipUntranslatable() {
 
     // Create a new test entity with original values in the default language.
     $default_langcode = $this->langcodes[0];
-    $entity_id = $this->createEntity(['title' => $this->randomString()], $default_langcode);
+    $entity_id = $this->createEntity([], $default_langcode);
     $storage = $entity_manager->getStorage($this->entityTypeId);
     $storage->resetCache();
     $entity = $storage->load($entity_id);
@@ -118,7 +118,7 @@ public function testSetTranslatable() {
 
     // Create a new test entity with original values in the default language.
     $default_langcode = $this->langcodes[0];
-    $entity_id = $this->createEntity(['title' => $this->randomString(), 'status' => FALSE], $default_langcode);
+    $entity_id = $this->createEntity(['status' => FALSE], $default_langcode);
     $storage = $entity_manager->getStorage($this->entityTypeId);
     $storage->resetCache();
     $entity = $storage->load($entity_id);
diff --git a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php
index a5d6d09..0c6b635 100644
--- a/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php
+++ b/core/modules/content_translation/src/Tests/ContentTranslationUITestBase.php
@@ -52,7 +52,7 @@
    *
    * @var string[]
    */
-  protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'url.query_args:_wrapper_format', 'user.permissions'];
+  protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'user.permissions'];
 
   /**
    * Tests the basic translation UI.
diff --git a/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php b/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
index 38955ab..b8ed11c 100644
--- a/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
+++ b/core/modules/contextual/src/Tests/ContextualDynamicContextTest.php
@@ -134,7 +134,7 @@ function testDifferentPermissions() {
     $this->assertResponse(403);
 
     // Verify that link language is properly handled.
-    $node3->addTranslation('it')->set('title', $this->randomString())->save();
+    $node3->addTranslation('it')->save();
     $id = 'node:node=' . $node3->id() . ':changed=' . $node3->getChangedTime() . '&langcode=it';
     $this->drupalGet('node', ['language' => ConfigurableLanguage::createFromLangcode('it')]);
     $this->assertContextualLinkPlaceHolder($id);
diff --git a/core/modules/file/src/Tests/Migrate/d6/MigrateUploadBase.php b/core/modules/file/src/Tests/Migrate/d6/MigrateUploadBase.php
index 6057919..5cff822 100644
--- a/core/modules/file/src/Tests/Migrate/d6/MigrateUploadBase.php
+++ b/core/modules/file/src/Tests/Migrate/d6/MigrateUploadBase.php
@@ -84,7 +84,6 @@ protected function setUp() {
         'type' => 'story',
         'nid' => $i,
         'vid' => array_shift($vids),
-        'title' => $this->randomString(),
       ));
       $node->enforceIsNew();
       $node->save();
diff --git a/core/modules/filter/src/Tests/FilterFormTest.php b/core/modules/filter/src/Tests/FilterFormTest.php
index f8555fd..5c4821a 100644
--- a/core/modules/filter/src/Tests/FilterFormTest.php
+++ b/core/modules/filter/src/Tests/FilterFormTest.php
@@ -91,40 +91,40 @@ protected function doFilterFormTestAsAdmin() {
     $this->assertEnabledTextarea('edit-all-formats-no-default-value');
     // If no default is given, the format with the lowest weight becomes the
     // default.
-    $this->assertOptions('edit-all-formats-no-default-format--2', $formats, 'filtered_html');
+    $this->assertOptions('edit-all-formats-no-default-format', $formats, 'filtered_html');
     $this->assertEnabledTextarea('edit-all-formats-default-value');
     // \Drupal\filter_test\Form\FilterTestFormatForm::buildForm() uses
     // 'filter_test' as the default value in this case.
-    $this->assertOptions('edit-all-formats-default-format--2', $formats, 'filter_test');
+    $this->assertOptions('edit-all-formats-default-format', $formats, 'filter_test');
     $this->assertEnabledTextarea('edit-all-formats-default-missing-value');
     // If a missing format is set as the default, administrators must select a
     // valid replacement format.
-    $this->assertRequiredSelectAndOptions('edit-all-formats-default-missing-format--2', $formats);
+    $this->assertRequiredSelectAndOptions('edit-all-formats-default-missing-format', $formats);
 
     // Test a text format element with a predefined list of formats.
     $formats = array('full_html', 'filter_test');
     $this->assertEnabledTextarea('edit-restricted-formats-no-default-value');
-    $this->assertOptions('edit-restricted-formats-no-default-format--2', $formats, 'full_html');
+    $this->assertOptions('edit-restricted-formats-no-default-format', $formats, 'full_html');
     $this->assertEnabledTextarea('edit-restricted-formats-default-value');
-    $this->assertOptions('edit-restricted-formats-default-format--2', $formats, 'full_html');
+    $this->assertOptions('edit-restricted-formats-default-format', $formats, 'full_html');
     $this->assertEnabledTextarea('edit-restricted-formats-default-missing-value');
-    $this->assertRequiredSelectAndOptions('edit-restricted-formats-default-missing-format--2', $formats);
+    $this->assertRequiredSelectAndOptions('edit-restricted-formats-default-missing-format', $formats);
     $this->assertEnabledTextarea('edit-restricted-formats-default-disallowed-value');
-    $this->assertRequiredSelectAndOptions('edit-restricted-formats-default-disallowed-format--2', $formats);
+    $this->assertRequiredSelectAndOptions('edit-restricted-formats-default-disallowed-format', $formats);
 
     // Test a text format element with a fixed format.
     $formats = array('filter_test');
     // When there is only a single option there is no point in choosing.
     $this->assertEnabledTextarea('edit-single-format-no-default-value');
-    $this->assertNoSelect('edit-single-format-no-default-format--2');
+    $this->assertNoSelect('edit-single-format-no-default-format');
     $this->assertEnabledTextarea('edit-single-format-default-value');
-    $this->assertNoSelect('edit-single-format-default-format--2');
+    $this->assertNoSelect('edit-single-format-default-format');
     // If the select has a missing or disallowed format, administrators must
     // explicitly choose the format.
     $this->assertEnabledTextarea('edit-single-format-default-missing-value');
-    $this->assertRequiredSelectAndOptions('edit-single-format-default-missing-format--2', $formats);
+    $this->assertRequiredSelectAndOptions('edit-single-format-default-missing-format', $formats);
     $this->assertEnabledTextarea('edit-single-format-default-disallowed-value');
-    $this->assertRequiredSelectAndOptions('edit-single-format-default-disallowed-format--2', $formats);
+    $this->assertRequiredSelectAndOptions('edit-single-format-default-disallowed-format', $formats);
   }
 
   /**
@@ -140,11 +140,11 @@ protected function doFilterFormTestAsNonAdmin() {
     $this->assertEnabledTextarea('edit-all-formats-no-default-value');
     // If no default is given, the format with the lowest weight becomes the
     // default. This happens to be 'filtered_html'.
-    $this->assertOptions('edit-all-formats-no-default-format--2', $formats, 'filtered_html');
+    $this->assertOptions('edit-all-formats-no-default-format', $formats, 'filtered_html');
     $this->assertEnabledTextarea('edit-all-formats-default-value');
     // \Drupal\filter_test\Form\FilterTestFormatForm::buildForm() uses
     // 'filter_test' as the default value in this case.
-    $this->assertOptions('edit-all-formats-default-format--2', $formats, 'filter_test');
+    $this->assertOptions('edit-all-formats-default-format', $formats, 'filter_test');
     // If a missing format is given as default, non-admin users are presented
     // with a disabled textarea.
     $this->assertDisabledTextarea('edit-all-formats-default-missing-value');
@@ -153,7 +153,7 @@ protected function doFilterFormTestAsNonAdmin() {
     $this->assertEnabledTextarea('edit-restricted-formats-no-default-value');
     // The user only has access to the 'filter_test' format, so when no default
     // is given that is preselected and the text format select is hidden.
-    $this->assertNoSelect('edit-restricted-formats-no-default-format--2');
+    $this->assertNoSelect('edit-restricted-formats-no-default-format');
     // When the format that the user does not have access to is preselected, the
     // textarea should be disabled.
     $this->assertDisabledTextarea('edit-restricted-formats-default-value');
@@ -163,9 +163,9 @@ protected function doFilterFormTestAsNonAdmin() {
     // Test a text format element with a fixed format.
     // When there is only a single option there is no point in choosing.
     $this->assertEnabledTextarea('edit-single-format-no-default-value');
-    $this->assertNoSelect('edit-single-format-no-default-format--2');
+    $this->assertNoSelect('edit-single-format-no-default-format');
     $this->assertEnabledTextarea('edit-single-format-default-value');
-    $this->assertNoSelect('edit-single-format-default-format--2');
+    $this->assertNoSelect('edit-single-format-default-format');
     // If the select has a missing or disallowed format make sure the textarea
     // is disabled.
     $this->assertDisabledTextarea('edit-single-format-default-missing-value');
@@ -191,8 +191,8 @@ protected function assertNoSelect($id) {
   /**
    * Asserts that a select element has the correct options.
    *
-   * @param string $id
-   *   The HTML ID of the select element.
+   * @param string $drupal_selector
+   *   The HTML name of the select element.
    * @param array $expected_options
    *   An array of option values.
    * @param string $selected
@@ -201,11 +201,11 @@ protected function assertNoSelect($id) {
    * @return bool
    *   TRUE if the assertion passed; FALSE otherwise.
    */
-  protected function assertOptions($id, array $expected_options, $selected) {
-    $select = $this->xpath('//select[@id=:id]', array(':id' => $id));
+  protected function assertOptions($drupal_selector, array $expected_options, $selected) {
+    $select = $this->xpath('//select[@data-drupal-selector=:data_drupal_selector]', [':data_drupal_selector' => $drupal_selector]);
     $select = reset($select);
-    $passed = $this->assertTrue($select instanceof \SimpleXMLElement, SafeMarkup::format('Field @id exists.', array(
-      '@id' => $id,
+    $passed = $this->assertTrue($select instanceof \SimpleXMLElement, SafeMarkup::format('Field @data-drupal-selector exists.', array(
+      '@data-drupal-selector' => $drupal_selector,
     )));
 
     $found_options = $this->getAllOptions($select);
@@ -214,7 +214,7 @@ protected function assertOptions($id, array $expected_options, $selected) {
       if ($expected_key !== FALSE) {
         $this->pass(SafeMarkup::format('Option @option for field @id exists.', array(
           '@option' => $expected_options[$expected_key],
-          '@id' => $id,
+          '@id' => $drupal_selector,
         )));
         unset($found_options[$found_key]);
         unset($expected_options[$expected_key]);
@@ -226,25 +226,25 @@ protected function assertOptions($id, array $expected_options, $selected) {
     foreach ($expected_options as $expected_option) {
       $this->fail(SafeMarkup::format('Option @option for field @id exists.', array(
         '@option' => $expected_option,
-        '@id' => $id,
+        '@id' => $drupal_selector,
       )));
       $passed = FALSE;
     }
     foreach ($found_options as $found_option) {
       $this->fail(SafeMarkup::format('Option @option for field @id does not exist.', array(
         '@option' => $found_option->attributes()->value,
-        '@id' => $id,
+        '@id' => $drupal_selector,
       )));
       $passed = FALSE;
     }
 
-    return $passed && $this->assertOptionSelected($id, $selected);
+    return $passed && $this->assertOptionSelected($drupal_selector, $selected);
   }
 
   /**
    * Asserts that there is a select element with the given ID that is required.
    *
-   * @param string $id
+   * @param string $drupal_selector
    *   The HTML ID of the select element.
    * @param array $options
    *   An array of option values that are contained in the select element
@@ -253,18 +253,16 @@ protected function assertOptions($id, array $expected_options, $selected) {
    * @return bool
    *   TRUE if the assertion passed; FALSE otherwise.
    */
-  protected function assertRequiredSelectAndOptions($id, array $options) {
-    $select = $this->xpath('//select[@id=:id and contains(@required, "required")]', array(
-      ':id' => $id,
-    ));
+  protected function assertRequiredSelectAndOptions($drupal_selector, array $options) {
+    $select = $this->xpath('//select[@data-drupal-selector=:data_drupal_selector and contains(@required, "required")]', [':data_drupal_selector' => $drupal_selector]);
     $select = reset($select);
-    $passed = $this->assertTrue($select instanceof \SimpleXMLElement, SafeMarkup::format('Required field @id exists.', array(
-      '@id' => $id,
+    $passed = $this->assertTrue($select instanceof \SimpleXMLElement, SafeMarkup::format('Required field @data-drupal-selector exists.', array(
+      '@data-drupal-selector' => $drupal_selector,
     )));
     // A required select element has a "- Select -" option whose key is an empty
     // string.
     $options[] = '';
-    return $passed && $this->assertOptions($id, $options, '');
+    return $passed && $this->assertOptions($drupal_selector, $options, '');
   }
 
   /**
diff --git a/core/modules/forum/src/Controller/ForumController.php b/core/modules/forum/src/Controller/ForumController.php
index 7f84a02..f0ea9b3 100644
--- a/core/modules/forum/src/Controller/ForumController.php
+++ b/core/modules/forum/src/Controller/ForumController.php
@@ -190,7 +190,6 @@ public function forumIndex() {
     else {
       // Set the page title to forum's vocabulary name.
       $build['#title'] = $vocabulary->label();
-      $this->renderer->addCacheableDependency($build, $vocabulary);
     }
     return $build;
   }
diff --git a/core/modules/forum/src/Tests/ForumTest.php b/core/modules/forum/src/Tests/ForumTest.php
index 3861f66..73089e3 100644
--- a/core/modules/forum/src/Tests/ForumTest.php
+++ b/core/modules/forum/src/Tests/ForumTest.php
@@ -235,7 +235,6 @@ function testForum() {
 
     // Test the root forum page title change.
     $this->drupalGet('forum');
-    $this->assertCacheTag('config:taxonomy.vocabulary.' . $this->forum['vid']);
     $this->assertTitle(t('Forums | Drupal'));
     $vocabulary = Vocabulary::load($this->forum['vid']);
     $vocabulary->set('name', 'Discussions');
diff --git a/core/modules/hal/src/Tests/EntityTest.php b/core/modules/hal/src/Tests/EntityTest.php
index 6301fb0..85d13f7 100644
--- a/core/modules/hal/src/Tests/EntityTest.php
+++ b/core/modules/hal/src/Tests/EntityTest.php
@@ -198,8 +198,7 @@ public function testComment() {
 
     $original_values = $comment->toArray();
     // cid will not exist and hostname will always be denied view access.
-    // No value will exist for name as this is only for anonymous users.
-    unset($original_values['cid'], $original_values['hostname'], $original_values['name']);
+    unset($original_values['cid'], $original_values['hostname']);
 
     $normalized = $this->serializer->normalize($comment, $this->format, ['account' => $account]);
 
diff --git a/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php b/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php
index f72cb29..615da6b 100644
--- a/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php
+++ b/core/modules/menu_link_content/src/Tests/MenuLinkContentTranslationUITest.php
@@ -20,7 +20,7 @@ class MenuLinkContentTranslationUITest extends ContentTranslationUITestBase {
   /**
    * {inheritdoc}
    */
-  protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'url.query_args:_wrapper_format', 'user.permissions', 'user.roles:authenticated'];
+  protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'user.permissions', 'user.roles:authenticated'];
 
   /**
    * Modules to enable.
diff --git a/core/modules/menu_link_content/src/Tests/Migrate/d6/MigrateMenuLinkTest.php b/core/modules/menu_link_content/src/Tests/Migrate/d6/MigrateMenuLinkTest.php
index 94971ca..5fd0cbf 100644
--- a/core/modules/menu_link_content/src/Tests/Migrate/d6/MigrateMenuLinkTest.php
+++ b/core/modules/menu_link_content/src/Tests/Migrate/d6/MigrateMenuLinkTest.php
@@ -69,7 +69,7 @@ public function testMenuLinks() {
     $menu_link = entity_load('menu_link_content', 140);
     $this->assertIdentical('Drupal.org', $menu_link->getTitle());
     $this->assertIdentical('secondary-links', $menu_link->getMenuName());
-    $this->assertIdentical(NULL, $menu_link->getDescription());
+    $this->assertIdentical('', $menu_link->getDescription());
     $this->assertIdentical(TRUE, $menu_link->isEnabled());
     $this->assertIdentical(FALSE, $menu_link->isExpanded());
     $this->assertIdentical(['attributes' => ['title' => '']], $menu_link->link->options);
@@ -80,7 +80,7 @@ public function testMenuLinks() {
     $menu_link = entity_load('menu_link_content', 393);
     $this->assertIdentical('Test 3', $menu_link->getTitle());
     $this->assertIdentical('secondary-links', $menu_link->getMenuName());
-    $this->assertIdentical(NULL, $menu_link->getDescription());
+    $this->assertIdentical('', $menu_link->getDescription());
     $this->assertIdentical(TRUE, $menu_link->isEnabled());
     $this->assertIdentical(FALSE, $menu_link->isExpanded());
     $this->assertIdentical([], $menu_link->link->options);
diff --git a/core/modules/migrate_drupal/src/Tests/d6/MigrateCckFieldValuesTest.php b/core/modules/migrate_drupal/src/Tests/d6/MigrateCckFieldValuesTest.php
index d16b1d3..02e5460 100644
--- a/core/modules/migrate_drupal/src/Tests/d6/MigrateCckFieldValuesTest.php
+++ b/core/modules/migrate_drupal/src/Tests/d6/MigrateCckFieldValuesTest.php
@@ -33,35 +33,6 @@ protected function setUp() {
 
     $this->installEntitySchema('file');
 
-    $node = entity_create('node', array(
-      'type' => 'story',
-      'nid' => 2,
-      'vid' => 12,
-      'revision_log' => '',
-      'title' => $this->randomString(),
-    ));
-    $node->enforceIsNew();
-    $node->save();
-
-    $planet_nodes = [
-      4 => 6,
-      5 => 8,
-      6 => 9,
-      7 => 10,
-      8 => 11,
-    ];
-    foreach ($planet_nodes as $nid => $vid) {
-      $node = entity_create('node', array(
-        'type' => 'test_planet',
-        'nid' => $nid,
-        'vid' => $vid,
-        'revision_log' => '',
-        'title' => $this->randomString(),
-      ));
-      $node->enforceIsNew();
-      $node->save();
-    }
-
     entity_create('field_storage_config', array(
       'entity_type' => 'node',
       'field_name' => 'field_test',
diff --git a/core/modules/node/src/Entity/Node.php b/core/modules/node/src/Entity/Node.php
index 84a657b..0588ab0 100644
--- a/core/modules/node/src/Entity/Node.php
+++ b/core/modules/node/src/Entity/Node.php
@@ -387,6 +387,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setRequired(TRUE)
       ->setTranslatable(TRUE)
       ->setRevisionable(TRUE)
+      ->setDefaultValue('')
       ->setSetting('max_length', 255)
       ->setDisplayOptions('view', array(
         'label' => 'hidden',
diff --git a/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTest.php b/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTest.php
index ab27ac8..2b07bfb 100644
--- a/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTest.php
+++ b/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTest.php
@@ -55,7 +55,7 @@ public function testNode() {
     $this->assertIdentical('Test title', $node_revision->getTitle());
     $this->assertIdentical('1', $node_revision->getRevisionAuthor()->id(), 'Node revision has the correct user');
     // This is empty on the first revision.
-    $this->assertIdentical(NULL, $node_revision->revision_log->value);
+    $this->assertIdentical('', $node_revision->revision_log->value);
 
     // It is pointless to run the second half from MigrateDrupal6Test.
     if (empty($this->standalone)) {
diff --git a/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php b/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php
index 6bae283..a47df1f 100644
--- a/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php
+++ b/core/modules/node/src/Tests/Migrate/d6/MigrateNodeTestBase.php
@@ -82,7 +82,6 @@ protected function setUp() {
       'nid' => 1,
       'vid' => 1,
       'revision_log' => '',
-      'title' => $this->randomString(),
     ));
     $node->enforceIsNew();
     $node->save();
@@ -92,7 +91,6 @@ protected function setUp() {
       'nid' => 3,
       'vid' => 4,
       'revision_log' => '',
-      'title' => $this->randomString(),
     ));
     $node->enforceIsNew();
     $node->save();
diff --git a/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php b/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
index d60cf6f..62a7b0c 100644
--- a/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
+++ b/core/modules/node/src/Tests/NodeAccessLanguageAwareCombinationTest.php
@@ -111,7 +111,6 @@ protected function setUp() {
       'private' => FALSE,
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
 
@@ -122,7 +121,6 @@ protected function setUp() {
       'private' => TRUE,
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
 
@@ -133,7 +131,6 @@ protected function setUp() {
       'private' => FALSE,
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
 
@@ -144,7 +141,6 @@ protected function setUp() {
       'private' => FALSE,
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
 
@@ -155,7 +151,6 @@ protected function setUp() {
       'private' => FALSE,
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
 
@@ -166,7 +161,6 @@ protected function setUp() {
       'private' => TRUE,
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
 
diff --git a/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php b/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
index 81ecbd1..1351617 100644
--- a/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
+++ b/core/modules/node/src/Tests/NodeAccessLanguageAwareTest.php
@@ -104,7 +104,6 @@ protected function setUp() {
       'field_private' => array(array('value' => 0)),
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
 
@@ -114,7 +113,6 @@ protected function setUp() {
       'field_private' => array(array('value' => 0)),
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
 
@@ -124,7 +122,6 @@ protected function setUp() {
       'field_private' => array(array('value' => 1)),
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 0;
     $node->save();
 
@@ -134,7 +131,6 @@ protected function setUp() {
       'field_private' => array(array('value' => 1)),
     ));
     $translation = $node->getTranslation('ca');
-    $translation->title->value = $this->randomString();
     $translation->field_private->value = 1;
     $node->save();
 
diff --git a/core/modules/node/src/Tests/NodeBlockFunctionalTest.php b/core/modules/node/src/Tests/NodeBlockFunctionalTest.php
index 6f319f5..06b83cd 100644
--- a/core/modules/node/src/Tests/NodeBlockFunctionalTest.php
+++ b/core/modules/node/src/Tests/NodeBlockFunctionalTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\node\Tests;
 
 use Drupal\block\Entity\Block;
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
 use Drupal\user\RoleInterface;
 
@@ -120,7 +119,7 @@ public function testRecentNodeBlock() {
     $this->assertText($node3->label(), 'Node found in block.');
     $this->assertText($node4->label(), 'Node found in block.');
 
-    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user']);
+    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user']);
 
     // Enable the "Powered by Drupal" block only on article nodes.
     $edit = [
@@ -145,16 +144,16 @@ public function testRecentNodeBlock() {
     $this->drupalGet('');
     $label = $block->label();
     $this->assertNoText($label, 'Block was not displayed on the front page.');
-    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route']);
+    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route']);
     $this->drupalGet('node/add/article');
     $this->assertText($label, 'Block was displayed on the node/add/article page.');
-    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route']);
+    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route']);
     $this->drupalGet('node/' . $node1->id());
     $this->assertText($label, 'Block was displayed on the node/N when node is of type article.');
-    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route', 'timezone']);
+    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route', 'timezone']);
     $this->drupalGet('node/' . $node5->id());
     $this->assertNoText($label, 'Block was not displayed on nodes of type page.');
-    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user', 'route', 'timezone']);
+    $this->assertCacheContexts(['languages:language_content', 'languages:language_interface', 'theme', 'user', 'route', 'timezone']);
 
     $this->drupalLogin($this->adminUser);
     $this->drupalGet('admin/structure/block');
diff --git a/core/modules/node/src/Tests/NodeValidationTest.php b/core/modules/node/src/Tests/NodeValidationTest.php
index 9f6bccc..b38af1c 100644
--- a/core/modules/node/src/Tests/NodeValidationTest.php
+++ b/core/modules/node/src/Tests/NodeValidationTest.php
@@ -55,11 +55,6 @@ public function testValidation() {
     $this->assertEqual($violations[0]->getPropertyPath(), 'title');
     $this->assertEqual($violations[0]->getMessage(), 'This value should not be null.');
 
-    $node->set('title', '');
-    $violations = $node->validate();
-    $this->assertEqual(count($violations), 1, 'Violation found when title is set to an empty string.');
-    $this->assertEqual($violations[0]->getPropertyPath(), 'title');
-
     // Make the title valid again.
     $node->set('title', $this->randomString());
     // Save the node so that it gets an ID and a changed date.
diff --git a/core/modules/node/src/Tests/Views/NodeRevisionWizardTest.php b/core/modules/node/src/Tests/Views/NodeRevisionWizardTest.php
index 7f7ecdd..7e1209b 100644
--- a/core/modules/node/src/Tests/Views/NodeRevisionWizardTest.php
+++ b/core/modules/node/src/Tests/Views/NodeRevisionWizardTest.php
@@ -26,7 +26,7 @@ public function testViewAdd() {
     // Create two nodes with two revision.
     $node_storage = \Drupal::entityManager()->getStorage('node');
     /** @var \Drupal\node\NodeInterface $node */
-    $node = $node_storage->create(array('title' => $this->randomString(), 'type' => 'article', 'created' => REQUEST_TIME + 40));
+    $node = $node_storage->create(array('type' => 'article', 'created' => REQUEST_TIME + 40));
     $node->save();
 
     $node = $node->createDuplicate();
@@ -34,7 +34,7 @@ public function testViewAdd() {
     $node->created->value = REQUEST_TIME + 20;
     $node->save();
 
-    $node = $node_storage->create(array('title' => $this->randomString(), 'type' => 'article', 'created' => REQUEST_TIME + 30));
+    $node = $node_storage->create(array('type' => 'article', 'created' => REQUEST_TIME + 30));
     $node->save();
 
     $node = $node->createDuplicate();
diff --git a/core/modules/options/src/Tests/Views/OptionsTestBase.php b/core/modules/options/src/Tests/Views/OptionsTestBase.php
index b204d1b..6712160 100644
--- a/core/modules/options/src/Tests/Views/OptionsTestBase.php
+++ b/core/modules/options/src/Tests/Views/OptionsTestBase.php
@@ -56,7 +56,6 @@ protected function setUp() {
 
     $settings = [];
     $settings['type'] = 'article';
-    $settings['title'] = $this->randomString();
     $settings['field_test_list_string'][]['value'] = $this->fieldValues[0];
     $settings['field_test_list_integer'][]['value'] = 0;
 
diff --git a/core/modules/rest/src/Plugin/views/display/RestExport.php b/core/modules/rest/src/Plugin/views/display/RestExport.php
index e3a587c..ae5ac7e 100644
--- a/core/modules/rest/src/Plugin/views/display/RestExport.php
+++ b/core/modules/rest/src/Plugin/views/display/RestExport.php
@@ -15,7 +15,6 @@
 use Drupal\Core\Routing\RouteProviderInterface;
 use Drupal\Core\State\StateInterface;
 use Drupal\views\Plugin\views\display\ResponseDisplayPluginInterface;
-use Drupal\views\Render\ViewsRenderPipelineSafeString;
 use Drupal\views\ViewExecutable;
 use Drupal\views\Plugin\views\display\PathPluginBase;
 use Symfony\Component\DependencyInjection\ContainerInterface;
@@ -335,7 +334,7 @@ public function render() {
       // executed by an HTML agent.
       // @todo Decide how to support non-HTML in the render API in
       //   https://www.drupal.org/node/2501313.
-      $build['#markup'] = ViewsRenderPipelineSafeString::create($build['#markup']);
+      $build['#markup'] = SafeMarkup::set($build['#markup']);
     }
 
     parent::applyDisplayCachablityMetadata($build);
diff --git a/core/modules/shortcut/src/Entity/Shortcut.php b/core/modules/shortcut/src/Entity/Shortcut.php
index ba6af78..108bbc9 100644
--- a/core/modules/shortcut/src/Entity/Shortcut.php
+++ b/core/modules/shortcut/src/Entity/Shortcut.php
@@ -132,6 +132,7 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
       ->setDescription(t('The name of the shortcut.'))
       ->setRequired(TRUE)
       ->setTranslatable(TRUE)
+      ->setDefaultValue('')
       ->setSetting('max_length', 255)
       ->setDisplayOptions('form', array(
         'type' => 'string_textfield',
diff --git a/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php b/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php
index 5fa63d8..9a9113b 100644
--- a/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php
+++ b/core/modules/shortcut/src/Tests/ShortcutTranslationUITest.php
@@ -21,7 +21,7 @@ class ShortcutTranslationUITest extends ContentTranslationUITestBase {
   /**
    * {inheritdoc}
    */
-  protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'user', 'url.query_args:_wrapper_format', 'url.site'];
+  protected $defaultCacheContexts = ['languages:language_interface', 'theme', 'user', 'url.site'];
 
   /**
    * Modules to enable.
diff --git a/core/modules/simpletest/src/AssertContentTrait.php b/core/modules/simpletest/src/AssertContentTrait.php
index 9eda1c5..f18ff86 100644
--- a/core/modules/simpletest/src/AssertContentTrait.php
+++ b/core/modules/simpletest/src/AssertContentTrait.php
@@ -1173,8 +1173,8 @@ protected function assertNoFieldChecked($id, $message = '', $group = 'Browser')
   /**
    * Asserts that a select option in the current page exists.
    *
-   * @param string $id
-   *   ID of select field to assert.
+   * @param string $drupal_selector
+   *   The data-drupal-selector of the field to assert.
    * @param string $option
    *   Option to assert.
    * @param string $message
@@ -1190,16 +1190,15 @@ protected function assertNoFieldChecked($id, $message = '', $group = 'Browser')
    * @return bool
    *   TRUE on pass, FALSE on fail.
    */
-  protected function assertOption($id, $option, $message = '', $group = 'Browser') {
-    $options = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option));
-    return $this->assertTrue(isset($options[0]), $message ? $message : SafeMarkup::format('Option @option for field @id exists.', array('@option' => $option, '@id' => $id)), $group);
+  protected function assertOption($drupal_selector, $option, $message = '', $group = 'Browser') {
+    return $this->assertOptionWithDrupalSelector($drupal_selector, $option, $message, $group);
   }
 
   /**
    * Asserts that a select option in the current page exists.
    *
    * @param string $drupal_selector
-   *   The data drupal selector of select field to assert.
+   *   The data-drupal-selector of the field to assert.
    * @param string $option
    *   Option to assert.
    * @param string $message
@@ -1216,15 +1215,15 @@ protected function assertOption($id, $option, $message = '', $group = 'Browser')
    *   TRUE on pass, FALSE on fail.
    */
   protected function assertOptionWithDrupalSelector($drupal_selector, $option, $message = '', $group = 'Browser') {
-    $options = $this->xpath('//select[@data-drupal-selector=:data_drupal_selector]//option[@value=:option]', array(':data_drupal_selector' => $drupal_selector, ':option' => $option));
-    return $this->assertTrue(isset($options[0]), $message ? $message : SafeMarkup::format('Option @option for field @data_drupal_selector exists.', array('@option' => $option, '@data_drupal_selector' => $drupal_selector)), $group);
+    $options = $this->xpath('//select[@data-drupal-selector=:data_drupal_selector]//option[@value=:option]', [':data_drupal_selector' => $drupal_selector, ':option' => $option]);
+    return $this->assertTrue(!empty((string) $options[0]), $message ? $message : SafeMarkup::format('Option @option for field @data_drupal_selector exists.', array('@option' => $option, '@data_drupal_selector' => $drupal_selector)), $group);
   }
 
   /**
    * Asserts that a select option in the current page does not exist.
    *
-   * @param string $id
-   *   ID of select field to assert.
+   * @param string $drupal_selector
+   *   The data-drupal-selector of the field to assert.
    * @param string $option
    *   Option to assert.
    * @param string $message
@@ -1240,17 +1239,17 @@ protected function assertOptionWithDrupalSelector($drupal_selector, $option, $me
    * @return bool
    *   TRUE on pass, FALSE on fail.
    */
-  protected function assertNoOption($id, $option, $message = '', $group = 'Browser') {
-    $selects = $this->xpath('//select[@id=:id]', array(':id' => $id));
-    $options = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option));
-    return $this->assertTrue(isset($selects[0]) && !isset($options[0]), $message ? $message : SafeMarkup::format('Option @option for field @id does not exist.', array('@option' => $option, '@id' => $id)), $group);
+  protected function assertNoOption($drupal_selector, $option, $message = '', $group = 'Browser') {
+    $selects = $this->xpath('//select[@data-drupal-selector=:data_drupal_selector]', [':data_drupal_selector' => $drupal_selector]);
+    $options = $this->xpath('//select[@data-drupal-selector=:data_drupal_selector]//option[@value=:option]', [':data_drupal_selector' => $drupal_selector, ':option' => $option]);
+    return $this->assertTrue(isset($selects[0]->option) && empty($options[0]), $message ? $message : SafeMarkup::format('Option @option for field @data_drupal_selector exists.', array('@option' => $option, '@data_drupal_selector' => $drupal_selector)), $group);
   }
 
   /**
    * Asserts that a select option in the current page is checked.
    *
-   * @param string $id
-   *   ID of select field to assert.
+   * @param string $drupal_selector
+   *   The data-drupal-selector of the field to assert.
    * @param string $option
    *   Option to assert.
    * @param string $message
@@ -1268,9 +1267,8 @@ protected function assertNoOption($id, $option, $message = '', $group = 'Browser
    *
    * @todo $id is unusable. Replace with $name.
    */
-  protected function assertOptionSelected($id, $option, $message = '', $group = 'Browser') {
-    $elements = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option));
-    return $this->assertTrue(isset($elements[0]) && !empty($elements[0]['selected']), $message ? $message : SafeMarkup::format('Option @option for field @id is selected.', array('@option' => $option, '@id' => $id)), $group);
+  protected function assertOptionSelected($drupal_selector, $option, $message = '', $group = 'Browser') {
+    return $this->assertOptionSelectedWithDrupalSelector($drupal_selector, $option, $message, $group);
   }
 
   /**
@@ -1303,8 +1301,8 @@ protected function assertOptionSelectedWithDrupalSelector($drupal_selector, $opt
   /**
    * Asserts that a select option in the current page is not checked.
    *
-   * @param string $id
-   *   ID of select field to assert.
+   * @param string $drupal_selector
+   *   The data-drupal-selector of the field to assert.
    * @param string $option
    *   Option to assert.
    * @param string $message
@@ -1320,9 +1318,9 @@ protected function assertOptionSelectedWithDrupalSelector($drupal_selector, $opt
    * @return bool
    *   TRUE on pass, FALSE on fail.
    */
-  protected function assertNoOptionSelected($id, $option, $message = '', $group = 'Browser') {
-    $elements = $this->xpath('//select[@id=:id]//option[@value=:option]', array(':id' => $id, ':option' => $option));
-    return $this->assertTrue(isset($elements[0]) && empty($elements[0]['selected']), $message ? $message : SafeMarkup::format('Option @option for field @id is not selected.', array('@option' => $option, '@id' => $id)), $group);
+  protected function assertNoOptionSelected($drupal_selector, $option, $message = '', $group = 'Browser') {
+    $elements = $this->xpath('//select[@data-drupal-selector=:data_drupal_selector]//option[@value=:option]', array(':data_drupal_selector' => $drupal_selector, ':option' => $option));
+    return $this->assertFalse(isset($elements[0]) && !empty($elements[0]['selected']), $message ? $message : SafeMarkup::format('Option @option for field @data_drupal_selector is selected.', array('@option' => $option, '@data_drupal_selector' => $drupal_selector)), $group);
   }
 
   /**
diff --git a/core/modules/simpletest/src/BrowserTestBase.php b/core/modules/simpletest/src/BrowserTestBase.php
index 4224421..e5967b8 100644
--- a/core/modules/simpletest/src/BrowserTestBase.php
+++ b/core/modules/simpletest/src/BrowserTestBase.php
@@ -842,6 +842,7 @@ public function installDrupal() {
     // Not using File API; a potential error must trigger a PHP warning.
     $directory = DRUPAL_ROOT . '/' . $this->siteDirectory;
     copy(DRUPAL_ROOT . '/sites/default/default.settings.php', $directory . '/settings.php');
+    copy(DRUPAL_ROOT . '/sites/default/default.services.yml', $directory . '/services.yml');
 
     // All file system paths are created by System module during installation.
     // @see system_requirements()
diff --git a/core/modules/simpletest/src/WebTestBase.php b/core/modules/simpletest/src/WebTestBase.php
index 7d2a7ae..cfccbcf 100644
--- a/core/modules/simpletest/src/WebTestBase.php
+++ b/core/modules/simpletest/src/WebTestBase.php
@@ -711,6 +711,7 @@ protected function prepareSettings() {
     // Not using File API; a potential error must trigger a PHP warning.
     $directory = DRUPAL_ROOT . '/' . $this->siteDirectory;
     copy(DRUPAL_ROOT . '/sites/default/default.settings.php', $directory . '/settings.php');
+    copy(DRUPAL_ROOT . '/sites/default/default.services.yml', $directory . '/services.yml');
 
     // All file system paths are created by System module during installation.
     // @see system_requirements()
@@ -752,12 +753,10 @@ protected function prepareSettings() {
       file_put_contents($directory . '/settings.php', "\n\$test_class = '" . get_class($this) ."';\n" . 'include DRUPAL_ROOT . \'/\' . $site_path . \'/settings.testing.php\';' ."\n", FILE_APPEND);
     }
     $settings_services_file = DRUPAL_ROOT . '/' . $this->originalSite . '/testing.services.yml';
-    if (!file_exists($settings_services_file)) {
-      // Otherwise, use the default services as a starting point for overrides.
-      $settings_services_file = DRUPAL_ROOT . '/sites/default/default.services.yml';
+    if (file_exists($settings_services_file)) {
+      // Copy the testing-specific service overrides in place.
+      copy($settings_services_file, $directory . '/services.yml');
     }
-    // Copy the testing-specific service overrides in place.
-    copy($settings_services_file, $directory . '/services.yml');
     if ($this->strictConfigSchema) {
       // Add a listener to validate configuration schema on save.
       $yaml = new \Symfony\Component\Yaml\Yaml();
diff --git a/core/modules/system/css/components/item-list.theme.css b/core/modules/system/css/components/item-list.theme.css
index 9a1088e..49f8172 100644
--- a/core/modules/system/css/components/item-list.theme.css
+++ b/core/modules/system/css/components/item-list.theme.css
@@ -17,23 +17,3 @@
 [dir="rtl"] .item-list ul li {
   margin: 0 1.5em 0.25em 0;
 }
-ul.item-list__comma-list {
-  display: inline;
-}
-ul.item-list__comma-list li {
-  display: inline;
-  list-style-type: none;
-}
-ul.item-list__comma-list,
-ul.item-list__comma-list li,
-[dir="rtl"] ul.item-list__comma-list,
-[dir="rtl"] ul.item-list__comma-list li {
-  margin: 0;
-  padding: 0;
-}
-ul.item-list__comma-list li:after {
-  content: ", ";
-}
-ul.item-list__comma-list li:last-child:after {
-  content: "";
-}
diff --git a/core/modules/system/src/Tests/Common/RenderWebTest.php b/core/modules/system/src/Tests/Common/RenderWebTest.php
index 5cfe3ab..e939769 100644
--- a/core/modules/system/src/Tests/Common/RenderWebTest.php
+++ b/core/modules/system/src/Tests/Common/RenderWebTest.php
@@ -7,8 +7,6 @@
 
 namespace Drupal\system\Tests\Common;
 
-use Drupal\Component\Serialization\Json;
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Url;
 use Drupal\simpletest\WebTestBase;
 
@@ -27,24 +25,6 @@ class RenderWebTest extends WebTestBase {
   public static $modules = array('common_test');
 
   /**
-   * Asserts the cache context for the wrapper format is always present.
-   */
-  function testWrapperFormatCacheContext() {
-    $this->drupalGet('');
-    $this->assertIdentical(0, strpos($this->getRawContent(), "<!DOCTYPE html>\n<html"));
-    $this->assertIdentical('text/html; charset=UTF-8', $this->drupalGetHeader('Content-Type'));
-    $this->assertTitle('Log in | Drupal');
-    $this->assertCacheContext('url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT);
-
-    $this->drupalGet('', ['query' => [MainContentViewSubscriber::WRAPPER_FORMAT =>  'json']]);
-    $this->assertIdentical('application/json', $this->drupalGetHeader('Content-Type'));
-    $json = Json::decode($this->getRawContent());
-    $this->assertEqual(['content', 'title'], array_keys($json));
-    $this->assertIdentical('Log in', $json['title']);
-    $this->assertCacheContext('url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT);
-  }
-
-  /**
    * Tests rendering form elements without passing through
    * \Drupal::formBuilder()->doBuildForm().
    */
diff --git a/core/modules/system/src/Tests/Database/SelectTest.php b/core/modules/system/src/Tests/Database/SelectTest.php
index 6b45e84..641cdc2 100644
--- a/core/modules/system/src/Tests/Database/SelectTest.php
+++ b/core/modules/system/src/Tests/Database/SelectTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\system\Tests\Database;
 use Drupal\Core\Database\InvalidQueryException;
-use Drupal\Core\Database\Database;
 
 /**
  * Tests the Select query builder.
@@ -58,47 +57,10 @@ function testVulnerableComment() {
     $records = $result->fetchAll();
 
     $query = (string) $query;
-    $expected = "/* Testing query comments  * / SELECT nid FROM {node}; -- */ SELECT test.name AS name, test.age AS age\nFROM \n{test} test";
+    $expected = "/* Testing query comments SELECT nid FROM {node}; -- */";
 
     $this->assertEqual(count($records), 4, 'Returned the correct number of rows.');
     $this->assertNotIdentical(FALSE, strpos($query, $expected), 'The flattened query contains the sanitised comment string.');
-
-    $connection = Database::getConnection();
-    foreach ($this->makeCommentsProvider() as $test_set) {
-      list($expected, $comments) = $test_set;
-      $this->assertEqual($expected, $connection->makeComment($comments));
-    }
-  }
-
-  /**
-   * Provides expected and input values for testVulnerableComment().
-   */
-  function makeCommentsProvider() {
-    return [
-      [
-        '/*  */ ',
-        [''],
-      ],
-      // Try and close the comment early.
-      [
-        '/* Exploit  * / DROP TABLE node; -- */ ',
-        ['Exploit */ DROP TABLE node; --'],
-      ],
-      // Variations on comment closing.
-      [
-        '/* Exploit  * / * / DROP TABLE node; -- */ ',
-        ['Exploit */*/ DROP TABLE node; --'],
-      ],
-      [
-        '/* Exploit  *  * // DROP TABLE node; -- */ ',
-        ['Exploit **// DROP TABLE node; --'],
-      ],
-      // Try closing the comment in the second string which is appended.
-      [
-        '/* Exploit  * / DROP TABLE node; --; Another try  * / DROP TABLE node; -- */ ',
-        ['Exploit */ DROP TABLE node; --', 'Another try */ DROP TABLE node; --'],
-      ],
-    ];
   }
 
   /**
diff --git a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
index ee4fcd8..8f10556 100644
--- a/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
+++ b/core/modules/system/src/Tests/Entity/EntityCacheTagsTestBase.php
@@ -9,7 +9,6 @@
 
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Entity\EntityInterface;
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Field\FieldStorageDefinitionInterface;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\Core\Url;
@@ -338,7 +337,6 @@ public function testReferencedEntity() {
     // The default cache contexts for rendered entities.
     $default_cache_contexts = ['languages:' . LanguageInterface::TYPE_INTERFACE, 'theme', 'user.permissions'];
     $entity_cache_contexts = $default_cache_contexts;
-    $page_cache_contexts = Cache::mergeContexts($default_cache_contexts, ['url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT]);
 
     // Cache tags present on every rendered page.
     // 'user.permissions' is a required cache context, and responses that vary
@@ -430,7 +428,7 @@ public function testReferencedEntity() {
     $this->verifyPageCache($empty_entity_listing_url, 'HIT', $empty_entity_listing_cache_tags);
     // Verify the entity type's list cache contexts are present.
     $contexts_in_header = $this->drupalGetHeader('X-Drupal-Cache-Contexts');
-    $this->assertEqual(Cache::mergeContexts($page_cache_contexts, $this->getAdditionalCacheContextsForEntityListing()), empty($contexts_in_header) ? [] : explode(' ', $contexts_in_header));
+    $this->assertEqual(Cache::mergeContexts($default_cache_contexts, $this->getAdditionalCacheContextsForEntityListing()), empty($contexts_in_header) ? [] : explode(' ', $contexts_in_header));
 
 
     $this->pass("Test listing containing referenced entity.", 'Debug');
@@ -440,7 +438,7 @@ public function testReferencedEntity() {
     $this->verifyPageCache($nonempty_entity_listing_url, 'HIT', $nonempty_entity_listing_cache_tags);
     // Verify the entity type's list cache contexts are present.
     $contexts_in_header = $this->drupalGetHeader('X-Drupal-Cache-Contexts');
-    $this->assertEqual(Cache::mergeContexts($page_cache_contexts, $this->getAdditionalCacheContextsForEntityListing()), empty($contexts_in_header) ? [] : explode(' ', $contexts_in_header));
+    $this->assertEqual(Cache::mergeContexts($default_cache_contexts, $this->getAdditionalCacheContextsForEntityListing()), empty($contexts_in_header) ? [] : explode(' ', $contexts_in_header));
 
 
     // Verify that after modifying the referenced entity, there is a cache miss
diff --git a/core/modules/system/src/Tests/Entity/EntityFieldTest.php b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
index 5414730..308132d 100644
--- a/core/modules/system/src/Tests/Entity/EntityFieldTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityFieldTest.php
@@ -677,7 +677,6 @@ public function testEntityConstraintValidation() {
     $node = entity_create('node', array(
       'type' => 'page',
       'uid' => $user->id(),
-      'title' => $this->randomString(),
     ));
     $reference->setValue($node);
     $violations = $reference->validate();
@@ -700,7 +699,6 @@ public function testEntityConstraintValidation() {
     $node = entity_create('node', array(
       'type' => 'article',
       'uid' => $user->id(),
-      'title' => $this->randomString(),
     ));
     $node->save();
     $reference->setValue($node);
diff --git a/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php b/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
index 4ff9f22..fc5c892 100644
--- a/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
+++ b/core/modules/system/src/Tests/Entity/EntityTranslationFormTest.php
@@ -106,7 +106,6 @@ function testEntityFormLanguage() {
 
     // Create a body translation and check the form language.
     $langcode2 = $this->langcodes[1];
-    $node->getTranslation($langcode2)->title->value = $this->randomString();
     $node->getTranslation($langcode2)->body->value = $this->randomMachineName(16);
     $node->getTranslation($langcode2)->setOwnerId($web_user->id());
     $node->save();
diff --git a/core/modules/system/src/Tests/Module/UninstallTest.php b/core/modules/system/src/Tests/Module/UninstallTest.php
index 4b8df60..4f5e193 100644
--- a/core/modules/system/src/Tests/Module/UninstallTest.php
+++ b/core/modules/system/src/Tests/Module/UninstallTest.php
@@ -51,7 +51,7 @@ function testUninstallPage() {
     $node_type->setThirdPartySetting('module_test', 'key', 'value');
     $node_type->save();
     // Add a node to prevent node from being uninstalled.
-    $node = entity_create('node', array('type' => 'uninstall_blocker', 'title' => $this->randomString()));
+    $node = entity_create('node', array('type' => 'uninstall_blocker'));
     $node->save();
 
     $this->drupalGet('admin/modules/uninstall');
diff --git a/core/modules/system/src/Tests/Routing/RouterTest.php b/core/modules/system/src/Tests/Routing/RouterTest.php
index 4d532d1..9f6e8c8 100644
--- a/core/modules/system/src/Tests/Routing/RouterTest.php
+++ b/core/modules/system/src/Tests/Routing/RouterTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\system\Tests\Routing;
 
 use Drupal\Core\Cache\Cache;
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Language\LanguageInterface;
 use Drupal\simpletest\WebTestBase;
 use Symfony\Component\HttpFoundation\Request;
@@ -33,7 +32,6 @@ class RouterTest extends WebTestBase {
    */
   public function testFinishResponseSubscriber() {
     $renderer_required_cache_contexts = ['languages:' . LanguageInterface::TYPE_INTERFACE, 'theme', 'user.permissions'];
-    $expected_cache_contexts = Cache::mergeContexts($renderer_required_cache_contexts, ['url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT]);
 
     // Confirm that the router can get to a controller.
     $this->drupalGet('router_test/test1');
@@ -49,7 +47,7 @@ public function testFinishResponseSubscriber() {
     $this->assertRaw('test2', 'The correct string was returned because the route was successful.');
     // Check expected headers from FinishResponseSubscriber.
     $headers = $this->drupalGetHeaders();
-    $this->assertEqual($headers['x-drupal-cache-contexts'], implode(' ', $expected_cache_contexts));
+    $this->assertEqual($headers['x-drupal-cache-contexts'], implode(' ', $renderer_required_cache_contexts));
     $this->assertEqual($headers['x-drupal-cache-tags'], 'config:user.role.anonymous rendered');
     // Confirm that the page wrapping is being added, so we're not getting a
     // raw body returned.
diff --git a/core/modules/system/src/Tests/System/TokenReplaceWebTest.php b/core/modules/system/src/Tests/System/TokenReplaceWebTest.php
index ba94e51..7e9d60f 100644
--- a/core/modules/system/src/Tests/System/TokenReplaceWebTest.php
+++ b/core/modules/system/src/Tests/System/TokenReplaceWebTest.php
@@ -7,7 +7,6 @@
 
 namespace Drupal\system\Tests\System;
 
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\simpletest\WebTestBase;
 use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
 
@@ -36,12 +35,12 @@ public function testTokens() {
     $this->drupalGet('token-test/' . $node->id());
     $this->assertText("Tokens: {$node->id()} {$account->id()}");
     $this->assertCacheTags(['node:1', 'rendered', 'user:2']);
-    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'user']);
 
     $this->drupalGet('token-test-without-bubleable-metadata/' . $node->id());
     $this->assertText("Tokens: {$node->id()} {$account->id()}");
     $this->assertCacheTags(['node:1', 'rendered', 'user:2']);
-    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'user']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'user']);
   }
 
 }
diff --git a/core/modules/system/templates/item-list.html.twig b/core/modules/system/templates/item-list.html.twig
index 172799d..2cef1d0 100644
--- a/core/modules/system/templates/item-list.html.twig
+++ b/core/modules/system/templates/item-list.html.twig
@@ -12,17 +12,12 @@
  * - attributes: HTML attributes to be applied to the list.
  * - empty: A message to display when there are no items. Allowed value is a
  *   string or render array.
- * - context: A list of contextual data associated with the list. May contain:
- *   - list_style: The custom list style.
  *
  * @see template_preprocess_item_list()
  *
  * @ingroup themeable
  */
 #}
-{% if context.list_style %}
-  {% set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
-{% endif %}
 {%- if items or empty -%}
   {%- if title is not empty -%}
     <h3>{{ title }}</h3>
diff --git a/core/modules/system/tests/modules/common_test/common_test.services.yml b/core/modules/system/tests/modules/common_test/common_test.services.yml
deleted file mode 100644
index 563632f..0000000
--- a/core/modules/system/tests/modules/common_test/common_test.services.yml
+++ /dev/null
@@ -1,6 +0,0 @@
-services:
-  main_content_renderer.json:
-    class: Drupal\common_test\Render\MainContent\JsonRenderer
-    arguments: ['@title_resolver', '@renderer']
-    tags:
-      - { name: render.main_content_renderer, format: json }
diff --git a/core/modules/system/tests/modules/common_test/src/Render/MainContent/JsonRenderer.php b/core/modules/system/tests/modules/common_test/src/Render/MainContent/JsonRenderer.php
deleted file mode 100644
index 7ebbfd1..0000000
--- a/core/modules/system/tests/modules/common_test/src/Render/MainContent/JsonRenderer.php
+++ /dev/null
@@ -1,69 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\common_test\Render\MainContent\JsonRenderer.
- */
-
-namespace Drupal\common_test\Render\MainContent;
-
-use Drupal\Core\Cache\CacheableJsonResponse;
-use Drupal\Core\Cache\CacheableMetadata;
-use Drupal\Core\Controller\TitleResolverInterface;
-use Drupal\Core\Render\MainContent\MainContentRendererInterface;
-use Drupal\Core\Render\RendererInterface;
-use Drupal\Core\Routing\RouteMatchInterface;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Default main content renderer for JSON requests.
- */
-class JsonRenderer implements MainContentRendererInterface {
-
-  /**
-   * The title resolver.
-   *
-   * @var \Drupal\Core\Controller\TitleResolverInterface
-   */
-  protected $titleResolver;
-
-  /**
-   * The renderer service.
-   *
-   * @var \Drupal\Core\Render\RendererInterface
-   */
-  protected $renderer;
-
-  /**
-   * Constructs a new JsonRenderer.
-   *
-   * @param \Drupal\Core\Controller\TitleResolverInterface $title_resolver
-   *   The title resolver.
-   * @param \Drupal\Core\Render\RendererInterface $renderer
-   *   The renderer service.
-   */
-  public function __construct(TitleResolverInterface $title_resolver, RendererInterface $renderer) {
-    $this->titleResolver = $title_resolver;
-    $this->renderer = $renderer;
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  public function renderResponse(array $main_content, Request $request, RouteMatchInterface $route_match) {
-      $json = [];
-
-      $json['content'] = (string) $this->renderer->renderRoot($main_content);
-      if (!empty($main_content['#title'])) {
-        $json['title'] = (string) $main_content['#title'];
-      }
-      else {
-        $json['title'] = (string) $this->titleResolver->getTitle($request, $route_match->getRouteObject());
-      }
-
-      $response = new CacheableJsonResponse($json, 200);
-      $response->addCacheableDependency(CacheableMetadata::createFromRenderArray($main_content));
-      return $response;
-  }
-
-}
diff --git a/core/modules/taxonomy/src/Controller/TaxonomyController.php b/core/modules/taxonomy/src/Controller/TaxonomyController.php
index 2268533..c188867 100644
--- a/core/modules/taxonomy/src/Controller/TaxonomyController.php
+++ b/core/modules/taxonomy/src/Controller/TaxonomyController.php
@@ -18,6 +18,19 @@
 class TaxonomyController extends ControllerBase {
 
   /**
+   * Title callback for term pages.
+   *
+   * @param \Drupal\taxonomy\TermInterface $term
+   *   A taxonomy term entity.
+   *
+   * @return
+   *   The term name to be used as the page title.
+   */
+  public function getTitle(TermInterface $term) {
+    return $term->label();
+  }
+
+  /**
    * Returns a form to add a new term to a vocabulary.
    *
    * @param \Drupal\taxonomy\VocabularyInterface $taxonomy_vocabulary
diff --git a/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateTermNodeTestBase.php b/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateTermNodeTestBase.php
index 2a47cea..0d51f64 100644
--- a/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateTermNodeTestBase.php
+++ b/core/modules/taxonomy/src/Tests/Migrate/d6/MigrateTermNodeTestBase.php
@@ -71,7 +71,6 @@ protected function setUp() {
         'type' => 'story',
         'nid' => $i,
         'vid' => array_shift($vids),
-        'title' => $this->randomString(),
       ));
       $node->enforceIsNew();
       $node->save();
diff --git a/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php b/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php
index 759f646..277d312 100644
--- a/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php
+++ b/core/modules/toolbar/src/Tests/ToolbarCacheContextsTest.php
@@ -8,7 +8,6 @@
 namespace Drupal\toolbar\Tests;
 
 use Drupal\Core\Cache\Cache;
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\simpletest\WebTestBase;
 use Drupal\system\Tests\Cache\AssertPageCacheContextsAndTagsTrait;
 
@@ -110,7 +109,6 @@ protected function assertToolbarCacheContexts(array $cache_contexts, $message =
     $default_cache_contexts = [
       'languages:language_interface',
       'theme',
-      'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT,
     ];
     $cache_contexts = Cache::mergeContexts($default_cache_contexts, $cache_contexts);
 
diff --git a/core/modules/tracker/src/Tests/TrackerTest.php b/core/modules/tracker/src/Tests/TrackerTest.php
index d1fc792..c57f1c9 100644
--- a/core/modules/tracker/src/Tests/TrackerTest.php
+++ b/core/modules/tracker/src/Tests/TrackerTest.php
@@ -10,7 +10,6 @@
 use Drupal\comment\CommentInterface;
 use Drupal\comment\Tests\CommentTestTrait;
 use Drupal\Core\Cache\Cache;
-use Drupal\Core\EventSubscriber\MainContentViewSubscriber;
 use Drupal\Core\Session\AccountInterface;
 use Drupal\field\Entity\FieldStorageConfig;
 use Drupal\node\Entity\Node;
@@ -84,7 +83,8 @@ function testTrackerAll() {
     $this->assertLink(t('My recent content'), 0, 'User tab shows up on the global tracker page.');
 
     // Assert cache contexts, specifically the pager and node access contexts.
-    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user.node_grants:view', 'user.permissions']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args.pagers:0', 'user.node_grants:view', 'user.permissions']);
+    // Assert cache tags for the visible node and node list cache tag.
     $expected_tags = Cache::mergeTags($published->getCacheTags(), $published->getOwner()->getCacheTags());
     $expected_tags = Cache::mergeTags($expected_tags, ['node_list', 'rendered']);
     $this->assertCacheTags($expected_tags);
@@ -149,7 +149,7 @@ function testTrackerUser() {
     $this->assertText($other_published_my_comment->label(), "Nodes that the user has commented on appear in the user's tracker listing.");
 
     // Assert cache contexts.
-    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
     // Assert cache tags for the visible nodes (including owners) and node list
     // cache tag.
     $expected_tags = Cache::mergeTags($my_published->getCacheTags(), $my_published->getOwner()->getCacheTags());
@@ -158,7 +158,7 @@ function testTrackerUser() {
     $expected_tags = Cache::mergeTags($expected_tags, ['node_list', 'rendered']);
 
     $this->assertCacheTags($expected_tags);
-    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args:' . MainContentViewSubscriber::WRAPPER_FORMAT, 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
+    $this->assertCacheContexts(['languages:language_interface', 'theme', 'url.query_args.pagers:0', 'user', 'user.node_grants:view']);
 
     $this->assertLink($my_published->label());
     $this->assertNoLink($unpublished->label());
diff --git a/core/modules/update/src/Tests/UpdateContribTest.php b/core/modules/update/src/Tests/UpdateContribTest.php
index 3e9290c..62fadd3 100644
--- a/core/modules/update/src/Tests/UpdateContribTest.php
+++ b/core/modules/update/src/Tests/UpdateContribTest.php
@@ -66,7 +66,6 @@ function testNoReleasesAvailable() {
    * Tests the basic functionality of a contrib module on the status report.
    */
   function testUpdateContribBasic() {
-    $project_link = \Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test'));
     $system_info = array(
       '#all' => array(
         'version' => '8.0.0',
@@ -88,30 +87,7 @@ function testUpdateContribBasic() {
     $this->assertText(t('Up to date'));
     $this->assertRaw('<h3>' . t('Modules') . '</h3>');
     $this->assertNoText(t('Update available'));
-    $this->assertRaw($project_link, 'Link to aaa_update_test project appears.');
-
-    // Since aaa_update_test is installed the fact it is hidden and in the
-    // Testing package means it should not appear.
-    $system_info['aaa_update_test']['hidden'] = TRUE;
-    $this->config('update_test.settings')->set('system_info', $system_info)->save();
-    $this->refreshUpdateStatus(
-      array(
-        'drupal' => '0.0',
-        'aaa_update_test' => '1_0',
-      )
-    );
-    $this->assertNoRaw($project_link, 'Link to aaa_update_test project does not appear.');
-
-    // A hidden and installed project not in the Testing package should appear.
-    $system_info['aaa_update_test']['package'] = 'aaa_update_test';
-    $this->config('update_test.settings')->set('system_info', $system_info)->save();
-    $this->refreshUpdateStatus(
-      array(
-        'drupal' => '0.0',
-        'aaa_update_test' => '1_0',
-      )
-    );
-    $this->assertRaw($project_link, 'Link to aaa_update_test project appears.');
+    $this->assertRaw(\Drupal::l(t('AAA Update test'), Url::fromUri('http://example.com/project/aaa_update_test')), 'Link to aaa_update_test project appears.');
   }
 
   /**
diff --git a/core/modules/update/src/UpdateManagerInterface.php b/core/modules/update/src/UpdateManagerInterface.php
index c011bae..e1dd5a4 100644
--- a/core/modules/update/src/UpdateManagerInterface.php
+++ b/core/modules/update/src/UpdateManagerInterface.php
@@ -51,6 +51,10 @@
    *     'theme'.
    *   - project_status: This indicates if the project is enabled and will
    *     always be TRUE, as the function only returns enabled projects.
+   *   - sub_themes: If the project is a theme it contains an associative array
+   *     of all sub-themes.
+   *   - base_themes: If the project is a theme it contains an associative array
+   *     of all base-themes.
    *
    * @see update_process_project_info()
    * @see update_calculate_project_data()
diff --git a/core/modules/update/templates/update-project-status.html.twig b/core/modules/update/templates/update-project-status.html.twig
index 4cc9a19..b00e0b2 100644
--- a/core/modules/update/templates/update-project-status.html.twig
+++ b/core/modules/update/templates/update-project-status.html.twig
@@ -21,6 +21,8 @@
  *   - data: The data about an extra item.
  * - includes: The projects within the project.
  * - disabled: The currently disabled projects in the project.
+ * - base_themes: The base themes supplied by the project.
+ * - sub_themes: The subthemes supplied by the project.
  *
  * @see template_preprocess_update_project_status()
  *
@@ -103,4 +105,18 @@
       Includes: {{ includes|placeholder }}
     {% endtrans %}
   {% endif %}
+
+  {% if base_themes %}
+    {% set basethemes = base_themes|join(', ') %}
+    {% trans %}
+      Depends on: {{ basethemes }}
+    {% endtrans %}
+  {% endif %}
+
+  {% if sub_themes %}
+    {% set subthemes = sub_themes|join(', ') %}
+    {% trans %}
+      Required by: {{ subthemes|placeholder }}
+    {% endtrans %}
+  {% endif %}
 </div>
diff --git a/core/modules/update/update.module b/core/modules/update/update.module
index a6ac805..daf0676 100644
--- a/core/modules/update/update.module
+++ b/core/modules/update/update.module
@@ -183,7 +183,7 @@ function update_theme() {
       'file' => 'update.report.inc',
     ),
     'update_project_status' => array(
-      'variables' => array('project' => array()),
+      'variables' => array('project' => array(), 'includes_status' => array()),
       'file' => 'update.report.inc',
     ),
     // We are using template instead of '#type' => 'table' here to keep markup
diff --git a/core/modules/update/update.report.inc b/core/modules/update/update.report.inc
index 6e1eacf..1face27 100644
--- a/core/modules/update/update.report.inc
+++ b/core/modules/update/update.report.inc
@@ -39,12 +39,24 @@ function template_preprocess_update_report(&$variables) {
     $variables['no_updates_message'] = _update_no_data();
   }
 
+  $status = array();
+
+  // Create an array of status values keyed by module or theme name, since
+  // we'll need this while generating the report if we have to cross reference
+  // anything (e.g. subthemes which have base themes missing an update).
+  foreach ($data as $project) {
+    foreach ($project['includes'] as $key => $name) {
+      $status[$key] = $project['status'];
+    }
+  }
+
   $rows = array();
 
   foreach ($data as $project) {
     $project_status = array(
       '#theme' =>  'update_project_status',
       '#project' => $project,
+      '#includes_status' => $status,
     );
 
     // Build project rows.
@@ -108,10 +120,14 @@ function template_preprocess_update_report(&$variables) {
  * @param array $variables
  *   An associative array containing:
  *   - project: An array of information about the project.
+ *   - includes_status: An array of sub-project statuses where the keys are the
+ *     shortnames of each project and the values are UPDATE_* integer constants
+ *     as defined in update.module.
  */
 function template_preprocess_update_project_status(&$variables) {
   // Storing by reference because we are sorting the project values.
   $project = &$variables['project'];
+  $includes_status = $variables['includes_status'];
 
   // Set the project title and URL.
   $variables['title'] = (isset($project['title'])) ? $project['title'] : $project['name'];
@@ -233,6 +249,42 @@ function template_preprocess_update_project_status(&$variables) {
     }
   }
 
+  if (!empty($project['base_themes'])) {
+    asort($project['base_themes']);
+    $base_themes = array();
+    foreach ($project['base_themes'] as $base_key => $base_theme) {
+      switch ($includes_status[$base_key]) {
+        case UPDATE_NOT_SECURE:
+          $base_status_label = t('Security update required!');
+          break;
+        case UPDATE_REVOKED:
+          $base_status_label = t('Revoked!');
+          break;
+        case UPDATE_NOT_SUPPORTED:
+          $base_status_label = t('Not supported!');
+          break;
+        default:
+          $base_status_label = '';
+      }
+
+      if ($base_status_label) {
+        $base_themes[] = t('%base_theme (!base_label)', array(
+          '%base_theme' => $base_theme,
+          '!base_label' => $base_status_label,
+        ));
+      }
+      else {
+        $base_themes[] = drupal_placeholder($base_theme);
+      }
+    }
+    $variables['base_themes'] = $base_themes;
+  }
+
+  if (!empty($project['sub_themes'])) {
+    sort($project['sub_themes']);
+    $variables['sub_themes'] = $project['sub_themes'];
+  }
+
   // Set the project status details.
   $status_label = NULL;
   switch ($project['status']) {
diff --git a/core/modules/user/src/Entity/User.php b/core/modules/user/src/Entity/User.php
index 3716d01..53155a0 100644
--- a/core/modules/user/src/Entity/User.php
+++ b/core/modules/user/src/Entity/User.php
@@ -463,14 +463,13 @@ public static function baseFieldDefinitions(EntityTypeInterface $entity_type) {
     $fields['name'] = BaseFieldDefinition::create('string')
       ->setLabel(t('Name'))
       ->setDescription(t('The name of this user.'))
-      ->setRequired(TRUE)
+      ->setDefaultValue('')
       ->setConstraints(array(
         // No Length constraint here because the UserName constraint also covers
         // that.
         'UserName' => array(),
         'UserNameUnique' => array(),
       ));
-    $fields['name']->getItemDefinition()->setClass('\Drupal\user\UserNameItem');
 
     $fields['pass'] = BaseFieldDefinition::create('password')
       ->setLabel(t('Password'))
diff --git a/core/modules/user/src/Tests/Condition/UserRoleConditionTest.php b/core/modules/user/src/Tests/Condition/UserRoleConditionTest.php
index ef92e11..567ae06 100644
--- a/core/modules/user/src/Tests/Condition/UserRoleConditionTest.php
+++ b/core/modules/user/src/Tests/Condition/UserRoleConditionTest.php
@@ -88,7 +88,6 @@ protected function setUp() {
 
     // Setup an anonymous user for our tests.
     $this->anonymous = User::create(array(
-      'name' => '',
       'uid' => 0,
     ));
     $this->anonymous->save();
diff --git a/core/modules/user/src/Tests/UserRoleDeleteTest.php b/core/modules/user/src/Tests/UserRoleDeleteTest.php
index 81396ac..9975046 100644
--- a/core/modules/user/src/Tests/UserRoleDeleteTest.php
+++ b/core/modules/user/src/Tests/UserRoleDeleteTest.php
@@ -42,9 +42,8 @@ public function testRoleDeleteUserRoleReferenceDelete() {
 
     // Create user and assign both test roles.
     $values = array(
-      'uid' => 1,
-      'name' => $this->randomString(),
-      'roles' => array('test_role_one', 'test_role_two'),
+        'uid' => 1,
+        'roles' => array('test_role_one', 'test_role_two'),
     );
     $user = User::create($values);
     $user->save();
diff --git a/core/modules/user/src/Tests/Views/HandlerFieldUserNameTest.php b/core/modules/user/src/Tests/Views/HandlerFieldUserNameTest.php
index 922501f..42f9b429 100644
--- a/core/modules/user/src/Tests/Views/HandlerFieldUserNameTest.php
+++ b/core/modules/user/src/Tests/Views/HandlerFieldUserNameTest.php
@@ -41,8 +41,6 @@ public function testUserName() {
     $this->executeView($view);
 
     $anon_name = $this->config('user.settings')->get('anonymous');
-    $view->result[0]->_entity->setUsername('');
-    $view->result[0]->_entity->uid->value = 0;
     $render = $renderer->executeInRenderContext(new RenderContext(), function () use ($view) {
       return $view->field['name']->advancedRender($view->result[0]);
     });
diff --git a/core/modules/user/src/Tests/Views/UserKernelTestBase.php b/core/modules/user/src/Tests/Views/UserKernelTestBase.php
index fa26cf2..6b92ae2 100644
--- a/core/modules/user/src/Tests/Views/UserKernelTestBase.php
+++ b/core/modules/user/src/Tests/Views/UserKernelTestBase.php
@@ -74,7 +74,7 @@ protected function setupPermissionTestData() {
     user_role_grant_permissions('multiple_permissions', array('administer permissions', 'administer users', 'access user profiles'));
 
     // Setup a user without an extra role.
-    $this->users[] = $account = $this->userStorage->create(['name' => $this->randomString()]);
+    $this->users[] = $account = $this->userStorage->create(array());
     $account->save();
     // Setup a user with just the first role (so no permission beside the
     // ones from the authenticated role).
diff --git a/core/modules/user/src/UserNameItem.php b/core/modules/user/src/UserNameItem.php
deleted file mode 100644
index 4e2852b..0000000
--- a/core/modules/user/src/UserNameItem.php
+++ /dev/null
@@ -1,31 +0,0 @@
-<?php
-
-/**
- * @file
- * Contains \Drupal\user\UserNameItem.
- */
-
-namespace Drupal\user;
-
-use Drupal\Core\Field\Plugin\Field\FieldType\StringItem;
-
-/**
- * Defines a custom field item class for the 'name' user entity field.
- */
-class UserNameItem extends StringItem {
-
-  /**
-   * {@inheritdoc}
-   */
-  public function isEmpty() {
-    $value = $this->get('value')->getValue();
-
-    // Take into account that the name of the anonymous user is an empty string.
-    if ($this->getEntity()->isAnonymous()) {
-      return $value === NULL;
-    }
-
-    return $value === NULL || $value === '';
-  }
-
-}
diff --git a/core/modules/user/user.install b/core/modules/user/user.install
index 91a908e..dd55b49 100644
--- a/core/modules/user/user.install
+++ b/core/modules/user/user.install
@@ -70,7 +70,6 @@ function user_install() {
     ->create(array(
       'uid' => 0,
       'status' => 0,
-      'name' => '',
     ))
     ->save();
 
diff --git a/core/modules/views/src/Tests/Entity/FieldEntityTest.php b/core/modules/views/src/Tests/Entity/FieldEntityTest.php
index 925ed10..7790bd5 100644
--- a/core/modules/views/src/Tests/Entity/FieldEntityTest.php
+++ b/core/modules/views/src/Tests/Entity/FieldEntityTest.php
@@ -57,7 +57,7 @@ public function testGetEntity() {
     $account = entity_create('user', array('name' => $this->randomMachineName(), 'bundle' => 'user'));
     $account->save();
 
-    $node = entity_create('node', array('uid' => $account->id(), 'type' => 'page', 'title' => $this->randomString()));
+    $node = entity_create('node', array('uid' => $account->id(), 'type' => 'page'));
     $node->save();
     $comment = entity_create('comment', array(
       'uid' => $account->id(),
diff --git a/core/modules/views/src/Tests/Entity/FilterEntityBundleTest.php b/core/modules/views/src/Tests/Entity/FilterEntityBundleTest.php
index 9be30df..808c8a4 100644
--- a/core/modules/views/src/Tests/Entity/FilterEntityBundleTest.php
+++ b/core/modules/views/src/Tests/Entity/FilterEntityBundleTest.php
@@ -60,7 +60,7 @@ protected function setUp() {
 
     foreach ($this->entityBundles as $key => $info) {
       for ($i = 0; $i < 5; $i++) {
-        $entity = entity_create('node', array('title' => $this->randomString(), 'uid' => 1, 'type' => $key));
+        $entity = entity_create('node', array('label' => $this->randomMachineName(), 'uid' => 1, 'type' => $key));
         $entity->save();
         $this->entities[$key][$entity->id()] = $entity;
         $this->entities['count']++;
diff --git a/core/modules/views/src/Tests/Handler/FieldFieldTest.php b/core/modules/views/src/Tests/Handler/FieldFieldTest.php
index dd77cb7..611c161 100644
--- a/core/modules/views/src/Tests/Handler/FieldFieldTest.php
+++ b/core/modules/views/src/Tests/Handler/FieldFieldTest.php
@@ -74,7 +74,7 @@ protected function setUp() {
     $this->installEntitySchema('entity_test_rev');
 
     // Bypass any field access.
-    $this->adminUser = User::create(['name' => $this->randomString()]);
+    $this->adminUser = User::create();
     $this->adminUser->save();
     $this->container->get('current_user')->setAccount($this->adminUser);
 
diff --git a/core/modules/views_ui/src/Tests/DisplayPathTest.php b/core/modules/views_ui/src/Tests/DisplayPathTest.php
index 1515b2f..004b9f0 100644
--- a/core/modules/views_ui/src/Tests/DisplayPathTest.php
+++ b/core/modules/views_ui/src/Tests/DisplayPathTest.php
@@ -35,7 +35,6 @@ class DisplayPathTest extends UITestBase {
   public function testPathUI() {
     $this->doBasicPathUITest();
     $this->doAdvancedPathsValidationTest();
-    $this->doPathXssFilterTest();
   }
 
   /**
@@ -61,28 +60,6 @@ protected function doBasicPathUITest() {
   }
 
   /**
-   * Tests that View paths are properly filtered for XSS.
-   */
-  public function doPathXssFilterTest() {
-    $this->drupalGet('admin/structure/views/view/test_view');
-    $this->drupalPostForm(NULL, array(), 'Add Page');
-    $this->drupalPostForm('admin/structure/views/nojs/display/test_view/page_2/path', array('path' => '<object>malformed_path</object>'), t('Apply'));
-    $this->drupalPostForm(NULL, array(), 'Add Page');
-    $this->drupalPostForm('admin/structure/views/nojs/display/test_view/page_3/path', array('path' => '<script>alert("hello");</script>'), t('Apply'));
-    $this->drupalPostForm(NULL, array(), 'Add Page');
-    $this->drupalPostForm('admin/structure/views/nojs/display/test_view/page_4/path', array('path' => '<script>alert("hello I have placeholders %");</script>'), t('Apply'));
-    $this->drupalPostForm('admin/structure/views/view/test_view', array(), t('Save'));
-    $this->drupalGet('admin/structure/views');
-    // The anchor text should be escaped.
-    $this->assertEscaped('/<object>malformed_path</object>');
-    $this->assertEscaped('/<script>alert("hello");</script>');
-    $this->assertEscaped('/<script>alert("hello I have placeholders %");</script>');
-    // Links should be url-encoded.
-    $this->assertRaw('/%3Cobject%3Emalformed_path%3C/object%3E');
-    $this->assertRaw('/%3Cscript%3Ealert%28%22hello%22%29%3B%3C/script%3E');
-  }
-
-  /**
    * Tests a couple of invalid path patterns.
    */
   protected function doAdvancedPathsValidationTest() {
diff --git a/core/modules/views_ui/src/ViewListBuilder.php b/core/modules/views_ui/src/ViewListBuilder.php
index 16abf60..00be178 100644
--- a/core/modules/views_ui/src/ViewListBuilder.php
+++ b/core/modules/views_ui/src/ViewListBuilder.php
@@ -91,6 +91,12 @@ public function load() {
    */
   public function buildRow(EntityInterface $view) {
     $row = parent::buildRow($view);
+    $display_paths = '';
+    $separator = '';
+    foreach ($this->getDisplayPaths($view) as $display_path) {
+      $display_paths .= $separator . SafeMarkup::escape($display_path);
+      $separator = ', ';
+    }
     return array(
       'data' => array(
         'view_name' => array(
@@ -107,13 +113,7 @@ public function buildRow(EntityInterface $view) {
           'class' => array('views-table-filter-text-source'),
         ),
         'tag' => $view->get('tag'),
-        'path' => array(
-          'data' => array(
-            '#theme' => 'item_list',
-            '#items' => $this->getDisplayPaths($view),
-            '#context' => ['list_style' => 'comma-list'],
-          ),
-        ),
+        'path' => SafeMarkup::set($display_paths),
         'operations' => $row['operations'],
       ),
       'title' => $this->t('Machine name: @name', array('@name' => $view->id())),
diff --git a/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php b/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php
index d4bc2b6..a42a879 100644
--- a/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php
+++ b/core/modules/views_ui/tests/src/Unit/ViewListBuilderTest.php
@@ -89,10 +89,7 @@ public function testBuildRowEntityList() {
     );
     $page_display->expects($this->any())
       ->method('getPath')
-      ->will($this->onConsecutiveCalls(
-        $this->returnValue('test_page'),
-        $this->returnValue('<object>malformed_path</object>'),
-        $this->returnValue('<script>alert("placeholder_page/%")</script>')));
+      ->will($this->returnValue('test_page'));
 
     $embed_display = $this->getMock('Drupal\views\Plugin\views\display\Embed', array('initDisplay'),
       array(array(), 'default', $display_manager->getDefinition('embed'))
@@ -109,16 +106,6 @@ public function testBuildRowEntityList() {
     $values['display']['page_1']['display_plugin'] = 'page';
     $values['display']['page_1']['display_options']['path'] = 'test_page';
 
-    $values['display']['page_2']['id'] = 'page_2';
-    $values['display']['page_2']['display_title'] = 'Page 2';
-    $values['display']['page_2']['display_plugin'] = 'page';
-    $values['display']['page_2']['display_options']['path'] = '<object>malformed_path</object>';
-
-    $values['display']['page_3']['id'] = 'page_3';
-    $values['display']['page_3']['display_title'] = 'Page 3';
-    $values['display']['page_3']['display_plugin'] = 'page';
-    $values['display']['page_3']['display_options']['path'] = '<script>alert("placeholder_page/%")</script>';
-
     $values['display']['embed']['id'] = 'embed';
     $values['display']['embed']['display_title'] = 'Embedded';
     $values['display']['embed']['display_plugin'] = 'embed';
@@ -128,8 +115,6 @@ public function testBuildRowEntityList() {
       ->will($this->returnValueMap(array(
         array('default', $values['display']['default'], $default_display),
         array('page', $values['display']['page_1'], $page_display),
-        array('page', $values['display']['page_2'], $page_display),
-        array('page', $values['display']['page_3'], $page_display),
         array('embed', $values['display']['embed'], $embed_display),
       )));
 
@@ -156,16 +141,8 @@ public function testBuildRowEntityList() {
 
     $row = $view_list_builder->buildRow($view);
 
-    $expected_displays = array(
-      'Embed admin label',
-      'Page admin label',
-      'Page admin label',
-      'Page admin label',
-    );
-    $this->assertEquals($expected_displays, $row['data']['view_name']['data']['#displays']);
-
-    $display_paths = $row['data']['path']['data']['#items'];
-    $this->assertEquals('/test_page, /&lt;object&gt;malformed_path&lt;/object&gt;, /&lt;script&gt;alert(&quot;placeholder_page/%&quot;)&lt;/script&gt;', implode(', ', $display_paths));
+    $this->assertEquals(array('Embed admin label', 'Page admin label'), $row['data']['view_name']['data']['#displays'], 'Wrong displays got added to view list');
+    $this->assertEquals($row['data']['path'], '/test_page', 'The path of the page display is not added.');
   }
 
 }
diff --git a/core/tests/Drupal/Tests/Core/Database/ConnectionTest.php b/core/tests/Drupal/Tests/Core/Database/ConnectionTest.php
index 4f4c803..ea2fa24 100644
--- a/core/tests/Drupal/Tests/Core/Database/ConnectionTest.php
+++ b/core/tests/Drupal/Tests/Core/Database/ConnectionTest.php
@@ -254,12 +254,12 @@ public function providerMakeComments() {
         array(''),
       ),
       array(
-        '/* Exploit  *  / DROP TABLE node; -- */ ',
+        '/* Exploit * / DROP TABLE node; -- */ ',
         array('Exploit * / DROP TABLE node; --'),
       ),
       array(
-        '/* Exploit  *  / DROP TABLE node; --; another comment */ ',
-        array('Exploit * / DROP TABLE node; --', 'another comment'),
+        '/* Exploit DROP TABLE node; --; another comment */ ',
+        array('Exploit */ DROP TABLE node; --', 'another comment'),
       ),
     );
   }
@@ -286,8 +286,8 @@ public function testMakeComments($expected, $comment_array) {
   public function providerFilterComments() {
     return array(
       array('', ''),
-      array('Exploit  *  / DROP TABLE node; --', 'Exploit * / DROP TABLE node; --'),
-      array('Exploit  * / DROP TABLE node; --', 'Exploit */ DROP TABLE node; --'),
+      array('Exploit * / DROP TABLE node; --', 'Exploit * / DROP TABLE node; --'),
+      array('Exploit DROP TABLE node; --', 'Exploit */ DROP TABLE node; --'),
     );
   }
 
diff --git a/core/tests/Drupal/Tests/Core/DrupalKernel/DiscoverServiceProvidersTest.php b/core/tests/Drupal/Tests/Core/DrupalKernel/DiscoverServiceProvidersTest.php
index c955b58..6162790 100644
--- a/core/tests/Drupal/Tests/Core/DrupalKernel/DiscoverServiceProvidersTest.php
+++ b/core/tests/Drupal/Tests/Core/DrupalKernel/DiscoverServiceProvidersTest.php
@@ -46,20 +46,14 @@ public function testDiscoverServiceCustom() {
 
   /**
    * Tests the exception when container_yamls is not set.
+   *
+   * @covers ::discoverServiceProviders
+   * @expectedException \Exception
    */
   public function testDiscoverServiceNoContainerYamls() {
     new Settings([]);
     $kernel = new DrupalKernel('prod', new \Composer\Autoload\ClassLoader());
     $kernel->discoverServiceProviders();
-
-    $expect = [
-      'app' => [
-        'core' => 'core/core.services.yml',
-      ],
-      'site' => [
-      ],
-    ];
-    $this->assertAttributeSame($expect, 'serviceYamls', $kernel);
   }
 
 }
diff --git a/core/themes/bartik/css/components/item-list.css b/core/themes/bartik/css/components/item-list.css
index 698bd56..eeb4e77 100644
--- a/core/themes/bartik/css/components/item-list.css
+++ b/core/themes/bartik/css/components/item-list.css
@@ -10,10 +10,3 @@
 [dir="rtl"] .item-list ul li {
   padding: 0.2em 0 0 0.5em;
 }
-.item-list .item-list__comma-list,
-.item-list .item-list__comma-list li,
-[dir="rtl"] .item-list .item-list__comma-list,
-[dir="rtl"] .item-list .item-list__comma-list li {
-  margin: 0;
-  padding: 0;
-}
diff --git a/core/themes/classy/templates/dataset/item-list.html.twig b/core/themes/classy/templates/dataset/item-list.html.twig
index 7ba8be4..0f17cdf 100644
--- a/core/themes/classy/templates/dataset/item-list.html.twig
+++ b/core/themes/classy/templates/dataset/item-list.html.twig
@@ -12,15 +12,10 @@
  * - attributes: HTML attributes to be applied to the list.
  * - empty: A message to display when there are no items. Allowed value is a
  *   string or render array.
- * - context: A list of contextual data associated with the list. May contain:
- *   - list_style: The custom list style.
  *
  * @see template_preprocess_item_list()
  */
 #}
-{% if context.list_style %}
-  {% set attributes = attributes.addClass('item-list__' ~ context.list_style) %}
-{% endif %}
 {%- if items or empty -%}
   <div class="item-list">
     {%- if title is not empty -%}
diff --git a/core/themes/seven/css/components/menus-and-lists.css b/core/themes/seven/css/components/menus-and-lists.css
index 6f87c4c..d96fe55 100644
--- a/core/themes/seven/css/components/menus-and-lists.css
+++ b/core/themes/seven/css/components/menus-and-lists.css
@@ -38,6 +38,3 @@ ul.inline li {
 ul.inline li {
   display: inline;
 }
-[dir="rtl"] ul.item-list__comma-list {
-  margin: 0;
-}
