Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision cfaabe2c14415175ec7c513717b8c8d4211ed05c)
+++ src/Parser/ParseNode.h	(revision 8d50e344e775c7beb69007ffc918d575885c8b86)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 13:28:16 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Jun 17 16:23:00 2017
-// Update Count     : 778
+// Last Modified On : Mon Jun 12 13:00:00 2017
+// Update Count     : 779
 //
 
@@ -396,5 +396,5 @@
 Statement * build_resume_at( ExpressionNode * ctl , ExpressionNode * target );
 Statement * build_try( StatementNode * try_stmt, StatementNode * catch_stmt, StatementNode * finally_stmt );
-Statement * build_catch( DeclarationNode * decl, StatementNode * stmt, bool catchAny = false );
+Statement * build_catch( CatchStmt::Kind kind, DeclarationNode *decl, ExpressionNode *cond, StatementNode *body );
 Statement * build_finally( StatementNode * stmt );
 Statement * build_compound( StatementNode * first );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision cfaabe2c14415175ec7c513717b8c8d4211ed05c)
+++ src/Parser/StatementNode.cc	(revision 8d50e344e775c7beb69007ffc918d575885c8b86)
@@ -10,6 +10,6 @@
 // Created On       : Sat May 16 14:59:41 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thu Jun  8 16:16:00 2017
-// Update Count     : 328
+// Last Modified On : Mon Jun 12 13:03:00 2017
+// Update Count     : 329
 //
 
@@ -181,9 +181,9 @@
 	return new TryStmt( noLabels, tryBlock, branches, finallyBlock );
 }
-Statement *build_catch( DeclarationNode *decl, StatementNode *stmt, bool catchAny ) {
-	std::list< Statement * > branches;
-	buildMoveList< Statement, StatementNode >( stmt, branches );
-	assert( branches.size() == 1 );
-	return new CatchStmt( noLabels, maybeMoveBuild< Declaration >(decl), branches.front(), catchAny );
+Statement *build_catch( CatchStmt::Kind kind, DeclarationNode *decl, ExpressionNode *cond, StatementNode *body ) {
+	std::list< Statement * > branches;
+	buildMoveList< Statement, StatementNode >( body, branches );
+	assert( branches.size() == 1 );
+	return new CatchStmt( noLabels, kind, maybeMoveBuild< Declaration >(decl), maybeMoveBuild< Expression >(cond), branches.front() );
 }
 Statement *build_finally( StatementNode *stmt ) {
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision cfaabe2c14415175ec7c513717b8c8d4211ed05c)
+++ src/Parser/parser.yy	(revision 8d50e344e775c7beb69007ffc918d575885c8b86)
@@ -10,6 +10,6 @@
 // Created On       : Sat Sep  1 20:22:55 2001
 // Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jun 10 07:58:44 2017
-// Update Count     : 2401
+// Last Modified On : Mon Jun 12 12:59:00 2017
+// Update Count     : 2402
 //
 
@@ -960,11 +960,11 @@
 handler_clause:
 	CATCH '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = new StatementNode( build_catch( $5, $8 ) ); }
+		{ $$ = new StatementNode( build_catch( CatchStmt::Terminate, $5, nullptr, $8 ) ); }
 	| handler_clause CATCH '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Terminate, $6, nullptr, $9 ) ) ); }
 	| CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = new StatementNode( build_catch( $5, $8 ) ); }
+		{ $$ = new StatementNode( build_catch( CatchStmt::Resume, $5, nullptr, $8 ) ); }
 	| handler_clause CATCHRESUME '(' push push exception_declaration pop ')' compound_statement pop
-		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( $6, $9 ) ) ); }
+		{ $$ = (StatementNode *)$1->set_last( new StatementNode( build_catch( CatchStmt::Resume, $6, nullptr, $9 ) ) ); }
 	;
 
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision cfaabe2c14415175ec7c513717b8c8d4211ed05c)
+++ src/SynTree/Statement.cc	(revision 8d50e344e775c7beb69007ffc918d575885c8b86)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Jun 08 16:22:00 2017
-// Update Count     : 63
+// Last Modified On : Mon Jun 12 10:37:00 2017
+// Update Count     : 64
 //
 
@@ -344,10 +344,10 @@
 }
 
-CatchStmt::CatchStmt( std::list<Label> labels, Declaration *_decl, Statement *_body, bool catchAny ) :
-	Statement( labels ), decl ( _decl ), body( _body ), catchRest ( catchAny ) {
+CatchStmt::CatchStmt( std::list<Label> labels, Kind _kind, Declaration *_decl, Expression *_cond, Statement *_body ) :
+	Statement( labels ), kind ( _kind ), decl ( _decl ), cond ( _cond ), body( _body ) {
 }
 
 CatchStmt::CatchStmt( const CatchStmt & other ) :
-	Statement( other ), decl ( maybeClone( other.decl ) ), body( maybeClone( other.body ) ), catchRest ( other.catchRest ) {
+	Statement( other ), kind ( other.kind ), decl ( maybeClone( other.decl ) ), cond ( maybeClone( other.cond ) ), body( maybeClone( other.body ) ) {
 }
 
@@ -358,5 +358,5 @@
 
 void CatchStmt::print( std::ostream &os, int indent ) const {
-	os << "Catch Statement" << endl;
+	os << "Catch " << ((Terminate == kind) ? "Terminate" : "Resume") << " Statement" << endl;
 
 	os << string( indent, ' ' ) << "... catching" << endl;
@@ -364,6 +364,5 @@
 		decl->printShort( os, indent + 4 );
 		os << endl;
-	} else if ( catchRest )
-		os << string( indent + 4 , ' ' ) << "the rest" << endl;
+	}
 	else
 		os << string( indent + 4 , ' ' ) << ">>> Error:  this catch clause must have a declaration <<<" << endl;
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision cfaabe2c14415175ec7c513717b8c8d4211ed05c)
+++ src/SynTree/Statement.h	(revision 8d50e344e775c7beb69007ffc918d575885c8b86)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Thr Jun 08 18:39:00 2017
-// Update Count     : 66
+// Last Modified On : Mon Jun 12 13:35:00 2017
+// Update Count     : 67
 //
 
@@ -293,9 +293,7 @@
 	enum Kind { Terminate, Resume };
 
-	ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr,
-	           Expression * target = nullptr );
+	ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr, Expression * target = nullptr );
 	ThrowStmt( const ThrowStmt &other );
 	virtual ~ThrowStmt();
-
 
 	Kind get_kind() { return kind; }
@@ -341,11 +339,16 @@
 class CatchStmt : public Statement {
   public:
-	CatchStmt( std::list<Label> labels, Declaration *decl, Statement *body, bool catchAny = false );
+	enum Kind { Terminate, Resume };
+
+	CatchStmt( std::list<Label> labels, Kind kind, Declaration *decl,
+	           Expression *cond, Statement *body );
 	CatchStmt( const CatchStmt &other );
 	virtual ~CatchStmt();
 
+	Kind get_kind() { return kind; }
 	Declaration *get_decl() { return decl; }
 	void set_decl( Declaration *newValue ) { decl = newValue; }
-
+	Expression *get_cond() { return cond; }
+	void set_cond( Expression *newCond ) { cond = newCond; }
 	Statement *get_body() { return body; }
 	void set_body( Statement *newValue ) { body = newValue; }
@@ -357,7 +360,8 @@
 
   private:
+	Kind kind;
 	Declaration *decl;
+	Expression *cond;
 	Statement *body;
-	bool catchRest;
 };
 
