Index: uspace/lib/c/generic/private/futex.h
===================================================================
--- uspace/lib/c/generic/private/futex.h	(revision 42da5ed63dc4e81e1aed2c903e5dbd1b1045978c)
+++ uspace/lib/c/generic/private/futex.h	(revision 0b5203bfbdafa8ef8abc2bd7521c6fd282f677e9)
@@ -42,7 +42,11 @@
 #include <time.h>
 #include <fibril.h>
+#include <abi/cap.h>
 
 typedef struct futex {
 	volatile atomic_int val;
+	volatile atomic_int alloc_lock;
+	cap_waitq_handle_t whandle;
+
 #ifdef CONFIG_DEBUG_FUTEX
 	_Atomic(fibril_t *) owner;
@@ -54,5 +58,5 @@
 #ifdef CONFIG_DEBUG_FUTEX
 
-#define FUTEX_INITIALIZE(val) { (val) , NULL }
+#define FUTEX_INITIALIZE(val) { (val), 0, CAP_NIL, NULL }
 #define FUTEX_INITIALIZER     FUTEX_INITIALIZE(1)
 
@@ -74,5 +78,5 @@
 #else
 
-#define FUTEX_INITIALIZE(val) { (val) }
+#define FUTEX_INITIALIZE(val) { (val), 0, CAP_NIL }
 #define FUTEX_INITIALIZER     FUTEX_INITIALIZE(1)
 
@@ -132,5 +136,24 @@
 	}
 
-	return __SYSCALL2(SYS_FUTEX_SLEEP, (sysarg_t) futex, (sysarg_t) timeout);
+	if (futex->whandle == CAP_NIL) {
+		while (atomic_exchange_explicit(&futex->alloc_lock, 1,
+		    memory_order_acquire) == 1)
+			;
+		if (futex->whandle == CAP_NIL) {
+			errno_t rc = __SYSCALL1(SYS_WAITQ_CREATE,
+			    (sysarg_t) &futex->whandle);
+			if (rc != EOK) {
+				atomic_store_explicit(&futex->alloc_lock, 0,
+				    memory_order_release);
+				return rc;
+			}
+		}
+
+		atomic_store_explicit(&futex->alloc_lock, 0,
+		    memory_order_release);
+	}
+
+	return __SYSCALL2(SYS_WAITQ_SLEEP, (sysarg_t) futex->whandle,
+	    (sysarg_t) timeout);
 }
 
@@ -147,5 +170,5 @@
 {
 	if (atomic_fetch_add_explicit(&futex->val, 1, memory_order_release) < 0)
-		return __SYSCALL1(SYS_FUTEX_WAKEUP, (sysarg_t) futex);
+		return __SYSCALL1(SYS_WAITQ_WAKEUP, (sysarg_t) futex->whandle);
 
 	return EOK;
