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 a5f0529a63fd135c870940242904abe5132d58e6)
+++ 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 )...);
 }
 
