Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/Expression.cc	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -522,8 +522,9 @@
 
 CompoundLiteralExpr::CompoundLiteralExpr( Type * type, Initializer * initializer ) : type( type ), initializer( initializer ) {
+	assert( type && initializer );
 	set_result( type->clone() );
 }
 
-CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( maybeClone( other.type ) ), initializer( maybeClone( other.initializer ) ) {}
+CompoundLiteralExpr::CompoundLiteralExpr( const CompoundLiteralExpr &other ) : Expression( other ), type( other.type->clone() ), initializer( other.initializer->clone() ) {}
 
 CompoundLiteralExpr::~CompoundLiteralExpr() {
@@ -534,6 +535,8 @@
 void CompoundLiteralExpr::print( std::ostream &os, int indent ) const {
 	os << "Compound Literal Expression: " << std::endl;
-	if ( type ) type->print( os, indent + 2 );
-	if ( initializer ) initializer->print( os, indent + 2 );
+	os << std::string( indent+2, ' ' );
+	type->print( os, indent + 2 );
+	os << std::string( indent+2, ' ' );
+	initializer->print( os, indent + 2 );
 }
 
@@ -549,7 +552,7 @@
 
 RangeExpr::RangeExpr( Expression *low, Expression *high ) : low( low ), high( high ) {}
-RangeExpr::RangeExpr( const RangeExpr &other ) : low( other.low->clone() ), high( other.high->clone() ) {}
+RangeExpr::RangeExpr( const RangeExpr &other ) : Expression( other ), low( other.low->clone() ), high( other.high->clone() ) {}
 void RangeExpr::print( std::ostream &os, int indent ) const {
-	os << std::string( indent, ' ' ) << "Range Expression: ";
+	os << "Range Expression: ";
 	low->print( os, indent );
 	os << " ... ";
@@ -566,11 +569,30 @@
 	}
 }
-StmtExpr::StmtExpr( const StmtExpr &other ) : statements( other.statements->clone() ) {}
+StmtExpr::StmtExpr( const StmtExpr &other ) : Expression( other ), statements( other.statements->clone() ) {}
 StmtExpr::~StmtExpr() {
 	delete statements;
 }
 void StmtExpr::print( std::ostream &os, int indent ) const {
-	os << std::string( indent, ' ' ) << "Statement Expression: " << std::endl;
+	os << "Statement Expression: " << std::endl << std::string( indent, ' ' );
 	statements->print( os, indent+2 );
+}
+
+
+UniqueExpr::UniqueExpr( Expression *expr ) : expr( new Expression* ) {
+	set_expr( expr );
+	assert( expr );
+	assert( expr->has_result() );
+	set_result( expr->get_result()->clone() );
+}
+UniqueExpr::UniqueExpr( const UniqueExpr &other ) : Expression( other ), expr( other.expr ) {
+}
+UniqueExpr::~UniqueExpr() {
+	if ( expr.unique() ) {
+		delete *expr;
+	}
+}
+void UniqueExpr::print( std::ostream &os, int indent ) const {
+	os << "Unique Expression: " << std::endl << std::string( indent+2, ' ' );
+	get_expr()->print( os, indent+2 );
 }
 
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/Expression.h	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -639,5 +639,5 @@
 class TupleExpr : public Expression {
   public:
-	TupleExpr( Expression *_aname = nullptr );
+	TupleExpr( const std::list< Expression * > & exprs = std::list< Expression * >(), Expression *_aname = nullptr );
 	TupleExpr( const TupleExpr &other );
 	virtual ~TupleExpr();
@@ -733,4 +733,21 @@
 };
 
+class UniqueExpr : public Expression {
+public:
+	UniqueExpr( Expression * expr );
+	UniqueExpr( const UniqueExpr & other );
+	~UniqueExpr();
+
+	Expression * get_expr() const { return *expr; }
+	UniqueExpr * set_expr( Expression * newValue ) { *expr = newValue; return this; }
+
+	virtual UniqueExpr *clone() const { return new UniqueExpr( *this ); }
+	virtual void accept( Visitor &v ) { v.visit( this ); }
+	virtual Expression *acceptMutator( Mutator &m ) { return m.mutate( this ); }
+	virtual void print( std::ostream &os, int indent = 0 ) const;
+private:
+	std::shared_ptr< Expression * > expr;
+};
+
 std::ostream & operator<<( std::ostream & out, const Expression * expr );
 
Index: src/SynTree/Mutator.cc
===================================================================
--- src/SynTree/Mutator.cc	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/Mutator.cc	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -384,4 +384,10 @@
 }
 
+Expression *Mutator::mutate( UniqueExpr *uniqueExpr ) {
+	uniqueExpr->set_result( maybeMutate( uniqueExpr->get_result(), *this ) );
+	uniqueExpr->set_expr( maybeMutate( uniqueExpr->get_expr(), *this ) );
+	return uniqueExpr;
+}
+
 Type *Mutator::mutate( VoidType *voidType ) {
 	mutateAll( voidType->get_forall(), *this );
Index: src/SynTree/Mutator.h
===================================================================
--- src/SynTree/Mutator.h	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/Mutator.h	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -83,4 +83,5 @@
 	virtual Expression* mutate( TupleAssignExpr *assignExpr );
 	virtual Expression* mutate( StmtExpr * stmtExpr );
+	virtual Expression* mutate( UniqueExpr * uniqueExpr );
 
 	virtual Type* mutate( VoidType *basicType );
Index: src/SynTree/SynTree.h
===================================================================
--- src/SynTree/SynTree.h	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/SynTree.h	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -88,4 +88,5 @@
 class TupleAssignExpr;
 class StmtExpr;
+class UniqueExpr;
 
 class Type;
Index: src/SynTree/TupleExpr.cc
===================================================================
--- src/SynTree/TupleExpr.cc	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/TupleExpr.cc	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -18,6 +18,12 @@
 #include "Type.h"
 #include "Declaration.h"
+#include "Tuples/Tuples.h"
 
-TupleExpr::TupleExpr( Expression *_aname ) : Expression( _aname ) {
+TupleExpr::TupleExpr( const std::list< Expression * > & exprs, Expression *_aname ) : Expression( _aname ), exprs( exprs ) {
+	if ( ! exprs.empty() ) {
+		if ( std::all_of( exprs.begin(), exprs.end(), [](Expression * expr) { return expr->get_result(); } ) ) {
+			set_result( Tuples::makeTupleType( exprs ) );
+		}
+	}
 }
 
@@ -36,8 +42,8 @@
 }
 
-TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) {
+TupleIndexExpr::TupleIndexExpr( Expression * tuple, unsigned int index ) : tuple( tuple ), index( index )  {
 	TupleType * type = safe_dynamic_cast< TupleType * >( tuple->get_result() );
-	assert( type->size() >= index );
-	set_result( *std::next( type->get_types().begin(), index ) );
+	assert( type->size() > index );
+	set_result( (*std::next( type->get_types().begin(), index ))->clone() );
 }
 
@@ -51,4 +57,5 @@
 void TupleIndexExpr::print( std::ostream &os, int indent ) const {
 	os << "Tuple Index Expression, with tuple:" << std::endl;
+	os << std::string( indent+2, ' ' );
 	tuple->print( os, indent+2 );
 	os << std::string( indent+2, ' ' ) << "with index: " << index << std::endl;
@@ -70,6 +77,8 @@
 void MemberTupleExpr::print( std::ostream &os, int indent ) const {
 	os << "Member Tuple Expression, with aggregate:" << std::endl;
+	os << std::string( indent+2, ' ' );
 	aggregate->print( os, indent+2 );
 	os << std::string( indent+2, ' ' ) << "with member: " << std::endl;
+	os << std::string( indent+2, ' ' );
 	member->print( os, indent+2 );
 	Expression::print( os, indent );
@@ -97,5 +106,5 @@
 
 void TupleAssignExpr::print( std::ostream &os, int indent ) const {
-	os << std::string( indent, ' ' ) << "Tuple Assignment Expression, with temporaries:" << std::endl;
+	os << "Tuple Assignment Expression, with temporaries:" << std::endl;
 	printAll( tempDecls, os, indent+4 );
 	os << std::string( indent+2, ' ' ) << "with assignments: " << std::endl;
Index: src/SynTree/Visitor.cc
===================================================================
--- src/SynTree/Visitor.cc	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/Visitor.cc	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -326,4 +326,9 @@
 }
 
+void Visitor::visit( UniqueExpr *uniqueExpr ) {
+	maybeAccept( uniqueExpr->get_result(), *this );
+	maybeAccept( uniqueExpr->get_expr(), *this );
+}
+
 void Visitor::visit( VoidType *voidType ) {
 	acceptAll( voidType->get_forall(), *this );
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision aa8f9dfd89cb8d2df9f8a3892703dfc427bce64a)
+++ src/SynTree/Visitor.h	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -83,4 +83,5 @@
 	virtual void visit( TupleAssignExpr *assignExpr );
 	virtual void visit( StmtExpr * stmtExpr );
+	virtual void visit( UniqueExpr * uniqueExpr );
 
 	virtual void visit( VoidType *basicType );
