Index: uspace/app/ps/ps.c
===================================================================
--- uspace/app/ps/ps.c	(revision 8f56d9346cfed5541fc088d1e02ccfb2c9f15ddf)
+++ uspace/app/ps/ps.c	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
@@ -150,5 +150,5 @@
 	size_t i;
 	for (i = 0; i < cpu_count; ++i) {
-		printf("%2u (%4u Mhz): Busy ticks: %8llu, Idle ticks: %8llu\n", cpus[i].id,
+		printf("%2u (%4u Mhz): Busy ticks: %6llu, Idle ticks: %6llu\n", cpus[i].id,
 				(size_t)cpus[i].frequency_mhz, cpus[i].busy_ticks, cpus[i].idle_ticks);
 	}
Index: uspace/app/top/ps.c
===================================================================
--- uspace/app/top/ps.c	(revision 8f56d9346cfed5541fc088d1e02ccfb2c9f15ddf)
+++ uspace/app/top/ps.c	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
@@ -41,4 +41,5 @@
 #include <malloc.h>
 #include <ps.h>
+#include <sysinfo.h>
 #include "ps.h"
 
@@ -94,4 +95,14 @@
 }
 
+unsigned int get_cpu_infos(uspace_cpu_info_t **out_infos)
+{
+	unsigned int cpu_count = sysinfo_value("cpu.count");
+	uspace_cpu_info_t *cpus = malloc(cpu_count * sizeof(uspace_cpu_info_t));
+	get_cpu_info(cpus);
+
+	*out_infos = cpus;
+	return cpu_count;
+}
+
 /** @}
  */
Index: uspace/app/top/ps.h
===================================================================
--- uspace/app/top/ps.h	(revision 8f56d9346cfed5541fc088d1e02ccfb2c9f15ddf)
+++ uspace/app/top/ps.h	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
@@ -36,8 +36,10 @@
 #include <task.h>
 #include <kernel/ps/taskinfo.h>
+#include <kernel/ps/cpuinfo.h>
 
 extern const char *thread_states[];
 extern unsigned int get_tasks(task_id_t **out_tasks);
 extern thread_info_t *get_threads(task_id_t taskid);
+extern unsigned int get_cpu_infos(uspace_cpu_info_t **out_infos);
 
 #endif
Index: uspace/app/top/screen.c
===================================================================
--- uspace/app/top/screen.c	(revision 8f56d9346cfed5541fc088d1e02ccfb2c9f15ddf)
+++ uspace/app/top/screen.c	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
@@ -46,4 +46,5 @@
 int rows;
 int colls;
+int up_rows;
 
 #define WHITE 0xf0f0f0
@@ -59,4 +60,5 @@
 {
 	console_get_size(fphone(stdout), &colls, &rows);
+	up_rows = 0;
 	console_cursor_visibility(fphone(stdout), 0);
 	resume_normal();
@@ -68,4 +70,6 @@
 	console_clear(fphone(stdout));
 	moveto(0, 0);
+	up_rows = 0;
+	fflush(stdout);
 }
 
@@ -103,4 +107,16 @@
 }
 
+static inline void print_cpuinfo(data_t *data)
+{
+	unsigned int i;
+	uspace_cpu_info_t *cpus = data->cpus;
+	for (i = 0; i < data->cpu_count; ++i) {
+		printf("Cpu%u (%4u Mhz): Busy ticks: %6llu, Idle Ticks: %6llu\n",
+			i, (unsigned int)cpus[i].frequency_mhz, cpus[i].busy_ticks,
+			cpus[i].idle_ticks);
+		++up_rows;
+	}
+}
+
 static inline void print_tasks(data_t *data, int row)
 {
@@ -116,5 +132,4 @@
 	}
 }
-
 
 static inline void print_head(void)
@@ -139,6 +154,11 @@
 	print_load(data);
 	puts("\n");
+	++up_rows;
 	print_taskstat(data);
-	puts("\n\n");
+	puts("\n");
+	++up_rows;
+	print_cpuinfo(data);
+	puts("\n");
+	++up_rows;
 	print_head();
 	puts("\n");
Index: uspace/app/top/screen.h
===================================================================
--- uspace/app/top/screen.h	(revision 8f56d9346cfed5541fc088d1e02ccfb2c9f15ddf)
+++ uspace/app/top/screen.h	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
@@ -44,4 +44,12 @@
 extern void print_data(data_t *data);
 
+extern int up_rows;
+#define PRINT_WARNING(message, ...) \
+do { \
+	moveto(up_rows - 1, 0); \
+	printf(message, ##__VA_ARGS__); \
+	fflush(stdout); \
+} while (0)
+
 #endif
 
Index: uspace/app/top/top.c
===================================================================
--- uspace/app/top/top.c	(revision 8f56d9346cfed5541fc088d1e02ccfb2c9f15ddf)
+++ uspace/app/top/top.c	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
@@ -38,5 +38,4 @@
 #include <stdlib.h>
 #include <unistd.h>
-#include <io/console.h>
 #include <uptime.h>
 #include <task.h>
@@ -55,5 +54,5 @@
 #define MINUTE 60
 
-static void read_vars(data_t *target)
+static void read_data(data_t *target)
 {
 	/* Read current time */
@@ -80,20 +79,37 @@
 	/* Read task ids */
 	target->task_count = get_tasks(&target->tasks);
+
+	/* Read cpu infos */
+	target->cpu_count = get_cpu_infos(&target->cpus);
 }
+
+static void free_data(data_t *target)
+{
+	free(target->tasks);
+}
+
+static inline void swap(data_t *first, data_t *second)
+{
+	data_t *temp;
+	temp = first;
+	first = second;
+	second = temp;
+}
+
+static data_t data[2];
 
 int main(int argc, char *argv[])
 {
-	data_t old_data;
-	data_t new_data;
+	data_t *data1 = &data[0];
+	data_t *data2 = &data[1];
 
 	/* Read initial stats */
 	printf("Reading initial data...\n");
-	read_vars(&old_data);
+	read_data(data1);
 	sleep(UPDATE_INTERVAL);
-	read_vars(&new_data);
-	print_data(&new_data);
-	fflush(stdout);
+	read_data(data2);
 
 	screen_init();
+	print_data(data2);
 
 	/* And paint screen until death... */
@@ -101,15 +117,16 @@
 		char c = tgetchar(UPDATE_INTERVAL);
 		if (c < 0) {
-			read_vars(&new_data);
-			print_data(&new_data);
+			free_data(data1);
+			swap(data1, data2);
+			read_data(data2);
+			print_data(data2);
 			continue;
 		}
 		switch (c) {
 			case 'q':
+				clear_screen();
 				return 0;
 			default:
-				moveto(10,10);
-				printf("Unknown command: %c", c);
-				fflush(stdout);
+				PRINT_WARNING("Unknown command: %c", c);
 				break;
 		}
@@ -117,7 +134,6 @@
 	}
 
-	free(new_data.tasks);
-	puts("\n\n");
-	fflush(stdout);
+	free_data(data1);
+	free_data(data2);
 	return 0;
 }
Index: uspace/app/top/top.h
===================================================================
--- uspace/app/top/top.h	(revision 8f56d9346cfed5541fc088d1e02ccfb2c9f15ddf)
+++ uspace/app/top/top.h	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
@@ -35,4 +35,5 @@
 
 #include <task.h>
+#include <kernel/ps/cpuinfo.h>
 
 typedef struct {
@@ -50,4 +51,7 @@
 	task_id_t *tasks;
 	unsigned int task_count;
+
+	uspace_cpu_info_t *cpus;
+	unsigned int cpu_count;
 } data_t;
 
