Index: uspace/lib/libc/generic/async.c
===================================================================
--- uspace/lib/libc/generic/async.c	(revision 057d21af95b6d9e801a14c4a6e6e4a784ad3dfd7)
+++ uspace/lib/libc/generic/async.c	(revision 22af3af6cb9bbb2335fef06631a73e0986dbe193)
@@ -106,4 +106,7 @@
 
 atomic_t async_futex = FUTEX_INITIALIZER;
+
+/** Number of threads waiting for IPC in the kernel. */
+atomic_t threads_in_ipc_wait = { 0 };
 
 /** Structures of this type represent a waiting fibril. */
@@ -683,4 +686,6 @@
 		
 		futex_up(&async_futex);
+
+		atomic_inc(&threads_in_ipc_wait);
 		
 		ipc_call_t call;
@@ -688,4 +693,6 @@
 		    SYNCH_FLAGS_NONE);
 		
+		atomic_dec(&threads_in_ipc_wait);
+
 		if (!callid) {
 			handle_expired_timeouts();
Index: uspace/lib/libc/generic/fibril_sync.c
===================================================================
--- uspace/lib/libc/generic/fibril_sync.c	(revision 057d21af95b6d9e801a14c4a6e6e4a784ad3dfd7)
+++ uspace/lib/libc/generic/fibril_sync.c	(revision 22af3af6cb9bbb2335fef06631a73e0986dbe193)
@@ -40,4 +40,17 @@
 #include <assert.h>
 
+static void optimize_execution_power(void)
+{
+	/*
+	 * When waking up a worker fibril previously blocked in fibril
+	 * synchronization, chances are that there is an idle manager fibril
+	 * waiting for IPC, that could start executing the awakened worker
+	 * fibril right away. We try to detect this and bring the manager
+	 * fibril back to fruitful work.
+	 */
+	if (atomic_get(&threads_in_ipc_wait) > 0)
+		ipc_poke();
+}
+
 void fibril_mutex_initialize(fibril_mutex_t *fm)
 {
@@ -84,4 +97,5 @@
 		list_remove(&f->link);
 		fibril_add_ready((fid_t) f);
+		optimize_execution_power();
 	}
 }
@@ -152,4 +166,5 @@
 			fibril_add_ready((fid_t) f);
 			frw->writers++;
+			optimize_execution_power();
 			break;
 		} else {
@@ -157,4 +172,5 @@
 			fibril_add_ready((fid_t) f);
 			frw->readers++;
+			optimize_execution_power();
 		}
 	}
@@ -200,4 +216,5 @@
 		list_remove(&f->link);
 		fibril_add_ready((fid_t) f);
+		optimize_execution_power();
 		if (once)
 			break;
