=== modified file 'includes/install.inc'
--- includes/install.inc	2007-12-13 10:46:43 +0000
+++ includes/install.inc	2007-12-17 07:40:44 +0000
@@ -22,8 +22,10 @@ define('FILE_NOT_EXECUTABLE', 128);
  * Initialize the update system by loading all installed module's .install files.
  */
 function drupal_load_updates() {
-  foreach (module_list() as $module) {
-    module_load_install($module);
+  foreach (drupal_get_installed_schema_version(NULL, FALSE, TRUE) as $module => $schema_version) {
+    if ($schema_version > -1) {
+      module_load_install($module);
+    }
   }
 }
 
@@ -58,10 +60,15 @@ function drupal_get_schema_versions($mod
  *
  * @param $module
  *   A module name.
+ * @param $reset
+ *   Set to TRUE after modifying the system table.
+ * @param $array
+ *   Set to TRUE if you want to get information about all modules in the 
+ *   system.
  * @return
  *   The currently installed schema version.
  */
-function drupal_get_installed_schema_version($module, $reset = FALSE) {
+function drupal_get_installed_schema_version($module, $reset = FALSE, $array = FALSE) {
   static $versions = array();
 
   if ($reset) {
@@ -76,7 +83,7 @@ function drupal_get_installed_schema_ver
     }
   }
 
-  return $versions[$module];
+  return $array ? $versions : $versions[$module];
 }
 
 /**

=== modified file 'modules/comment/comment.install'
--- modules/comment/comment.install	2007-12-08 14:06:20 +0000
+++ modules/comment/comment.install	2007-12-17 07:41:07 +0000
@@ -1,6 +1,8 @@
 <?php
 // $Id: comment.install,v 1.12 2007/12/08 14:06:21 goba Exp $
 
+drupal_load('module', 'comment');
+
 /**
  * Implementation of hook_enable().
  */

=== modified file 'modules/system/system.install'
--- modules/system/system.install	2007-12-16 09:32:41 +0000
+++ modules/system/system.install	2007-12-17 07:40:44 +0000
@@ -1039,6 +1039,10 @@ function system_schema() {
  * @defgroup updates-4.7.x-extra Extra system updates for 4.7.x
  * @{
  */
+ 
+function system_update_last_removed() {
+  return 179;
+}
 
 function system_update_180() {
   $ret = array();

=== modified file 'update.php'
--- update.php	2007-12-14 17:18:24 +0000
+++ update.php	2007-12-17 07:40:44 +0000
@@ -187,19 +187,32 @@ function update_script_selection_form() 
   // Ensure system.module's updates appear first
   $form['start']['system'] = array();
 
-  foreach (module_list() as $module) {
+  $modules = drupal_get_installed_schema_version(NULL, FALSE, TRUE);
+  foreach ($modules as $module => $schema_version) {
     $updates = drupal_get_schema_versions($module);
-    if ($updates !== FALSE) {
+    // Skip incompatible module updates completely, otherwise test schema versions.
+    if (!update_check_incompatibility($module) && $updates !== FALSE && $schema_version >= 0) {
+      // module_invoke returns NULL for nonexisting hooks, so if no updates
+      // are removed, it will == 0.
+      $last_removed = module_invoke($module, 'update_last_removed');
+      if ($schema_version < $last_removed) {
+        $form['start'][$module] = array(
+          '#value'  => t('%module module can not be updated. Its schema version is %schema_version. Updates up to and including %last_removed have been removed in this release. In order to update %module module, you will first <a href="@upgrade">need to upgrade</a> to the last version in which these updates were available.', array('%module' => $module, '%schema_version' => $schema_version, '%last_removed' => $last_removed, '@upgrade' => url('http://drupal.org/upgrade'))),
+          '#prefix' => '<div class="warning">',
+          '#suffix' => '</div>',
+        );
+        $form['start']['#collapsed'] = FALSE;
+        continue;
+      }
       $updates = drupal_map_assoc($updates);
       $updates[] = 'No updates available';
-      $default = drupal_get_installed_schema_version($module);
+      $default = $schema_version;
       foreach (array_keys($updates) as $update) {
-        if ($update > $default) {
+        if ($update > $schema_version) {
           $default = $update;
           break;
         }
       }
-
       $form['start'][$module] = array(
         '#type' => 'select',
         '#title' => $module .' module',
@@ -537,22 +550,9 @@ function update_create_batch_table() {
 function update_fix_compatibility() {
   $ret = array();
   $incompatible = array();
-  $themes = system_theme_data();
-  $modules = module_rebuild_cache();
   $query = db_query("SELECT name, type, status FROM {system} WHERE status = 1 AND type IN ('module','theme')");
   while ($result = db_fetch_object($query)) {
-    $name = $result->name;
-    $file = array();
-    if ($result->type == 'module' && isset($modules[$name])) {
-      $file = $modules[$name];
-    }
-    else if ($result->type == 'theme' && isset($themes[$name])) {
-      $file = $themes[$name];
-    }
-    if (!isset($file)
-        || !isset($file->info['core'])
-        || $file->info['core'] != DRUPAL_CORE_COMPATIBILITY
-        || version_compare(phpversion(), $file->info['php']) < 0) {
+    if (update_check_incompatibility($result->name, $result->type)) {
       $incompatible[] = $name;
     }
   }
@@ -563,6 +563,33 @@ function update_fix_compatibility() {
 }
 
 /**
+ * Helper function to test compatibility of a module or theme.
+ */
+function update_check_incompatibility($name, $type = 'module') {
+  static $themes, $modules;
+
+  // Store values of expensive functions for future use.
+  if (empty($themes) || empty($modules)) {
+    $themes = system_theme_data();
+    $modules = module_rebuild_cache();
+  }
+
+  if ($type == 'module' && isset($modules[$name])) {
+    $file = $modules[$name];
+  }
+  else if ($type == 'theme' && isset($themes[$name])) {
+    $file = $themes[$name];
+  }
+  if (!isset($file)
+      || !isset($file->info['core'])
+      || $file->info['core'] != DRUPAL_CORE_COMPATIBILITY
+      || version_compare(phpversion(), $file->info['php']) < 0) {
+    return TRUE;
+  }
+  return FALSE;
+}
+
+/**
  * Perform Drupal 5.x to 6.x updates that are required for update.php
  * to function properly.
  *

