diff --git a/core/config/install/core.extension.yml b/core/config/install/core.extension.yml
index 659446cc64c88900a59666f480bf3a475678b5dc..ce74baed1829fe104bc1dc9df9543f24be8100d5 100644
--- a/core/config/install/core.extension.yml
+++ b/core/config/install/core.extension.yml
@@ -1,3 +1,2 @@
 module: {}
 theme: {}
-profile: ''
diff --git a/core/config/schema/core.extension.schema.yml b/core/config/schema/core.extension.schema.yml
index 087e2e3b9497f75ca86794bbd34796bb8b302350..bdc84b9fee89f69e3c44dadd9105a3766001f545 100644
--- a/core/config/schema/core.extension.schema.yml
+++ b/core/config/schema/core.extension.schema.yml
@@ -14,6 +14,3 @@ core.extension:
       sequence:
         type: integer
         label: 'Weight'
-    profile:
-      type: string
-      label: 'Install profile'
diff --git a/core/core.services.yml b/core/core.services.yml
index d67a6fa099ad0996535fbf63d455fb863b33684a..5b0de757832a4d07bbd2ed5f6577dba3a0dff0fc 100644
--- a/core/core.services.yml
+++ b/core/core.services.yml
@@ -303,7 +303,7 @@ services:
       - { name: event_subscriber }
   config.installer:
     class: Drupal\Core\Config\ConfigInstaller
-    arguments: ['@config.factory', '@config.storage', '@config.typed', '@config.manager', '@event_dispatcher', '%install_profile%']
+    arguments: ['@config.factory', '@config.storage', '@config.typed', '@config.manager', '@event_dispatcher']
     lazy: true
   config.storage:
     class: Drupal\Core\Config\CachedStorage
@@ -328,7 +328,7 @@ services:
       - { name: backend_overridable }
   config.storage.schema:
     class: Drupal\Core\Config\ExtensionInstallStorage
-    arguments: ['@config.storage', '%install_profile%', 'config/schema']
+    arguments: ['@config.storage', 'config/schema']
   config.typed:
     class: Drupal\Core\Config\TypedConfigManager
     arguments: ['@config.storage', '@config.storage.schema', '@cache.discovery', '@module_handler']
diff --git a/core/includes/bootstrap.inc b/core/includes/bootstrap.inc
index 5b18c5cce02fdc864e575aba7d3bf5587f03d714..f74859e17185f93f9d459f9c7c830418f1b0f1c8 100644
--- a/core/includes/bootstrap.inc
+++ b/core/includes/bootstrap.inc
@@ -9,7 +9,6 @@
 use Drupal\Component\Utility\Html;
 use Drupal\Component\Utility\SafeMarkup;
 use Drupal\Component\Utility\Unicode;
-use Drupal\Core\Config\BootstrapConfigStorageFactory;
 use Drupal\Core\Logger\RfcLogLevel;
 use Drupal\Core\Render\Markup;
 use Drupal\Component\Render\MarkupInterface;
