Index: uspace/app/top/ps.c
===================================================================
--- uspace/app/top/ps.c	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
+++ uspace/app/top/ps.c	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
@@ -70,4 +70,5 @@
 	}
 
+/*
 	int i;
 	for (i = 0; i < result; ++i) {
@@ -75,4 +76,5 @@
 		get_task_info(tasks[i], &taskinfo);
 	}
+	*/
 
 	*out_tasks = tasks;
Index: uspace/app/top/screen.c
===================================================================
--- uspace/app/top/screen.c	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
+++ uspace/app/top/screen.c	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
@@ -50,4 +50,15 @@
 #define WHITE 0xf0f0f0
 #define BLACK 0x000000
+
+static void print_float(float f, int precision)
+{
+	printf("%u.", (unsigned int) f);
+	int i;
+	float rest = (f - (int)f) * 10;
+	for (i = 0; i < precision; ++i) {
+		printf("%d", (unsigned int)rest);
+		rest = (rest - (int)rest) * 10;
+	}
+}
 
 static void resume_normal(void)
@@ -112,7 +123,12 @@
 	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",
+		printf("Cpu%u (%4u Mhz): Busy ticks: %6llu, Idle Ticks: %6llu",
 			i, (unsigned int)cpus[i].frequency_mhz, cpus[i].busy_ticks,
 			cpus[i].idle_ticks);
+		printf(", idle: ");
+		print_float(data->cpu_perc[i].idle, 2);
+		puts("%, busy: ");
+		print_float(data->cpu_perc[i].busy, 2);
+		puts("%\n");
 		++up_rows;
 	}
@@ -163,5 +179,5 @@
 	print_head();
 	puts("\n");
-	print_tasks(data, 4);
+	print_tasks(data, up_rows);
 	fflush(stdout);
 }
Index: uspace/app/top/top.c
===================================================================
--- uspace/app/top/top.c	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
+++ uspace/app/top/top.c	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
@@ -54,4 +54,6 @@
 #define MINUTE 60
 
+int number = 0;
+int number2 = 0;
 static void read_data(data_t *target)
 {
@@ -84,15 +86,38 @@
 }
 
+/** Computes percentage differencies from old_data to new_data
+ *
+ * @param old_data	Pointer to old data strucutre.
+ * @param new_data	Pointer to actual data where percetages are stored.
+ *
+ */
+static void compute_percentages(data_t *old_data, data_t *new_data)
+{
+	/* Foreach cpu, compute total ticks and divide it between user and
+	 * system */
+	unsigned int i;
+	new_data->cpu_perc = malloc(new_data->cpu_count * sizeof(cpu_perc_t));
+	for (i = 0; i < new_data->cpu_count; ++i) {
+		uint64_t idle = new_data->cpus[i].idle_ticks - old_data->cpus[i].idle_ticks;
+		uint64_t busy = new_data->cpus[i].busy_ticks - old_data->cpus[i].busy_ticks;
+		uint64_t sum = idle + busy;
+		new_data->cpu_perc[i].idle = ((float)(idle * 100) / sum);
+		new_data->cpu_perc[i].busy = ((float)(busy * 100) / sum);
+	}
+}
+
 static void free_data(data_t *target)
 {
 	free(target->tasks);
+	free(target->cpus);
+	free(target->cpu_perc);
 }
 
-static inline void swap(data_t *first, data_t *second)
+static inline void swap(data_t **first, data_t **second)
 {
 	data_t *temp;
-	temp = first;
-	first = second;
-	second = temp;
+	temp = *first;
+	*first = *second;
+	*second = temp;
 }
 
@@ -103,13 +128,11 @@
 	data_t *data1 = &data[0];
 	data_t *data2 = &data[1];
+	screen_init();
 
 	/* Read initial stats */
 	printf("Reading initial data...\n");
 	read_data(data1);
-	sleep(UPDATE_INTERVAL);
-	read_data(data2);
-
-	screen_init();
-	print_data(data2);
+	/* Compute some rubbish to have initialised values */
+	compute_percentages(data1, data1);
 
 	/* And paint screen until death... */
@@ -117,8 +140,9 @@
 		char c = tgetchar(UPDATE_INTERVAL);
 		if (c < 0) {
+			read_data(data2);
+			compute_percentages(data1, data2);
 			free_data(data1);
-			swap(data1, data2);
-			read_data(data2);
 			print_data(data2);
+			swap(&data1, &data2);
 			continue;
 		}
Index: uspace/app/top/top.h
===================================================================
--- uspace/app/top/top.h	(revision 8b2aba5de6bd93e79e9074feaa8fd2e761c9b3da)
+++ uspace/app/top/top.h	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
@@ -38,4 +38,15 @@
 
 typedef struct {
+	float idle;
+	float busy;
+} cpu_perc_t;
+
+typedef struct {
+	float user;
+	float system;
+	float memory;
+} task_perc_t;
+
+typedef struct {
 	unsigned int hours;
 	unsigned int minutes;
@@ -49,9 +60,10 @@
 	unsigned long load[3];
 
+	unsigned int task_count;
 	task_id_t *tasks;
-	unsigned int task_count;
 
+	unsigned int cpu_count;
 	uspace_cpu_info_t *cpus;
-	unsigned int cpu_count;
+	cpu_perc_t *cpu_perc;
 } data_t;
 
