Index: kernel/generic/include/proc/task.h
===================================================================
--- kernel/generic/include/proc/task.h	(revision e43cdac49002cebbacc64f283bba4fdfa5282411)
+++ kernel/generic/include/proc/task.h	(revision bdfd3c978d7f3378bdc591ff4fe153a17d5c2ea3)
@@ -94,4 +94,5 @@
 	answerbox_t answerbox;  /**< Communication endpoint */
 	phone_t phones[IPC_MAX_PHONES];
+	task_ipc_info_t ipc_info; /**< IPC statistics */
 	/**
 	 * Active asynchronous messages. It is used for limiting uspace to
Index: kernel/generic/include/ps/taskinfo.h
===================================================================
--- kernel/generic/include/ps/taskinfo.h	(revision e43cdac49002cebbacc64f283bba4fdfa5282411)
+++ kernel/generic/include/ps/taskinfo.h	(revision bdfd3c978d7f3378bdc591ff4fe153a17d5c2ea3)
@@ -46,4 +46,13 @@
 
 typedef struct {
+	uint64_t call_sent;
+	uint64_t call_recieved;
+	uint64_t answer_sent;
+	uint64_t answer_recieved;
+	uint64_t irq_notif_recieved;
+	uint64_t forwarded;
+} task_ipc_info_t;
+
+typedef struct {
 	task_id_t taskid;
 	char name[TASK_NAME_BUFLEN];
@@ -52,4 +61,5 @@
 	uint64_t ucycles;
 	uint64_t kcycles;
+	task_ipc_info_t ipc_info;
 } task_info_t;
 
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision e43cdac49002cebbacc64f283bba4fdfa5282411)
+++ kernel/generic/src/ipc/ipc.c	(revision bdfd3c978d7f3378bdc591ff4fe153a17d5c2ea3)
@@ -219,4 +219,8 @@
 	bool do_lock = ((!selflocked) || callerbox != (&TASK->answerbox));
 
+	spinlock_lock(&TASK->lock);
+	TASK->ipc_info.answer_sent++;
+	spinlock_unlock(&TASK->lock);
+
 	call->flags |= IPC_CALL_ANSWERED;
 
@@ -276,4 +280,8 @@
 static void _ipc_call(phone_t *phone, answerbox_t *box, call_t *call)
 {
+	spinlock_lock(&TASK->lock);
+	TASK->ipc_info.call_sent++;
+	spinlock_unlock(&TASK->lock);
+
 	if (!(call->flags & IPC_CALL_FORWARDED)) {
 		atomic_inc(&phone->active_calls);
@@ -376,4 +384,8 @@
 int ipc_forward(call_t *call, phone_t *newphone, answerbox_t *oldbox, int mode)
 {
+	spinlock_lock(&TASK->lock);
+	TASK->ipc_info.forwarded++;
+	spinlock_unlock(&TASK->lock);
+
 	spinlock_lock(&oldbox->lock);
 	list_remove(&call->link);
@@ -416,4 +428,9 @@
 	spinlock_lock(&box->lock);
 	if (!list_empty(&box->irq_notifs)) {
+
+		spinlock_lock(&TASK->lock);
+		TASK->ipc_info.irq_notif_recieved++;
+		spinlock_unlock(&TASK->lock);
+
 		ipl = interrupts_disable();
 		spinlock_lock(&box->irq_lock);
@@ -425,4 +442,8 @@
 		interrupts_restore(ipl);
 	} else if (!list_empty(&box->answers)) {
+		spinlock_lock(&TASK->lock);
+		TASK->ipc_info.answer_recieved++;
+		spinlock_unlock(&TASK->lock);
+
 		/* Handle asynchronous answers */
 		request = list_get_instance(box->answers.next, call_t, link);
@@ -430,4 +451,9 @@
 		atomic_dec(&request->data.phone->active_calls);
 	} else if (!list_empty(&box->calls)) {
+
+		spinlock_lock(&TASK->lock);
+		TASK->ipc_info.call_recieved++;
+		spinlock_unlock(&TASK->lock);
+
 		/* Handle requests */
 		request = list_get_instance(box->calls.next, call_t, link);
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision e43cdac49002cebbacc64f283bba4fdfa5282411)
+++ kernel/generic/src/proc/task.c	(revision bdfd3c978d7f3378bdc591ff4fe153a17d5c2ea3)
@@ -187,4 +187,11 @@
 	ta->kcycles = 0;
 
+	ta->ipc_info.call_sent = 0;
+	ta->ipc_info.call_recieved = 0;
+	ta->ipc_info.answer_sent = 0;
+	ta->ipc_info.answer_recieved = 0;
+	ta->ipc_info.irq_notif_recieved = 0;
+	ta->ipc_info.forwarded = 0;
+
 #ifdef CONFIG_UDEBUG
 	/* Init debugging stuff */
Index: kernel/generic/src/ps/ps.c
===================================================================
--- kernel/generic/src/ps/ps.c	(revision e43cdac49002cebbacc64f283bba4fdfa5282411)
+++ kernel/generic/src/ps/ps.c	(revision bdfd3c978d7f3378bdc591ff4fe153a17d5c2ea3)
@@ -143,4 +143,13 @@
 	copy_to_uspace(&uspace_info->kcycles, &kcycles, sizeof(uint64_t));
 
+	task_ipc_info_t ipc_info;
+	ipc_info.call_sent = t->ipc_info.call_sent;
+	ipc_info.call_recieved = t->ipc_info.call_recieved;
+	ipc_info.answer_sent = t->ipc_info.answer_sent;
+	ipc_info.answer_recieved = t->ipc_info.answer_recieved;
+	ipc_info.irq_notif_recieved = t->ipc_info.irq_notif_recieved;
+	ipc_info.forwarded = t->ipc_info.forwarded;
+	copy_to_uspace(&uspace_info->ipc_info, &ipc_info, sizeof(task_ipc_info_t));
+
 	uint64_t memory = get_task_memory(t->as);
 	copy_to_uspace(&uspace_info->virt_mem, &memory, sizeof(memory));