@@ -728,20 +727,12 @@ function drupal_installation_attempted() {
  * When this function is called during Drupal's initial installation process,
  * the name of the profile that's about to be installed is stored in the global
  * installation state. At all other times, the "install_profile" setting will be
- * available in container as a parameter.
+ * available in settings.php.
  *
  * @return string|null $profile
  *   The name of the installation profile or NULL if no installation profile is
  *   currently active. This is the case for example during the first steps of
  *   the installer or during unit tests.
- *
- * @deprecated in Drupal 8.3.0, will be removed before Drupal 9.0.0.
- *   Use the install_profile container parameter or \Drupal::installProfile()
- *   instead. If you are accessing the value before it is written to
- *   configuration during the installer use the $install_state global. If you
- *   need to access the value before container is available you can use
- *   BootstrapConfigStorageFactory to load the value directly from
- *   configuration.
  */
 function drupal_get_profile() {
   global $install_state;
@@ -756,18 +747,8 @@ function drupal_get_profile() {
     }
   }
   else {
-    if (\Drupal::hasContainer()) {
-      $profile = \Drupal::installProfile();
-    }
-    else {
-      $profile = BootstrapConfigStorageFactory::getDatabaseStorage()->read('core.extension')['profile'];
-    }
-
-    // A BC layer just in in case this only exists in Settings. Introduced in
-    // Drupal 8.3.x and will be removed before Drupal 9.0.0.
-    if (empty($profile)) {
-      $profile = Settings::get('install_profile');
-    }
+    // Fall back to NULL, if there is no 'install_profile' setting.
+    $profile = Settings::get('install_profile');
   }
 
   return $profile;
diff --git a/core/includes/install.core.inc b/core/includes/install.core.inc
index af64bc4e14edb81bcfce72b45e4ffdcc83529730..1616f1891e1e44b66ca9f06cbceb4c8a93f4dc1c 100644
--- a/core/includes/install.core.inc
+++ b/core/includes/install.core.inc
@@ -12,7 +12,6 @@
 use Drupal\Core\Form\FormState;
 use Drupal\Core\Installer\Exception\AlreadyInstalledException;
 use Drupal\Core\Installer\Exception\InstallerException;
-use Drupal\Core\Installer\Exception\InstallProfileMismatchException;
 use Drupal\Core\Installer\Exception\NoProfilesException;
 use Drupal\Core\Installer\InstallerKernel;
 use Drupal\Core\Language\Language;
@@ -2173,23 +2172,13 @@ function install_display_requirements($install_state, $requirements) {
 }
 
 /**
- * Installation task; writes profile to settings.php if possible.
+ * Installation task; ensures install profile is written to settings.php.
  *
  * @param array $install_state
  *   An array of information about the current installation state.
- *
- * @see _install_select_profile()
- *
- * @throws \Drupal\Core\Installer\Exception\InstallProfileMismatchException
- *
- * @deprecated in Drupal 8.3.0 and will be removed before Drupal 9.0.0. The
- *    install profile is written to core.extension.
  */
 function install_write_profile($install_state) {
-  // Only need to write to settings.php if it is possible. The primary storage
-  // for the install profile is the core.extension configuration.
-  $settings_path = \Drupal::service('site.path') . '/settings.php';
-  if (is_writable($settings_path)) {
+  if (Settings::get('install_profile') !== $install_state['parameters']['profile']) {
     // Remember the profile which was used.
     $settings['settings']['install_profile'] = (object) array(
       'value' => $install_state['parameters']['profile'],
@@ -2197,7 +2186,4 @@ function install_write_profile($install_state) {
     );
     drupal_rewrite_settings($settings);
   }
-  elseif (($settings_profile = Settings::get('install_profile')) && $settings_profile !== $install_state['parameters']['profile']) {
-    throw new InstallProfileMismatchException($install_state['parameters']['profile'], $settings_profile, $settings_path, \Drupal::translation());
-  }
 }
diff --git a/core/includes/install.inc b/core/includes/install.inc
index c49625c2c16aa7841c34f7c76338180bb96c4ed2..e243c184f0bb60f165bc29253e14019768f2ecd5 100644
--- a/core/includes/install.inc
+++ b/core/includes/install.inc
@@ -621,12 +621,6 @@ function drupal_install_system($install_state) {
   // Install base system configuration.
   \Drupal::service('config.installer')->installDefaultConfig('core', 'core');
 
-  // Store the installation profile in configuration to populate the
-  // 'install_profile' container parameter.
-  \Drupal::configFactory()->getEditable('core.extension')
-    ->set('profile', $install_state['parameters']['profile'])
-    ->save();
-
   // Install System module and rebuild the newly available routes.
   $kernel->getContainer()->get('module_installer')->install(array('system'), FALSE);
   \Drupal::service('router.builder')->rebuild();
diff --git a/core/lib/Drupal.php b/core/lib/Drupal.php
index b9388fc100d1dc7bf71ec5aa9e536fd094a88fd3..81c72db081aabdff9c51a95e25bd10e2695a385d 100644
--- a/core/lib/Drupal.php
+++ b/core/lib/Drupal.php
@@ -181,16 +181,6 @@ public static function root() {
     return static::getContainer()->get('app.root');
   }
 
-  /**
-   * Gets the active install profile.
-   *
-   * @return string|null
-   *   The name of the active install profile.
-   */
-  public static function installProfile() {
-    return static::getContainer()->getParameter('install_profile');
-  }
-
   /**
    * Indicates if there is a currently active request object.
    *
diff --git a/core/lib/Drupal/Core/Config/ConfigInstaller.php b/core/lib/Drupal/Core/Config/ConfigInstaller.php
index 46080557cd0a1cfd052e40d80f3da687634ed2b7..f98691f05866bd716dca2a28fdb5906bc7b1037f 100644
--- a/core/lib/Drupal/Core/Config/ConfigInstaller.php
+++ b/core/lib/Drupal/Core/Config/ConfigInstaller.php
@@ -6,6 +6,7 @@
 use Drupal\Component\Utility\Unicode;
 use Drupal\Core\Config\Entity\ConfigDependencyManager;
 use Drupal\Core\Config\Entity\ConfigEntityDependency;
+use Drupal\Core\Site\Settings;
 use Symfony\Component\EventDispatcher\EventDispatcherInterface;
 
 class ConfigInstaller implements ConfigInstallerInterface {
@@ -59,13 +60,6 @@ class ConfigInstaller implements ConfigInstallerInterface {
    */
   protected $isSyncing = FALSE;
 
-  /**
-   * The name of the currently active installation profile.
-   *
-   * @var string
-   */
-  protected $installProfile;
-
   /**
    * Constructs the configuration installer.
    *
@@ -79,16 +73,13 @@ class ConfigInstaller implements ConfigInstallerInterface {
    *   The configuration manager.
    * @param \Symfony\Component\EventDispatcher\EventDispatcherInterface $event_dispatcher
    *   The event dispatcher.
-   * @param string $install_profile
-   *   The name of the currently active installation profile.
    */
-  public function __construct(ConfigFactoryInterface $config_factory, StorageInterface $active_storage, TypedConfigManagerInterface $typed_config, ConfigManagerInterface $config_manager, EventDispatcherInterface $event_dispatcher, $install_profile) {
+  public function __construct(ConfigFactoryInterface $config_factory, StorageInterface $active_storage, TypedConfigManagerInterface $typed_config, ConfigManagerInterface $config_manager, EventDispatcherInterface $event_dispatcher) {
     $this->configFactory = $config_factory;
     $this->activeStorages[$active_storage->getCollectionName()] = $active_storage;
     $this->typedConfig = $typed_config;
     $this->configManager = $config_manager;
     $this->eventDispatcher = $event_dispatcher;
-    $this->installProfile = $install_profile;
   }
 
   /**
@@ -149,7 +140,7 @@ public function installDefaultConfig($type, $name) {
       // Install any optional configuration entities whose dependencies can now
       // be met. This searches all the installed modules config/optional
       // directories.
-      $storage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), $this->installProfile, InstallStorage::CONFIG_OPTIONAL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION, FALSE);
+      $storage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), InstallStorage::CONFIG_OPTIONAL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION, FALSE);
       $this->installOptionalConfig($storage, [$type => $name]);
     }
 
@@ -165,11 +156,11 @@ public function installOptionalConfig(StorageInterface $storage = NULL, $depende
     $optional_profile_config = [];
     if (!$storage) {
       // Search the install profile's optional configuration too.
-      $storage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), $this->installProfile, InstallStorage::CONFIG_OPTIONAL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION, TRUE);
+      $storage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), InstallStorage::CONFIG_OPTIONAL_DIRECTORY, StorageInterface::DEFAULT_COLLECTION, TRUE);
       // The extension install storage ensures that overrides are used.
       $profile_storage = NULL;
     }
-    elseif (!empty($profile)) {
+    elseif (isset($profile)) {
       // Creates a profile storage to search for overrides.
       $profile_install_path = $this->drupalGetPath('module', $profile) . '/' . InstallStorage::CONFIG_OPTIONAL_DIRECTORY;
       $profile_storage = new FileStorage($profile_install_path, StorageInterface::DEFAULT_COLLECTION);
@@ -340,7 +331,7 @@ protected function createConfiguration($collection, array $config_to_create) {
    * {@inheritdoc}
    */
   public function installCollectionDefaultConfig($collection) {
-    $storage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), $this->installProfile, InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection, $this->drupalInstallationAttempted());
+    $storage = new ExtensionInstallStorage($this->getActiveStorages(StorageInterface::DEFAULT_COLLECTION), InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection, $this->drupalInstallationAttempted());
     // Only install configuration for enabled extensions.
     $enabled_extensions = $this->getEnabledExtensions();
     $config_to_install = array_filter($storage->listAll(), function ($config_name) use ($enabled_extensions) {
@@ -680,7 +671,9 @@ protected function drupalGetPath($type, $name) {
    *   of the installer or during unit tests.
    */
   protected function drupalGetProfile() {
-    return $this->installProfile;
+    // Settings is safe to use because settings.php is written before any module
+    // is installed.
+    return Settings::get('install_profile');
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Config/ExtensionInstallStorage.php b/core/lib/Drupal/Core/Config/ExtensionInstallStorage.php
index 96e1e382240428200d8fb59c57fc1f8718111e19..14e80dd8869efd1edd1e16d8abf08d756e44890f 100644
--- a/core/lib/Drupal/Core/Config/ExtensionInstallStorage.php
+++ b/core/lib/Drupal/Core/Config/ExtensionInstallStorage.php
@@ -2,6 +2,7 @@
 
 namespace Drupal\Core\Config;
 
+use Drupal\Core\Site\Settings;
 use Drupal\Core\Extension\ExtensionDiscovery;
 
 /**
@@ -26,21 +27,12 @@ class ExtensionInstallStorage extends InstallStorage {
    */
   protected $includeProfile = TRUE;
 
-  /**
-   * The name of the currently active installation profile.
-   *
-   * @var string
-   */
-  protected $installProfile;
-
   /**
    * Overrides \Drupal\Core\Config\InstallStorage::__construct().
    *
    * @param \Drupal\Core\Config\StorageInterface $config_storage
    *   The active configuration store where the list of enabled modules and
    *   themes is stored.
-   * @param string $profile
-   *   The current installation profile.
    * @param string $directory
    *   The directory to scan in each extension to scan for files. Defaults to
    *   'config/install'.
@@ -51,12 +43,10 @@ class ExtensionInstallStorage extends InstallStorage {
    *   (optional) Whether to include the install profile in extensions to
    *   search and to get overrides from.
    */
-  public function __construct(StorageInterface $config_storage, $profile, $directory = self::CONFIG_INSTALL_DIRECTORY, $collection = StorageInterface::DEFAULT_COLLECTION, $include_profile = TRUE) {
+  public function __construct(StorageInterface $config_storage, $directory = self::CONFIG_INSTALL_DIRECTORY, $collection = StorageInterface::DEFAULT_COLLECTION, $include_profile = TRUE) {
     parent::__construct($directory, $collection);
-
     $this->configStorage = $config_storage;
     $this->includeProfile = $include_profile;
-    $this->installProfile = $profile;
   }
 
   /**
@@ -87,20 +77,22 @@ protected function getAllFolders() {
       $this->folders = array();
       $this->folders += $this->getCoreNames();
 
+      $install_profile = Settings::get('install_profile');
+      $profile = drupal_get_profile();
       $extensions = $this->configStorage->read('core.extension');
       // @todo Remove this scan as part of https://www.drupal.org/node/2186491
       $listing = new ExtensionDiscovery(\Drupal::root());
       if (!empty($extensions['module'])) {
         $modules = $extensions['module'];
         // Remove the install profile as this is handled later.
-        unset($modules[$this->installProfile]);
+        unset($modules[$install_profile]);
         $profile_list = $listing->scan('profile');
-        if ($this->installProfile && isset($profile_list[$this->installProfile])) {
+        if ($profile && isset($profile_list[$profile])) {
           // Prime the drupal_get_filename() static cache with the profile info
           // file location so we can use drupal_get_path() on the active profile
           // during the module scan.
           // @todo Remove as part of https://www.drupal.org/node/2186491
-          drupal_get_filename('profile', $this->installProfile, $profile_list[$this->installProfile]->getPathname());
+          drupal_get_filename('profile', $profile, $profile_list[$profile]->getPathname());
         }
         $module_list_scan = $listing->scan('module');
         $module_list = array();
@@ -125,12 +117,12 @@ protected function getAllFolders() {
         // The install profile can override module default configuration. We do
         // this by replacing the config file path from the module/theme with the
         // install profile version if there are any duplicates.
-        if ($this->installProfile) {
+        if (isset($profile)) {
           if (!isset($profile_list)) {
             $profile_list = $listing->scan('profile');
           }
-          if (isset($profile_list[$this->installProfile])) {
-            $profile_folders = $this->getComponentNames(array($profile_list[$this->installProfile]));
+          if (isset($profile_list[$profile])) {
+            $profile_folders = $this->getComponentNames(array($profile_list[$profile]));
             $this->folders = $profile_folders + $this->folders;
           }
         }
diff --git a/core/lib/Drupal/Core/DrupalKernel.php b/core/lib/Drupal/Core/DrupalKernel.php
index 2366576c647c1676be1a13aac45d2a84896051b6..274a3fa71e6353564f17972127b957e1f8313879 100644
--- a/core/lib/Drupal/Core/DrupalKernel.php
+++ b/core/lib/Drupal/Core/DrupalKernel.php
@@ -1195,7 +1195,6 @@ protected function compileContainer() {
     $container = $this->getContainerBuilder();
     $container->set('kernel', $this);
     $container->setParameter('container.modules', $this->getModulesParameter());
-    $container->setParameter('install_profile', $this->getInstallProfile());
 
     // Get a list of namespaces and put it onto the container.
     $namespaces = $this->getModuleNamespacesPsr4($this->getModuleFileNames());
@@ -1553,25 +1552,4 @@ protected function addServiceFiles(array $service_yamls) {
     $this->serviceYamls['site'] = array_filter($service_yamls, 'file_exists');
   }
 
-  /**
-   * Gets the active install profile.
-   *
-   * @return string|null
-   *   The name of the any active install profile or distribution.
-   */
-  protected function getInstallProfile() {
-    $config = $this->getConfigStorage()->read('core.extension');
-    if (!empty($config['profile'])) {
-      $install_profile = $config['profile'];
-    }
-    // @todo https://www.drupal.org/node/2831065 remove the BC layer.
-    else {
-      // If system_update_8300() has not yet run fallback to using settings.
-      $install_profile = Settings::get('install_profile');
-    }
-
-    // Normalize an empty string to a NULL value.
-    return empty($install_profile) ? NULL : $install_profile;
-  }
-
 }
diff --git a/core/lib/Drupal/Core/EventSubscriber/ConfigImportSubscriber.php b/core/lib/Drupal/Core/EventSubscriber/ConfigImportSubscriber.php
index 24b4c70d5fb612ae10986296c7f7d1a5c5eeceaf..ad2eb5e04e092ae5f02cf0e27066f0e3e0bc2110 100644
--- a/core/lib/Drupal/Core/EventSubscriber/ConfigImportSubscriber.php
+++ b/core/lib/Drupal/Core/EventSubscriber/ConfigImportSubscriber.php
@@ -8,6 +8,7 @@
 use Drupal\Core\Config\ConfigImportValidateEventSubscriberBase;
 use Drupal\Core\Config\ConfigNameException;
 use Drupal\Core\Extension\ThemeHandlerInterface;
+use Drupal\Core\Site\Settings;
 
 /**
  * Config import subscriber for config import events.
@@ -111,10 +112,9 @@ protected function validateModules(ConfigImporter $config_importer) {
       }
     }
 
-    // Get the install profile from the site's configuration.
-    $current_core_extension = $config_importer->getStorageComparer()->getTargetStorage()->read('core.extension');
-    $install_profile = isset($current_core_extension['profile']) ? $current_core_extension['profile'] : NULL;
-
+    // Settings is safe to use because settings.php is written before any module
+    // is installed.
+    $install_profile = Settings::get('install_profile');
     // Ensure that all modules being uninstalled are not required by modules
     // that will be installed after the import.
     $uninstalls = $config_importer->getExtensionChangelist('module', 'uninstall');
@@ -129,15 +129,10 @@ protected function validateModules(ConfigImporter $config_importer) {
     }
 
     // Ensure that the install profile is not being uninstalled.
-    if (in_array($install_profile, $uninstalls, TRUE)) {
+    if (in_array($install_profile, $uninstalls)) {
       $profile_name = $module_data[$install_profile]->info['name'];
       $config_importer->logError($this->t('Unable to uninstall the %profile profile since it is the install profile.', array('%profile' => $profile_name)));
     }
-
-    // Ensure the profile is not changing.
-    if ($install_profile !== $core_extension['profile']) {
-      $config_importer->logError($this->t('Cannot change the install profile from %new_profile to %profile once Drupal is installed.', array('%profile' => $install_profile, '%new_profile' => $core_extension['profile'])));
-    }
   }
 
   /**
diff --git a/core/lib/Drupal/Core/Installer/Exception/InstallProfileMismatchException.php b/core/lib/Drupal/Core/Installer/Exception/InstallProfileMismatchException.php
deleted file mode 100644
index d67978986abbaf552e8effe3aeafaf8561ccb27e..0000000000000000000000000000000000000000
--- a/core/lib/Drupal/Core/Installer/Exception/InstallProfileMismatchException.php
+++ /dev/null
@@ -1,45 +0,0 @@
-<?php
-
-namespace Drupal\Core\Installer\Exception;
-
-use Drupal\Core\StringTranslation\TranslationInterface;
-
-/**
- * Exception thrown if settings.php cannot be written and the chosen profile does not match.
- */
-class InstallProfileMismatchException extends InstallerException {
-
-  /**
-   * Constructs a new InstallProfileMismatchException exception.
-   *
-   * @param string $selected_profile
-   *   The profile selected by _install_select_profile().
-   * @param string $settings_profile
-   *   The profile in settings.php.
-   * @param string $settings_file
-   *   The path to settigns.php.
-   * @param \Drupal\Core\StringTranslation\TranslationInterface $string_translation
-   *   The string translation manager.
-   *
-   * @deprecated in Drupal 8.3.0 and will be removed before Drupal 9.0.0. The
-   *    install profile is written to core.extension.
-   *
-   * @see _install_select_profile()
-   * @see install_write_profile
-   */
-  public function __construct($selected_profile, $settings_profile, $settings_file, TranslationInterface $string_translation) {
-    $this->stringTranslation = $string_translation;
-
-    $title = $this->t('Install profile mismatch');
-    $message = $this->t(
-      'The selected profile %profile does not match the install_profile setting, which is %settings_profile. Cannot write updated setting to %settings_file.',
-      [
-        '%profile' => $selected_profile,
-        '%settings_profile' => $settings_profile,
-        '%settings_file' => $settings_file,
-      ]
-    );
-    parent::__construct($message, $title);
-  }
-
-}
diff --git a/core/lib/Drupal/Core/Installer/InstallerKernel.php b/core/lib/Drupal/Core/Installer/InstallerKernel.php
index adeb5c53eed62b1935dcd43c079b8d10a6abbe45..e00c215c09e82cd7ca6e1095b265cf53e6a6f289 100644
--- a/core/lib/Drupal/Core/Installer/InstallerKernel.php
+++ b/core/lib/Drupal/Core/Installer/InstallerKernel.php
@@ -46,24 +46,4 @@ public function getConfigStorage() {
     return parent::getConfigStorage();
   }
 
-  /**
-   * {@inheritdoc}
-   */
-  public function getInstallProfile() {
-    global $install_state;
-    if ($install_state && empty($install_state['installation_finished'])) {
-      // If the profile has been selected return it.
-      if (isset($install_state['parameters']['profile'])) {
-        $profile = $install_state['parameters']['profile'];
-      }
-      else {
-        $profile = NULL;
-      }
-    }
-    else {
-      $profile = parent::getInstallProfile();
-    }
-    return $profile;
-  }
-
 }
diff --git a/core/modules/locale/locale.services.yml b/core/modules/locale/locale.services.yml
index b9f8fb807e7b72780b9d4ca086eca75256d12a40..e37cb48d1b554626e3cf8b153d08576c2b106dd2 100644
--- a/core/modules/locale/locale.services.yml
+++ b/core/modules/locale/locale.services.yml
@@ -1,7 +1,7 @@
 services:
   locale.default.config.storage:
     class: Drupal\locale\LocaleDefaultConfigStorage
-    arguments: ['@config.storage', '@language_manager', '%install_profile%']
+    arguments: ['@config.storage', '@language_manager']
     public: false
   locale.config_manager:
     class: Drupal\locale\LocaleConfigManager
diff --git a/core/modules/locale/src/LocaleDefaultConfigStorage.php b/core/modules/locale/src/LocaleDefaultConfigStorage.php
index bcb242b28b1d7478372dfa3785391c5a0bf55166..29697a107653571713623a3d2530390a2ca6c314 100644
--- a/core/modules/locale/src/LocaleDefaultConfigStorage.php
+++ b/core/modules/locale/src/LocaleDefaultConfigStorage.php
@@ -57,12 +57,12 @@ class LocaleDefaultConfigStorage {
    * @param \Drupal\language\ConfigurableLanguageManagerInterface $language_manager
    *   The language manager.
    */
-  public function __construct(StorageInterface $config_storage, ConfigurableLanguageManagerInterface $language_manager, $install_profile) {
+  public function __construct(StorageInterface $config_storage, ConfigurableLanguageManagerInterface $language_manager) {
     $this->configStorage = $config_storage;
     $this->languageManager = $language_manager;
 
-    $this->requiredInstallStorage = new ExtensionInstallStorage($this->configStorage, $install_profile);
-    $this->optionalInstallStorage = new ExtensionInstallStorage($this->configStorage, $install_profile, ExtensionInstallStorage::CONFIG_OPTIONAL_DIRECTORY);
+    $this->requiredInstallStorage = new ExtensionInstallStorage($this->configStorage);
+    $this->optionalInstallStorage = new ExtensionInstallStorage($this->configStorage, ExtensionInstallStorage::CONFIG_OPTIONAL_DIRECTORY);
   }
 
   /**
diff --git a/core/modules/simpletest/src/KernelTestBase.php b/core/modules/simpletest/src/KernelTestBase.php
index c804218af60d81ea092a8107372cd96409a0e62d..0b5792f5fe0eb173cef266e80f243dbe848fdf46 100644
--- a/core/modules/simpletest/src/KernelTestBase.php
+++ b/core/modules/simpletest/src/KernelTestBase.php
@@ -232,7 +232,7 @@ protected function setUp() {
     // \Drupal\Core\Config\ConfigInstaller::installDefaultConfig() to work.
     // Write directly to active storage to avoid early instantiation of
     // the event dispatcher which can prevent modules from registering events.
-    \Drupal::service('config.storage')->write('core.extension', array('module' => array(), 'theme' => array(), 'profile' => ''));
+    \Drupal::service('config.storage')->write('core.extension', array('module' => array(), 'theme' => array()));
 
     // Collect and set a fixed module list.
     $class = get_class($this);
diff --git a/core/modules/simpletest/src/Tests/KernelTestBaseTest.php b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
index 472fdf9e45bc715cd387ea31f7dcc65f3634ee56..15ecf1fe75b17197703a8d9a08f369efd3e2312a 100644
--- a/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
+++ b/core/modules/simpletest/src/Tests/KernelTestBaseTest.php
@@ -323,13 +323,13 @@ function testNoThemeByDefault() {
   }
 
   /**
-   * Tests that \Drupal::installProfile() returns NULL.
+   * Tests that drupal_get_profile() returns NULL.
    *
    * As the currently active installation profile is used when installing
    * configuration, for example, this is essential to ensure test isolation.
    */
   public function testDrupalGetProfile() {
-    $this->assertNull(\Drupal::installProfile());
+    $this->assertNull(drupal_get_profile());
   }
 
   /**
diff --git a/core/modules/system/src/Tests/Installer/DistributionProfileExistingSettingsTest.php b/core/modules/system/src/Tests/Installer/DistributionProfileExistingSettingsTest.php
deleted file mode 100644
index 2fe5d4f1bc33450c465b0f974972645d156e7865..0000000000000000000000000000000000000000
--- a/core/modules/system/src/Tests/Installer/DistributionProfileExistingSettingsTest.php
+++ /dev/null
@@ -1,132 +0,0 @@
-<?php
-
-namespace Drupal\system\Tests\Installer;
-
-use Drupal\Component\Serialization\Yaml;
-use Drupal\Core\Database\Database;
-use Drupal\Core\DrupalKernel;
-use Drupal\Core\Site\Settings;
-use Drupal\simpletest\InstallerTestBase;
-use Symfony\Component\HttpFoundation\Request;
-
-
-/**
- * Tests distribution profile support with existing settings.
- *
- * @group Installer
- */
-class DistributionProfileExistingSettingsTest extends InstallerTestBase {
-
-  /**
-   * The distribution profile info.
-   *
-   * @var array
-   */
-  protected $info;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    $this->info = [
-      'type' => 'profile',
-      'core' => \Drupal::CORE_COMPATIBILITY,
-      'name' => 'Distribution profile',
-      'distribution' => [
-        'name' => 'My Distribution',
-        'install' => [
-          'theme' => 'bartik',
-        ],
-      ],
-    ];
-    // File API functions are not available yet.
-    $path = $this->siteDirectory . '/profiles/mydistro';
-    mkdir($path, 0777, TRUE);
-    file_put_contents("$path/mydistro.info.yml", Yaml::encode($this->info));
-
-    // Pre-configure hash salt.
-    // Any string is valid, so simply use the class name of this test.
-    $this->settings['settings']['hash_salt'] = (object) [
-      'value' => __CLASS__,
-      'required' => TRUE,
-    ];
-
-    // Pre-configure database credentials.
-    $connection_info = Database::getConnectionInfo();
-    unset($connection_info['default']['pdo']);
-    unset($connection_info['default']['init_commands']);
-
-    $this->settings['databases']['default'] = (object) [
-      'value' => $connection_info,
-      'required' => TRUE,
-    ];
-
-    // Use the kernel to find the site path because the site.path service should
-    // not be available at this point in the install process.
-    $site_path = DrupalKernel::findSitePath(Request::createFromGlobals());
-    // Pre-configure config directories.
-    $this->settings['config_directories'] = [
-      CONFIG_SYNC_DIRECTORY => (object) [
-        'value' => $site_path . '/files/config_staging',
-        'required' => TRUE,
-      ],
-    ];
-    mkdir($this->settings['config_directories'][CONFIG_SYNC_DIRECTORY]->value, 0777, TRUE);
-    parent::setUp();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpLanguage() {
-    // Make settings file not writable.
-    $filename = $this->siteDirectory . '/settings.php';
-    // Make the settings file read-only.
-    // Not using File API; a potential error must trigger a PHP warning.
-    chmod($filename, 0444);
-
-    // Verify that the distribution name appears.
-    $this->assertRaw($this->info['distribution']['name']);
-    // Verify that the requested theme is used.
-    $this->assertRaw($this->info['distribution']['install']['theme']);
-    // Verify that the "Choose profile" step does not appear.
-    $this->assertNoText('profile');
-
-    parent::setUpLanguage();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpProfile() {
-    // This step is skipped, because there is a distribution profile.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpSettings() {
-    // This step should not appear, since settings.php is fully configured
-    // already.
-  }
-
-  /**
-   * Confirms that the installation succeeded.
-   */
-  public function testInstalled() {
-    $this->assertUrl('user/1');
-    $this->assertResponse(200);
-    // Confirm that we are logged-in after installation.
-    $this->assertText($this->rootUser->getUsername());
-
-    // Confirm that Drupal recognizes this distribution as the current profile.
-    $this->assertEqual(\Drupal::installProfile(), 'mydistro');
-    $this->assertNull(Settings::get('install_profile'), 'The install profile has not been written to settings.php.');
-    $this->assertEqual($this->config('core.extension')->get('profile'), 'mydistro', 'The install profile has been written to core.extension configuration.');
-
-    $this->rebuildContainer();
-    $this->pass('Container can be rebuilt even though distribution is not written to settings.php.');
-    $this->assertEqual(\Drupal::installProfile(), 'mydistro');
-  }
-
-}
diff --git a/core/modules/system/src/Tests/Installer/DistributionProfileTest.php b/core/modules/system/src/Tests/Installer/DistributionProfileTest.php
index 569fe36212c2c98fa553bf9140039ce5fdaee490..0bb47acb44efcddff3c9e30e8f20187eb05ecaa5 100644
--- a/core/modules/system/src/Tests/Installer/DistributionProfileTest.php
+++ b/core/modules/system/src/Tests/Installer/DistributionProfileTest.php
@@ -3,7 +3,6 @@
 namespace Drupal\system\Tests\Installer;
 
 use Drupal\Core\Serialization\Yaml;
-use Drupal\Core\Site\Settings;
 use Drupal\simpletest\InstallerTestBase;
 
 /**
@@ -69,11 +68,6 @@ public function testInstalled() {
     $this->assertResponse(200);
     // Confirm that we are logged-in after installation.
     $this->assertText($this->rootUser->getUsername());
-
-    // Confirm that Drupal recognizes this distribution as the current profile.
-    $this->assertEqual(\Drupal::installProfile(), 'mydistro');
-    $this->assertEqual(Settings::get('install_profile'), 'mydistro', 'The install profile has been written to settings.php.');
-    $this->assertEqual($this->config('core.extension')->get('profile'), 'mydistro', 'The install profile has been written to core.extension configuration.');
   }
 
 }
diff --git a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsMismatchProfileBrokenTest.php b/core/modules/system/src/Tests/Installer/InstallerExistingSettingsMismatchProfileBrokenTest.php
deleted file mode 100644
index 6d866f0cf834c6118ca46a0008c3f736eb02bbca..0000000000000000000000000000000000000000
--- a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsMismatchProfileBrokenTest.php
+++ /dev/null
@@ -1,108 +0,0 @@
-<?php
-
-namespace Drupal\system\Tests\Installer;
-
-use Drupal\Core\DrupalKernel;
-use Drupal\simpletest\InstallerTestBase;
-use Drupal\Core\Database\Database;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Tests installer breaks with a profile mismatch and a read-only settings.php.
- *
- * @group Installer
- */
-class InstallerExistingSettingsMismatchProfileBrokenTest extends InstallerTestBase {
-
-  /**
-   * {@inheritdoc}
-   *
-   * Configures a preexisting settings.php file without an install_profile
-   * setting before invoking the interactive installer.
-   */
-  protected function setUp() {
-    // Pre-configure hash salt.
-    // Any string is valid, so simply use the class name of this test.
-    $this->settings['settings']['hash_salt'] = (object) [
-      'value' => __CLASS__,
-      'required' => TRUE,
-    ];
-
-    // Pre-configure database credentials.
-    $connection_info = Database::getConnectionInfo();
-    unset($connection_info['default']['pdo']);
-    unset($connection_info['default']['init_commands']);
-
-    $this->settings['databases']['default'] = (object) [
-      'value' => $connection_info,
-      'required' => TRUE,
-    ];
-
-    // During interactive install we'll change this to a different profile and
-    // this test will ensure that the new value is written to settings.php.
-    $this->settings['settings']['install_profile'] = (object) [
-      'value' => 'minimal',
-      'required' => TRUE,
-    ];
-
-    // Pre-configure config directories.
-    $site_path = DrupalKernel::findSitePath(Request::createFromGlobals());
-    $this->settings['config_directories'] = [
-      CONFIG_SYNC_DIRECTORY => (object) [
-        'value' => $site_path . '/files/config_staging',
-        'required' => TRUE,
-      ],
-    ];
-    mkdir($this->settings['config_directories'][CONFIG_SYNC_DIRECTORY]->value, 0777, TRUE);
-
-    parent::setUp();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function visitInstaller() {
-    // Make settings file not writable. This will break the installer.
-    $filename = $this->siteDirectory . '/settings.php';
-    // Make the settings file read-only.
-    // Not using File API; a potential error must trigger a PHP warning.
-    chmod($filename, 0444);
-
-    $this->drupalGet($GLOBALS['base_url'] . '/core/install.php?langcode=en&profile=testing');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpLanguage() {
-    // This step is skipped, because there is a lagcode as a query param.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpProfile() {
-    // This step is skipped, because there is a profile as a query param.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpSettings() {
-    // This step should not appear, since settings.php is fully configured
-    // already.
-  }
-
-  protected function setUpSite() {
-    // This step should not appear, since settings.php could not be written.
-  }
-
-  /**
-   * Verifies that installation did not succeed.
-   */
-  public function testBrokenInstaller() {
-    $this->assertTitle('Install profile mismatch | Drupal');
-    $this->assertText("The selected profile testing does not match the install_profile setting, which is minimal. Cannot write updated setting to {$this->siteDirectory}/settings.php.");
-  }
-
-}
diff --git a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsMismatchProfileTest.php b/core/modules/system/src/Tests/Installer/InstallerExistingSettingsMismatchProfileTest.php
deleted file mode 100644
index a179039d0f92b7629a0d0fab54064be08d5e86e7..0000000000000000000000000000000000000000
--- a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsMismatchProfileTest.php
+++ /dev/null
@@ -1,101 +0,0 @@
-<?php
-
-namespace Drupal\system\Tests\Installer;
-
-use Drupal\Core\DrupalKernel;
-use Drupal\Core\Site\Settings;
-use Drupal\simpletest\InstallerTestBase;
-use Drupal\Core\Database\Database;
-use Symfony\Component\HttpFoundation\Request;
-
-/**
- * Tests the installer with an existing settings file but no install profile.
- *
- * @group Installer
- */
-class InstallerExistingSettingsMismatchProfileTest extends InstallerTestBase {
-
-  /**
-   * {@inheritdoc}
-   *
-   * Configures a preexisting settings.php file without an install_profile
-   * setting before invoking the interactive installer.
-   */
-  protected function setUp() {
-    // Pre-configure hash salt.
-    // Any string is valid, so simply use the class name of this test.
-    $this->settings['settings']['hash_salt'] = (object) array(
-      'value' => __CLASS__,
-      'required' => TRUE,
-    );
-
-    // Pre-configure database credentials.
-    $connection_info = Database::getConnectionInfo();
-    unset($connection_info['default']['pdo']);
-    unset($connection_info['default']['init_commands']);
-
-    $this->settings['databases']['default'] = (object) array(
-      'value' => $connection_info,
-      'required' => TRUE,
-    );
-
-    // During interactive install we'll change this to a different profile and
-    // this test will ensure that the new value is written to settings.php.
-    $this->settings['settings']['install_profile'] = (object) [
-      'value' => 'minimal',
-      'required' => TRUE,
-    ];
-
-    // Pre-configure config directories.
-    $this->settings['config_directories'] = array(
-      CONFIG_SYNC_DIRECTORY => (object) array(
-        'value' => DrupalKernel::findSitePath(Request::createFromGlobals()) . '/files/config_sync',
-        'required' => TRUE,
-      ),
-    );
-    mkdir($this->settings['config_directories'][CONFIG_SYNC_DIRECTORY]->value, 0777, TRUE);
-
-    parent::setUp();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function visitInstaller() {
-    // Provide profile and language in query string to skip these pages.
-    $this->drupalGet($GLOBALS['base_url'] . '/core/install.php?langcode=en&profile=testing');
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpLanguage() {
-    // This step is skipped, because there is a lagcode as a query param.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpProfile() {
-    // This step is skipped, because there is a profile as a query param.
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpSettings() {
-    // This step should not appear, since settings.php is fully configured
-    // already.
-  }
-
-  /**
-   * Verifies that installation succeeded.
-   */
-  public function testInstaller() {
-    $this->assertUrl('user/1');
-    $this->assertResponse(200);
-    $this->assertEqual('testing', \Drupal::installProfile());
-    $this->assertEqual('testing', Settings::get('install_profile'), 'Profile was correctly changed to testing in Settings.php');
-  }
-
-}
diff --git a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsNoProfileTest.php b/core/modules/system/src/Tests/Installer/InstallerExistingSettingsNoProfileTest.php
index 95173085ff9ab191017950d3fee3272e5ed1172b..84f861a751491d7823f71d0a14835d73b47b83cf 100644
--- a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsNoProfileTest.php
+++ b/core/modules/system/src/Tests/Installer/InstallerExistingSettingsNoProfileTest.php
@@ -3,6 +3,7 @@
 namespace Drupal\system\Tests\Installer;
 
 use Drupal\Core\DrupalKernel;
+use Drupal\Core\Site\Settings;
 use Drupal\simpletest\InstallerTestBase;
 use Drupal\Core\Database\Database;
 use Symfony\Component\HttpFoundation\Request;
@@ -64,7 +65,7 @@ protected function setUpSettings() {
   public function testInstaller() {
     $this->assertUrl('user/1');
     $this->assertResponse(200);
-    $this->assertEqual('testing', \Drupal::installProfile());
+    $this->assertEqual('testing', Settings::get('install_profile'));
   }
 
 }
diff --git a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsTest.php b/core/modules/system/src/Tests/Installer/InstallerExistingSettingsTest.php
index eaca8fa3a4d91d532eae27c8f9f5fd30c80c102c..6ecd9fdf34936e1f808e500039285d3cc1ccc5d1 100644
--- a/core/modules/system/src/Tests/Installer/InstallerExistingSettingsTest.php
+++ b/core/modules/system/src/Tests/Installer/InstallerExistingSettingsTest.php
@@ -2,7 +2,6 @@
 
 namespace Drupal\system\Tests\Installer;
 
-use Drupal\Core\Site\Settings;
 use Drupal\simpletest\InstallerTestBase;
 use Drupal\Core\Database\Database;
 use Drupal\Core\DrupalKernel;
@@ -75,8 +74,7 @@ protected function setUpSettings() {
   public function testInstaller() {
     $this->assertUrl('user/1');
     $this->assertResponse(200);
-    $this->assertEqual('testing', \Drupal::installProfile(), 'Profile was changed from minimal to testing during interactive install.');
-    $this->assertEqual('testing', Settings::get('install_profile'), 'Profile was correctly changed to testing in Settings.php');
+    $this->assertEqual('testing', drupal_get_profile(), 'Profile was changed from minimal to testing during interactive install.');
   }
 
 }
diff --git a/core/modules/system/src/Tests/Installer/MultipleDistributionsProfileTest.php b/core/modules/system/src/Tests/Installer/MultipleDistributionsProfileTest.php
deleted file mode 100644
index 171a0afc317edf9280e4e1b6d5877dd6a7679eff..0000000000000000000000000000000000000000
--- a/core/modules/system/src/Tests/Installer/MultipleDistributionsProfileTest.php
+++ /dev/null
@@ -1,91 +0,0 @@
-<?php
-
-namespace Drupal\system\Tests\Installer;
-
-use Drupal\Component\Serialization\Yaml;
-use Drupal\Core\Site\Settings;
-use Drupal\simpletest\InstallerTestBase;
-
-/**
- * Tests multiple distribution profile support.
- *
- * @group Installer
- */
-class MultipleDistributionsProfileTest extends InstallerTestBase {
-
-  /**
-   * The distribution profile info.
-   *
-   * @var array
-   */
-  protected $info;
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUp() {
-    // Create two distributions.
-    foreach (['distribution_one', 'distribution_two'] as $name) {
-      $info = [
-        'type' => 'profile',
-        'core' => \Drupal::CORE_COMPATIBILITY,
-        'name' => $name . ' profile',
-        'distribution' => [
-          'name' => $name,
-          'install' => [
-            'theme' => 'bartik',
-          ],
-        ],
-      ];
-      // File API functions are not available yet.
-      $path = $this->siteDirectory . '/profiles/' . $name;
-      mkdir($path, 0777, TRUE);
-      file_put_contents("$path/$name.info.yml", Yaml::encode($info));
-    }
-    // Install the first distribution.
-    $this->profile = 'distribution_one';
-
-    parent::setUp();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpLanguage() {
-    // Verify that the distribution name appears.
-    $this->assertRaw('distribution_one');
-    // Verify that the requested theme is used.
-    $this->assertRaw('bartik');
-    // Verify that the "Choose profile" step does not appear.
-    $this->assertNoText('profile');
-
-    parent::setUpLanguage();
-  }
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setUpProfile() {
-    // This step is skipped, because there is a distribution profile.
-  }
-
-  /**
-   * Confirms that the installation succeeded.
-   */
-  public function testInstalled() {
-    $this->assertUrl('user/1');
-    $this->assertResponse(200);
-    // Confirm that we are logged-in after installation.
-    $this->assertText($this->rootUser->getUsername());
-
-    // Confirm that Drupal recognizes this distribution as the current profile.
-    $this->assertEqual(\Drupal::installProfile(), 'distribution_one');
-    $this->assertEqual(Settings::get('install_profile'), 'distribution_one', 'The install profile has been written to settings.php.');
-    $this->assertEqual($this->config('core.extension')->get('profile'), 'distribution_one', 'The install profile has been written to core.extension configuration.');
-
-    $this->rebuildContainer();
-    $this->pass('Container can be rebuilt as distribution is written to configuration.');
-    $this->assertEqual(\Drupal::installProfile(), 'distribution_one');
-  }
-
-}
diff --git a/core/modules/system/src/Tests/Update/InstallProfileSystemInstall8300Test.php b/core/modules/system/src/Tests/Update/InstallProfileSystemInstall8300Test.php
deleted file mode 100644
index f0eabd62ecfb195ef2baa023096c4d69cbcad96e..0000000000000000000000000000000000000000
--- a/core/modules/system/src/Tests/Update/InstallProfileSystemInstall8300Test.php
+++ /dev/null
@@ -1,40 +0,0 @@
-<?php
-
-namespace Drupal\system\Tests\Update;
-
-use Drupal\Core\Site\Settings;
-
-/**
- * Tests system_update_8300().
- *
- * @group Update
- */
-class InstallProfileSystemInstall8300Test extends UpdatePathTestBase {
-
-  /**
-   * {@inheritdoc}
-   */
-  protected function setDatabaseDumpFiles() {
-    $this->databaseDumpFiles = [
-      __DIR__ . '/../../../tests/fixtures/update/drupal-8.bare.standard.php.gz',
-    ];
-  }
-
-  /**
-   * Ensures that the system_update_8300() runs as expected.
-   */
-  public function testUpdate() {
-    // Ensure the BC layers work and settings.php and configuration is in the
-    // expected state before updating.
-    $this->assertEqual('standard', \Drupal::installProfile());
-    $this->assertEqual('standard', Settings::get('install_profile'), 'The install profile has not been written to settings.php.');
-    $this->assertFalse($this->config('core.extension')->get('profile'), 'The install profile is not present in core.extension configuration.');
-
-    $this->runUpdates();
-    // Confirm that Drupal recognizes this distribution as the current profile.
-    $this->assertEqual('standard', \Drupal::installProfile());
-    $this->assertEqual('standard', Settings::get('install_profile'), 'The install profile has not been written to settings.php.');
-    $this->assertEqual('standard', $this->config('core.extension')->get('profile'), 'The install profile has been written to core.extension configuration.');
-  }
-
-}
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index df284b608a099245ce15f6b48932322d8f94b886..6dc2663d1b41a365a14f90ad29340a9995a89eb5 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -1794,21 +1794,3 @@ function system_update_8203() {
     ->set('logging', 1)
     ->save(TRUE);
 }
-
-/**
- * @addtogroup updates-8.3.x
- * @{
- */
-
-/**
- * Add install profile to core.extension configuration.
- */
-function system_update_8300() {
-  \Drupal::configFactory()->getEditable('core.extension')
-    ->set('profile', \Drupal::installProfile())
-    ->save();
-}
-
-/**
- * @} End of "addtogroup updates-8.3.x".
- */
diff --git a/core/tests/Drupal/KernelTests/Core/Bootstrap/GetFilenameTest.php b/core/tests/Drupal/KernelTests/Core/Bootstrap/GetFilenameTest.php
index e2108b3cc09cf6a812972fd5d9c5f7e50d9de9a7..6cdc4b39ead2529e813bec1f10b9fc38dce4339d 100644
--- a/core/tests/Drupal/KernelTests/Core/Bootstrap/GetFilenameTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Bootstrap/GetFilenameTest.php
@@ -2,7 +2,6 @@
 
 namespace Drupal\KernelTests\Core\Bootstrap;
 
-use Drupal\Core\DependencyInjection\ContainerBuilder;
 use Drupal\KernelTests\KernelTestBase;
 
 /**
@@ -17,19 +16,15 @@ class GetFilenameTest extends KernelTestBase {
    */
   public static $modules = ['system'];
 
-  /**
-   * {@inheritdoc}
-   */
-  public function register(ContainerBuilder $container) {
-    parent::register($container);
-    // Use the testing install profile.
-    $container->setParameter('install_profile', 'testing');
-  }
-
   /**
    * Tests that drupal_get_filename() works when the file is not in database.
    */
   function testDrupalGetFilename() {
+    // drupal_get_profile() is using obtaining the profile from state if the
+    // install_state global is not set.
+    global $install_state;
+    $install_state['parameters']['profile'] = 'testing';
+
     // Rebuild system.module.files state data.
     // @todo Remove as part of https://www.drupal.org/node/2186491
     drupal_static_reset('system_rebuild_module_data');
diff --git a/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php b/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
index bde5644ec6afed9002729ae9440c8fbec9e0b688..945e994e3ba7665866a25228193ad9a80e6151c8 100644
--- a/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
+++ b/core/tests/Drupal/KernelTests/Core/Config/ConfigImporterTest.php
@@ -668,34 +668,6 @@ public function testInstallProfile() {
     }
   }
 
-  /**
-   * Tests install profile validation during configuration import.
-   *
-   * @see \Drupal\Core\EventSubscriber\ConfigImportSubscriber
-   */
-  public function testInstallProfileMisMatch() {
-    $sync = $this->container->get('config.storage.sync');
-
-    $extensions = $sync->read('core.extension');
-    // Change the install profile.
-    $extensions['profile'] = 'this_will_not_work';
-    $sync->write('core.extension', $extensions);
-
-    try {
-      $this->configImporter->reset()->import();
-      $this->fail('ConfigImporterException not thrown; an invalid import was not stopped due to missing dependencies.');
-    }
-    catch (ConfigImporterException $e) {
-      $this->assertEqual($e->getMessage(), 'There were errors validating the config synchronization.');
-      $error_log = $this->configImporter->getErrors();
-      // Install profiles can not be changed. Note that KernelTestBase currently
-      // does not use an install profile. This situation should be impossible
-      // to get in but site's can removed the install profile setting from
-      // settings.php so the test is valid.
-      $this->assertEqual(['Cannot change the install profile from <em class="placeholder">this_will_not_work</em> to <em class="placeholder"></em> once Drupal is installed.'], $error_log);
-    }
-  }
-
   /**
    * Tests config_get_config_directory().
    */
diff --git a/core/tests/Drupal/KernelTests/KernelTestBase.php b/core/tests/Drupal/KernelTests/KernelTestBase.php
index 9f6b975d8e8401833fb568290fed5ca93b6a94ac..f10cb14d099f92789fd6c7d93c766b1ceb5a500c 100644
--- a/core/tests/Drupal/KernelTests/KernelTestBase.php
+++ b/core/tests/Drupal/KernelTests/KernelTestBase.php
@@ -392,7 +392,6 @@ private function bootKernel() {
     $this->container->get('config.storage')->write('core.extension', array(
       'module' => array_fill_keys($modules, 0),
       'theme' => array(),
-      'profile' => '',
     ));
 
     $settings = Settings::getAll();
diff --git a/core/tests/Drupal/Tests/Core/Extension/DefaultConfigTest.php b/core/tests/Drupal/Tests/Core/Extension/DefaultConfigTest.php
index 56f913ae250eba8f2e30b0e6bea50b34ad9ba8bf..879e7a00222182bcf718700a2d72019612a45019 100644
--- a/core/tests/Drupal/Tests/Core/Extension/DefaultConfigTest.php
+++ b/core/tests/Drupal/Tests/Core/Extension/DefaultConfigTest.php
@@ -27,7 +27,6 @@ public function testConfigIsEmpty() {
     $expected = array(
       'module' => array(),
       'theme' => array(),
-      'profile' => '',
     );
     $this->assertEquals($expected, $config);
   }
diff --git a/sites/default/default.settings.php b/sites/default/default.settings.php
index 25d498e6f1d711cadb7f92d25668598f520a713f..9ee73605217fb2b96068bb5b913772e21f6cdd2b 100644
--- a/sites/default/default.settings.php
+++ b/sites/default/default.settings.php
@@ -270,11 +270,6 @@
  * by the user.
  *
  * @see install_select_profile()
- *
- * @deprecated in Drupal 8.3.0 and will be removed before Drupal 9.0.0. The
- *   install profile is written to the core.extension configuration. If a
- *   service requires the install profile use the 'install_profile' container
- *   parameter. Functional code can use \Drupal::installProfile().
  */
 # $settings['install_profile'] = '';