diff --git a/core/lib/Drupal/Core/Extension/Extension.php b/core/lib/Drupal/Core/Extension/Extension.php
index 3c765fe..e1e9b3d 100644
--- a/core/lib/Drupal/Core/Extension/Extension.php
+++ b/core/lib/Drupal/Core/Extension/Extension.php
@@ -166,8 +166,9 @@ class Extension implements \Serializable {
    * Serializes the Extension object in the most optimized way.
    */
   public function serialize() {
+    // Don't serialize the app root, since this could change if the install is
+    // moved..
     $data = array(
-      'root' => $this->root,
       'type' => $this->type,
       'pathname' => $this->pathname,
       'filename' => $this->filename,
@@ -188,7 +189,8 @@ class Extension implements \Serializable {
    */
   public function unserialize($data) {
     $data = unserialize($data);
-    $this->root = $data['root'];
+    // Get the app root from the container.
+    $this->root = DRUPAL_ROOT;
     $this->type = $data['type'];
     $this->pathname = $data['pathname'];
     $this->filename = $data['filename'];
diff --git a/core/lib/Drupal/Core/Update/UpdateKernel.php b/core/lib/Drupal/Core/Update/UpdateKernel.php
index 6c5de73..de7da1b 100755
--- a/core/lib/Drupal/Core/Update/UpdateKernel.php
+++ b/core/lib/Drupal/Core/Update/UpdateKernel.php
@@ -10,10 +10,13 @@ namespace Drupal\Core\Update;
 use Drupal\Core\DrupalKernel;
 use Drupal\Core\Session\AnonymousUserSession;
 use Drupal\Core\Site\Settings;
+use Drupal\system\Tests\Routing\MockRouteProvider;
 use Symfony\Cmf\Component\Routing\RouteObjectInterface;
 use Symfony\Component\HttpFoundation\ParameterBag;
 use Symfony\Component\HttpFoundation\Request;
 use Symfony\Component\HttpKernel\Exception\AccessDeniedHttpException;
+use Symfony\Component\Routing\Route;
+use Symfony\Component\Routing\RouteCollection;
 
 /**
  * Defines a kernel which is used primarily to run the update of Drupal.
diff --git a/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php b/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php
index 4aa0ac0..0362390 100644
--- a/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php
+++ b/core/modules/block/src/Tests/Update/BlockContextMappingUpdateTest.php
@@ -32,6 +32,8 @@ class BlockContextMappingUpdateTest extends UpdatePathTestBase {
     $this->databaseDumpFiles = [
       __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.bare.standard.php.gz',
       __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.block-context-manager-2354889.php',
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.language-enabled.php',
+      __DIR__ . '/../../../../system/tests/fixtures/update/drupal-8.block-test-enabled.php',
     ];
   }
 
diff --git a/core/modules/system/src/Controller/DbUpdateController.php b/core/modules/system/src/Controller/DbUpdateController.php
index 28ab72b..e66a1a5 100644
--- a/core/modules/system/src/Controller/DbUpdateController.php
+++ b/core/modules/system/src/Controller/DbUpdateController.php
@@ -228,7 +228,8 @@ class DbUpdateController extends ControllerBase {
       '#type' => 'link',
       '#title' => $this->t('Continue'),
       '#attributes' => array('class' => array('button', 'button--primary')),
-      '#url' => Url::fromUri($request->getUriForPath('/selection')),
+      // @todo Revisit once https://www.drupal.org/node/2548095 is in.
+      '#url' => Url::fromUri('base://selection'),
     );
     return $build;
   }
@@ -484,6 +485,9 @@ class DbUpdateController extends ControllerBase {
    */
   public function requirements($severity, array $requirements, Request $request) {
     $options = $severity == REQUIREMENT_WARNING ? array('continue' => 1) : array();
+    // @todo Revisit once https://www.drupal.org/node/2548095 is in. Something
+    // like Url::fromRoute('system.db_update')->setOptions ... should then be
+    // possible.
     $try_again_url = Url::fromUri($request->getUriForPath(''))->setOptions(['query' => $options])->toString(TRUE)->getGeneratedUrl();
 
     $build['status_report'] = array(
@@ -580,7 +584,8 @@ class DbUpdateController extends ControllerBase {
     );
     batch_set($batch);
 
-    return batch_process(Url::fromUri($request->getUriForPath('/results')), Url::fromUri($request->getUriForPath('/start')));
+    // @todo Revisit once https://www.drupal.org/node/2548095 is in.
+    return batch_process(Url::fromUri('base://results'), Url::fromUri('base://start'));
   }
 
   /**
diff --git a/core/modules/system/src/Tests/Update/UpdatePathTestBase.php b/core/modules/system/src/Tests/Update/UpdatePathTestBase.php
index c5197a2..d3fe409 100644
--- a/core/modules/system/src/Tests/Update/UpdatePathTestBase.php
+++ b/core/modules/system/src/Tests/Update/UpdatePathTestBase.php
@@ -179,9 +179,6 @@ abstract class UpdatePathTestBase extends WebTestBase {
     // Add the config directories to settings.php.
     drupal_install_config_directories();
 
-    // Install any additional modules.
-    $this->installModulesFromClassProperty($container);
-
     // Restore the original Simpletest batch.
     $this->restoreBatch();
 
@@ -189,6 +186,7 @@ abstract class UpdatePathTestBase extends WebTestBase {
     $this->rebuildAll();
 
     // Replace User 1 with the user created here.
+    // @todo: do this without saving the user account.
     /** @var \Drupal\user\UserInterface $account */
     $account = User::load(1);
     $account->setPassword($this->rootUser->pass_raw);
@@ -267,25 +265,4 @@ abstract class UpdatePathTestBase extends WebTestBase {
     $this->assertFalse(\Drupal::service('entity.definition_update_manager')->needsUpdates(), 'After all updates ran, entity schema is up to date.');
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  protected function rebuildAll() {
-    // We know the rebuild causes notices, so don't exit on failure.
-    $die_on_fail = $this->dieOnFail;
-    $this->dieOnFail = FALSE;
-    parent::rebuildAll();
-
-    // Remove the notices we get due to the menu link rebuild prior to running
-    // the system updates for the schema change.
-    foreach ($this->assertions as $key => $assertion) {
-      if ($assertion['message_group'] == 'Notice' && basename($assertion['file']) == 'MenuTreeStorage.php' && strpos($assertion['message'], 'unserialize(): Error at offset 0') !== FALSE) {
-        unset($this->assertions[$key]);
-        $this->deleteAssert($assertion['message_id']);
-        $this->results['#exception']--;
-      }
-    }
-    $this->dieOnFail = $die_on_fail;
-  }
-
 }
diff --git a/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php b/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php
index 30ed37d..623a400 100644
--- a/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php
+++ b/core/modules/system/src/Tests/Update/UpdatePathTestBaseFilledTest.php
@@ -18,6 +18,7 @@ class UpdatePathTestBaseFilledTest extends UpdatePathTestBaseTest {
    * {@inheritdoc}
    */
   protected function setDatabaseDumpFiles() {
+    parent::setDatabaseDumpFiles();
     $this->databaseDumpFiles[0] = __DIR__ . '/../../../tests/fixtures/update/drupal-8.filled.standard.php.gz';
   }
 
diff --git a/core/modules/system/src/Tests/Update/UpdatePathTestBaseTest.php b/core/modules/system/src/Tests/Update/UpdatePathTestBaseTest.php
index 28e003a..65e0b21 100644
--- a/core/modules/system/src/Tests/Update/UpdatePathTestBaseTest.php
+++ b/core/modules/system/src/Tests/Update/UpdatePathTestBaseTest.php
@@ -25,7 +25,10 @@ class UpdatePathTestBaseTest extends UpdatePathTestBase {
    * {@inheritdoc}
    */
   protected function setDatabaseDumpFiles() {
-    $this->databaseDumpFiles = [__DIR__ . '/../../../tests/fixtures/update/drupal-8.bare.standard.php.gz'];
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../tests/fixtures/update/drupal-8.bare.standard.php.gz',
+      __DIR__ . '/../../../tests/fixtures/update/drupal-8.update-test-schema-enabled.php',
+    ];
   }
 
   /**
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index b1bdee7..923e722 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -241,7 +241,7 @@ function system_theme_suggestions_html(array $variables) {
     $path_args = [''];
   }
   else {
-    $path_args = explode('/', Url::fromRoute('<current>')->getInternalPath());
+    $path_args = explode('/', ltrim(\Drupal::service('path.current')->getPath(), '/'));
   }
   return theme_get_suggestions($path_args, 'html');
 }
diff --git a/core/modules/system/tests/fixtures/update/drupal-8.block-test-enabled.php b/core/modules/system/tests/fixtures/update/drupal-8.block-test-enabled.php
new file mode 100644
index 0000000..990278d
--- /dev/null
+++ b/core/modules/system/tests/fixtures/update/drupal-8.block-test-enabled.php
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * @file
+ * Partial database to mimic the installation of the update_test_schema module.
+ */
+
+use Drupal\Core\Database\Database;
+use Symfony\Component\Yaml\Yaml;
+
+$connection = Database::getConnection();
+
+// Set the schema version.
+$connection->insert('key_value')
+  ->fields([
+    'collection' => 'system.schema',
+    'name' => 'block_test',
+    'value' => 'i:8000;',
+  ])
+  ->execute();
+
+// Update core.extension.
+$extensions = $connection->select('config')
+  ->fields('config', ['data'])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute()
+  ->fetchField();
+$extensions = unserialize($extensions);
+$extensions['module']['block_test'] = 8000;
+$connection->update('config')
+  ->fields([
+    'data' => serialize($extensions),
+  ])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute();
+
+// Install the block configuration.
+$config = file_get_contents(__DIR__ . '/../../../../block/tests/modules/block_test/config/install/block.block.test_block.yml');
+$config = Yaml::parse($config);
+$connection->insert('config')
+  ->fields(['data', 'name', 'collection'])
+  ->values([
+    'name' => 'block.block.test_block',
+    'data' => serialize($config),
+    'collection' => '',
+  ])
+  ->execute();
diff --git a/core/modules/system/tests/fixtures/update/drupal-8.language-enabled.php b/core/modules/system/tests/fixtures/update/drupal-8.language-enabled.php
new file mode 100644
index 0000000..6be5c24
--- /dev/null
+++ b/core/modules/system/tests/fixtures/update/drupal-8.language-enabled.php
@@ -0,0 +1,73 @@
+<?php
+
+use Drupal\Core\Database\Database;
+use Symfony\Component\Yaml\Yaml;
+
+$connection = Database::getConnection();
+
+// Set the schema version.
+$connection->merge('key_value')
+  ->fields([
+    'value' => 'i:8000;',
+    'name' => 'language',
+    'collection' => 'system.schema',
+  ])
+  ->condition('collection', 'system.schema')
+  ->condition('name', 'language')
+  ->execute();
+
+// Update core.extension.
+$extensions = $connection->select('config')
+  ->fields('config', ['data'])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute()
+  ->fetchField();
+$extensions = unserialize($extensions);
+$extensions['module']['language'] = 8000;
+$connection->update('config')
+  ->fields([
+    'data' => serialize($extensions),
+    'collection' => '',
+    'name' => 'core.extension',
+  ])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute();
+
+// Install configs.
+$config_directory = new DirectoryIterator(__DIR__ . '/../../../../language/config/install');
+foreach ($config_directory as $file_info) {
+  if ($file_info->getExtension() == 'yml') {
+    $config = Yaml::parse(file_get_contents($file_info->getRealPath()));
+    $connection->merge('config')
+      ->condition('name', $file_info->getBasename('.yml'))
+      ->condition('collection', '')
+      ->fields([
+        'data' => serialize($config),
+        'name' => $file_info->getBasename('.yml'),
+        'collection' => '',
+      ])
+      ->execute();
+  }
+}
+
+$connection->merge('key_value')
+  ->condition('collection', 'entity.definitions.installed')
+  ->condition('name', 'configurable_language.entity_type')
+  ->fields([
+    'value' => 'O:42:"Drupal\Core\Config\Entity\ConfigEntityType":35:{s:16:" * config_prefix";s:6:"entity";s:15:" * static_cache";b:0;s:14:" * lookup_keys";a:1:{i:0;s:4:"uuid";}s:16:" * config_export";a:0:{}s:21:" * mergedConfigExport";a:0:{}s:15:" * render_cache";b:1;s:19:" * persistent_cache";b:1;s:14:" * entity_keys";a:8:{s:2:"id";s:2:"id";s:5:"label";s:5:"label";s:6:"weight";s:6:"weight";s:8:"revision";s:0:"";s:6:"bundle";s:0:"";s:8:"langcode";s:8:"langcode";s:16:"default_langcode";s:16:"default_langcode";s:4:"uuid";s:4:"uuid";}s:5:" * id";s:21:"configurable_language";s:11:" * provider";s:8:"language";s:8:" * class";s:43:"Drupal\language\Entity\ConfigurableLanguage";s:16:" * originalClass";N;s:11:" * handlers";a:4:{s:12:"list_builder";s:35:"Drupal\language\LanguageListBuilder";s:6:"access";s:44:"Drupal\language\LanguageAccessControlHandler";s:4:"form";a:3:{s:3:"add";s:36:"Drupal\language\Form\LanguageAddForm";s:4:"edit";s:37:"Drupal\language\Form\LanguageEditForm";s:6:"delete";s:39:"Drupal\language\Form\LanguageDeleteForm";}s:7:"storage";s:45:"Drupal\Core\Config\Entity\ConfigEntityStorage";}s:19:" * admin_permission";s:20:"administer languages";s:25:" * permission_granularity";s:11:"entity_type";s:8:" * links";a:3:{s:11:"delete-form";s:62:"/admin/config/regional/language/delete/{configurable_language}";s:9:"edit-form";s:60:"/admin/config/regional/language/edit/{configurable_language}";s:10:"collection";s:31:"/admin/config/regional/language";}s:17:" * label_callback";N;s:21:" * bundle_entity_type";N;s:12:" * bundle_of";N;s:15:" * bundle_label";N;s:13:" * base_table";N;s:22:" * revision_data_table";N;s:17:" * revision_table";N;s:13:" * data_table";N;s:15:" * translatable";b:0;s:8:" * label";O:48:"Drupal\Core\StringTranslation\TranslationWrapper":3:{s:9:" * string";s:8:"Language";s:12:" * arguments";a:0:{}s:10:" * options";a:0:{}}s:15:" * uri_callback";N;s:8:" * group";s:13:"configuration";s:14:" * group_label";O:48:"Drupal\Core\StringTranslation\TranslationWrapper":3:{s:9:" * string";s:13:"Configuration";s:12:" * arguments";a:0:{}s:10:" * options";a:1:{s:7:"context";s:17:"Entity type group";}}s:22:" * field_ui_base_route";N;s:26:" * common_reference_target";b:0;s:22:" * list_cache_contexts";a:0:{}s:18:" * list_cache_tags";a:1:{i:0;s:33:"config:configurable_language_list";}s:14:" * constraints";a:0:{}s:20:" * stringTranslation";N;}',
+    'name' => 'configurable_language.entity_type',
+    'collection' => 'entity.definitions.installed',
+  ])
+  ->execute();
+
+$connection->merge('key_value')
+  ->condition('collection', 'entity.definitions.installed')
+  ->condition('name', 'language_content_settings.entity_type')
+  ->fields([
+    'value' => 'O:42:"Drupal\Core\Config\Entity\ConfigEntityType":35:{s:16:" * config_prefix";s:16:"content_settings";s:15:" * static_cache";b:0;s:14:" * lookup_keys";a:1:{i:0;s:4:"uuid";}s:16:" * config_export";a:0:{}s:21:" * mergedConfigExport";a:0:{}s:15:" * render_cache";b:1;s:19:" * persistent_cache";b:1;s:14:" * entity_keys";a:6:{s:2:"id";s:2:"id";s:8:"revision";s:0:"";s:6:"bundle";s:0:"";s:8:"langcode";s:8:"langcode";s:16:"default_langcode";s:16:"default_langcode";s:4:"uuid";s:4:"uuid";}s:5:" * id";s:25:"language_content_settings";s:11:" * provider";s:8:"language";s:8:" * class";s:46:"Drupal\language\Entity\ContentLanguageSettings";s:16:" * originalClass";N;s:11:" * handlers";a:2:{s:6:"access";s:45:"Drupal\Core\Entity\EntityAccessControlHandler";s:7:"storage";s:45:"Drupal\Core\Config\Entity\ConfigEntityStorage";}s:19:" * admin_permission";s:20:"administer languages";s:25:" * permission_granularity";s:11:"entity_type";s:8:" * links";a:0:{}s:17:" * label_callback";N;s:21:" * bundle_entity_type";N;s:12:" * bundle_of";N;s:15:" * bundle_label";N;s:13:" * base_table";N;s:22:" * revision_data_table";N;s:17:" * revision_table";N;s:13:" * data_table";N;s:15:" * translatable";b:0;s:8:" * label";O:48:"Drupal\Core\StringTranslation\TranslationWrapper":3:{s:9:" * string";s:25:"Content Language Settings";s:12:" * arguments";a:0:{}s:10:" * options";a:0:{}}s:15:" * uri_callback";N;s:8:" * group";s:13:"configuration";s:14:" * group_label";O:48:"Drupal\Core\StringTranslation\TranslationWrapper":3:{s:9:" * string";s:13:"Configuration";s:12:" * arguments";a:0:{}s:10:" * options";a:1:{s:7:"context";s:17:"Entity type group";}}s:22:" * field_ui_base_route";N;s:26:" * common_reference_target";b:0;s:22:" * list_cache_contexts";a:0:{}s:18:" * list_cache_tags";a:1:{i:0;s:37:"config:language_content_settings_list";}s:14:" * constraints";a:0:{}s:20:" * stringTranslation";N;}',
+    'name' => 'language_content_settings.entity_type',
+    'collection' => 'entity.definitions.installed',
+  ])
+  ->execute();
diff --git a/core/modules/system/tests/fixtures/update/drupal-8.update-test-schema-enabled.php b/core/modules/system/tests/fixtures/update/drupal-8.update-test-schema-enabled.php
new file mode 100644
index 0000000..7250741
--- /dev/null
+++ b/core/modules/system/tests/fixtures/update/drupal-8.update-test-schema-enabled.php
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * @file
+ * Partial database to mimic the installation of the update_test_schema module.
+ */
+
+use Drupal\Core\Database\Database;
+
+$connection = Database::getConnection();
+
+// Create the table.
+$connection->schema()->createTable('update_test_schema_table', array(
+  'fields' => array(
+    'a' => array(
+      'type' => 'int',
+      'not null' => TRUE,
+      'size' => 'normal',
+    ),
+    'b' => array(
+      'type' => 'blob',
+      'not null' => FALSE,
+      'size' => 'normal',
+    ),
+  ),
+));
+
+// Set the schema version.
+$connection->merge('key_value')
+  ->condition('collection', 'system.schema')
+  ->condition('name', 'update_test_schema')
+  ->fields([
+    'collection' => 'system.schema',
+    'name' => 'update_test_schema',
+    'value' => 'i:8000;',
+  ])
+  ->execute();
+
+// Update core.extension.
+$extensions = $connection->select('config')
+  ->fields('config', ['data'])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute()
+  ->fetchField();
+$extensions = unserialize($extensions);
+$extensions['module']['update_test_schema'] = 8000;
+$connection->update('config')
+  ->fields([
+    'data' => serialize($extensions),
+  ])
+  ->condition('collection', '')
+  ->condition('name', 'core.extension')
+  ->execute();
