diff -u htop-0.9.orig/CPUMeter.c htop-0.9.patched/CPUMeter.c
--- htop-0.9.orig/CPUMeter.c	2010-11-23 16:56:32.000000000 +0100
+++ htop-0.9.patched/CPUMeter.c	2011-10-22 13:08:57.498282350 +0200
@@ -33,7 +33,7 @@
    int cpu = this->param;
    if (this->pl->cpuCount > 1) {
       char caption[10];
-      sprintf(caption, "%-3d", cpu);
+      sprintf(caption, "%-3d", cpu-1);
       Meter_setCaption(this, caption);
    }
    if (this->param == 0)
@@ -122,20 +122,49 @@
    }
 }
 
+static void AllCPUsMeter_getRange(Meter* this, int* start, int* incr, int* count) {
+   int cpus = this->pl->cpuCount;
+   switch(this->type->name[0]) {
+      default:
+      case 'A': // All
+         *start = 0;
+         *incr = (cpus+1)/2;
+         *count = cpus;
+         break;
+      case 'E': // Even
+         *start = 0;
+         *incr = (cpus+3)/4;
+         *count = (cpus+1) / 2;
+         break;
+      case 'O': // Odd
+         *start = (cpus+1) / 2;
+         *incr = (cpus+3)/4;
+         *count = (cpus+1) / 2;
+         break;
+   }
+}
+
 static void AllCPUsMeter_init(Meter* this) {
    int cpus = this->pl->cpuCount;
    this->drawBuffer = malloc(sizeof(Meter*) * cpus);
    Meter** meters = (Meter**) this->drawBuffer;
-   for (int i = 0; i < cpus; i++)
-      meters[i] = Meter_new(this->pl, i+1, &CPUMeter);
-   this->h = cpus;
+   int start, incr, count;
+   AllCPUsMeter_getRange(this, &start, &incr, &count);
+   for (int i = start, j = 0; j < count; i += 1, j += 2) {
+      meters[j] = Meter_new(this->pl, i+1, &CPUMeter);
+      if (i+incr < cpus)
+         meters[j+1] = Meter_new(this->pl, i+incr+1, &CPUMeter);
+   }
+   this->h = (count+1) / 2;
    this->mode = BAR_METERMODE;
 }
 
 static void AllCPUsMeter_done(Meter* this) {
    int cpus = this->pl->cpuCount;
    Meter** meters = (Meter**) this->drawBuffer;
-   for (int i = 0; i < cpus; i++)
+   int start, incr, count;
+   AllCPUsMeter_getRange(this, &start, &incr, &count);
+   for (int i = 0; i < count; i++)
       Meter_delete((Object*)meters[i]);
 }
 
@@ -149,9 +178,15 @@
 static void AllCPUsMeter_draw(Meter* this, int x, int y, int w) {
    int cpus = this->pl->cpuCount;
    Meter** meters = (Meter**) this->drawBuffer;
-   for (int i = 0; i < cpus; i++) {
+   int start, incr, count;
+   AllCPUsMeter_getRange(this, &start, &incr, &count);
+   for (int i = 0; i < count; i+=2) {
       Meter_setMode(meters[i], this->mode);
-      meters[i]->draw(meters[i], x, y, w);
+      meters[i]->draw(meters[i], x, y, (w-4)/2);
+      if (i+1 < count) {
+         Meter_setMode(meters[i+1], this->mode);
+         meters[i+1]->draw(meters[i+1], x+w/2+2, y, (w-4)/2);
+      }
       y += meters[i]->h;
    }
 }
@@ -182,3 +217,31 @@
    .setMode = AllCPUsMeter_setMode,
    .done = AllCPUsMeter_done
 };
+
+MeterType EvenCPUsMeter = {
+   .mode = 0,
+   .items = 1,
+   .total = 100.0,
+   .attributes = CPUMeter_attributes, 
+   .name = "EvenCPUs",
+   .uiName = "Even CPUs",
+   .caption = "CPU",
+   .draw = AllCPUsMeter_draw,
+   .init = AllCPUsMeter_init,
+   .setMode = AllCPUsMeter_setMode,
+   .done = AllCPUsMeter_done
+};
+
+MeterType OddCPUsMeter = {
+   .mode = 0,
+   .items = 1,
+   .total = 100.0,
+   .attributes = CPUMeter_attributes, 
+   .name = "OddCPUs",
+   .uiName = "Odd CPUs",
+   .caption = "CPU",
+   .draw = AllCPUsMeter_draw,
+   .init = AllCPUsMeter_init,
+   .setMode = AllCPUsMeter_setMode,
+   .done = AllCPUsMeter_done
+};
diff -u htop-0.9.orig/CPUMeter.h htop-0.9.patched/CPUMeter.h
--- htop-0.9.orig/CPUMeter.h	2010-11-23 16:57:06.000000000 +0100
+++ htop-0.9.patched/CPUMeter.h	2011-10-22 13:08:58.387330719 +0200
@@ -34,4 +34,8 @@
 
 extern MeterType AllCPUsMeter;
 
+extern MeterType EvenCPUsMeter;
+
+extern MeterType OddCPUsMeter;
+
 #endif
diff -u htop-0.9.orig/Header.c htop-0.9.patched/Header.c
--- htop-0.9.orig/Header.c	2010-02-25 02:56:32.000000000 +0100
+++ htop-0.9.patched/Header.c	2011-10-22 11:19:42.638282599 +0200
@@ -124,9 +124,11 @@
 }
 
 void Header_defaultMeters(Header* this) {
-   Vector_add(this->leftMeters, Meter_new(this->pl, 0, &AllCPUsMeter));
+   Vector_add(this->leftMeters, Meter_new(this->pl, 0, &EvenCPUsMeter));
+   Vector_add(this->leftMeters, Meter_new(this->pl, 0, &CPUMeter));
    Vector_add(this->leftMeters, Meter_new(this->pl, 0, &MemoryMeter));
    Vector_add(this->leftMeters, Meter_new(this->pl, 0, &SwapMeter));
+   Vector_add(this->rightMeters, Meter_new(this->pl, 0, &OddCPUsMeter));
    Vector_add(this->rightMeters, Meter_new(this->pl, 0, &TasksMeter));
    Vector_add(this->rightMeters, Meter_new(this->pl, 0, &LoadAverageMeter));
    Vector_add(this->rightMeters, Meter_new(this->pl, 0, &UptimeMeter));
diff -u htop-0.9.orig/Meter.c htop-0.9.patched/Meter.c
--- htop-0.9.orig/Meter.c	2010-11-23 16:56:32.000000000 +0100
+++ htop-0.9.patched/Meter.c	2011-10-22 11:05:56.948242504 +0200
@@ -124,6 +124,8 @@
    &UptimeMeter,
    &BatteryMeter,
    &AllCPUsMeter,
+   &EvenCPUsMeter,
+   &OddCPUsMeter,
    &HostnameMeter,
    NULL
 };
