Index: includes/install.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/install.inc,v
retrieving revision 1.93
diff -u -p -r1.93 install.inc
--- includes/install.inc	8 Jun 2009 04:33:35 -0000	1.93
+++ includes/install.inc	9 Jun 2009 13:05:48 -0000
@@ -516,11 +516,7 @@ function drupal_install_modules($module_
   } while ($moved);
   asort($module_list);
   $module_list = array_keys($module_list);
-  $modules_installed = array_filter($module_list, '_drupal_install_module');
-  if (!$disable_modules_installed_hook && !empty($modules_installed)) {
-    module_invoke_all('modules_installed', $modules_installed);
-  }
-  module_enable($module_list);
+  module_enable($module_list, $disable_modules_installed_hook);
 }
 
 /**
Index: includes/module.inc
===================================================================
RCS file: /cvs/drupal/drupal/includes/module.inc,v
retrieving revision 1.143
diff -u -p -r1.143 module.inc
--- includes/module.inc	6 Jun 2009 16:05:26 -0000	1.143
+++ includes/module.inc	9 Jun 2009 13:05:51 -0000
@@ -172,9 +172,15 @@ function module_load_all_includes($type,
  *
  * @param $module_list
  *   An array of module names.
+ * @param $disable_modules_installed_hook
+ *   Normally just testing wants to set this to TRUE.
  */
-function module_enable($module_list) {
+function module_enable($module_list, $disable_modules_installed_hook = FALSE) {
   $invoke_modules = array();
+  
+  // Try to install the enabled modules and collect which were installed.
+  // $module_list is not changed and already installed modules are ignored.
+  $modules_installed = array_filter($module_list, '_drupal_install_module');
   foreach ($module_list as $module) {
     $existing = db_query("SELECT status FROM {system} WHERE type = :type AND name = :name", array(
       ':type' => 'module',
@@ -198,6 +204,11 @@ function module_enable($module_list) {
     module_list(TRUE);
     // Force to regenerate the stored list of hook implementations.
     registry_rebuild();
+
+    // If any modules were newly installed, execute the hook for them.
+    if (!$disable_modules_installed_hook && !empty($modules_installed)) {
+      module_invoke_all('modules_installed', $modules_installed);
+    }
   }
 
   foreach ($invoke_modules as $module) {
Index: modules/system/system.test
===================================================================
RCS file: /cvs/drupal/drupal/modules/system/system.test,v
retrieving revision 1.46
diff -u -p -r1.46 system.test
--- modules/system/system.test	27 May 2009 18:34:01 -0000	1.46
+++ modules/system/system.test	9 Jun 2009 13:06:09 -0000
@@ -113,6 +113,7 @@ class EnableDisableTestCase extends Modu
     // Install (and enable) aggregator module.
     $edit = array();
     $edit['modules[Core][aggregator][enable]'] = 'aggregator';
+    $edit['modules[Core][forum][enable]'] = 'forum';
     $this->drupalPost('admin/build/modules', $edit, t('Save configuration'));
     $this->assertText(t('The configuration options have been saved.'), t('Modules status has been updated.'));
 
Index: modules/user/user.admin.inc
===================================================================
RCS file: /cvs/drupal/drupal/modules/user/user.admin.inc,v
retrieving revision 1.57
diff -u -p -r1.57 user.admin.inc
--- modules/user/user.admin.inc	6 Jun 2009 14:51:56 -0000	1.57
+++ modules/user/user.admin.inc	9 Jun 2009 13:06:18 -0000
@@ -939,6 +939,8 @@ function user_modules_installed($modules
   // Assign all available permissions to the administrator role.
   $rid = variable_get('user_admin_role', 0);
   if ($rid) {
+    // Clear node type cache for node permissions.
+    node_type_clear();
     foreach ($modules as $module) {
       if ($permissions = module_invoke($module, 'perm')) {
         foreach (array_keys($permissions) as $permission) {
