Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 59a75cb9ea2eb27783bd588c2518bca66e74bc31)
+++ src/CodeGen/CodeGenerator.cc	(revision 0720e0491a93fec9fc95f4daaaa1652d4955d613)
@@ -64,12 +64,4 @@
 	} // extension
 
-	ostream & CodeGenerator::Indenter::operator()( ostream & output ) const {
-	  return output << string( cg.cur_indent, ' ' );
-	}
-
-	ostream & operator<<( ostream & output, const CodeGenerator::Indenter &indent ) {
-		return indent( output );
-	}
-
 	CodeGenerator::LabelPrinter & CodeGenerator::LabelPrinter::operator()( std::list< Label > & l ) {
 		labels = &l;
@@ -109,5 +101,5 @@
 	}
 
-	CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( *this), cur_indent( 0 ), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {}
+	CodeGenerator::CodeGenerator( std::ostream & os, bool pretty, bool genC, bool lineMarks ) : indent( CodeGenerator::tabsize ), insideFunction( false ), output( os ), printLabels( *this ), pretty( pretty ), genC( genC ), lineMarks( lineMarks ) {}
 
 	string CodeGenerator::mangleName( DeclarationWithType * decl ) {
@@ -200,5 +192,5 @@
 			output << " {" << endl;
 
-			cur_indent += CodeGenerator::tabsize;
+			++indent;
 			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end(); i++ ) {
 				output << lineDirective( *i ) << indent;
@@ -207,5 +199,5 @@
 			} // for
 
-			cur_indent -= CodeGenerator::tabsize;
+			--indent;
 
 			output << indent << "}";
@@ -237,5 +229,5 @@
 			output << " {" << endl;
 
-			cur_indent += CodeGenerator::tabsize;
+			++indent;
 			for ( std::list< Declaration* >::iterator i = memb.begin(); i != memb.end();  i++) {
 				ObjectDecl * obj = dynamic_cast< ObjectDecl* >( *i );
@@ -249,5 +241,5 @@
 			} // for
 
-			cur_indent -= CodeGenerator::tabsize;
+			--indent;
 
 			output << indent << "}";
@@ -761,5 +753,5 @@
 		std::list< Statement * > & stmts = stmtExpr->get_statements()->get_kids();
 		output << lineDirective( stmtExpr) << "({" << std::endl;
-		cur_indent += CodeGenerator::tabsize;
+		++indent;
 		unsigned int numStmts = stmts.size();
 		unsigned int i = 0;
@@ -784,5 +776,5 @@
 			++i;
 		}
-		cur_indent -= CodeGenerator::tabsize;
+		--indent;
 		output << indent << "})";
 	}
@@ -793,5 +785,5 @@
 		output << "{" << endl;
 
-		cur_indent += CodeGenerator::tabsize;
+		++indent;
 
 		for ( std::list<Statement *>::iterator i = ks.begin(); i != ks.end();  i++ ) {
@@ -804,5 +796,5 @@
 			} // if
 		} // for
-		cur_indent -= CodeGenerator::tabsize;
+		--indent;
 
 		output << indent << "}";
@@ -872,7 +864,7 @@
 
 		output << "{" << std::endl;
-		cur_indent += CodeGenerator::tabsize;
+		++indent;
 		acceptAll( switchStmt->get_statements(), *this );
-		cur_indent -= CodeGenerator::tabsize;
+		--indent;
 		output << indent << "}";
 	}
@@ -891,5 +883,5 @@
 		std::list<Statement *> sts = caseStmt->get_statements();
 
-		cur_indent += CodeGenerator::tabsize;
+		++indent;
 		for ( std::list<Statement *>::iterator i = sts.begin(); i != sts.end();  i++) {
 			output << indent << printLabels( (*i)->get_labels() )  ;
@@ -897,5 +889,5 @@
 			output << endl;
 		} // for
-		cur_indent -= CodeGenerator::tabsize;
+		--indent;
 	}
 
Index: src/CodeGen/CodeGenerator.h
===================================================================
--- src/CodeGen/CodeGenerator.h	(revision 59a75cb9ea2eb27783bd588c2518bca66e74bc31)
+++ src/CodeGen/CodeGenerator.h	(revision 0720e0491a93fec9fc95f4daaaa1652d4955d613)
@@ -100,10 +100,4 @@
 		template< class Iterator > void genCommaList( Iterator begin, Iterator end );
 
