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/block/lib/Drupal/block/Tests/BlockTest.php b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
index 75bcb39..178c0b1 100644
--- a/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
+++ b/core/modules/block/lib/Drupal/block/Tests/BlockTest.php
@@ -235,100 +235,4 @@ function testBlockRehash() {
     $this->assertEqual($settings['cache'], DRUPAL_NO_CACHE, "Test block's database entry updated to DRUPAL_NO_CACHE.");
   }
 
-  /**
-   * Tests blocks belonging to disabled modules.
-   */
-  function testBlockModuleDisable() {
-    module_enable(array('block_test'));
-    $this->assertTrue(module_exists('block_test'), 'Test block module enabled.');
-
-    // Clear the block cache to load the block_test module's block definitions.
-    $manager = $this->container->get('plugin.manager.block');
-    $manager->clearCachedDefinitions();
-
-    // Add test blocks in different regions and confirm they are displayed.
-    $blocks = array();
-    $regions = array('sidebar_first', 'content', 'footer');
-    foreach ($regions as $region) {
-      $blocks[$region] = $this->drupalPlaceBlock('test_cache', array('region' => $region));
-    }
-    $this->drupalGet('');
-    foreach ($regions as $region) {
-      $this->assertText($blocks[$region]->label());
-    }
-
-    // Disable the block test module and refresh the definitions cache.
-    module_disable(array('block_test'), FALSE);
-    $this->assertFalse(module_exists('block_test'), 'Test block module disabled.');
-    $manager->clearCachedDefinitions();
-
-    // Ensure that the block administration page still functions as expected.
-    $this->drupalGet('admin/structure/block');
-    $this->assertResponse(200);
-    // A 200 response is possible with a fatal error, so check the title too.
-    $this->assertTitle(t('Blocks | Drupal'));
-
-    // Ensure that the disabled module's block instance is not listed.
-    foreach ($regions as $region) {
-      $this->assertNoText($blocks[$region]->label());
-    }
-
-    // Ensure that the disabled module's block plugin is no longer available.
-    $this->drupalGet('admin/structure/block/list/block_plugin_ui:' . config('system.theme')->get('default') . '/add');
-    $this->assertNoText(t('Test block caching'));
-
-    // Confirm that the block is no longer displayed on the front page.
-    $this->drupalGet('');
-    $this->assertResponse(200);
-    foreach ($regions as $region) {
-      $this->assertNoText($blocks[$region]->label());
-    }
-
-    // Confirm that a different block instance can still be enabled by
-    // submitting the block library form.
-    // Emulate a POST submission rather than using drupalPlaceBlock() to ensure
-    // that the form still functions as expected.
-    $edit = array(
-      'settings[label]' => $this->randomName(8),
-      'machine_name' => strtolower($this->randomName(8)),
-      'region' => 'sidebar_first',
-    );
-    $this->drupalPost('admin/structure/block/add/system_powered_by_block/stark', $edit, t('Save block'));
-    $this->assertText(t('The block configuration has been saved.'));
-    $this->assertText($edit['settings[label]']);
-
-    // Update the weight of a block.
-    $edit = array('blocks[stark.' . $edit['machine_name'] . '][weight]' => -1);
-    $this->drupalPost('admin/structure/block', $edit, t('Save blocks'));
-    $this->assertText(t('The block settings have been updated.'));
-
-    // Re-enable the module and refresh the definitions cache.
-    module_enable(array('block_test'), FALSE);
-    $this->assertTrue(module_exists('block_test'), 'Test block module re-enabled.');
-    $manager->clearCachedDefinitions();
-
-    // Reload the admin page and confirm the block can again be configured.
-    $this->drupalGet('admin/structure/block');
-    foreach ($regions as $region) {
-      $this->assertLinkByHref(url('admin/structure/block/manage/' . $blocks[$region]->id()));
-    }
-
-    // Confirm that the blocks are again displayed on the front page in the
-    // correct regions.
-    $this->drupalGet('');
-    foreach ($regions as $region) {
-      // @todo Use a proper method for this.
-      $name_pieces = explode('.', $blocks[$region]->id());
-      $machine_name = array_pop($name_pieces);
-      $xpath = $this->buildXPathQuery('//div[@class=:region-class]//div[@id=:block-id]/*', array(
-        ':region-class' => 'region region-' . drupal_html_class($region),
-        ':block-id' => 'block-' . strtr(strtolower($machine_name), '-', '_'),
-    ));
-      $this->assertFieldByXPath($xpath, NULL, format_string('Block %name found in the %region region.', array(
-        '%name' => $blocks[$region]->label(),
-        '%region' => $region,
-      )));
-    }
-  }
-
 }
