Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ libcfa/src/concurrency/io.cfa	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -96,16 +96,21 @@
 	static void ioring_syscsll( struct $io_context & ctx, unsigned int min_comp, unsigned int flags ) {
 		__STATS__( true, io.calls.flush++; )
-		int ret = syscall( __NR_io_uring_enter, ctx.fd, ctx.sq.to_submit, min_comp, flags, (sigset_t *)0p, _NSIG / 8);
-		if( ret < 0 ) {
-			switch((int)errno) {
-			case EAGAIN:
-			case EINTR:
-			case EBUSY:
-				// Update statistics
-				__STATS__( false, io.calls.errors.busy ++; )
-				return false;
-			default:
-				abort( "KERNEL ERROR: IO_URING SYSCALL - (%d) %s\n", (int)errno, strerror(errno) );
+		int ret;
+		for() {
+			ret = syscall( __NR_io_uring_enter, ctx.fd, ctx.sq.to_submit, min_comp, flags, (sigset_t *)0p, _NSIG / 8);
+			if( ret < 0 ) {
+				switch((int)errno) {
+				case EINTR:
+					continue;
+				case EAGAIN:
+				case EBUSY:
+					// Update statistics
+					__STATS__( false, io.calls.errors.busy ++; )
+					return false;
+				default:
+					abort( "KERNEL ERROR: IO_URING SYSCALL - (%d) %s\n", (int)errno, strerror(errno) );
+				}
 			}
+			break;
 		}
 
@@ -179,4 +184,5 @@
 		// Ensure that the kernel only sees the new value of the head index after the CQEs have been read.
 		__atomic_store_n( ctx->cq.head, head + count, __ATOMIC_SEQ_CST );
+		ctx->proc->idle_wctx.drain_time = ts_next;
 
 		__cfadbg_print_safe(io, "Kernel I/O : %u completed age %llu\n", count, ts_next);
@@ -230,5 +236,5 @@
 					const unsigned long long cutoff = calc_cutoff(ctsc, ctx->cq.id, ctxs_count, io.data, io.tscs, __shard_factor.io);
 					const unsigned long long age = moving_average(ctsc, io.tscs[target].tv, io.tscs[target].ma);
-					__cfadbg_print_safe(io, "Kernel I/O: Help attempt on %u from %u, age %'llu vs cutoff %'llu, %s\n", target, this, age, cutoff, age > cutoff ? "yes" : "no");
+					__cfadbg_print_safe(io, "Kernel I/O: Help attempt on %u from %u, age %'llu vs cutoff %'llu, %s\n", target, ctx->cq.id, age, cutoff, age > cutoff ? "yes" : "no");
 					if(age <= cutoff) break HELP;
 
@@ -635,5 +641,8 @@
 
 			// We can proceed to the fast path
-			if( !__alloc(ctx, &idx, 1) ) return false;
+			if( !__alloc(ctx, &idx, 1) ) {
+				/* paranoid */ verify( false ); // for now check if this happens, next time just abort the sleep.
+				return false;
+			}
 
 			// Allocation was successful
@@ -665,5 +674,5 @@
 
 			/* paranoid */ verify( sqe->user_data == (uintptr_t)&future );
-			__submit( ctx, &idx, 1, true );
+			__submit_only( ctx, &idx, 1 );
 
 			/* paranoid */ verify( proc == __cfaabi_tls.this_processor );
@@ -676,4 +685,6 @@
 			iovec iov;
 			__atomic_acquire( &proc->io.ctx->cq.lock );
+
+			__attribute__((used)) volatile bool was_reset = false;
 
 			with( proc->idle_wctx) {
@@ -687,13 +698,21 @@
 					iov.iov_len  = sizeof(eventfd_t);
 					__kernel_read(proc, *ftr, iov, evfd );
+					ftr->result = 0xDEADDEAD;
+					*((eventfd_t *)rdbuf) = 0xDEADDEADDEADDEAD;
+					was_reset = true;
 				}
 			}
 
-			__ioarbiter_flush( *proc->io.ctx );
-			ioring_syscsll( *proc->io.ctx, 1, IORING_ENTER_GETEVENTS);
+			if( !__atomic_load_n( &proc->do_terminate, __ATOMIC_SEQ_CST ) ) {
+				__ioarbiter_flush( *proc->io.ctx );
+				proc->idle_wctx.sleep_time = rdtscl();
+				ioring_syscsll( *proc->io.ctx, 1, IORING_ENTER_GETEVENTS);
+			}
 
 			ready_schedule_lock();
 			__cfa_do_drain( proc->io.ctx, proc->cltr );
 			ready_schedule_unlock();
+
+			asm volatile ("" :: "m" (was_reset));
 		}
 	#endif
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ libcfa/src/concurrency/kernel.cfa	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -642,4 +642,5 @@
 
 	switch(fd) {
+		__attribute__((unused)) int ret;
 	case 0:
 		// If the processor isn't ready to sleep then the exchange will already wake it up
@@ -659,5 +660,6 @@
 		// If the processor was ready to sleep, we need to wake it up with an actual write
 		val = 1;
-		eventfd_write( fd, val );
+		ret = eventfd_write( fd, val );
+		/* paranoid */ verifyf( ret == 0, "Expected return to be 0, was %d\n", ret );
 
 		#if !defined(__CFA_NO_STATISTICS__)
@@ -682,8 +684,11 @@
 	this->idle_wctx.sem = 1;
 
+	this->idle_wctx.wake__time = rdtscl();
+
 	eventfd_t val;
 	val = 1;
-	eventfd_write( this->idle_wctx.evfd, val );
-
+	__attribute__((unused)) int ret = eventfd_write( this->idle_wctx.evfd, val );
+
+	/* paranoid */ verifyf( ret == 0, "Expected return to be 0, was %d\n", ret );
 	/* paranoid */ verify( ! __preemption_enabled() );
 }
Index: libcfa/src/concurrency/kernel.hfa
===================================================================
--- libcfa/src/concurrency/kernel.hfa	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ libcfa/src/concurrency/kernel.hfa	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -74,4 +74,8 @@
 	// unused if not using io_uring for idle sleep
 	io_future_t * ftr;
+
+	volatile unsigned long long wake__time;
+	volatile unsigned long long sleep_time;
+	volatile unsigned long long drain_time;
 };
 
