Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 1c01c5836c12d14d4c519d76550c0381bc562aaf)
+++ src/AST/Pass.hpp	(revision b9fa85b6bb101567c376a002614067feab620b7b)
@@ -118,4 +118,5 @@
 
 	// Versions of the above for older compilers.
+	template< typename... Args >
 	static void run( std::list< ptr<Decl> > & decls ) {
 		Pass<core_t> visitor;
@@ -123,7 +124,8 @@
 	}
 
-	static auto read( Node const * node ) {
+	template< typename node_type, typename... Args >
+	static auto read( node_type const * node ) {
 		Pass<core_t> visitor;
-		Node const * temp = node->accept( visitor );
+		node_type const * temp = node->accept( visitor );
 		assert( temp == node );
 		return visitor.get_result();
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 1c01c5836c12d14d4c519d76550c0381bc562aaf)
+++ src/ResolvExpr/Resolver.cc	(revision b9fa85b6bb101567c376a002614067feab620b7b)
@@ -1259,4 +1259,5 @@
 		const ast::ThrowStmt *       previsit( const ast::ThrowStmt * );
 		const ast::CatchStmt *       previsit( const ast::CatchStmt * );
+		const ast::CatchStmt *       postvisit( const ast::CatchStmt * );
 		const ast::WaitForStmt *     previsit( const ast::WaitForStmt * );
 
@@ -1491,10 +1492,30 @@
 
 	const ast::CatchStmt * Resolver_new::previsit( const ast::CatchStmt * catchStmt ) {
-		// TODO: This will need a fix for the decl/cond scoping problem.
+		// Until we are very sure this invarent (ifs that move between passes have thenPart)
+		// holds, check it. This allows a check for when to decode the mangling.
+		if ( auto ifStmt = catchStmt->body.as<ast::IfStmt>() ) {
+			assert( ifStmt->thenPart );
+		}
+		// Encode the catchStmt so the condition can see the declaration.
 		if ( catchStmt->cond ) {
-			ast::ptr< ast::Type > boolType = new ast::BasicType{ ast::BasicType::Bool };
-			catchStmt = ast::mutate_field(
-				catchStmt, &ast::CatchStmt::cond,
-				findSingleExpression( catchStmt->cond, boolType, symtab ) );
+			ast::CatchStmt * stmt = mutate( catchStmt );
+			stmt->body = new ast::IfStmt( stmt->location, stmt->cond, nullptr, stmt->body );
+			stmt->cond = nullptr;
+			return stmt;
+		}
+		return catchStmt;
+	}
+
+	const ast::CatchStmt * Resolver_new::postvisit( const ast::CatchStmt * catchStmt ) {
+		// Decode the catchStmt so everything is stored properly.
+		const ast::IfStmt * ifStmt = catchStmt->body.as<ast::IfStmt>();
+		if ( nullptr != ifStmt && nullptr == ifStmt->thenPart ) {
+			assert( ifStmt->cond );
+			assert( ifStmt->elsePart );
+			ast::CatchStmt * stmt = ast::mutate( catchStmt );
+			stmt->cond = ifStmt->cond;
+			stmt->body = ifStmt->elsePart;
+			// ifStmt should be implicately deleted here.
+			return stmt;
 		}
 		return catchStmt;
