Index: src/ControlStruct/ExceptTranslate.cc
===================================================================
--- src/ControlStruct/ExceptTranslate.cc	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/ControlStruct/ExceptTranslate.cc	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,5 +10,5 @@
 // Created On       : Wed Jun 14 16:49:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Aug 02 12:09:00 2017
+// Last Modified On : Tus Aug  8 16:54:00 2017
 // Update Count     : 7
 //
@@ -116,7 +116,5 @@
 			handle_func_t( noQualifiers, false ),
 			finally_func_t( noQualifiers, false )
-		{
-			init_func_types();
-		}
+		{}
 
 		void premutate( CatchStmt *catchStmt );
@@ -127,4 +125,6 @@
 
 	void ExceptionMutatorCore::init_func_types() {
+		assert( except_decl );
+
 		ObjectDecl index_obj(
 			"__handler_index",
@@ -142,6 +142,5 @@
 			new PointerType(
 				noQualifiers,
-				//new StructInstType( noQualifiers, except_decl )
-				new BasicType( noQualifiers, BasicType::SignedInt )
+				new StructInstType( noQualifiers, except_decl )
 				),
 			/*init*/ NULL
@@ -183,28 +182,15 @@
 	Statement * ExceptionMutatorCore::create_given_throw(
 			const char * throwFunc, ThrowStmt * throwStmt ) {
-		// There is an extra copy here we might be able to remove with
-		// references.
-		// { int NAME = EXPR; throwFunc( &NAME ); }
-		CompoundStmt * result = new CompoundStmt( noLabels );
-		ObjectDecl * local = new ObjectDecl(
-			"__local_exception_copy",
-			Type::StorageClasses(),
-			LinkageSpec::Cforall,
-			NULL,
-			new BasicType( noQualifiers, BasicType::SignedInt ),
-			new SingleInit( throwStmt->get_expr() )
-			);
-		appendDeclStmt( result, local );
+		// `throwFunc`( `throwStmt->get_name` );
 		UntypedExpr * call = new UntypedExpr( new NameExpr( throwFunc ) );
-		call->get_args().push_back( new AddressExpr( nameOf( local ) ) );
-		result->push_back( new ExprStmt( throwStmt->get_labels(), call ) );
+		call->get_args().push_back( throwStmt->get_expr() );
 		throwStmt->set_expr( nullptr );
 		delete throwStmt;
-		return result;
+		return new ExprStmt( noLabels, call );
 	}
 
 	Statement * ExceptionMutatorCore::create_terminate_throw(
 			ThrowStmt *throwStmt ) {
-		// { int NAME = EXPR; __throw_terminate( &NAME ); }
+		// __throw_terminate( `throwStmt->get_name()` ); }
 		return create_given_throw( "__cfaehm__throw_terminate", throwStmt );
 	}
@@ -236,5 +222,5 @@
 	Statement * ExceptionMutatorCore::create_resume_throw(
 			ThrowStmt *throwStmt ) {
-		// __throw_resume( EXPR );
+		// __throw_resume( `throwStmt->get_name` );
 		return create_given_throw( "__cfaehm__throw_resume", throwStmt );
 	}
@@ -253,5 +239,4 @@
 	// TryStmt Mutation Helpers
 
-	// XXX: Leave out?
 	CompoundStmt * ExceptionMutatorCore::take_try_block( TryStmt *tryStmt ) {
 		CompoundStmt * block = tryStmt->get_block();
@@ -282,21 +267,4 @@
 			CatchStmt * handler = *it;
 
-			// INTEGERconstant Version
-			// case `index`:
-			// {
-			//     `handler.decl` {inserted} = { except_obj };
-			//     `handler.body`
-			// }
-			// return;
-			CompoundStmt * block = new CompoundStmt( noLabels );
-
-			// Just copy the exception value. (Post Validation)
-			ObjectDecl * handler_decl =
-				static_cast<ObjectDecl *>( handler->get_decl() );
-			ObjectDecl * local_except = handler_decl->clone();
-			local_except->set_init(
-				new ListInit({ new SingleInit( nameOf( except_obj ) ) }) );
-#if 0
-			// Virtual Exception Vision
 			// case `index`:
 			// {
@@ -305,6 +273,10 @@
 			// }
 			// return;
-
-			// Save a cast copy of the exception (should always succeed).
+			CompoundStmt * block = new CompoundStmt( noLabels );
+
+			// Just copy the exception value. (Post Validation)
+			ObjectDecl * handler_decl =
+				static_cast<ObjectDecl *>( handler->get_decl() );
+			ObjectDecl * local_except = handler_decl->clone();
 			local_except->set_init(
 				new ListInit({ new SingleInit(
@@ -314,5 +286,4 @@
 					) })
 				);
-#endif
 			block->push_back( new DeclStmt( noLabels, local_except ) );
 
@@ -366,19 +337,19 @@
 	CompoundStmt * ExceptionMutatorCore::create_single_matcher(
 			DeclarationWithType * except_obj, CatchStmt * modded_handler ) {
+		// {
+		//     `modded_handler.decl`
+		//     if ( `decl.name = (virtual `decl.type`)`except`
+		//             [&& `modded_handler.cond`] ) {
+		//         `modded_handler.body`
+		//     }
+		// }
+
 		CompoundStmt * block = new CompoundStmt( noLabels );
 
+		// Local Declaration
 		ObjectDecl * local_except =
 			dynamic_cast<ObjectDecl *>( modded_handler->get_decl() );
 		assert( local_except );
 		block->push_back( new DeclStmt( noLabels, local_except ) );
-#if 0
-		// Virtual Exception Version
-		// {
-		//     `modded_handler.decl`
-		//     if ( `decl.name = (virtual)`except`
-		//             [&& `modded_handler.cond`] ) {
-		//         `modded_handler.body`
-		//     }
-		// }
 
 		// Check for type match.
@@ -386,31 +357,4 @@
 			new VirtualCastExpr( nameOf( except_obj ),
 				local_except->get_type()->clone() ) );
-#endif
-
-		// INTEGERconstant Version
-		// {
-		//     `modded_handler.decl` = *`except`
-		//     if ( `decl.name` == `modded_handler.cond` ) {
-		//         `modded_handler.body`
-		//     }
-		// }
-		ConstantExpr * number =
-			dynamic_cast<ConstantExpr*>( modded_handler->get_cond() );
-		assert( number );
-		modded_handler->set_cond( nullptr );
-
-		Expression * cond;
-		{
-			std::list<Expression *> args;
-			args.push_back( number );
-
-			std::list<Expression *> rhs_args;
-			rhs_args.push_back( nameOf( except_obj ) );
-			Expression * rhs = new UntypedExpr(
-				new NameExpr( "*?" ), rhs_args );
-			args.push_back( rhs );
-
-			cond = new UntypedExpr( new NameExpr( "?==?" /*???*/), args );
-		}
 
 		// Add the check on the conditional if it is provided.
@@ -607,20 +551,4 @@
 	// Visiting/Mutating Functions
 	void ExceptionMutatorCore::premutate( CatchStmt *catchStmt ) {
-		// Currently, we make up the declaration, as there isn't one for
-		// integers.
-		assert( ! catchStmt->get_decl() );
-		ObjectDecl * tmp = new ObjectDecl(
-			"_hidden_local",
-			Type::StorageClasses(),
-			LinkageSpec::Cforall,
-			nullptr,
-			new PointerType(
-				noQualifiers,
-				new BasicType( noQualifiers, BasicType::SignedInt )
-				),
-			nullptr
-			);
-		catchStmt->set_decl( tmp );
-
 		// Validate the Statement's form.
 		ObjectDecl * decl =
@@ -650,4 +578,8 @@
 			// Skip children?
 			return;
+		} else if ( structDecl->get_name() == "__cfaehm__base_exception_t" ) {
+			assert( nullptr == except_decl );
+			except_decl = structDecl;
+			init_func_types();
 		} else if ( structDecl->get_name() == "__cfaehm__try_resume_node" ) {
 			assert( nullptr == node_decl );
@@ -661,4 +593,6 @@
 
 	Statement * ExceptionMutatorCore::postmutate( ThrowStmt *throwStmt ) {
+		assert( except_decl );
+
 		// Ignoring throwStmt->get_target() for now.
 		if ( ThrowStmt::Terminate == throwStmt->get_kind() ) {
@@ -688,4 +622,5 @@
 
 	Statement * ExceptionMutatorCore::postmutate( TryStmt *tryStmt ) {
+		assert( except_decl );
 		assert( node_decl );
 		assert( hook_decl );
Index: src/Parser/TypeData.cc
===================================================================
--- src/Parser/TypeData.cc	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/Parser/TypeData.cc	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 15:12:51 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Tus Jul 18 10:10:00 2017
-// Update Count     : 566
+// Last Modified On : Wed Aug  9 13:50:00 2017
+// Update Count     : 567
 //
 
@@ -748,10 +748,10 @@
 } // buildAggInst
 
-NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs ) {
+NamedTypeDecl * buildSymbolic( const TypeData * td, const string & name, Type::StorageClasses scs, LinkageSpec::Spec linkage ) {
 	assert( td->kind == TypeData::Symbolic );
 	NamedTypeDecl * ret;
 	assert( td->base );
 	if ( td->symbolic.isTypedef ) {
-		ret = new TypedefDecl( name, scs, typebuild( td->base ) );
+		ret = new TypedefDecl( name, scs, typebuild( td->base ), linkage );
 	} else {
 		ret = new TypeDecl( name, scs, typebuild( td->base ), TypeDecl::Any );
@@ -817,5 +817,5 @@
 		return buildEnum( td, attributes );
 	} else if ( td->kind == TypeData::Symbolic ) {
-		return buildSymbolic( td, name, scs );
+		return buildSymbolic( td, name, scs, linkage );
 	} else {
 		return (new ObjectDecl( name, scs, linkage, bitfieldWidth, typebuild( td ), init, attributes ))->set_asmName( asmName );
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/Parser/parser.yy	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -9,7 +9,7 @@
 // Author           : Peter A. Buhr
 // Created On       : Sat Sep  1 20:22:55 2001
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Mon Jul 31 14:54:32 2017
-// Update Count     : 2474
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Aug  4 13:33:00 2017
+// Update Count     : 2475
 //
 
@@ -182,4 +182,5 @@
 %type<en> asm_clobbers_list_opt
 %type<flag> asm_volatile_opt
+%type<en> handler_predicate_opt
 
 // statements
@@ -968,19 +969,15 @@
 
 handler_clause:
-	// TEMPORARY, TEST EXCEPTIONS
-	handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
-		{ $$ = new StatementNode( build_catch( $1, nullptr, new ExpressionNode( build_constantInteger( *$5 ) ), $8 ) ); }
-	| handler_clause handler_key '(' push push INTEGERconstant pop ')' compound_statement pop
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, nullptr, new ExpressionNode( build_constantInteger( *$6 ) ), $9 ) ) ); }
-
-	| handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
-		{ $$ = new StatementNode( build_catch( $1, $5, nullptr, $9 ) ); }
+	handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
+		{ $$ = new StatementNode( build_catch( $1, $5, $7, $9 ) ); }
 	| handler_clause handler_key '(' push push exception_declaration pop handler_predicate_opt ')' compound_statement pop
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, nullptr, $10 ) ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $2, $6, $8, $10 ) ) ); }
 	;
 
 handler_predicate_opt:
 	//empty
+		{ $$ = nullptr; }
 	| ';' conditional_expression
+		{ $$ = $2; }
 	;
 
@@ -1674,28 +1671,4 @@
 	| aggregate_key attribute_list_opt typegen_name		// CFA
 		{ $$ = $3->addQualifiers( $2 ); }
-
-// Temp, testing TreeStruct
-    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name
-        {
-            typedefTable.makeTypedef( *$4 );            // create typedef
-            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
-            forall = false;                             // reset
-        }
-      '{' field_declaration_list '}'
-        {
-            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
-                $4, nullptr, nullptr, $7, true )->addQualifiers( $3 );
-        }
-    | STRUCT TRY attribute_list_opt no_attr_identifier_or_type_name TYPEDEFname
-        {
-            typedefTable.makeTypedef( *$4 );            // create typedef
-            if ( forall ) typedefTable.changeKind( *$4, TypedefTable::TG ); // $
-            forall = false;                             // reset
-        }
-      '{' field_declaration_list '}'
-        {
-            $$ = DeclarationNode::newTreeStruct( DeclarationNode::Struct,
-                $4, $5, nullptr, $8, true )->addQualifiers( $3 );
-        }
 	;
 
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/ResolvExpr/Resolver.cc	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 12:17:01 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 23 17:23:14 2017
-// Update Count     : 211
+// Last Modified By : Andrew Beach
+// Last Modified On : Tus Aug  8 16:06:00 2017
+// Update Count     : 212
 //
 
@@ -71,4 +71,5 @@
 		virtual void visit( ReturnStmt *returnStmt ) override;
 		virtual void visit( ThrowStmt *throwStmt ) override;
+		virtual void visit( CatchStmt *catchStmt ) override;
 
 		virtual void visit( SingleInit *singleInit ) override;
@@ -368,8 +369,31 @@
 
 	void Resolver::visit( ThrowStmt *throwStmt ) {
+		// TODO: Replace *exception type with &exception type.
 		if ( throwStmt->get_expr() ) {
-			Expression * wrapped = new CastExpr( throwStmt->get_expr(), new BasicType( Type::Qualifiers(), BasicType::SignedInt ) );
+			StructDecl * exception_decl =
+				lookupStruct( "__cfaehm__base_exception_t" );
+			assert( exception_decl );
+			Expression * wrapped = new CastExpr(
+				throwStmt->get_expr(),
+				new PointerType(
+					noQualifiers,
+					new StructInstType(
+						noQualifiers,
+						exception_decl
+						)
+					)
+				);
 			Expression * newExpr = findSingleExpression( wrapped, *this );
 			throwStmt->set_expr( newExpr );
+		}
+	}
+
+	void Resolver::visit( CatchStmt *catchStmt ) {
+		if ( catchStmt->get_cond() ) {
+			Expression * wrapped = new CastExpr(
+				catchStmt->get_cond(),
+				new BasicType( noQualifiers, BasicType::Bool )
+				);
+			catchStmt->set_cond( findSingleExpression( wrapped, *this ) );
 		}
 	}
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/SymTab/Validate.cc	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Sun May 17 21:50:04 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 30 16:50:13 2017
-// Update Count     : 357
+// Last Modified By : Andrew Beach
+// Last Modified On : Tus Aug  8 13:27:00 2017
+// Update Count     : 358
 //
 
