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 c739dd9..9ff1f03 100644
--- a/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
+++ b/core/modules/system/lib/Drupal/system/Tests/System/InfoAlterTest.php
@@ -29,6 +29,9 @@ public static function getInfo() {
    * return freshly altered info.
    */
   function testSystemInfoAlter() {
+    \Drupal::state()->set('module_test.hook_system_info_alter', TRUE);
+    $info = system_rebuild_module_data();
+    $this->assertFalse(isset($info['node']->info['required']), 'Before the module_test is installed the node module is not required.');
     // Enable seven and the test module.
     theme_enable(array('seven'));
     \Drupal::moduleHandler()->install(array('module_test'), FALSE);
@@ -44,5 +47,9 @@ 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().');
+    system_list_reset();
+    $info = system_rebuild_module_data();
+    $this->assertTrue($info['node']->info['required'], 'After the module_test is installed the node module is required.');
+    \Drupal::state()->set('module_test.hook_system_info_alter', FALSE);
   }
 }
diff --git a/core/modules/system/system.module b/core/modules/system/system.module
index cb0cb54..295c2f8 100644
--- a/core/modules/system/system.module
+++ b/core/modules/system/system.module
@@ -2434,6 +2434,13 @@ function _system_rebuild_module_data() {
     drupal_alter('system_info', $modules[$key]->info, $modules[$key], $type);
   }
 
+  // It is possible that a module was marked as required by
+  // hook_system_info_alter() and modules that it depends on are not required.
+  foreach ($modules as $module) {
+    _system_rebuild_module_data_ensure_required($module, $modules);
+  }
+
+
   if (isset($modules[$profile])) {
     // The installation profile is required, if it's a valid module.
     $modules[$profile]->info['required'] = TRUE;
@@ -2448,6 +2455,27 @@ function _system_rebuild_module_data() {
 }
 
 /**
+ * Ensures that dependencies of required modules are also required.
+ *
+ * @param \stdClass $module
+ *   The module info.
+ * @param array $modules
+ *   The array of all module info.
+ */
+function _system_rebuild_module_data_ensure_required($module, &$modules) {
+  if (!empty($module->info['required'])) {
+    foreach ($module->info['dependencies'] as $dependant) {
+      if (!isset($modules[$dependant]->info['required'])) {
+        $modules[$dependant]->info['required'] = TRUE;
+        $modules[$dependant]->info['explanation'] = t('Dependency of required module @module', array('@module' => $module->name));
+        // Ensure any dependencies it has are required.
+        _system_rebuild_module_data_ensure_required($modules[$dependant], $modules);
+      }
+    }
+  }
+}
+
+/**
  * Rebuild, save, and return data about all currently available modules.
  *
  * @return
diff --git a/core/modules/system/tests/modules/module_test/module_test.info.yml b/core/modules/system/tests/modules/module_test/module_test.info.yml
index 4c0ecf8..390706d 100644
--- a/core/modules/system/tests/modules/module_test/module_test.info.yml
+++ b/core/modules/system/tests/modules/module_test/module_test.info.yml
@@ -5,3 +5,8 @@ package: Testing
 version: VERSION
 core: 8.x
 hidden: true
+# Depends on the Node module to test making a module required using
+# hook_system_info_alter() and ensuring that its dependencies also become
+# required.
+dependencies:
+  - node
diff --git a/core/modules/system/tests/modules/module_test/module_test.module b/core/modules/system/tests/modules/module_test/module_test.module
index 94278b7..6bb9a78 100644
--- a/core/modules/system/tests/modules/module_test/module_test.module
+++ b/core/modules/system/tests/modules/module_test/module_test.module
@@ -52,6 +52,10 @@ function module_test_system_info_alter(&$info, $file, $type) {
   if ($file->name == 'seven' && $type == 'theme') {
     $info['regions']['test_region'] = t('Test region');
   }
+  if ($file->name == 'module_test' && \Drupal::state()->get('module_test.hook_system_info_alter')) {
+    $info['required'] = TRUE;
+    $info['explanation'] = 'Testing hook_system_info_alter()';
+  }
 }
 
 /**
