diff --git a/ChangeLog b/ChangeLog
index 661fe2838ddd7badd787324a16486d29773aded0..c47db80e47a5da481ed211b85f16e44d3add106f 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-18  Derek R. Price  <derek@ximbiot.com>
+
+	* NEWS: Note timestamp fix for systems with imperfectly synchronized
+	time() & gettimeofday() functions.
+
 2008-11-25  Larry Jones  <lawrence.jones@siemens.com>
 
 	* HACKING, NEWS: Note update to Autoconf 2.63.
diff --git a/NEWS b/NEWS
index 863030da58be5df6d397af511dd0ba09e4d44491..2dbbdfb40b2d5847551e4a7246ee1b8fd22f57c5 100644
--- a/NEWS
+++ b/NEWS
@@ -50,6 +50,9 @@ NEW FEATURES
 
 BUG FIXES
 
+* Time stamps are set correctly on systems where time() and gettimeofday()
+  return times with different values for the current second.
+
 * Changing keyword substitution mode no longer interferes with conflict
   tracking (fixes bug #17565).
 
diff --git a/src/ChangeLog b/src/ChangeLog
index c65df7808ada5aa6a3abc371b5b09939870c94ae..0fbbb8625adab14e4ab88b4b7bf44e5aad302da7 100644
--- a/src/ChangeLog
+++ b/src/ChangeLog
@@ -1,3 +1,8 @@
+2009-07-18  Derek R. Price  <derek@ximbiot.com>
+
+	* subr.c (sleep_past): Don't assume that time() called after
+	gettimeofday() must return a seconds value >= than gettimeofday() did.
+
 2008-12-02  Larry Jones  <lawrence.jones@siemens.com>
 
 	* commit.c: Remove defunct variable (got_message).
diff --git a/src/subr.c b/src/subr.c
index 2895f1e3ae29343f2b33acdcac2c6b052fb3329e..914a8079ca9b78cbed382f04cc7477a770f4ddd8 100644
--- a/src/subr.c
+++ b/src/subr.c
@@ -906,27 +906,37 @@ sleep_past (time_t desttime)
     time_t t;
     long s;
     long us;
-
+/*    printf ("sleep requested until %d, current time it %d\n",
+	    desttime, time(&t));  */
     while (time (&t) <= desttime)
     {
 #ifdef HAVE_GETTIMEOFDAY
 	struct timeval tv;
 	gettimeofday (&tv, NULL);
-	if (tv.tv_sec > desttime)
-	    break;
-	s = desttime - tv.tv_sec;
-	if (tv.tv_usec > 0)
-	    us = 1000000 - tv.tv_usec;
+	if (tv.tv_sec <= desttime) {
+	    s = desttime - tv.tv_sec;
+	    if (tv.tv_usec > 0)
+		us = 1000000 - tv.tv_usec;
+	    else
+	    {
+		s++;
+		us = 0;
+	    }
+	}
 	else
+#endif
 	{
-	    s++;
-	    us = 0;
+	    /* On at least one Linux 2.6.24 system, time() lags behind
+	     * gettimeofday() by up to 10 msec, and file time stamps use
+	     * time().  For example, time() might return 1247677670 while
+	     * gettimeofday() returns 1247677671.000060, so we always sleep
+	     * at least 20ms and retry the test using time(), like we do when
+	     * gettimeofday() is not available.
+ 	     */
+	    /* default to 20 ms increments */
+	    us = 20000;
+	    s = desttime - t;
 	}
-#else
-	/* default to 20 ms increments */
-	s = desttime - t;
-	us = 20000;
-#endif
 
 	{
 	    struct timespec ts;
@@ -935,6 +945,7 @@ sleep_past (time_t desttime)
 	    (void)nanosleep (&ts, NULL);
 	}
     }
+    /* printf ("slept until %d\n", time(&t));  */
 }