diff --git a/core/lib/Drupal/Core/Config/Config.php b/core/lib/Drupal/Core/Config/Config.php
index 584feb7c53..91d7695006 100644
--- a/core/lib/Drupal/Core/Config/Config.php
+++ b/core/lib/Drupal/Core/Config/Config.php
@@ -303,4 +303,28 @@ public function getOriginal($key = '', $apply_overrides = TRUE) {
     }
   }
 
+  /**
+   * Determines if overrides are applied to a key for this configuration object.
+   *
+   * @param string $key
+   *   A string that maps to a key within the configuration data.
+   *
+   * @return bool
+   *   TRUE if there are any overrides for the key, otherwise FALSE.
+   */
+  public function hasOverrides($key = '') {
+    if ($key) {
+      $parts = explode('.', $key);
+      $override_exists = FALSE;
+      if (isset($this->moduleOverrides) && is_array($this->moduleOverrides)) {
+        $override_exists = NestedArray::keyExists($this->moduleOverrides, $parts);
+      }
+      if (!$override_exists && isset($this->settingsOverrides) && is_array($this->settingsOverrides)) {
+        $override_exists = NestedArray::keyExists($this->settingsOverrides, $parts);
+      }
+      return $override_exists;
+    }
+    return !empty($this->moduleOverrides) || !empty($this->settingsOverrides);
+  }
+
 }
diff --git a/core/tests/Drupal/Tests/Core/Config/ConfigTest.php b/core/tests/Drupal/Tests/Core/Config/ConfigTest.php
index 41c3e93c99..d5b71edc07 100644
--- a/core/tests/Drupal/Tests/Core/Config/ConfigTest.php
+++ b/core/tests/Drupal/Tests/Core/Config/ConfigTest.php
@@ -173,6 +173,7 @@ public function testSaveExisting($data) {
    * @covers ::setModuleOverride
    * @covers ::setSettingsOverride
    * @covers ::getOriginal
+   * @covers ::hasOverrides
    * @dataProvider overrideDataProvider
    */
   public function testOverrideData($data, $module_data, $setting_data) {
@@ -184,26 +185,40 @@ public function testOverrideData($data, $module_data, $setting_data) {
 
     // Save so that the original data is stored.
     $this->config->save();
+    $this->assertFalse($this->config->hasOverrides());
+    $this->assertOverriddenKeys($data);
 
     // Set module override data and check value before and after save.
     $this->config->setModuleOverride($module_data);
     $this->assertConfigDataEquals($module_data);
+    $this->assertOverriddenKeys($data, $module_data);
+
     $this->config->save();
     $this->assertConfigDataEquals($module_data);
+    $this->assertOverriddenKeys($data, $module_data);
+
+    // Reset the module overrides.
+    $this->config->setModuleOverride([]);
+    $this->assertOverriddenKeys($data);
 
     // Set setting override data and check value before and after save.
     $this->config->setSettingsOverride($setting_data);
     $this->assertConfigDataEquals($setting_data);
+    $this->assertOverriddenKeys($data, $setting_data);
     $this->config->save();
     $this->assertConfigDataEquals($setting_data);
+    $this->assertOverriddenKeys($data, $setting_data);
 
     // Set module overrides again to ensure override order is correct.
     $this->config->setModuleOverride($module_data);
+    $merged_overrides = array_merge($module_data, $setting_data);
 
     // Setting data should be overriding module data.
     $this->assertConfigDataEquals($setting_data);
+    $this->assertOverriddenKeys($data, $merged_overrides);
     $this->config->save();
     $this->assertConfigDataEquals($setting_data);
+    $this->assertOverriddenKeys($data, $merged_overrides);
 
     // Check original data has not changed.
     $this->assertOriginalConfigDataEquals($data, FALSE);
@@ -216,6 +231,15 @@ public function testOverrideData($data, $module_data, $setting_data) {
       $config_value = $this->config->getOriginal($key);
       $this->assertEquals($value, $config_value);
     }
+
+    // Check that the overrides can be completely reset.
+    $this->config->setModuleOverride([]);
+    $this->config->setSettingsOverride([]);
+    $this->assertConfigDataEquals($data);
+    $this->assertOverriddenKeys($data);
+    $this->config->save();
+    $this->assertConfigDataEquals($data);
+    $this->assertOverriddenKeys($data);
   }
 
   /**
@@ -449,6 +473,85 @@ public function overrideDataProvider() {
           'a' => 'settingValue',
         ],
       ],
+      [
+        // Original data.
+        [
+          'a' => 'originalValue',
+          'b' => 'originalValue',
+          'c' => 'originalValue',
+        ],
+        // Module overrides.
+        [
+          'a' => 'moduleValue',
+          'b' => 'moduleValue',
+        ],
+        // Setting overrides.
+        [
+          'a' => 'settingValue',
+        ],
+      ],
+      [
+        // Original data.
+        [
+          'a' => 'allTheSameValue',
+        ],
+        // Module overrides.
+        [
+          'a' => 'allTheSameValue',
+        ],
+        // Setting overrides.
+        [
+          'a' => 'allTheSameValue',
+        ],
+      ],
+      [
+        // Original data.
+        [
+          'a' => [
+            'b' => 'originalValue'
+          ],
+        ],
+        // Module overrides.
+        [
+          'a' => [
+            'b' => 'moduleValue'
+          ],
+        ],
+        // Setting overrides.
+        [
+          'a' => [
+            'b' => 'settingValue'
+          ],
+        ],
+      ],
+      [
+        // Original data.
+        [
+          'a' => [
+            'b' => 'originalValue'
+          ],
+        ],
+        // Module overrides.
+        [
+          'a' => [
+            'b' => 'moduleValue'
+          ],
+        ],
+        // Setting overrides.
+        [],
+      ],
+      [
+        // Original data.
+        [
+          'a' => [
+            'b' => 'originalValue'
+          ],
+        ],
+        // Module overrides.
+        [],
+        // Setting overrides.
+        [],
+      ],
     ];
   }
 
@@ -545,4 +648,38 @@ public function testSafeStringHandling() {
     $this->assertSame($safe_string, $this->config->get('bar'));
   }
 
+  /**
+   * Assert that the correct keys are overridden.
+   *
+   * @param array $data
+   *   The original data.
+   * @param array $overridden_data
+   *   The overridden data.
+   */
+  protected function assertOverriddenKeys(array $data, array $overridden_data = []) {
+    if (empty($overridden_data)) {
+      $this->assertFalse($this->config->hasOverrides());
+    }
+    else {
+      $this->assertTrue($this->config->hasOverrides());
+      foreach ($overridden_data as $key => $value) {
+        // If there are nested overrides test a combined key.
+        if (is_array($value)) {
+          $key = $key . '.' . key($value);
+        }
+        $this->assertTrue($this->config->hasOverrides($key));
+      }
+    }
+
+    $non_overridden_keys = array_diff(array_keys($data), array_keys($overridden_data));
+    foreach ($non_overridden_keys as $non_overridden_key) {
+      $this->assertFalse($this->config->hasOverrides($non_overridden_key));
+      // If there are nested overrides test a combined key also.
+      if (is_array($overridden_data)) {
+        $nested_non_overridden_key = $non_overridden_key . '.' . key($overridden_data);
+        $this->assertFalse($this->config->hasOverrides($nested_non_overridden_key));
+      }
+    }
+  }
+
 }
