Index: uspace/app/trace/syscalls.c
===================================================================
--- uspace/app/trace/syscalls.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/app/trace/syscalls.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -46,6 +46,4 @@
 	[SYS_TASK_GET_ID] = { "task_get_id", 1, V_ERRNO },
 	[SYS_TASK_SET_NAME] = { "task_set_name", 2, V_ERRNO },
-	[SYS_FUTEX_SLEEP] = { "futex_sleep_timeout", 3, V_ERRNO },
-	[SYS_FUTEX_WAKEUP] = { "futex_wakeup", 1, V_ERRNO },
 
 	[SYS_AS_AREA_CREATE] = { "as_area_create", 5, V_ERRNO },
Index: uspace/lib/c/generic/async/client.c
===================================================================
--- uspace/lib/c/generic/async/client.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/async/client.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -122,5 +122,5 @@
 #include "../private/fibril.h"
 
-static FIBRIL_RMUTEX_INITIALIZE(message_mutex);
+static fibril_rmutex_t message_mutex;
 
 /** Naming service session */
@@ -173,4 +173,7 @@
 void __async_client_init(void)
 {
+	if (fibril_rmutex_initialize(&message_mutex) != EOK)
+		abort();
+
 	session_ns.iface = 0;
 	session_ns.mgmt = EXCHANGE_ATOMIC;
@@ -186,4 +189,9 @@
 	fibril_mutex_initialize(&session_ns.mutex);
 	session_ns.exchanges = 0;
+}
+
+void __async_client_fini(void)
+{
+	fibril_rmutex_destroy(&message_mutex);
 }
 
Index: uspace/lib/c/generic/async/ports.c
===================================================================
--- uspace/lib/c/generic/async/ports.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/async/ports.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -100,5 +100,5 @@
 
 /** Futex guarding the interface hash table. */
-static FIBRIL_RMUTEX_INITIALIZE(interface_mutex);
+static fibril_rmutex_t interface_mutex;
 static hash_table_t interface_hash_table;
 
@@ -292,6 +292,14 @@
 void __async_ports_init(void)
 {
+	if (fibril_rmutex_initialize(&interface_mutex) != EOK)
+		abort();
+
 	if (!hash_table_create(&interface_hash_table, 0, 0,
 	    &interface_hash_table_ops))
 		abort();
 }
+
+void __async_ports_fini(void)
+{
+	fibril_rmutex_destroy(&interface_mutex);
+}
Index: uspace/lib/c/generic/async/server.c
===================================================================
--- uspace/lib/c/generic/async/server.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/async/server.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -216,9 +216,9 @@
 }
 
-static FIBRIL_RMUTEX_INITIALIZE(client_mutex);
+static fibril_rmutex_t client_mutex;
 static hash_table_t client_hash_table;
 
 // TODO: lockfree notification_queue?
-static FIBRIL_RMUTEX_INITIALIZE(notification_mutex);
+static fibril_rmutex_t notification_mutex;
 static hash_table_t notification_hash_table;
 static LIST_INITIALIZE(notification_queue);
@@ -1013,4 +1013,9 @@
 void __async_server_init(void)
 {
+	if (fibril_rmutex_initialize(&client_mutex) != EOK)
+		abort();
+	if (fibril_rmutex_initialize(&notification_mutex) != EOK)
+		abort();
+
 	if (!hash_table_create(&client_hash_table, 0, 0, &client_hash_table_ops))
 		abort();
@@ -1021,4 +1026,10 @@
 
 	async_create_manager();
+}
+
+void __async_server_fini(void)
+{
+	fibril_rmutex_destroy(&client_mutex);
+	fibril_rmutex_destroy(&notification_mutex);
 }
 
Index: uspace/lib/c/generic/io/kio.c
===================================================================
--- uspace/lib/c/generic/io/kio.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/io/kio.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -38,4 +38,5 @@
 #include <str.h>
 #include <stdint.h>
+#include <stdlib.h>
 #include <errno.h>
 #include <abi/kio.h>
@@ -53,5 +54,16 @@
 	char data[KIO_BUFFER_SIZE];
 	size_t used;
