Index: trunk/Ohana/src/opihi/pantasks/CheckTasks.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/CheckTasks.c	(revision 23326)
+++ trunk/Ohana/src/opihi/pantasks/CheckTasks.c	(revision 23329)
@@ -48,5 +48,5 @@
     // add random offset between 0 and 5% of exec_period
     // XXX this should be optional
-    fuzz = 0.05*task[0].exec_period*drand48() + 1e-6*task[0].last.tv_usec; 
+    fuzz = 0.1*task[0].exec_period*drand48();
     task[0].last.tv_usec = 1e6*(fuzz - (int)fuzz);
     task[0].last.tv_sec += (int) fuzz;
Index: trunk/Ohana/src/opihi/pantasks/task_threads.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/task_threads.c	(revision 23326)
+++ trunk/Ohana/src/opihi/pantasks/task_threads.c	(revision 23329)
@@ -2,8 +2,12 @@
 
 /** things related to CheckTasks **/
+void ResetTaskTimers ();
 
 static int CheckTasksRun = FALSE;
 
 void CheckTasksSetState (int state) {
+  if (state && !CheckTasksRun) {
+    ResetTaskTimers ();
+  }
   CheckTasksRun = state;
 }
@@ -51,2 +55,27 @@
 // timeout.  this enforces a certain granularity in the task creation, but prevents the task
 // thread from driving the load up to silly levels.
+
+// reset all of the task timers, with a bit of fuzz.  this is called 
+// whenever we transition from 'stop' to 'run'
+void ResetTaskTimers () {
+
+  Task *task;
+  struct timeval now;
+  float fuzz;
+
+  // get the current time
+  gettimeofday (&now, NULL);
+
+  // check all tasks
+  while ((task = NextTask ()) != NULL) {
+    task[0].last.tv_usec = now.tv_usec;
+    task[0].last.tv_sec  = now.tv_sec;
+
+    // add random offset between 0 and 10% of exec_period
+    // XXX this should be optional
+    fuzz = 0.1*task[0].exec_period*drand48();
+    task[0].last.tv_usec = 1e6*(fuzz - (int)fuzz);
+    task[0].last.tv_sec += (int) fuzz;
+  }
+  return;
+}
