Index: src/CodeGen/CodeGenerator.cc
===================================================================
--- src/CodeGen/CodeGenerator.cc	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ src/CodeGen/CodeGenerator.cc	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -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 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ src/CodeGen/CodeGenerator.h	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -23,4 +23,6 @@
 #include "SynTree/Visitor.h"      // for Visitor
 #include "SynTree/SynTree.h"      // for Visitor Nodes
+
+#include "Common/Indenter.h"      // for Indenter
 
 namespace CodeGen {
@@ -100,10 +102,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 +124,4 @@
 	  private:
 		Indenter indent;
-		int cur_indent;
 		bool insideFunction;
 		std::ostream &output;
Index: src/Common/Indenter.h
===================================================================
--- src/Common/Indenter.h	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
+++ src/Common/Indenter.h	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -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 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ src/Common/utility.h	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -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/Makefile.in
===================================================================
--- src/Makefile.in	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ src/Makefile.in	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -219,5 +219,4 @@
 	SymTab/driver_cfa_cpp-TypeEquality.$(OBJEXT) \
 	SymTab/driver_cfa_cpp-Autogen.$(OBJEXT) \
-	SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Type.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-VoidType.$(OBJEXT) \
@@ -518,6 +517,6 @@
 	SymTab/Indexer.cc SymTab/Mangler.cc SymTab/Validate.cc \
 	SymTab/FixFunction.cc SymTab/ImplementationType.cc \
-	SymTab/TypeEquality.cc SymTab/Autogen.cc SymTab/TreeStruct.cc \
-	SynTree/Type.cc SynTree/VoidType.cc SynTree/BasicType.cc \
+	SymTab/TypeEquality.cc SymTab/Autogen.cc SynTree/Type.cc \
+	SynTree/VoidType.cc SynTree/BasicType.cc \
 	SynTree/PointerType.cc SynTree/ArrayType.cc \
 	SynTree/FunctionType.cc SynTree/ReferenceToType.cc \
@@ -852,6 +851,4 @@
 SymTab/driver_cfa_cpp-Autogen.$(OBJEXT): SymTab/$(am__dirstamp) \
 	SymTab/$(DEPDIR)/$(am__dirstamp)
-SymTab/driver_cfa_cpp-TreeStruct.$(OBJEXT): SymTab/$(am__dirstamp) \
-	SymTab/$(DEPDIR)/$(am__dirstamp)
 SynTree/$(am__dirstamp):
 	@$(MKDIR_P) SynTree
@@ -1048,5 +1045,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Indexer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Mangler.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-TypeEquality.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SymTab/$(DEPDIR)/driver_cfa_cpp-Validate.Po@am__quote@
@@ -2101,18 +2097,4 @@
 @AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 @am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-Autogen.obj `if test -f 'SymTab/Autogen.cc'; then $(CYGPATH_W) 'SymTab/Autogen.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/Autogen.cc'; fi`
-
-SymTab/driver_cfa_cpp-TreeStruct.o: SymTab/TreeStruct.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.o -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.o' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.o `test -f 'SymTab/TreeStruct.cc' || echo '$(srcdir)/'`SymTab/TreeStruct.cc
-
-SymTab/driver_cfa_cpp-TreeStruct.obj: SymTab/TreeStruct.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SymTab/driver_cfa_cpp-TreeStruct.obj -MD -MP -MF SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Tpo SymTab/$(DEPDIR)/driver_cfa_cpp-TreeStruct.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SymTab/TreeStruct.cc' object='SymTab/driver_cfa_cpp-TreeStruct.obj' libtool=no @AMDEPBACKSLASH@
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	DEPDIR=$(DEPDIR) $(CXXDEPMODE) $(depcomp) @AMDEPBACKSLASH@
-@am__fastdepCXX_FALSE@	$(AM_V_CXX@am__nodep@)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -c -o SymTab/driver_cfa_cpp-TreeStruct.obj `if test -f 'SymTab/TreeStruct.cc'; then $(CYGPATH_W) 'SymTab/TreeStruct.cc'; else $(CYGPATH_W) '$(srcdir)/SymTab/TreeStruct.cc'; fi`
 
 SynTree/driver_cfa_cpp-Type.o: SynTree/Type.cc
Index: src/ResolvExpr/CurrentObject.cc
===================================================================
--- src/ResolvExpr/CurrentObject.cc	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ src/ResolvExpr/CurrentObject.cc	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -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 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ src/ResolvExpr/CurrentObject.h	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -24,4 +24,5 @@
 	class MemberIterator;
 
+	// TODO: memory management of MemberIterators
 	class CurrentObject {
 	public:
Index: src/SymTab/TreeStruct.cc
===================================================================
--- src/SymTab/TreeStruct.cc	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ 	(revision )
@@ -1,228 +1,0 @@
-//
-// 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.
-//
-// TreeStruct.cc --
-//
-// Author           : Andrew Beach
-// Created On       : Wed Jul 12 14:48:00 2017
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 14 15:49:00 2017
-// Update Count     : 0
-//
-
-#include "Common/PassVisitor.h"
-#include "InitTweak/InitTweak.h"
-#include "SynTree/Attribute.h"
-#include "SynTree/Declaration.h"
-#include "SynTree/Expression.h"
-#include "SynTree/Statement.h"
-#include "SynTree/Type.h"
-#include "SynTree/Mutator.h"
-
-__attribute__((noinline))
-Declaration* searchDeclList(
-        const std::list< Declaration* > & lst,
-        const Declaration * val ) {
-    auto tmp = std::find( lst.begin(), lst.end(), val );
-	return (tmp == lst.end()) ? nullptr : *tmp;
-}
-
-
-class TreeStructExpanderCore : public WithDeclsToAdd {
-	typedef std::pair<StructDecl *, ObjectDecl *> map_pair;
-	typedef std::map<std::string, map_pair> map;
-	typedef std::pair<map::iterator, bool> insert_result;
-	// std::pair<std::map<std::string,
-	//                    std::pair<StructDecl *,
-	//                              ObjectDecl *> >,
-	//           bool>
-
-	// key_name     first first
-	std::string key_name( std::pair<map::iterator, bool> & result )
-	{ return result.first->first; }
-	// struct_decl  first second first
-	StructDecl *& struct_decl( std::pair<map::iterator, bool> & result )
-	{ return result.first->second.first; }
-	// type_object  first second second
-	ObjectDecl *& type_object( std::pair<map::iterator, bool> & result )
-	{ return result.first->second.second; }
-	// key_name     first
-	std::string key_name( map::iterator & it ) { return it->first; }
-	// struct_decl  second first
-	StructDecl *& struct_decl( map::iterator & it )
-	{ return it->second.first; }
-	// type_object  second second
-	ObjectDecl *& type_object( map::iterator & it )
-	{ return it->second.second; }
-
-	StructDecl * type_object_type;
-
-	map known_structs;
-
-public:
-
-	TreeStructExpanderCore() : type_object_type( nullptr ) {}
-
-	std::string base_type_object_name( std::string struct_name ) {
-		return std::string("type_object_for_") + struct_name;
-	}
-
-	// Throws SemanticError if error is found.
-	Declaration * postmutate( StructDecl * node ) {
-		// Skip all untagged nodes.
-		if ( ! node->get_tagged() ) {
-			// Although we do grap the type object first.
-			if ( "__cfa__type_object" == node->get_name() ) {
-				assert( !type_object_type && "repeated type_object definition" );
-				type_object_type = node;
-			}
-			return node;
-		} else {
-			assert( type_object_type && "missing type_object definition" );
-		}
-
-		// Track all of the tagged nodes.
-		std::pair<map::iterator, bool> target = known_structs.insert(
-			std::make_pair( node->get_name(), map_pair( node, nullptr) ) );
-
-		// Validate no conflict (is that does elsewhere?)
-		// New declaration, no conflicting definition possible.
-		if ( target.second ) {
-			;
-		// Conflict if they have different parents.
-		} else if ( node->get_parentName() !=
-		            struct_decl( target )->get_parentName() ) {
-			throw SemanticError("TreeStructs do not share parents.");
-		// Conflict if they both have a body.
-		} else if ( node->has_body() && struct_decl( target )->has_body() ) {
-			throw SemanticError("TreeStructs with repeated bodies.");
-		// Update to the one with a body.
-		} else if ( node->has_body() ) {
-			struct_decl( target ) = node;
-		}
-
-		// if ( node->get_name() == node->get_parent_name() )
-		// We might actually use this for a while to say no parent.
-
-		// Validate Parent exists:
-		map::iterator target_parent =
-			known_structs.find( node->get_parentName() );
-		if ( known_structs.end() == target_parent && node->has_parent() ) {
-			throw SemanticError( std::string( "No <parent> named " ) +
-			                     node->get_parentName() + " defined." );
-		}
-
-		static Attribute linkonce( "section", std::list<Expression *>{
-			new NameExpr( "\".gnu.linkonce.exception\"" ) } );
-
-		Expression * parent_address = node->has_parent()
-			? (Expression *)new AddressExpr(
-				new VariableExpr( target_parent->second.second ) )
-			: (Expression *)new ConstantExpr( Constant::null(
-				new PointerType( Type::Qualifiers(),
-					new StructInstType( Type::Qualifiers(),
-					                    type_object_type ) ) ) );
-
-		// Insert the declaration of the type object.
-		ObjectDecl * type_object_inst = new ObjectDecl(
-			base_type_object_name( node->get_name() ),
-			Type::StorageClasses() /* I think this is none. */,
-			node->get_linkage(),
-			nullptr,
-			new StructInstType(
-				Type::Qualifiers(),
-				type_object_type
-				),
-			new ListInit({ new SingleInit( parent_address ) }),
-			std::list<Attribute *>{ linkonce.clone() }
-			);
-
-		declsToAddAfter.push_back( type_object_inst );
-
-		type_object( target ) = type_object_inst;
-
-		// Insert a field into the structure.
-		node->get_members().push_front( new ObjectDecl(
-			"tag",
-			Type::StorageClasses(),
-			node->get_linkage(),
-			nullptr,
-			new PointerType(
-				Type::Qualifiers( Type::Const ),
-				new StructInstType(
-					Type::Qualifiers( Type::Const ),
-					type_object_type
-					)
-				),
-			nullptr /*new SingleInit( new AddressExpr(
-				new VariableExpr( type_object_inst ) ) )*/
-			) );
-
-		return node;
-	}
-
-	DeclarationWithType * postmutate( FunctionDecl * funcDecl ) {
-		if ( ! InitTweak::isConstructor( funcDecl->get_name() ) ) {
-			return funcDecl;
-		}
-
-		if ( nullptr == funcDecl->get_statements() ) {
-			return funcDecl;
-		}
-
-		DeclarationWithType * param_one =
-			funcDecl->get_functionType()->get_parameters().front();
-		Type * param_one_t =
-			InitTweak::getPointerBase( param_one->get_type() );
-		StructInstType * struct_one_t =
-			dynamic_cast<StructInstType*>( param_one_t );
-
-		if ( struct_one_t && struct_one_t->get_baseStruct()->get_tagged() ) {
-			map::iterator target =
-	            known_structs.find( struct_one_t->get_name() );
-			assertf( known_structs.end() != target,
-			         "Missing definition of structure." );
-
-			DeclarationWithType * ptto_field =
-				dynamic_cast<DeclarationWithType*>(
-					struct_decl( target )->get_members().front() );
-			assertf( ptto_field, "Pointer to type object not found." );
-
-			Type * mutptr = ptto_field->get_type()->clone();
-			mutptr->set_const( false );
-			mutptr = new PointerType(Type::Qualifiers(), mutptr);
-
-			funcDecl->get_statements()->push_front( new ExprStmt( noLabels,
-				new UntypedExpr( new NameExpr( "?{}" ),
-					std::list<Expression *>{
-						new CastExpr(
-							new AddressExpr(
-								new MemberExpr(
-									ptto_field,
-									UntypedExpr::createDeref(
-										new VariableExpr( param_one )
-										)
-									)
-								),
-								mutptr
-							),
-						new AddressExpr(
-							new VariableExpr( type_object( target ) )
-							)
-						}
-					)
-				) );
-		}
-		return funcDecl;
-	}
-};
-
-// ?{}((type_object const**)&this->tag, &<type_object> )
-
-void expand_tree_structs( std::list<Declaration *> & translationUnit ) {
-	PassVisitor<TreeStructExpanderCore> translator;
-	mutateAll( translationUnit, translator );
-}
Index: src/SymTab/TreeStruct.h
===================================================================
--- src/SymTab/TreeStruct.h	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ 	(revision )
@@ -1,24 +1,0 @@
-//
-// 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.
-//
-// TreeStruct.h --
-//
-// Author           : Andrew Beach
-// Created On       : Wed Jul 12 14:58:00 2017
-// Last Modified By : Andrew Beach
-// Last Modified On : Fri Jul 14 11:15:00 2017
-// Update Count     : 0
-//
-
-// Various additions to make the translator for tree structures (hierarchy).
-// NOTE: Probably shouldn't be in SymTab.
-// NOTE: The name tree struct is temperay, we need the actual name.
-
-#include <list>
-
-class Declaration;
-
-void expand_tree_structs( std::list<Declaration *> & translationUnit );
Index: src/SymTab/module.mk
===================================================================
--- src/SymTab/module.mk	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ src/SymTab/module.mk	(revision 67a67af759e4d8ac479e64f6e4389a349145bae8)
@@ -11,6 +11,6 @@
 ## Created On       : Mon Jun  1 17:49:17 2015
 ## Last Modified By : Andrew Beach
-## Last Modified On : Wed Jul 12 13:06:00 2017
-## Update Count     : 3
+## Last Modified On : Thr Aug 10 16:08:00 2017
+## Update Count     : 4
 ###############################################################################
 
@@ -21,4 +21,3 @@
        SymTab/ImplementationType.cc \
        SymTab/TypeEquality.cc \
-       SymTab/Autogen.cc \
-       SymTab/TreeStruct.cc
+       SymTab/Autogen.cc
Index: src/libcfa/typeobject.c
===================================================================
--- src/libcfa/typeobject.c	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ 	(revision )
@@ -1,27 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// typeobject.c --
-//
-// Author           : Andrew Beach
-// Created On       : Tus Jul 11 15:10:00 2017
-// Last Modified By : Andrew Beach
-// Last Modified On : Tus Jul 12 16:04:00 2017
-// Update Count     : 0
-//
-
-#include "typeobject.h"
-
-// Takes in two non-null pointers to type_objects.
-int is_parent( struct __cfa__type_object const * parent,
-               struct __cfa__type_object const * child ) {
-	do {
-		if ( parent == child )
-			return 1;
-		child = child->parent;
-	} while ( child );
-	return 0;
-}
Index: src/libcfa/typeobject.h
===================================================================
--- src/libcfa/typeobject.h	(revision 3b4571b22f7c674a138e9e645e893e9e7298f6da)
+++ 	(revision )
@@ -1,29 +1,0 @@
-//
-// Cforall Version 1.0.0 Copyright (C) 2016 University of Waterloo
-//
-// The contents of this file are covered under the licence agreement in the
-// file "LICENCE" distributed with Cforall.
-//
-// typeobject.h -- Builtins for hierarchy objects.
-//
-// Author           : Andrew Beach
-// Created On       : Tus Jul 11 15:08:00 2017
-// Last Modified By : Peter A. Buhr
-// Last Modified On : Sat Jul 22 10:01:48 2017
-// Update Count     : 1
-//
-
-#pragma once
-
-struct __cfa__type_object {
-    struct __cfa__type_object const * const parent;
-};
-
-// Takes in two non-null pointers to type_objects.
-int is_parent( struct __cfa__type_object const * parent,
-               struct __cfa__type_object const * child );
-
-// Local Variables: //
-// mode: c //
-// tab-width: 4 //
-// End: //
