diff --git a/modules/simpletest/tests/module_test.info b/modules/simpletest/tests/module_test.info
index 0a0f3c0..cfc979e 100644
--- a/modules/simpletest/tests/module_test.info
+++ b/modules/simpletest/tests/module_test.info
@@ -4,3 +4,7 @@ package = Testing
 version = VERSION
 core = 7.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[] = list (>=7.x)
diff --git a/modules/simpletest/tests/module_test.module b/modules/simpletest/tests/module_test.module
index d781350..407579f 100644
--- a/modules/simpletest/tests/module_test.module
+++ b/modules/simpletest/tests/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' && variable_get('module_test_hook_system_info_alter')) {
+    $info['required'] = TRUE;
+    $info['explanation'] = 'Testing hook_system_info_alter()';
+  }
 }
 
 /**
diff --git a/modules/system/system.module b/modules/system/system.module
index 6a6200e..fe7d9ee 100644
--- a/modules/system/system.module
+++ b/modules/system/system.module
@@ -2433,6 +2433,12 @@ 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;
@@ -2447,6 +2453,29 @@ 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 $dependency) {
+      $dependency_data = drupal_parse_dependency($dependency);
+      $dependency_name = $dependency_data['name'];
+      if (!isset($modules[$dependency_name]->info['required'])) {
+        $modules[$dependency_name]->info['required'] = TRUE;
+        $modules[$dependency_name]->info['explanation'] = t('Dependency of required module @module', array('@module' => $module->info['name']));
+        // Ensure any dependencies it has are required.
+        _system_rebuild_module_data_ensure_required($modules[$dependency_name], $modules);
+      }
+    }
+  }
+}
+
+/**
  * Rebuild, save, and return data about all currently available modules.
  *
  * @return
diff --git a/modules/system/system.test b/modules/system/system.test
index aefbfbc..faeb1e4 100644
--- a/modules/system/system.test
+++ b/modules/system/system.test
@@ -2211,6 +2211,9 @@ class SystemInfoAlterTestCase extends DrupalWebTestCase {
    * return freshly altered info.
    */
   function testSystemInfoAlter() {
+    variable_set('module_test_hook_system_info_alter', TRUE);
+    $info = system_rebuild_module_data();
+    $this->assertFalse(isset($info['list']->info['required']), 'Before the module_test is installed the list module is not required.');
     // Enable our test module. Flush all caches, which we assert is the only
     // thing necessary to use the rebuilt {system}.info.
     module_enable(array('module_test'), FALSE);
@@ -2226,6 +2229,9 @@ class SystemInfoAlterTestCase extends DrupalWebTestCase {
     $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().');
+    $info = system_rebuild_module_data();
+    $this->assertTrue($info['list']->info['required'], 'After the module_test is installed the list module is required.');
+    variable_set('module_test_hook_system_info_alter', FALSE);
 
     // Disable the module and verify that {system}.info is rebuilt without it.
     module_disable(array('module_test'), FALSE);
