Index: uspace/lib/c/generic/async/client.c
===================================================================
--- uspace/lib/c/generic/async/client.c	(revision efa3136385a610d2f83fa95aec41b40b7217ccb2)
+++ uspace/lib/c/generic/async/client.c	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
@@ -122,4 +122,6 @@
 #include "../private/fibril.h"
 
+static FIBRIL_RMUTEX_INITIALIZE(message_mutex);
+
 /** Naming service session */
 async_sess_t session_ns;
@@ -204,5 +206,5 @@
 		return;
 
-	futex_lock(&async_futex);
+	fibril_rmutex_lock(&message_mutex);
 
 	msg->retval = IPC_GET_RETVAL(*data);
@@ -220,5 +222,5 @@
 	}
 
-	futex_unlock(&async_futex);
+	fibril_rmutex_unlock(&message_mutex);
 }
 
@@ -390,5 +392,5 @@
 	assert(!msg->forget);
 
-	futex_lock(&async_futex);
+	fibril_rmutex_lock(&message_mutex);
 
 	if (msg->done) {
@@ -399,5 +401,5 @@
 	}
 
-	futex_unlock(&async_futex);
+	fibril_rmutex_unlock(&message_mutex);
 }
 
Index: uspace/lib/c/generic/async/server.c
===================================================================
--- uspace/lib/c/generic/async/server.c	(revision efa3136385a610d2f83fa95aec41b40b7217ccb2)
+++ uspace/lib/c/generic/async/server.c	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
@@ -111,5 +111,4 @@
 #include <errno.h>
 #include <sys/time.h>
-#include <libarch/barrier.h>
 #include <stdbool.h>
 #include <stdlib.h>
@@ -125,7 +124,4 @@
 #define DPRINTF(...)  ((void) 0)
 
-/** Async framework global futex */
-futex_t async_futex = FUTEX_INITIALIZER;
-
 /** Call data */
 typedef struct {
@@ -250,5 +246,5 @@
 static sysarg_t notification_avail = 0;
 
-/* The remaining structures are guarded by async_futex. */
+static FIBRIL_RMUTEX_INITIALIZE(conn_mutex);
 static hash_table_t conn_hash_table;
 
@@ -430,10 +426,10 @@
 	 * Remove myself from the connection hash table.
 	 */
-	futex_lock(&async_futex);
+	fibril_rmutex_lock(&conn_mutex);
 	hash_table_remove(&conn_hash_table, &(conn_key_t){
 		.task_id = fibril_connection->in_task_id,
 		.phone_hash = fibril_connection->in_phone_hash
 	});
-	futex_unlock(&async_futex);
+	fibril_rmutex_unlock(&conn_mutex);
 
 	/*
@@ -517,9 +513,9 @@
 	/* Add connection to the connection hash table */
 
-	futex_lock(&async_futex);
+	fibril_rmutex_lock(&conn_mutex);
 	hash_table_insert(&conn_hash_table, &conn->link);
-	futex_unlock(&async_futex);
-
-	fibril_add_ready(conn->fid);
+	fibril_rmutex_unlock(&conn_mutex);
+
+	fibril_start(conn->fid);
 
 	return conn->fid;
@@ -618,5 +614,5 @@
 	assert(call);
 
-	futex_lock(&async_futex);
+	fibril_rmutex_lock(&conn_mutex);
 
 	ht_link_t *link = hash_table_find(&conn_hash_table, &(conn_key_t){
@@ -625,5 +621,5 @@
 	});
 	if (!link) {
-		futex_unlock(&async_futex);
+		fibril_rmutex_unlock(&conn_mutex);
 		return false;
 	}
@@ -634,5 +630,5 @@
 	msg_t *msg = malloc(sizeof(*msg));
 	if (!msg) {
-		futex_unlock(&async_futex);
+		fibril_rmutex_unlock(&conn_mutex);
 		return false;
 	}
@@ -644,8 +640,8 @@
 		conn->close_chandle = call->cap_handle;
 
+	fibril_rmutex_unlock(&conn_mutex);
+
 	/* If the connection fibril is waiting for an event, activate it */
 	fibril_notify(&conn->msg_arrived);
-
-	futex_unlock(&async_futex);
 	return true;
 }
@@ -960,5 +956,5 @@
 	}
 
-	futex_lock(&async_futex);
+	fibril_rmutex_lock(&conn_mutex);
 
 	/* If nothing in queue, wait until something arrives */
@@ -974,10 +970,10 @@
 			memset(call, 0, sizeof(ipc_call_t));
 			IPC_SET_IMETHOD(*call, IPC_M_PHONE_HUNGUP);
-			futex_unlock(&async_futex);
+			fibril_rmutex_unlock(&conn_mutex);
 			return true;
 		}
 
 		// TODO: replace with cvar
-		futex_unlock(&async_futex);
+		fibril_rmutex_unlock(&conn_mutex);
 
 		errno_t rc = fibril_wait_timeout(&conn->msg_arrived, expires);
@@ -985,5 +981,5 @@
 			return false;
 
-		futex_lock(&async_futex);
+		fibril_rmutex_lock(&conn_mutex);
 	}
 
@@ -995,5 +991,5 @@
 	free(msg);
 
-	futex_unlock(&async_futex);
+	fibril_rmutex_unlock(&conn_mutex);
 	return true;
 }
Index: uspace/lib/c/generic/fibril_synch.c
===================================================================
--- uspace/lib/c/generic/fibril_synch.c	(revision efa3136385a610d2f83fa95aec41b40b7217ccb2)
+++ uspace/lib/c/generic/fibril_synch.c	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
@@ -53,4 +53,6 @@
 static fibril_local bool deadlocked = false;
 