-		struct Indenter {
-			Indenter(CodeGenerator &cg) : cg(cg) {}
-			CodeGenerator & cg;
-			std::ostream& operator()(std::ostream & os) const;
-		};
-
 		struct LabelPrinter {
 			LabelPrinter(CodeGenerator &cg) : cg(cg), labels( 0 ) {}
@@ -128,5 +122,4 @@
 	  private:
 		Indenter indent;
-		int cur_indent;
 		bool insideFunction;
 		std::ostream &output;
Index: src/Common/Indenter.h
===================================================================
--- src/Common/Indenter.h	(revision 0720e0491a93fec9fc95f4daaaa1652d4955d613)
+++ src/Common/Indenter.h	(revision 0720e0491a93fec9fc95f4daaaa1652d4955d613)
@@ -0,0 +1,36 @@
+//
+// Cforall Version 1.0.0 Copyright (C) 2015 University of Waterloo
+//
+// The contents of this file are covered under the licence agreement in the
+// file "LICENCE" distributed with Cforall.
+//
+// utility.h --
+//
+// Author           : Richard C. Bilson
+// Created On       : Mon May 18 07:44:20 2015
+// Last Modified By : Andrew Beach
+// Last Modified On : Fri May 5 11:03:00 2017
+// Update Count     : 32
+//
+
+#ifndef INDENTER_H
+#define INDENTER_H
+
+struct Indenter {
+	Indenter( unsigned int amt = 2 ) : amt( amt ) {}
+	unsigned int amt = 2;  // amount 1 level increases indent by (i.e. how much to increase by in operator++)
+	unsigned int indent = 0;
+
+	Indenter & operator+=(int nlevels) { indent += amt*nlevels; return *this; }
+	Indenter & operator-=(int nlevels) { indent -= amt*nlevels; return *this; }
+	Indenter operator+(int nlevels) { Indenter indenter = *this; return indenter += nlevels; }
+	Indenter operator-(int nlevels) { Indenter indenter = *this; return indenter -= nlevels; }
+	Indenter & operator++() { return *this += 1; }
+	Indenter & operator--() { return *this -= 1; }
+};
+
+inline std::ostream & operator<<( std::ostream & out, Indenter & indent ) {
+	return out << std::string(indent.indent, ' ');
+}
+
+#endif // INDENTER_H
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 59a75cb9ea2eb27783bd588c2518bca66e74bc31)
+++ src/Common/utility.h	(revision 0720e0491a93fec9fc95f4daaaa1652d4955d613)
@@ -24,4 +24,5 @@
 #include <sstream>
 #include <string>
+#include <type_traits>
 
 #include <cassert>
@@ -304,5 +305,5 @@
 // for ( val : group_iterate( container1, container2, ... ) ) {}
 // syntax to have a for each that iterates multiple containers of the same length
-// TODO: update to use variadic arguments, perfect forwarding
+// TODO: update to use variadic arguments
 
 template< typename T1, typename T2 >
@@ -313,7 +314,9 @@
 
 	struct iterator {
-		typedef std::tuple<typename T1::value_type, typename T2::value_type> value_type;
-		typedef typename T1::iterator T1Iter;
-		typedef typename T2::iterator T2Iter;
+		typedef typename std::remove_reference<T1>::type T1val;
+		typedef typename std::remove_reference<T2>::type T2val;
+		typedef std::tuple<typename T1val::value_type &, typename T2val::value_type &> value_type;
+		typedef typename T1val::iterator T1Iter;
+		typedef typename T2val::iterator T2Iter;
 		typedef std::tuple<T1Iter, T2Iter> IterTuple;
 		IterTuple it;
@@ -323,5 +326,5 @@
 		}
 		bool operator!=( const iterator &other ) const { return it != other.it; }
-		value_type operator*() const { return std::make_tuple( *std::get<0>(it), *std::get<1>(it) ); }
+		value_type operator*() const { return std::tie( *std::get<0>(it), *std::get<1>(it) ); }
 	};
 	iterator begin() { return iterator( std::get<0>(args).begin(), std::get<1>(args).begin() ); }
@@ -333,6 +336,6 @@
 
 template< typename... Args >
-group_iterate_t<Args...> group_iterate( const Args &... args ) {
-	return group_iterate_t<Args...>(args...);
+group_iterate_t<Args...> group_iterate( Args &&... args ) {
+	return group_iterate_t<Args...>(std::forward<Args>( args )...);
 }
 
Index: src/ResolvExpr/CurrentObject.cc
===================================================================
--- src/ResolvExpr/CurrentObject.cc	(revision 59a75cb9ea2eb27783bd588c2518bca66e74bc31)
+++ src/ResolvExpr/CurrentObject.cc	(revision 0720e0491a93fec9fc95f4daaaa1652d4955d613)
@@ -19,4 +19,6 @@
 #include "CurrentObject.h"
 
+#include "Common/Indenter.h"
+
 #include "SynTree/Declaration.h"
 #include "SynTree/Initializer.h"
@@ -45,19 +47,4 @@
 			assertf( false, "unhandled type on getConstValue %s", toString( constExpr->get_result() ).c_str() ); // xxx - might be semantic error
 		}
-	}
-
-	struct Indenter {
-		static const int amt = 2;
-		unsigned int indent = 0;
-
-		Indenter & operator+=(int nlevels) { indent += amt*nlevels; return *this; }
-		Indenter & operator-=(int nlevels) { indent -= amt*nlevels; return *this; }
-		Indenter operator+(int nlevels) { Indenter indenter = *this; return indenter += nlevels; }
-		Indenter operator-(int nlevels) { Indenter indenter = *this; return indenter -= nlevels; }
-		Indenter & operator++() { return *this += 1; }
-		Indenter & operator--() { return *this -= 1; }
-	};
-	std::ostream & operator<<( std::ostream & out, Indenter & indent ) {
-		return out << std::string(indent.indent, ' ');
 	}
 
Index: src/ResolvExpr/CurrentObject.h
===================================================================
--- src/ResolvExpr/CurrentObject.h	(revision 59a75cb9ea2eb27783bd588c2518bca66e74bc31)
+++ src/ResolvExpr/CurrentObject.h	(revision 0720e0491a93fec9fc95f4daaaa1652d4955d613)
@@ -24,4 +24,5 @@
 	class MemberIterator;
 
+	// TODO: memory management of MemberIterators
 	class CurrentObject {
 	public:
