Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision 28d426a019853970a77b640d285282d70c78566e)
+++ libcfa/src/concurrency/io.cfa	(revision e9c0b4c888f358d2f8bdd9e67817fc67b133d7a9)
@@ -40,4 +40,5 @@
 	#include "kernel.hfa"
 	#include "kernel/fwd.hfa"
+	#include "kernel_private.hfa"
 	#include "io/types.hfa"
 
@@ -89,7 +90,9 @@
 	static inline unsigned __flush( struct $io_context & );
 	static inline __u32 __release_sqes( struct $io_context & );
+	extern void __kernel_unpark( $thread * thrd );
 
 	bool __cfa_io_drain( processor * proc ) {
 		/* paranoid */ verify( ! __preemption_enabled() );
+		/* paranoid */ verify( ready_schedule_islocked() );
 		/* paranoid */ verify( proc );
 		/* paranoid */ verify( proc->io.ctx );
@@ -115,5 +118,5 @@
 			__cfadbg_print_safe( io, "Kernel I/O : Syscall completed : cqe %p, result %d for %p\n", &cqe, cqe.res, future );
 
-			fulfil( *future, cqe.res );
+			__kernel_unpark( fulfil( *future, cqe.res, false ) );
 		}
 
@@ -124,4 +127,5 @@
 		__atomic_store_n( ctx->cq.head, head + count, __ATOMIC_SEQ_CST );
 
+		/* paranoid */ verify( ready_schedule_islocked() );
 		/* paranoid */ verify( ! __preemption_enabled() );
 
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision 28d426a019853970a77b640d285282d70c78566e)
+++ libcfa/src/concurrency/kernel.cfa	(revision e9c0b4c888f358d2f8bdd9e67817fc67b133d7a9)
@@ -551,5 +551,5 @@
 // Scheduler routines
 // KERNEL ONLY
-void __schedule_thread( $thread * thrd ) {
+static void __schedule_thread( $thread * thrd ) {
 	/* paranoid */ verify( ! __preemption_enabled() );
 	/* paranoid */ verify( kernelTLS().this_proc_id );
@@ -659,4 +659,19 @@
 }
 
+void __kernel_unpark( $thread * thrd ) {
+	/* paranoid */ verify( ! __preemption_enabled() );
+	/* paranoid */ verify( ready_schedule_islocked());
+
+	if( !thrd ) return;
+
+	if(__must_unpark(thrd)) {
+		// Wake lost the race,
+		__schedule_thread( thrd );
+	}
+
+	/* paranoid */ verify( ready_schedule_islocked());
+	/* paranoid */ verify( ! __preemption_enabled() );
+}
+
 void unpark( $thread * thrd ) {
 	if( !thrd ) return;
@@ -871,4 +886,5 @@
 
 static inline bool __maybe_io_drain( processor * proc ) {
+	bool ret = false;
 	#if defined(CFA_HAVE_LINUX_IO_URING_H)
 		__cfadbg_print_safe(runtime_core, "Kernel : core %p checking io for ring %d\n", proc, proc->io.ctx->fd);
@@ -879,6 +895,7 @@
 		unsigned tail = *ctx->cq.tail;
 		if(head == tail) return false;
-		return __cfa_io_drain( proc );
+		ret = __cfa_io_drain( proc );
 	#endif
+	return ret;
 }
 
