Index: doc/working/exception/impl/except.c
===================================================================
--- doc/working/exception/impl/except.c	(revision a4683611af148ee016d982cf7b4d6480ab77e6fe)
+++ doc/working/exception/impl/except.c	(revision 2c6c893da1f277c21feff7afa11c8cb6223120fd)
@@ -4,4 +4,10 @@
 
 #include "lsda.h"
+
+// This macro should be the only thing that needs to change across machines.
+// struct _Unwind_Context * -> _Unwind_Reason_Code(*)()
+#define MATCHER_FROM_CONTEXT(ptr_to_context) \
+	(*(_Unwind_Reason_Code(**)())(_Unwind_GetCFA(ptr_to_context) + 8))
+
 
 //Global which defines the current exception
@@ -17,4 +23,6 @@
                      struct _Unwind_Exception* unwind_exception, struct _Unwind_Context* context)
 {
+	printf("CFA: 0x%lx\n", _Unwind_GetCFA(context));
+
 	//DEBUG
 	printf("Personality function (%d, %x, %llu, %p, %p):", version, actions, exceptionClass, unwind_exception, context);
@@ -111,5 +119,8 @@
 
 					//Get a function pointer from the relative offset and call it
-					_Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;					
+					// _Unwind_Reason_Code (*matcher)() = (_Unwind_Reason_Code (*)())lsd_info.LPStart + imatcher;					
+
+					_Unwind_Reason_Code (*matcher)() =
+						MATCHER_FROM_CONTEXT(context);
 					_Unwind_Reason_Code ret = matcher();
 
Index: doc/working/exception/impl/main.c
===================================================================
--- doc/working/exception/impl/main.c	(revision a4683611af148ee016d982cf7b4d6480ab77e6fe)
+++ doc/working/exception/impl/main.c	(revision 2c6c893da1f277c21feff7afa11c8cb6223120fd)
@@ -1,4 +1,6 @@
 #include <stdio.h>
 #include "except.h"
+
+// Requires -fexceptions to work.
 
 #define EXCEPTION 2
@@ -26,5 +28,6 @@
 extern int this_exception;
 _Unwind_Reason_Code foo_try_match() {
-	return this_exception == 3 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
+	printf(" (foo_try_match called)");
+	return this_exception == EXCEPTION ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
 }
 
@@ -34,6 +37,10 @@
 //for details
 __attribute__((noinline))
-void try( void (*try_block)(), void (*catch_block)() )
+void try( void (*try_block)(), void (*catch_block)(),
+          _Unwind_Reason_Code (*match_block)() )
 {
+	volatile int xy = 0;
+	printf("%p %p %p %p\n", &try_block, &catch_block, &match_block, &xy);
+
 	//Setup statments
 	//These 2 statments won't actually result in any code,
@@ -95,6 +102,4 @@
 	"	.uleb128 .CATCH-try\n"				//Hanlder landing pad adress  (relative to start of function)
 	"	.uleb128 1\n"						//Action code, gcc seems to use always 0
-	//Beyond this point we don't match gcc data'
-	"	.uleb128 foo_try_match-try\n"			//Handler routine to check if the exception is matched
 	".LLSDACSECFA2:\n"						//BODY end
 	"	.text\n"							//TABLE footer
@@ -122,13 +127,64 @@
 
 	//Actual call to the try block
-	try( foo_try_block, foo_catch_block );
+	try( foo_try_block, foo_catch_block, foo_try_match );
 
 	printf( "Foo exited normally\n" );
 }
 
+// Not in main.cfa
+void fy() {
+	// Currently not destroyed if the exception is caught in fee.
+	raii_t a = { "Fy dtor" };
+
+	void fy_try_block() {
+		raii_t b = { "Fy try dtor" };
+
+		throw( 3 );
+	}
+
+	void fy_catch_block() {
+		printf("Fy caught exception\n");
+	}
+
+	_Unwind_Reason_Code fy_match_block() {
+		return this_exception == 2 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
+	}
+
+	try(fy_try_block, fy_catch_block, fy_match_block);
+
+	printf( "Fy exited normally\n" );
+}
+
+void fee() {
+	raii_t a = { "Fee dtor" };
+
+	void fee_try_block() {
+		raii_t b = { "Fee try dtor" };
+
+		fy();
+
+		printf("fy returned\n");
+	}
+
+	void fee_catch_block() {
+		printf("Fee caught exception\n");
+	}
+
+	_Unwind_Reason_Code fee_match_block() {
+		return this_exception == 3 ? _URC_HANDLER_FOUND : _URC_CONTINUE_UNWIND;
+	}
+
+	try(fee_try_block, fee_catch_block, fee_match_block);
+
+	printf( "Fee exited normally\n" );
+}
+// End not in main.cfa
+
 int main() {
 	raii_t a = { "Main dtor" };
 
-	for (unsigned int i = 0 ; i < 100000000 ; ++i) foo();
+	//for (unsigned int i = 0 ; i < 100000000 ; ++i)
+	foo();
+	fee();
 
 	printf("End of program reached\n");
Index: doc/working/exception/reference.c
===================================================================
--- doc/working/exception/reference.c	(revision a4683611af148ee016d982cf7b4d6480ab77e6fe)
+++ doc/working/exception/reference.c	(revision 2c6c893da1f277c21feff7afa11c8cb6223120fd)
@@ -114,7 +114,10 @@
 // __builtin_eh_return_data_regno(^) ^=[0..3]? gives index.
 
+// Locally we also seem to have:
+_Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
 
 // GCC (Dwarf2 ?) Frame Layout Macros
-// https://gcc.gnu.org/onlinedocs/gccint/Frame-Layout.html
+// See: https://gcc.gnu.org/onlinedocs/gccint/Frame-Layout.html
+// Include from: ???
 
 FIRST_PARAM_OFFSET(fundecl)
Index: src/Common/PassVisitor.impl.h
===================================================================
--- src/Common/PassVisitor.impl.h	(revision a4683611af148ee016d982cf7b4d6480ab77e6fe)
+++ src/Common/PassVisitor.impl.h	(revision 2c6c893da1f277c21feff7afa11c8cb6223120fd)
@@ -1,8 +1,13 @@
 #pragma once
+
+#define VISIT_START( node )  \
+	call_previsit( node ); \
+
+#define VISIT_END( node )                \
+	return call_postvisit( node ); \
 
 #define MUTATE_START( node )  \
 	call_premutate( node ); \
 
-
 #define MUTATE_END( type, node )                \
 	return call_postmutate< type * >( node ); \
@@ -10,7 +15,7 @@
 
 #define VISIT_BODY( node )    \
-	call_previsit( node );  \
+	VISIT_START( node );  \
 	Visitor::visit( node ); \
-	call_postvisit( node ); \
+	VISIT_END( node ); \
 
 
@@ -39,5 +44,5 @@
 		if ( !empty( afterStmts ) ) { statements.splice( i, *afterStmts ); }
 		try {
-			*i = (*i)->accept( *this );
+			(*i)->accept( *this );
 		} catch ( SemanticError &e ) {
 			errors.append( e );
@@ -78,14 +83,14 @@
 	ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
 
-	Statement *newStmt = maybeVisit( stmt, *this );
+	maybeAccept( stmt, *this );
 
 	StmtList_t* beforeStmts = get_beforeStmts();
 	StmtList_t* afterStmts  = get_afterStmts();
 
-	if( empty(beforeStmts) && empty(afterStmts) ) { return newStmt; }
+	if( empty(beforeStmts) && empty(afterStmts) ) { return stmt; }
 
 	CompoundStmt *compound = new CompoundStmt( noLabels );
 	if( !empty(beforeStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *beforeStmts ); }
-	compound->get_kids().push_back( newStmt );
+	compound->get_kids().push_back( stmt );
 	if( !empty(afterStmts) ) { compound->get_kids().splice( compound->get_kids().end(), *afterStmts ); }
 	return compound;
@@ -187,7 +192,15 @@
 }
 
+//--------------------------------------------------------------------------
+// CompoundStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( CompoundStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+	call_beginScope();
+
+	visitStatementList( node->get_kids() );
+
+	call_endScope();
+	VISIT_END( node );
 }
 
@@ -203,7 +216,15 @@
 }
 
