Index: uspace/app/trace/ipcp.c
===================================================================
--- uspace/app/trace/ipcp.c	(revision c9a29d66b60ccb0e6b9460485ef933074fd1b30a)
+++ uspace/app/trace/ipcp.c	(revision 8c125ad51a8dfadbf925f3871e4ccdf00e4b81df)
@@ -64,4 +64,10 @@
 hash_table_t pending_calls;
 
+/*
+ * Pseudo-protocols
+ */
+proto_t *proto_system;		/**< Protocol describing system IPC methods. */
+proto_t	*proto_unknown;		/**< Protocol with no known methods. */
+
 static hash_index_t pending_call_hash(unsigned long key[]);
 static int pending_call_compare(unsigned long key[], hash_count_t keys,
@@ -116,31 +122,46 @@
 static void ipc_m_print(proto_t *proto, ipcarg_t method)
 {
+	oper_t *oper;
+
+	/* Try system methods first */
+	oper = proto_get_oper(proto_system, method);
+
+	if (oper == NULL && proto != NULL) {
+		/* Not a system method, try the user protocol. */
+		oper = proto_get_oper(proto, method);
+	}
+
+	if (oper != NULL) {
+		printf("%s (%d)", oper->name, method);
+		return;
+	}
+
+	printf("%d", method);
+}
+
+void ipcp_init(void)
+{
 	ipc_m_desc_t *desc;
 	oper_t *oper;
 
-	/* FIXME: too slow */
+	/*
+	 * Create a pseudo-protocol 'unknown' that has no known methods.
+	 */
+	proto_unknown = proto_new("unknown");
+
+	/*
+	 * Create a pseudo-protocol 'system' defining names of system IPC
+	 * methods.
+	 */
+	proto_system = proto_new("system");
+
 	desc = ipc_methods;
 	while (desc->number != 0) {
-		if (desc->number == method) {
-			printf("%s (%d)", desc->name, method);
-			return;
-		}
+		oper = oper_new(desc->name);
+		proto_add_oper(proto_system, desc->number, oper);
 
 		++desc;
 	}
 
-	if (proto != NULL) {
-		oper = proto_get_oper(proto, method);
-		if (oper != NULL) {
-			printf("%s (%d)", oper->name, method);
-			return;
-		}
-	}
-
-	printf("%d", method);
-}
-
-void ipcp_init(void)
-{
 	hash_table_create(&pending_calls, PCALL_TABLE_CHAINS, 1, &pending_call_ops);
 }
@@ -148,4 +169,5 @@
 void ipcp_cleanup(void)
 {
+	proto_delete(proto_system);
 	hash_table_destroy(&pending_calls);
 }
@@ -190,5 +212,4 @@
 	ipcarg_t service;
 	int retval;
-	static proto_t proto_unknown = { .name = "unknown" };
 	proto_t *proto;
 	int cphone;
@@ -206,5 +227,5 @@
 		service = IPC_GET_ARG1(pcall->question);
 		proto = proto_get_by_srv(service);
-		if (proto == NULL) proto = &proto_unknown;
+		if (proto == NULL) proto = proto_unknown;
 
 		cphone = IPC_GET_ARG5(*answer);
Index: uspace/app/trace/proto.c
===================================================================
--- uspace/app/trace/proto.c	(revision c9a29d66b60ccb0e6b9460485ef933074fd1b30a)
+++ uspace/app/trace/proto.c	(revision 8c125ad51a8dfadbf925f3871e4ccdf00e4b81df)
@@ -173,4 +173,9 @@
 }
 
+void proto_delete(proto_t *proto)
+{
+	free(proto);
+}
+
 void proto_add_oper(proto_t *proto, int method, oper_t *oper)
 {
Index: uspace/app/trace/proto.h
===================================================================
--- uspace/app/trace/proto.h	(revision c9a29d66b60ccb0e6b9460485ef933074fd1b30a)
+++ uspace/app/trace/proto.h	(revision 8c125ad51a8dfadbf925f3871e4ccdf00e4b81df)
@@ -59,4 +59,5 @@
 proto_t *proto_get_by_srv(int srv);
 proto_t *proto_new(char *name);
+void proto_delete(proto_t *proto);
 void proto_add_oper(proto_t *proto, int method, oper_t *oper);
 oper_t *proto_get_oper(proto_t *proto, int method);
