diff -up procps-3.2.7/top.c.p15 procps-3.2.7/top.c
--- procps-3.2.7/top.c.p15	2008-09-01 11:37:51.000000000 +0200
+++ procps-3.2.7/top.c	2008-09-01 11:37:51.000000000 +0200
@@ -121,6 +121,7 @@ static int No_ksyms = -1,       // set t
            Secure_mode = 0;     // set if some functionality restricted
 
 static int VIRT_vmsize = 0;	//use vm_size for VIRT 
+static int CPU_loop = 0;	// wait for reliable CPU data
 
         /* Some cap's stuff to reduce runtime calls --
            to accomodate 'Batch' mode, they begin life as empty strings */
@@ -1679,6 +1680,8 @@ static void before (char *me)
    
    if (( getenv("STATSIZE")) && ( atoi(getenv("STATSIZE")) == 1 )) 
 	   VIRT_vmsize = 1;
+   if (( getenv("CPULOOP")) && ( atoi(getenv("CPULOOP")) == 1 )) 
+	   CPU_loop = 1;
 }
 
 
@@ -2978,6 +2981,7 @@ static proc_t **summary_show (void)
 {
    static proc_t **p_table = NULL;
    static CPU_t  *smpcpu = NULL;
+   static int first = 0;
 
    // whoa first time, gotta' prime the pump...
    if (!p_table) {
@@ -3025,6 +3029,28 @@ static proc_t **summary_show (void)
 
       smpcpu = cpus_refresh(smpcpu);
 
+      if (first==0 && CPU_loop)
+      {
+	 int i;
+	 CPU_t *cpu;
+	 for (i = 0; i < Cpu_tot; i++) {
+           cpu =  &smpcpu[i];
+	   cpu->u_sav = cpu->u;
+	   cpu->s_sav = cpu->s;
+	   cpu->n_sav = cpu->n;
+	   cpu->i_sav = cpu->i;
+	   cpu->w_sav = cpu->w;
+	   cpu->x_sav = cpu->x;
+	   cpu->y_sav = cpu->y;
+	   cpu->z_sav = cpu->z;
+	 }
+         tv.tv_sec = Rc.delay_time;
+         tv.tv_usec = (Rc.delay_time - (int)Rc.delay_time) * 1000000;
+         select(0, NULL, NULL, NULL, &tv);
+
+	 smpcpu = cpus_refresh(smpcpu);
+      }
+
       if (CHKw(Curwin, View_CPUSUM)) {
          // display just the 1st /proc/stat line
          summaryhlp(&smpcpu[Cpu_tot], "Cpu(s):");
@@ -3050,6 +3076,8 @@ static proc_t **summary_show (void)
    }
 
    SETw(Curwin, NEWFRAM_cwo);
+
+   first = 1;
    return p_table;
 }
 
diff -up procps-3.2.7/top.1.p15 procps-3.2.7/top.1
--- procps-3.2.7/top.1.p15	2008-09-01 11:37:51.000000000 +0200
+++ procps-3.2.7/top.1	2008-09-01 11:37:51.000000000 +0200
@@ -1183,6 +1183,13 @@ Then ponder this:
 Send bug reports to:
    Albert D\. Cahalan, <albert@users.sf.net>
 
+The top command calculates Cpu(s) by looking at the change in CPU time values
+between samples. When you first run it, it has no previous sample to compare
+to, so these initial values are the percentages since boot. It means you need
+at least two loops or you have to ignore summary output from the first loop.
+This is problem for example for batch mode. There is a possible workaround if
+you define the CPULOOP=1 environment variable. The top command will be run one
+extra hidden loop for CPU data before standard output.
 
 .\" ----------------------------------------------------------------------
 .SH 8. HISTORY Former top
