Index: uspace/app/tester/tester.c
===================================================================
--- uspace/app/tester/tester.c	(revision 073c9e61a18eccb87f9fe939f4f206dd9422a55f)
+++ uspace/app/tester/tester.c	(revision abf35647b3adaaa83f5053174133e13707bdab83)
@@ -110,4 +110,6 @@
 int main(int argc, char **argv)
 {
+	printf("x"); while(1);
+
 	printf("Number of arguments: %d\n", argc);
 	if (argv) {
Index: uspace/app/trace/ipcp.c
===================================================================
--- uspace/app/trace/ipcp.c	(revision 073c9e61a18eccb87f9fe939f4f206dd9422a55f)
+++ uspace/app/trace/ipcp.c	(revision abf35647b3adaaa83f5053174133e13707bdab83)
@@ -47,4 +47,5 @@
 	int phone_hash;
 	ipc_call_t question;
+	oper_t *oper;
 
 	int call_hash;
@@ -146,4 +147,12 @@
 	oper_t *oper;
 
+	val_type_t arg_def[OPER_MAX_ARGS] = {
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER		
+	};
+
 	/*
 	 * Create a pseudo-protocol 'unknown' that has no known methods.
@@ -159,5 +168,6 @@
 	desc = ipc_methods;
 	while (desc->number != 0) {
-		oper = oper_new(desc->name);
+		oper = oper_new(desc->name, OPER_MAX_ARGS, arg_def, V_INTEGER,
+			OPER_MAX_ARGS, arg_def);
 		proto_add_oper(proto_system, desc->number, oper);
 
@@ -180,7 +190,11 @@
 	unsigned long key[1];
 	oper_t *oper;
+	ipcarg_t *args;
+	int i;
 
 	if (have_conn[phone]) proto = connections[phone].proto;
 	else proto = NULL;
+
+	args = call->args;
 
 	if ((display_mask & DM_IPC) != 0) {
@@ -188,11 +202,6 @@
 			phone, (proto ? proto->name : "n/a"));
 		ipc_m_print(proto, IPC_GET_METHOD(*call));
-		printf(" args: (%u, %u, %u, %u, %u)\n",
-		    IPC_GET_ARG1(*call),
-		    IPC_GET_ARG2(*call),
-		    IPC_GET_ARG3(*call),
-		    IPC_GET_ARG4(*call),
-		    IPC_GET_ARG5(*call)
-		);
+		printf(" args: (%u, %u, %u, %u, %u)\n", args[1], args[2],
+		    args[3], args[4], args[5]);
 	}
 
@@ -211,12 +220,24 @@
 			    phone, (oper ? oper->name : "unknown"));
 
-			printf("(%u, %u, %u, %u, %u)\n",
-			    IPC_GET_ARG1(*call),
-			    IPC_GET_ARG2(*call),
-			    IPC_GET_ARG3(*call),
-			    IPC_GET_ARG4(*call),
-			    IPC_GET_ARG5(*call)
-			);
-		}
+			putchar('(');
+			for (i = 1; i <= oper->argc; ++i) {
+				if (i > 1) printf(", ");
+				val_print(args[i], oper->arg_type[i - 1]);
+			}
+			putchar(')');
+
+			if (oper->rv_type == V_VOID && oper->respc == 0) {
+				/*
+				 * No response data (typically the task will
+				 * not be interested in the response).
+				 * We will not display response.
+				 */
+				putchar('.');
+			}
+
+			putchar('\n');
+		}
+	} else {
+		oper = NULL;
 	}
 
@@ -227,4 +248,5 @@
 	pcall->question = *call;
 	pcall->call_hash = hash;
+	pcall->oper = oper;
 
 	key[0] = hash;
@@ -243,4 +265,8 @@
 	int cphone;
 
+	ipcarg_t *resp;
+	oper_t *oper;
+	int i;
+
 //	printf("parse_answer\n");
 
@@ -248,4 +274,6 @@
 	method = IPC_GET_METHOD(pcall->question);
 	retval = IPC_GET_RETVAL(*answer);
+
+	resp = answer->args;
 
 	if ((display_mask & DM_IPC) != 0) {
@@ -257,5 +285,26 @@
 
 	if ((display_mask & DM_USER) != 0) {
-		printf("-> %d\n", retval);
+		oper = pcall->oper;
+
+		if (oper->rv_type != V_VOID || oper->respc > 0) {
+			printf("->");
+
+			if (oper->rv_type != V_VOID) {
+				putchar(' ');
+				val_print(retval, oper->rv_type);
+			}
+			
+			if (oper->respc > 0) {
+				putchar(' ');
+				putchar('(');
+				for (i = 1; i <= oper->respc; ++i) {
+					if (i > 1) printf(", ");
+					val_print(resp[i], oper->resp_type[i - 1]);
+				}
+				putchar(')');
+			}
+
+			putchar('\n');
+		}
 	}
 
Index: uspace/app/trace/proto.c
===================================================================
--- uspace/app/trace/proto.c	(revision 073c9e61a18eccb87f9fe939f4f206dd9422a55f)
+++ uspace/app/trace/proto.c	(revision abf35647b3adaaa83f5053174133e13707bdab83)
@@ -38,4 +38,5 @@
 #include <libadt/hash_table.h>
 
+#include "trace.h"
 #include "proto.h"
 
@@ -210,11 +211,23 @@
 }
 
