Index: uspace/app/top/screen.c
===================================================================
--- uspace/app/top/screen.c	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ uspace/app/top/screen.c	(revision be069144135afaab9e7c8cee79ffd3504762612c)
@@ -126,7 +126,7 @@
 }
 
-static void print_float(fixed_float ffloat, unsigned int precision)
-{
-	printf("%2" PRIu64 ".", ffloat.upper / ffloat.lower);
+static void print_percent(fixed_float ffloat, unsigned int precision)
+{
+	printf("%3" PRIu64 ".", ffloat.upper / ffloat.lower);
 	
 	unsigned int i;
@@ -136,4 +136,20 @@
 		rest = (rest % ffloat.lower) * 10;
 	}
+	
+	printf("%%");
+}
+
+static void print_string(const char *str)
+{
+	ipcarg_t cols;
+	ipcarg_t rows;
+	screen_get_size(&cols, &rows);
+	
+	ipcarg_t c;
+	ipcarg_t r;
+	screen_get_pos(&c, &r);
+	
+	if (c < cols)
+		printf("%.*s", cols - c - 1, str);
 }
 
@@ -211,8 +227,7 @@
 			    data->cpus[i].busy_ticks, data->cpus[i].idle_ticks);
 			puts(", idle: ");
-			print_float(data->cpus_perc[i].idle, 2);
-			puts("%, busy: ");
-			print_float(data->cpus_perc[i].busy, 2);
-			puts("%");
+			print_percent(data->cpus_perc[i].idle, 2);
+			puts(", busy: ");
+			print_percent(data->cpus_perc[i].busy, 2);
 		} else
 			printf("cpu%u inactive", data->cpus[i].id);
@@ -247,5 +262,6 @@
 {
 	screen_style_inverted();
-	printf("      ID  Threads      Mem      %%Mem %%uCycles %%kCycles  Name");
+	printf("[taskid] [threads] [virtual] [%%virt] [%%user]"
+	    " [%%kernel] [name");
 	screen_newline();
 	screen_style_normal();
@@ -268,13 +284,13 @@
 		order_suffix(data->tasks[i].virtmem, &virtmem, &virtmem_suffix);
 		
-		printf("%8" PRIu64 " %8u %8" PRIu64 "%c ", data->tasks[i].task_id,
+		printf("%-8" PRIu64 " %9u %8" PRIu64 "%c ", data->tasks[i].task_id,
 		    data->tasks[i].threads, virtmem, virtmem_suffix);
+		print_percent(data->tasks_perc[i].virtmem, 2);
+		puts(" ");
+		print_percent(data->tasks_perc[i].ucycles, 2);
 		puts("   ");
-		print_float(data->tasks_perc[i].virtmem, 2);
-		puts("%   ");
-		print_float(data->tasks_perc[i].ucycles, 2);
-		puts("%   ");
-		print_float(data->tasks_perc[i].kcycles, 2);
-		printf("%% %s", data->tasks[i].name);
+		print_percent(data->tasks_perc[i].kcycles, 2);
+		puts(" ");
+		print_string(data->tasks[i].name);
 		
 		screen_newline();
@@ -290,5 +306,6 @@
 {
 	screen_style_inverted();
-	printf("      ID Calls sent Calls recv Answs sent Answs recv  IRQn recv       Forw Name");
+	printf("[taskid] [cls snt] [cls rcv] [ans snt]"
+	    " [ans rcv] [irq rcv] [forward] [name");
 	screen_newline();
 	screen_style_normal();
@@ -307,12 +324,41 @@
 	size_t i;
 	for (i = 0; (i < data->tasks_count) && (row < rows); i++, row++) {
-		printf("%8" PRIu64 " %10" PRIu64 " %10" PRIu64 " %10" PRIu64
-		     " %10" PRIu64 " %10" PRIu64 " %10" PRIu64 " %s",
-		     data->tasks[i].task_id, data->tasks[i].ipc_info.call_sent,
-		     data->tasks[i].ipc_info.call_recieved,
-		     data->tasks[i].ipc_info.answer_sent,
-		     data->tasks[i].ipc_info.answer_recieved,
-		     data->tasks[i].ipc_info.irq_notif_recieved,
-		     data->tasks[i].ipc_info.forwarded, data->tasks[i].name);
+		uint64_t call_sent;
+		uint64_t call_received;
+		uint64_t answer_sent;
+		uint64_t answer_received;
+		uint64_t irq_notif_received;
+		uint64_t forwarded;
+		
+		char call_sent_suffix;
+		char call_received_suffix;
+		char answer_sent_suffix;
+		char answer_received_suffix;
+		char irq_notif_received_suffix;
+		char forwarded_suffix;
+		
+		order_suffix(data->tasks[i].ipc_info.call_sent, &call_sent,
+		    &call_sent_suffix);
+		order_suffix(data->tasks[i].ipc_info.call_received,
+		    &call_received, &call_received_suffix);
+		order_suffix(data->tasks[i].ipc_info.answer_sent,
+		    &answer_sent, &answer_sent_suffix);
+		order_suffix(data->tasks[i].ipc_info.answer_received,
+		    &answer_received, &answer_received_suffix);
+		order_suffix(data->tasks[i].ipc_info.irq_notif_received,
+		    &irq_notif_received, &irq_notif_received_suffix);
+		order_suffix(data->tasks[i].ipc_info.forwarded, &forwarded,
+		    &forwarded_suffix);
+		
+		printf("%-8" PRIu64 " %8" PRIu64 "%c %8" PRIu64 "%c"
+		     " %8" PRIu64 "%c %8" PRIu64 "%c %8" PRIu64 "%c"
+		     " %8" PRIu64 "%c ", data->tasks[i].task_id,
+		     call_sent, call_sent_suffix,
+		     call_received, call_received_suffix,
+		     answer_sent, answer_sent_suffix,
+		     answer_received, answer_received_suffix,
+		     irq_notif_received, irq_notif_received_suffix,
+		     forwarded, forwarded_suffix);
+		print_string(data->tasks[i].name);
 		
 		screen_newline();
@@ -328,5 +374,5 @@
 {
 	screen_style_inverted();
-	printf("  ID                     Desc    Count   Cycles");
+	printf("[exc   ] [count   ] [%%count] [cycles  ] [%%cycles] [description");
 	screen_newline();
 	screen_style_normal();
@@ -345,11 +391,20 @@
 	size_t i;
 	for (i = 0; (i < data->exceptions_count) && (row < rows); i++, row++) {
+		uint64_t count;
 		uint64_t cycles;
-		char suffix;
-		
-		order_suffix(data->exceptions[i].cycles, &cycles, &suffix);
-		printf("%8u %20s %8" PRIu64 " %8" PRIu64 "%c",
-		     data->exceptions[i].id, data->exceptions[i].desc,
-		     data->exceptions[i].count, cycles, suffix);
+		
+		char count_suffix;
+		char cycles_suffix;
+		
+		order_suffix(data->exceptions[i].count, &count, &count_suffix);
+		order_suffix(data->exceptions[i].cycles, &cycles, &cycles_suffix);
+		
+		printf("%-8u %9" PRIu64 "%c  ",
+		     data->exceptions[i].id, count, count_suffix);
+		print_percent(data->exceptions_perc[i].count, 2);
+		printf(" %9" PRIu64 "%c   ", cycles, cycles_suffix);
+		print_percent(data->exceptions_perc[i].cycles, 2);
+		puts(" ");
+		print_string(data->exceptions[i].desc);
 		
 		screen_newline();
Index: uspace/app/top/top.c
===================================================================
--- uspace/app/top/top.c	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ uspace/app/top/top.c	(revision be069144135afaab9e7c8cee79ffd3504762612c)
@@ -67,4 +67,6 @@
 	target->tasks_perc = NULL;
 	target->threads = NULL;
+	target->exceptions = NULL;
+	target->exceptions_perc = NULL;
 	target->physmem = NULL;
 	
@@ -115,7 +117,13 @@
 		return "Cannot get threads";
 	
+	/* Get Exceptions */
 	target->exceptions = stats_get_exceptions(&(target->exceptions_count));
 	if (target->exceptions == NULL)
 		return "Cannot get exceptions";
+	
+	target->exceptions_perc =
+	    (perc_exc_t *) calloc(target->exceptions_count, sizeof(perc_exc_t));
+	if (target->exceptions_perc == NULL)
+		return "Not enough memory for exception utilization";
 	
 	/* Get physical memory */
@@ -137,12 +145,31 @@
 	/* Allocate memory */
 	
-	uint64_t *ucycles_diff = calloc(new_data->tasks_count, sizeof(uint64_t));
+	uint64_t *ucycles_diff = calloc(new_data->tasks_count,
+	    sizeof(uint64_t));
 	if (ucycles_diff == NULL)
 		return "Not enough memory for user utilization";
 	
-	uint64_t *kcycles_diff = calloc(new_data->tasks_count, sizeof(uint64_t));
+	uint64_t *kcycles_diff = calloc(new_data->tasks_count,
+	    sizeof(uint64_t));
 	if (kcycles_diff == NULL) {
 		free(ucycles_diff);
 		return "Not enough memory for kernel utilization";
+	}
+	
+	uint64_t *ecycles_diff = calloc(new_data->exceptions_count,
+	    sizeof(uint64_t));
+	if (ecycles_diff == NULL) {
+		free(ucycles_diff);
+		free(kcycles_diff);
+		return "Not enough memory for exception cycles utilization";
+	}
+	
+	uint64_t *ecount_diff = calloc(new_data->exceptions_count,
+	    sizeof(uint64_t));
+	if (ecount_diff == NULL) {
+		free(ucycles_diff);
+		free(kcycles_diff);
+		free(ecycles_diff);
+		return "Not enough memory for exception count utilization";
 	}
 	
@@ -164,7 +191,7 @@
 	/* For all tasks compute sum and differencies of all cycles */
 	
-	uint64_t virtmem_total = 1;  /* Must NOT be zero */
-	uint64_t ucycles_total = 1;  /* Must NOT be zero */
-	uint64_t kcycles_total = 1;  /* Must NOT be zero */
+	uint64_t virtmem_total = 0;
+	uint64_t ucycles_total = 0;
+	uint64_t kcycles_total = 0;
 	
 	for (i = 0; i < new_data->tasks_count; i++) {
@@ -197,5 +224,5 @@
 	}
 	
-	/* For each task: Compute percential change */
+	/* For each task compute percential change */
 	
 	for (i = 0; i < new_data->tasks_count; i++) {
@@ -208,8 +235,56 @@
 	}
 	
+	/* For all exceptions compute sum and differencies of cycles */
+	
+	uint64_t ecycles_total = 0;
+	uint64_t ecount_total = 0;
+	
+	for (i = 0; i < new_data->exceptions_count; i++) {
+		/*
+		 * March exception with the previous instance.
+		 * This is quite paranoid since exceptions do not
+		 * usually disappear, but it does not hurt.
+		 */
+		
+		bool found = false;
+		size_t j;
+		for (j = 0; j < old_data->exceptions_count; j++) {
+			if (new_data->exceptions[i].id == old_data->exceptions[j].id) {
+				found = true;
+				break;
+			}
+		}
+		
+		if (!found) {
+			/* This is a new exception, ignore it */
+			ecycles_diff[i] = 0;
+			ecount_diff[i] = 0;
+			continue;
+		}
+		
+		ecycles_diff[i] =
+		    new_data->exceptions[i].cycles - old_data->exceptions[j].cycles;
+		ecount_diff[i] =
+		    new_data->exceptions[i].count - old_data->exceptions[i].count;
+		
+		ecycles_total += ecycles_diff[i];
+		ecount_total += ecount_diff[i];
+	}
+	
+	/* For each exception compute percential change */
+	
+	for (i = 0; i < new_data->exceptions_count; i++) {
+		FRACTION_TO_FLOAT(new_data->exceptions_perc[i].cycles,
+		    ecycles_diff[i] * 100, ecycles_total);
+		FRACTION_TO_FLOAT(new_data->exceptions_perc[i].count,
+		    ecount_diff[i] * 100, ecount_total);
+	}
+	
 	/* Cleanup */
 	
 	free(ucycles_diff);
 	free(kcycles_diff);
+	free(ecycles_diff);
+	free(ecount_diff);
 	
 	return NULL;
@@ -238,4 +313,7 @@
 	if (target->exceptions != NULL)
 		free(target->exceptions);
+	
+	if (target->exceptions_perc != NULL)
+		free(target->exceptions_perc);
 	
 	if (target->physmem != NULL)
Index: uspace/app/top/top.h
===================================================================
--- uspace/app/top/top.h	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ uspace/app/top/top.h	(revision be069144135afaab9e7c8cee79ffd3504762612c)
@@ -39,8 +39,14 @@
 #include <time.h>
 
-#define FRACTION_TO_FLOAT(float, a, b) { \
-	(float).upper = (a); \
-	(float).lower = (b); \
-}
+#define FRACTION_TO_FLOAT(float, a, b) \
+	{ \
+		if ((b) != 0) { \
+			(float).upper = (a); \
+			(float).lower = (b); \
+		} else { \
+			(float).upper = 0; \
+			(float).lower = 1; \
+		} \
+	}
 
 #define OP_TASKS  1
@@ -61,8 +67,13 @@
 
 typedef struct {
+	fixed_float virtmem;
 	fixed_float ucycles;
 	fixed_float kcycles;
-	fixed_float virtmem;
 } perc_task_t;
+
+typedef struct {
+	fixed_float cycles;
+	fixed_float count;
+} perc_exc_t;
 
 typedef struct {
@@ -92,4 +103,5 @@
 	size_t exceptions_count;
 	stats_exc_t *exceptions;
+	perc_exc_t *exceptions_perc;
 	
 	stats_physmem_t *physmem;
