diff --git a/src/OpenFOAM/db/regIOobject/regIOobject.C b/src/OpenFOAM/db/regIOobject/regIOobject.C
index 3a14d5968ecc56d5f0a1e1010f7ca56ec21e059b..81715069b021e3117cd029e05539f051e9225a51 100644
--- a/src/OpenFOAM/db/regIOobject/regIOobject.C
+++ b/src/OpenFOAM/db/regIOobject/regIOobject.C
@@ -325,14 +325,42 @@ bool Foam::regIOobject::checkOut()
 
 bool Foam::regIOobject::upToDate(const regIOobject& a) const
 {
-    if (a.eventNo() >= eventNo_)
+    label da = a.eventNo()-eventNo_;
+
+    // In case of overflow *this.event() might be 2G but a.event() might
+    // have overflowed to 0.
+    // Detect this by detecting a massive difference (labelMax/2) between
+    // the two events.
+    //
+    //  a       *this   return
+    //  -       -----   ------
+    // normal operation:
+    //  11      10      false
+    //  11      11      false
+    //  10      11      true
+    // overflow situation:
+    //  0       big     false
+    //  big     0       true
+
+    if (da > labelMax/2)
     {
+        // *this.event overflowed but a.event not yet
+        return true;
+    }
+    else if (da < -labelMax/2)
+    {
+        // a.event overflowed but *this not yet
         return false;
     }
-    else
+    else if (da < 0)
     {
+        // My event number higher than a
         return true;
     }
+    else
+    {
+        return false;
+    }
 }
 
 
@@ -342,18 +370,7 @@ bool Foam::regIOobject::upToDate
     const regIOobject& b
 ) const
 {
-    if
-    (
-        a.eventNo() >= eventNo_
-     || b.eventNo() >= eventNo_
-    )
-    {
-        return false;
-    }
-    else
-    {
-        return true;
-    }
+    return upToDate(a) && upToDate(b);
 }
 
 
@@ -364,19 +381,7 @@ bool Foam::regIOobject::upToDate
     const regIOobject& c
 ) const
 {
-    if
-    (
-        a.eventNo() >= eventNo_
-     || b.eventNo() >= eventNo_
-     || c.eventNo() >= eventNo_
-    )
-    {
-        return false;
-    }
-    else
-    {
-        return true;
-    }
+    return upToDate(a) && upToDate(b) && upToDate(c);
 }
 
 
@@ -388,20 +393,7 @@ bool Foam::regIOobject::upToDate
     const regIOobject& d
 ) const
 {
-    if
-    (
-        a.eventNo() >= eventNo_
-     || b.eventNo() >= eventNo_
-     || c.eventNo() >= eventNo_
-     || d.eventNo() >= eventNo_
-    )
-    {
-        return false;
-    }
-    else
-    {
-        return true;
-    }
+    return upToDate(a) && upToDate(b) && upToDate(c) && upToDate(d);
 }