Index: kernel/generic/include/console/kconsole.h
===================================================================
--- kernel/generic/include/console/kconsole.h	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ kernel/generic/include/console/kconsole.h	(revision c0f13d2675d8c8db426acccaba56a4377f515dc3)
@@ -47,4 +47,6 @@
 	ARG_TYPE_INT,
 	ARG_TYPE_STRING,
+	/** Optional string */
+	ARG_TYPE_STRING_OPTIONAL,
 	/** Variable type - either symbol or string. */
 	ARG_TYPE_VAR
Index: kernel/generic/include/proc/task.h
===================================================================
--- kernel/generic/include/proc/task.h	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ kernel/generic/include/proc/task.h	(revision c0f13d2675d8c8db426acccaba56a4377f515dc3)
@@ -138,5 +138,5 @@
 extern int task_kill(task_id_t);
 extern void task_get_accounting(task_t *, uint64_t *, uint64_t *);
-extern void task_print_list(void);
+extern void task_print_list(bool);
 
 extern void cap_set(task_t *, cap_t);
Index: kernel/generic/src/console/cmd.c
===================================================================
--- kernel/generic/src/console/cmd.c	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ kernel/generic/src/console/cmd.c	(revision c0f13d2675d8c8db426acccaba56a4377f515dc3)
@@ -207,5 +207,5 @@
 };
 
-/* Data and methods for 'call0' command. */
+/* Data and methods for 'call0' and 'mcall0' command. */
 static char call0_buf[MAX_CMDLINE + 1];
 static char carg1_buf[MAX_CMDLINE + 1];
@@ -363,10 +363,19 @@
 };
 
+
 static int cmd_tasks(cmd_arg_t *argv);
+static char tasks_buf[MAX_CMDLINE + 1];
+
+static cmd_arg_t tasks_argv = {
+	.type = ARG_TYPE_STRING_OPTIONAL,
+	.buffer = tasks_buf,
+	.len = sizeof(tasks_buf)
+};
 static cmd_info_t tasks_info = {
 	.name = "tasks",
-	.description = "List all tasks.",
+	.description = "List all tasks (use -a for additional information).",
 	.func = cmd_tasks,
-	.argc = 0
+	.argc = 1,
+	.argv = &tasks_argv
 };
 
@@ -930,7 +939,13 @@
  * @return Always 1
  */
