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..d34a7ad
--- /dev/null
+++ b/core/lib/Drupal/Core/Config/PreExistingConfigException.php
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * @file
+ * Contains \Drupal\Core\Config\PreExistingConfigException.
+ */
+
+namespace Drupal\Core\Config;
+
+/**
+ * An exception thrown if configuration with the same name already exists.
+ */
+class PreExistingConfigException extends ConfigException {
+}
diff --git a/core/lib/Drupal/Core/Extension/ModuleInstaller.php b/core/lib/Drupal/Core/Extension/ModuleInstaller.php
index 73278d3..a84bad8 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,20 @@ 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 new PreExistingConfigException(String::format('Configuration @config_names provided by @extension already exist in active configuration',
+              array('@config_names' => implode(',', $existing_configuration[StorageInterface::DEFAULT_COLLECTION]), '@extension' => $module)
+            ));
+          }
+        }
+
         $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..5639a1b 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,19 @@
 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 +91,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 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.
@@ -90,11 +109,11 @@ function testIntegrationModuleReinstallation() {
     $config_static = $this->config($default_config);
     $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 +168,26 @@ 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 without config_test enabled.
+    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
+    $this->drupalPostForm(NULL, array(), t('Continue'));
+    // This can only work if config_install_fail_test depends on config_test
+    $this->assertText('Configuration config_test.dynamic.dotted.default provided by config_install_fail_test already exist in active configuration');
+
+    // Try to install config_install_fail_test. config_test was enabled in the
+    // previous submission.
+    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_test][enable]' => TRUE), t('Save configuration'));
+    $this->assertText('You must delete or rename the following configuration to install Configuration install fail test.');
+
+    // Try to install config_install_fail_dependency_test.
+    $this->drupalPostForm('admin/modules', array('modules[Testing][config_install_fail_dependency_test][enable]' => TRUE), t('Save configuration'));
+    $this->assertText('You must delete or rename the following configuration to install Configuration install fail dependency test, Configuration install fail test.');
+  }
 }
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 6e48bf4..5b63f3e 100644
--- a/core/modules/field/src/Tests/FieldImportDeleteTest.php
+++ b/core/modules/field/src/Tests/FieldImportDeleteTest.php
@@ -20,6 +20,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');
@@ -52,9 +56,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 = entity_load('field_storage_config', $field_storage_id)->uuid();
     $field_storage_uuid_2 = entity_load('field_storage_config', $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 279b95e..09446d4 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,6 +164,19 @@ 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:
diff --git a/core/modules/system/src/Form/ModulesListForm.php b/core/modules/system/src/Form/ModulesListForm.php
index 2486ca4..9ee1f2b 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,12 @@ 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 $exception) {
+        drupal_set_message($exception->getMessage());
+      }
     }
 
     // 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 8f2a8ab..d690f2e 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:
