Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision 487845d74b2dd4093ae3056d0dc4bc6c42748969)
+++ src/SynTree/Mutator.cc	(revision 61255ad0ca09164c5b6b5904a6653569a4380074)
@@ -203,4 +203,10 @@
 }
 
+Statement * Mutator::mutate( WithStmt * withStmt ) {
+	mutateAll( withStmt->exprs, *this );
+	withStmt->stmt = maybeMutate( withStmt->stmt, *this );
+	return withStmt;
+}
+
 NullStmt * Mutator::mutate( NullStmt *nullStmt ) {
 	return nullStmt;
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision 487845d74b2dd4093ae3056d0dc4bc6c42748969)
+++ src/SynTree/Mutator.h	(revision 61255ad0ca09164c5b6b5904a6653569a4380074)
@@ -50,4 +50,5 @@
 	virtual Statement * mutate( FinallyStmt * catchStmt );
 	virtual Statement * mutate( WaitForStmt * waitforStmt );
+	virtual Statement * mutate( WithStmt * withStmt );
 	virtual NullStmt * mutate( NullStmt * nullStmt );
 	virtual Statement * mutate( DeclStmt * declStmt );
Index: src/SynTree/Statement.cc
===================================================================
--- src/SynTree/Statement.cc	(revision 487845d74b2dd4093ae3056d0dc4bc6c42748969)
+++ src/SynTree/Statement.cc	(revision 61255ad0ca09164c5b6b5904a6653569a4380074)
@@ -455,4 +455,21 @@
 }
 
+
+WithStmt::WithStmt( const std::list< Expression * > & exprs, Statement * stmt ) : Statement( std::list<Label>() ), exprs( exprs ), stmt( stmt ) {}
+WithStmt::WithStmt( const WithStmt & other ) : Statement( other ), stmt( maybeClone( other.stmt ) ) {
+	cloneAll( other.exprs, exprs );
+}
+WithStmt::~WithStmt() {
+	deleteAll( exprs );
+	delete stmt;
+}
+
+void WithStmt::print( std::ostream & os, Indenter indent ) const {
+	os << "With statement" << endl;
+	os << indent << "... with statement:" << endl << indent+1;
+	stmt->print( os, indent+1 );
+}
+
+
 NullStmt::NullStmt( std::list<Label> labels ) : Statement( labels ) {}
 NullStmt::NullStmt() : Statement( std::list<Label>() ) {}
Index: src/SynTree/Statement.h
===================================================================
--- src/SynTree/Statement.h	(revision 487845d74b2dd4093ae3056d0dc4bc6c42748969)
+++ src/SynTree/Statement.h	(revision 61255ad0ca09164c5b6b5904a6653569a4380074)
@@ -432,4 +432,19 @@
 };
 
+class WithStmt : public Statement {
+public:
+	std::list< Expression * > exprs;
+	Statement * stmt;
+
+	WithStmt( const std::list< Expression * > & exprs, Statement * stmt );
+	WithStmt( const WithStmt & other );
+	virtual ~WithStmt();
+
+	virtual WithStmt * clone() const override { return new WithStmt( *this ); }
+	virtual void accept( Visitor & v ) override { v.visit( this ); }
+	virtual Statement * acceptMutator( Mutator & m )  override { return m.mutate( this ); }
+	virtual void print( std::ostream & os, Indenter indent = {} ) const override;
+};
+
 
 // represents a declaration that occurs as part of a compound statement
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision 487845d74b2dd4093ae3056d0dc4bc6c42748969)
+++ src/SynTree/SynTree.h	(revision 61255ad0ca09164c5b6b5904a6653569a4380074)
@@ -55,4 +55,5 @@
 class FinallyStmt;
 class WaitForStmt;
+class WithStmt;
 class NullStmt;
 class DeclStmt;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision 487845d74b2dd4093ae3056d0dc4bc6c42748969)
+++ src/SynTree/Visitor.cc	(revision 61255ad0ca09164c5b6b5904a6653569a4380074)
@@ -174,5 +174,10 @@
 }
 
-void Visitor::visit( __attribute__((unused)) NullStmt *nullStmt ) {
+void Visitor::visit( WithStmt * withStmt ) {
+	acceptAll( withStmt->exprs, *this );
+	maybeAccept( withStmt->stmt, *this );
+}
+
+void Visitor::visit( NullStmt * ) {
 }
 
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 487845d74b2dd4093ae3056d0dc4bc6c42748969)
+++ src/SynTree/Visitor.h	(revision 61255ad0ca09164c5b6b5904a6653569a4380074)
@@ -52,4 +52,5 @@
 	virtual void visit( FinallyStmt * finallyStmt );
 	virtual void visit( WaitForStmt * waitforStmt );
+	virtual void visit( WithStmt * withStmt );
 	virtual void visit( NullStmt * nullStmt );
 	virtual void visit( DeclStmt * declStmt );
