Index: src/benchmark/Makefile.am
===================================================================
--- src/benchmark/Makefile.am	(revision 11b70289f1f0eeb9ac59bf49746042b66f1f5922)
+++ src/benchmark/Makefile.am	(revision 7ad6b6db8814dd8a1b75e812dfcb238f7ca69251)
@@ -23,4 +23,5 @@
 STATS    = ${TOOLSDIR}stat.py
 repeats  = 30
+skipcompile = no
 TIME_FORMAT = "%E"
 PRINT_FORMAT = %20s: #Comments needed for spacing
@@ -43,5 +44,5 @@
 %.runquiet :
 	@+make $(basename $@)
-	@./a.out
+	@taskset -c 1 ./a.out
 	@rm -f a.out
 
@@ -59,8 +60,10 @@
 	@echo -e '\t"githash": "'${githash}'",'
 	@echo -e '\t"arch": "'   ${arch}   '",'
+@DOifskipcompile@
 	@echo -e '\t"compile": {'
 	@+make compile TIME_FORMAT='%e,' PRINT_FORMAT='\t\t\"%s\" :'
 	@echo -e '\t\t"dummy" : {}'
 	@echo -e '\t},'
+@DOendif@
 	@echo -e '\t"ctxswitch": {'
 	@echo -en '\t\t"coroutine":'
Index: src/benchmark/Makefile.in
===================================================================
--- src/benchmark/Makefile.in	(revision 11b70289f1f0eeb9ac59bf49746042b66f1f5922)
+++ src/benchmark/Makefile.in	(revision 7ad6b6db8814dd8a1b75e812dfcb238f7ca69251)
@@ -253,4 +253,5 @@
 STATS = ${TOOLSDIR}stat.py
 repeats = 30
+skipcompile = no
 TIME_FORMAT = "%E"
 PRINT_FORMAT = %20s: #Comments needed for spacing
@@ -459,5 +460,5 @@
 %.runquiet :
 	@+make $(basename $@)
-	@./a.out
+	@taskset -c 1 ./a.out
 	@rm -f a.out
 
@@ -473,8 +474,10 @@
 	@echo -e '\t"githash": "'${githash}'",'
 	@echo -e '\t"arch": "'   ${arch}   '",'
+@DOifskipcompile@
 	@echo -e '\t"compile": {'
 	@+make compile TIME_FORMAT='%e,' PRINT_FORMAT='\t\t\"%s\" :'
 	@echo -e '\t\t"dummy" : {}'
 	@echo -e '\t},'
+@DOendif@
 	@echo -e '\t"ctxswitch": {'
 	@echo -en '\t\t"coroutine":'
Index: src/driver/cfa.cc
===================================================================
--- src/driver/cfa.cc	(revision 11b70289f1f0eeb9ac59bf49746042b66f1f5922)
+++ src/driver/cfa.cc	(revision 7ad6b6db8814dd8a1b75e812dfcb238f7ca69251)
@@ -10,6 +10,6 @@
 // Created On       : Tue Aug 20 13:44:49 2002
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Tue Jan 30 15:46:15 2018
-// Update Count     : 161
+// Last Modified On : Thu Feb  1 22:26:10 2018
+// Update Count     : 163
 //
 
@@ -358,6 +358,4 @@
 		args[nargs] = "-D__int8_t_defined";				// prevent gcc type-size attributes
 		nargs += 1;
-		args[nargs] = "-D__NO_STRING_INLINES";			// prevent gcc strcmp unrolling
-		nargs += 1;
 		args[nargs] = ( *new string( string("-B") + Bprefix + "/" ) ).c_str();
 		nargs += 1;
Index: src/libcfa/concurrency/kernel.c
===================================================================
--- src/libcfa/concurrency/kernel.c	(revision 11b70289f1f0eeb9ac59bf49746042b66f1f5922)
+++ src/libcfa/concurrency/kernel.c	(revision 7ad6b6db8814dd8a1b75e812dfcb238f7ca69251)
@@ -59,4 +59,5 @@
 
 volatile thread_local bool preemption_in_progress = 0;
+volatile thread_local bool preemption_enabled = false;
 volatile thread_local unsigned short disable_preempt_count = 1;
 
