diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index c47db5e..abcd6ad 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -1,6 +1,7 @@
 <?php
 
 use Drupal\Component\Utility\NestedArray;
+use Drupal\Core\DrupalKernel;
 use Drupal\Core\Database\Database;
 use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Symfony\Component\ClassLoader\UniversalClassLoader;
@@ -128,39 +129,44 @@
 const DRUPAL_BOOTSTRAP_CONFIGURATION = 0;
 
 /**
- * Second bootstrap phase: try to serve a cached page.
+ * Second bootstrap phase, initalize a kernel.
  */
-const DRUPAL_BOOTSTRAP_PAGE_CACHE = 1;
+const DRUPAL_BOOTSTRAP_KERNEL = 1;
 
 /**
- * Third bootstrap phase: initialize database layer.
+ * Third bootstrap phase: try to serve a cached page.
  */
-const DRUPAL_BOOTSTRAP_DATABASE = 2;
+const DRUPAL_BOOTSTRAP_PAGE_CACHE = 2;
 
 /**
- * Fourth bootstrap phase: initialize the variable system.
+ * Fourth bootstrap phase: initialize database layer.
  */
-const DRUPAL_BOOTSTRAP_VARIABLES = 3;
+const DRUPAL_BOOTSTRAP_DATABASE = 3;
 
 /**
- * Fifth bootstrap phase: initialize session handling.
+ * Fifth bootstrap phase: initialize the variable system.
  */
-const DRUPAL_BOOTSTRAP_SESSION = 4;
+const DRUPAL_BOOTSTRAP_VARIABLES = 4;
 
 /**
- * Sixth bootstrap phase: set up the page header.
+ * Sixth bootstrap phase: initialize session handling.
  */
-const DRUPAL_BOOTSTRAP_PAGE_HEADER = 5;
+const DRUPAL_BOOTSTRAP_SESSION = 5;
 
 /**
- * Seventh bootstrap phase: load code for subsystems and modules.
+ * Seventh bootstrap phase: set up the page header.
  */
-const DRUPAL_BOOTSTRAP_CODE = 6;
+const DRUPAL_BOOTSTRAP_PAGE_HEADER = 6;
+
+/**
+ * Eighth bootstrap phase: load code for subsystems and modules.
+ */
+const DRUPAL_BOOTSTRAP_CODE = 7;
 
 /**
  * Final bootstrap phase: initialize language, path, theme, and modules.
  */
