Index: src/Common/Indenter.h
===================================================================
--- src/Common/Indenter.h	(revision 3c398b6c889afd06fdf9de3208cd23fbf26275e5)
+++ src/Common/Indenter.h	(revision e5c84881b9bfd32f54aba27ca72ecd7ffb1764ac)
@@ -18,7 +18,9 @@
 
 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;
+	static unsigned tabsize;
+
+	Indenter( unsigned int amt = tabsize, unsigned int indent = 0 ) : amt( amt ), indent( indent ) {}
+	unsigned int amt;  // amount 1 level increases indent by (i.e. how much to increase by in operator++)
+	unsigned int indent;
 
 	Indenter & operator+=(int nlevels) { indent += amt*nlevels; return *this; }
@@ -30,5 +32,5 @@
 };
 
-inline std::ostream & operator<<( std::ostream & out, Indenter & indent ) {
+inline std::ostream & operator<<( std::ostream & out, const Indenter & indent ) {
 	return out << std::string(indent.indent, ' ');
 }
Index: src/Common/utility.h
===================================================================
--- src/Common/utility.h	(revision 3c398b6c889afd06fdf9de3208cd23fbf26275e5)
+++ src/Common/utility.h	(revision e5c84881b9bfd32f54aba27ca72ecd7ffb1764ac)
@@ -28,4 +28,6 @@
 #include <cassert>
 
+#include "Common/Indenter.h"
+
 template< typename T >
 static inline T * maybeClone( const T *orig ) {
@@ -75,9 +77,9 @@
 
 template< typename Container >
-void printAll( const Container &container, std::ostream &os, int indent = 0 ) {
+void printAll( const Container &container, std::ostream &os, Indenter indent = {} ) {
 	for ( typename Container::const_iterator i = container.begin(); i != container.end(); ++i ) {
 		if ( *i ) {
-			os << std::string( indent,  ' ' );
-			(*i)->print( os, indent + 2 );
+			os << indent;
+			(*i)->print( os, indent );
 			// need an endl after each element because it's not easy to know when each individual item should end
 			os << std::endl;
@@ -351,14 +353,16 @@
 template< typename T1, typename T2 >
 struct group_iterate_t {
+private:
+	std::tuple<T1, T2> args;
+public:
 	group_iterate_t( bool skipBoundsCheck, const T1 & v1, const T2 & v2 ) : args(v1, v2) {
 		assertf(skipBoundsCheck || v1.size() == v2.size(), "group iteration requires containers of the same size: <%zd, %zd>.", v1.size(), v2.size());
 	};
 
+	typedef std::tuple<decltype(*std::get<0>(args).begin()), decltype(*std::get<1>(args).begin())> value_type;
+	typedef decltype(std::get<0>(args).begin()) T1Iter;
+	typedef decltype(std::get<1>(args).begin()) T2Iter;
+
 	struct iterator {
-		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;
@@ -370,9 +374,7 @@
 		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() ); }
 	iterator end() { return iterator( std::get<0>(args).end(), std::get<1>(args).end() ); }
-
-private:
-	std::tuple<T1, T2> args;
 };
 