-} kio_buffer = { .futex = FUTEX_INITIALIZER, };
+} kio_buffer;
+
+void __kio_init(void)
+{
+	if (futex_initialize(&kio_buffer.futex, 1) != EOK)
+		abort();
+}
+
+void __kio_fini(void)
+{
+	futex_destroy(&kio_buffer.futex);
+}
 
 errno_t kio_write(const void *buf, size_t size, size_t *nwritten)
Index: uspace/lib/c/generic/libc.c
===================================================================
--- uspace/lib/c/generic/libc.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/libc.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -40,8 +40,10 @@
 #include <tls.h>
 #include <fibril.h>
+#include <fibril_synch.h>
 #include <task.h>
 #include <loader/pcb.h>
 #include <vfs/vfs.h>
 #include <vfs/inbox.h>
+#include <io/kio.h>
 #include "private/libc.h"
 #include "private/async.h"
@@ -61,4 +63,6 @@
 void __libc_main(void *pcb_ptr)
 {
+	__kio_init();
+
 	assert(!__tcb_is_set());
 
@@ -81,4 +85,5 @@
 
 	__fibrils_init();
+	__fibril_synch_init();
 
 	/* Initialize the fibril. */
@@ -148,4 +153,18 @@
 }
 
+void __libc_fini(void)
+{
+	__async_client_fini();
+	__async_server_fini();
+	__async_ports_fini();
+
+	__fibril_synch_fini();
+	__fibrils_fini();
+
+	__malloc_fini();
+
+	__kio_fini();
+}
+
 void __libc_exit(int status)
 {
Index: uspace/lib/c/generic/malloc.c
===================================================================
--- uspace/lib/c/generic/malloc.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/malloc.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -195,5 +195,5 @@
 
 /** Futex for thread-safe heap manipulation */
-static FIBRIL_RMUTEX_INITIALIZE(malloc_mutex);
+static fibril_rmutex_t malloc_mutex;
 
 #define malloc_assert(expr) safe_assert(expr)
@@ -484,6 +484,14 @@
 void __malloc_init(void)
 {
+	if (fibril_rmutex_initialize(&malloc_mutex) != EOK)
+		abort();
+
 	if (!area_create(PAGE_SIZE))
 		abort();
+}
+
+void __malloc_fini(void)
+{
+	fibril_rmutex_destroy(&malloc_mutex);
 }
 
Index: uspace/lib/c/generic/private/async.h
===================================================================
--- uspace/lib/c/generic/private/async.h	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/private/async.h	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -95,6 +95,9 @@
 
 extern void __async_server_init(void);
+extern void __async_server_fini(void);
 extern void __async_client_init(void);
+extern void __async_client_fini(void);
 extern void __async_ports_init(void);
+extern void __async_ports_fini(void);
 
 extern errno_t async_create_port_internal(iface_t, async_port_handler_t,
Index: uspace/lib/c/generic/private/fibril.h
===================================================================
--- uspace/lib/c/generic/private/fibril.h	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/private/fibril.h	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -79,4 +79,5 @@
 
 extern void __fibrils_init(void);
+extern void __fibrils_fini(void);
 
 extern void fibril_wait_for(fibril_event_t *);
@@ -120,11 +121,6 @@
 } fibril_rmutex_t;
 
-#define FIBRIL_RMUTEX_INITIALIZER(name) \
-	{ .futex = FUTEX_INITIALIZE(1) }
-
-#define FIBRIL_RMUTEX_INITIALIZE(name) \
-	fibril_rmutex_t name = FIBRIL_RMUTEX_INITIALIZER(name)
-
-extern void fibril_rmutex_initialize(fibril_rmutex_t *);
+extern errno_t fibril_rmutex_initialize(fibril_rmutex_t *);
+extern void fibril_rmutex_destroy(fibril_rmutex_t *);
 extern void fibril_rmutex_lock(fibril_rmutex_t *);
 extern bool fibril_rmutex_trylock(fibril_rmutex_t *);
Index: uspace/lib/c/generic/private/futex.h
===================================================================
--- uspace/lib/c/generic/private/futex.h	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/private/futex.h	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -42,7 +42,11 @@
 #include <time.h>
 #include <fibril.h>
+#include <abi/cap.h>
+#include <abi/synch.h>
 
 typedef struct futex {
 	volatile atomic_int val;
+	volatile cap_waitq_handle_t whandle;
+
 #ifdef CONFIG_DEBUG_FUTEX
 	_Atomic(fibril_t *) owner;
@@ -50,10 +54,18 @@
 } futex_t;
 
-extern void futex_initialize(futex_t *futex, int value);
+extern errno_t futex_initialize(futex_t *futex, int value);
+
+static inline errno_t futex_destroy(futex_t *futex)
+{
+	if (futex->whandle) {
+		errno_t rc;
+		rc = __SYSCALL1(SYS_WAITQ_DESTROY, (sysarg_t) futex->whandle);
+		futex->whandle = CAP_NIL;
+		return rc;
+	}
+	return EOK;
+}
 
 #ifdef CONFIG_DEBUG_FUTEX
-
-#define FUTEX_INITIALIZE(val) { (val) , NULL }
-#define FUTEX_INITIALIZER     FUTEX_INITIALIZE(1)
 
 void __futex_assert_is_locked(futex_t *, const char *);
@@ -74,7 +86,4 @@
 #else
 
-#define FUTEX_INITIALIZE(val) { (val) }
-#define FUTEX_INITIALIZER     FUTEX_INITIALIZE(1)
-
 #define futex_lock(fut)     (void) futex_down((fut))
 #define futex_trylock(fut)  futex_trydown((fut))
@@ -86,4 +95,9 @@
 
 #endif
+
+static inline errno_t futex_allocate_waitq(futex_t *futex)
+{
+	return __SYSCALL1(SYS_WAITQ_CREATE, (sysarg_t) &futex->whandle);
+}
 
 /** Down the futex with timeout, composably.
@@ -107,4 +121,6 @@
 {
 	// TODO: Add tests for this.
+
+	assert(futex->whandle != CAP_NIL);
 
 	if (atomic_fetch_sub_explicit(&futex->val, 1, memory_order_acquire) > 0)
@@ -132,5 +148,6 @@
 	}
 
-	return __SYSCALL2(SYS_FUTEX_SLEEP, (sysarg_t) futex, (sysarg_t) timeout);
+	return __SYSCALL3(SYS_WAITQ_SLEEP, (sysarg_t) futex->whandle,
+	    (sysarg_t) timeout, (sysarg_t) SYNCH_FLAGS_FUTEX);
 }
 
@@ -147,5 +164,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;
Index: uspace/lib/c/generic/private/malloc.h
===================================================================
--- uspace/lib/c/generic/private/malloc.h	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/private/malloc.h	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -37,4 +37,5 @@
 
 extern void __malloc_init(void);
+extern void __malloc_fini(void);
 
 #endif
Index: uspace/lib/c/generic/thread/fibril.c
===================================================================
--- uspace/lib/c/generic/thread/fibril.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/thread/fibril.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -87,5 +87,5 @@
 
 /* This futex serializes access to global data. */
-static futex_t fibril_futex = FUTEX_INITIALIZER;
+static futex_t fibril_futex;
 static futex_t ready_semaphore;
 static long ready_st_count;
@@ -95,5 +95,5 @@
 static LIST_INITIALIZE(timeout_list);
 
-static futex_t ipc_lists_futex = FUTEX_INITIALIZER;
+static futex_t ipc_lists_futex;
 static LIST_INITIALIZE(ipc_waiter_list);
 static LIST_INITIALIZE(ipc_buffer_list);
@@ -796,5 +796,6 @@
 	if (!multithreaded) {
 		_ready_debug_check();
-		futex_initialize(&ready_semaphore, ready_st_count);
+		if (futex_initialize(&ready_semaphore, ready_st_count) != EOK)
+			abort();
 		multithreaded = true;
 	}
@@ -861,4 +862,9 @@
 void __fibrils_init(void)
 {
+	if (futex_initialize(&fibril_futex, 1) != EOK)
+		abort();
+	if (futex_initialize(&ipc_lists_futex, 1) != EOK)
+		abort();
+
 	/*
 	 * We allow a fixed, small amount of parallelism for IPC reads, but
@@ -876,4 +882,10 @@
 }
 
+void __fibrils_fini(void)
+{
+	futex_destroy(&fibril_futex);
+	futex_destroy(&ipc_lists_futex);
+}
+
 void fibril_usleep(usec_t timeout)
 {
Index: uspace/lib/c/generic/thread/fibril_synch.c
===================================================================
--- uspace/lib/c/generic/thread/fibril_synch.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/thread/fibril_synch.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -51,7 +51,12 @@
 #include "../private/futex.h"
 
-void fibril_rmutex_initialize(fibril_rmutex_t *m)
-{
-	futex_initialize(&m->futex, 1);
+errno_t fibril_rmutex_initialize(fibril_rmutex_t *m)
+{
+	return futex_initialize(&m->futex, 1);
+}
+
+void fibril_rmutex_destroy(fibril_rmutex_t *m)
+{
+	futex_destroy(&m->futex);
 }
 
@@ -85,5 +90,16 @@
 static fibril_local bool deadlocked = false;
 
-static futex_t fibril_synch_futex = FUTEX_INITIALIZER;
+static futex_t fibril_synch_futex;
+
+void __fibril_synch_init(void)
+{
+	if (futex_initialize(&fibril_synch_futex, 1) != EOK)
+		abort();
+}
+
+void __fibril_synch_fini(void)
+{
+	futex_destroy(&fibril_synch_futex);
+}
 
 typedef struct {
Index: uspace/lib/c/generic/thread/futex.c
===================================================================
--- uspace/lib/c/generic/thread/futex.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/thread/futex.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -49,8 +49,11 @@
  * @param val   Initialization value.
  *
+ * @return      Error code.
  */
-void futex_initialize(futex_t *futex, int val)
+errno_t futex_initialize(futex_t *futex, int val)
 {
 	atomic_store_explicit(&futex->val, val, memory_order_relaxed);
+	futex->whandle = CAP_NIL;
+	return futex_allocate_waitq(futex);
 }
 
Index: uspace/lib/c/generic/thread/mpsc.c
===================================================================
--- uspace/lib/c/generic/thread/mpsc.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/generic/thread/mpsc.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -80,6 +80,12 @@
 	}
 
+	if (fibril_rmutex_initialize(&q->t_lock) != EOK) {
+		free(q);
+		free(n);
+		free(c);
+		return NULL;
+	}
+
 	q->elem_size = elem_size;
-	fibril_rmutex_initialize(&q->t_lock);
 	q->head = q->tail = n;
 	q->close_node = c;
@@ -97,5 +103,5 @@
 	}
 
-	// TODO: fibril_rmutex_destroy()
+	fibril_rmutex_destroy(&q->t_lock);
 
 	free(q);
Index: uspace/lib/c/include/fibril_synch.h
===================================================================
--- uspace/lib/c/include/fibril_synch.h	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/include/fibril_synch.h	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -164,4 +164,7 @@
 	fibril_semaphore_t name = FIBRIL_SEMAPHORE_INITIALIZER(name, cnt)
 
+extern void __fibril_synch_init(void);
+extern void __fibril_synch_fini(void);
+
 extern void fibril_mutex_initialize(fibril_mutex_t *);
 extern void fibril_mutex_lock(fibril_mutex_t *);
Index: uspace/lib/c/include/io/kio.h
===================================================================
--- uspace/lib/c/include/io/kio.h	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/include/io/kio.h	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -42,4 +42,6 @@
 #include <_bits/size_t.h>
 
+extern void __kio_init(void);
+extern void __kio_fini(void);
 extern errno_t kio_write(const void *, size_t, size_t *);
 extern void kio_update(void);
Index: uspace/lib/c/include/libc.h
===================================================================
--- uspace/lib/c/include/libc.h	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/lib/c/include/libc.h	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -62,4 +62,6 @@
 	__syscall6(p1, p2, p3, p4, p5, p6, id)
 
+extern void __libc_fini(void);
+
 #endif
 
Index: uspace/srv/loader/main.c
===================================================================
--- uspace/srv/loader/main.c	(revision a5c468e1202a50cf26350e4a4d16303bc7323265)
+++ uspace/srv/loader/main.c	(revision aaa3c4571e7747f21c303ea4c746fe2ef17a5ae8)
@@ -59,4 +59,5 @@
 #include <vfs/vfs.h>
 #include <vfs/inbox.h>
+#include <libc.h>
 
 #ifdef CONFIG_RTLD
@@ -357,4 +358,5 @@
 	DPRINTF("Jump to entry point at %p\n", pcb.entry);
 
+	__libc_fini();
 	__tcb_reset();
 	entry_point_jmp(prog_info.finfo.entry, &pcb);
