Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 21a44ca0c18d2b218534fb18cad0a2612ec50542)
+++ src/AST/Convert.cpp	(revision 6f4b7f26591504e8cd05f06a27034b50ccca41e3)
@@ -397,8 +397,8 @@
 		ThrowStmt::Kind kind;
 		switch (node->kind) {
-		case ast::ThrowStmt::Terminate:
+		case ast::ExceptionKind::Terminate:
 			kind = ThrowStmt::Terminate;
 			break;
-		case ast::ThrowStmt::Resume:
+		case ast::ExceptionKind::Resume:
 			kind = ThrowStmt::Resume;
 			break;
@@ -429,8 +429,8 @@
 		CatchStmt::Kind kind;
 		switch (node->kind) {
-		case ast::CatchStmt::Terminate:
+		case ast::ExceptionKind::Terminate:
 			kind = CatchStmt::Terminate;
 			break;
-		case ast::CatchStmt::Resume:
+		case ast::ExceptionKind::Resume:
 			kind = CatchStmt::Resume;
 			break;
@@ -1739,11 +1739,11 @@
 	virtual void visit( ThrowStmt * old ) override final {
 		if ( inCache( old ) ) return;
-		ast::ThrowStmt::Kind kind;
+		ast::ExceptionKind kind;
 		switch (old->kind) {
 		case ThrowStmt::Terminate:
-			kind = ast::ThrowStmt::Terminate;
+			kind = ast::ExceptionKind::Terminate;
 			break;
 		case ThrowStmt::Resume:
-			kind = ast::ThrowStmt::Resume;
+			kind = ast::ExceptionKind::Resume;
 			break;
 		default:
@@ -1775,11 +1775,11 @@
 	virtual void visit( CatchStmt * old ) override final {
 		if ( inCache( old ) ) return;
-		ast::CatchStmt::Kind kind;
+		ast::ExceptionKind kind;
 		switch (old->kind) {
 		case CatchStmt::Terminate:
-			kind = ast::CatchStmt::Terminate;
+			kind = ast::ExceptionKind::Terminate;
 			break;
 		case CatchStmt::Resume:
-			kind = ast::CatchStmt::Resume;
+			kind = ast::ExceptionKind::Resume;
 			break;
 		default:
Index: src/AST/Print.cpp
===================================================================
--- src/AST/Print.cpp	(revision 21a44ca0c18d2b218534fb18cad0a2612ec50542)
+++ src/AST/Print.cpp	(revision 6f4b7f26591504e8cd05f06a27034b50ccca41e3)
@@ -71,5 +71,5 @@
 
 	/// call to print short form. Incorporates features of safe_print()
-	void short_print( const ast::Node * n ) {
+	void short_print( const ast::Decl * n ) {
 		if ( ! n ) { undefined(); return; }
 		bool old_short = short_mode; short_mode = true;
@@ -77,5 +77,4 @@
 		short_mode = old_short;
 	}
-
 
 	static const char* Names[];
@@ -178,9 +177,11 @@
 
 	void print( const ast::AggregateDecl * node ) {
-		os << node->typeString() << " " << node->name << ":";
-		if ( node->linkage != Linkage::Cforall ) {
+		os << node->typeString() << " " << node->name;
+		
+		if ( ! short_mode && node->linkage != Linkage::Cforall ) {
 			os << " " << Linkage::name( node->linkage );
-		} // if
-		os << " with body : " << (node->body ? "yes " : "no ");
+		}
+		
+		os << " " << (node->body ? "with" : "without") << " body";
 
 		if ( ! node->params.empty() ) {
@@ -189,28 +190,33 @@
 			printAll( node->params );
 			--indent;
-		} // if
-		if ( ! node->members.empty() ) {
+		}
+
+		if ( ! short_mode && ! node->members.empty() ) {
 			os << endl << indent << "... with members" << endl;
 			++indent;
 			printAll( node->members );
 			--indent;
-		} // if
-		if ( ! node->attributes.empty() ) {
+		}
+
+		if ( ! short_mode && ! node->attributes.empty() ) {
 			os << endl << indent << "... with attributes" << endl;
 			++indent;
 			printAll( node->attributes );
 			--indent;
-		} // if
+		}
+
 		os << endl;
 	}
 
-	void print( const ast::NamedTypeDecl * node ) {
-		if ( !node->name.empty() ) os << node->name << ": ";
-
-		if ( node->linkage != Linkage::Cforall ) {
+	void preprint( const ast::NamedTypeDecl * node ) {
+		if ( ! node->name.empty() ) os << node->name << ": ";
+
+		if ( ! short_mode && node->linkage != Linkage::Cforall ) {
 			os << Linkage::name( node->linkage ) << " ";
-		} // if
+		}
+
 		print( node->storage );
 		os << node->typeString();
+		
 		if ( node->base ) {
 			os << " for ";
@@ -218,5 +224,6 @@
 			node->base->accept( *this );
 			--indent;
-		} // if
+		}
+
 		if ( ! node->params.empty() ) {
 			os << endl << indent << "... with parameters" << endl;
@@ -224,11 +231,12 @@
 			printAll( node->params );
 			--indent;
-		} // if
-		if ( ! node->assertions.empty() ) {
+		}
+
+		if ( ! short_mode && ! node->assertions.empty() ) {
 			os << endl << indent << "... with assertions" << endl;
 			++indent;
 			printAll( node->assertions );
 			--indent;
-		} // if
+		}
 	}
 
@@ -265,9 +273,9 @@
 public:
 	virtual const ast::DeclWithType * visit( const ast::ObjectDecl * node ) {
-		if ( !node->name.empty() ) os << node->name << ": ";
-
-		if ( node->linkage != Linkage::Cforall ) {
+		if ( ! node->name.empty() ) os << node->name << ": ";
+
+		if ( ! short_mode && node->linkage != Linkage::Cforall ) {
 			os << Linkage::name( node->linkage ) << " ";
-		} // if
+		}
 
 		print( node->storage );
@@ -277,20 +285,19 @@
 		} else {
 			os << "untyped entity";
-		} // if
-
-		if ( node->init ) {
+		}
+
+		if ( ! short_mode && node->init ) {
+			++indent;
 			os << " with initializer (" << (
 				node->init->maybeConstructed
 					? "maybe constructed"
 					: "not constructed"
-				) << ")" << endl << indent+1;
-
-			++indent;
+				) << ")" << endl << indent;
 			node->init->accept( *this );
 			--indent;
 			os << endl;
-		} // if
-
-		if ( ! node->attributes.empty() ) {
+		}
+
+		if ( ! short_mode && ! node->attributes.empty() ) {
 			os << endl << indent << "... with attributes:" << endl;
 			++indent;
@@ -302,17 +309,17 @@
 			os << indent << " with bitfield width ";
 			node->bitfieldWidth->accept( *this );
-		} // if
+		}
+
 		return node;
 	}
 
 	virtual const ast::DeclWithType * visit( const ast::FunctionDecl * node ) {
-		if ( !node->name.empty() ) {
-			os << node->name << ": ";
-		} // if
-		if ( node->linkage != Linkage::Cforall ) {
+		if ( !node->name.empty() ) os << node->name << ": ";
+
+		if ( ! short_mode && node->linkage != Linkage::Cforall ) {
 			os << Linkage::name( node->linkage ) << " ";
-		} // if
-
-		printAll( node->attributes );
+		}
+
+		if ( ! short_mode ) printAll( node->attributes );
 
 		print( node->storage );
@@ -323,12 +330,13 @@
 		} else {
 			os << "untyped entity";
-		} // if
-
-		if ( node->stmts ) {
-			os << indent << "... with body" << endl << indent+1;
-			++indent;
+		}
+
+		if ( ! short_mode && node->stmts ) {
+			++indent;
+			os << " with body" << endl << indent;
 			node->stmts->accept( *this );
 			--indent;
-		} // if
+		}
+
 		return node;
 	}
@@ -355,6 +363,6 @@
 
 	virtual const ast::Decl * visit( const ast::TypeDecl * node ) {
-		print( node );
-		if ( node->init ) {
+		preprint( node );
+		if ( ! short_mode && node->init ) {
 			os << endl << indent << "with type initializer: ";
 			++indent;
@@ -362,14 +370,15 @@
 			--indent;
 		}
+
 		return node;
 	}
 
 	virtual const ast::Decl * visit( const ast::TypedefDecl * node ) {
-		print( node );
+		preprint( node );
 		return node;
 	}
 
 	virtual const ast::AsmDecl * visit( const ast::AsmDecl * node ) {
-		node->stmt->accept( *this );
+		safe_print( node->stmt );
 		return node;
 	}
@@ -378,11 +387,10 @@
 		os << "Static Assert with condition: ";
 		++indent;
-		node->cond->accept( *this );
-		--indent;
-		os << endl << indent << "and message: ";
-		++indent;
-		node->msg->accept( *this );
+		safe_print( node->cond );
+		os << endl << indent-1 << "and message: ";
+		safe_print( node->msg );
 		--indent;
 		os << endl;
+
 		return node;
 	}
@@ -594,24 +602,143 @@
 
 	virtual const ast::Stmt * visit( const ast::ThrowStmt * node ) {
+		if ( node->target ) os << "Non-Local ";
+
+		switch( node->kind ) {
+		case ast::ExceptionKind::Terminate: os << "Terminate "; break;
+		case ast::ExceptionKind::Resume:    os << "Resume ";    break;
+		}
+
+		++indent;
+		os << "Throw Statement, raising: ";
+		safe_print( node->expr );
+		if ( node->target ) {
+			os << "... at: ";
+			node->target->accept( *this );
+		}
+		--indent;
+
 		return node;
 	}
 
 	virtual const ast::Stmt * visit( const ast::TryStmt * node ) {
+		++indent;
+		os << "Try Statement" << endl << indent-1 
+		   << "... with block:" << endl << indent;
+		safe_print( node->body );
+
+		os << indent-1 << "... and handlers:" << endl;
+		for ( const ast::CatchStmt * stmt : node->handlers ) {
+			os << indent;
+			stmt->accept( *this );
+		}
+
+		if ( node->finally ) {
+			os << indent-1 << "... and finally:" << endl << indent;
+			node->finally->accept( *this );
+		}
+		--indent;
+
 		return node;
 	}
 
 	virtual const ast::Stmt * visit( const ast::CatchStmt * node ) {
+		os << "Catch ";
+		switch ( node->kind ) {
+		case ast::ExceptionKind::Terminate: os << "Terminate "; break;
+		case ast::ExceptionKind::Resume:    os << "Resume ";    break;
+		}
+		os << "Statement" << endl << indent;
+
+		++indent;
+		os << "... catching: ";
+		short_print( node->decl );
+		os << endl;
+
+		if ( node->cond ) {
+			os << indent-1 << "... with conditional:" << endl << indent;
+			node->cond->accept( *this );
+		}
+
+		os << indent-1 << "... with block:" << endl << indent;
+		safe_print( node->body );
+		--indent;
+		
 		return node;
 	}
 
 	virtual const ast::Stmt * visit( const ast::FinallyStmt * node ) {
+		os << "Finally Statement" << endl;
+		os << indent << "... with block:" << endl;
+		++indent;
+		os << indent;
+		safe_print( node->body );
+		--indent;
+
 		return node;
 	}
 
 	virtual const ast::Stmt * visit( const ast::WaitForStmt * node ) {
+		os << "Waitfor Statement" << endl;
+		indent += 2;
+		for( const auto & clause : node->clauses ) {
+			os << indent-1 << "target function: ";
+			safe_print( clause.target.func );
+			
+			if ( ! clause.target.args.empty() ) {
+				os << endl << indent-1 << "... with arguments:" << endl;
+				for( const ast::Expr * arg : clause.target.args ) {
+					arg->accept( *this );
+				}
+			}
+
+			if ( clause.stmt ) {
+				os << indent-1 << "... with statment:" << endl;
+				clause.stmt->accept( *this );
+			}
+
+			if ( clause.cond ) {
+				os << indent-1 << "... with condition:" << endl;
+				clause.cond->accept( *this );
+			}
+		}
+
+		if ( node->timeout.time ) {
+			os << indent-1 << "timeout of:" << endl;
+			node->timeout.time->accept( *this );
+
+			if ( node->timeout.stmt ) {
+				os << indent-1 << "... with statment:" << endl;
+				node->timeout.stmt->accept( *this );
+			}
+
+			if ( node->timeout.cond ) {
+				os << indent-1 << "... with condition:" << endl;
+				node->timeout.cond->accept( *this );
+			}
+		}
+
+		if ( node->orElse.stmt ) {
+			os << indent-1 << "else:" << endl;
+			node->orElse.stmt->accept( *this );
+
+			if ( node->orElse.cond ) {
+				os << indent-1 << "... with condition:" << endl;
+				node->orElse.cond->accept( *this );
+			}
+		}
+		indent -= 2;
+
 		return node;
 	}
 
 	virtual const ast::Stmt * visit( const ast::WithStmt * node ) {
+		os << "With statement" << endl;
+		os << indent << "... with expressions:" << endl;
+		++indent;
+		printAll( node->exprs );
+		os << indent-1 << "... with statement:" << endl << indent;
+		safe_print( node->stmt );
+		--indent;
+
 		return node;
 	}
@@ -625,8 +752,18 @@
 
 	virtual const ast::Stmt * visit( const ast::DeclStmt * node ) {
+		os << "Declaration of ";
+		safe_print( node->decl );
+
 		return node;
 	}
 
 	virtual const ast::Stmt * visit( const ast::ImplicitCtorDtorStmt * node ) {
+		os << "Implicit Ctor Dtor Statement" << endl;
+		os << indent << "... with Ctor/Dtor: ";
+		++indent;
+		safe_print( node->callStmt );
+		--indent;
+		os << endl;
+
 		return node;
 	}
@@ -1375,5 +1512,5 @@
 }
 
-void printShort( ostream & os, const ast::Node * node, Indenter indent ) {
+void printShort( ostream & os, const ast::Decl * node, Indenter indent ) {
 	Printer printer { os, indent, true };
 	node->accept(printer);
Index: src/AST/Print.hpp
===================================================================
--- src/AST/Print.hpp	(revision 21a44ca0c18d2b218534fb18cad0a2612ec50542)
+++ src/AST/Print.hpp	(revision 6f4b7f26591504e8cd05f06a27034b50ccca41e3)
@@ -23,4 +23,7 @@
 namespace ast {
 
+class Decl;
+
+/// Print a node with the given indenter
 void print( std::ostream & os, const ast::Node * node, Indenter indent = {} );
 
@@ -29,3 +32,10 @@
 }
 
+/// Print a declaration in its short form
+void printShort( std::ostream & os, const ast::Decl * node, Indenter indent = {} );
+
+inline void printShort( std::ostream & os, const ast::Decl * node, unsigned int indent ) {
+    printShort( os, node, Indenter{ Indenter::tabsize, indent } );
 }
+
+}
Index: src/AST/Stmt.hpp
===================================================================
--- src/AST/Stmt.hpp	(revision 21a44ca0c18d2b218534fb18cad0a2612ec50542)
+++ src/AST/Stmt.hpp	(revision 6f4b7f26591504e8cd05f06a27034b50ccca41e3)
@@ -268,14 +268,16 @@
 };
 
+/// Kind of exception
+enum ExceptionKind { Terminate, Resume };
+
 /// Throw statement `throw ...`
 class ThrowStmt final : public Stmt {
 public:
-	enum Kind { Terminate, Resume };
-
 	ptr<Expr> expr;
 	ptr<Expr> target;
-	Kind kind;
-
-	ThrowStmt( const CodeLocation & loc, Kind kind, const Expr * expr, const Expr * target,
+	ExceptionKind kind;
+
+	ThrowStmt( 
+		const CodeLocation & loc, ExceptionKind kind, const Expr * expr, const Expr * target,
 		std::vector<Label> && labels = {} )
 	: Stmt(loc, std::move(labels)), expr(expr), target(target), kind(kind) {}
@@ -294,5 +296,6 @@
 	ptr<FinallyStmt> finally;
 
-	TryStmt( const CodeLocation & loc, const CompoundStmt * body,
+	TryStmt( 
+		const CodeLocation & loc, const CompoundStmt * body,
 		std::vector<ptr<CatchStmt>> && handlers, const FinallyStmt * finally,
 		std::vector<Label> && labels = {} )
@@ -308,12 +311,11 @@
 class CatchStmt final : public Stmt {
 public:
-	enum Kind { Terminate, Resume };
-
 	ptr<Decl> decl;
 	ptr<Expr> cond;
 	ptr<Stmt> body;
-	Kind kind;
-
-	CatchStmt( const CodeLocation & loc, Kind kind, const Decl * decl, const Expr * cond,
+	ExceptionKind kind;
+
+	CatchStmt( 
+		const CodeLocation & loc, ExceptionKind kind, const Decl * decl, const Expr * cond,
 		const Stmt * body, std::vector<Label> && labels = {} )
 	: Stmt(loc, std::move(labels)), decl(decl), cond(cond), body(body), kind(kind) {}
Index: src/AST/porting.md
===================================================================
--- src/AST/porting.md	(revision 21a44ca0c18d2b218534fb18cad0a2612ec50542)
+++ src/AST/porting.md	(revision 6f4b7f26591504e8cd05f06a27034b50ccca41e3)
@@ -37,6 +37,6 @@
   * all subclass constructors must fill it; by convention, from their first argument
 
-`N->print(std::ostream&)` is a visitor now, port these methods to `ast::Print` class
-* **TODO** `Declaration::printShort` should also be integrated
+`N->print(std::ostream&)` is a visitor now
+* `Declaration::printShort` is also integrated
 
 `clone` is private to `Node` now
@@ -137,7 +137,4 @@
 * `parameters` => `params`
 
-`EnumDecl`
-* **TODO** rebuild `eval` for new AST (re: `valueOf` implementation)
-
 `Expr`
 * Merged `inferParams`/`resnSlots` into union, as suggested by comment in old version
@@ -151,7 +148,4 @@
 * `function` => `func`
 * removed `begin_args()` in favour of `args.begin()`
-
-`MemberExpr`
-* **TODO** port setup of `result` in constructor
 
 `ConstantExpr`
@@ -204,4 +198,7 @@
 `TryStmt`
 * `block` -> `body` and `finallyBlock` -> `finally`
+
+`ThrowStmt` `CatchStmt`
+* moved `Kind` enums to shared `ast::ExceptionKind` enum
 
 `FinallyStmt`
