Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision e8e457eec7f0e42a7c71c07ffcf5e3ea27d00b48)
+++ libcfa/src/concurrency/coroutine.cfa	(revision 5c1a531c543f1d33f6042205ef843c59645f6098)
@@ -126,9 +126,4 @@
 // Wrapper for co
 void CoroutineCtxSwitch(coroutine_desc* src, coroutine_desc* dst) {
-	// Safety note : Preemption must be disabled since there is a race condition
-	// kernelTLS.this_thread->curr_cor and $rsp/$rbp must agree at all times
-	verify( TL_GET( preemption_state.enabled ) || TL_GET( this_processor )->do_terminate );
-	disable_interrupts();
-
 	// set state of current coroutine to inactive
 	src->state = src->state == Halted ? Halted : Inactive;
@@ -144,7 +139,4 @@
 	// set state of new coroutine to active
 	src->state = Active;
-
-	enable_interrupts( __cfaabi_dbg_ctx );
-	verify( TL_GET( preemption_state.enabled ) || TL_GET( this_processor )->do_terminate );
 
 	if( unlikely(src->cancellation != NULL) ) {
Index: libcfa/src/concurrency/invoke.c
===================================================================
--- libcfa/src/concurrency/invoke.c	(revision e8e457eec7f0e42a7c71c07ffcf5e3ea27d00b48)
+++ libcfa/src/concurrency/invoke.c	(revision 5c1a531c543f1d33f6042205ef843c59645f6098)
@@ -46,6 +46,4 @@
 
 	cor->state = Active;
-
-	enable_interrupts( __cfaabi_dbg_ctx );
 
 	main( this );
Index: libcfa/src/concurrency/invoke.h
===================================================================
--- libcfa/src/concurrency/invoke.h	(revision e8e457eec7f0e42a7c71c07ffcf5e3ea27d00b48)
+++ libcfa/src/concurrency/invoke.h	(revision 5c1a531c543f1d33f6042205ef843c59645f6098)
@@ -65,6 +65,4 @@
 		void * SP;
 		void * FP;
-		// copy of global UNIX variable errno
-		int errno_;
 	};
 
@@ -168,4 +166,6 @@
 		// current execution status for coroutine
 		enum coroutine_state state;
+
+		//SKULLDUGGERY errno is not save in the thread data structure because returnToKernel appears to be the only function to require saving and restoring it
 
 		// coroutine body used to store context
Index: libcfa/src/concurrency/kernel.cfa
===================================================================
--- libcfa/src/concurrency/kernel.cfa	(revision e8e457eec7f0e42a7c71c07ffcf5e3ea27d00b48)
+++ libcfa/src/concurrency/kernel.cfa	(revision 5c1a531c543f1d33f6042205ef843c59645f6098)
@@ -91,5 +91,4 @@
 
 void ?{}( coroutine_desc & this, current_stack_info_t * info) with( this ) {
-	context.errno_ = 0;
 	stack.storage = info->storage;
 	with(*stack.storage) {
@@ -237,4 +236,7 @@
 }
 
+static int * __volatile_errno() __attribute__((noinline));
+static int * __volatile_errno() { asm(""); return &errno; }
+
 // KERNEL ONLY
 // runThread runs a thread by context switching
@@ -271,4 +273,5 @@
 	thrd_src->state = thrd_src->state == Halted ? Halted : Inactive;
 	proc_cor->state = Active;
+	int local_errno = *__volatile_errno();
 
 	// set new coroutine that the processor is executing
@@ -280,4 +283,5 @@
 	proc_cor->state = proc_cor->state == Halted ? Halted : Inactive;
 	thrd_src->state = Active;
+	*__volatile_errno() = local_errno;
 }
 
@@ -380,11 +384,4 @@
 	src->state = src->state == Halted ? Halted : Inactive;
 
-	// SKULLDUGGERY normally interrupts are enable before leaving a coroutine ctxswitch.
-	// Therefore, when first creating a coroutine, interrupts are enable before calling the main.
-	// This is consistent with thread creation. However, when creating the main processor coroutine,
-	// we wan't interrupts to be disabled. Therefore, we double-disable interrupts here so they will
-	// stay disabled.
-	disable_interrupts();
-
 	// context switch to specified coroutine
 	verify( dst->context.SP );
