Index: kernel/generic/include/ipc/ipc.h
===================================================================
--- kernel/generic/include/ipc/ipc.h	(revision b9eb93fee84439138da39f6dd8bea65a7370d2dc)
+++ kernel/generic/include/ipc/ipc.h	(revision 5174c6244d0770039dd3af7483fb578c0f1d5874)
@@ -43,10 +43,6 @@
 #define IPC_CALL_LEN  6
 
-/** Maximum active async calls per thread */
-#ifdef CONFIG_DEBUG
-	#define IPC_MAX_ASYNC_CALLS  16
-#else
-	#define IPC_MAX_ASYNC_CALLS  4000
-#endif
+/** Maximum active async calls per phone */
+#define IPC_MAX_ASYNC_CALLS  4
 
 /* Flags for calls */
Index: kernel/generic/include/proc/task.h
===================================================================
--- kernel/generic/include/proc/task.h	(revision b9eb93fee84439138da39f6dd8bea65a7370d2dc)
+++ kernel/generic/include/proc/task.h	(revision 5174c6244d0770039dd3af7483fb578c0f1d5874)
@@ -93,9 +93,4 @@
 	phone_t phones[IPC_MAX_PHONES];
 	stats_ipc_t ipc_info;   /**< IPC statistics */
-	/**
-	 * Active asynchronous messages. It is used for limiting uspace to
-	 * certain extent.
-	 */
-	atomic_t active_calls;
 	/** List of synchronous answerboxes. */
 	link_t sync_box_head;
Index: kernel/generic/src/ipc/ipc.c
===================================================================
--- kernel/generic/src/ipc/ipc.c	(revision b9eb93fee84439138da39f6dd8bea65a7370d2dc)
+++ kernel/generic/src/ipc/ipc.c	(revision 5174c6244d0770039dd3af7483fb578c0f1d5874)
@@ -655,12 +655,4 @@
 		    (call->flags & IPC_CALL_NOTIF));
 		
-		/*
-		 * Record the receipt of this call in the current task's counter
-		 * of active calls. IPC_M_PHONE_HUNGUP calls do not contribute
-		 * to this counter so do not record answers to them either.
-		 */
-		if (!(call->flags & IPC_CALL_DISCARD_ANSWER))
-			atomic_dec(&TASK->active_calls);
-		
 		ipc_call_free(call);
 	}
Index: kernel/generic/src/ipc/sysipc.c
===================================================================
--- kernel/generic/src/ipc/sysipc.c	(revision b9eb93fee84439138da39f6dd8bea65a7370d2dc)
+++ kernel/generic/src/ipc/sysipc.c	(revision 5174c6244d0770039dd3af7483fb578c0f1d5874)
@@ -644,15 +644,15 @@
 }
 
-/** Check that the task did not exceed the allowed limit of asynchronous calls.
- *
+/** Check that the task did not exceed the allowed limit of asynchronous calls
+ * made over a phone.
+ *
+ * @param phone Phone to check the limit against. 
  * @return 0 if limit not reached or -1 if limit exceeded.
  *
  */
-static int check_call_limit(void)
-{
-	if (atomic_preinc(&TASK->active_calls) > IPC_MAX_ASYNC_CALLS) {
-		atomic_dec(&TASK->active_calls);
+static int check_call_limit(phone_t *phone)
+{
+	if (atomic_get(&phone->active_calls) >= IPC_MAX_ASYNC_CALLS)
 		return -1;
-	}
 	
 	return 0;
@@ -680,10 +680,10 @@
     unative_t arg1, unative_t arg2, unative_t arg3, unative_t arg4)
 {
-	if (check_call_limit())
-		return IPC_CALLRET_TEMPORARY;
-	
 	phone_t *phone;
 	if (phone_get(phoneid, &phone) != EOK)
 		return IPC_CALLRET_FATAL;
+
+	if (check_call_limit(phone))
+		return IPC_CALLRET_TEMPORARY;
 	
 	call_t *call = ipc_call_alloc(0);
@@ -720,10 +720,10 @@
 unative_t sys_ipc_call_async_slow(unative_t phoneid, ipc_data_t *data)
 {
-	if (check_call_limit())
-		return IPC_CALLRET_TEMPORARY;
-	
 	phone_t *phone;
 	if (phone_get(phoneid, &phone) != EOK)
 		return IPC_CALLRET_FATAL;
+
+	if (check_call_limit(phone))
+		return IPC_CALLRET_TEMPORARY;
 
 	call_t *call = ipc_call_alloc(0);
@@ -1046,11 +1046,4 @@
 			ipc_call_free(call);
 			goto restart;
-		} else {
-			/*
-			 * Decrement the counter of active calls only if the
-			 * call is not an answer to IPC_M_PHONE_HUNGUP,
-			 * which doesn't contribute to the counter.
-			 */
-			atomic_dec(&TASK->active_calls);
 		}
 		
Index: kernel/generic/src/proc/task.c
===================================================================
--- kernel/generic/src/proc/task.c	(revision b9eb93fee84439138da39f6dd8bea65a7370d2dc)
+++ kernel/generic/src/proc/task.c	(revision 5174c6244d0770039dd3af7483fb578c0f1d5874)
@@ -151,5 +151,4 @@
 	atomic_set(&task->refcount, 0);
 	atomic_set(&task->lifecount, 0);
-	atomic_set(&task->active_calls, 0);
 	
 	irq_spinlock_initialize(&task->lock, "task_t_lock");
@@ -478,6 +477,6 @@
 #ifdef __32_BITS__
 	if (*additional)
-		printf("%-8" PRIu64 " %9" PRIua " %7" PRIua, task->taskid,
-		    atomic_get(&task->refcount), atomic_get(&task->active_calls));
+		printf("%-8" PRIu64 " %9" PRIua, task->taskid,
+		    atomic_get(&task->refcount));
 	else
 		printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %10p %10p"
@@ -490,7 +489,6 @@
 	if (*additional)
 		printf("%-8" PRIu64 " %9" PRIu64 "%c %9" PRIu64 "%c "
-		    "%9" PRIua " %7" PRIua,
-		    task->taskid, ucycles, usuffix, kcycles, ksuffix,
-		    atomic_get(&task->refcount), atomic_get(&task->active_calls));
+		    "%9" PRIua, task->taskid, ucycles, usuffix, kcycles,
+		    ksuffix, atomic_get(&task->refcount));
 	else
 		printf("%-8" PRIu64 " %-14s %-5" PRIu32 " %18p %18p\n",
Index: uspace/srv/devman/devman.c
===================================================================
--- uspace/srv/devman/devman.c	(revision b9eb93fee84439138da39f6dd8bea65a7370d2dc)
+++ uspace/srv/devman/devman.c	(revision 5174c6244d0770039dd3af7483fb578c0f1d5874)
@@ -686,6 +686,4 @@
 }
 
-static FIBRIL_MUTEX_INITIALIZE(add_device_guard);
-
 /** Pass a device to running driver.
  *
@@ -695,6 +693,4 @@
 void add_device(int phone, driver_t *drv, node_t *node, dev_tree_t *tree)
 {
-	fibril_mutex_lock(&add_device_guard);
-
 	/*
 	 * We do not expect to have driver's mutex locked as we do not
@@ -727,6 +723,4 @@
 	/* Wait for answer from the driver. */
 	async_wait_for(req, &rc);
-
-	fibril_mutex_unlock(&add_device_guard);
 
 	switch(rc) {
