Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision 708ae384ef22961b8c1c67282cb1dc6024011687)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 51239d1bcb080220bfd945121b0fc26dce06311a)
@@ -33,4 +33,5 @@
 // CFA Includes
 #include "kernel/private.hfa"
+#include "iofwd.hfa"
 #include "startup.hfa"					// STARTUP_PRIORITY_XXX
 #include "limits.hfa"
@@ -97,4 +98,6 @@
 extern void __kernel_alarm_startup(void);
 extern void __kernel_alarm_shutdown(void);
+extern void __cfa_io_start( processor * );
+extern void __cfa_io_stop ( processor * );
 
 //-----------------------------------------------------------------------------
@@ -111,4 +114,6 @@
 KERNEL_STORAGE(__stack_t,            mainThreadCtx);
 KERNEL_STORAGE(__scheduler_RWLock_t, __scheduler_lock);
+KERNEL_STORAGE(eventfd_t,            mainIdleEventFd);
+KERNEL_STORAGE(io_future_t,          mainIdleFuture);
 #if !defined(__CFA_NO_STATISTICS__)
 KERNEL_STORAGE(__stats_t, mainProcStats);
@@ -224,5 +229,10 @@
 	(*mainProcessor){};
 
+	mainProcessor->idle_wctx.rdbuf = &storage_mainIdleEventFd;
+	mainProcessor->idle_wctx.ftr   = (io_future_t*)&storage_mainIdleFuture;
+	/* paranoid */ verify( sizeof(storage_mainIdleEventFd) == sizeof(eventfd_t) );
+
 	register_tls( mainProcessor );
+	__cfa_io_start( mainProcessor );
 
 	// Start by initializing the main thread
@@ -304,4 +314,5 @@
 	mainProcessor->local_data = 0p;
 
+	__cfa_io_stop( mainProcessor );
 	unregister_tls( mainProcessor );
 
@@ -355,4 +366,13 @@
 	register_tls( proc );
 
+	__cfa_io_start( proc );
+
+	// used for idle sleep when io_uring is present
+	io_future_t future;
+	eventfd_t idle_buf;
+	proc->idle_wctx.ftr = &future;
+	proc->idle_wctx.rdbuf = &idle_buf;
+
+
 	// SKULLDUGGERY: We want to create a context for the processor coroutine
 	// which is needed for the 2-step context switch. However, there is no reason
@@ -381,4 +401,6 @@
 	// Main routine of the core returned, the core is now fully terminated
 	__cfadbg_print_safe(runtime_core, "Kernel : core %p main ended (%p)\n", proc, &proc->runner);
+
+	__cfa_io_stop( proc );
 
 	#if !defined(__CFA_NO_STATISTICS__)
@@ -532,15 +554,15 @@
 	this.local_data = 0p;
 
-	this.idle_fd = eventfd(0, 0);
-	if (idle_fd < 0) {
+	idle_wctx.evfd = eventfd(0, 0);
+	if (idle_wctx.evfd < 0) {
 		abort("KERNEL ERROR: PROCESSOR EVENTFD - %s\n", strerror(errno));
 	}
 
-	this.idle_wctx.fd = 0;
+	idle_wctx.sem = 0;
 
 	// I'm assuming these two are reserved for standard input and output
 	// so I'm using them as sentinels with idle_wctx.
-	/* paranoid */ verify( this.idle_fd != 0 );
-	/* paranoid */ verify( this.idle_fd != 1 );
+	/* paranoid */ verify( idle_wctx.evfd != 0 );
+	/* paranoid */ verify( idle_wctx.evfd != 1 );
 
 	#if !defined(__CFA_NO_STATISTICS__)
@@ -554,5 +576,5 @@
 // Not a ctor, it just preps the destruction but should not destroy members
 static void deinit(processor & this) {
-	close(this.idle_fd);
+	close(this.idle_wctx.evfd);
 }
 
