Index: trunk/Ohana/src/opihi/pantasks/CheckController.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/CheckController.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/CheckController.c	(revision 4714)
@@ -7,8 +7,6 @@
   Job *job;
   IOBuffer buffer;
-  
 
   /* get the list of completed jobs (exit / crash), update the job status */
-
   if (!CheckControllerStatus()) return (TRUE);
 
@@ -21,20 +19,30 @@
   }
 
+  p = memstr (buffer.buffer, "USAGE: jobstack", buffer.Nbuffer);
+  if (p != NULL) {
+    FreeIOBuffer (&buffer);
+    return (FALSE);
+  }
+
   /** parse job list **/
-  sscanf (buffer.buffer, "%*s %s", &Njobs);
+  status = sscanf (buffer.buffer, "%*s %d", &Njobs);
+  if (status != 1) {
+    FreeIOBuffer (&buffer);
+    return (FALSE);
+  }
+
   p = buffer.buffer;
-  
   for (i = 0; i < Njobs; i++) {
     q = strchr (p, '\n');
     if (q == NULL) {
       fprintf (stderr, "controller message error: incomplete job list\n");
-      FreeIOBuffer (&buffer);
       break;
     }
-    p = q++;
-    sscanf (p, "%d", &JobID);
-    job = FindJob (JobID);
+    p = q + 1;
+    status = sscanf (p, "%d", &JobID);
+
+    job = FindControllerJob (JobID);
     if (job == NULL) {
-      fprintf (stderr, "misplaced job? %d not in job list\n");
+      fprintf (stderr, "misplaced job? %d not in EXIT job list\n", JobID);
       continue;
     }
@@ -42,7 +50,7 @@
     CheckControllerJob (job);
   }
-    
+ 
   /*** check CRASH jobs ***/
-  InitIOBuffer (&buffer, 0x100);
+  FlushIOBuffer (&buffer);
   status = ControllerCommand ("jobstack crash", CONTROLLER_PROMPT, &buffer);
   if (!status) {
@@ -50,21 +58,30 @@
     return (FALSE);
   }
+  p = memstr (buffer.buffer, "USAGE: jobstack", buffer.Nbuffer);
+  if (p != NULL) {
+    FreeIOBuffer (&buffer);
+    return (FALSE);
+  }
 
   /** parse job list **/
-  sscanf (buffer.buffer, "%*s %s", &Njobs);
+  status = sscanf (buffer.buffer, "%*s %d", &Njobs);
+  if (status != 1) {
+    FreeIOBuffer (&buffer);
+    return (FALSE);
+  }
+
   p = buffer.buffer;
-  
   for (i = 0; i < Njobs; i++) {
     q = strchr (p, '\n');
     if (q == NULL) {
       fprintf (stderr, "controller message error: incomplete job list\n");
-      FreeIOBuffer (&buffer);
       break;
     }
-    p = q++;
-    sscanf (p, "%d", &JobID);
-    job = FindJob (JobID);
+    p = q + 1;
+    
+    status = sscanf (p, "%d", &JobID);
+    job = FindControllerJob (JobID);
     if (job == NULL) {
-      fprintf (stderr, "misplaced job? %d not in job list\n");
+      fprintf (stderr, "misplaced job? %d not in CRASH job list\n", JobID);
       continue;
     }
@@ -72,4 +89,5 @@
     CheckControllerJob (job);
   }
+  FreeIOBuffer (&buffer);
   return (TRUE);
 }
Index: trunk/Ohana/src/opihi/pantasks/CheckSystem.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/CheckSystem.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/CheckSystem.c	(revision 4714)
@@ -8,9 +8,31 @@
      eventually
   */
+  struct timeval start, stop;
+  double dtime;
+  
+  gettimeofday (&start, (void *) NULL);
+  CheckTasks ();
+  gettimeofday (&stop, (void *) NULL);
+  dtime = DTIME (stop, start);
+  if (VerboseMode()) fprintf (stderr, "check 1: %f seconds\n", dtime);
 
-  CheckTasks ();
+  gettimeofday (&start, (void *) NULL);
   CheckJobs ();
+  gettimeofday (&stop, (void *) NULL);
+  dtime = DTIME (stop, start);
+  if (VerboseMode()) fprintf (stderr, "check 2: %f seconds\n", dtime);
+
+  gettimeofday (&start, (void *) NULL);
   CheckController ();
+  gettimeofday (&stop, (void *) NULL);
+  dtime = DTIME (stop, start);
+  if (VerboseMode()) fprintf (stderr, "check 3: %f seconds\n", dtime);
+
+  gettimeofday (&start, (void *) NULL);
   CheckControllerOutput ();
