--- hwclock.c.orig	2008-10-19 14:45:03.000000000 +0100
+++ hwclock.c	2008-10-20 22:56:42.000000000 +0100
@@ -669,7 +669,7 @@
 
 static int
 set_system_clock(const bool hclock_valid, const time_t newtime,
-                 const bool testing) {
+                 const bool testing, const bool notickwait) {
 /*----------------------------------------------------------------------------
    Set the System Clock to time 'newtime'.
 
@@ -683,6 +683,10 @@
 
    If 'testing' is true, don't actually update anything -- just say we
    would have.
+
+   If notickwait is set, add half a second to the time.  This is because
+   we didn't wait for the clock to tick, so on average we will be half
+   way through the second.
 -----------------------------------------------------------------------------*/
   int retcode;
 
@@ -697,7 +701,7 @@
     int rc;
 
     tv.tv_sec = newtime;
-    tv.tv_usec = 0;
+    tv.tv_usec = notickwait ? 500000 : 0;
 
     broken = localtime(&newtime);
 #ifdef HAVE_TM_GMTOFF
@@ -1034,7 +1038,7 @@
                  const bool hctosys, const bool systohc,
                  const struct timeval startup_time,
                  const bool utc, const bool local_opt,
-		 const bool testing) {
+		 const bool testing, const bool notickwait) {
 /*---------------------------------------------------------------------------
   Do all the normal work of hwclock - read, set clock, etc.
 
@@ -1070,9 +1074,11 @@
 	adjtime.dirty = TRUE;
       }
 
-      rc = synchronize_to_clock_tick();  /* this takes up to 1 second */
-      if (rc)
+      if (!notickwait) {
+        rc = synchronize_to_clock_tick();  /* this takes up to 1 second */
+        if (rc)
 	      return rc;
+      }
 
       {
         struct timeval read_time;
@@ -1118,7 +1124,7 @@
           adjust_drift_factor(&adjtime, (time_t) reftime.tv_sec, hclock_valid,
                               hclocktime, (double) read_time.tv_usec / 1E6);
         } else if (hctosys) {
-          rc = set_system_clock(hclock_valid, hclocktime, testing);
+          rc = set_system_clock(hclock_valid, hclocktime, testing, notickwait);
           if (rc) {
             printf(_("Unable to set system clock.\n"));
 	    return rc;
@@ -1229,6 +1235,7 @@
     "                hardware clock's epoch value\n"
     "  --noadjfile   do not access /etc/adjtime. Requires the use of\n"
     "                either --utc or --localtime\n"
+    "  --notickwait  do not wait for the hardware clock to tick\n"
     ),RTC_DEV);
 #ifdef __alpha__
   fprintf(usageto, _(
@@ -1278,6 +1285,7 @@
 	{ "date", 1, 0, 136 },
 	{ "epoch", 1, 0, 137 },
 	{ "rtc", 1, 0, 'f' },
+	{ "notickwait", 0, 0, 138 },
 	{ NULL, 0, 0, 0 }
 };
 
@@ -1306,6 +1314,7 @@
 	bool show, set, systohc, hctosys, adjust, getepoch, setepoch;
 	bool utc, testing, local_opt, noadjfile, directisa;
 	bool ARCconsole, Jensen, SRM, funky_toy;
+	bool notickwait;
 	char *date_opt;
 
 	/* Remember what time we were invoked */
@@ -1336,6 +1345,7 @@
 	show = set = systohc = hctosys = adjust = noadjfile = FALSE;
 	getepoch = setepoch = utc = local_opt = testing = debug = FALSE;
 	ARCconsole = Jensen = SRM = funky_toy = directisa = badyear = FALSE;
+	notickwait = FALSE;
 	date_opt = NULL;
 
 	while ((c = getopt_long (argc, argv, "?hvVDarsuwAJSFf:", longopts, NULL))
@@ -1406,6 +1416,9 @@
 		case 'f':
 			rtc_dev_name = optarg;		/* --rtc */
 			break;
+		case 138:
+			notickwait = TRUE;		/* --notickwait */
+			break;
 		case 'v':				/* --version */
 		case 'V':
 			out_version();
@@ -1527,7 +1540,7 @@
 
 	rc = manipulate_clock(show, adjust, noadjfile, set, set_time,
 				hctosys, systohc, startup_time, utc,
-				local_opt, testing);
+				local_opt, testing, notickwait);
 	hwclock_exit(rc);
 	return rc;	/* Not reached */
 }