@@ -686,9 +686,9 @@
 		Type *designatorType = tyDecl->get_base()->stripDeclarator();
 		if ( StructInstType *aggDecl = dynamic_cast< StructInstType * >( designatorType ) ) {
-			return new StructDecl( aggDecl->get_name() );
+			return new StructDecl( aggDecl->get_name(), DeclarationNode::Struct, noAttributes, tyDecl->get_linkage() );
 		} else if ( UnionInstType *aggDecl = dynamic_cast< UnionInstType * >( designatorType ) ) {
-			return new UnionDecl( aggDecl->get_name() );
+			return new UnionDecl( aggDecl->get_name(), noAttributes, tyDecl->get_linkage() );
 		} else if ( EnumInstType *enumDecl = dynamic_cast< EnumInstType * >( designatorType ) ) {
-			return new EnumDecl( enumDecl->get_name() );
+			return new EnumDecl( enumDecl->get_name(), noAttributes, tyDecl->get_linkage() );
 		} else {
 			return ret->clone();
@@ -783,5 +783,5 @@
 				type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
 			} // if
-			TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), Type::StorageClasses(), type ) );
+			TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), Type::StorageClasses(), type, aggDecl->get_linkage() ) );
 			typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel );
 		} // if
Index: src/SynTree/AggregateDecl.cc
===================================================================
--- src/SynTree/AggregateDecl.cc	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/SynTree/AggregateDecl.cc	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,6 +10,6 @@
 // Created On       : Sun May 17 23:56:39 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Tus Jun 27 15:30:00 2017
-// Update Count     : 21
+// Last Modified On : Fri Aug  4 14:22:00 2017
+// Update Count     : 22
 //
 
@@ -40,6 +40,9 @@
 	using std::endl;
 
-	os << typeString() << " " << get_name();
-	os << string( indent+2, ' ' ) << "with body " << has_body() << endl;
+	os << typeString() << " " << get_name() << ":";
+	if ( get_linkage() != LinkageSpec::Cforall ) {
+		os << " " << LinkageSpec::linkageName( get_linkage() );
+	} // if
+	os << " with body " << has_body() << endl;
 
 	if ( ! parameters.empty() ) {
Index: src/SynTree/Declaration.h
===================================================================
--- src/SynTree/Declaration.h	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/SynTree/Declaration.h	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 09:52:59 2017
-// Update Count     : 124
+// Last Modified By : Andrew Beach
+// Last Modified On : Tus Aug  8 13:25:00 2017
+// Update Count     : 125
 //
 
@@ -223,5 +223,5 @@
 	typedef NamedTypeDecl Parent;
   public:
-	TypedefDecl( const std::string &name, Type::StorageClasses scs, Type *type ) : Parent( name, scs, type ) {}
+	TypedefDecl( const std::string &name, Type::StorageClasses scs, Type *type, LinkageSpec::Spec spec = LinkageSpec::Cforall ) : Parent( name, scs, type ) { set_linkage( spec ); }
 	TypedefDecl( const TypedefDecl &other ) : Parent( other ) {}
 
Index: src/SynTree/NamedTypeDecl.cc
===================================================================
--- src/SynTree/NamedTypeDecl.cc	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/SynTree/NamedTypeDecl.cc	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -9,7 +9,7 @@
 // Author           : Richard C. Bilson
 // Created On       : Mon May 18 07:44:20 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Mar 16 07:49:44 2017
-// Update Count     : 13
+// Last Modified By : Andrew Beach
+// Last Modified On : Wed Aug  9 13:28:00 2017
+// Update Count     : 14
 //
 
@@ -38,4 +38,7 @@
 	if ( get_name() != "" ) {
 		os << get_name() << ": ";
+	} // if
+	if ( get_linkage() != LinkageSpec::Cforall ) {
+		os << LinkageSpec::linkageName( get_linkage() ) << " ";
 	} // if
 	get_storageClasses().print( os );
Index: src/Virtual/ExpandCasts.cc
===================================================================
--- src/Virtual/ExpandCasts.cc	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/Virtual/ExpandCasts.cc	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jul 24 13:59:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed Jul 26 14:16:00 2017
-// Update Count     : 0
+// Last Modified On : Tus Aug  2 14:59:00 2017
+// Update Count     : 1
 //
 
@@ -78,5 +78,5 @@
 
 	void VirtualCastCore::premutate( FunctionDecl * functionDecl ) {
-		if ( (! vcast_decl) && functionDecl->get_statements() &&
+		if ( (! vcast_decl) &&
 		     functionDecl->get_name() == "__cfa__virtual_cast" ) {
 			vcast_decl = functionDecl;
@@ -101,16 +101,19 @@
 		assertf( castExpr->get_result(), "Virtual Cast target not found before expansion." );
 
-		//assert( vcast_decl );
+		assert( vcast_decl );
 		assert( pvt_decl );
 
 		// May only cast to a pointer or reference type.
 		// A earlier validation should give a syntax error, this is
-		// just to make sure errors don't creep in.
+		// just to make sure errors don't creep during translation.
+		// Move to helper with more detailed error messages.
 		PointerType * target_type =
 			dynamic_cast<PointerType *>( castExpr->get_result() );
-        assert( target_type );
+		assert( target_type );
 
 		StructInstType * target_struct =
 			dynamic_cast<StructInstType *>( target_type->get_base() );
+		assert( target_struct );
+
 		StructDecl * target_decl = target_struct->get_baseStruct();
 
@@ -124,16 +127,22 @@
 
 		Expression * result = new CastExpr(
-			//new ApplicationExpr( new VariableExpr( vcast_decl ), {
+			//new ApplicationExpr(
+				//new AddressExpr( new VariableExpr( vcast_decl ) ),
+				//new CastExpr( new VariableExpr( vcast_decl ),
+				//	new PointerType( noQualifiers,
+				//		vcast_decl->get_type()->clone()
+				//		)
+				//	),
 			new UntypedExpr( new NameExpr( "__cfa__virtual_cast" ), {
-				new CastExpr(
-					new AddressExpr( new VariableExpr( table ) ),
-					pointer_to_pvt(1)
-					),
-				new CastExpr(
-					castExpr->get_arg(),
-					pointer_to_pvt(2)
-					) }
-				),
-			castExpr->get_result()
+					new CastExpr(
+						new AddressExpr( new VariableExpr( table ) ),
+						pointer_to_pvt(1)
+						),
+					new CastExpr(
+						castExpr->get_arg(),
+						pointer_to_pvt(2)
+						)
+				} ),
+			castExpr->get_result()->clone()
 			);
 
Index: src/libcfa/exception.c
===================================================================
--- src/libcfa/exception.c	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/libcfa/exception.c	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,7 +10,9 @@
 // Created On       : Mon Jun 26 15:13:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Mon Jul 31 13:51:00 2017
-// Update Count     : 4
+// Last Modified On : Fri Aug  4 15:20:00 2017
+// Update Count     : 6
 //
+
+#include <stddef.h> // for size_t
 
 #include "exception.h"
@@ -32,4 +34,16 @@
 #include "lsda.h"
 
+
+// Base exception vtable is abstract, you should not have base exceptions.
+struct __cfaehm__base_exception_t_vtable
+		___cfaehm__base_exception_t_vtable_instance = {
+	.parent = NULL,
+	.size = 0,
+	.copy = NULL,
+	.free = NULL,
+	.msg = NULL
+};
+
+
 // Temperary global exception context. Does not work with concurency.
 struct exception_context_t {
@@ -39,8 +53,5 @@
     exception * current_exception;
     int current_handler_index;
-
-	// Storage to avoid using the heap for exceptions.
-	exception built_in_storage;
-} shared_stack = {NULL, NULL, 0, 0, 0};
+} shared_stack = {NULL, NULL, 0, 0};
 
 // Get the current exception context.
@@ -69,5 +80,5 @@
 
 	// DEBUG
-	printf("Throwing resumption exception %d\n", *except);
+	printf("Throwing resumption exception\n");
 
 	struct __cfaehm__try_resume_node * original_head = shared_stack.current_resume;
@@ -83,5 +94,5 @@
 	}
 
-	printf("Unhandled exception %d\n", *except);
+	printf("Unhandled exception\n");
 	shared_stack.current_resume = original_head;
 
@@ -124,5 +135,5 @@
 	// Allocate memory for the exception.
 	struct __cfaehm__node * store = malloc(
-		sizeof( except ) + sizeof( struct __cfaehm__node ) );
+		sizeof( struct __cfaehm__node ) + except->virtual_table->size );
 
 	if ( ! store ) {
@@ -136,5 +147,5 @@
 
 	// Copy the exception to storage.
-	*context->current_exception = *except;
+	except->virtual_table->copy( context->current_exception, except );
 }
 
@@ -144,5 +155,5 @@
 
 	// DEBUG
-	printf( "Deleting Exception %d\n", *except);
+	printf( "Deleting Exception\n");
 
 	// Remove the exception from the list.
@@ -163,10 +174,11 @@
 
 	// Free the old exception node.
+	except->virtual_table->free( except );
 	free( to_free );
 }
 
 // If this isn't a rethrow (*except==0), delete the provided exception.
-void __cfaehm__cleanup_terminate( exception ** except ) {
-	if ( *except ) __cfaehm__delete_exception( *except );
+void __cfaehm__cleanup_terminate( void * except ) {
+	if ( *(void**)except ) __cfaehm__delete_exception( *(exception**)except );
 }
 
Index: src/libcfa/exception.h
===================================================================
--- src/libcfa/exception.h	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/libcfa/exception.h	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -10,6 +10,6 @@
 // Created On       : Mon Jun 26 15:11:00 2017
 // Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 27 12:42:00 2017
-// Update Count     : 4
+// Last Modified On : Fri Aug  4 15:20:00 2017
+// Update Count     : 5
 //
 
@@ -21,20 +21,19 @@
 #endif
 
-#if 1
-typedef int exception;
-#else
-struct exception_t;
-struct exception_t_vtable {
-	struct exception_t_vtable const * parent;
+struct __cfaehm__base_exception_t;
+typedef struct __cfaehm__base_exception_t exception;
+struct __cfaehm__base_exception_t_vtable {
+	const struct __cfaehm__base_exception_t_vtable * parent;
 	size_t size;
-	void (*copy)(struct exception_t *this, struct exception_t * other);
-	void (*free)(struct exception_t *this);
-	const char (*msg)(struct exception_t *this);
+	void (*copy)(struct __cfaehm__base_exception_t *this,
+	             struct __cfaehm__base_exception_t * other);
+	void (*free)(struct __cfaehm__base_exception_t *this);
+	const char (*msg)(struct __cfaehm__base_exception_t *this);
 };
-struct exception_t {
-	struct exception_vtable const * virtual_table;
+struct __cfaehm__base_exception_t {
+	struct __cfaehm__base_exception_t_vtable const * virtual_table;
 };
-typedef struct exception_t exception;
-#endif
+extern struct __cfaehm__base_exception_t_vtable
+	___cfaehm__base_exception_t_vtable_instance;
 
 
@@ -51,5 +50,5 @@
 
 // Clean-up the exception in catch blocks.
-void __cfaehm__cleanup_terminate(exception ** except);
+void __cfaehm__cleanup_terminate(void * except);
 
 // Data structure creates a list of resume handlers.
Index: src/tests/except-0.c
===================================================================
--- src/tests/except-0.c	(revision e19509374076334f91b1cbed8f4635c80943b328)
+++ src/tests/except-0.c	(revision cbce2727f642c2a177c82c045248ba1923699527)
@@ -6,4 +6,5 @@
 #include <stdbool.h>
 
+// Local type to mark exits from scopes. (see ERROR)
 struct signal_exit {
 	const char * area;
@@ -19,5 +20,27 @@
 }
 
-void terminate(int except_value) {
+
+// Local Exception Types and manual vtable types.
+//#define TRIVIAL_EXCEPTION(name) //TRIVAL_EXCEPTION(yin)
+struct yin;
+struct yin_vtable {
+	struct exception_t_vtable const * parent;
+	size_t size;
+    void (*copy)(yin *this, yin * other);
+    void (*free)(yin *this);
+    const char (*msg)(yin *this);
+};
+struct yin {
+	struct yin_vtable const * parent;
+};
+void yin_msg(yin) {
+	return "in";
+}
+yin_vtable _yin_vtable_instance = {
+	&_exception_t_vtable_instance, sizeof(yin), ?{}, ^?{}, yin_msg
+}
+
+
+void terminate(exception * except_value) {
 	signal_exit a = {"terminate function"};
 	throw except_value;
@@ -25,5 +48,5 @@
 }
 
-void resume(int except_value) {
+void resume(exception * except_value) {
 	signal_exit a = {"resume function"};
 	throwResume except_value;
