Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision f90d10f6231d45b51da6ee971349890424aad7a5)
+++ libcfa/src/concurrency/io.cfa	(revision b6f2b21339681ee650b521e2f3401045733b2ae8)
@@ -20,5 +20,5 @@
 
 #if !defined(HAVE_LINUX_IO_URING_H)
-	void __kernel_io_startup( cluster &, bool ) {
+	void __kernel_io_startup( cluster &, int, bool ) {
 		// Nothing to do without io_uring
 	}
@@ -182,5 +182,6 @@
 		struct __submition_data submit_q;
 		struct __completion_data completion_q;
-		uint32_t flags;
+		uint32_t ring_flags;
+		int cltr_flags;
 		int fd;
 		semaphore submit;
@@ -199,5 +200,5 @@
 // I/O Startup / Shutdown logic
 //=============================================================================================
-	void __kernel_io_startup( cluster & this, bool main_cluster ) {
+	void __kernel_io_startup( cluster & this, int io_flags, bool main_cluster ) {
 		this.io = malloc();
 
@@ -294,7 +295,8 @@
 
 		// Update the global ring info
-		this.io->flags = params.flags;
-		this.io->fd    = fd;
-		this.io->done  = false;
+		this.io->ring_flags = params.flags;
+		this.io->cltr_flags = io_flags;
+		this.io->fd         = fd;
+		this.io->done       = false;
 		(this.io->submit){ min(*sq.num, *cq.num) };
 
@@ -314,7 +316,9 @@
 
 	void __kernel_io_finish_start( cluster & this ) {
-		__cfadbg_print_safe(io_core, "Kernel I/O : Creating fast poller for cluter %p\n", &this);
-		(this.io->poller.fast){ this };
-		__thrd_start( this.io->poller.fast, main );
+		if( this.io->cltr_flags & CFA_CLUSTER_IO_POLLER_USER_THREAD ) {
+			__cfadbg_print_safe(io_core, "Kernel I/O : Creating fast poller for cluter %p\n", &this);
+			(this.io->poller.fast){ this };
+			__thrd_start( this.io->poller.fast, main );
+		}
 
 		// Create the poller thread
@@ -339,5 +343,5 @@
 		__cfadbg_print_safe(io_core, "Kernel I/O : Slow poller stopped for cluster\n", &this);
 
-		#if defined(__CFA_IO_POLLING_USER__)
+		if( this.io->cltr_flags & CFA_CLUSTER_IO_POLLER_USER_THREAD ) {
 			verify( this.io->poller.fast.waiting );
 			verify( this.io->poller.fast.thrd.state == Blocked );
@@ -351,5 +355,5 @@
 
 			__cfadbg_print_safe(io_core, "Kernel I/O : Fast poller stopped for cluster\n", &this);
-		#endif
+		}
 	}
 
@@ -473,7 +477,6 @@
 		__cfadbg_print_safe(io_core, "Kernel I/O : Slow poller for ring %p ready\n", &ring);
 
-		while(!__atomic_load_n(&ring.done, __ATOMIC_SEQ_CST)) {
-			#if defined(__CFA_IO_POLLING_USER__)
-
+		if( ring.cltr_flags & CFA_CLUSTER_IO_POLLER_USER_THREAD ) {
+			while(!__atomic_load_n(&ring.done, __ATOMIC_SEQ_CST)) {
 				// In the user-thread approach drain and if anything was drained,
 				// batton pass to the user-thread
@@ -491,7 +494,8 @@
 					wait( ring.poller.sem );
 				}
-
-			#else
-
+			}
+		}
+		else {
+			while(!__atomic_load_n(&ring.done, __ATOMIC_SEQ_CST)) {
 				//In the naive approach, just poll the io completion queue directly
 				int count = __drain_io( ring, &mask, 1, true );
@@ -502,6 +506,5 @@
 					ring.completion_q.stats.completed_avg.slow_cnt += 1;
 				#endif
-
-			#endif
+			}
 		}
 
@@ -512,4 +515,6 @@
 
 	void main( __io_poller_fast & this ) {
+		verify( this.ring->cltr_flags & CFA_CLUSTER_IO_POLLER_USER_THREAD );
+
 		// Start parked
 		park( __cfaabi_dbg_ctx );
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision f90d10f6231d45b51da6ee971349890424aad7a5)
+++ libcfa/src/concurrency/kernel.cfa	(revision b6f2b21339681ee650b521e2f3401045733b2ae8)
@@ -254,5 +254,5 @@
 }
 
-void ?{}(cluster & this, const char name[], Duration preemption_rate) with( this ) {
+void ?{}(cluster & this, const char name[], Duration preemption_rate, int io_flags) with( this ) {
 	this.name = name;
 	this.preemption_rate = preemption_rate;
@@ -268,5 +268,5 @@
 	threads{ __get };
 
-	__kernel_io_startup( this, &this == mainCluster );
+	__kernel_io_startup( this, io_flags, &this == mainCluster );
 
 	doregister(this);
Index: libcfa/src/concurrency/kernel.hfa
===================================================================
--- libcfa/src/concurrency/kernel.hfa	(revision f90d10f6231d45b51da6ee971349890424aad7a5)
+++ libcfa/src/concurrency/kernel.hfa	(revision b6f2b21339681ee650b521e2f3401045733b2ae8)
@@ -116,4 +116,7 @@
 struct __io_data;
 
+#define CFA_CLUSTER_IO_POLLER_USER_THREAD 1 << 0
+// #define CFA_CLUSTER_IO_POLLER_KERNEL_SIDE 1 << 1
+
 //-----------------------------------------------------------------------------
 // Cluster
@@ -156,10 +159,13 @@
 extern Duration default_preemption();
 
-void ?{} (cluster & this, const char name[], Duration preemption_rate);
+void ?{} (cluster & this, const char name[], Duration preemption_rate, int flags);
 void ^?{}(cluster & this);
 
-static inline void ?{} (cluster & this)                           { this{"Anonymous Cluster", default_preemption()}; }
-static inline void ?{} (cluster & this, Duration preemption_rate) { this{"Anonymous Cluster", preemption_rate}; }
-static inline void ?{} (cluster & this, const char name[])        { this{name, default_preemption()}; }
+static inline void ?{} (cluster & this)                                      { this{"Anonymous Cluster", default_preemption(), 0}; }
+static inline void ?{} (cluster & this, Duration preemption_rate)            { this{"Anonymous Cluster", preemption_rate, 0}; }
+static inline void ?{} (cluster & this, const char name[])                   { this{name, default_preemption(), 0}; }
+static inline void ?{} (cluster & this, int flags)                           { this{"Anonymous Cluster", default_preemption(), flags}; }
+static inline void ?{} (cluster & this, Duration preemption_rate, int flags) { this{"Anonymous Cluster", preemption_rate, flags}; }
+static inline void ?{} (cluster & this, const char name[], int flags)        { this{name, default_preemption(), flags}; }
 
 static inline [cluster *&, cluster *& ] __get( cluster & this ) __attribute__((const)) { return this.node.[next, prev]; }
Index: libcfa/src/concurrency/kernel_private.hfa
===================================================================
--- libcfa/src/concurrency/kernel_private.hfa	(revision f90d10f6231d45b51da6ee971349890424aad7a5)
+++ libcfa/src/concurrency/kernel_private.hfa	(revision b6f2b21339681ee650b521e2f3401045733b2ae8)
@@ -77,5 +77,5 @@
 //-----------------------------------------------------------------------------
 // I/O
-void __kernel_io_startup     ( cluster &, bool );
+void __kernel_io_startup     ( cluster &, int, bool );
 void __kernel_io_finish_start( cluster & );
 void __kernel_io_prepare_stop( cluster & );
