diff --git a/core/lib/Drupal/Core/Config/ConfigInstaller.php b/core/lib/Drupal/Core/Config/ConfigInstaller.php
index 72ae554..8398820 100644
--- a/core/lib/Drupal/Core/Config/ConfigInstaller.php
+++ b/core/lib/Drupal/Core/Config/ConfigInstaller.php
@@ -155,16 +155,17 @@ protected function listDefaultConfigCollection($collection, $type, $name, array
     $extension_path = drupal_get_path($type, $name);
     if ($type !== 'core' && is_dir($extension_path . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY)) {
       $default_storage = new FileStorage($extension_path . '/' . InstallStorage::CONFIG_INSTALL_DIRECTORY, $collection);
-      $other_module_config = array_filter($default_storage->listAll(), function ($value) use ($name) {
-        return !preg_match('/^' . $name . '\./', $value);
-      });
-
-      $other_module_config = array_filter($other_module_config, function ($config_name) use ($enabled_extensions) {
+      $extension_provided_config = array_filter($default_storage->listAll(), function ($config_name) use ($config_to_install, $enabled_extensions) {
+        // Ensure that we have not already discovered the config to install.
+        if (in_array($config_name, $config_to_install)) {
+          return FALSE;
+        }
+        // Ensure the configuration is provided by an enabled module.
         $provider = Unicode::substr($config_name, 0, strpos($config_name, '.'));
         return in_array($provider, $enabled_extensions);
       });
 
-      $config_to_install = array_merge($config_to_install, $other_module_config);
+      $config_to_install = array_merge($config_to_install, $extension_provided_config);
     }
 
     return $config_to_install;
@@ -329,4 +330,32 @@ public function setSyncing($status) {
   public function isSyncing() {
     return $this->isSyncing;
   }
+
+  /**
+   * {@inheritdoc}
+   */
+  public function findPreExistingConfiguration($type, $name) {
+    $existing_configuration = array();
+    // Gather information about all the supported collections.
+    $collection_info = $this->configManager->getConfigCollectionInfo();
+
+    // Read enabled extensions directly from configuration to avoid circular
+    // dependencies on ModuleHandler and ThemeHandler.
+    $extension_config = $this->configFactory->get('core.extension');
+    $enabled_extensions = array_keys((array) $extension_config->get('module'));
+    $enabled_extensions += array_keys((array) $extension_config->get('theme'));
+    // Add the extensions that will be enabled to the list of enabled
+    // extensions.
+    $enabled_extensions[] = $name;
+    foreach ($collection_info->getCollectionNames(TRUE) as $collection) {
+      $config_to_install = $this->listDefaultConfigCollection($collection, $type, $name, $enabled_extensions);
+      $active_storage = $this->getActiveStorage($collection);
+      foreach ($config_to_install as $config_name) {
+        if ($active_storage->exists($config_name)) {
+          $existing_configuration[$collection][] = $config_name;
+        }
+      }
+    }
+    return $existing_configuration;
+  }
 }
diff --git a/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php b/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php
index 13e5b0e..1d1e7e0 100644
--- a/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php
+++ b/core/lib/Drupal/Core/Config/ConfigInstallerInterface.php
@@ -84,4 +84,26 @@ public function setSyncing($status);
    */
   public function isSyncing();
 
+  /**
+   * Finds pre-existing configuration objects for the provided extension.
+   *
+   * Extensions can not be installed if configuration objects exist in the
+   * active storage with the same names. This can happen in a number of ways,
+   * commonly:
+   * - if a user has created configuration with the same name as that provided
+   *   by the extension.
+   * - if the extension provides default configuration that does not depend on
+   *   it and the extension has been uninstalled and is about to the
+   *   reinstalled.
+   *
+   * @param string $type
+   *   Type of extension to install.
+   * @param string $name
+   *   Name of extension to install.
+   *
+   * @return array
+   *   Array of configuration objects that already exist keyed by collection.
+   */
+  public function findPreExistingConfiguration($type, $name);
+
 }
diff --git a/core/lib/Drupal/Core/Config/ConfigManager.php b/core/lib/Drupal/Core/Config/ConfigManager.php
index a97cf72..9fcb29b 100644
--- a/core/lib/Drupal/Core/Config/ConfigManager.php
+++ b/core/lib/Drupal/Core/Config/ConfigManager.php
@@ -110,6 +110,19 @@ public function getEntityTypeIdByName($name) {
   /**
    * {@inheritdoc}
    */
+  public function loadConfigEntityByName($name) {
+    $entity_type_id = $this->getEntityTypeIdByName($name);
+    if ($entity_type_id) {
+      $entity_type = $this->entityManager->getDefinition($entity_type_id);
+      $id = substr($name, strlen($entity_type->getConfigPrefix()) + 1);
+      return $this->entityManager->getStorage($entity_type_id)->load($id);
+    }
+    return NULL;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
   public function getEntityManager() {
     return $this->entityManager;
   }
diff --git a/core/lib/Drupal/Core/Config/ConfigManagerInterface.php b/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
index c5fdec1..d488c78 100644
--- a/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
+++ b/core/lib/Drupal/Core/Config/ConfigManagerInterface.php
@@ -24,6 +24,17 @@
   public function getEntityTypeIdByName($name);
 
   /**
+   * Loads a configuration entity from the configuration name.
+   *
+   * @param string $name
+   *   The configuration object name.
+   *
+   * @return \Drupal\Core\Entity\EntityInterface|null
+   *   The configuration entity or NULL if it does not exist.
+   */
+  public function loadConfigEntityByName($name);
+
+  /**
    * Gets the entity manager.
    *
    * @return \Drupal\Core\Entity\EntityManagerInterface
diff --git a/core/lib/Drupal/Core/Config/PreExistingConfigException.php b/core/lib/Drupal/Core/Config/PreExistingConfigException.php
new file mode 100644
index 0000000..84a85fb
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/PreExistingConfigException.php
@@ -0,0 +1,73 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Config\PreExistingConfigException.
+ */
+
+namespace Drupal\Core\Config;
+
+use Drupal\Component\Utility\String;
+
+/**
+ * An exception thrown if configuration with the same name already exists.
+ */
+class PreExistingConfigException extends ConfigException {
+
+  /**
+   * A list of configuration objects that already exist in active configuration.
+   *
+   * @var array
+   */
+  protected $configObjects = [];
+
+  /**
+   * The name of the module that is being installed.
+   *
+   * @var string
+   */
+  protected $module;
+
+  /**
+   * Gets the list of configuration objects that already exist.
+   *
+   * @return array
+   *   A list of configuration objects that already exist in active
+   *   configuration.
+   */
+  public function getConfigObjects() {
+    return $this->configObjects;
+  }
+
+  /**
+   * Gets the name of the module that is being installed.
+   *
+   * @return string
+   *   The name of the module that is being installed.
+   */
+  public function getModule() {
+    return $this->module;
+  }
+
+  /**
+   * Creates an exception for a module name and a list of configuration objects.
+   *
+   * @param $module
+   *   The name of the module that is being installed.
+   * @param array $config_objects
+   *   A list of configuration objects that already exist in active
+   *   configuration.
+   *
+   * @return \Drupal\Core\Config\PreExistingConfigException
+   */
+  public static function create($module, array $config_objects) {
+    $message = String::format('Configuration objects (@config_names) provided by @extension already exist in active configuration',
+      array('@config_names' => implode(', ', $config_objects), '@extension' => $module)
+    );
+    $e = new static($message);
+    $e->configObjects = $config_objects;
+    $e->module = $module;
+    return $e;
+  }
+
+}
diff --git a/core/lib/Drupal/Core/Extension/ModuleInstaller.php b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
index 73278d3..a3b8345 100644
--- a/core/lib/Drupal/Core/Extension/ModuleInstaller.php
+++ b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
@@ -10,6 +10,8 @@
 use Drupal\Component\Serialization\Yaml;
 use Drupal\Core\Cache\Cache;
 use Drupal\Core\Cache\CacheBackendInterface;
+use Drupal\Core\Config\PreExistingConfigException;
+use Drupal\Core\Config\StorageInterface;
 use Drupal\Core\DrupalKernelInterface;
 use Drupal\Component\Utility\String;
 
@@ -149,6 +151,18 @@ public function install(array $module_list, $enable_dependencies = TRUE) {
           )));
         }
 
+        // Install profiles can not have config clashes as if they contain
+        // configuration with the same name as a module it will override it.
+        if ($module != drupal_get_profile()) {
+          // Validate default configuration of this module. Bail if unable to
+          // install. Should not continue installing more modules because those
+          // may depend on this one.
+          $existing_configuration = $config_installer->findPreExistingConfiguration('module', $module);
+          if (!empty($existing_configuration)) {
+            throw PreExistingConfigException::create($module, $existing_configuration[StorageInterface::DEFAULT_COLLECTION]);
+          }
+        }
+
         $extension_config
           ->set("module.$module", 0)
           ->set('module', module_config_sort($extension_config->get('module')))
diff --git a/core/modules/config/src/Tests/ConfigInstallWebTest.php b/core/modules/config/src/Tests/ConfigInstallWebTest.php
index 1fecc90..cc3cd66 100644
--- a/core/modules/config/src/Tests/ConfigInstallWebTest.php
+++ b/core/modules/config/src/Tests/ConfigInstallWebTest.php
@@ -2,12 +2,13 @@
 
 /**
  * @file
- * Definition of Drupal\config\Tests\ConfigInstallTest.
+ * Contains \Drupal\config\Tests\ConfigInstallWebTest.
  */
 
 namespace Drupal\config\Tests;
 
 use Drupal\Core\Config\InstallStorage;
+use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\simpletest\WebTestBase;
 use Drupal\Core\Config\FileStorage;
 
@@ -20,11 +21,18 @@
 class ConfigInstallWebTest extends WebTestBase {
 
   /**
+   * The admin user used in this test.
+   */
+  protected $adminUser;
+
+  /**
    * {@inheritdoc}
    */
   protected function setUp() {
     parent::setUp();
 
+    $this->adminUser = $this->drupalCreateUser(array('administer modules'));
+
     // Ensure the global variable being asserted by this test does not exist;
     // a previous test executed in this request/process might have set it.
     unset($GLOBALS['hook_config_test']);
@@ -82,6 +90,16 @@ function testIntegrationModuleReinstallation() {
     $this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
 
     // Reinstall the integration module.
+    try {
+      \Drupal::service('module_installer')->install(array('config_integration_test'));
+      $this->fail('Expected PreExistingConfigException not thrown.');
+    }
+    catch (PreExistingConfigException $e) {
+      $this->assertEqual($e->getMessage(), 'Configuration objects (config_test.dynamic.config_integration_test) provided by config_integration_test already exist in active configuration');
+    }
+
+    // Delete the configuration entity so that the install will work.
+    $config_entity->delete();
     \Drupal::service('module_installer')->install(array('config_integration_test'));
 
     // Verify the integration module's config was re-installed.
@@ -91,10 +109,10 @@ function testIntegrationModuleReinstallation() {
     $this->assertIdentical($config_static->isNew(), FALSE);
     $this->assertIdentical($config_static->get('foo'), 'default setting');
 
-    // Verify the customized integration config still exists.
-    $config_entity = $this->config($default_configuration_entity);
+    // Verify the integration config is using the default.
+    $config_entity = \Drupal::config($default_configuration_entity);
     $this->assertIdentical($config_entity->isNew(), FALSE);
-    $this->assertIdentical($config_entity->get('label'), 'Customized integration config label');
+    $this->assertIdentical($config_entity->get('label'), 'Default integration config label');
   }
 
   /**
@@ -149,4 +167,53 @@ function testInstallProfileConfigOverwrite() {
     $config = $this->config($config_name);
     $this->assertIdentical($config->get(), $expected_profile_data);
   }
+
+  /**
+   * Tests pre-existing configuration detection.
+   */
+  public function testPreExistingConfigInstall() {
+    $this->drupalLogin($this->adminUser);
+
+    // Try to install config_install_fail_test and config_test. This installs
+    // the config_test module first because it is a dependency and then detects
+    // a config clash.
+    // @see \Drupal\system\Form\ModulesListForm::submitForm()
+    $this->drupalPostForm('admin/modules', array('modules[Testing][config_test][enable]' => TRUE, 'modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
+    $this->assertRaw(t('The default configuration %config_names provided by @extension already exists in active configuration.',
+      array('%config_names' => implode(', ', ['config_test.dynamic.dotted.default']), '@extension' => 'Configuration install fail test')));
+
+    // Uninstall the config_test module to test the confirm form.
+    $this->drupalPostForm('admin/modules/uninstall', array('uninstall[config_test]' => TRUE), t('Uninstall'));
+    $this->drupalPostForm(NULL, array(), t('Uninstall'));
+
+    // Try to install config_install_fail_test without config_test enabled. This
+    // installs the config_test module because it is a dependency and then
+    // detects a config clash. Unlike the first module install this uses the
+    // confirm form.
+    // @see \Drupal\system\Form\ModulesListConfirmForm::submitForm()
+    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
+    $this->drupalPostForm(NULL, array(), t('Continue'));
+    $this->assertRaw(t('The default configuration %config_names provided by @extension already exists in active configuration.',
+      array('%config_names' => implode(', ', ['config_test.dynamic.dotted.default']), '@extension' => 'Configuration install fail test')));
+
+    // Update the container so we get an environment with config_test installed.
+    $this->rebuildContainer();
+    $config_entity = \Drupal::entityManager()->getStorage('config_test')->load('dotted.default');
+
+    // Try to install config_install_fail_test. Now we are able to detect a
+    // configuration clash before installation so the user will be taken to...
+    // The config_test module was enabled in the previous submission.
+    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
+    $this->assertUrl('admin/modules/config-clash');
+    $this->assertText('You must delete or rename the following configuration to install Configuration install fail test.');
+    $this->assertLinkByHref($config_entity->url());
+
+    // Try to install config_install_fail_dependency_test. This fails because
+    // it depends on config_install_fail_test and we can detect the
+    // configuration clash before beginning the installation.
+    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_dependency_test][enable]' => TRUE), t('Save configuration'));
+    $this->assertUrl('admin/modules/config-clash');
+    $this->assertText('You must delete or rename the following configuration to install Configuration install fail dependency test, Configuration install fail test.');
+    $this->assertLinkByHref($config_entity->url());
+  }
 }
diff --git a/core/modules/config/src/Tests/ConfigOtherModuleTest.php b/core/modules/config/src/Tests/ConfigOtherModuleTest.php
index 5737d78..9f00fa1 100644
--- a/core/modules/config/src/Tests/ConfigOtherModuleTest.php
+++ b/core/modules/config/src/Tests/ConfigOtherModuleTest.php
@@ -7,6 +7,7 @@
 
 namespace Drupal\config\Tests;
 
+use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\simpletest\WebTestBase;
 
 /**
@@ -57,10 +58,17 @@ public function testInstallOtherModuleFirst() {
     // Default configuration provided by config_test should still exist.
     $this->assertTrue(entity_load('config_test', 'dotted.default', TRUE), 'The configuration is not deleted.');
 
-    // Re-enable module to test that default config is unchanged.
-    $this->installModule('config_other_module_config_test');
-    $config_entity = entity_load('config_test', 'other_module_test', TRUE);
-    $this->assertEqual($config_entity->get('style'), "The piano ain't got no wrong notes.", 'Re-enabling the module does not install default config over the existing config entity.');
+    // Re-enable module to test that pre-existing default configuration throws
+    // an error.
+    $msg = "The expected PreExistingConfigException is thrown by reinstalling config_other_module_config_test.";
+    try {
+      $this->installModule('config_other_module_config_test');
+      $this->fail($msg);
+    }
+    catch (PreExistingConfigException $e) {
+      $this->pass($msg);
+      $this->assertTrue(strpos($e->getMessage(), 'config_test.dynamic.other_module_test provided by config_other_module_config_test') !== FALSE, 'The exception message contains "config_test.dynamic.other_module_test provided by config_other_module_config_test".');
+    }
   }
 
   /**
diff --git a/core/modules/config/tests/config_install_fail_dependency_test/config_install_fail_dependency_test.info.yml b/core/modules/config/tests/config_install_fail_dependency_test/config_install_fail_dependency_test.info.yml
new file mode 100644
index 0000000..b5776f2
--- /dev/null
+++ b/core/modules/config/tests/config_install_fail_dependency_test/config_install_fail_dependency_test.info.yml
@@ -0,0 +1,7 @@
+name: 'Configuration install fail dependency test'
+type: module
+package: Testing
+version: VERSION
+core: 8.x
+dependencies:
+  - config_install_fail_test
diff --git a/core/modules/config/tests/config_install_fail_test/config/install/config_test.dynamic.dotted.default.yml b/core/modules/config/tests/config_install_fail_test/config/install/config_test.dynamic.dotted.default.yml
new file mode 100644
index 0000000..eb94849
--- /dev/null
+++ b/core/modules/config/tests/config_install_fail_test/config/install/config_test.dynamic.dotted.default.yml
@@ -0,0 +1,7 @@
+# Clashes with default configuration provided by the config_test module.
+id: dotted.default
+label: 'Config install fail'
+weight: 0
+protected_property: Default
+# Intentionally commented out to verify default status behavior.
+# status: 1
diff --git a/core/modules/config/tests/config_install_fail_test/config_install_fail_test.info.yml b/core/modules/config/tests/config_install_fail_test/config_install_fail_test.info.yml
new file mode 100644
index 0000000..44a9cf3
--- /dev/null
+++ b/core/modules/config/tests/config_install_fail_test/config_install_fail_test.info.yml
@@ -0,0 +1,7 @@
+name: 'Configuration install fail test'
+type: module
+package: Testing
+version: VERSION
+core: 8.x
+dependencies:
+  - config_test
diff --git a/core/modules/field/src/Tests/FieldImportChangeTest.php b/core/modules/field/src/Tests/FieldImportChangeTest.php
index af06824..f2194f7 100644
--- a/core/modules/field/src/Tests/FieldImportChangeTest.php
+++ b/core/modules/field/src/Tests/FieldImportChangeTest.php
@@ -19,6 +19,10 @@ class FieldImportChangeTest extends FieldUnitTestBase {
   /**
    * Modules to enable.
    *
+   * The default configuration provided by field_test_config is imported by
+   * \Drupal\field\Tests\FieldUnitTestBase::setUp() when it installs field
+   * configuration.
+   *
    * @var array
    */
   public static $modules = array('field_test_config');
@@ -31,8 +35,6 @@ function testImportChange() {
     $field_id = "entity_test.entity_test.$field_storage_id";
     $field_config_name = "field.field.$field_id";
 
-    // Import default config.
-    $this->installConfig(array('field_test_config'));
     $active = $this->container->get('config.storage');
     $staging = $this->container->get('config.storage.staging');
     $this->copyConfig($active, $staging);
diff --git a/core/modules/field/src/Tests/FieldImportDeleteTest.php b/core/modules/field/src/Tests/FieldImportDeleteTest.php
index 802d144..030adfb 100644
--- a/core/modules/field/src/Tests/FieldImportDeleteTest.php
+++ b/core/modules/field/src/Tests/FieldImportDeleteTest.php
@@ -21,6 +21,10 @@ class FieldImportDeleteTest extends FieldUnitTestBase {
   /**
    * Modules to enable.
    *
+   * The default configuration provided by field_test_config is imported by
+   * \Drupal\field\Tests\FieldUnitTestBase::setUp() when it installs field
+   * configuration.
+   *
    * @var array
    */
   public static $modules = array('field_test_config');
@@ -53,9 +57,6 @@ public function testImportDelete() {
     // Create a second bundle for the 'Entity test' entity type.
     entity_test_create_bundle('test_bundle');
 
-    // Import default config.
-    $this->installConfig(array('field_test_config'));
-
     // Get the uuid's for the field storages.
     $field_storage_uuid = FieldStorageConfig::load($field_storage_id)->uuid();
     $field_storage_uuid_2 = FieldStorageConfig::load($field_storage_id_2)->uuid();
diff --git a/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml b/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml
index 6ed487b..951e4a3 100644
--- a/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml
+++ b/core/modules/forum/config/install/taxonomy.vocabulary.forums.yml
@@ -1,6 +1,9 @@
 langcode: en
 status: true
-dependencies: {  }
+dependencies:
+  enforced:
+    module:
+      - forum
 name: Forums
 vid: forums
 description: 'Forum navigation vocabulary'
diff --git a/core/modules/system/src/Controller/ConfigClashController.php b/core/modules/system/src/Controller/ConfigClashController.php
new file mode 100644
index 0000000..f9bab44
--- /dev/null
+++ b/core/modules/system/src/Controller/ConfigClashController.php
@@ -0,0 +1,176 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\system\Form\ConfigClashController.
+ */
+
+namespace Drupal\system\Controller;
+
+use Drupal\Core\Config\ConfigInstallerInterface;
+use Drupal\Core\Config\ConfigManagerInterface;
+use Drupal\Core\Controller\ControllerBase;
+use Drupal\Core\Routing\UrlGeneratorInterface;
+use Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface;
+use Symfony\Component\DependencyInjection\ContainerInterface;
+use Symfony\Component\HttpFoundation\RedirectResponse;
+
+/**
+ * Builds a page which lists all clashing configuration items.
+ */
+class ConfigClashController extends ControllerBase {
+
+  /**
+   * The module handler service.
+   *
+   * @var \Drupal\Core\Extension\ModuleHandlerInterface
+   */
+  protected $moduleHandler;
+
+  /**
+   * The expirable key value store.
+   *
+   * @var \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface
+   */
+  protected $keyValueExpirable;
+
+  /**
+   * The configuration installer.
+   *
+   * @var \Drupal\Core\Config\ConfigInstallerInterface
+   */
+  protected $configInstaller;
+
+  /**
+   * The configuration manager.
+   *
+   * @var \Drupal\Core\Config\ConfigManagerInterface
+   */
+  protected $configManager;
+
+  /**
+   * The URL generator.
+   *
+   * @var \Drupal\Core\Routing\UrlGeneratorInterface
+   */
+  protected $urlGenerator;
+
+  /**
+   * An associative list of modules to enable or disable.
+   *
+   * @var array
+   */
+  protected $modules = array();
+
+  /**
+   * Constructs a ConfigClashController object.
+   *
+   * @param \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface $key_value_expirable
+   *   The key value expirable factory.
+   * @param \Drupal\Core\Config\ConfigManagerInterface $config_manager
+   *   The configuration manager.
+   * @param \Drupal\Core\Config\ConfigInstallerInterface $config_installer
+   *   The configuration installer.
+   * @param \Drupal\Core\Routing\UrlGeneratorInterface
+   *   The URL generator.
+   */
+  public function __construct(KeyValueStoreExpirableInterface $key_value_expirable, ConfigManagerInterface $config_manager, ConfigInstallerInterface $config_installer, UrlGeneratorInterface $url_generator) {
+    $this->keyValueExpirable = $key_value_expirable;
+    $this->configManager = $config_manager;
+    $this->configInstaller = $config_installer;
+    $this->urlGenerator = $url_generator;
+  }
+
+  /**
+   * {@inheritdoc}
+   */
+  public static function create(ContainerInterface $container) {
+    return new static(
+      $container->get('keyvalue.expirable')->get('module_list'),
+      $container->get('config.manager'),
+      $container->get('config.installer'),
+      $container->get('url_generator')
+    );
+  }
+
+  /**
+   * Creates a report for modules.
+   *
+   * @see \Drupal\system\Form\ModulesListForm::submitForm()
+   *
+   * @return array
+   *   The report as a render array.
+   */
+  public function moduleReport() {
+    $account = $this->currentUser()->id();
+    $modules = $this->keyValueExpirable->get($account);
+
+    // Redirect to the modules list page if the key value store is empty.
+    if (!$modules) {
+      return new RedirectResponse($this->urlGenerator->generate('system.modules_list', array(), TRUE));
+    }
+
+    $report = array(
+      'description' => array(
+        '#prefix' => '<p>',
+        '#suffix' => '</p>',
+        '#markup' => $this->t('You must delete or rename the following configuration to install @module.', array('@module' => implode(', ', $modules['install'])))
+      ),
+    ) + $this->report('module', array_keys($modules['install']));
+
+    return $report;
+  }
+
+  /**
+   * Generates a report on pre-existing configuration for a list of extensions.
+   *
+   * @param string $type
+   *   The type of extension being installed. Either 'theme' or 'module'.
+   * @param array $extensions
+   *   The list of extensions that are being installed.
+   *
+   * @return array
+   *   The report as a render array.
+   */
+  protected function report($type, array $extensions) {
+    // Check if we have any pre-existing configuration.
+    $existing_configuration = array();
+    foreach ($extensions as $extension) {
+      $existing_configuration = array_merge_recursive($this->configInstaller->findPreExistingConfiguration($type, $extension), $existing_configuration);
+    }
+
+    $report['config_clashes'] = array(
+      '#theme' => 'item_list',
+      '#items' => array(),
+      '#empty' => $this->t('No configuration clashes detected.'),
+      '#weight' => 10,
+    );
+
+    if (count($existing_configuration)) {
+      foreach ($existing_configuration as $collection => $config_names) {
+        foreach ($config_names as $config_name) {
+          $entity = $this->configManager->loadConfigEntityByName($config_name);
+          if ($entity) {
+            $text = $entity->getEntityType()->getLabel() . ': ' . $entity->label();
+            if ($entity->hasLinkTemplate('edit-form')) {
+              $report['config_clashes']['#items'][] = array(
+                '#type' => 'link',
+                '#title' => $text,
+              ) + $entity->urlInfo('edit-form')->toRenderArray();
+            }
+            else {
+              $report['config_clashes']['#items'][] = $text;
+            }
+          }
+          else {
+            // @todo
+            $report['config_clashes']['#items'][] = $config_name;
+          }
+        }
+      }
+    }
+
+    return $report;
+  }
+
+}
diff --git a/core/modules/system/src/Form/ModulesListConfirmForm.php b/core/modules/system/src/Form/ModulesListConfirmForm.php
index 24f1b4b..d7234f4 100644
--- a/core/modules/system/src/Form/ModulesListConfirmForm.php
+++ b/core/modules/system/src/Form/ModulesListConfirmForm.php
@@ -7,6 +7,8 @@
 
 namespace Drupal\system\Form;
 
+use Drupal\Core\Config\PreExistingConfigException;
+use Drupal\Core\Config\ConfigInstallerInterface;
 use Drupal\Core\Extension\ModuleHandlerInterface;
 use Drupal\Core\Extension\ModuleInstallerInterface;
 use Drupal\Core\Form\ConfirmFormBase;
@@ -49,6 +51,13 @@ class ModulesListConfirmForm extends ConfirmFormBase {
   protected $moduleInstaller;
 
   /**
+   * The configuration installer.
+   *
+   * @var \Drupal\Core\Config\ConfigInstallerInterface
+   */
+  protected $configInstaller;
+
+  /**
    * Constructs a ModulesListConfirmForm object.
    *
    * @param \Drupal\Core\Extension\ModuleHandlerInterface $module_handler
@@ -57,11 +66,14 @@ class ModulesListConfirmForm extends ConfirmFormBase {
    *   The module installer.
    * @param \Drupal\Core\KeyValueStore\KeyValueStoreExpirableInterface $key_value_expirable
    *   The key value expirable factory.
+   * @param \Drupal\Core\Config\ConfigInstallerInterface $config_installer
+   *   The configuration installer.
    */
-  public function __construct(ModuleHandlerInterface $module_handler, ModuleInstallerInterface $module_installer, KeyValueStoreExpirableInterface $key_value_expirable) {
+  public function __construct(ModuleHandlerInterface $module_handler, ModuleInstallerInterface $module_installer, KeyValueStoreExpirableInterface $key_value_expirable, ConfigInstallerInterface $config_installer) {
     $this->moduleHandler = $module_handler;
     $this->moduleInstaller = $module_installer;
     $this->keyValueExpirable = $key_value_expirable;
+    $this->configInstaller = $config_installer;
   }
 
   /**
@@ -71,7 +83,8 @@ public static function create(ContainerInterface $container) {
     return new static(
       $container->get('module_handler'),
       $container->get('module_installer'),
-      $container->get('keyvalue.expirable')->get('module_list')
+      $container->get('keyvalue.expirable')->get('module_list'),
+      $container->get('config.installer')
     );
   }
 
@@ -151,13 +164,37 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     // Gets list of modules prior to install process.
     $before = $this->moduleHandler->getModuleList();
 
+    // Check if we have any pre-existing configuration.
+    $existing_configuration = array();
+    foreach (array_keys($this->modules['install']) as $module) {
+      $existing_configuration = array_merge_recursive($this->configInstaller->findPreExistingConfiguration('module', $module), $existing_configuration);
+    }
+    if (count($existing_configuration)) {
+      $account = $this->currentUser()->id();
+      $this->keyValueExpirable->setWithExpire($account, $this->modules, 60);
+      // Redirect to the system config clash page.
+      $form_state->setRedirect('system.modules_config_clash');
+      return;
+    }
+
     // Install the given modules.
     if (!empty($this->modules['install'])) {
       // Don't catch the exception that this can throw for missing dependencies:
       // the form doesn't allow modules with unmet dependencies, so the only way
       // this can happen is if the filesystem changed between form display and
       // submit, in which case the user has bigger problems.
-      $this->moduleInstaller->install(array_keys($this->modules['install']));
+      try {
+        $this->moduleInstaller->install(array_keys($this->modules['install']));
+      }
+      catch (PreExistingConfigException $e) {
+        $config_objects = $e->getConfigObjects();
+        drupal_set_message($this->formatPlural(
+          count($config_objects),
+          'The default configuration %config_names provided by @extension already exists in active configuration.',
+          'The default configurations %config_names provided by @extension already exist in active configuration.',
+          array('%config_names' => implode(', ', $config_objects), '@extension' => $this->modules['install'][$e->getModule()])
+        ));
+      }
     }
 
     // Gets module list after install process, flushes caches and displays a
diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php
index 2486ca4..8347543 100644
--- a/core/modules/system/src/Form/ModulesListForm.php
+++ b/core/modules/system/src/Form/ModulesListForm.php
@@ -9,6 +9,8 @@
 
 use Drupal\Component\Utility\String;
 use Drupal\Component\Utility\Unicode;
+use Drupal\Core\Config\ConfigInstallerInterface;
+use Drupal\Core\Config\PreExistingConfigException;
 use Drupal\Core\Controller\TitleResolverInterface;
 use Drupal\Core\Access\AccessManagerInterface;
 use Drupal\Core\Entity\EntityManagerInterface;
@@ -101,6 +103,13 @@ class ModulesListForm extends FormBase {
   protected $moduleInstaller;
 
   /**
+   * The configuration installer.
+   *
+   * @var \Drupal\Core\Config\ConfigInstallerInterface
+   */
+  protected $configInstaller;
+
+  /**
    * {@inheritdoc}
    */
   public static function create(ContainerInterface $container) {
@@ -114,7 +123,8 @@ public static function create(ContainerInterface $container) {
       $container->get('current_route_match'),
       $container->get('title_resolver'),
       $container->get('router.route_provider'),
-      $container->get('plugin.manager.menu.link')
+      $container->get('plugin.manager.menu.link'),
+      $container->get('config.installer')
     );
   }
 
@@ -141,8 +151,10 @@ public static function create(ContainerInterface $container) {
    *   The route provider.
    * @param \Drupal\Core\Menu\MenuLinkManagerInterface $menu_link_manager
    *   The menu link manager.
+   * @param \Drupal\Core\Config\ConfigInstallerInterface $config_installer
+   *   The configuration installer.
    */
-  public function __construct(ModuleHandlerInterface $module_handler, ModuleInstallerInterface $module_installer, KeyValueStoreExpirableInterface $key_value_expirable, AccessManagerInterface $access_manager, EntityManagerInterface $entity_manager, AccountInterface $current_user,  RouteMatchInterface $route_match, TitleResolverInterface $title_resolver, RouteProviderInterface $route_provider, MenuLinkManagerInterface $menu_link_manager) {
+  public function __construct(ModuleHandlerInterface $module_handler, ModuleInstallerInterface $module_installer, KeyValueStoreExpirableInterface $key_value_expirable, AccessManagerInterface $access_manager, EntityManagerInterface $entity_manager, AccountInterface $current_user,  RouteMatchInterface $route_match, TitleResolverInterface $title_resolver, RouteProviderInterface $route_provider, MenuLinkManagerInterface $menu_link_manager, ConfigInstallerInterface $config_installer) {
     $this->moduleHandler = $module_handler;
     $this->moduleInstaller = $module_installer;
     $this->keyValueExpirable = $key_value_expirable;
@@ -153,6 +165,7 @@ public function __construct(ModuleHandlerInterface $module_handler, ModuleInstal
     $this->titleResolver = $title_resolver;
     $this->routeProvider = $route_provider;
     $this->menuLinkManager = $menu_link_manager;
+    $this->configInstaller = $config_installer;
   }
 
   /**
@@ -496,6 +509,19 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
     // Retrieve a list of modules to install and their dependencies.
     $modules = $this->buildModuleList($form_state);
 
+    // Check if we have any pre-existing configuration.
+    $existing_configuration = array();
+    foreach (array_keys($modules['install']) as $module) {
+      $existing_configuration = array_merge_recursive($this->configInstaller->findPreExistingConfiguration('module', $module), $existing_configuration);
+    }
+    if (count($existing_configuration)) {
+      $account = $this->currentUser()->id();
+      $this->keyValueExpirable->setWithExpire($account, $modules, 60);
+      // Redirect to the system config clash page.
+      $form_state->setRedirect('system.modules_config_clash');
+      return;
+    }
+
     // Check if we have to install any dependencies. If there is one or more
     // dependencies that are not installed yet, redirect to the confirmation
     // form.
@@ -517,7 +543,18 @@ public function submitForm(array &$form, FormStateInterface $form_state) {
 
     // There seem to be no dependencies that would need approval.
     if (!empty($modules['install'])) {
-      $this->moduleInstaller->install(array_keys($modules['install']));
+      try {
+        $this->moduleInstaller->install(array_keys($modules['install']));
+      }
+      catch (PreExistingConfigException $e) {
+        $config_objects = $e->getConfigObjects();
+        drupal_set_message($this->formatPlural(
+          count($config_objects),
+          'The default configuration %config_names provided by @extension already exists in active configuration.',
+          'The default configurations %config_names provided by @extension already exist in active configuration.',
+          array('%config_names' => implode(', ', $config_objects), '@extension' => $modules['install'][$e->getModule()])
+        ));
+      }
     }
 
     // Gets module list after install process, flushes caches and displays a
diff --git a/core/modules/system/src/Tests/Module/InstallUninstallTest.php b/core/modules/system/src/Tests/Module/InstallUninstallTest.php
index 125b754..a2c8cd1 100644
--- a/core/modules/system/src/Tests/Module/InstallUninstallTest.php
+++ b/core/modules/system/src/Tests/Module/InstallUninstallTest.php
@@ -7,7 +7,10 @@
 
 namespace Drupal\system\Tests\Module;
 
+use Drupal\Core\Entity\Entity\EntityViewMode;
+use Drupal\Core\Field\Entity\BaseFieldOverride;
 use Drupal\Core\Logger\RfcLogLevel;
+use Drupal\node\Entity\NodeType;
 
 /**
  * Install/uninstall core module and confirm table creation/deletion.
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index 255449e..3d38367 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -145,6 +145,9 @@ function system_help($route_name, RouteMatchInterface $route_match) {
 
     case 'system.status':
       return '<p>' . t("Here you can find a short overview of your site's parameters as well as any problems detected with your installation. It may be useful to copy and paste this information into support requests filed on drupal.org's support forums and project issue queues. Before filing a support request, ensure that your web server meets the <a href=\"@system-requirements\">system requirements.</a>", array('@system-requirements' => 'http://drupal.org/requirements')) . '</p>';
+
+    case 'system.modules_config_clash':
+      return '<p>' . t('Here you can find a list of configuration that already exists. You need to either rename it or delete it before installing modules which have configuration with the same name.') . '</p>';
   }
 }
 
diff --git a/core/modules/system/system.routing.yml b/core/modules/system/system.routing.yml
index 77489f5..8a42611 100644
--- a/core/modules/system/system.routing.yml
+++ b/core/modules/system/system.routing.yml
@@ -285,6 +285,14 @@ system.theme_install:
     _permission: 'administer themes'
     _csrf_token: 'TRUE'
 
+system.modules_config_clash:
+  path: 'admin/modules/config-clash'
+  defaults:
+    _controller: 'Drupal\system\Controller\ConfigClashController::moduleReport'
+    _title: 'Configuration clash'
+  requirements:
+    _permission: 'administer modules'
+
 system.status:
   path: '/admin/reports/status'
   defaults:
