Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
+++ 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 d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
+++ 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 d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
+++ 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 d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
+++ 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 d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
+++ 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 d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
+++ 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 d7dc82447d825854b37e78a7aa777b1a58e7e1b2)
+++ 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 );