-int cmd_tasks(cmd_arg_t * argv)
-{
-	task_print_list();
+int cmd_tasks(cmd_arg_t *argv)
+{
+	if (str_cmp(tasks_buf, "-a") == 0)
+		task_print_list(true);
+	else if (str_cmp(tasks_buf, "") == 0)
+		task_print_list(false);
+	else
+		printf("Unknown argument \"%s\".\n", tasks_buf);
+	
 	return 1;
 }
Index: kernel/generic/src/console/kconsole.c
===================================================================
--- kernel/generic/src/console/kconsole.c	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ kernel/generic/src/console/kconsole.c	(revision c0f13d2675d8c8db426acccaba56a4377f515dc3)
@@ -590,6 +590,14 @@
 	size_t i;
 	for (i = 0; i < cmd->argc; i++) {
+		char *buf;
+		
 		start = end;
 		if (!parse_argument(cmdline, size, &start, &end)) {
+			if (cmd->argv[i].type == ARG_TYPE_STRING_OPTIONAL) {
+				buf = (char *) cmd->argv[i].buffer;
+				str_cpy(buf, cmd->argv[i].len, "");
+				continue;
+			}
+			
 			printf("Too few arguments.\n");
 			spinlock_unlock(&cmd->lock);
@@ -597,7 +605,7 @@
 		}
 		
-		char *buf;
 		switch (cmd->argv[i].type) {
 		case ARG_TYPE_STRING:
+		case ARG_TYPE_STRING_OPTIONAL:
 			buf = (char *) cmd->argv[i].buffer;
 			str_ncpy(buf, cmd->argv[i].len, cmdline + start,
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision 8eec3c82a9d04f56cd45c25f1e2466f94a863763)
+++ kernel/generic/src/proc/task.c	(revision c0f13d2675d8c8db426acccaba56a4377f515dc3)
@@ -465,4 +465,5 @@
 static bool task_print_walker(avltree_node_t *node, void *arg)
 {
+	bool *additional = (bool *) arg;
 	task_t *task = avltree_get_instance(node, task_t, tasks_tree_node);
 	irq_spinlock_lock(&task->lock, false);
@@ -476,23 +477,32 @@
 	
 #ifdef __32_BITS__
-	printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %10p %10p %9" PRIu64 "%c %9"
-	    PRIu64 "%c %7ld %6ld", task->taskid, task->name, task->context,
-	    task, task->as, ucycles, usuffix, kcycles, ksuffix,
-	    atomic_get(&task->refcount), atomic_get(&task->active_calls));
+	if (*additional)
+		printf("%-8" PRIu64 " %9ld %7ld", task->taskid,
+		    atomic_get(&task->refcount), atomic_get(&task->active_calls));
+	else
+		printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p"
+		    " %9" PRIu64 "%c %9" PRIu64 "%c\n", task->taskid,
+		    task->name, task->context, task, task->as,
+		    ucycles, usuffix, kcycles, ksuffix);
 #endif
 	
 #ifdef __64_BITS__
-	printf("%-6" PRIu64 " %-12s %-3" PRIu32 " %18p %18p %9" PRIu64 "%c %9"
-	    PRIu64 "%c %7ld %6ld", task->taskid, task->name, task->context,
-	    task, task->as, ucycles, usuffix, kcycles, ksuffix,
-	    atomic_get(&task->refcount), atomic_get(&task->active_calls));
-#endif
-	
-	size_t i;
-	for (i = 0; i < IPC_MAX_PHONES; i++) {
-		if (task->phones[i].callee)
-			printf(" %" PRIs ":%p", i, task->phones[i].callee);
+	if (*additional)
+		printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c %9ld %7ld",
+		    task->taskid, ucycles, usuffix, kcycles, ksuffix,
+		    atomic_get(&task->refcount), atomic_get(&task->active_calls));
+	else
+		printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n",
+		    task->taskid, task->name, task->context, task, task->as);
+#endif
+	
+	if (*additional) {
+		size_t i;
+		for (i = 0; i < IPC_MAX_PHONES; i++) {
+			if (task->phones[i].callee)
+				printf(" %" PRIs ":%p", i, task->phones[i].callee);
+		}
+		printf("\n");
 	}
-	printf("\n");
 	
 	irq_spinlock_unlock(&task->lock, false);
@@ -500,6 +510,10 @@
 }
 
-/** Print task list */
-void task_print_list(void)
+/** Print task list
+ *
+ * @param additional Print additional information.
+ *
+ */
+void task_print_list(bool additional)
 {
 	/* Messing with task structures, avoid deadlock */
@@ -507,18 +521,21 @@
 	
 #ifdef __32_BITS__
-	printf("taskid name         ctx address    as        "
-	    " ucycles    kcycles    threads calls  callee\n");
-	printf("------ ------------ --- ---------- ----------"
-	    " ---------- ---------- ------- ------ ------>\n");
+	if (additional)
+		printf("[taskid] [threads] [calls] [callee\n");
+	else
+		printf("[taskid] [name        ] [ctx] [address ] [as      ]"
+		    " [ucycles ] [kcycles ]\n");
 #endif
 	
 #ifdef __64_BITS__
-	printf("taskid name         ctx address            as                "
-	    " ucycles    kcycles    threads calls  callee\n");
-	printf("------ ------------ --- ------------------ ------------------"
-	    " ---------- ---------- ---------- ------- ------ ------>\n");
-#endif
-	
-	avltree_walk(&tasks_tree, task_print_walker, NULL);
+	if (additional)
+		printf("[taskid] [ucycles ] [kcycles ] [threads] [calls]"
+		    " [callee\n");
+	else
+		printf("[taskid] [name        ] [ctx] [address         ]"
+		    " [as              ]\n");
+#endif
+	
+	avltree_walk(&tasks_tree, task_print_walker, &additional);
 	
 	irq_spinlock_unlock(&tasks_lock, true);