+//--------------------------------------------------------------------------
+// ExprStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ExprStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+	call_beginScope();
+
+	visitExpression( node->get_expr() );
+
+	call_endScope();
+	VISIT_END( node );
 }
 
@@ -222,7 +243,15 @@
 }
 
+//--------------------------------------------------------------------------
+// IfStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( IfStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node ); 
+
+	visitExpression( node->get_condition() );
+	node->set_thenPart ( visitStatement( node->get_thenPart() ) );
+	node->set_elsePart ( visitStatement( node->get_elsePart() ) );
+
+	VISIT_END( node );
 }
 
@@ -238,7 +267,14 @@
 }
 
+//--------------------------------------------------------------------------
+// WhileStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( WhileStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node ); 
+
+	visitExpression( node->get_condition() );
+	node->set_body( visitStatement( node->get_body() ) );
+
+	VISIT_END( node );
 }
 
@@ -253,8 +289,16 @@
 }
 
-
+//--------------------------------------------------------------------------
+// WhileStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ForStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node ); 
+
+	acceptAll( node->get_initialization(), *this );
+	visitExpression( node->get_condition() );
+	visitExpression( node->get_increment() );
+	node->set_body( visitStatement( node->get_body() ) );
+
+	VISIT_END( node );
 }
 
@@ -264,14 +308,21 @@
 
 	mutateAll( node->get_initialization(), *this );
-	node->set_condition(  mutateExpression( node->get_condition() ) );
-	node->set_increment(  mutateExpression( node->get_increment() ) );
-	node->set_body(  mutateStatement( node->get_body() ) );
+	node->set_condition( mutateExpression( node->get_condition() ) );
+	node->set_increment( mutateExpression( node->get_increment() ) );
+	node->set_body( mutateStatement( node->get_body() ) );
 
 	MUTATE_END( Statement, node );
 }
 
+//--------------------------------------------------------------------------
+// SwitchStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( SwitchStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node ); 
+
+	visitExpression( node->get_condition() );
+	visitStatementList( node->get_statements() );
+
+	VISIT_END( node );
 }
 
@@ -286,7 +337,14 @@
 }
 
+//--------------------------------------------------------------------------
+// SwitchStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( CaseStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node ); 
+	
+	visitExpression( node->get_condition() );
+	visitStatementList( node->get_statements() );
+	
+	VISIT_END( node );
 }
 
@@ -306,7 +364,13 @@
 }
 
+//--------------------------------------------------------------------------
+// ReturnStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( ReturnStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+
+	visitExpression( node->get_expr() );
+
+	VISIT_END( node );
 }
 
@@ -320,7 +384,14 @@
 }
 
+//--------------------------------------------------------------------------
+// TryStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( TryStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+
+	maybeAccept( node->get_block(), *this );
+	acceptAll( node->get_catchers(), *this );
+
+	VISIT_END( node );
 }
 
@@ -335,7 +406,14 @@
 }
 
+//--------------------------------------------------------------------------
+// CatchStmt
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( CatchStmt * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+
+	node->set_body( visitStatement( node->get_body() ) );
+	maybeAccept( node->get_decl(), *this );
+
+	VISIT_END( node );
 }
 
@@ -375,7 +453,15 @@
 }
 
+//--------------------------------------------------------------------------
+// UntypedExpr
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( UntypedExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+
+	for ( auto expr : node->get_args() ) {
+		visitExpression( expr );
+	}
+
+	VISIT_END( node );
 }
 
@@ -536,7 +622,18 @@
 }
 
+//--------------------------------------------------------------------------
+// UntypedExpr
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( StmtExpr * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+
+	// don't want statements from outer CompoundStmts to be added to this StmtExpr
+	ValueGuardPtr< TypeSubstitution * >      oldEnv        ( get_env_ptr() );
+	ValueGuardPtr< std::list< Statement* > > oldBeforeStmts( get_beforeStmts() );
+	ValueGuardPtr< std::list< Statement* > > oldAfterStmts ( get_afterStmts () );
+
+	Visitor::visit( node );
+
+	VISIT_END( node );
 }
 
@@ -640,7 +737,13 @@
 }
 
+//--------------------------------------------------------------------------
+// UntypedExpr
 template< typename pass_type >
 void PassVisitor< pass_type >::visit( SingleInit * node ) {
-	VISIT_BODY( node ); 
+	VISIT_START( node );
+
+	visitExpression( node->get_value() );
+
+	VISIT_END( node );
 }
 
Index: src/Makefile.am
===================================================================
--- src/Makefile.am	(revision a4683611af148ee016d982cf7b4d6480ab77e6fe)
+++ src/Makefile.am	(revision 2c6c893da1f277c21feff7afa11c8cb6223120fd)
@@ -43,5 +43,5 @@
 driver_cfa_cpp_SOURCES = ${SRC}
 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl			# yywrap
-driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Werror -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
+driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
 
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision a4683611af148ee016d982cf7b4d6480ab77e6fe)
+++ src/Makefile.in	(revision 2c6c893da1f277c21feff7afa11c8cb6223120fd)
@@ -447,5 +447,5 @@
 driver_cfa_cpp_SOURCES = ${SRC}
 driver_cfa_cpp_LDADD = ${LEXLIB} -ldl			# yywrap
-driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -Werror -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
+driver_cfa_cpp_CXXFLAGS = -Wno-deprecated -Wall -DDEBUG_ALL -I${abs_top_srcdir}/src/include -DYY_NO_INPUT -O2 -g -std=c++14
 driver_cfa_cpp_LDFLAGS = -Xlinker -export-dynamic
 all: $(BUILT_SOURCES)
