--- nagios.module.orig	2012-04-26 17:16:06.000000000 +0200
+++ nagios.module	2012-11-17 18:08:42.841092940 +0100
@@ -400,15 +400,24 @@
   $min_severity = variable_get('nagios_min_report_severity', NAGIOS_STATUS_WARNING);
   foreach ($reqs as $key => $requirement) {
     if (isset($requirement['severity'])) {
-      // Ignore update_core warning if update cache has expired and nagios_cron_duration has not passed by yet
-      if ($key == 'update_core' && $requirement['severity'] == REQUIREMENT_WARNING && $requirement['reason'] == UPDATE_UNKNOWN) {
-        $grace = 60 * variable_get('nagios_cron_duration', 60);
-        $expire = db_result(db_query("SELECT expire FROM {cache_update} WHERE cid = '%s'", 'update_available_releases'));
-        if ($expire && time() < ($expire + $grace)) {
-          // Set the severity/desc to what was previously set - updates are currently running, and we're in an unknown state.
-          $severity = cache_get('nagios_prev_severity');
-          $descriptions = cache_get('nagios_prev_desc');
-          continue;
+      // Once a day, the update_core cache expires. The update_core requirement severity is
+      // then REQUIREMENT_WARNING and the reason is UPDATE_UNKNOWN. In order to avoid an unnecessary
+      // nagios state change, calculate a grace time that lasts for one planned cron duration. During
+      // grace time, use the requirement info from cache.
+      if ($key == 'update_core') {
+        $grace_time = FALSE;
+        if ($requirement['severity'] == REQUIREMENT_WARNING && $requirement['reason'] == UPDATE_UNKNOWN) {
+          $grace_seconds = 60 * variable_get('nagios_cron_duration', 60);
+          $expire = db_result(db_query("SELECT expire FROM {cache_update} WHERE cid = '%s'", 'update_available_releases'));
+          if ($expire && time() < ($expire + $grace_seconds)) {
+            $grace_time = TRUE;
+          }
+        }
+        if ($grace_time) {
+          $requirement = cache_get('nagios_update_core_requirement');
+        }
+        else {
+          cache_set('nagios_update_core_requirement', $requirement);
         }
       }
       if ($requirement['severity'] >= $min_severity) {
@@ -426,10 +435,6 @@
     $desc = join(', ', $descriptions);
   }
 
-  // Cache the current severity and descriptions - we may need to remember them if updates are running.
-  cache_set('nagios_prev_severity', $severity);
-  cache_set('nagios_prev_desc', $descriptions);
-
   // Create a status to pass back, and a text description too
   switch($severity) {
     case REQUIREMENT_OK: