Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/CodeGen/CodeGenerator.cc	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed May 10 14:45:00 2017
-// Update Count     : 484
+// Last Modified On : Thu Jun  8 16:00:00 2017
+// Update Count     : 485
 //
 
@@ -908,4 +908,20 @@
 	}
 
+	void CodeGenerator::visit( ThrowStmt * throwStmt ) {
+		assertf( ! genC, "Throw statements should not reach code generation." );
+
+		output << ((throwStmt->get_kind() == ThrowStmt::Terminate) ?
+		           "throw" : "throwResume");
+		if (throwStmt->get_expr()) {
+			output << " ";
+			throwStmt->get_expr()->accept( *this );
+		}
+		if (throwStmt->get_target()) {
+			output << " _At ";
+			throwStmt->get_target()->accept( *this );
+		}
+		output << ";";
+	}
+
 	void CodeGenerator::visit( WhileStmt * whileStmt ) {
 		if ( whileStmt->get_isDoWhile() ) {
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/CodeGen/CodeGenerator.h	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed May 10 10:57:00 2017
-// Update Count     : 51
+// Last Modified On : Thu Jun  8 15:48:00 2017
+// Update Count     : 52
 //
 
@@ -91,4 +91,5 @@
 		virtual void visit( BranchStmt * );
 		virtual void visit( ReturnStmt * );
+		virtual void visit( ThrowStmt * );
 		virtual void visit( WhileStmt * );
 		virtual void visit( ForStmt * );
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/Parser/ParseNode.h	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 13:28:16 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Fri Mar 17 15:42:18 2017
-// Update Count     : 777
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jun 17 16:23:00 2017
+// Update Count     : 778
 //
 
@@ -393,4 +393,6 @@
 Statement * build_return( ExpressionNode * ctl );
 Statement * build_throw( ExpressionNode * ctl );
+Statement * build_resume( ExpressionNode * ctl );
+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 );
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/Parser/StatementNode.cc	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -9,7 +9,7 @@
 // Author           : Rodolfo G. Esteves
 // Created On       : Sat May 16 14:59:41 2015
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Thu Feb  2 22:16:40 2017
-// Update Count     : 327
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jun  8 16:16:00 2017
+// Update Count     : 328
 //
 
@@ -152,9 +152,24 @@
 	return new ReturnStmt( noLabels, exps.size() > 0 ? exps.back() : nullptr );
 }
+
 Statement *build_throw( ExpressionNode *ctl ) {
 	std::list< Expression * > exps;
 	buildMoveList( ctl, exps );
 	assertf( exps.size() < 2, "This means we are leaking memory");
-	return new ReturnStmt( noLabels, !exps.empty() ? exps.back() : nullptr, true );
+	return new ThrowStmt( noLabels, ThrowStmt::Terminate, !exps.empty() ? exps.back() : nullptr );
+}
+
+Statement *build_resume( ExpressionNode *ctl ) {
+	std::list< Expression * > exps;
+	buildMoveList( ctl, exps );
+	assertf( exps.size() < 2, "This means we are leaking memory");
+	return new ThrowStmt( noLabels, ThrowStmt::Resume, !exps.empty() ? exps.back() : nullptr );
+}
+
+Statement *build_resume_at( ExpressionNode *ctl, ExpressionNode *target ) {
+	std::list< Expression * > exps;
+	buildMoveList( ctl, exps );
+	assertf( exps.size() < 2, "This means we are leaking memory");
+	return new ThrowStmt( noLabels, ThrowStmt::Resume, !exps.empty() ? exps.back() : nullptr );
 }
 
Index: src/Parser/parser.yy
===================================================================
--- src/Parser/parser.yy	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/Parser/parser.yy	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -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 : Thu May 25 15:21:59 2017
-// Update Count     : 2398
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jun 25 16:58:00 2017
+// Update Count     : 2399
 //
 
@@ -931,7 +931,7 @@
 		{ $$ = new StatementNode( build_throw( $2 ) ); }
 	| THROWRESUME assignment_expression_opt ';'			// handles reresume
-		{ $$ = new StatementNode( build_throw( $2 ) ); }
+		{ $$ = new StatementNode( build_resume( $2 ) ); }
 	| THROWRESUME assignment_expression_opt AT assignment_expression ';' // handles reresume
-		{ $$ = new StatementNode( build_throw( $2 ) ); }
+		{ $$ = new StatementNode( build_resume_at( $2, $4 ) ); }
 	;
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/SynTree/Mutator.cc	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -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 30 16:45:19 2017
-// Update Count     : 22
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Mar  8 16:36:00 2017
+// Update Count     : 23
 //
 
@@ -153,4 +153,10 @@
 }
 
+Statement *Mutator::mutate( ThrowStmt *throwStmt ) {
+	throwStmt->set_expr( maybeMutate( throwStmt->get_expr(), *this ) );
+	throwStmt->set_target( maybeMutate( throwStmt->get_target(), *this ) );
+	return throwStmt;
+}
+
 Statement *Mutator::mutate( TryStmt *tryStmt ) {
 	tryStmt->set_block( maybeMutate( tryStmt->get_block(), *this ) );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/SynTree/Mutator.h	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -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 Feb  9 14:23:23 2017
-// Update Count     : 13
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jun  8 15:45:00 2017
+// Update Count     : 14
 //
 #include <cassert>
@@ -46,5 +46,6 @@
 	virtual Statement* mutate( BranchStmt *branchStmt );
 	virtual Statement* mutate( ReturnStmt *returnStmt );
-	virtual Statement* mutate( TryStmt *returnStmt );
+	virtual Statement* mutate( ThrowStmt *throwStmt );
+	virtual Statement* mutate( TryStmt *tryStmt );
 	virtual Statement* mutate( CatchStmt *catchStmt );
 	virtual Statement* mutate( FinallyStmt *catchStmt );
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/SynTree/Statement.cc	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -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 : Fri Aug 12 13:58:48 2016
-// Update Count     : 62
+// Last Modified By : Andrew Beach
+// Last Modified On : Thr Jun 08 16:22:00 2017
+// Update Count     : 63
 //
 
@@ -101,7 +101,7 @@
 }
 
-ReturnStmt::ReturnStmt( std::list<Label> labels, Expression *_expr, bool throwP ) : Statement( labels ), expr( _expr ), isThrow( throwP ) {}
-
-ReturnStmt::ReturnStmt( const ReturnStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ), isThrow( other.isThrow ) {}
+ReturnStmt::ReturnStmt( std::list<Label> labels, Expression *_expr ) : Statement( labels ), expr( _expr ) {}
+
+ReturnStmt::ReturnStmt( const ReturnStmt & other ) : Statement( other ), expr( maybeClone( other.expr ) ) {}
 
 ReturnStmt::~ReturnStmt() {
@@ -110,5 +110,5 @@
 
 void ReturnStmt::print( std::ostream &os, int indent ) const {
-	os << string ( isThrow? "Throw":"Return" ) << " Statement, returning: ";
+	os <<  "Return Statement, returning: ";
 	if ( expr != 0 ) {
 		os << endl << string( indent+2, ' ' );
@@ -285,4 +285,30 @@
 
 	os << endl;
+}
+
+ThrowStmt::ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr, Expression * target ) :
+		Statement( labels ), kind(kind), expr(expr), target(target)	{
+	assertf(Resume == kind || nullptr == target, "Non-local termination throw is not accepted." );
+}
+
+ThrowStmt::ThrowStmt( const ThrowStmt &other ) :
+	Statement ( other ), kind( other.kind ), expr( maybeClone( other.expr ) ), target( maybeClone( other.target ) ) {
+}
+
+ThrowStmt::~ThrowStmt() {
+	delete expr;
+	delete target;
+}
+
+void ThrowStmt::print( std::ostream &os, int indent) const {
+	if ( target ) {
+		os << "Non-Local ";
+	}
+	os << "Throw Statement, raising: ";
+	expr->print(os, indent + 4);
+	if ( target ) {
+		os << "At: ";
+		target->print(os, indent + 4);
+	}
 }
 
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/SynTree/Statement.h	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -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 : Fri Aug 12 13:57:46 2016
-// Update Count     : 65
+// Last Modified By : Andrew Beach
+// Last Modified On : Thr Jun 08 18:39:00 2017
+// Update Count     : 66
 //
 
@@ -57,4 +57,17 @@
   private:
 	std::list<Statement*> kids;
+};
+
+class NullStmt : public CompoundStmt {
+  public:
+	NullStmt();
+	NullStmt( std::list<Label> labels );
+
+	virtual NullStmt *clone() const { return new NullStmt( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual NullStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+
+  private:
 };
 
@@ -261,5 +274,5 @@
 class ReturnStmt : public Statement {
   public:
-	ReturnStmt( std::list<Label> labels, Expression *expr, bool throwP = false );
+	ReturnStmt( std::list<Label> labels, Expression *expr );
 	ReturnStmt( const ReturnStmt &other );
 	virtual ~ReturnStmt();
@@ -274,19 +287,30 @@
   private:
 	Expression *expr;
-	bool isThrow;
-};
-
-
-class NullStmt : public CompoundStmt {
-  public:
-	NullStmt();
-	NullStmt( std::list<Label> labels );
-
-	virtual NullStmt *clone() const { return new NullStmt( *this ); }
-	virtual void accept( Visitor &v ) { v.visit( this ); }
-	virtual NullStmt *acceptMutator( Mutator &m ) { return m.mutate( this ); }
-	virtual void print( std::ostream &os, int indent = 0 ) const;
-
-  private:
+};
+
+class ThrowStmt : public Statement {
+  public:
+	enum Kind { Terminate, Resume };
+
+	ThrowStmt( std::list<Label> labels, Kind kind, Expression * expr,
+	           Expression * target = nullptr );
+	ThrowStmt( const ThrowStmt &other );
+	virtual ~ThrowStmt();
+
+
+	Kind get_kind() { return kind; }
+	Expression * get_expr() { return expr; }
+	void set_expr( Expression * newExpr ) { expr = newExpr; }
+	Expression * get_target() { return target; }
+	void set_target( Expression * newTarget ) { target = newTarget; }
+
+	virtual ThrowStmt *clone() const { return new ThrowStmt( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Statement *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+  private:
+	Kind kind;
+	Expression * expr;
+	Expression * target;
 };
 
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/SynTree/SynTree.h	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -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 Feb  9 14:23:49 2017
-// Update Count     : 8
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jun  8 17:00:00 2017
+// Update Count     : 9
 //
 
@@ -51,4 +51,5 @@
 class BranchStmt;
 class ReturnStmt;
+class ThrowStmt;
 class TryStmt;
 class CatchStmt;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/SynTree/Visitor.cc	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -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 30 16:45:25 2017
-// Update Count     : 24
+// Last Modified By : Andrew Beach
+// Last Modified On : Thu Jun  8 16:31:00 2017
+// Update Count     : 25
 //
 
@@ -129,4 +129,9 @@
 }
 
+void Visitor::visit( ThrowStmt * throwStmt ) {
+	maybeAccept( throwStmt->get_expr(), *this );
+	maybeAccept( throwStmt->get_target(), *this );
+}
+
 void Visitor::visit( TryStmt *tryStmt ) {
 	maybeAccept( tryStmt->get_block(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 28762a1f5d7761f958590a5c4aadb1a52cdb9670)
+++ src/SynTree/Visitor.h	(revision daf1af80c44ed2335beaaef08ee5072ea619ef52)
@@ -10,6 +10,6 @@
 // Created On       : Mon May 18 07:44:20 2015
 // Last Modified By : Andrew Beach
-// Last Modified On : Wed May  3 08:58:00 2017
-// Update Count     : 10
+// Last Modified On : Thr Jun 08 15:45:00 2017
+// Update Count     : 11
 //
 
@@ -49,4 +49,5 @@
 	virtual void visit( BranchStmt *branchStmt );
 	virtual void visit( ReturnStmt *returnStmt );
+	virtual void visit( ThrowStmt *throwStmt );
 	virtual void visit( TryStmt *tryStmt );
 	virtual void visit( CatchStmt *catchStmt );