diff --git a/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php b/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php
index c92d2ab..72403ee 100644
--- a/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php
+++ b/core/modules/comment/lib/Drupal/comment/Tests/CommentFieldsTest.php
@@ -61,46 +61,6 @@ function testCommentDefaultFields() {
   }
 
   /**
-   * Tests that comment module works when enabled after a content module.
-   */
-  function testCommentEnable() {
-    // Create a user to do module administration.
-    $this->admin_user = $this->drupalCreateUser(array('access administration pages', 'administer modules'));
-    $this->drupalLogin($this->admin_user);
-
-    // Disable the comment module.
-    $edit = array();
-    $edit['modules[Core][comment][enable]'] = FALSE;
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
-    $this->rebuildContainer();
-    $this->assertFalse(module_exists('comment'), 'Comment module disabled.');
-
-    // Enable core content type module (book).
-    $edit = array();
-    $edit['modules[Core][book][enable]'] = 'book';
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
-
-    // Now enable the comment module.
-    $edit = array();
-    $edit['modules[Core][comment][enable]'] = 'comment';
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
-    $this->rebuildContainer();
-    $this->assertTrue(module_exists('comment'), 'Comment module enabled.');
-
-    // Create nodes of each type.
-    $book_node = $this->drupalCreateNode(array('type' => 'book'));
-
-    $this->drupalLogout();
-
-    // Try to post a comment on each node. A failure will be triggered if the
-    // comment body is missing on one of these forms, due to postComment()
-    // asserting that the body is actually posted correctly.
-    $this->web_user = $this->drupalCreateUser(array('access content', 'access comments', 'post comments', 'skip comment approval'));
-    $this->drupalLogin($this->web_user);
-    $this->postComment($book_node, $this->randomName(), $this->randomName());
-  }
-
-  /**
    * Tests that comment module works correctly with plain text format.
    */
   function testCommentFormat() {
diff --git a/core/modules/field/lib/Drupal/field/Tests/ActiveTest.php b/core/modules/field/lib/Drupal/field/Tests/ActiveTest.php
deleted file mode 100644
index c555dc8..0000000
--- a/core/modules/field/lib/Drupal/field/Tests/ActiveTest.php
+++ /dev/null
@@ -1,89 +0,0 @@
-<?php
-
-/**
- * @file
- * Definition of Drupal\field\Tests\ActiveTest.
- */
-
-namespace Drupal\field\Tests;
-
-class ActiveTest extends FieldTestBase {
-
-  /**
-   * Modules to enable.
-   *
-   * @var array
-   */
-  public static $modules = array('field_test');
-
-  public static function getInfo() {
-    return array(
-      'name' => 'Field active test',
-      'description' => 'Test that fields are properly marked active or inactive.',
-      'group' => 'Field API',
-    );
-  }
-
-  /**
-   * Test that fields are properly marked active or inactive.
-   */
-  function testActive() {
-    $field_definition = array(
-      'field_name' => 'field_1',
-      'type' => 'test_field',
-      // For this test, we need a storage backend provided by a different
-      // module than field_test.module.
-      'storage' => array(
-        'type' => 'field_sql_storage',
-      ),
-    );
-    field_create_field($field_definition);
-
-    // Test disabling and enabling:
-    // - the field type module,
-    // - the storage module,
-    // - both.
-    $this->_testActiveHelper($field_definition, array('field_test'));
-    $this->_testActiveHelper($field_definition, array('field_sql_storage'));
-    $this->_testActiveHelper($field_definition, array('field_test', 'field_sql_storage'));
-  }
-
-  /**
-   * Helper function for testActive().
-   *
-   * Test dependency between a field and a set of modules.
-   *
-   * @param $field_definition
-   *   A field definition.
-   * @param $modules
-   *   An aray of module names. The field will be tested to be inactive as long
-   *   as any of those modules is disabled.
-   */
-  function _testActiveHelper($field_definition, $modules) {
-    $field_name = $field_definition['field_name'];
-
-    // Read the field.
-    $field = field_read_field($field_name);
-    $this->assertTrue($field_definition <= $field, 'The field was properly read.');
-
-    module_disable($modules, FALSE);
-
-    $fields = field_read_fields(array('field_name' => $field_name), array('include_inactive' => TRUE));
-    $this->assertTrue(isset($fields[$field_name]) && $field_definition < $field, 'The field is properly read when explicitly fetching inactive fields.');
-
-    // Re-enable modules one by one, and check that the field is still inactive
-    // while some modules remain disabled.
-    while ($modules) {
-      $field = field_read_field($field_name);
-      $this->assertTrue(empty($field), format_string('%modules disabled. The field is marked inactive.', array('%modules' => implode(', ', $modules))));
-
-      $module = array_shift($modules);
-      module_enable(array($module), FALSE);
-    }
-
-    // Check that the field is active again after all modules have been
-    // enabled.
-    $field = field_read_field($field_name);
-    $this->assertTrue($field_definition <= $field, 'The field was was marked active.');
-  }
-}
diff --git a/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php b/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
index 9f4b89a..fd27bb2 100644
--- a/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
+++ b/core/modules/forum/lib/Drupal/forum/Tests/ForumTest.php
@@ -107,30 +107,6 @@ function setUp() {
   }
 
   /**
-   * Tests disabling and re-enabling the Forum module.
-   */
-  function testEnableForumField() {
-    $this->drupalLogin($this->admin_user);
-
-    // Disable the Forum module.
-    $edit = array();
-    $edit['modules[Core][forum][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->rebuildContainer();
-    $this->assertFalse(module_exists('forum'), 'Forum module is not enabled.');
-
-    // Attempt to re-enable the Forum module and ensure it does not try to
-    // recreate the taxonomy_forums field.
-    $edit = array();
-    $edit['modules[Core][forum][enable]'] = 'forum';
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
-    $this->assertText(t('The configuration options have been saved.'), 'Modules status has been updated.');
-    $this->rebuildContainer();
-    $this->assertTrue(module_exists('forum'), 'Forum module is enabled.');
-  }
-
-  /**
    * Tests forum functionality through the admin and user interfaces.
    */
   function testForum() {
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigTranslationTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigTranslationTest.php
index f17404a..d0e24ec 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigTranslationTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleConfigTranslationTest.php
@@ -138,8 +138,7 @@ function testConfigTranslation() {
     // Quick test to ensure translation file exists.
     $this->assertEqual(config('locale.config.xx.image.style.medium')->get('label'), $image_style_label);
 
-    // Disable and uninstall the module.
-    $this->drupalPost('admin/modules', array('modules[Core][image][enable]' => FALSE), t('Save configuration'));
+    // Uninstall the module.
     $this->drupalPost('admin/modules/uninstall', array('uninstall[image]' => "image"), t('Uninstall'));
     $this->drupalPost(NULL, array(), t('Uninstall'));
 
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
index 85e4b1c..0e4feeb 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUninstallTest.php
@@ -102,7 +102,6 @@ function testUninstallProcess() {
       ->save();
 
     // Uninstall Locale.
-    module_disable($locale_module);
     module_uninstall($locale_module);
     $this->rebuildContainer();
 
diff --git a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUpdateTest.php b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUpdateTest.php
index e5dccbd..49a5485 100644
--- a/core/modules/locale/lib/Drupal/locale/Tests/LocaleUpdateTest.php
+++ b/core/modules/locale/lib/Drupal/locale/Tests/LocaleUpdateTest.php
@@ -325,28 +325,6 @@ function testUpdateProjects() {
   }
 
   /**
-   * Check if a list of translatable projects can include hidden projects.
-   */
-  function testUpdateProjectsHidden() {
-    module_load_include('compare.inc', 'locale');
-    $config = config('locale.settings');
-
-    // Make the test modules look like a normal custom module.
-    state()->set('locale.test_system_info_alter', TRUE);
-    $this->resetAll();
-
-    // Set test condition: include disabled modules when building a project list.
-    $edit = array(
-      'check_disabled_modules' => TRUE,
-    );
-    $this->drupalPost('admin/config/regional/translate/settings', $edit, t('Save configuration'));
-
-    $projects = locale_translation_project_list();
-    $this->assertTrue(isset($projects['locale_test_translate']), 'Disabled module found');
-    $this->assertTrue(isset($projects['locale_test']), 'Enabled module found');
-  }
-
-  /**
    * Checks if local or remote translation sources are detected.
    *
    * The translation status process by default checks the status of the
@@ -658,7 +636,7 @@ function testUpdateImportModeNone() {
   /**
    * Tests automatic translation import when a module is enabled.
    */
-  function testEnableDisableModule() {
+  function testEnableUninstallModule() {
     // Make the hidden test modules look like a normal custom module.
     state()->set('locale.test_system_info_alter', TRUE);
 
@@ -676,11 +654,6 @@ function testEnableDisableModule() {
       array('%number' => 7, '%update' => 0, '%delete' => 0)), 'One translation file imported.');
     $this->assertTranslation('Tuesday', 'Dienstag', 'de');
 
-    // Disable and uninstall a module.
-    $edit = array(
-      'modules[Testing][locale_test_translate][enable]' => FALSE,
-    );
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
     $edit = array(
       'uninstall[locale_test_translate]' => 1,
     );
@@ -701,7 +674,7 @@ function testEnableDisableModule() {
    * enabled modules and will import them. When a language is removed the system
    * will remove all translations of that langugue from the database.
    */
-  function testEnableDisableLanguage() {
+  function testEnableLanguage() {
     // Make the hidden test modules look like a normal custom module.
     state()->set('locale.test_system_info_alter', TRUE);
 
diff --git a/core/modules/node/lib/Drupal/node/Tests/NodeTypePersistenceTest.php b/core/modules/node/lib/Drupal/node/Tests/NodeTypePersistenceTest.php
index d8fa419..599102f 100644
--- a/core/modules/node/lib/Drupal/node/Tests/NodeTypePersistenceTest.php
+++ b/core/modules/node/lib/Drupal/node/Tests/NodeTypePersistenceTest.php
@@ -51,29 +51,10 @@ function testNodeTypeCustomizationPersistence() {
     $this->drupalGet('node/add');
     $this->assertText($description, 'Customized description found');
 
-    // Disable forum and check that the node type gets disabled.
-    $this->drupalPost('admin/modules', $forum_disable, t('Save configuration'));
-    $disabled = db_query('SELECT disabled FROM {node_type} WHERE type = :type', array(':type' => 'forum'))->fetchField();
-    $this->assertEqual($disabled, 1, 'Forum node type is disabled');
-    $this->drupalGet('node/add');
-    $this->assertNoText('forum', 'forum type is not found on node/add');
-
-    // Reenable forum and check that the customization survived the module
-    // disable.
-    $this->drupalPost('admin/modules', $forum_enable, t('Save configuration'));
-    $disabled = db_query('SELECT disabled FROM {node_type} WHERE type = :type', array(':type' => 'forum'))->fetchField();
-    $this->assertNotIdentical($disabled, FALSE, 'Forum node type found in the database');
-    $this->assertEqual($disabled, 0, 'Forum node type is not disabled');
-    $this->drupalGet('node/add');
-    $this->assertText($description, 'Customized description found');
-
     // Disable and uninstall forum.
-    $this->drupalPost('admin/modules', $forum_disable, t('Save configuration'));
     $edit = array('uninstall[forum]' => 'forum');
     $this->drupalPost('admin/modules/uninstall', $edit, t('Uninstall'));
     $this->drupalPost(NULL, array(), t('Uninstall'));
-    $disabled = db_query('SELECT disabled FROM {node_type} WHERE type = :type', array(':type' => 'forum'))->fetchField();
-    $this->assertTrue($disabled, 'Forum node type is in the database and is disabled');
     $this->drupalGet('node/add');
     $this->assertNoText('forum', 'forum type is no longer found on node/add');
 
diff --git a/core/modules/node/node.module b/core/modules/node/node.module
index 6d7b1c9..cdfa13e 100644
--- a/core/modules/node/node.module
+++ b/core/modules/node/node.module
@@ -3590,6 +3590,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/Bundle/BundleTest.php b/core/modules/system/lib/Drupal/system/Tests/Bundle/BundleTest.php
index 35faa3c..b5f3f1d 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Bundle/BundleTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Bundle/BundleTest.php
@@ -42,17 +42,4 @@ function testBundleRegistration() {
     $this->assertText(t('The bundle_test event subscriber fired!'), 'The bundle_test event subscriber fired');
   }
 
-  /**
-   * Tests that the DIC keeps up with module enable/disable in the same request.
-   */
-  function testBundleRegistrationDynamic() {
-    // Disable the module and ensure the bundle's service is not registered.
-    module_disable(array('bundle_test'));
-    $this->assertFalse(drupal_container()->has('bundle_test_class'), 'The bundle_test_class service does not exist in the DIC.');
-
-    // Enable the module and ensure the bundle's service is registered.
-    module_enable(array('bundle_test'));
-    $this->assertTrue(drupal_container()->has('bundle_test_class'), 'The bundle_test_class service exists in the DIC.');
-  }
-
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityApiInfoTest.php b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityApiInfoTest.php
index cb0ea4d..ac961b6 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Entity/EntityApiInfoTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Entity/EntityApiInfoTest.php
@@ -39,8 +39,8 @@ function testEntityInfoChanges() {
     $info = entity_get_info('entity_cache_test');
     $this->assertEqual($info['label'], 'New label.', 'New label appears in entity info.');
 
-    // Disable the providing module and make sure the entity type is gone.
-    module_disable(array('entity_cache_test', 'entity_cache_test_dependency'));
+    // Uninstall the providing module and make sure the entity type is gone.
+    module_uninstall(array('entity_cache_test', 'entity_cache_test_dependency'));
     $entity_info = entity_get_info();
     $this->assertFalse(isset($entity_info['entity_cache_test']), 'Entity type of the providing module is gone.');
   }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Module/DependencyTest.php b/core/modules/system/lib/Drupal/system/Tests/Module/DependencyTest.php
index e561ab7..5fe51c2 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Module/DependencyTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Module/DependencyTest.php
@@ -173,14 +173,6 @@ function testUninstallDependents() {
     $this->drupalPost(NULL, array(), t('Continue'));
     $this->assertModules(array('forum'), TRUE);
 
-    // Disable forum and comment. Both should now be installed but disabled.
-    $edit = array('modules[Core][forum][enable]' => FALSE);
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
-    $this->assertModules(array('forum'), FALSE);
-    $edit = array('modules[Core][comment][enable]' => FALSE);
-    $this->drupalPost('admin/modules', $edit, t('Save configuration'));
-    $this->assertModules(array('comment'), FALSE);
-
     // Check that the taxonomy module cannot be uninstalled.
     $this->drupalGet('admin/modules/uninstall');
     $checkbox = $this->xpath('//input[@type="checkbox" and @disabled="disabled" and @name="uninstall[comment]"]');
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/lib/Drupal/system/Tests/Module/ModuleApiTest.php b/core/modules/system/lib/Drupal/system/Tests/Module/ModuleApiTest.php
index 3de02ce..80efa9f 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Module/ModuleApiTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Module/ModuleApiTest.php
@@ -192,28 +192,6 @@ function testDependencyResolution() {
     $disabled_modules = state()->get('module_test.disable_order') ?: array();
     $this->assertEqual($disabled_modules, array('forum', 'ban', 'php'), 'Modules were disabled in the correct order by module_disable().');
 
-    // Disable a module that is listed as a dependency by the installation
-    // profile. Make sure that the profile itself is not on the list of
-    // dependent modules to be disabled.
-    $profile = drupal_get_profile();
-    $info = install_profile_info($profile);
-    $this->assertTrue(in_array('comment', $info['dependencies']), 'Comment module is listed as a dependency of the installation profile.');
-    $this->assertTrue(module_exists('comment'), 'Comment module is enabled.');
-    module_disable(array('comment'));
-    $this->assertFalse(module_exists('comment'), 'Comment module was disabled.');
-    $disabled_modules = state()->get('module_test.disable_order') ?: array();
-    $this->assertTrue(in_array('comment', $disabled_modules), 'Comment module is in the list of disabled modules.');
-    $this->assertFalse(in_array($profile, $disabled_modules), 'The installation profile is not in the list of disabled modules.');
-
-    // Try to uninstall the PHP module by itself. This should be rejected,
-    // since the modules which it depends on need to be uninstalled first, and
-    // that is too destructive to perform automatically.
-    $result = module_uninstall(array('php'));
-    $this->assertFalse($result, 'Calling module_uninstall() on a module whose dependents are not uninstalled fails.');
-    foreach (array('forum', 'ban', 'php') as $module) {
-      $this->assertNotEqual(drupal_get_installed_schema_version($module), SCHEMA_UNINSTALLED, format_string('The @module module was not uninstalled.', array('@module' => $module)));
-    }
-
     // Now uninstall all three modules explicitly, but in the incorrect order,
     // and make sure that drupal_uninstal_modules() uninstalled them in the
     // correct sequence.
diff --git a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
index aa2e1ae..237efb9 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
@@ -44,19 +44,5 @@ function testSystemInfoAlter() {
     $this->assertTrue(isset($info['regions']['test_region']), 'Altered theme info was returned by system_list().');
     $list_themes = list_themes();
     $this->assertTrue(isset($list_themes['seven']->info['regions']['test_region']), 'Altered theme info was returned by list_themes().');
-
-    // Disable the module and verify that rebuilt .info.yml does not contain it.
-    module_disable(array('module_test'), FALSE);
-    $this->assertFalse(module_exists('module_test'), 'Test module is disabled.');
-
-    $info = system_get_info('theme', 'seven');
-    $this->assertFalse(isset($info['regions']['test_region']), 'Altered theme info was not returned by system_get_info().');
-    $seven_regions = system_region_list('seven');
-    $this->assertFalse(isset($seven_regions['test_region']), 'Altered theme info was not returned by system_region_list().');
-    $system_list_themes = system_list('theme');
-    $info = $system_list_themes['seven']->info;
-    $this->assertFalse(isset($info['regions']['test_region']), 'Altered theme info was not returned by system_list().');
-    $list_themes = list_themes();
-    $this->assertFalse(isset($list_themes['seven']->info['regions']['test_region']), 'Altered theme info was not returned by list_themes().');
   }
 }
diff --git a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
index 664a73b..1adc05a 100644
--- a/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/Theme/ThemeTest.php
@@ -171,29 +171,6 @@ function testThemeGetSetting() {
   }
 
   /**
-   * Ensures the theme registry is rebuilt when modules are disabled/enabled.
-   */
-  function testRegistryRebuild() {
-    $this->assertIdentical(theme('theme_test_foo', array('foo' => 'a')), 'a', 'The theme registry contains theme_test_foo.');
-
-    module_disable(array('theme_test'), FALSE);
-    // After enabling/disabling a module during a test, we need to rebuild the
-    // container and ensure the extension handler is loaded, otherwise theme()
-    // throws an exception.
-    $this->rebuildContainer();
-    $this->container->get('module_handler')->loadAll();
-    $this->assertIdentical(theme('theme_test_foo', array('foo' => 'b')), '', 'The theme registry does not contain theme_test_foo, because the module is disabled.');
-
-    module_enable(array('theme_test'), FALSE);
-    // After enabling/disabling a module during a test, we need to rebuild the
-    // container and ensure the extension handler is loaded, otherwise theme()
-    // throws an exception.
-    $this->rebuildContainer();
-    $this->container->get('module_handler')->loadAll();
-    $this->assertIdentical(theme('theme_test_foo', array('foo' => 'c')), 'c', 'The theme registry contains theme_test_foo again after re-enabling the module.');
-  }
-
-  /**
    * Tests child element rendering for 'render element' theme hooks.
    */
   function testDrupalRenderChildren() {
diff --git a/core/modules/system/system.admin.inc b/core/modules/system/system.admin.inc
index a44060e..7638840 100644
--- a/core/modules/system/system.admin.inc
+++ b/core/modules/system/system.admin.inc
@@ -816,7 +816,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'] .')' : '');
@@ -1196,11 +1203,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 b6d37f0..f6c4d22 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2778,7 +2778,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
@@ -2934,13 +2934,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;
     }
