Index: uspace/app/top/ps.c
===================================================================
--- uspace/app/top/ps.c	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
+++ uspace/app/top/ps.c	(revision 452268a1843ac7dedb25aff1794cbfef9a944515)
@@ -58,5 +58,5 @@
 }; 
 
-unsigned int get_tasks(task_id_t **out_tasks)
+unsigned int get_tasks(task_info_t **out_infos)
 {
 	int task_count = TASK_COUNT;
@@ -70,13 +70,11 @@
 	}
 
-/*
 	int i;
+	task_info_t *taskinfos = malloc(result * sizeof(task_info_t));
 	for (i = 0; i < result; ++i) {
-		task_info_t taskinfo;
-		get_task_info(tasks[i], &taskinfo);
+		get_task_info(tasks[i], &taskinfos[i]);
 	}
-	*/
 
-	*out_tasks = tasks;
+	*out_infos = taskinfos;
 	return result;
 }
Index: uspace/app/top/ps.h
===================================================================
--- uspace/app/top/ps.h	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
+++ uspace/app/top/ps.h	(revision 452268a1843ac7dedb25aff1794cbfef9a944515)
@@ -39,5 +39,5 @@
 
 extern const char *thread_states[];
-extern unsigned int get_tasks(task_id_t **out_tasks);
+extern unsigned int get_tasks(task_info_t **out_infos);
 extern thread_info_t *get_threads(task_id_t taskid);
 extern unsigned int get_cpu_infos(uspace_cpu_info_t **out_infos);
Index: uspace/app/top/screen.c
===================================================================
--- uspace/app/top/screen.c	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
+++ uspace/app/top/screen.c	(revision 452268a1843ac7dedb25aff1794cbfef9a944515)
@@ -53,5 +53,5 @@
 static void print_float(float f, int precision)
 {
-	printf("%u.", (unsigned int) f);
+	printf("%2u.", (unsigned int) f);
 	int i;
 	float rest = (f - (int)f) * 10;
@@ -141,9 +141,16 @@
 		if (row + i > rows)
 			return;
-		task_info_t taskinfo;
-		get_task_info(data->tasks[i], &taskinfo);
-		printf("%8llu %8u %8u %12llu %12llu %s\n", taskinfo.taskid,
-			taskinfo.thread_count, taskinfo.pages, taskinfo.ucycles / 1000 / 1000,
-			taskinfo.kcycles / 1000 / 1000, taskinfo.name);
+		task_info_t *taskinfo = &data->taskinfos[i];
+		printf("%8llu %8u %8u ", taskinfo->taskid,
+			taskinfo->thread_count, taskinfo->pages);
+		task_perc_t *taskperc = &data->task_perc[i];
+		puts("   ");
+		print_float(taskperc->pages, 2);
+		puts("%   ");
+		print_float(taskperc->ucycles, 2);
+		puts("%   ");
+		print_float(taskperc->kcycles, 2);
+		puts("% ");
+		printf("%s\n", taskinfo->name);
 	}
 }
@@ -153,5 +160,5 @@
 	fflush(stdout);
 	console_set_rgb_color(fphone(stdout), WHITE, BLACK);
-	printf("      ID  Threads    Pages      uCycles      kCycles Name");
+	printf("      ID  Threads    Pages    %%Pages %%uCycles %%kCycles Name");
 	int i;
 	for (i = 60; i < colls; ++i)
Index: uspace/app/top/top.c
===================================================================
--- uspace/app/top/top.c	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
+++ uspace/app/top/top.c	(revision 452268a1843ac7dedb25aff1794cbfef9a944515)
@@ -80,5 +80,5 @@
 
 	/* Read task ids */
-	target->task_count = get_tasks(&target->tasks);
+	target->task_count = get_tasks(&target->taskinfos);
 
 	/* Read cpu infos */
@@ -102,14 +102,53 @@
 		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);
-	}
+		new_data->cpu_perc[i].idle = (float)(idle * 100) / sum;
+		new_data->cpu_perc[i].busy = (float)(busy * 100) / sum;
+	}
+
+	/* For all tasks compute sum and differencies of all cycles */
+	uint64_t pages_total = 0;
+	uint64_t ucycles_total = 0;
+	uint64_t kcycles_total = 0;
+	uint64_t *ucycles_diff = malloc(new_data->task_count * sizeof(uint64_t));
+	uint64_t *kcycles_diff = malloc(new_data->task_count * sizeof(uint64_t));
+	unsigned int j = 0;
+	for (i = 0; i < new_data->task_count; ++i) {
+		/* Jump over all death tasks */
+		while (old_data->taskinfos[j].taskid < new_data->taskinfos[i].taskid)
+			++j;
+		if (old_data->taskinfos[j].taskid > new_data->taskinfos[i].taskid) {
+			/* This is newly borned task, ignore it */
+			ucycles_diff[i] = 0;
+			kcycles_diff[i] = 0;
+			continue;
+		}
+		/* Now we now we have task with same id */
+		ucycles_diff[i] = new_data->taskinfos[i].ucycles - old_data->taskinfos[j].ucycles;
+		kcycles_diff[i] = new_data->taskinfos[i].kcycles - old_data->taskinfos[j].kcycles;
+
+		pages_total += new_data->taskinfos[i].pages;
+		ucycles_total += ucycles_diff[i];
+		kcycles_total += kcycles_diff[i];
+	}
+
+	/* And now compute percental change */
+	new_data->task_perc = malloc(new_data->task_count * sizeof(task_perc_t));
+	for (i = 0; i < new_data->task_count; ++i) {
+		new_data->task_perc[i].pages = (float)(new_data->taskinfos[i].pages * 100) / pages_total;
+		new_data->task_perc[i].ucycles = (float)(ucycles_diff[i] * 100) / ucycles_total;
+		new_data->task_perc[i].kcycles = (float)(kcycles_diff[i] * 100) / kcycles_total;
+	}
+
+	/* And free temporary structures */
+	free(ucycles_diff);
+	free(kcycles_diff);
 }
 
 static void free_data(data_t *target)
 {
-	free(target->tasks);
+	free(target->taskinfos);
 	free(target->cpus);
 	free(target->cpu_perc);
+	free(target->task_perc);
 }
 
Index: uspace/app/top/top.h
===================================================================
--- uspace/app/top/top.h	(revision ee35ba0b80f7497ba6d7810f782ca99e8e9365a6)
+++ uspace/app/top/top.h	(revision 452268a1843ac7dedb25aff1794cbfef9a944515)
@@ -36,4 +36,5 @@
 #include <task.h>
 #include <kernel/ps/cpuinfo.h>
+#include <kernel/ps/taskinfo.h>
 
 typedef struct {
@@ -43,7 +44,7 @@
 
 typedef struct {
-	float user;
-	float system;
-	float memory;
+	float ucycles;
+	float kcycles;
+	float pages;
 } task_perc_t;
 
@@ -61,5 +62,6 @@
 
 	unsigned int task_count;
-	task_id_t *tasks;
+	task_info_t *taskinfos;
+	task_perc_t *task_perc;
 
 	unsigned int cpu_count;
