Index: libcfa/src/concurrency/io.cfa
===================================================================
--- libcfa/src/concurrency/io.cfa	(revision a78c3ff302ed8743ba3d0a600fbf31010e04a554)
+++ libcfa/src/concurrency/io.cfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -160,5 +160,5 @@
 	static inline void process(struct io_uring_cqe & cqe ) {
 		struct io_future_t * future = (struct io_future_t *)(uintptr_t)cqe.user_data;
-		__cfadbg_print_safe( io, "Kernel I/O : Syscall completed : cqe %p, result %d for %p\n", future, cqe.res, data->thrd );
+		__cfadbg_print_safe( io, "Kernel I/O : Syscall completed : cqe %p, result %d for %p\n", &cqe, cqe.res, future );
 
 		fulfil( *future, cqe.res );
@@ -298,7 +298,5 @@
 		__u32 mask = *ring.submit_q.mask;
 
-		disable_interrupts();
-			__u32 off = __tls_rand();
-		enable_interrupts( __cfaabi_dbg_ctx );
+		__u32 off = thread_rand();
 
 		// Loop around looking for an available spot
@@ -344,7 +342,5 @@
 		__u32 ready_mask = ring.submit_q.ready_cnt - 1;
 
-		disable_interrupts();
-			__u32 off = __tls_rand();
-		enable_interrupts( __cfaabi_dbg_ctx );
+		__u32 off = thread_rand();
 
 		__u32 picked;
Index: libcfa/src/concurrency/io/call.cfa.in
===================================================================
--- libcfa/src/concurrency/io/call.cfa.in	(revision a78c3ff302ed8743ba3d0a600fbf31010e04a554)
+++ libcfa/src/concurrency/io/call.cfa.in	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -84,5 +84,5 @@
 
 		/* paranoid */ verifyf( cltr->io.ctxs, "default io contexts for cluster %p are missing\\n", cltr);
-		return &cltr->io.ctxs[ __tls_rand() % cltr->io.cnt ];
+		return &cltr->io.ctxs[ thread_rand() % cltr->io.cnt ];
 	}
 #endif
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision a78c3ff302ed8743ba3d0a600fbf31010e04a554)
+++ libcfa/src/concurrency/kernel.cfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -619,4 +619,7 @@
 	lock( kernel_abort_lock __cfaabi_dbg_ctx2 );
 
+	// disable interrupts, it no longer makes sense to try to interrupt this processor
+	disable_interrupts();
+
 	// first task to abort ?
 	if ( kernel_abort_called ) {			// not first task to abort ?
Index: libcfa/src/concurrency/kernel/fwd.hfa
===================================================================
--- libcfa/src/concurrency/kernel/fwd.hfa	(revision a78c3ff302ed8743ba3d0a600fbf31010e04a554)
+++ libcfa/src/concurrency/kernel/fwd.hfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -132,4 +132,6 @@
 		}
 
+		extern uint64_t thread_rand();
+
 		//-----------------------------------------------------------------------
 		// Statics call at the end of each thread to register statistics
Index: libcfa/src/concurrency/thread.cfa
===================================================================
--- libcfa/src/concurrency/thread.cfa	(revision a78c3ff302ed8743ba3d0a600fbf31010e04a554)
+++ libcfa/src/concurrency/thread.cfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -162,4 +162,11 @@
 }
 
+uint64_t thread_rand() {
+	disable_interrupts();
+	uint64_t ret = __tls_rand();
+	enable_interrupts( __cfaabi_dbg_ctx );
+	return ret;
+}
+
 // Local Variables: //
 // mode: c //
Index: libcfa/src/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision a78c3ff302ed8743ba3d0a600fbf31010e04a554)
+++ libcfa/src/interpose.cfa	(revision aeb31b1552ac9b7ba115fac5648545a58d8c5236)
@@ -220,26 +220,50 @@
 }
 
+static volatile int __abort_stage = 0;
+
 // Cannot forward va_list.
 void __abort( bool signalAbort, const char fmt[], va_list args ) {
-	void * kernel_data = kernel_abort();				// must be done here to lock down kernel
-	int len;
-
-	signal( SIGABRT, SIG_DFL );							// prevent final "real" abort from recursing to handler
-
-	len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
-	__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
-
-	assert( fmt );
-	len = vsnprintf( abort_text, abort_text_size, fmt, args );
-	__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
-
-	if ( fmt[strlen( fmt ) - 1] != '\n' ) {				// add optional newline if missing at the end of the format text
-		__cfaabi_bits_write( STDERR_FILENO, "\n", 1 );
-	} // if
-	kernel_abort_msg( kernel_data, abort_text, abort_text_size );
-
-	__cfaabi_backtrace( signalAbort ? 4 : 2 );
-
-	__cabi_libc.abort();								// print stack trace in handler
+	int stage = __atomic_add_fetch( &__abort_stage, 1, __ATOMIC_SEQ_CST );
+
+	// First stage: stop the cforall kernel and print
+	if(stage == 1) {
+		// increment stage
+		stage = __atomic_add_fetch( &__abort_stage, 1, __ATOMIC_SEQ_CST );
+
+		// must be done here to lock down kernel
+		void * kernel_data = kernel_abort();
+		int len;
+
+		signal( SIGABRT, SIG_DFL );							// prevent final "real" abort from recursing to handler
+
+		len = snprintf( abort_text, abort_text_size, "Cforall Runtime error (UNIX pid:%ld) ", (long int)getpid() ); // use UNIX pid (versus getPid)
+		__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
+
+		assert( fmt );
+		len = vsnprintf( abort_text, abort_text_size, fmt, args );
+		__cfaabi_bits_write( STDERR_FILENO, abort_text, len );
+
+		// add optional newline if missing at the end of the format text
+		if ( fmt[strlen( fmt ) - 1] != '\n' ) {
+			__cfaabi_bits_write( STDERR_FILENO, "\n", 1 );
+		} // if
+		kernel_abort_msg( kernel_data, abort_text, abort_text_size );
+	}
+
+	// Second stage: print the backtrace
+	if(stage == 2) {
+		// increment stage
+		stage = __atomic_add_fetch( &__abort_stage, 1, __ATOMIC_SEQ_CST );
+
+		// print stack trace in handler
+		__cfaabi_backtrace( signalAbort ? 4 : 2 );
+	}
+
+	do {
+		// Finally call abort
+		__cabi_libc.abort();
+
+		// Loop so that we never return
+	} while(true);
 }
 
