diff --git a/core/lib/Drupal/Core/Config/ConfigManagerInterface.php b/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
index d908e3f..d40fc66 100644
--- a/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
+++ b/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
@@ -13,6 +13,11 @@
 interface ConfigManagerInterface {
 
   /**
+   * @todo
+   */
+  const UNKNOWN_DEFAULT_CONFIG_HASH = 'UnknownDefaultConfigHash';
+
+  /**
    * Returns the entity type of a configuration object.
    *
    * @param string $name
diff --git a/core/modules/system/src/Tests/Update/ConfigHashUpdatePathTest.php b/core/modules/system/src/Tests/Update/ConfigHashUpdatePathTest.php
new file mode 100644
index 0000000..c7499f4
--- /dev/null
+++ b/core/modules/system/src/Tests/Update/ConfigHashUpdatePathTest.php
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Update\ConfigHashUpdatePathTest.
+ */
+
+namespace Drupal\system\Tests\Update;
+use Drupal\Core\Config\ConfigManagerInterface;
+
+/**
+ * Tests system_update_8015().
+ *
+ * @group Update
+ */
+class ConfigHashUpdatePathTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../tests/fixtures/update/drupal-8.bare.standard.php.gz',
+    ];
+  }
+
+  /**
+   * Tests that default configuration was updateed with default config hash.
+   */
+  public function testDefaultConfigHash() {
+    // Ensure we don't overwrite existing values.
+    $this->config('system.mail')->set('_core.default_config_hash', 'TestValue')->save();
+
+    $this->runUpdates();
+
+    $this->assertIdentical(ConfigManagerInterface::UNKNOWN_DEFAULT_CONFIG_HASH, $this->config('system.site')->get('_core.default_config_hash'));
+    $this->assertEqual('TestValue', $this->config('system.mail')->get('_core.default_config_hash'));
+    $this->assertIdentical(NULL, $this->config('core.date_format.fallback')->get('_core.default_config_hash'), 'Default configuration entities have no hash.');
+  }
+
+}
diff --git a/core/modules/system/src/Tests/Update/ConfigHashWithLanguageUpdatePathTest.php b/core/modules/system/src/Tests/Update/ConfigHashWithLanguageUpdatePathTest.php
new file mode 100644
index 0000000..bf1cb51
--- /dev/null
+++ b/core/modules/system/src/Tests/Update/ConfigHashWithLanguageUpdatePathTest.php
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Tests\Update\ConfigHashWithLanguageUpdatePathTest.
+ */
+
+namespace Drupal\system\Tests\Update;
+use Drupal\Core\Config\ConfigManagerInterface;
+
+/**
+ * Tests system_update_8015().
+ *
+ * @group Update
+ */
+class ConfigHashWithLanguageUpdatePathTest extends UpdatePathTestBase {
+
+  /**
+   * {@inheritdoc}
+   */
+  protected function setDatabaseDumpFiles() {
+    $this->databaseDumpFiles = [
+      __DIR__ . '/../../../tests/fixtures/update/drupal-8.filled.standard.php.gz',
+    ];
+  }
+
+  /**
+   * Tests that default configuration was updateed with default config hash.
+   */
+  public function testDefaultConfigHash() {
+    $this->runUpdates();
+
+    // The system.site configuration has translations there it has no hash
+    // because we can't determine which configuration version it came from.
+    $this->assertIdentical(NULL, $this->config('system.site')->get('_core.default_config_hash'), 'The system.site configuration has translations are therefore has no default config hash.');
+    // The system.mail has no translations therefore it should have the fake
+    // hash.
+    $this->assertEqual(ConfigManagerInterface::UNKNOWN_DEFAULT_CONFIG_HASH, $this->config('system.mail')->get('_core.default_config_hash'));
+
+    $this->assertIdentical(NULL, $this->config('filter.format.test_text_format')->get('_core.default_config_hash'), 'The filter.format.test_text_format configuration has no default config hash because it is not default configuration.');
+  }
+
+}
diff --git a/core/modules/system/system.install b/core/modules/system/system.install
index 49b5ff3..f09745d 100644
--- a/core/modules/system/system.install
+++ b/core/modules/system/system.install
@@ -7,6 +7,9 @@
 
 use Drupal\Component\Utility\Crypt;
 use Drupal\Component\Utility\Environment;
+use Drupal\Core\Config\ExtensionInstallStorage;
+use Drupal\Core\Config\ConfigManagerInterface;
+use Drupal\language\ConfigurableLanguageManagerInterface;
 use Drupal\Core\Url;
 use Drupal\Core\Database\Database;
 use Drupal\Core\DrupalKernel;
@@ -1842,3 +1845,74 @@ function system_update_8014() {
 /**
  * @} End of "addtogroup updates-8.0.0-rc".
  */
+
+/**
+ * @addtogroup updates-8.1.0
+ * @{
+ */
+
+/**
+ * Update configuration is it is provided by a module or theme.
+ */
+function system_update_8015(&$sandbox = NULL) {
+  /** @var \Drupal\Core\Config\StorageInterface $config_storage */
+  $config_storage = \Drupal::service('config.storage');
+  /** @var \Drupal\Core\Config\ConfigManagerInterface $config_manager */
+  $config_manager = \Drupal::service('config.manager');
+  $language_manager = \Drupal::languageManager();
+
+  // Create a method to search for overrides as necessary.
+  if ($language_manager->isMultilingual() && $language_manager instanceof ConfigurableLanguageManagerInterface) {
+    $check_for_override = function ($name) use ($language_manager) {
+      foreach ($language_manager->getLanguages() as $langcode => $language) {
+        if ($language_manager->getLanguageConfigOverrideStorage($langcode)->exists($name)) {
+          return TRUE;
+        }
+      }
+      return FALSE;
+    };
+  }
+  else {
+    $check_for_override = function () {
+      return FALSE;
+    };
+  }
+
+  $install_storage = new ExtensionInstallStorage($config_storage, ExtensionInstallStorage::CONFIG_INSTALL_DIRECTORY);
+  $optional_storage = new ExtensionInstallStorage($config_storage, ExtensionInstallStorage::CONFIG_OPTIONAL_DIRECTORY);
+
+
+  if (empty($sandbox['configs'])) {
+    $sandbox['configs'] = \Drupal::service('config.storage')->listAll();
+    $sandbox['configs_processed'] = [];
+  }
+
+  // Process config.
+  $configs_to_process = array_diff($sandbox['configs'], $sandbox['configs_processed']);
+  $configs_to_process = array_slice($configs_to_process, 0, 50);
+  $configs_to_process = $config_storage->readMultiple($configs_to_process);
+  foreach ($configs_to_process as $name => $data) {
+    // Config with the hash already can safely be ignored. Configuration which
+    // does not match a default config file name can be ignored.
+    if (!isset($data['_core']['default_config_hash']) &&
+      ($install_storage->exists($name) || $optional_storage->exists($name))
+    ) {
+      // @todo configuration entities.
+      $is_config_entity = (bool) $config_manager->getEntityTypeIdByName($name);
+
+      if (!$is_config_entity && !$check_for_override($name)) {
+        $data = [
+            '_core' => ['default_config_hash' => ConfigManagerInterface::UNKNOWN_DEFAULT_CONFIG_HASH]
+          ] + $data;
+        $config_storage->write($name, $data);
+      }
+    }
+    $sandbox['configs_processed'][] = $name;
+  }
+
+  $sandbox['#finished'] = empty($configs_to_process) ? 1 : count($sandbox['configs_processed']) / count($sandbox['configs']);
+}
+
+/**
+ * @} End of "addtogroup updates-8.1.0".
+ */