+  gettimeofday (&stop, (void *) NULL);
+  dtime = DTIME (stop, start);
+  if (VerboseMode()) fprintf (stderr, "check 4: %f seconds\n", dtime);
+
   return (TRUE);
 }
Index: trunk/Ohana/src/opihi/pantasks/ControllerOps.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/ControllerOps.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/ControllerOps.c	(revision 4714)
@@ -186,7 +186,4 @@
   job[0].pid = atoi (string);
   FreeIOBuffer (&buffer);
-
-  InitIOBuffer (&job[0].stdout, 0x100);
-  InitIOBuffer (&job[0].stderr, 0x100);
   return (TRUE);
 }
@@ -419,4 +416,6 @@
   InitIOBuffer (&buffer, 0x100);
   status = ControllerCommand (cmd, CONTROLLER_PROMPT, &buffer);
+  FreeIOBuffer (&buffer);
+
   ControllerStatus = FALSE;
   result = waitpid (ControllerPID, &waitstatus, WNOHANG);
@@ -429,5 +428,7 @@
   close (stdout_cntl);
   close (stderr_cntl);
-
-  return (TRUE);
-}
+  FreeIOBuffer (&stdout_buffer);
+  FreeIOBuffer (&stderr_buffer);
+
+  return (TRUE);
+}
Index: trunk/Ohana/src/opihi/pantasks/JobOps.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/JobOps.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/JobOps.c	(revision 4714)
@@ -39,4 +39,19 @@
   for (i = 0; i < Njobs; i++) {
     if (jobs[i][0].JobID == JobID) {
+      return (jobs[i]);
+    }
+  }
+  return (NULL);
+}  
+
+/* return job with given controller Job ID */
+Job *FindControllerJob (int JobID) {
+
+  int i;
+
+  /* return job with matching JobID */
+  for (i = 0; i < Njobs; i++) {
+    if (jobs[i][0].mode == JOB_LOCAL) continue;
+    if (jobs[i][0].pid  == JobID) {
       return (jobs[i]);
     }
@@ -96,4 +111,7 @@
      need to have matched entries to these quantites in the job structure */
 
+  InitIOBuffer (&job[0].stdout, 0x100);
+  InitIOBuffer (&job[0].stderr, 0x100);
+
   jobs[Njobs] = job;
   Njobs ++;
@@ -117,4 +135,8 @@
   }
   free (job[0].argv);
+
+  FreeIOBuffer (&job[0].stdout);
+  FreeIOBuffer (&job[0].stderr);
+  free (job);
   return;
 }
@@ -161,5 +183,5 @@
   gettimeofday (&job[0].start, (void *) NULL);
   job[0].last = job[0].start;
-  
+  job[0].state = JOB_PENDING;
   return (TRUE);
 }
Index: trunk/Ohana/src/opihi/pantasks/LocalJob.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/LocalJob.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/LocalJob.c	(revision 4714)
@@ -144,6 +144,4 @@
   job[0].pid = pid;
 
-  InitIOBuffer (&job[0].stdout, 0x100);
-  InitIOBuffer (&job[0].stderr, 0x100);
   return (TRUE);
 
Index: trunk/Ohana/src/opihi/pantasks/controller_host.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/controller_host.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/controller_host.c	(revision 4714)
@@ -20,4 +20,4 @@
   if (status) fwrite (buffer.buffer, 1, buffer.Nbuffer, stderr);
   FreeIOBuffer (&buffer);
-
+  return (TRUE);
 }
Index: trunk/Ohana/src/opihi/pantasks/init.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/init.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/init.c	(revision 4714)
@@ -53,4 +53,8 @@
   int i;
 
+  InitTasks ();
+  InitJobs ();
+  InitJobIDs ();
+
   for (i = 0; i < sizeof (cmds) / sizeof (Command); i++) {
     AddCommand (&cmds[i]);
Index: trunk/Ohana/src/opihi/pantasks/psched.c
===================================================================
--- trunk/Ohana/src/opihi/pantasks/psched.c	(revision 4706)
+++ trunk/Ohana/src/opihi/pantasks/psched.c	(revision 4714)
@@ -12,27 +12,8 @@
   auto_break = TRUE;
 
-  Nlists = 0;
-  ALLOCATE (lists, List, 1); 
-
-  /* init functions required by libraries */
-  /* -libopihi */
-  InitCommands ();
-  InitMacros ();
-  InitBuffers ();
-  InitVectors ();
-  InitVariables ();
-
-  /* -libdisplay */
-  InitGraph ();
-  InitImage ();
-
   /* load the commands used by this implementation */
   InitBasic ();
   InitData ();
-  InitOutfile ();
   InitPsched ();
-  InitTasks ();
-  InitJobs ();
-  InitJobIDs ();
 
   rl_readline_name = opihi_name;
