Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 33e4e8ef9dac8c6b85f9afa6d9fe29d0b7961ff6)
+++ libcfa/src/exception.c	(revision 2554f2465980526a772aa75500f16cbd403fd235)
@@ -55,4 +55,7 @@
 }
 
+struct __cfaehm_base_exception_t * __cfaehm_get_current_exception(void) {
+	return this_exception_context()->current_exception;
+}
 
 // RESUMPTION ================================================================
@@ -309,5 +312,4 @@
 		struct _Unwind_Context * unwind_context)
 {
-
 	//__cfadbg_print_safe(exception, "CFA: 0x%lx\n", _Unwind_GetCFA(context));
 	__cfadbg_print_safe(exception, "Personality function (%d, %x, %llu, %p, %p):",
@@ -412,9 +414,9 @@
 				_Unwind_Word match_pos =
 #				if defined( __x86_64 )
+				    _Unwind_GetCFA(unwind_context);
+#				elif defined( __i386 )
 				    _Unwind_GetCFA(unwind_context) + 8;
-#				elif defined( __i386 )
-				    _Unwind_GetCFA(unwind_context) + 24;
 #				elif defined( __ARM_ARCH )
-				    _Unwind_GetCFA(unwind_context) + 40;
+				    _Unwind_GetCFA(unwind_context) + 16;
 #				endif
 				int (*matcher)(exception_t *) = *(int(**)(exception_t *))match_pos;
@@ -480,9 +482,8 @@
 // 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);
 
 	// Setup the personality routine and exception table.
@@ -508,5 +509,5 @@
 
 	// Normal return for when there is no throw.
-	return;
+	return 0;
 
 	// Exceptionnal path
@@ -519,8 +520,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 33e4e8ef9dac8c6b85f9afa6d9fe29d0b7961ff6)
+++ libcfa/src/exception.h	(revision 2554f2465980526a772aa75500f16cbd403fd235)
@@ -43,4 +43,5 @@
 extern struct __cfavir_type_info __cfatid_exception_t;
 
+struct __cfaehm_base_exception_t * __cfaehm_get_current_exception(void);
 
 void __cfaehm_cancel_stack(exception_t * except) __attribute__((noreturn));
@@ -57,7 +58,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));
 
