Index: libcfa/src/exception.c
===================================================================
--- libcfa/src/exception.c	(revision 3e49c477928665a719e7a4c1179ab4364aae22de)
+++ libcfa/src/exception.c	(revision 142930b11bb7a219dee95933e7dd70643b471d38)
@@ -55,7 +55,4 @@
 }
 
-struct __cfaehm_base_exception_t * __cfaehm_get_current_exception(void) {
-	return this_exception_context()->current_exception;
-}
 
 // RESUMPTION ================================================================
@@ -312,5 +309,5 @@
 		struct _Unwind_Context * unwind_context)
 {
-	//__cfadbg_print_safe(exception, "CFA: 0x%lx\n", _Unwind_GetCFA(context));
+	//! __cfadbg_print_safe(exception, "CFA: 0x%lx\n", _Unwind_GetCFA(unwind_context));
 	__cfadbg_print_safe(exception, "Personality function (%d, %x, %llu, %p, %p):",
 			version, actions, exception_class, unwind_exception, unwind_context);
@@ -482,9 +479,9 @@
 // and simply linked from libcfa but there is one problem left, see the exception table for details
 __attribute__((noinline))
-int __cfaehm_try_terminate(void (*try_block)(),
-		__attribute__((unused)) void (*catch_block)(int index, exception_t * except),
+void __cfaehm_try_terminate(void (*try_block)(),
+		void (*catch_block)(int index, exception_t * except),
 		__attribute__((unused)) int (*match_block)(exception_t * except)) {
 	//! volatile int xy = 0;
-	//! printf("%p %p %p\n", &try_block, &match_block, &xy);
+	//! printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy);
 
 	// Setup the personality routine and exception table.
@@ -510,5 +507,5 @@
 
 	// Normal return for when there is no throw.
-	return 0;
+	return;
 
 	// Exceptionnal path
@@ -521,5 +518,8 @@
 	asm volatile (".CATCH:");
 
-	return EXCEPT_TO_NODE( this_exception_context()->current_exception )->handler_index;
+	// 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 );
 }
 
Index: libcfa/src/exception.h
===================================================================
--- libcfa/src/exception.h	(revision 3e49c477928665a719e7a4c1179ab4364aae22de)
+++ libcfa/src/exception.h	(revision 142930b11bb7a219dee95933e7dd70643b471d38)
@@ -43,5 +43,4 @@
 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));
@@ -58,5 +57,5 @@
 
 // Function catches termination exceptions.
-int __cfaehm_try_terminate(
+void __cfaehm_try_terminate(
 	void (*try_block)(),
 	void (*catch_block)(int index, exception_t * except),
Index: src/ControlStruct/ExceptTranslate.cpp
===================================================================
--- src/ControlStruct/ExceptTranslate.cpp	(revision 3e49c477928665a719e7a4c1179ab4364aae22de)
+++ src/ControlStruct/ExceptTranslate.cpp	(revision 142930b11bb7a219dee95933e7dd70643b471d38)
@@ -482,42 +482,15 @@
 		ast::FunctionDecl * terminate_catch,
 		ast::FunctionDecl * terminate_match ) {
-	// {
-	//     int __handler_index = __cfaehm_try_terminate(`try`, `match`);
-	//     if ( __handler_index ) {
-	//         `catch`( __handler_index, __cfaehm_get_current_exception() );
-	//     }
-	// }
-
-	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_catch ),
-					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_exception" )
-						),
-					}
-				)
-			)
-		),
-	} );
+	// { __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;
 }
 