-const DRUPAL_BOOTSTRAP_FULL = 7;
+const DRUPAL_BOOTSTRAP_FULL = 8;
 
 /**
  * Role ID for anonymous users; should match what's in the "role" table.
@@ -2105,6 +2111,7 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
   // Not drupal_static(), because does not depend on any run-time information.
   static $phases = array(
     DRUPAL_BOOTSTRAP_CONFIGURATION,
+    DRUPAL_BOOTSTRAP_KERNEL,
     DRUPAL_BOOTSTRAP_PAGE_CACHE,
     DRUPAL_BOOTSTRAP_DATABASE,
     DRUPAL_BOOTSTRAP_VARIABLES,
@@ -2115,14 +2122,15 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
   );
   // Not drupal_static(), because the only legitimate API to control this is to
   // call drupal_bootstrap() with a new phase parameter.
-  static $final_phase;
+  static $final_phase = -1;
   // Not drupal_static(), because it's impossible to roll back to an earlier
   // bootstrap state.
   static $stored_phase = -1;
 
-  // When not recursing, store the phase name so it's not forgotten while
-  // recursing.
-  if ($new_phase) {
+  // When not recursing, store the phase name so it's not forgotten during
+  // recursion. Additionally, ensure that $final_phase is never rolled back to an
+  // earlier bootstrap state.
+  if ($new_phase && $phase > $final_phase) {
     $final_phase = $phase;
   }
   if (isset($phase)) {
@@ -2142,6 +2150,10 @@ function drupal_bootstrap($phase = NULL, $new_phase = TRUE) {
           _drupal_bootstrap_configuration();
           break;
 
+        case DRUPAL_BOOTSTRAP_KERNEL:
+          _drupal_bootstrap_kernel();
+          break;
+
         case DRUPAL_BOOTSTRAP_PAGE_CACHE:
           _drupal_bootstrap_page_cache();
           break;
@@ -2272,6 +2284,18 @@ function _drupal_bootstrap_configuration() {
 }
 
 /**
+ * Initialize the kernel / service container.
+ */
+function _drupal_bootstrap_kernel() {
+  // Normally, index.php puts a container in drupal_container() by creating a
+  // kernel. If there is no container yet, create one.
+  if (!drupal_container()) {
+    $kernel = new DrupalKernel('prod', FALSE, drupal_classloader());
+    $kernel->boot();
+  }
+}
+
+/**
  * Attempts to serve a page from the cache.
  */
 function _drupal_bootstrap_page_cache() {
@@ -2407,91 +2431,31 @@ function drupal_get_bootstrap_phase() {
 /**
  * Retrieves the Drupal Container to standardize object construction.
  *
- * On a normal page request the container is built by the kernel and passed in
- * to this function which stores it statically. Any full bootstrap outside of
- * the context of a page request will require a container with a minimal set of
- * services. If this function is called without the $rebuild parameter, and no
- * container object has been statically cached, it builds this minimal container,
- * registering the services that are required.
+ * The container is built by the kernel and passed in to this function which
+ * stores it statically. The container always contains the services from
+ * \Drupal\Core\CoreBundle, the bundles of enabled modules and any other
+ * bundles defined in $GLOBALS['conf']['container_bundles'].
  *
  * @see Drupal\Core\DrupalKernel
  *
  * @param Symfony\Component\DependencyInjection\Container $new_container
- *   A new container instance to replace the current.
+ *   (optional) A new container instance to replace the current.
  * @param bool $rebuild
  *   (optional) Internal use only. Whether to enforce a rebuild of the container.
  *   Used by the testing framework to inject a fresh container for unit tests.
  *
- * @return Symfony\Component\DependencyInjection\Container
+ * @return Symfony\Component\DependencyInjection\Container|bool
  *   The instance of the Container used to set up and maintain object
- *   instances.
+ *   instances or FALSE if none exist yet.
  */
 function drupal_container(Container $new_container = NULL, $rebuild = FALSE) {
   // We do not use drupal_static() here because we do not have a mechanism by
   // which to reinitialize the stored objects, so a drupal_static_reset() call
   // would leave Drupal in a nonfunctional state.
-  static $container = NULL;
-  if ($rebuild) {
-    $container = NULL;
-  }
+  static $container = FALSE;
   if (isset($new_container)) {
     $container = $new_container;
   }
-  if (!isset($container)) {
-    // This is only ever used by the installer and by run-tests.sh.
-    // @todo Remove this entire section once these have been converted to use a
-    //   kernel.
-    $container = new ContainerBuilder();
-
-    // Register active configuration storage.
-    $container
-      ->register('config.cachedstorage.storage', 'Drupal\Core\Config\FileStorage')
-      ->addArgument(config_get_config_directory(CONFIG_ACTIVE_DIRECTORY));
-    // @todo Replace this with a cache.factory service plus 'config' argument.
-    $container
-      ->register('cache.config', 'Drupal\Core\Cache\CacheBackendInterface')
-      ->setFactoryClass('Drupal\Core\Cache\CacheFactory')
-      ->setFactoryMethod('get')
-      ->addArgument('config');
-
-    $container
-      ->register('config.storage', 'Drupal\Core\Config\CachedStorage')
-      ->addArgument(new Reference('config.cachedstorage.storage'))
-      ->addArgument(new Reference('cache.config'));
-
-    // Register configuration object factory.
-    $container->register('config.subscriber.globalconf', 'Drupal\Core\EventSubscriber\ConfigGlobalOverrideSubscriber');
-    $container->register('dispatcher', 'Symfony\Component\EventDispatcher\EventDispatcher')
-      ->addMethodCall('addSubscriber', array(new Reference('config.subscriber.globalconf')));
-    $container->register('config.factory', 'Drupal\Core\Config\ConfigFactory')
-      ->addArgument(new Reference('config.storage'))
-      ->addArgument(new Reference('dispatcher'));
-
-    // Register staging configuration storage.
-    $container
-      ->register('config.storage.staging', 'Drupal\Core\Config\FileStorage')
-      ->addArgument(config_get_config_directory(CONFIG_STAGING_DIRECTORY));
-
-    // Register the service for the default database connection.
-    $container->register('database', 'Drupal\Core\Database\Connection')
-      ->setFactoryClass('Drupal\Core\Database\Database')
-      ->setFactoryMethod('getConnection')
-      ->addArgument('default');
-    // Register the KeyValueStore factory.
-    $container
-      ->register('keyvalue', 'Drupal\Core\KeyValueStore\KeyValueFactory')
-      ->addArgument(new Reference('service_container'));
-    $container
-      ->register('keyvalue.database', 'Drupal\Core\KeyValueStore\KeyValueDatabaseFactory')
-      ->addArgument(new Reference('database'));
-
-    $container->register('path.alias_manager', 'Drupal\Core\Path\AliasManager')
-      ->addArgument(new Reference('database'))
-      ->addArgument(new Reference('keyvalue'));
-
-    // Register the EntityManager.
-    $container->register('plugin.manager.entity', 'Drupal\Core\Entity\EntityManager');
-  }
   return $container;
 }
 
diff --git a/core/includes/file.inc b/core/includes/file.inc
index 137dd0d..bcd3033 100644
--- a/core/includes/file.inc
+++ b/core/includes/file.inc
@@ -5,10 +5,12 @@
  * API for handling file uploads and server file management.
  */
 
+use Drupal\Core\StreamWrapper\LocalStream;
+use Drupal\Component\PhpStorage\MTimeProtectedFastFileStorage;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
 use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
 use Symfony\Component\HttpFoundation\StreamedResponse;
-use Drupal\Core\StreamWrapper\LocalStream;
+
 /**
  * Stream wrapper bit flags that are the basis for composite types.
  *
@@ -558,7 +560,7 @@ function file_save_htaccess($directory, $private = TRUE) {
 
   if ($private) {
     // Private .htaccess file.
-    $htaccess_lines = "SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006\nDeny from all\nOptions None\nOptions +FollowSymLinks";
+    $htaccess_lines = MTimeProtectedFastFileStorage::HTACCESS;
   }
   else {
     // Public .htaccess file.
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index efeca48..ebb69c4 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -288,6 +288,9 @@ function install_begin_request(&$install_state) {
 
   // Determine whether the configuration system is ready to operate.
   $install_state['config_verified'] = install_verify_config_directory(CONFIG_ACTIVE_DIRECTORY) && install_verify_config_directory(CONFIG_STAGING_DIRECTORY);
+  // Check existing settings.php.
+  $install_state['database_verified'] = install_verify_database_settings();
+  $install_state['settings_verified'] = $install_state['config_verified'] && $install_state['database_verified'];
 
   // If it is not, replace the configuration storage with the InstallStorage
   // implementation, for the following reasons:
@@ -312,7 +315,11 @@ function install_begin_request(&$install_state) {
   // This override is reverted as soon as the config directory has been set up
   // successfully.
   // @see drupal_install_config_directories()
-  if (!$install_state['config_verified']) {
+  if ($install_state['settings_verified']) {
+    $kernel = new DrupalKernel('install', FALSE, drupal_classloader(), FALSE);
+    $kernel->boot();
+  }
+  else {
     // @todo Move into a proper Drupal\Core\DependencyInjection\InstallContainerBuilder.
     $container = new ContainerBuilder();
 
@@ -362,10 +369,6 @@ function install_begin_request(&$install_state) {
   // accessing the database before it is set up yet.)
   drupal_maintenance_theme();
 
-  // Check existing settings.php.
-  $install_state['database_verified'] = install_verify_database_settings();
-  $install_state['settings_verified'] = $install_state['config_verified'] && $install_state['database_verified'];
-
   if ($install_state['database_verified']) {
     // Initialize the database system. Note that the connection
     // won't be initialized until it is actually requested.
@@ -1104,11 +1107,6 @@ function install_settings_form_submit($form, &$form_state) {
   // Add the config directories to settings.php.
   drupal_install_config_directories();
 
-  // We have valid configuration directories in settings.php.
-  // Reset the service container, so the config.storage service will use the
-  // actual active storage for installing configuration.
-  drupal_container(NULL, TRUE);
-
   // Indicate that the settings file has been verified, and check the database
   // for the last completed task, now that we have a valid connection. This
   // last step is important since we want to trigger an error if the new
@@ -1500,10 +1498,6 @@ function install_bootstrap_full(&$install_state) {
   // Clear the module list that was overriden earlier in the process.
   // This will allow all freshly installed modules to be loaded.
   module_list_reset();
-
-  // Instantiate the kernel.
-  $kernel = new DrupalKernel('prod', FALSE, drupal_classloader(), FALSE);
-  $kernel->boot();
   drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 }
 
diff --git a/core/includes/install.inc b/core/includes/install.inc
index a2666ae..99cfcf6 100644
--- a/core/includes/install.inc
+++ b/core/includes/install.inc
@@ -6,6 +6,7 @@
  */
 
 use Drupal\Core\Database\Database;
+use Drupal\Core\DrupalKernel;
 use Drupal\locale\Gettext;
 
 /**
@@ -421,6 +422,9 @@ function drupal_verify_profile($install_state) {
 function drupal_install_system() {
   // Create tables.
   drupal_install_schema('system');
+  // Immediately boot a kernel to have real services ready.
+  $kernel = new DrupalKernel('install', FALSE, drupal_classloader(), FALSE);
+  $kernel->boot();
 
   $system_path = drupal_get_path('module', 'system');
   require_once DRUPAL_ROOT . '/' . $system_path . '/system.install';
diff --git a/core/lib/Drupal/Component/PhpStorage/FileStorage.php b/core/lib/Drupal/Component/PhpStorage/FileStorage.php
index a07c27e..fcbbb7b 100644
--- a/core/lib/Drupal/Component/PhpStorage/FileStorage.php
+++ b/core/lib/Drupal/Component/PhpStorage/FileStorage.php
@@ -83,6 +83,10 @@ function writeable() {
    * Implements Drupal\Component\PhpStorage\PhpStorageInterface::deleteAll().
    */
   function deleteAll() {
+    // @todo remove this to properly decouple this class from Drupal.
+    if (!function_exists('file_unmanaged_delete_recursive')) {
+      include_once DRUPAL_ROOT . '/core/includes/file.inc';
+    }
     return file_unmanaged_delete_recursive($this->directory, array(__CLASS__, 'filePreDeleteCallback'));
   }
 
diff --git a/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFastFileStorage.php b/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFastFileStorage.php
index 68a6205..908289a 100644
--- a/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFastFileStorage.php
+++ b/core/lib/Drupal/Component/PhpStorage/MTimeProtectedFastFileStorage.php
@@ -40,6 +40,8 @@
  */
 class MTimeProtectedFastFileStorage extends FileStorage {
 
+  const HTACCESS="SetHandler Drupal_Security_Do_Not_Remove_See_SA_2006_006\nDeny from all\nOptions None\nOptions +FollowSymLinks";
+
   /**
    * The secret used in the HMAC.
    *
@@ -144,7 +146,10 @@ protected function ensureDirectory() {
       mkdir($this->directory, 0700, TRUE);
     }
     chmod($this->directory, 0700);
-    file_save_htaccess($this->directory);
+    $htaccess_path =  $this->directory . '/.htaccess';
+    if (!file_exists($htaccess_path) && file_put_contents($htaccess_path, self::HTACCESS)) {
+      @chmod($htaccess_path, 0444);
+    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index f07d081..ebcf6b2 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -158,11 +158,6 @@ public function boot() {
     }
     $this->initializeContainer();
     $this->booted = TRUE;
-    // @todo Remove this once everything in the bootstrap has been converted to
-    //   services in the DIC.
-    drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE);
-    // Now that full bootstrap is complete, we can dump the container if it
-    // was just rebuilt.
     if ($this->containerNeedsDumping && !$this->dumpDrupalContainer($this->container, $this->getContainerBaseClass())) {
       watchdog('DrupalKernel', 'Container cannot be written to disk');
     }
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php
index 1070107..c3d7851 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentInterfaceTest.php
@@ -113,10 +113,6 @@ function testCommentInterface() {
     $reply = $this->postComment(NULL, $this->randomName(), $this->randomName(), TRUE);
     $this->assertTrue($this->commentExists($reply, TRUE), 'Modified reply found.');
 
-    // Correct link count
-    $this->drupalGet('node');
-    $this->assertRaw('4 comments', 'Link to the 4 comments exist.');
-
     // Confirm a new comment is posted to the correct page.
     $this->setCommentsPerPage(2);
     $comment_new_page = $this->postComment($this->node, $this->randomName(), $this->randomName(), TRUE);
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
index d049aa3..0df1b71 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentLinksTest.php
@@ -12,6 +12,15 @@
  */
 class CommentLinksTest extends CommentTestBase {
 
+  /**
+   * Use the main node listing to test rendering on teasers.
+   *
+   * @var array
+   *
+   * @todo Remove this dependency.
+   */
+  public static $modules = array('views');
+
   public static function getInfo() {
     return array(
       'name' => 'Comment links',
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentNewIndicatorTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentNewIndicatorTest.php
index 324012e..8009f88 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentNewIndicatorTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentNewIndicatorTest.php
@@ -12,6 +12,15 @@
  */
 class CommentNewIndicatorTest extends CommentTestBase {
 
+  /**
+   * Use the main node listing to test rendering on teasers.
+   *
+   * @var array
+   *
+   * @todo Remove this dependency.
+   */
+  public static $modules = array('views');
+
   public static function getInfo() {
     return array(
       'name' => "Comment 'new' indicator",
diff --git a/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php b/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php
index da786a2..f84e9f4 100644
--- a/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php
+++ b/core/modules/contextual/lib/Drupal/contextual/Tests/ContextualDynamicContextTest.php
@@ -19,7 +19,7 @@ class ContextualDynamicContextTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('contextual', 'node');
+  public static $modules = array('contextual', 'node', 'views');
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
index bc74778..2030e1c 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleContentTest.php
@@ -178,9 +178,9 @@ function testContentTypeDirLang() {
       ));
     }
 
-    $this->drupalGet('node');
 
     // Check if English node does not have lang tag.
+    $this->drupalGet('node/' . $nodes['en']->nid);
     $pattern = '|id="node-' . $nodes['en']->nid . '"[^<>]*lang="en"|';
     $this->assertNoPattern($pattern, 'The lang tag has not been assigned to the English node.');
 
@@ -189,18 +189,18 @@ function testContentTypeDirLang() {
     $this->assertNoPattern($pattern, 'The dir tag has not been assigned to the English node.');
 
     // Check if Arabic node has lang="ar" & dir="rtl" tags.
+    $this->drupalGet('node/' . $nodes['ar']->nid);
     $pattern = '|id="node-' . $nodes['ar']->nid . '"[^<>]*lang="ar" dir="rtl"|';
     $this->assertPattern($pattern, 'The lang and dir tags have been assigned correctly to the Arabic node.');
 
     // Check if Spanish node has lang="es" tag.
+    $this->drupalGet('node/' . $nodes['es']->nid);
     $pattern = '|id="node-' . $nodes['es']->nid . '"[^<>]*lang="es"|';
     $this->assertPattern($pattern, 'The lang tag has been assigned correctly to the Spanish node.');
 
     // Check if Spanish node does not have dir="ltr" tag.
     $pattern = '|id="node-' . $nodes['es']->nid . '"[^<>]*lang="es" dir="ltr"|';
     $this->assertNoPattern($pattern, 'The dir tag has not been assigned to the Spanish node.');
-
-    $this->drupalLogout();
   }
 
 
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php
index d1ad5f0..4f49d02 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocalePathTest.php
@@ -19,7 +19,7 @@ class LocalePathTest extends WebTestBase {
    *
    * @var array
    */
-  public static $modules = array('node', 'locale', 'path');
+  public static $modules = array('node', 'locale', 'path', 'views');
 
   public static function getInfo() {
     return array(
diff --git a/core/modules/node/config/views.view.frontpage.yml b/core/modules/node/config/views.view.frontpage.yml
new file mode 100644
index 0000000..0fbe04d
--- /dev/null
+++ b/core/modules/node/config/views.view.frontpage.yml
@@ -0,0 +1,139 @@
+api_version: '3.0'
+base_field: nid
+base_table: node
+core: 8.x
+description: 'A list of nodes marked for display on the front page.'
+disabled: '0'
+display:
+  default:
+    display_options:
+      access:
+        type: perm
+      cache:
+        type: none
+      empty:
+        area:
+          admin_label: ''
+          content: 'No front page content has been created yet.'
+          empty: '1'
+          field: area
+          format: plain_text
+          group_type: group
+          id: area
+          label: ''
+          relationship: none
+          table: views
+          tokenize: '0'
+        node_listing_empty:
+          admin_label: ''
+          empty: '1'
+          field: node_listing_empty
+          group_type: group
+          id: node_listing_empty
+          label: ''
+          relationship: none
+          table: node
+        title:
+          id: title
+          table: views
+          field: title
+          relationship: none
+          group_type: group
+          admin_label: ''
+          label: ''
+          empty: '1'
+          title: 'Welcome to Drupal'
+      exposed_form:
+        type: basic
+      filters:
+        promote:
+          admin_label: ''
+          expose:
+            description: ''
+            identifier: ''
+            label: ''
+            multiple: '0'
+            operator: ''
+            operator_id: '0'
+            remember: '0'
+            remember_roles:
+              authenticated: authenticated
+            required: '0'
+            use_operator: '0'
+          exposed: '0'
+          field: promote
+          group: '1'
+          group_info:
+            default_group: All
+            default_group_multiple: {  }
+            description: ''
+            group_items: {  }
+            identifier: ''
+            label: ''
+            multiple: '0'
+            optional: '1'
+            remember: '0'
+            widget: select
+          group_type: group
+          id: promote
+          is_grouped: '0'
+          operator: '='
+          relationship: none
+          table: node
+          value: '1'
+        status:
+          expose:
+            operator: '0'
+          field: status
+          group: '1'
+          id: status
+          table: node
+          value: '1'
+      pager:
+        options:
+          items_per_page: '10'
+        type: full
+      query:
+        type: views_query
+      row:
+        options:
+          build_mode: teaser
+          comments: '0'
+          links: '1'
+        type: node
+      sorts:
+        created:
+          field: created
+          id: created
+          order: DESC
+          table: node
+        sticky:
+          admin_label: ''
+          expose:
+            label: ''
+          exposed: '0'
+          field: sticky
+          group_type: group
+          id: sticky
+          order: ASC
+          relationship: none
+          table: node
+      style:
+        type: default
+      title: ''
+    display_plugin: default
+    display_title: Master
+    id: default
+    position: {  }
+  page_1:
+    display_options:
+      path: node
+    display_plugin: page
+    display_title: Page
+    id: page_1
+    position: {  }
+human_name: Frontpage
+langcode: und
+module: node
+name: frontpage
+tag: ''
diff --git a/core/modules/node/lib/Drupal/node/Plugin/views/area/ListingEmpty.php b/core/modules/node/lib/Drupal/node/Plugin/views/area/ListingEmpty.php
new file mode 100644
index 0000000..cf09beb
--- /dev/null
+++ b/core/modules/node/lib/Drupal/node/Plugin/views/area/ListingEmpty.php
@@ -0,0 +1,44 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\node\Plugin\views\area\LinkAdd.
+ */
+
+namespace Drupal\node\Plugin\views\area;
+
+use Drupal\Core\Annotation\Plugin;
+use Drupal\views\Plugin\views\area\AreaPluginBase;
+
+/**
+ * Defines an area plugin to display a node/add link.
+ *
+ * @ingroup views_area_handlers
+ *
+ * @Plugin(
+ *   id = "node_listing_empty",
+ *   module = "node"
+ * )
+ */
+class ListingEmpty extends AreaPluginBase {
+
+  /**
+   * Implements Drupal\views\Plugin\views\area\AreaPluginBase::LinkAdd().
+   */
+  function render($empty = FALSE) {
+    if (!$empty || !empty($this->options['empty'])) {
+      $element = array(
+        '#theme' => 'links',
+        '#links' => array(
+          array(
+            'href' => 'node/add',
+            'title' => t('Add new content')
+          )
+        ) ,
+        '#access' => _node_add_access()
+      );
+      return drupal_render($element);
+    }
+  }
+
+}
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeLoadMultipleTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeLoadMultipleTest.php
index 25cb01d..ad37c69 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeLoadMultipleTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeLoadMultipleTest.php
@@ -12,6 +12,13 @@
  */
 class NodeLoadMultipleTest extends NodeTestBase {
 
+  /**
+   * Enable Views to test the frontpage against node_load_multiple() results.
+   *
+   * @var array
+   */
+  public static $modules = array('views');
+
   public static function getInfo() {
     return array(
       'name' => 'Load multiple nodes',
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTitleTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTitleTest.php
index e657d76..e03e4b0 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTitleTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTitleTest.php
@@ -17,7 +17,7 @@ class NodeTitleTest extends NodeTestBase {
    *
    * @var array
    */
-  public static $modules = array('comment');
+  public static $modules = array('comment', 'views');
 
   protected $admin_user;
 
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index bdfae92..c3c85aa 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -1675,13 +1675,6 @@ function node_menu() {
     'access arguments' => array('administer content types'),
     'file' => 'content_types.inc',
   );
-
-  $items['node'] = array(
-    'page callback' => 'node_page_default',
-    'access arguments' => array('access content'),
-    'menu_name' => 'tools',
-    'type' => MENU_CALLBACK,
-  );
   $items['node/add'] = array(
     'title' => 'Add content',
     'page callback' => 'node_add_page',
@@ -2315,62 +2308,6 @@ function node_view_multiple($nodes, $view_mode = 'teaser', $langcode = NULL) {
 }
 
 /**
- * Page callback: Generates a listing of promoted nodes.
- *
- * @return array
- *   An array in the format expected by drupal_render().
- *
- * @see node_menu()
- */
-function node_page_default() {
-  $site_config = config('system.site');
-  $select = db_select('node', 'n')
-    ->fields('n', array('nid', 'sticky', 'created'))
-    ->condition('n.promote', 1)
-    ->condition('n.status', 1)
-    ->orderBy('n.sticky', 'DESC')
-    ->orderBy('n.created', 'DESC')
-    ->extend('Drupal\Core\Database\Query\PagerSelectExtender')
-    ->limit(config('node.settings')->get('items_per_page'))
-    ->addTag('node_access');
-
-  $nids = $select->execute()->fetchCol();
-
-  if (!empty($nids)) {
-    $nodes = node_load_multiple($nids);
-    $build['nodes'] = node_view_multiple($nodes);
-
-    // 'rss.xml' is a path, not a file, registered in node_menu().
-    drupal_add_feed('rss.xml', $site_config->get('name') . ' ' . t('RSS'));
-    $build['pager'] = array(
-      '#theme' => 'pager',
-      '#weight' => 5,
-    );
-    drupal_set_title('');
-  }
-  else {
-    drupal_set_title(t('Welcome to @site-name', array('@site-name' => $site_config->get('name'))), PASS_THROUGH);
-
-    $default_message = '<p>' . t('No front page content has been created yet.') . '</p>';
-
-    $default_links = array();
-    if (_node_add_access()) {
-      $default_links[] = l(t('Add new content'), 'node/add');
-    }
-    if (!empty($default_links)) {
-      $default_message .= theme('item_list', array('items' => $default_links));
-    }
-
-    $build['default_message'] = array(
-      '#markup' => $default_message,
-      '#prefix' => '<div id="first-time">',
-      '#suffix' => '</div>',
-    );
-  }
-  return $build;
-}
-
-/**
  * Page callback: Displays a single node.
  *
  * @param Drupal\node\Node $node
diff --git a/core/modules/node/node.views.inc b/core/modules/node/node.views.inc
index 3a396bb..5bc7849 100644
--- a/core/modules/node/node.views.inc
+++ b/core/modules/node/node.views.inc
@@ -416,6 +416,14 @@ function node_views_data() {
     ),
   );
 
+  $data['node']['node_listing_empty'] = array(
+    'title' => t('Empty Node Frontpage behavior'),
+    'help' => t('Provides a link to the node add overview page.'),
+    'area' => array(
+      'id' => 'node_listing_empty',
+    ),
+  );
+
   // Content revision table
 
   // Define the base group of this table. Fields that don't
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php
index ac11b8f..bd11d53 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/DrupalUnitTestBase.php
@@ -8,6 +8,7 @@
 namespace Drupal\simpletest;
 
 use Drupal\Core\DrupalKernel;
+use Symfony\Component\DependencyInjection\Reference;
 use Drupal\Core\Database\Database;
 use Symfony\Component\DependencyInjection\ContainerInterface;
 
@@ -128,6 +129,11 @@ public function containerBuild($container) {
     $conf['keyvalue_default'] = 'keyvalue.memory';
     $container
       ->register('keyvalue.memory', 'Drupal\Core\KeyValueStore\KeyValueMemoryFactory');
+    if (!$container->has('keyvalue')) {
+      $container
+        ->register('keyvalue', 'Drupal\Core\KeyValueStore\KeyValueFactory')
+        ->addArgument(new Reference('service_container'));
+    }
   }
 
   /**
diff --git a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
index 60a9a77..73fba95 100644
--- a/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
+++ b/core/modules/simpletest/lib/Drupal/simpletest/TestBase.php
@@ -8,6 +8,7 @@
 namespace Drupal\simpletest;
 
 use Drupal\Core\Database\Database;
+use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\Core\Database\ConnectionNotDefinedException;
 use Drupal\Core\DrupalKernel;
 use ReflectionMethod;
@@ -819,7 +820,7 @@ protected function prepareEnvironment() {
     $this->originalContainer = clone drupal_container();
     $this->originalLanguage = $language_interface;
     $this->originalConfigDirectories = $GLOBALS['config_directories'];
-    $this->originalThemeKey = $GLOBALS['theme_key'];
+    $this->originalThemeKey = isset($GLOBALS['theme_key']) ? $GLOBALS['theme_key'] : NULL;
     $this->originalTheme = $GLOBALS['theme'];
 
     // Save further contextual information.
@@ -873,7 +874,8 @@ protected function prepareEnvironment() {
     }
 
     // Reset and create a new service container.
-    $this->container = drupal_container(NULL, TRUE);
+    $this->container = new ContainerBuilder();
+    drupal_container($this->container);
 
     // Unset globals.
     unset($GLOBALS['theme_key']);
@@ -906,9 +908,6 @@ protected function prepareEnvironment() {
    *   enabled modules to be immediately available in the same request.
    */
   protected function rebuildContainer() {
-    // DrupalKernel expects to merge a fresh bootstrap container, not remerge
-    // what is left over from a prior container build.
-    drupal_container(NULL, TRUE);
     // Create a new DrupalKernel for testing purposes, now that all required
     // modules have been enabled. This also stores a new dependency injection
     // container in drupal_container(). Drupal\simpletest\TestBase::tearDown()
@@ -966,11 +965,13 @@ protected function tearDown() {
     // In case a fatal error occurred that was not in the test process read the
     // log to pick up any fatal errors.
     simpletest_log_read($this->testId, $this->databasePrefix, get_class($this), TRUE);
-    $captured_emails = state()->get('system.test_email_collector') ?: array();
-    $emailCount = count($captured_emails);
-    if ($emailCount) {
-      $message = format_plural($emailCount, '1 e-mail was sent during this test.', '@count e-mails were sent during this test.');
-      $this->pass($message, t('E-mail'));
+    if (($container = drupal_container()) && $container->has('keyvalue')) {
+      $captured_emails = state()->get('system.test_email_collector') ?: array();
+      $emailCount = count($captured_emails);
+      if ($emailCount) {
+        $message = format_plural($emailCount, '1 e-mail was sent during this test.', '@count e-mails were sent during this test.');
+        $this->pass($message, t('E-mail'));
+      }
     }
 
     // Delete temporary files directory.
@@ -985,7 +986,9 @@ protected function tearDown() {
     $databases['default']['default'] = $connection_info['default'];
 
     // Restore original globals.
-    $GLOBALS['theme_key'] = $this->originalThemeKey;
+    if (isset($this->originalThemeKey)) {
+      $GLOBALS['theme_key'] = $this->originalThemeKey;
+    }
     $GLOBALS['theme'] = $this->originalTheme;
 
     // Reset all static variables.
diff --git a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php
index 32705bf..27ea1d7 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Bootstrap/GetFilenameUnitTest.php
@@ -22,24 +22,13 @@ public static function getInfo() {
     );
   }
 
-  function setUp() {
-    parent::setUp();
-
-    // Remove the keyvalue service definition, since this test wants to verify
-    // the filesystem scan fallback of drupal_get_filename().
-    $this->keyvalue_definition = $this->container->getDefinition('keyvalue');
-    $this->container->removeDefinition('keyvalue');
-  }
-
-  function tearDown() {
-    $this->container->setDefinition('keyvalue', $this->keyvalue_definition);
-    parent::tearDown();
-  }
-
   /**
    * Tests that drupal_get_filename() works when the file is not in database.
    */
   function testDrupalGetFilename() {
+    // Assert that the test is meaningful by making sure the keyvalue service
+    // does not exist.
+    $this->assertFalse(drupal_container()->has('keyvalue'), 'The container has no keyvalue service.');
     // Retrieving the location of a module.
     $this->assertIdentical(drupal_get_filename('module', 'php'), 'core/modules/php/php.module', 'Retrieve module location.');
 
diff --git a/core/modules/system/lib/Drupal/system/Tests/DrupalKernel/DrupalKernelTest.php b/core/modules/system/lib/Drupal/system/Tests/DrupalKernel/DrupalKernelTest.php
index c313d82..b859c16 100644
--- a/core/modules/system/lib/Drupal/system/Tests/DrupalKernel/DrupalKernelTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/DrupalKernel/DrupalKernelTest.php
@@ -30,11 +30,6 @@ public static function getInfo() {
    * Tests DIC compilation.
    */
   function testCompileDIC() {
-    // Because we'll be instantiating a new kernel during this test, the
-    // container stored in drupal_container() will be updated as a side effect.
-    // We need to be able to restore it to the correct one at the end of this
-    // test.
-    $original_container = drupal_container();
     $classloader = drupal_classloader();
     global $conf;
     $conf['php_storage']['service_container']= array(
@@ -63,9 +58,6 @@ function testCompileDIC() {
       !$refClass->isSubclassOf('Symfony\Component\DependencyInjection\ContainerBuilder');
     $this->assertTrue($is_compiled_container);
 
-    // Reset the container.
-    drupal_container(NULL, TRUE);
-
     // Now use the read-only storage implementation, simulating a "production"
     // environment.
     $conf['php_storage']['service_container']['class'] = 'Drupal\Component\PhpStorage\FileReadOnlyStorage';
@@ -89,9 +81,6 @@ function testCompileDIC() {
     // modules.
     $this->assertFalse($container->has('bundle_test_class'));
 
-    // Reset the container.
-    drupal_container(NULL, TRUE);
-
     // Add another module so that we can test that the new module's bundle is
     // registered to the new container.
     $module_enabled['bundle_test'] = 'bundle_test';
@@ -113,8 +102,5 @@ function testCompileDIC() {
     $classloader = $container->get('class_loader');
     $refClass = new ReflectionClass($classloader);
     $this->assertTrue($refClass->hasMethod('getNamespaces'), 'Container has a classloader');
-
-    // Restore the original container.
-    drupal_container($original_container);
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UpgradePathTestBase.php b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UpgradePathTestBase.php
index 21998e2..a62eb90 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Upgrade/UpgradePathTestBase.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Upgrade/UpgradePathTestBase.php
@@ -134,6 +134,7 @@ protected function setUp() {
     $this->variable_set('site_mail', 'simpletest@example.com');
 
     drupal_set_time_limit($this->timeLimit);
+    $this->rebuildContainer();
     $this->setup = TRUE;
   }
 
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index d7ceb4d..48ca850 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -2241,6 +2241,16 @@ function system_update_8037() {
 }
 
 /**
+ * Enable Views if the node listing is set as the front page.
+ */
+function system_update_8038() {
+  $front_page = config('system.site')->get('page.front');
+  if (!isset($front_page) || $front_page == 'node') {
+    update_module_enable(array('views'));
+  }
+}
+
+/**
  * @} End of "defgroup updates-7.x-to-8.x".
  * The next series of updates should start at 9000.
  */
diff --git a/core/modules/views/config/views.view.frontpage.yml b/core/modules/views/config/views.view.frontpage.yml
deleted file mode 100644
index a635a0e..0000000
--- a/core/modules/views/config/views.view.frontpage.yml
+++ /dev/null
@@ -1,95 +0,0 @@
-disabled: true
-api_version: '3.0'
-module: node
-name: frontpage
-description: 'Emulates the default Drupal front page; you may set the default home page path to this view to make it your front page.'
-tag: default
-base_table: node
-human_name: 'Front page'
-core: '8'
-display:
-  default:
-    id: default
-    display_title: Master
-    display_plugin: default
-    position: '1'
-    display_options:
-      query:
-        type: views_query
-        options:
-          query_comment: false
-      access:
-        type: none
-      cache:
-        type: none
-      exposed_form:
-        type: basic
-      pager:
-        type: full
-      style:
-        type: default
-      row:
-        type: node
-        options:
-          links: 1
-      sorts:
-        sticky:
-          id: sticky
-          table: node
-          field: sticky
-          order: DESC
-        created:
-          id: created
-          table: node
-          field: created
-          order: DESC
-      filters:
-        promote:
-          id: promote
-          table: node
-          field: promote
-          value: '1'
-          group: 0
-          expose:
-            operator: false
-        status:
-          id: status
-          table: node
-          field: status
-          value: '1'
-          group: 0
-          expose:
-            operator: false
-  page_1:
-    id: page_1
-    display_title: Page
-    display_plugin: page
-    position: '2'
-    display_options:
-      query:
-        type: views_query
-        options: {  }
-      path: frontpage
-  feed_1:
-    id: feed_1
-    display_title: Feed
-    display_plugin: feed
-    position: '3'
-    display_options:
-      query:
-        type: views_query
-        options: {  }
-      defaults:
-        title: false
-      title: 'Front page feed'
-      pager:
-        type: some
-      style:
-        type: rss
-      row:
-        type: node_rss
-      path: rss.xml
-      displays:
-        default: default
-        page: page
-      sitename_title: '1'
diff --git a/core/modules/views/lib/Drupal/views/Plugin/views/area/AreaPluginBase.php b/core/modules/views/lib/Drupal/views/Plugin/views/area/AreaPluginBase.php
index a757bcf..28259a9 100644
--- a/core/modules/views/lib/Drupal/views/Plugin/views/area/AreaPluginBase.php
+++ b/core/modules/views/lib/Drupal/views/Plugin/views/area/AreaPluginBase.php
@@ -151,9 +151,7 @@ public function query() { }
   /**
    * Render the area
    */
-  function render($empty = FALSE) {
-    return '';
-  }
+  abstract function render($empty = FALSE);
 
   /**
    * Area handlers shouldn't have groupby.
diff --git a/core/modules/views/lib/Drupal/views/Tests/AnalyzeTest.php b/core/modules/views/lib/Drupal/views/Tests/AnalyzeTest.php
index f5497f2..804bce8 100644
--- a/core/modules/views/lib/Drupal/views/Tests/AnalyzeTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/AnalyzeTest.php
@@ -39,10 +39,8 @@ public function setUp() {
    */
   function testAnalyzeBasic() {
     $this->drupalLogin($this->admin);
-    // Enable the frontpage view and click the analyse button.
-    $view = views_get_view('frontpage');
 
-    $this->drupalGet('admin/structure/views/view/frontpage/edit');
+    $this->drupalGet('admin/structure/views/view/test_view/edit');
     $this->assertLink(t('analyze view'));
 
     // This redirects the user to the form.
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/AreaTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/AreaTest.php
index ff50f64..0ac4326 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/AreaTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/AreaTest.php
@@ -131,7 +131,7 @@ public function testTitleArea() {
 
     $view->storage->enable();
 
-    $this->drupalGet('frontpage');
+    $this->drupalGet('node');
     $this->assertText('Overridden title', 'Overridden title found.');
   }
 
diff --git a/core/modules/views/lib/Drupal/views/Tests/Handler/RelationshipTest.php b/core/modules/views/lib/Drupal/views/Tests/Handler/RelationshipTest.php
index 5358eda..5531b27 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Handler/RelationshipTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Handler/RelationshipTest.php
@@ -7,12 +7,14 @@
 
 namespace Drupal\views\Tests\Handler;
 
+use Drupal\views\Tests\Plugin\RelationshipJoinTestBase;
+
 /**
  * Tests the base relationship handler.
  *
  * @see Drupal\views\Plugin\views\relationship\RelationshipPluginBase
  */
-class RelationshipTest extends HandlerTestBase {
+class RelationshipTest extends RelationshipJoinTestBase {
 
   /**
    * Maps between the key in the expected result and the query result.
@@ -32,57 +34,6 @@ public static function getInfo() {
     );
   }
 
-  protected function setUp() {
-    parent::setUp();
-
-    $this->enableViewsTestModule();
-  }
-
-
-  /**
-   * Overrides Drupal\views\Tests\ViewTestBase::schemaDefinition().
-   *
-   * Adds a uid column to test the relationships.
-   *
-   * @return array
-   */
-  protected function schemaDefinition() {
-    $schema = parent::schemaDefinition();
-
-    $schema['views_test_data']['fields']['uid'] = array(
-      'description' => "The {users}.uid of the author of the beatle entry.",
-      'type' => 'int',
-      'unsigned' => TRUE,
-      'not null' => TRUE,
-      'default' => 0
-    );
-
-    return $schema;
-  }
-
-
-  /**
-   * Overrides Drupal\views\Tests\ViewTestBase::viewsData().
-   *
-   * Adds a relationship for the uid column.
-   *
-   * @return array
-   */
-  protected function viewsData() {
-    $data = parent::viewsData();
-    $data['views_test_data']['uid'] = array(
-      'title' => t('UID'),
-      'help' => t('The test data UID'),
-      'relationship' => array(
-        'id' => 'standard',
-        'base' => 'users',
-        'base field' => 'uid'
-      )
-    );
-
-    return $data;
-  }
-
   /**
    * Tests the query result of a view with a relationship.
    */
diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayTest.php
index b071b9e..ae3cbe2 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/DisplayTest.php
@@ -49,7 +49,7 @@ public function setUp() {
    * @see Drupal\views_test_data\Plugin\views\display\DisplayTest
    */
   function testDisplayPlugin() {
-    $view = views_get_view('frontpage');
+    $view = views_get_view('test_view');
 
     // Add a new 'display_test' display and test it's there.
     $view->storage->addDisplay('display_test');
@@ -88,7 +88,7 @@ function testDisplayPlugin() {
     $this->assertTrue(strpos($output, '<h1>Test option title</h1>') !== FALSE, 'The test_option value found in display output title.');
 
     // Test that the display category/summary is in the UI.
-    $this->drupalGet('admin/structure/views/view/frontpage/edit/display_test_1');
+    $this->drupalGet('admin/structure/views/view/test_view/edit/display_test_1');
     $this->assertText('Display test settings');
 
     $this->clickLink('Test option title');
@@ -97,7 +97,7 @@ function testDisplayPlugin() {
     $this->drupalPost(NULL, array('test_option' => $this->randomString), t('Apply'));
 
     // Check the new value has been saved by checking the UI summary text.
-    $this->drupalGet('admin/structure/views/view/frontpage/edit/display_test_1');
+    $this->drupalGet('admin/structure/views/view/test_view/edit/display_test_1');
     $this->assertRaw($this->randomString);
 
     // Test the enable/disable status of a display.
diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/JoinTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/JoinTest.php
index 8430a45..a8948e0 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Plugin/JoinTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/JoinTest.php
@@ -13,8 +13,11 @@
 
 /**
  * Tests a generic join plugin and the join plugin base.
+ *
+ * @see \Drupal\views_test_data\Plugin\views\join\JoinTest
+ * @see \Drupal\views\Plugin\views\join\JoinPluginBase
  */
-class JoinTest extends PluginTestBase {
+class JoinTest extends RelationshipJoinTestBase {
 
   /**
    * A plugin manager which handlers the instances of joins.
@@ -45,12 +48,12 @@ protected function setUp() {
   public function testExamplePlugin() {
 
     // Setup a simple join and test the result sql.
-    $view = views_get_view('frontpage');
+    $view = views_get_view('test_view');
     $view->initDisplay();
     $view->initQuery();
 
     $configuration = array(
-      'left_table' => 'node',
+      'left_table' => 'views_test_data',
       'left_field' => 'uid',
       'table' => 'users',
       'field' => 'uid',
@@ -61,14 +64,14 @@ public function testExamplePlugin() {
     $rand_int = rand(0, 1000);
     $join->setJoinValue($rand_int);
 
-    $query = db_select('node');
+    $query = db_select('views_test_data');
     $table = array('alias' => 'users');
     $join->buildJoin($query, $table, $view->query);
 
     $tables = $query->getTables();
     $join_info = $tables['users'];
-    debug($join_info);
-    $this->assertTrue(strpos($join_info['condition'], "node.uid = $rand_int") !== FALSE, 'Make sure that the custom join plugin can extend the join base and alter the result.');
+    debug($join_info['condition']);
+    $this->assertTrue(strpos($join_info['condition'], "views_test_data.uid = $rand_int") !== FALSE, 'Make sure that the custom join plugin can extend the join base and alter the result.');
   }
 
   /**
@@ -77,14 +80,14 @@ public function testExamplePlugin() {
   public function testBasePlugin() {
 
     // Setup a simple join and test the result sql.
-    $view = views_get_view('frontpage');
+    $view = views_get_view('test_view');
     $view->initDisplay();
     $view->initQuery();
 
     // First define a simple join without an extra condition.
     // Set the various options on the join object.
     $configuration = array(
-      'left_table' => 'node',
+      'left_table' => 'views_test_data',
       'left_field' => 'uid',
       'table' => 'users',
       'field' => 'uid',
@@ -97,7 +100,7 @@ public function testBasePlugin() {
 
     // Build the actual join values and read them back from the dbtng query
     // object.
-    $query = db_select('node');
+    $query = db_select('views_test_data');
     $table = array('alias' => 'users');
     $join->buildJoin($query, $table, $view->query);
 
@@ -106,7 +109,7 @@ public function testBasePlugin() {
     $this->assertEqual($join_info['join type'], 'LEFT', 'Make sure the default join type is LEFT');
     $this->assertEqual($join_info['table'], $configuration['table']);
     $this->assertEqual($join_info['alias'], 'users');
-    $this->assertEqual($join_info['condition'], 'node.uid = users.uid');
+    $this->assertEqual($join_info['condition'], 'views_test_data.uid = users.uid');
 
     // Set a different alias and make sure table info is as expected.
     $join = $this->manager->createInstance('standard', $configuration);
diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/PagerTest.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/PagerTest.php
index 6aa64c5..599b9e8 100644
--- a/core/modules/views/lib/Drupal/views/Tests/Plugin/PagerTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/PagerTest.php
@@ -37,13 +37,16 @@ public function testStorePagerSettings() {
     $this->drupalLogin($admin_user);
     // Test behaviour described in http://drupal.org/node/652712#comment-2354918.
 
-    $this->drupalGet('admin/structure/views/view/frontpage/edit');
-
+    $this->drupalGet('admin/structure/views/view/test_view/edit');
 
     $edit = array(
+      'pager[type]' => 'full',
+    );
+    $this->drupalPost('admin/structure/views/nojs/display/test_view/default/pager', $edit, t('Apply'));
+    $edit = array(
       'pager_options[items_per_page]' => 20,
     );
-    $this->drupalPost('admin/structure/views/nojs/display/frontpage/default/pager_options', $edit, t('Apply'));
+    $this->drupalPost('admin/structure/views/nojs/display/test_view/default/pager_options', $edit, t('Apply'));
     $this->assertText('20 items');
 
     // Change type and check whether the type is new type is stored.
@@ -51,8 +54,8 @@ public function testStorePagerSettings() {
     $edit = array(
       'pager[type]' => 'mini',
     );
-    $this->drupalPost('admin/structure/views/nojs/display/frontpage/default/pager', $edit, t('Apply'));
-    $this->drupalGet('admin/structure/views/view/frontpage/edit');
+    $this->drupalPost('admin/structure/views/nojs/display/test_view/default/pager', $edit, t('Apply'));
+    $this->drupalGet('admin/structure/views/view/test_view/edit');
     $this->assertText('Mini', 'Changed pager plugin, should change some text');
 
     // Test behaviour described in http://drupal.org/node/652712#comment-2354400
diff --git a/core/modules/views/lib/Drupal/views/Tests/Plugin/RelationshipJoinTestBase.php b/core/modules/views/lib/Drupal/views/Tests/Plugin/RelationshipJoinTestBase.php
new file mode 100644
index 0000000..2d5b444
--- /dev/null
+++ b/core/modules/views/lib/Drupal/views/Tests/Plugin/RelationshipJoinTestBase.php
@@ -0,0 +1,67 @@
+<?php
+
+/**
+ * @file
+ * Contains Drupal\views\Tests\Plugin\RelationshipJoinTestBase.
+ */
+
+namespace Drupal\views\Tests\Plugin;
+
+/**
+ * Provies a base class for a testing a relationship.
+ *
+ * @see \Drupal\views\Tests\Handler\JoinTest
+ * @see \Drupal\views\Tests\Plugin\RelationshipTest
+ */
+abstract class RelationshipJoinTestBase extends PluginTestBase {
+
+  protected function setUp() {
+    parent::setUp();
+
+    $this->enableViewsTestModule();
+  }
+
+  /**
+   * Overrides Drupal\views\Tests\ViewTestBase::schemaDefinition().
+   *
+   * Adds a uid column to test the relationships.
+   *
+   * @return array
+   */
+  protected function schemaDefinition() {
+    $schema = parent::schemaDefinition();
+
+    $schema['views_test_data']['fields']['uid'] = array(
+      'description' => "The {users}.uid of the author of the beatle entry.",
+      'type' => 'int',
+      'unsigned' => TRUE,
+      'not null' => TRUE,
+      'default' => 0
+    );
+
+    return $schema;
+  }
+
+  /**
+   * Overrides Drupal\views\Tests\ViewTestBase::viewsData().
+   *
+   * Adds a relationship for the uid column.
+   *
+   * @return array
+   */
+  protected function viewsData() {
+    $data = parent::viewsData();
+    $data['views_test_data']['uid'] = array(
+      'title' => t('UID'),
+      'help' => t('The test data UID'),
+      'relationship' => array(
+        'id' => 'standard',
+        'base' => 'users',
+        'base field' => 'uid'
+      )
+    );
+
+    return $data;
+  }
+
+}
diff --git a/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php b/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php
index 590bc6e..53efdc2 100644
--- a/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/UI/DefaultViewsTest.php
@@ -26,7 +26,7 @@ public static function getInfo() {
   function testDefaultViews() {
     // Make sure the front page view starts off as disabled (does not appear on
     // the listing page).
-    $edit_href = 'admin/structure/views/view/frontpage/edit';
+    $edit_href = 'admin/structure/views/view/glossary/edit';
     $this->drupalGet('admin/structure/views');
     // @todo Disabled default views do now appear on the front page. Test this
     // behavior with templates instead.
@@ -35,23 +35,23 @@ function testDefaultViews() {
     // Enable the front page view, and make sure it is now visible on the main
     // listing page.
     $this->drupalGet('admin/structure/views/templates');
-    $this->clickViewsOperationLink(t('Enable'), '/frontpage/');
+    $this->clickViewsOperationLink(t('Enable'), '/glossary/');
     $this->assertUrl('admin/structure/views');
     $this->assertLinkByHref($edit_href);
 
     // It should not be possible to revert the view yet.
     // @todo Figure out how to handle this with the new configuration system.
     // $this->assertNoLink(t('Revert'));
-    // $revert_href = 'admin/structure/views/view/frontpage/revert';
+    // $revert_href = 'admin/structure/views/view/glossary/revert';
     // $this->assertNoLinkByHref($revert_href);
 
     // Edit the view and change the title. Make sure that the new title is
     // displayed.
     $new_title = $this->randomName(16);
     $edit = array('title' => $new_title);
-    $this->drupalPost('admin/structure/views/nojs/display/frontpage/page_1/title', $edit, t('Apply'));
-    $this->drupalPost('admin/structure/views/view/frontpage/edit/page_1', array(), t('Save'));
-    $this->drupalGet('frontpage');
+    $this->drupalPost('admin/structure/views/nojs/display/glossary/page_1/title', $edit, t('Apply'));
+    $this->drupalPost('admin/structure/views/view/glossary/edit/page_1', array(), t('Save'));
+    $this->drupalGet('glossary');
     $this->assertResponse(200);
     $this->assertText($new_title);
 
@@ -70,7 +70,7 @@ function testDefaultViews() {
     // $this->assertLink(t('Revert'));
     // $this->assertLinkByHref($revert_href);
     // $this->drupalPost($revert_href, array(), t('Revert'));
-    // $this->drupalGet('frontpage');
+    // $this->drupalGet('glossary');
     // $this->assertNoText($new_title);
 
     // Clone the view and check that the normal schema of cloned views is used.
@@ -79,7 +79,7 @@ function testDefaultViews() {
     $edit = array(
       'name' => 'clone_of_frontpage',
     );
-    $this->assertTitle(t('Clone of @human_name | @site-name', array('@human_name' => 'Front page', '@site-name' => config('system.site')->get('name'))));
+    $this->assertTitle(t('Clone of @human_name | @site-name', array('@human_name' => 'Frontpage', '@site-name' => config('system.site')->get('name'))));
     $this->drupalPost(NULL, $edit, t('Clone'));
     $this->assertUrl('admin/structure/views/view/clone_of_frontpage/edit', array(), 'The normal cloning name schema is applied.');
 
@@ -95,19 +95,19 @@ function testDefaultViews() {
     // listing page.
     // @todo Test this behavior with templates instead.
     $this->drupalGet('admin/structure/views');
-    $this->clickViewsOperationLink(t('Disable'), '/frontpage/');
+    $this->clickViewsOperationLink(t('Disable'), '/glossary/');
     // $this->assertUrl('admin/structure/views');
     // $this->assertNoLinkByHref($edit_href);
     // The easiest way to verify it appears on the disabled views listing page
     // is to try to click the "enable" link from there again.
     $this->drupalGet('admin/structure/views/templates');
-    $this->clickViewsOperationLink(t('Enable'), '/frontpage/');
+    $this->clickViewsOperationLink(t('Enable'), '/glossary/');
     $this->assertUrl('admin/structure/views');
     $this->assertLinkByHref($edit_href);
 
     // Test deleting a view.
     $this->drupalGet('admin/structure/views');
-    $this->clickViewsOperationLink(t('Delete'), '/frontpage/');
+    $this->clickViewsOperationLink(t('Delete'), '/glossary/');
     // Submit the confirmation form.
     $this->drupalPost(NULL, array(), t('Delete'));
     // Ensure the view is no longer listed.
@@ -158,7 +158,7 @@ function testSplitListing() {
    * @param $unique_href_part
    *   A unique string that is expected to occur within the href of the desired
    *   link. For example, if the link URL is expected to look like
-   *   "admin/structure/views/view/frontpage/...", then "/frontpage/" could be
+   *   "admin/structure/views/view/glossary/...", then "/glossary/" could be
    *   passed as the expected unique string.
    *
    * @return
diff --git a/core/modules/views/lib/Drupal/views/Tests/ViewStorageTest.php b/core/modules/views/lib/Drupal/views/Tests/ViewStorageTest.php
index 8408aa4..bf1b6aa 100644
--- a/core/modules/views/lib/Drupal/views/Tests/ViewStorageTest.php
+++ b/core/modules/views/lib/Drupal/views/Tests/ViewStorageTest.php
@@ -142,7 +142,7 @@ protected function loadTests() {
     $this->assertIdentical(array_keys($all_configuration_entities), array_map($prefix_map, $all_config), 'All loaded elements match.');
 
     // Make sure that loaded default views get a UUID.
-    $view = views_get_view('frontpage');
+    $view = views_get_view('glossary');
     $this->assertTrue($view->storage->uuid());
   }
 
diff --git a/core/modules/views/tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/join/JoinTest.php b/core/modules/views/tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/join/JoinTest.php
index 5d0cb73..48060f0 100644
--- a/core/modules/views/tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/join/JoinTest.php
+++ b/core/modules/views/tests/views_test_data/lib/Drupal/views_test_data/Plugin/views/join/JoinTest.php
@@ -51,7 +51,7 @@ public function setJoinValue($join_value) {
    */
   public function buildJoin($select_query, $table, $view_query) {
     // Add an additional hardcoded condition to the query.
-    $this->extra = 'node.uid = ' . $this->getJoinValue();
+    $this->extra = 'views_test_data.uid = ' . $this->getJoinValue();
     parent::buildJoin($select_query, $table, $view_query);
   }
 
diff --git a/core/profiles/minimal/minimal.install b/core/profiles/minimal/minimal.install
index 4e42e6d..eaf42b3 100644
--- a/core/profiles/minimal/minimal.install
+++ b/core/profiles/minimal/minimal.install
@@ -53,9 +53,6 @@ function minimal_install() {
   }
   $query->execute();
 
-  // Set front page to "node".
-  config('system.site')->set('page.front', 'node')->save();
-
   // Allow visitor account creation, but with administrative approval.
   config('user.settings')->set('register', USER_REGISTER_VISITORS_ADMINISTRATIVE_APPROVAL)->save();
 
diff --git a/core/update.php b/core/update.php
index b65e90b..26ce546 100644
--- a/core/update.php
+++ b/core/update.php
@@ -464,20 +464,6 @@ function update_check_requirements($skip_warnings = FALSE) {
 drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);
 drupal_maintenance_theme();
 
-// @todo Remove after converting update.php to use DrupalKernel.
-$container = drupal_container();
-$container->register('database', 'Drupal\Core\Database\Connection')
-  ->setFactoryClass('Drupal\Core\Database\Database')
-  ->setFactoryMethod('getConnection')
-  ->addArgument('default');
-$container->register('lock', 'Drupal\Core\Lock\DatabaseLockBackend');
-$container->register('router.dumper', '\Drupal\Core\Routing\MatcherDumper')
-  ->addArgument(new Reference('database'));
-$container->register('router.builder', 'Drupal\Core\Routing\RouteBuilder')
-  ->addArgument(new Reference('router.dumper'))
-  ->addArgument(new Reference('lock'))
-  ->addArgument(new Reference('dispatcher'));
-
 // Turn error reporting back on. From now on, only fatal errors (which are
 // not passed through the error handler) will cause a message to be printed.
 ini_set('display_errors', TRUE);
diff --git a/index.php b/index.php
index 0822769..98bcddb 100644
--- a/index.php
+++ b/index.php
@@ -30,6 +30,11 @@
 // @todo Figure out how best to handle the Kernel constructor parameters.
 $kernel = new DrupalKernel('prod', FALSE, drupal_classloader());
 
+// @todo Remove this once everything in the bootstrap has been
+//   converted to services in the DIC.
+$kernel->boot();
+drupal_bootstrap(DRUPAL_BOOTSTRAP_CODE);
+
 // Create a request object from the HTTPFoundation.
 $request = Request::createFromGlobals();
 $response = $kernel->handle($request)->prepare($request)->send();