+static futex_t fibril_synch_futex = FUTEX_INITIALIZER;
+
 typedef struct {
 	link_t link;
@@ -96,9 +98,9 @@
 static void check_fibril_for_deadlock(fibril_owner_info_t *oi, fibril_t *fib)
 {
-	futex_assert_is_locked(&async_futex);
+	futex_assert_is_locked(&fibril_synch_futex);
 
 	while (oi && oi->owned_by) {
 		if (oi->owned_by == fib) {
-			futex_unlock(&async_futex);
+			futex_unlock(&fibril_synch_futex);
 			print_deadlock(oi);
 			abort();
@@ -124,9 +126,9 @@
 	fibril_t *f = (fibril_t *) fibril_get_id();
 
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 
 	if (fm->counter-- > 0) {
 		fm->oi.owned_by = f;
-		futex_unlock(&async_futex);
+		futex_unlock(&fibril_synch_futex);
 		return;
 	}
@@ -137,5 +139,5 @@
 	f->waits_for = &fm->oi;
 
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 
 	fibril_wait_for(&wdata.event);
@@ -146,5 +148,5 @@
 	bool locked = false;
 
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	if (fm->counter > 0) {
 		fm->counter--;
@@ -152,5 +154,5 @@
 		locked = true;
 	}
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 
 	return locked;
@@ -177,14 +179,14 @@
 void fibril_mutex_unlock(fibril_mutex_t *fm)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	_fibril_mutex_unlock_unsafe(fm);
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 }
 
 bool fibril_mutex_is_locked(fibril_mutex_t *fm)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	bool locked = (fm->oi.owned_by == (fibril_t *) fibril_get_id());
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 	return locked;
 }
@@ -202,5 +204,5 @@
 	fibril_t *f = (fibril_t *) fibril_get_id();
 
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 
 	if (!frw->writers) {
@@ -208,5 +210,5 @@
 		if (frw->readers++ == 0)
 			frw->oi.owned_by = f;
-		futex_unlock(&async_futex);
+		futex_unlock(&fibril_synch_futex);
 		return;
 	}
@@ -219,5 +221,5 @@
 	f->waits_for = &frw->oi;
 
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 
 	fibril_wait_for(&wdata.event);
@@ -228,10 +230,10 @@
 	fibril_t *f = (fibril_t *) fibril_get_id();
 
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 
 	if (!frw->writers && !frw->readers) {
 		frw->oi.owned_by = f;
 		frw->writers++;
-		futex_unlock(&async_futex);
+		futex_unlock(&fibril_synch_futex);
 		return;
 	}
@@ -244,5 +246,5 @@
 	f->waits_for = &frw->oi;
 
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 
 	fibril_wait_for(&wdata.event);
@@ -306,24 +308,24 @@
 void fibril_rwlock_read_unlock(fibril_rwlock_t *frw)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	assert(frw->readers > 0);
 	_fibril_rwlock_common_unlock(frw);
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 }
 
 void fibril_rwlock_write_unlock(fibril_rwlock_t *frw)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	assert(frw->writers == 1);
 	assert(frw->oi.owned_by == fibril_self());
 	_fibril_rwlock_common_unlock(frw);
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 }
 
 bool fibril_rwlock_is_read_locked(fibril_rwlock_t *frw)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	bool locked = (frw->readers > 0);
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 	return locked;
 }
@@ -331,8 +333,8 @@
 bool fibril_rwlock_is_write_locked(fibril_rwlock_t *frw)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	assert(frw->writers <= 1);
 	bool locked = (frw->writers > 0) && (frw->oi.owned_by == fibril_self());
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 	return locked;
 }
@@ -374,15 +376,15 @@
 	}
 
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	_fibril_mutex_unlock_unsafe(fm);
 	list_append(&wdata.link, &fcv->waiters);
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 
 	(void) fibril_wait_timeout(&wdata.event, expires);
 
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	bool timed_out = link_in_use(&wdata.link);
 	list_remove(&wdata.link);
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 
 	fibril_mutex_lock(fm);
@@ -398,5 +400,5 @@
 void fibril_condvar_signal(fibril_condvar_t *fcv)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 
 	awaiter_t *w = list_pop(&fcv->waiters, awaiter_t, link);
@@ -404,10 +406,10 @@
 		fibril_notify(&w->event);
 
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 }
 
 void fibril_condvar_broadcast(fibril_condvar_t *fcv)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 
 	awaiter_t *w;
@@ -415,5 +417,5 @@
 		fibril_notify(&w->event);
 
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 }
 
@@ -644,5 +646,5 @@
 void fibril_semaphore_up(fibril_semaphore_t *sem)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	sem->count++;
 
@@ -653,5 +655,5 @@
 	}
 
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 }
 
@@ -665,9 +667,9 @@
 void fibril_semaphore_down(fibril_semaphore_t *sem)
 {
-	futex_lock(&async_futex);
+	futex_lock(&fibril_synch_futex);
 	sem->count--;
 
 	if (sem->count >= 0) {
-		futex_unlock(&async_futex);
+		futex_unlock(&fibril_synch_futex);
 		return;
 	}
@@ -676,5 +678,5 @@
 	list_append(&wdata.link, &sem->waiters);
 
-	futex_unlock(&async_futex);
+	futex_unlock(&fibril_synch_futex);
 
 	fibril_wait_for(&wdata.event);
Index: uspace/lib/c/include/ipc/common.h
===================================================================
--- uspace/lib/c/include/ipc/common.h	(revision efa3136385a610d2f83fa95aec41b40b7217ccb2)
+++ uspace/lib/c/include/ipc/common.h	(revision 808026296d66a63b501dc0af9d457077cd81e32b)
@@ -53,6 +53,4 @@
 } ipc_call_t;
 
-extern futex_t async_futex;
-
 #endif
 