Index: libcfa/src/concurrency/kernel/startup.cfa
===================================================================
--- libcfa/src/concurrency/kernel/startup.cfa	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ libcfa/src/concurrency/kernel/startup.cfa	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -558,4 +558,5 @@
 
 	idle_wctx.sem = 0;
+	idle_wctx.wake__time = 0;
 
 	// I'm assuming these two are reserved for standard input and output
Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/AST/Convert.cpp	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -2717,5 +2717,5 @@
 
 		for (auto & param : foralls) {
-			ty->forall.emplace_back(new ast::TypeInstType(param->name, param));
+			ty->forall.emplace_back(new ast::TypeInstType(param));
 			for (auto asst : param->assertions) {
 				ty->assertions.emplace_back(new ast::VariableExpr({}, asst));
Index: src/AST/Decl.cpp
===================================================================
--- src/AST/Decl.cpp	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/AST/Decl.cpp	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -68,5 +68,5 @@
 	}
 	for (auto & tp : this->type_params) {
-		ftype->forall.emplace_back(new TypeInstType(tp->name, tp));
+		ftype->forall.emplace_back(new TypeInstType(tp));
 		for (auto & ap: tp->assertions) {
 			ftype->assertions.emplace_back(new VariableExpr(loc, ap));
Index: src/AST/Type.cpp
===================================================================
--- src/AST/Type.cpp	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/AST/Type.cpp	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -147,4 +147,8 @@
 // --- TypeInstType
 
+TypeInstType::TypeInstType( const TypeDecl * b,
+	CV::Qualifiers q, std::vector<ptr<Attribute>> && as )
+: BaseInstType( b->name, q, move(as) ), base( b ), kind( b->kind ) {}
+
 void TypeInstType::set_base( const TypeDecl * b ) {
 	base = b;
Index: src/AST/Type.hpp
===================================================================
--- src/AST/Type.hpp	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/AST/Type.hpp	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -421,4 +421,8 @@
 		std::vector<ptr<Attribute>> && as = {} )
 	: BaseInstType( n, q, std::move(as) ), base( b ), kind( b->kind ) {}
+
+	TypeInstType( const TypeDecl * b,
+		CV::Qualifiers q = {}, std::vector<ptr<Attribute>> && as = {} );
+
 	TypeInstType( const std::string& n, TypeDecl::Kind k, CV::Qualifiers q = {},
 		std::vector<ptr<Attribute>> && as = {} )
Index: src/Concurrency/KeywordsNew.cpp
===================================================================
--- src/Concurrency/KeywordsNew.cpp	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/Concurrency/KeywordsNew.cpp	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -88,6 +88,5 @@
 		auto typeDecl = ast::deepCopy( typeParam );
 		mutFunc->type_params.push_back( typeDecl );
-		mutType->forall.push_back(
-			new ast::TypeInstType( typeDecl->name, typeDecl ) );
+		mutType->forall.push_back( new ast::TypeInstType( typeDecl ) );
 		for ( auto & assertion : typeDecl->assertions ) {
 			mutFunc->assertions.push_back( assertion );
@@ -108,9 +107,7 @@
 	for ( const ast::ptr<ast::TypeDecl> & typeDecl : mutFunc->type_params ) {
 		paramTypeInst->params.push_back(
-			new ast::TypeExpr( location,
-				new ast::TypeInstType( typeDecl->name, typeDecl ) ) );
+			new ast::TypeExpr( location, new ast::TypeInstType( typeDecl ) ) );
 		typeParamInst->params.push_back(
-			new ast::TypeExpr( location,
-				new ast::TypeInstType( typeDecl->name, typeDecl ) ) );
+			new ast::TypeExpr( location, new ast::TypeInstType( typeDecl ) ) );
 	}
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/ResolvExpr/Resolver.cc	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -1385,5 +1385,5 @@
 			for (auto & typeParam : mutDecl->type_params) {
 				symtab.addType(typeParam);
-				mutType->forall.emplace_back(new ast::TypeInstType(typeParam->name, typeParam));
+				mutType->forall.emplace_back(new ast::TypeInstType(typeParam));
 			}
 			for (auto & asst : mutDecl->assertions) {
Index: src/Validate/Autogen.cpp
===================================================================
--- src/Validate/Autogen.cpp	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/Validate/Autogen.cpp	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -248,5 +248,5 @@
 		structInst.params.push_back( new ast::TypeExpr(
 			typeDecl->location,
-			new ast::TypeInstType( typeDecl->name, typeDecl )
+			new ast::TypeInstType( typeDecl )
 		) );
 	}
@@ -264,5 +264,5 @@
 		unionInst.params.push_back( new ast::TypeExpr(
 			unionDecl->location,
-			new ast::TypeInstType( typeDecl->name, typeDecl )
+			new ast::TypeInstType( typeDecl )
 		) );
 	}
Index: src/Validate/ForallPointerDecay.cpp
===================================================================
--- src/Validate/ForallPointerDecay.cpp	(revision ee3da7802c18d6a77b83a0d1f086c458e4a72973)
+++ src/Validate/ForallPointerDecay.cpp	(revision 13cdc8c09b514d19adfe8e7643f71ceca861cea5)
@@ -41,5 +41,5 @@
 	for ( auto & type_param : decl->type_params ) {
 		type->forall.emplace_back(
-			new ast::TypeInstType( type_param->name, type_param ) );
+			new ast::TypeInstType( type_param ) );
 	}
 	for ( auto & assertion : decl->assertions ) {
