diff --git a/core/includes/config.inc b/core/includes/config.inc
index 31f6e5b..6c6bf96 100644
--- a/core/includes/config.inc
+++ b/core/includes/config.inc
@@ -63,7 +63,7 @@ function config_uninstall_default_config($type, $name) {
 
   // If this module defines any ConfigEntity types, then delete the manifest
   // file for each of them.
-  foreach (config_get_module_config_entities($name) as $entity_type) {
+  foreach (config_get_module_config_entities($name) as $entity_info) {
     config('manifest.' . $entity_info['config_prefix'])->delete();
   }
 }
diff --git a/core/includes/module.inc b/core/includes/module.inc
index bc91311..1499874 100644
--- a/core/includes/module.inc
+++ b/core/includes/module.inc
@@ -12,12 +12,12 @@
 use Symfony\Component\Yaml\Parser;
 
 /**
- * Builds a list of bootstrap modules and enabled modules and themes.
+ * Builds a list of bootstrap modules and installed modules and themes.
  *
  * @param $type
  *   The type of list to return:
- *   - module_enabled: All enabled modules.
- *   - bootstrap: All enabled modules required for bootstrap.
+ *   - module_enabled: All installed modules.
+ *   - bootstrap: All installed modules required for bootstrap.
  *   - theme: All themes.
  *
  * @return
@@ -288,7 +288,6 @@ function module_enable($module_list, $enable_dependencies = TRUE) {
   $modules_enabled = array();
   $schema_store = Drupal::keyValue('system.schema');
   $module_config = config('system.module');
-  $disabled_config = config('system.module.disabled');
   $module_handler = drupal_container()->get('module_handler');
   foreach ($module_list as $module) {
     // Only process modules that are not already enabled.
@@ -297,17 +296,10 @@ function module_enable($module_list, $enable_dependencies = TRUE) {
     // that it might be loaded, but not necessarily installed or enabled.
     $enabled = $module_config->get("enabled.$module") !== NULL;
     if (!$enabled) {
-      $weight = $disabled_config->get($module);
-      if ($weight === NULL) {
-        $weight = 0;
-      }
       $module_config
-        ->set("enabled.$module", $weight)
+        ->set("enabled.$module", 0)
         ->set('enabled', module_config_sort($module_config->get('enabled')))
         ->save();
-      $disabled_config
-        ->clear($module)
-        ->save();
 
       // Prepare the new module list, sorted by weight, including filenames.
       // This list is used for both the ModuleHandler and DrupalKernel. It needs
@@ -422,18 +414,34 @@ function module_enable($module_list, $enable_dependencies = TRUE) {
   return TRUE;
 }
 
+function module_disable() {
+  // @todo remove this function when all function calls have been removed.
+  // This code has been moved into moudle_uninstall for now.
+}
+
 /**
- * Disables a given set of modules.
+ * Uninstalls a given list of  modules.
  *
- * @param $module_list
- *   An array of module names.
- * @param $disable_dependents
- *   If TRUE, dependent modules will automatically be added and disabled in the
- *   correct order. This incurs a significant performance cost, so use FALSE
- *   if you know $module_list is already complete and in the correct order.
+ * @param array $module_list
+ *   The modules to uninstall.
+ * @param bool $uninstall_dependents
+ *   (optional) If TRUE, the function will check that all modules which depend
+ *   on the passed-in module list either are already uninstalled or contained in
+ *   the list, and it will ensure that the modules are uninstalled in the
+ *   correct order. This incurs a significant performance cost, so use FALSE if
+ *   you know $module_list is already complete and in the correct order.
+ *   Defaults to TRUE.
+ *
+ * @return bool
+ *   Returns TRUE if the operation succeeds or FALSE if it aborts due to an
+ *   unsafe condition, namely, $uninstall_dependents is TRUE and a module in
+ *   $module_list has dependents which are not already uninstalled and not also
+ *   included in $module_list).
  */
-function module_disable($module_list, $disable_dependents = TRUE) {
-  if ($disable_dependents) {
+function module_uninstall($module_list, $uninstall_dependents = TRUE) {
+  // @todo this is all the code previously in module_disable()
+  // needs to be cleaned up.
+  if ($uninstall_dependents) {
     // Get all module data so we can find dependents and sort.
     $module_data = system_rebuild_module_data();
     // Create an associative array with weights as values.
@@ -465,7 +473,6 @@ function module_disable($module_list, $disable_dependents = TRUE) {
   $invoke_modules = array();
 
   $module_config = config('system.module');
-  $disabled_config = config('system.module.disabled');
   $module_handler = drupal_container()->get('module_handler');
   foreach ($module_list as $module) {
     // Only process modules that are enabled.
@@ -477,13 +484,13 @@ function module_disable($module_list, $disable_dependents = TRUE) {
       module_load_install($module);
       module_invoke($module, 'disable');
 
-      $disabled_config
-        ->set($module, $module_config->get($module))
-        ->save();
       $module_config
         ->clear("enabled.$module")
         ->save();
 
+      // Remove all configuration belonging to the module.
+      config_uninstall_default_config('module', $module);
+
       // Update the module handler to remove the module.
       // The current ModuleHandler instance is obsolete with the kernel rebuild
       // below.
@@ -493,7 +500,6 @@ function module_disable($module_list, $disable_dependents = TRUE) {
 
       // Record the fact that it was disabled.
       $invoke_modules[] = $module;
-      watchdog('system', '%module module disabled.', array('%module' => $module), WATCHDOG_INFO);
     }
   }
 
@@ -507,44 +513,9 @@ function module_disable($module_list, $disable_dependents = TRUE) {
 
     entity_info_cache_clear();
 
-    // Invoke hook_modules_disabled before disabling modules,
-    // so we can still call module hooks to get information.
-    module_invoke_all('modules_disabled', $invoke_modules);
     _system_update_bootstrap_status();
-
-    // Update the kernel to exclude the disabled modules.
-    $enabled = $module_handler->getModuleList();
-    drupal_container()->get('kernel')->updateModules($enabled, $enabled);
-
-    // Update the theme registry to remove the newly-disabled module.
-    drupal_theme_rebuild();
   }
-}
 
-/**
- * Uninstalls a given list of disabled modules.
- *
- * @param array $module_list
- *   The modules to uninstall. It is the caller's responsibility to ensure that
- *   all modules in this list have already been disabled before this function
- *   is called.
- * @param bool $uninstall_dependents
- *   (optional) If TRUE, the function will check that all modules which depend
- *   on the passed-in module list either are already uninstalled or contained in
- *   the list, and it will ensure that the modules are uninstalled in the
- *   correct order. This incurs a significant performance cost, so use FALSE if
- *   you know $module_list is already complete and in the correct order.
- *   Defaults to TRUE.
- *
- * @return bool
- *   Returns TRUE if the operation succeeds or FALSE if it aborts due to an
- *   unsafe condition, namely, $uninstall_dependents is TRUE and a module in
- *   $module_list has dependents which are not already uninstalled and not also
- *   included in $module_list).
- *
- * @see module_disable()
- */
-function module_uninstall($module_list = array(), $uninstall_dependents = TRUE) {
   if ($uninstall_dependents) {
     // Get all module data so we can find dependents and sort.
     $module_data = system_rebuild_module_data();
@@ -577,16 +548,12 @@ function module_uninstall($module_list = array(), $uninstall_dependents = TRUE)
   }
 
   $schema_store = Drupal::keyValue('system.schema');
-  $disabled_config = config('system.module.disabled');
   foreach ($module_list as $module) {
     // Uninstall the module.
     module_load_install($module);
     module_invoke($module, 'uninstall');
     drupal_uninstall_schema($module);
 
-    // Remove all configuration belonging to the module.
-    config_uninstall_default_config('module', $module);
-
     // Remove any cache bins defined by the module.
     $service_yaml_file = drupal_get_path('module', $module) . "/$module.services.yml";
     if (file_exists($service_yaml_file)) {
@@ -621,14 +588,13 @@ function module_uninstall($module_list = array(), $uninstall_dependents = TRUE)
 
     watchdog('system', '%module module uninstalled.', array('%module' => $module), WATCHDOG_INFO);
     $schema_store->delete($module);
-    $disabled_config->clear($module);
   }
-  $disabled_config->save();
   drupal_get_installed_schema_version(NULL, TRUE);
 
   if (!empty($module_list)) {
     // Let other modules react.
     module_invoke_all('modules_uninstalled', $module_list);
+    drupal_flush_all_caches();
   }
 
   return TRUE;
@@ -747,13 +713,6 @@ function module_set_weight($module, $weight) {
     $module_handler->setModuleList($module_filenames);
     return;
   }
-  $disabled_config = config('system.module.disabled');
-  if ($disabled_config->get($module) !== NULL) {
-    $disabled_config
-      ->set($module, $weight)
-      ->save();
-    return;
-  }
 }
 
 /**
diff --git a/core/includes/update.inc b/core/includes/update.inc
index a5feb50..1ae770b 100644
--- a/core/includes/update.inc
+++ b/core/includes/update.inc
@@ -329,7 +329,6 @@ function update_prepare_d8_bootstrap() {
       }
 
       $module_config = config('system.module');
-      $disabled_modules = config('system.module.disabled');
       $theme_config = config('system.theme');
       $disabled_themes = config('system.theme.disabled');
       $schema_store = Drupal::keyValue('system.schema');
@@ -361,12 +360,9 @@ function update_prepare_d8_bootstrap() {
       // status, and record its schema version.
       foreach ($result as $record) {
         if ($record->type == 'module') {
-          if ($record->status && isset($module_data[$record->name])) {
+          if (isset($module_data[$record->name])) {
             $module_config->set('enabled.' . $record->name, $record->weight);
           }
-          else {
-            $disabled_modules->set($record->name, $record->weight);
-          }
         }
         elseif ($record->type == 'theme') {
           if ($record->status) {
@@ -385,7 +381,6 @@ function update_prepare_d8_bootstrap() {
         $sorted_with_filenames[$m] = drupal_get_filename('module', $m);
       }
       drupal_container()->get('module_handler')->setModuleList($sorted_with_filenames);
-      $disabled_modules->save();
       $theme_config->save();
       $disabled_themes->save();
       Drupal::service('kernel')->updateModules($sorted_with_filenames, $sorted_with_filenames);
@@ -715,10 +710,6 @@ function update_module_enable(array $modules, $schema_version = 0) {
       ->set("enabled.$module", 0)
       ->set('enabled', module_config_sort($module_config->get('enabled')))
       ->save();
-    // Ensure the module is not contained in disabled modules.
-    config('system.module.disabled')
-      ->clear($module)
-      ->save();
 
     $current_schema = $schema_store->get($module);
     // Set the schema version if the module was not just disabled before.
diff --git a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php
index 59d5339..f2f9c5f 100644
--- a/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php
+++ b/core/modules/aggregator/lib/Drupal/aggregator/Tests/AggregatorConfigurationTest.php
@@ -59,7 +59,7 @@ function testSettingsPage() {
 
     // Make sure settings form is still accessible even after disabling a module
     // that provides the selected plugins.
-    module_disable(array('aggregator_test'));
+    module_uninstall(array('aggregator_test'));
     $this->resetAll();
     $this->drupalGet('admin/config/services/aggregator/settings');
     $this->assertResponse(200);
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 1e1084e..040a4a1 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -3589,6 +3589,6 @@ function node_library_info() {
  */
 function node_system_info_alter(&$info, $file, $type) {
   if ($type == 'module' && $file->name == 'translation') {
-    $info['hidden'] = !module_exists('translation') && config('system.module.disabled')->get('translation') === NULL;
+    $info['hidden'] = !module_exists('translation');
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Module/EnableDisableTest.php b/core/modules/system/lib/Drupal/system/Tests/Module/EnableDisableTest.php
index f8aa2b3..44c9456 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Module/EnableDisableTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Module/EnableDisableTest.php
@@ -116,19 +116,19 @@ function testEnableDisable() {
           $this->assertLogMessage('system', "%module module enabled.", array('%module' => $module_to_enable), WATCHDOG_INFO);
         }
 
-        // Disable and uninstall the original module, and check appropriate
+        // Uninstall the original module, and check appropriate
         // hooks, tables, and log messages. (Later, we'll go back and do the
         // same thing for modules that were enabled automatically.) Skip this
         // for the dblog module, because that is needed for the test; we'll go
         // back and do that one at the end also.
         if ($name != 'dblog') {
-          $this->assertSuccessfulDisableAndUninstall($name, $package);
+          $this->assertSuccessfullUninstall($name, $package);
         }
       }
     }
 
     // Go through all modules that were automatically enabled, and try to
-    // disable and uninstall them one by one.
+    // uninstall them one by one.
     while (!empty($automatically_enabled)) {
       $initial_count = count($automatically_enabled);
       foreach (array_keys($automatically_enabled) as $name) {
@@ -136,11 +136,11 @@ function testEnableDisable() {
         $package = $module->info['package'];
         // If the module can't be disabled due to dependencies, skip it and try
         // again the next time. Otherwise, try to disable it.
-        $this->drupalGet('admin/modules');
-        $disabled_checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="modules[' . $package . '][' . $name . '][enable]"]');
+        $this->drupalGet('admin/modules/uninstall');
+        $disabled_checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="uninstall[' . $name . ']"]');
         if (empty($disabled_checkbox) && $name != 'dblog') {
           unset($automatically_enabled[$name]);
-          $this->assertSuccessfulDisableAndUninstall($name, $package);
+          $this->assertSuccessfullUninstall($name, $package);
         }
       }
       $final_count = count($automatically_enabled);
@@ -152,10 +152,10 @@ function testEnableDisable() {
       }
     }
 
-    // Disable and uninstall the dblog module last, since we needed it for
-    // assertions in all the above tests.
+    // Uninstall the dblog module last, since we needed it for assertions in
+    // all the above tests.
     if (isset($modules['dblog'])) {
-      $this->assertSuccessfulDisableAndUninstall('dblog');
+      $this->assertSuccessfullUninstall('dblog');
     }
 
     // Now that all modules have been tested, go back and try to enable them
@@ -173,35 +173,15 @@ function testEnableDisable() {
   }
 
   /**
-   * Disables and uninstalls a module and asserts that it was done correctly.
+   * Uninstalls a module and asserts that it was done correctly.
    *
    * @param string $module
-   *   The name of the module to disable and uninstall.
+   *   The name of the module to uninstall.
    * @param string $package
-   *   (optional) The package of the module to disable and uninstall. Defaults
+   *   (optional) The package of the module to uninstall. Defaults
    *   to 'Core'.
    */
-  function assertSuccessfulDisableAndUninstall($module, $package = 'Core') {
-    // Disable the module.
-    $edit = array();
-    $edit['modules[' . $package . '][' . $module . '][enable]'] = FALSE;
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
-    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
-    $this->assertModules(array($module), FALSE);
-
-    // Check that the appropriate hook was fired and the appropriate log
-    // message appears.
-    $this->assertText(t('hook_modules_disabled fired for @module', array('@module' => $module)));
-    if ($module != 'dblog') {
-      $this->assertLogMessage('system', "%module module disabled.", array('%module' => $module), WATCHDOG_INFO);
-    }
-
-    //  Check that the module's database tables still exist.
-    $this->assertModuleTablesExist($module);
-    //  Check that the module's config files still exist.
-    $this->assertModuleConfig($module);
-
-    // Uninstall the module.
+  function assertSuccessfullUninstall($module, $package = 'Core') {
     $edit = array();
     $edit['uninstall[' . $module . ']'] = $module;
     $this->drupalPost('admin/modules/uninstall', $edit, t('Uninstall'));
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index 1566c80..2c4cd40 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -866,7 +866,14 @@ function system_modules($form, $form_state = array()) {
   // Iterate through each of the modules.
   foreach ($visible_files as $filename => $module) {
     $extra = array();
-    $extra['enabled'] = (bool) $module->status;
+    // @todo status can maybe go ?
+    $extra['enabled'] = (bool) $module->status && $module->schema_version == -1;
+
+    // You can not disable a module anymore.
+    if ($extra['enabled']) {
+      $extra['disabled'] = TRUE;
+    }
+
     if (!empty($module->info['required'] )) {
       $extra['disabled'] = TRUE;
       $extra['required_by'][] = $distribution_name . (!empty($module->info['explanation']) ? ' ('. $module->info['explanation'] .')' : '');
@@ -1246,11 +1253,11 @@ function system_modules_uninstall($form, $form_state = NULL) {
     return $confirm_form->buildForm($form, $form_state, $modules);
   }
 
-  // Get a list of disabled, installed modules.
+  // Get a list of installed modules.
   $all_modules = system_rebuild_module_data();
   $disabled_modules = array();
   foreach ($all_modules as $name => $module) {
-    if (empty($module->status) && drupal_get_installed_schema_version($name) > SCHEMA_UNINSTALLED) {
+    if ($module->status == 1 && empty($module->info['required']) && drupal_get_installed_schema_version($name) > SCHEMA_UNINSTALLED) {
       $disabled_modules[$name] = $module;
     }
   }
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index ce1b39b..ad2eb80 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2788,7 +2788,7 @@ function system_check_directory($form_element) {
 /**
  * Returns an array of information about enabled modules or themes.
  *
- * This function returns the contents of the .info.yml file for each enabled
+ * This function returns the contents of the .info.yml file for each installed
  * module or theme.
  *
  * @param $type
@@ -2944,13 +2944,11 @@ function system_rebuild_module_data() {
     $files = array();
     ksort($modules);
     // Add name, status, weight, and schema version.
-    $enabled_modules = (array) config('system.module')->get('enabled');
-    $disabled_modules = (array) config('system.module.disabled')->get();
-    $all_modules = $enabled_modules + $disabled_modules;
+    $all_modules = (array) config('system.module')->get('enabled');
     foreach ($modules as $module => $record) {
       $record->name = $module;
       $record->weight = isset($all_modules[$module]) ? $all_modules[$module] : 0;
-      $record->status = (int) isset($enabled_modules[$module]);
+      $record->status = (int) isset($all_modules[$module]);
       $record->schema_version = SCHEMA_UNINSTALLED;
       $files[$module] = $record->filename;
     }
