Index: libcfa/src/concurrency/io/call.cfa.in
===================================================================
--- libcfa/src/concurrency/io/call.cfa.in	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
+++ libcfa/src/concurrency/io/call.cfa.in	(revision 426f60c4047b31cdf0e37c53aec7722f2f9b4c8e)
@@ -74,5 +74,5 @@
 	;
 
-	extern [* struct io_uring_sqe, __u32] __submit_alloc( struct __io_data & ring, __u64 data );
+	extern [* volatile struct io_uring_sqe, __u32] __submit_alloc( struct __io_data & ring, __u64 data );
 	extern void __submit( struct io_context * ctx, __u32 idx ) __attribute__((nonnull (1)));
 
@@ -221,5 +221,5 @@
 
 		__u32 idx;
-		struct io_uring_sqe * sqe;
+		volatile struct io_uring_sqe * sqe;
 		[sqe, idx] = __submit_alloc( ring, (__u64)(uintptr_t)&future );
 
@@ -314,4 +314,5 @@
 	Call('ACCEPT', 'int accept4(int sockfd, struct sockaddr *addr, socklen_t *addrlen, int flags)', {
 		'fd': 'sockfd',
+		'ioprio': '0',
 		'addr': '(__u64)addr',
 		'addr2': '(__u64)addrlen',
@@ -373,4 +374,5 @@
 	Call('READ', 'ssize_t read(int fd, void * buf, size_t count)', {
 		'fd': 'fd',
+		'off': '0',
 		'addr': '(__u64)buf',
 		'len': 'count'
@@ -379,4 +381,5 @@
 	Call('WRITE', 'ssize_t write(int fd, void * buf, size_t count)', {
 		'fd': 'fd',
+		'off': '0',
 		'addr': '(__u64)buf',
 		'len': 'count'
@@ -477,5 +480,5 @@
 
 		__u32 idx;
-		struct io_uring_sqe * sqe;
+		volatile struct io_uring_sqe * sqe;
 		[sqe, idx] = __submit_alloc( ring, (__u64)(uintptr_t)&future );
 
Index: libcfa/src/concurrency/io/setup.cfa
===================================================================
--- libcfa/src/concurrency/io/setup.cfa	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
+++ libcfa/src/concurrency/io/setup.cfa	(revision 426f60c4047b31cdf0e37c53aec7722f2f9b4c8e)
@@ -52,4 +52,5 @@
 		#include <pthread.h>
 		#include <sys/epoll.h>
+		#include <sys/eventfd.h>
 		#include <sys/mman.h>
 		#include <sys/syscall.h>
@@ -185,5 +186,5 @@
 				$io_ctx_thread * io_ctx = ($io_ctx_thread *)(uintptr_t)events[i].data.u64;
 				/* paranoid */ verify( io_ctx );
-				__cfadbg_print_safe(io_core, "Kernel I/O - epoll : Unparking io poller %p\n", io_ctx);
+				__cfadbg_print_safe(io_core, "Kernel I/O - epoll : Unparking io poller %d (%p)\n", io_ctx->ring->fd, io_ctx);
 				#if !defined( __CFA_NO_STATISTICS__ )
 					__cfaabi_tls.this_stats = io_ctx->self.curr_cluster->stats;
@@ -309,4 +310,7 @@
 	}
 
+	extern void signal_unblock( int sig );
+	extern void signal_block  ( int sig );
+
 	static void __io_create( __io_data & this, const io_context_params & params_in ) {
 		// Step 1 : call to setup
@@ -377,5 +381,9 @@
 			abort("KERNEL ERROR: IO_URING MMAP3 - %s\n", strerror(errno));
 		}
-
+		memset(sq.sqes, 0xde, size);
+
+		verify( 0 != (params.features & IORING_FEAT_NODROP) );
+
+		// Step 3 : Initialize the data structure
 		// Get the pointers from the kernel to fill the structure
 		// submit queue
@@ -392,5 +400,6 @@
 			const __u32 num = *sq.num;
 			for( i; num ) {
-				sq.sqes[i].user_data = 0ul64;
+				sq.sqes[i].opcode = IORING_OP_LAST;
+				sq.sqes[i].user_data = 3ul64;
 			}
 		}
@@ -422,4 +431,19 @@
 		cq.cqes = (struct io_uring_cqe *)(((intptr_t)cq.ring_ptr) + params.cq_off.cqes);
 
+		signal_block( SIGUSR1 );
+
+		// Step 4 : eventfd
+		int efd = eventfd(0, 0);
+		if (efd < 0) {
+			abort("KERNEL ERROR: IO_URING EVENTFD - %s\n", strerror(errno));
+		}
+
+		int ret = syscall( __NR_io_uring_register, fd, IORING_REGISTER_EVENTFD, &efd, 1);
+		if (ret < 0) {
+			abort("KERNEL ERROR: IO_URING EVENTFD REGISTER - %s\n", strerror(errno));
+		}
+
+		signal_unblock( SIGUSR1 );
+
 		// some paranoid checks
 		/* paranoid */ verifyf( (*cq.mask) == ((*cq.num) - 1ul32), "IO_URING Expected mask to be %u (%u entries), was %u", (*cq.num) - 1ul32, *cq.num, *cq.mask  );
@@ -436,4 +460,5 @@
 		this.ring_flags = params.flags;
 		this.fd         = fd;
+		this.efd        = efd;
 		this.eager_submits  = params_in.eager_submits;
 		this.poller_submits = params_in.poller_submits;
@@ -458,4 +483,5 @@
 		// close the file descriptor
 		close(this.fd);
+		close(this.efd);
 
 		free( this.submit_q.ready ); // Maybe null, doesn't matter
@@ -467,7 +493,7 @@
 
 	void __ioctx_register($io_ctx_thread & ctx, struct epoll_event & ev) {
-		ev.events = EPOLLIN | EPOLLONESHOT;
+		ev.events = EPOLLIN | EPOLLET | EPOLLONESHOT;
 		ev.data.u64 = (__u64)&ctx;
-		int ret = epoll_ctl(iopoll.epollfd, EPOLL_CTL_ADD, ctx.ring->fd, &ev);
+		int ret = epoll_ctl(iopoll.epollfd, EPOLL_CTL_ADD, ctx.ring->efd, &ev);
 		if (ret < 0) {
 			abort( "KERNEL ERROR: EPOLL ADD - (%d) %s\n", (int)errno, strerror(errno) );
@@ -476,6 +502,6 @@
 
 	void __ioctx_prepare_block($io_ctx_thread & ctx, struct epoll_event & ev) {
-		__cfadbg_print_safe(io_core, "Kernel I/O - epoll : Re-arming io poller %p\n", &ctx);
-		int ret = epoll_ctl(iopoll.epollfd, EPOLL_CTL_MOD, ctx.ring->fd, &ev);
+		__cfadbg_print_safe(io_core, "Kernel I/O - epoll : Re-arming io poller %d (%p)\n", ctx.ring->fd, &ctx);
+		int ret = epoll_ctl(iopoll.epollfd, EPOLL_CTL_MOD, ctx.ring->efd, &ev);
 		if (ret < 0) {
 			abort( "KERNEL ERROR: EPOLL REARM - (%d) %s\n", (int)errno, strerror(errno) );
Index: libcfa/src/concurrency/io/types.hfa
===================================================================
--- libcfa/src/concurrency/io/types.hfa	(revision ece0e80868c1aeb44b18903340b03bf43399c6d0)
+++ libcfa/src/concurrency/io/types.hfa	(revision 426f60c4047b31cdf0e37c53aec7722f2f9b4c8e)
@@ -65,5 +65,5 @@
 
 		// A buffer of sqes (not the actual ring)
-		struct io_uring_sqe * sqes;
+		volatile struct io_uring_sqe * sqes;
 
 		// The location and size of the mmaped area
@@ -85,5 +85,5 @@
 
 		// the kernel ring
-		struct io_uring_cqe * cqes;
+		volatile struct io_uring_cqe * cqes;
 
 		// The location and size of the mmaped area
@@ -97,4 +97,5 @@
 		__u32 ring_flags;
 		int fd;
+		int efd;
 		bool eager_submits:1;
 		bool poller_submits:1;
