Index: libcfa/src/concurrency/CtxSwitch-x86_64.S
===================================================================
--- libcfa/src/concurrency/CtxSwitch-x86_64.S	(revision 8278abfe651317e9b27dc124c600abcf84e8bc7b)
+++ libcfa/src/concurrency/CtxSwitch-x86_64.S	(revision f019069552a31e2e04cad9e68134e465a83e4c2a)
@@ -100,7 +100,12 @@
 	movq %rbp,FP_OFFSET(%rdi)
 
+	mfence
+
 	// Don't load a new context, directly jump to the desired function
-
-	jmp *%rsi
+#if defined(PIC)
+	call __suspend_callback@plt
+#else
+	call __suspend_callback
+#endif
 	.size  CtxStore, .-CtxStore
 
Index: libcfa/src/concurrency/coroutine.cfa
===================================================================
--- libcfa/src/concurrency/coroutine.cfa	(revision 8278abfe651317e9b27dc124c600abcf84e8bc7b)
+++ libcfa/src/concurrency/coroutine.cfa	(revision f019069552a31e2e04cad9e68134e465a83e4c2a)
@@ -40,4 +40,6 @@
 		abort();
 	}
+
+	extern void CtxRet( struct __stack_context_t * to ) asm ("CtxRet") __attribute__ ((__noreturn__));
 }
 
@@ -203,4 +205,20 @@
 		CoroutineCtxSwitch( src, starter );
 	}
+
+	__attribute__((noreturn)) void __suspend_callback( struct __stack_context_t *, fptr_t call ) {
+		call();
+
+		coroutine_desc * src = TL_GET( this_thread )->curr_cor;
+		// set state of current coroutine to inactive
+		src->state = src->state == Halted ? Halted : Inactive;
+
+		TL_GET( this_thread )->curr_cor = src->last;
+
+		// context switch to specified coroutine
+		assert( src->last->context.SP );
+		CtxRet( &src->last->context );
+
+		abort();
+	}
 }
 
Index: libcfa/src/concurrency/coroutine.hfa
===================================================================
--- libcfa/src/concurrency/coroutine.hfa	(revision 8278abfe651317e9b27dc124c600abcf84e8bc7b)
+++ libcfa/src/concurrency/coroutine.hfa	(revision f019069552a31e2e04cad9e68134e465a83e4c2a)
@@ -68,6 +68,5 @@
 
 	extern void CtxSwitch( struct __stack_context_t * from, struct __stack_context_t * to ) asm ("CtxSwitch");
-	extern void CtxStore ( struct __stack_context_t * from, __attribute__((noreturn)) void (*__callback)(void) ) asm ("CtxStore");
-	extern void CtxRet   ( struct __stack_context_t * to ) asm ("CtxRet") __attribute__ ((__noreturn__));
+	extern void CtxStore ( struct __stack_context_t * from, fptr_t callback ) asm ("CtxStore");
 }
 
@@ -172,4 +171,6 @@
 }
 
+__attribute__((noreturn)) void __suspend_callback(void *, fptr_t call);
+
 static inline void suspend_then(fptr_t call) {
 	// optimization : read TLS once and reuse it
@@ -194,19 +195,5 @@
       assert( src->context.SP );
 
-	__attribute__((noreturn)) void __suspend_callback(void) {
-		call();
-
-		// set state of current coroutine to inactive
-		src->state = src->state == Halted ? Halted : Inactive;
-
-		TL_GET( this_thread )->curr_cor = src->last;
-
-		// context switch to specified coroutine
-		assert( src->last->context.SP );
-		CtxRet( &src->last->context );
-
-		abort();
-	}
-      CtxStore( &src->context, __suspend_callback );
+      CtxStore( &src->context, call );
 	// when CtxStore returns we are back in the src coroutine
 
@@ -220,38 +207,4 @@
 	return;
 }
-
-// static inline void suspend_return(void) {
-// 	// optimization : read TLS once and reuse it
-// 	// Safety note: this is preemption safe since if
-// 	// preemption occurs after this line, the pointer
-// 	// will also migrate which means this value will
-// 	// stay in syn with the TLS
-// 	coroutine_desc * src = TL_GET( this_thread )->curr_cor;
-
-// 	assertf( src->last != 0,
-// 		"Attempt to suspend coroutine \"%.256s\" (%p) that has never been resumed.\n"
-// 		"Possible cause is a suspend executed in a member called by a coroutine user rather than by the coroutine main.",
-// 		src->name, src );
-// 	assertf( src->last->state != Halted,
-// 		"Attempt by coroutine \"%.256s\" (%p) to suspend back to terminated coroutine \"%.256s\" (%p).\n"
-// 		"Possible cause is terminated coroutine's main routine has already returned.",
-// 		src->name, src, src->last->name, src->last );
-
-// 	// Safety note : Preemption must be disabled here since kernelTLS.this_coroutine must always be up to date
-//       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;
-
-//       // set new coroutine that task is executing
-//       kernelTLS.this_coroutine = dst;
-
-//       // context switch to specified coroutine
-//       assert( src->stack.context );
-// 	CtxRet( src->stack.context );
-
-// 	abort();
-// }
 
 // Local Variables: //
