Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 5546eee4176e12f525c30034b085e9e000cdba20)
+++ libcfa/src/exception.c	(revision b7898ac15d081fabcb1bc080261699f53c5c6cf4)
@@ -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 5546eee4176e12f525c30034b085e9e000cdba20)
+++ libcfa/src/exception.h	(revision b7898ac15d081fabcb1bc080261699f53c5c6cf4)
@@ -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));
 
Index: src/ControlStruct/ExceptTranslate.cpp
===================================================================
--- src/ControlStruct/ExceptTranslate.cpp	(revision 5546eee4176e12f525c30034b085e9e000cdba20)
+++ src/ControlStruct/ExceptTranslate.cpp	(revision b7898ac15d081fabcb1bc080261699f53c5c6cf4)
@@ -482,15 +482,41 @@
 		ast::FunctionDecl * terminate_catch,
 		ast::FunctionDecl * terminate_match ) {
-	// { __cfaehm_try_terminate(`try`, `catch`, `match`); }
-
-	ast::UntypedExpr * caller = new ast::UntypedExpr(loc, new ast::NameExpr(loc,
-		"__cfaehm_try_terminate" ) );
-	caller->args.push_back( new ast::VariableExpr(loc, try_wrapper ) );
-	caller->args.push_back( new ast::VariableExpr(loc, terminate_catch ) );
-	caller->args.push_back( new ast::VariableExpr(loc, terminate_match ) );
-
-	ast::CompoundStmt * callStmt = new ast::CompoundStmt(loc);
-	callStmt->push_back( new ast::ExprStmt( loc, caller ) );
-	return callStmt;
+	// {
+	//     int __handler_index = __cfaehm_try_terminate(`try`, `match`);
+	//     if ( __handler_index ) {
+	//         `catch`( __handler_index, __cfaehm_get_current_termination() );
+	//     }
+	// }
+
+	ast::ObjectDecl * index = new ast::ObjectDecl( loc, "__handler_index",
+		new ast::BasicType( ast::BasicType::SignedInt ),
+		new ast::SingleInit( loc,
+			new ast::UntypedExpr( loc,
+				new ast::NameExpr( loc, "__cfaehm_try_terminate" ),
+				{
+					new ast::VariableExpr( loc, try_wrapper ),
+					new ast::VariableExpr( loc, terminate_match ),
+				}
+			)
+		)
+	);
+
+	return new ast::CompoundStmt( loc, {
+		new ast::DeclStmt( loc, index ),
+		new ast::IfStmt( loc,
+			new ast::VariableExpr( loc, index ),
+			new ast::ExprStmt( loc,
+				new ast::UntypedExpr( loc,
+					new ast::VariableExpr( loc, terminate_catch ),
+					{
+						new ast::VariableExpr( loc, index ),
+						new ast::UntypedExpr( loc,
+							new ast::NameExpr( loc, "__cfaehm_get_current_termination" )
+						),
+					}
+				)
+			)
+		),
+	} );
 }
 
