Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision 636d3715218ad17f8c121dc651c8556740022e15)
+++ libcfa/src/concurrency/kernel.cfa	(revision 601165821d0880d71183d817e5e75ac1e73f37ec)
@@ -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/interpose.cfa
===================================================================
--- libcfa/src/interpose.cfa	(revision 636d3715218ad17f8c121dc651c8556740022e15)
+++ libcfa/src/interpose.cfa	(revision 601165821d0880d71183d817e5e75ac1e73f37ec)
@@ -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);
 }
 
