Index: src/AST/Convert.cpp
===================================================================
--- src/AST/Convert.cpp	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/AST/Convert.cpp	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -25,4 +25,5 @@
 #include "AST/Init.hpp"
 #include "AST/Stmt.hpp"
+#include "AST/TranslationUnit.hpp"
 #include "AST/TypeSubstitution.hpp"
 
@@ -1404,8 +1405,8 @@
 };
 
-std::list< Declaration * > convert( const std::list< ast::ptr< ast::Decl > > && translationUnit ) {
+std::list< Declaration * > convert( const ast::TranslationUnit && translationUnit ) {
 	ConverterNewToOld c;
 	std::list< Declaration * > decls;
-	for(auto d : translationUnit) {
+	for(auto d : translationUnit.decls) {
 		decls.emplace_back( c.decl( d ) );
 	}
@@ -2803,12 +2804,12 @@
 #undef GET_ACCEPT_1
 
-std::list< ast::ptr< ast::Decl > > convert( const std::list< Declaration * > && translationUnit ) {
+ast::TranslationUnit convert( const std::list< Declaration * > && translationUnit ) {
 	ConverterOldToNew c;
-	std::list< ast::ptr< ast::Decl > > decls;
+	ast::TranslationUnit unit;
 	for(auto d : translationUnit) {
 		d->accept( c );
-		decls.emplace_back( c.decl() );
+		unit.decls.emplace_back( c.decl() );
 	}
 	deleteAll(translationUnit);
-	return decls;
+	return unit;
 }
Index: src/AST/Convert.hpp
===================================================================
--- src/AST/Convert.hpp	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/AST/Convert.hpp	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -18,11 +18,9 @@
 #include <list>
 
-#include "AST/Node.hpp"
-
 class Declaration;
 namespace ast {
-	class Decl;
+	class TranslationUnit;
 };
 
-std::list< Declaration * > convert( const std::list< ast::ptr< ast::Decl > > && translationUnit );
-std::list< ast::ptr< ast::Decl > > convert( const std::list< Declaration * > && translationUnit );
+std::list< Declaration * > convert( const ast::TranslationUnit && translationUnit );
+ast::TranslationUnit convert( const std::list< Declaration * > && translationUnit );
Index: src/AST/Fwd.hpp
===================================================================
--- src/AST/Fwd.hpp	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/AST/Fwd.hpp	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -137,4 +137,6 @@
 typedef unsigned int UniqueId;
 
+class TranslationUnit;
+// TODO: Get from the TranslationUnit:
 extern Type * sizeType;
 extern FunctionDecl * dereferenceOperator;
Index: src/AST/Pass.hpp
===================================================================
--- src/AST/Pass.hpp	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/AST/Pass.hpp	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -103,5 +103,5 @@
 	/// Construct and run a pass on a translation unit.
 	template< typename... Args >
-	static void run( std::list< ptr<Decl> > & decls, Args &&... args ) {
+	static void run( TranslationUnit & decls, Args &&... args ) {
 		Pass<core_t> visitor( std::forward<Args>( args )... );
 		accept_all( decls, visitor );
@@ -119,5 +119,5 @@
 	// Versions of the above for older compilers.
 	template< typename... Args >
-	static void run( std::list< ptr<Decl> > & decls ) {
+	static void run( TranslationUnit & decls ) {
 		Pass<core_t> visitor;
 		accept_all( decls, visitor );
@@ -303,4 +303,7 @@
 void accept_all( std::list< ast::ptr<ast::Decl> > &, ast::Pass<core_t> & visitor );
 
+template<typename core_t>
+void accept_all( ast::TranslationUnit &, ast::Pass<core_t> & visitor );
+
 //-------------------------------------------------------------------------------------------------
 // PASS ACCESSORIES
Index: src/AST/Pass.impl.hpp
===================================================================
--- src/AST/Pass.impl.hpp	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/AST/Pass.impl.hpp	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -20,4 +20,5 @@
 #include <unordered_map>
 
+#include "AST/TranslationUnit.hpp"
 #include "AST/TypeSubstitution.hpp"
 
@@ -430,4 +431,9 @@
 	pass_visitor_stats.depth--;
 	if ( !errors.isEmpty() ) { throw errors; }
+}
+
+template< typename core_t >
+inline void ast::accept_all( ast::TranslationUnit & unit, ast::Pass< core_t > & visitor ) {
+	return ast::accept_all( unit.decls, visitor );
 }
 
Index: src/AST/Pass.proto.hpp
===================================================================
--- src/AST/Pass.proto.hpp	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/AST/Pass.proto.hpp	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -22,4 +22,6 @@
 template<typename core_t>
 class Pass;
+
+class TranslationUnit;
 
 struct PureVisitor;
Index: src/InitTweak/FixGlobalInit.cc
===================================================================
--- src/InitTweak/FixGlobalInit.cc	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/InitTweak/FixGlobalInit.cc	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -109,5 +109,5 @@
 	}
 
-	void fixGlobalInit(std::list<ast::ptr<ast::Decl>> & translationUnit, bool inLibrary) {
+	void fixGlobalInit(ast::TranslationUnit & translationUnit, bool inLibrary) {
 		ast::Pass<GlobalFixer_new> fixer;
 		accept_all(translationUnit, fixer);
@@ -119,5 +119,5 @@
 				ast::Storage::Static, ast::Linkage::C, {new ast::Attribute("constructor", std::move(ctorParams))});
 
-			translationUnit.emplace_back( initFunction );
+			translationUnit.decls.emplace_back( initFunction );
 		} // if
 
@@ -128,5 +128,5 @@
 				ast::Storage::Static, ast::Linkage::C, {new ast::Attribute("destructor", std::move(dtorParams))});
 
-			translationUnit.emplace_back(destroyFunction);
+			translationUnit.decls.emplace_back(destroyFunction);
 		} // if
 	}
Index: src/InitTweak/FixGlobalInit.h
===================================================================
--- src/InitTweak/FixGlobalInit.h	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/InitTweak/FixGlobalInit.h	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -29,5 +29,5 @@
 	/// function is for library code.
 	void fixGlobalInit( std::list< Declaration * > & translationUnit, bool inLibrary );
-	void fixGlobalInit( std::list< ast::ptr<ast::Decl> > & translationUnit, bool inLibrary );
+	void fixGlobalInit( ast::TranslationUnit & translationUnit, bool inLibrary );
 } // namespace
 
Index: src/InitTweak/FixInit.h
===================================================================
--- src/InitTweak/FixInit.h	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/InitTweak/FixInit.h	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -19,7 +19,8 @@
 #include <string>  // for string
 
-#include <AST/Fwd.hpp>
-
 class Declaration;
+namespace ast {
+	class TranslationUnit;
+}
 
 namespace InitTweak {
@@ -27,5 +28,5 @@
 	void fix( std::list< Declaration * > & translationUnit, bool inLibrary );
 
-	void fix( std::list<ast::ptr<ast::Decl>> & translationUnit, bool inLibrary);
+	void fix( ast::TranslationUnit & translationUnit, bool inLibrary);
 } // namespace
 
Index: src/InitTweak/FixInitNew.cpp
===================================================================
--- src/InitTweak/FixInitNew.cpp	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/InitTweak/FixInitNew.cpp	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -179,5 +179,5 @@
 	/// expand each object declaration to use its constructor after it is declared.
 	struct FixInit : public ast::WithStmtsToAdd<> {
-		static void fixInitializers( std::list< ast::ptr<ast::Decl> > &translationUnit );
+		static void fixInitializers( ast::TranslationUnit &translationUnit );
 
 		const ast::DeclWithType * postvisit( const ast::ObjectDecl *objDecl );
@@ -225,5 +225,5 @@
 } // namespace
 
-void fix( std::list< ast::ptr<ast::Decl> > & translationUnit, bool inLibrary ) {
+void fix( ast::TranslationUnit & translationUnit, bool inLibrary ) {
 	ast::Pass<SelfAssignChecker>::run( translationUnit );
 
@@ -308,5 +308,5 @@
 	}
 
-	void FixInit::fixInitializers( std::list< ast::ptr<ast::Decl> > & translationUnit ) {
+	void FixInit::fixInitializers( ast::TranslationUnit & translationUnit ) {
 		ast::Pass<FixInit> fixer;
 
@@ -314,9 +314,9 @@
 		// can't use DeclMutator, because sometimes need to insert IfStmt, etc.
 		SemanticErrorException errors;
-		for ( auto i = translationUnit.begin(); i != translationUnit.end(); ++i ) {
+		for ( auto i = translationUnit.decls.begin(); i != translationUnit.decls.end(); ++i ) {
 			try {
 				// maybeAccept( *i, fixer ); translationUnit should never contain null
 				*i = (*i)->accept(fixer);
-				translationUnit.splice( i, fixer.core.staticDtorDecls );
+				translationUnit.decls.splice( i, fixer.core.staticDtorDecls );
 			} catch( SemanticErrorException &e ) {
 				errors.append( e );
Index: src/ResolvExpr/Resolver.cc
===================================================================
--- src/ResolvExpr/Resolver.cc	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/ResolvExpr/Resolver.cc	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -1274,5 +1274,5 @@
 	// size_t Resolver_new::traceId = Stats::Heap::new_stacktrace_id("Resolver");
 
-	void resolve( std::list< ast::ptr< ast::Decl > >& translationUnit ) {
+	void resolve( ast::TranslationUnit& translationUnit ) {
 		ast::Pass< Resolver_new >::run( translationUnit );
 	}
Index: src/ResolvExpr/Resolver.h
===================================================================
--- src/ResolvExpr/Resolver.h	(revision 3c80ccc84498117773bedfc351f42492113bbde8)
+++ src/ResolvExpr/Resolver.h	(revision 4406887ea1f557e9759e039804f06a654cbaa0f9)
@@ -35,4 +35,5 @@
 	class StmtExpr;
 	class SymbolTable;
+	class TranslationUnit;
 	class Type;
 	class TypeEnvironment;
@@ -55,5 +56,5 @@
 
 	/// Checks types and binds syntactic constructs to typed representations
-	void resolve( std::list< ast::ptr<ast::Decl> >& translationUnit );
+	void resolve( ast::TranslationUnit& translationUnit );
 	/// Searches expr and returns the first DeletedExpr found, otherwise nullptr
 	const ast::DeletedExpr * findDeletedExpr( const ast::Expr * expr );
@@ -69,8 +70,8 @@
 		const ast::Expr * untyped, const ast::SymbolTable & symtab);
 	/// Resolves a constructor init expression
-	ast::ptr< ast::Init > resolveCtorInit( 
+	ast::ptr< ast::Init > resolveCtorInit(
 		const ast::ConstructorInit * ctorInit, const ast::SymbolTable & symtab );
 	/// Resolves a statement expression
-	ast::ptr< ast::Expr > resolveStmtExpr( 
+	ast::ptr< ast::Expr > resolveStmtExpr(
 		const ast::StmtExpr * stmtExpr, const ast::SymbolTable & symtab );
 } // namespace ResolvExpr
