=== modified file 'modules/forum/forum.info'
--- modules/forum/forum.info	
+++ modules/forum/forum.info	
@@ -1,4 +1,4 @@
 ; $Id: forum.info,v 1.1 2006/08/31 20:22:35 dries Exp $
 name = Forum
 description = Enables threaded discussions about general topics.
-
+dependencies = taxonomy comment
=== modified file 'modules/system/admin.css'
--- modules/system/admin.css	
+++ modules/system/admin.css	
@@ -37,6 +37,11 @@ div.admin .expert-link {
   padding-right: 4px;
 }
 
+div.admin-missing, div.admin-required {
+  font-size:  1.1em;
+  color: #444;
+}
+
 /**
  * Formatting for status report
  */
@@ -61,3 +66,4 @@ table.system-status-report tr.warning th
 table.system-status-report tr.ok th {
   background-image: url('../../misc/watchdog-ok.png');
 }
+
=== modified file 'modules/system/system.module'
--- modules/system/system.module	
+++ modules/system/system.module	
@@ -1217,6 +1217,7 @@ function system_modules() {
   // Get current list of modules
   $files = module_rebuild_cache();
 
+  // First Pass.
   foreach ($files as $filename => $file) {
     $info = $file->info;
     $form['name'][$file->name] = array('#value' => $info['name']);
@@ -1224,15 +1225,62 @@ function system_modules() {
     $options[$file->name] = '';
     if ($file->status) {
       $status[] = $file->name;
+      // For later dependency checking.
+      $info['enabled'] = TRUE;
     }
     if ($file->throttle) {
       $throttle[] = $file->name;
     }
+    $modules[$file->name] = $info;
   }
+  // Store modules list for validation hook.
+  $form['modules'] = array('#type' => 'value', '#value' => $modules);
+  $disabled = array();
+  // Second pass. Dependency checking.
+  $form['reverse_deps'] = array('#type' => 'value', '#value' => array());
+  foreach ($form['modules']['#value'] as $filename => $info) {
+    $missing_deps = array();
+    // Check missing dependencies.
+    if (isset($info['dependencies'])) {
+      foreach (explode(' ', $info['dependencies']) as $dependency) {
+        if (!isset($modules[$dependency]) || !isset($modules[$dependency]['enabled'])) {
+          $disabled[] = $filename;
+          $missing_deps[] = isset($modules[$dependency]) ? $modules[$dependency]['name'] : $dependency;
+        }
+        elseif (isset($info['enabled'])) {
+          $disabled[] = $dependency;
+          $form['reverse_deps']['#value'][$dependency][] = $info['name'];
+        }
+      }
+
+      // Add text for missing dependencies.
+      if (!empty($missing_deps)) {
+        $form['description'][$filename]['missing_deps'] = array(
+          '#value' => t('Missing dependencies: %missing_deps', array('%missing_deps' => implode(', ', $missing_deps))),
+          '#prefix' => '<div class="admin-missing">',
+          '#suffix' => '</div>',
+        );
+      }
+    }
+  }
+
+  // Third pass. Add reverse dependency strings to description.
+  foreach ($form['reverse_deps']['#value'] as $filename => $dependency) {
+    $form['description'][$filename]['required'] = array(
+      '#value' => t('Required by: %required', array('%required' => implode(', ', $dependency))),
+      '#prefix' => '<div class="admin-required">',
+      '#suffix' => '</div>',
+    );
+  }
+    // Disable individual checkboxes.
+    if (isset($form['disabled'][$key])) {
+      $form['status'][$key]['#attributes'] = array('disabled' => 'disabled');
+    }
+
 
   // Handle status checkboxes, including overriding the generated
   // checkboxes for required modules.
-  $form['status'] = array('#type' => 'checkboxes', '#default_value' => $status, '#options' => $options);
+  $form['status'] = array('#type' => 'checkboxes', '#default_value' => $status, '#options' => $options, '#process' => array( 'expand_checkboxes' => array(), 'system_module_disable' => array($disabled)));
   $required = array('block', 'filter', 'node', 'system', 'user', 'watchdog');
   foreach ($required as $require) {
     $form['status'][$require] = array('#type' => 'hidden', '#value' => 1, '#suffix' => t('required'));
@@ -1254,6 +1302,32 @@ function system_modules() {
   return $form;
 }
 
+function system_module_disable($form, $edit, $disabled) {
+  foreach ($disabled as $key) {
+    $form[$key]['#attributes']['disabled'] = 'disabled';
+  }
+  return $form;
+}
+
+function system_modules_validate($form_id, $form_values, $form) {
+  // Recheck values for submitted dependency errors.
+  foreach ($form_values['modules'] as $filename => $info) {
+    if (!isset($info['enabled']) && $form_values['status'][$filename] && !empty($info['dependencies'])) {
+      foreach (explode(' ', $info['dependencies']) as $dependency) {
+        if (!isset($form['status'][$dependency]) || !($form_values['status'][$dependency])) {
+          form_set_value($form['status'][$filename], FALSE);
+          form_set_error("status][$filename",
+            t('You are attempting to enable %module, but it depends on %dependency.',
+              array(
+                '%module' => $info['name'],
+                '%dependency' => isset($form_values['modules'][$dependency]) ? $form_values['modules'][$dependency]['name'] : $dependency
+            )));
+        }
+      }
+    }
+  }
+}
+
 function theme_system_modules($form) {
   foreach (element_children($form['name']) as $key) {
     $row = array();
@@ -1284,8 +1358,11 @@ function system_modules_submit($form_id,
   include_once './includes/install.inc';
   $new_modules = array();
 
-  // Enable/disable modules that have already been installed
-  foreach ($edit['status'] as $key => $choice) {
+  // Merge in reverse deps since they should be enabled.
+  // They don't appear because disabled checkboxes are not submited
+  // by browsers.
+  $modules = array_merge($edit['status'], $edit['reverse_deps']);
+  foreach ($modules as $key => $choice) {
     if ($choice) {
       if (drupal_get_installed_schema_version($key) == SCHEMA_UNINSTALLED) {
         $new_modules[] = $key;