@@ -196,9 +197,9 @@
 			if(readyThread)
 			{
-				verify( disable_preempt_count > 0 );
+				verify( !preemption_enabled );
 
 				runThread(this, readyThread);
 
-				verify( disable_preempt_count > 0 );
+				verify( !preemption_enabled );
 
 				//Some actions need to be taken from the kernel
@@ -242,5 +243,5 @@
 void finishRunning(processor * this) with( this->finish ) {
 	if( action_code == Release ) {
-		verify( disable_preempt_count > 1 );
+		verify( !preemption_enabled );
 		unlock( *lock );
 	}
@@ -249,10 +250,10 @@
 	}
 	else if( action_code == Release_Schedule ) {
-		verify( disable_preempt_count > 1 );
+		verify( !preemption_enabled );
 		unlock( *lock );
 		ScheduleThread( thrd );
 	}
 	else if( action_code == Release_Multi ) {
-		verify( disable_preempt_count > lock_count );
+		verify( !preemption_enabled );
 		for(int i = 0; i < lock_count; i++) {
 			unlock( *locks[i] );
@@ -286,4 +287,5 @@
 	this_coroutine = NULL;
 	this_thread = NULL;
+	preemption_enabled = false;
 	disable_preempt_count = 1;
 	// SKULLDUGGERY: We want to create a context for the processor coroutine
@@ -333,5 +335,5 @@
 	verify( thrd->self_cor.state != Halted );
 
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
 
 	verifyf( thrd->next == NULL, "Expected null got %p", thrd->next );
@@ -343,13 +345,13 @@
 	}
 
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
 }
 
 thread_desc * nextThread(cluster * this) with( *this ) {
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
 	lock( ready_queue_lock __cfaabi_dbg_ctx2 );
 	thread_desc * head = pop_head( ready_queue );
 	unlock( ready_queue_lock );
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
 	return head;
 }
@@ -357,7 +359,7 @@
 void BlockInternal() {
 	disable_interrupts();
-	verify( disable_preempt_count > 0 );
-	suspend();
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
+	suspend();
+	verify( !preemption_enabled );
 	enable_interrupts( __cfaabi_dbg_ctx );
 }
@@ -368,7 +370,7 @@
 	this_processor->finish.lock        = lock;
 
-	verify( disable_preempt_count > 1 );
-	suspend();
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
+	suspend();
+	verify( !preemption_enabled );
 
 	enable_interrupts( __cfaabi_dbg_ctx );
@@ -380,7 +382,7 @@
 	this_processor->finish.thrd        = thrd;
 
-	verify( disable_preempt_count > 0 );
-	suspend();
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
+	suspend();
+	verify( !preemption_enabled );
 
 	enable_interrupts( __cfaabi_dbg_ctx );
@@ -394,7 +396,7 @@
 	this_processor->finish.thrd        = thrd;
 
-	verify( disable_preempt_count > 1 );
-	suspend();
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
+	suspend();
+	verify( !preemption_enabled );
 
 	enable_interrupts( __cfaabi_dbg_ctx );
@@ -407,7 +409,7 @@
 	this_processor->finish.lock_count  = count;
 
-	verify( disable_preempt_count > 0 );
-	suspend();
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
+	suspend();
+	verify( !preemption_enabled );
 
 	enable_interrupts( __cfaabi_dbg_ctx );
@@ -422,7 +424,7 @@
 	this_processor->finish.thrd_count  = thrd_count;
 
-	verify( disable_preempt_count > 0 );
-	suspend();
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
+	suspend();
+	verify( !preemption_enabled );
 
 	enable_interrupts( __cfaabi_dbg_ctx );
@@ -430,5 +432,5 @@
 
 void LeaveThread(__spinlock_t * lock, thread_desc * thrd) {
-	verify( disable_preempt_count > 0 );
+	verify( !preemption_enabled );
 	this_processor->finish.action_code = thrd ? Release_Schedule : Release;
 	this_processor->finish.lock        = lock;
Index: src/libcfa/concurrency/kernel_private.h
===================================================================
--- src/libcfa/concurrency/kernel_private.h	(revision 11b70289f1f0eeb9ac59bf49746042b66f1f5922)
+++ src/libcfa/concurrency/kernel_private.h	(revision 7ad6b6db8814dd8a1b75e812dfcb238f7ca69251)
@@ -74,4 +74,5 @@
 
 extern volatile thread_local bool preemption_in_progress;
+extern volatile thread_local bool preemption_enabled;
 extern volatile thread_local unsigned short disable_preempt_count;
 
Index: src/libcfa/concurrency/monitor.c
===================================================================
--- src/libcfa/concurrency/monitor.c	(revision 11b70289f1f0eeb9ac59bf49746042b66f1f5922)
+++ src/libcfa/concurrency/monitor.c	(revision 7ad6b6db8814dd8a1b75e812dfcb238f7ca69251)
@@ -87,6 +87,4 @@
 		thread_desc * thrd = this_thread;
 
-		verify( disable_preempt_count > 0 );
-
 		__cfaabi_dbg_print_safe("Kernel : %10p Entering mon %p (%p)\n", thrd, this, this->owner);
 
@@ -117,6 +115,4 @@
 			// Some one else has the monitor, wait in line for it
 			append( this->entry_queue, thrd );
-
-			verify( disable_preempt_count > 0 );
 
 			BlockInternal( &this->lock );
@@ -396,11 +392,6 @@
 	append( this.blocked, &waiter );
 
-	verify( disable_preempt_count == 0 );
-
 	// Lock all monitors (aggregates the locks as well)
 	lock_all( monitors, locks, count );
-
-	// verifyf( disable_preempt_count == count, "Got %d, expected %d\n", disable_preempt_count, count );
-	if(disable_preempt_count != count) { __cfaabi_dbg_print_buffer_decl("----------Gonna crash\n"); }
 
 	// Find the next thread(s) to run
@@ -477,11 +468,6 @@
 	monitor_ctx( this.monitors, this.monitor_count );
 
-	verify( disable_preempt_count == 0 );
-
 	// Lock all monitors (aggregates the locks them as well)
 	lock_all( monitors, locks, count );
-
-	// verify( disable_preempt_count == count );
-	if(disable_preempt_count != count) { __cfaabi_dbg_print_buffer_decl("----------Gonna crash\n"); }
 
 
Index: src/libcfa/concurrency/preemption.c
===================================================================
--- src/libcfa/concurrency/preemption.c	(revision 11b70289f1f0eeb9ac59bf49746042b66f1f5922)
+++ src/libcfa/concurrency/preemption.c	(revision 7ad6b6db8814dd8a1b75e812dfcb238f7ca69251)
@@ -49,9 +49,9 @@
 // Machine specific register name
 #if   defined(__x86_64__)
-#define CFA_REG_IP REG_RIP
+#define CFA_REG_IP gregs[REG_RIP]
 #elif defined(__i386__)
-#define CFA_REG_IP REG_EIP
+#define CFA_REG_IP gregs[REG_EIP]
 #elif defined(__ARM_ARCH__)
-#define CFA_REG_IP REG_R15
+#define CFA_REG_IP arm_pc
 #endif
 
@@ -142,5 +142,7 @@
 	// Disable interrupts by incrementing the counter
 	void disable_interrupts() {
-		__attribute__((unused)) unsigned short new_val = __atomic_add_fetch_2( &disable_preempt_count, 1, __ATOMIC_SEQ_CST );
+		preemption_enabled = false;
+		__attribute__((unused)) unsigned short new_val = disable_preempt_count + 1;
+		disable_preempt_count = new_val;
 		verify( new_val < 65_000u );              // If this triggers someone is disabling interrupts without enabling them
 	}
@@ -152,11 +154,15 @@
 		thread_desc * thrd = this_thread;         // Cache the thread now since interrupts can start happening after the atomic add
 
-		unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
+		unsigned short prev = disable_preempt_count;
+		disable_preempt_count -= 1;
 		verify( prev != 0u );                     // If this triggers someone is enabled already enabled interruptsverify( prev != 0u );
 
 		// Check if we need to prempt the thread because an interrupt was missed
-		if( prev == 1 && proc->pending_preemption ) {
-			proc->pending_preemption = false;
-			BlockInternal( thrd );
+		if( prev == 1 ) {
+			preemption_enabled = true;
+			if( proc->pending_preemption ) {
+				proc->pending_preemption = false;
+				BlockInternal( thrd );
+			}
 		}
 
@@ -168,6 +174,10 @@
 	// Don't execute any pending CtxSwitch even if counter reaches 0
 	void enable_interrupts_noPoll() {
-		__attribute__((unused)) unsigned short prev = __atomic_fetch_add_2( &disable_preempt_count, -1, __ATOMIC_SEQ_CST );
+		unsigned short prev = disable_preempt_count;
+		disable_preempt_count -= 1;
 		verifyf( prev != 0u, "Incremented from %u\n", prev );                     // If this triggers someone is enabled already enabled interrupts
+		if( prev == 1 ) {
+			preemption_enabled = true;
+		}
 	}
 }
@@ -210,5 +220,5 @@
 // If false : preemption is unsafe and marked as pending
 static inline bool preemption_ready() {
-	bool ready = disable_preempt_count == 0 && !preemption_in_progress; // Check if preemption is safe
+	bool ready = preemption_enabled && !preemption_in_progress; // Check if preemption is safe
 	this_processor->pending_preemption = !ready;                        // Adjust the pending flag accordingly
 	return ready;
@@ -225,4 +235,5 @@
 
 	// Start with preemption disabled until ready
+	preemption_enabled = false;
 	disable_preempt_count = 1;
 
@@ -284,11 +295,7 @@
 // Receives SIGUSR1 signal and causes the current thread to yield
 void sigHandler_ctxSwitch( __CFA_SIGPARMS__ ) {
-#if defined( __ARM_ARCH )
-	__cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.arm_pc); )
-#else
-	__cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.gregs[CFA_REG_IP]); )
-#endif
-
-		// Check if it is safe to preempt here
+	__cfaabi_dbg_debug_do( last_interrupt = (void *)(cxt->uc_mcontext.CFA_REG_IP); )
+
+	// Check if it is safe to preempt here
 	if( !preemption_ready() ) { return; }
 