-oper_t *oper_new(char *name)
+oper_t *oper_new(char *name, int argc, val_type_t *arg_types,
+    val_type_t rv_type, int respc, val_type_t *resp_types)
 {
 	oper_t *o;
+	int i;
 
 	o = malloc(sizeof(oper_t));
 	oper_struct_init(o, name);
 
+	o->argc = argc;
+	for (i = 0; i < argc; i++)
+		o->arg_type[i] = arg_types[i];
+
+	o->rv_type = rv_type;
+
+	o->respc = respc;
+	for (i = 0; i < respc; i++)
+		o->resp_type[i] = resp_types[i];
+
 	return o;
 }
Index: uspace/app/trace/proto.h
===================================================================
--- uspace/app/trace/proto.h	(revision 073c9e61a18eccb87f9fe939f4f206dd9422a55f)
+++ uspace/app/trace/proto.h	(revision abf35647b3adaaa83f5053174133e13707bdab83)
@@ -37,7 +37,19 @@
 
 #include <libadt/hash_table.h>
+#include <ipc/ipc.h>
+#include "trace.h"
+
+#define OPER_MAX_ARGS (IPC_CALL_LEN - 1)
 
 typedef struct {
 	char *name;
+
+	int argc;
+	val_type_t arg_type[OPER_MAX_ARGS];
+
+	val_type_t rv_type;
+
+	int respc;
+	val_type_t resp_type[OPER_MAX_ARGS];
 } oper_t;
 
@@ -63,5 +75,7 @@
 oper_t *proto_get_oper(proto_t *proto, int method);
 
-oper_t *oper_new(char *name);
+oper_t *oper_new(char *name, int argc, val_type_t *arg_types,
+    val_type_t rv_type, int respc, val_type_t *resp_types);
+
 
 
Index: uspace/app/trace/syscalls.h
===================================================================
--- uspace/app/trace/syscalls.h	(revision 073c9e61a18eccb87f9fe939f4f206dd9422a55f)
+++ uspace/app/trace/syscalls.h	(revision abf35647b3adaaa83f5053174133e13707bdab83)
@@ -36,15 +36,8 @@
 #define SYSCALLS_H_
 
-typedef enum {
-	RV_INTEGER,
-	RV_HASH,
-	RV_ERRNO,
-	RV_INT_ERRNO
-} rv_type_t;
-
 typedef struct {
 	char *name;
 	int n_args;
-	rv_type_t rv_type;
+	val_type_t rv_type;
 } sc_desc_t;
 
Index: uspace/app/trace/trace.c
===================================================================
--- uspace/app/trace/trace.c	(revision 073c9e61a18eccb87f9fe939f4f206dd9422a55f)
+++ uspace/app/trace/trace.c	(revision abf35647b3adaaa83f5053174133e13707bdab83)
@@ -137,28 +137,61 @@
 }
 
