Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 142930b11bb7a219dee95933e7dd70643b471d38)
+++ libcfa/src/exception.c	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -55,4 +55,8 @@
 }
 
+struct __cfaehm_base_exception_t * __cfaehm_get_current_termination(void) {
+	return this_exception_context()->current_exception;
+}
+
 
 // RESUMPTION ================================================================
@@ -309,5 +313,5 @@
 		struct _Unwind_Context * unwind_context)
 {
-	//! __cfadbg_print_safe(exception, "CFA: 0x%lx\n", _Unwind_GetCFA(unwind_context));
+	__cfadbg_print_safe(exception, "CFA: 0x%p\n", (void*)_Unwind_GetCFA(unwind_context));
 	__cfadbg_print_safe(exception, "Personality function (%d, %x, %llu, %p, %p):",
 			version, actions, exception_class, unwind_exception, unwind_context);
@@ -411,10 +415,12 @@
 				_Unwind_Word match_pos =
 #				if defined( __x86_64 )
-				    _Unwind_GetCFA(unwind_context) + 8;
+					_Unwind_GetCFA(unwind_context);
 #				elif defined( __i386 )
-				    _Unwind_GetCFA(unwind_context) + 24;
+					_Unwind_GetCFA(unwind_context) + 20;
 #				elif defined( __ARM_ARCH )
-				    _Unwind_GetCFA(unwind_context) + 40;
+					_Unwind_GetCFA(unwind_context) + 16;
 #				endif
+				//! printf("match_pos: %p\n", (void*)match_pos);
+				//! fflush(stdout);
 				int (*matcher)(exception_t *) = *(int(**)(exception_t *))match_pos;
 
@@ -479,9 +485,9 @@
 // and simply linked from libcfa but there is one problem left, see the exception table for details
 __attribute__((noinline))
-void __cfaehm_try_terminate(void (*try_block)(),
-		void (*catch_block)(int index, exception_t * except),
+int __cfaehm_try_terminate(void (*try_block)(),
 		__attribute__((unused)) int (*match_block)(exception_t * except)) {
 	//! volatile int xy = 0;
-	//! printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy);
+	//! printf("%p %p %p\n", &try_block, &match_block, &xy);
+	//! fflush(stdout);
 
 	// Setup the personality routine and exception table.
@@ -507,5 +513,5 @@
 
 	// Normal return for when there is no throw.
-	return;
+	return 0;
 
 	// Exceptionnal path
@@ -518,8 +524,5 @@
 	asm volatile (".CATCH:");
 
-	// Exception handler
-	// Note: Saving the exception context on the stack breaks termination exceptions.
-	catch_block( EXCEPT_TO_NODE( this_exception_context()->current_exception )->handler_index,
-	             this_exception_context()->current_exception );
+	return EXCEPT_TO_NODE( this_exception_context()->current_exception )->handler_index;
 }
 
Index: libcfa/src/exception.h
===================================================================
--- libcfa/src/exception.h	(revision 142930b11bb7a219dee95933e7dd70643b471d38)
+++ libcfa/src/exception.h	(revision 59c8dff49bbb5284b39ab27da894a644327a531a)
@@ -44,4 +44,7 @@
 
 
+struct __cfaehm_base_exception_t * __cfaehm_get_current_termination(void);
+
+
 void __cfaehm_cancel_stack(exception_t * except) __attribute__((noreturn));
 
@@ -57,7 +60,6 @@
 
 // Function catches termination exceptions.
-void __cfaehm_try_terminate(
+int __cfaehm_try_terminate(
 	void (*try_block)(),
-	void (*catch_block)(int index, exception_t * except),
 	int (*match_block)(exception_t * except));
 
