Index: uspace/lib/libc/generic/fibril_sync.c
===================================================================
--- uspace/lib/libc/generic/fibril_sync.c	(revision 92d34f0bb50f9375034e4a22900906fe7a043f91)
+++ uspace/lib/libc/generic/fibril_sync.c	(revision 9ae22ba11c1a294894242607929d65e81a3c524b)
@@ -72,7 +72,6 @@
 }
 
-void fibril_mutex_unlock(fibril_mutex_t *fm)
-{
-	futex_down(&async_futex);
+static void _fibril_mutex_unlock_unsafe(fibril_mutex_t *fm)
+{
 	assert(fm->counter <= 0);
 	if (fm->counter++ < 0) {
@@ -86,4 +85,10 @@
 		fibril_add_ready((fid_t) f);
 	}
+}
+
+void fibril_mutex_unlock(fibril_mutex_t *fm)
+{
+	futex_down(&async_futex);
+	_fibril_mutex_unlock_unsafe(fm);
 	futex_up(&async_futex);
 }
@@ -168,4 +173,46 @@
 }
 
+void fibril_condvar_initialize(fibril_condvar_t *fcv)
+{
+	list_initialize(&fcv->waiters);
+}
+
+void fibril_condvar_wait(fibril_condvar_t *fcv, fibril_mutex_t *fm)
+{
+	fibril_t *f = (fibril_t *) fibril_get_id();
+
+	futex_down(&async_futex);
+	list_append(&f->link, &fcv->waiters);
+	_fibril_mutex_unlock_unsafe(fm);
+	fibril_switch(FIBRIL_TO_MANAGER);
+	fibril_mutex_lock(fm);
+}
+
+static void _fibril_condvar_wakeup_common(fibril_condvar_t *fcv, bool once)
+{
+	link_t *tmp;
+	fibril_t *f;
+
+	futex_down(&async_futex);
+	while (!list_empty(&fcv->waiters)) {
+		tmp = fcv->waiters.next;
+		f = list_get_instance(tmp, fibril_t, link);
+		fibril_add_ready((fid_t) f);
+		if (once)
+			break;
+	}
+	futex_up(&async_futex);
+}
+
+void fibril_condvar_signal(fibril_condvar_t *fcv)
+{
+	_fibril_condvar_wakeup_common(fcv, true);
+}
+
+void fibril_condvar_broadcast(fibril_condvar_t *fcv)
+{
+	_fibril_condvar_wakeup_common(fcv, false);
+}
+
 /** @}
  */
Index: uspace/lib/libc/include/fibril_sync.h
===================================================================
--- uspace/lib/libc/include/fibril_sync.h	(revision 92d34f0bb50f9375034e4a22900906fe7a043f91)
+++ uspace/lib/libc/include/fibril_sync.h	(revision 9ae22ba11c1a294894242607929d65e81a3c524b)
@@ -71,4 +71,8 @@
 	}
 
+typedef struct {
+	link_t waiters;
+} fibril_condvar_t;
+
 extern void fibril_mutex_initialize(fibril_mutex_t *);
 extern void fibril_mutex_lock(fibril_mutex_t *);
@@ -82,4 +86,9 @@
 extern void fibril_rwlock_write_unlock(fibril_rwlock_t *);
 
+extern void fibril_condvar_initialize(fibril_condvar_t *);
+extern void fibril_condvar_wait(fibril_condvar_t *, fibril_mutex_t *);
+extern void fibril_condvar_signal(fibril_condvar_t *);
+extern void fibril_condvar_broadcast(fibril_condvar_t *);
+
 #endif
 