-static void print_sc_retval(int retval, rv_type_t rv_type)
-{
-	printf (" -> ");
-	if (rv_type == RV_INTEGER) {
-		printf("%d", retval);
-	} else if (rv_type == RV_HASH) {
-		printf("0x%08x", retval);
-	} else if (rv_type == RV_ERRNO) {
-		if (retval >= -15 && retval <= 0) {
-			printf("%d %s (%s)", retval,
-			    err_desc[retval].name,
-			    err_desc[retval].desc);
+void val_print(int val, val_type_t v_type)
+{
+	switch (v_type) {
+	case V_VOID:
+		printf("<void>");
+		break;
+
+	case V_INTEGER:
+		printf("%d", val);
+		break;
+
+	case V_HASH:
+		printf("0x%08x", val);
+		break;
+
+	case V_ERRNO:
+		if (val >= -15 && val <= 0) {
+			printf("%d %s (%s)", val,
+			    err_desc[-val].name,
+			    err_desc[-val].desc);
 		} else {
-			printf("%d", retval);
-		}
-	} else if (rv_type == RV_INT_ERRNO) {
-		if (retval >= -15 && retval < 0) {
-			printf("%d %s (%s)", retval,
-			    err_desc[retval].name,
-			    err_desc[retval].desc);
+			printf("%d", val);
+		}
+		break;
+	case V_INT_ERRNO:
+		if (val >= -15 && val < 0) {
+			printf("%d %s (%s)", val,
+			    err_desc[-val].name,
+			    err_desc[-val].desc);
 		} else {
-			printf("%d", retval);
-		}
-	}
+			printf("%d", val);
+		}
+		break;
+
+	case V_CHAR:
+		if (val >= 0x20 && val < 0x7f) {
+			printf("'%c'", val);
+		} else {
+			switch (val) {
+			case '\a': printf("'\\a'"); break;
+			case '\b': printf("'\\b'"); break;
+			case '\n': printf("'\\n'"); break;
+			case '\r': printf("'\\r'"); break;
+			case '\t': printf("'\\t'"); break;
+			case '\\': printf("'\\\\'"); break;
+			default: printf("'\\x%X'"); break;
+			}
+		}
+		break;
+	}
+}
+
+
+static void print_sc_retval(int retval, val_type_t val_type)
+{
+	printf(" -> ");
+	val_print(retval, val_type);
 	putchar('\n');
 }
@@ -170,5 +203,5 @@
 	putchar('(');
 	if (n > 0) printf("%d", sc_args[0]);
-	for (i=1; i<n; i++) {
+	for (i = 1; i < n; i++) {
 		printf(", %d", sc_args[i]);
 	}
@@ -497,4 +530,20 @@
 	oper_t *o;
 
+	val_type_t arg_def[OPER_MAX_ARGS] = {
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER		
+	};
+
+	val_type_t resp_def[OPER_MAX_ARGS] = {
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER,
+		V_INTEGER		
+	};
+
 	next_thread_id = 1;
 	paused = 0;
@@ -503,36 +552,43 @@
 
 	p = proto_new("vfs");
-	o = oper_new("read");
+	o = oper_new("read", 1, arg_def, V_ERRNO, 1, resp_def);
 	proto_add_oper(p, VFS_READ, o);
-	o = oper_new("write");
+	o = oper_new("write", 1, arg_def, V_ERRNO, 1, resp_def);
 	proto_add_oper(p, VFS_WRITE, o);
-	o = oper_new("truncate");
+	o = oper_new("truncate", 5, arg_def, V_ERRNO, 0, resp_def);
 	proto_add_oper(p, VFS_TRUNCATE, o);
-	o = oper_new("mount");
+	o = oper_new("mount", 2, arg_def, V_ERRNO, 0, resp_def);
 	proto_add_oper(p, VFS_MOUNT, o);
-	o = oper_new("unmount");
-	proto_add_oper(p, VFS_UNMOUNT, o);
+/*	o = oper_new("unmount", 0, arg_def);
+	proto_add_oper(p, VFS_UNMOUNT, o);*/
 
 	proto_register(SERVICE_VFS, p);
 
 	p = proto_new("console");
-	o = oper_new("getchar");
+	resp_def[0] = V_CHAR;
+	o = oper_new("getchar", 0, arg_def, V_INTEGER, 2, resp_def);
 	proto_add_oper(p, CONSOLE_GETCHAR, o);
-	o = oper_new("putchar");
+
+	arg_def[0] = V_CHAR;
+	o = oper_new("putchar", 1, arg_def, V_VOID, 0, resp_def);
 	proto_add_oper(p, CONSOLE_PUTCHAR, o);
-	o = oper_new("clear");
+	o = oper_new("clear", 0, arg_def, V_VOID, 0, resp_def);
 	proto_add_oper(p, CONSOLE_CLEAR, o);
-	o = oper_new("goto");
+
+	arg_def[0] = V_INTEGER; arg_def[1] = V_INTEGER;
+	o = oper_new("goto", 2, arg_def, V_VOID, 0, resp_def);
 	proto_add_oper(p, CONSOLE_GOTO, o);
-	o = oper_new("getsize");
+
+	resp_def[0] = V_INTEGER; resp_def[1] = V_INTEGER;
+	o = oper_new("getsize", 0, arg_def, V_INTEGER, 2, resp_def);
 	proto_add_oper(p, CONSOLE_GETSIZE, o);
-	o = oper_new("flush");
+	o = oper_new("flush", 0, arg_def, V_VOID, 0, resp_def);
 	proto_add_oper(p, CONSOLE_FLUSH, o);
-	o = oper_new("set_style");
+
+	arg_def[0] = V_INTEGER; arg_def[1] = V_INTEGER;
+	o = oper_new("set_style", 2, arg_def, V_INTEGER, 0, resp_def);
 	proto_add_oper(p, CONSOLE_SET_STYLE, o);
-	o = oper_new("cursor_visibility");
+	o = oper_new("cursor_visibility", 1, arg_def, V_VOID, 0, resp_def);
 	proto_add_oper(p, CONSOLE_CURSOR_VISIBILITY, o);
-	o = oper_new("flush");
-	proto_add_oper(p, CONSOLE_FLUSH, o);
 
 	proto_console = p;
Index: uspace/app/trace/trace.h
===================================================================
--- uspace/app/trace/trace.h	(revision 073c9e61a18eccb87f9fe939f4f206dd9422a55f)
+++ uspace/app/trace/trace.h	(revision abf35647b3adaaa83f5053174133e13707bdab83)
@@ -49,6 +49,18 @@
 } display_mask_t;
 
+typedef enum {
+	V_VOID,
+	V_INTEGER,
+	V_PTR,
+	V_HASH,
+	V_ERRNO,
+	V_INT_ERRNO,
+	V_CHAR
+} val_type_t;
+
 /** Combination of events to print. */
 extern display_mask_t display_mask;
+
+void val_print(int val, val_type_t v_type);
 
 #endif
