Index: src/CodeGen/FixMain.cc
===================================================================
--- src/CodeGen/FixMain.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/CodeGen/FixMain.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -29,5 +29,5 @@
 namespace CodeGen {
 	bool FixMain::replace_main = false;
-	std::unique_ptr<FunctionDecl> FixMain::main_signature = nullptr;
+	FunctionDecl* FixMain::main_signature = nullptr;
 
 	template<typename container>
@@ -41,5 +41,5 @@
 			SemanticError(functionDecl, "Multiple definition of main routine\n");
 		}
-		main_signature.reset( functionDecl->clone() );
+		main_signature = functionDecl;
 	}
 
Index: src/CodeGen/FixMain.h
===================================================================
--- src/CodeGen/FixMain.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/CodeGen/FixMain.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -40,5 +40,5 @@
 	  private:
   		static bool replace_main;
-		static std::unique_ptr<FunctionDecl> main_signature;
+		static FunctionDecl* main_signature;
 	};
 };
Index: src/CodeGen/FixNames.cc
===================================================================
--- src/CodeGen/FixNames.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/CodeGen/FixNames.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -16,5 +16,4 @@
 #include "FixNames.h"
 
-#include <memory>                  // for unique_ptr
 #include <string>                  // for string, operator!=, operator==
 
@@ -47,12 +46,12 @@
 	std::string mangle_main() {
 		FunctionType* main_type;
-		std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( "main", Type::StorageClasses(), LinkageSpec::Cforall,
-																   main_type = new FunctionType( Type::Qualifiers(), true ), nullptr )
-				};
+		FunctionDecl* mainDecl = new FunctionDecl{ 
+			"main", Type::StorageClasses(), LinkageSpec::Cforall, 
+			main_type = new FunctionType{ Type::Qualifiers(), true }, nullptr };
 		main_type->get_returnVals().push_back(
 			new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
 		);
 
-		auto && name = SymTab::Mangler::mangle( mainDecl.get() );
+		auto && name = SymTab::Mangler::mangle( mainDecl );
 		// std::cerr << name << std::endl;
 		return name;
@@ -60,7 +59,7 @@
 	std::string mangle_main_args() {
 		FunctionType* main_type;
-		std::unique_ptr<FunctionDecl> mainDecl { new FunctionDecl( "main", Type::StorageClasses(), LinkageSpec::Cforall,
-																   main_type = new FunctionType( Type::Qualifiers(), false ), nullptr )
-				};
+		FunctionDecl* mainDecl = new FunctionDecl{
+			"main", Type::StorageClasses(), LinkageSpec::Cforall,
+			main_type = new FunctionType{ Type::Qualifiers(), false }, nullptr };
 		main_type->get_returnVals().push_back(
 			new ObjectDecl( "", Type::StorageClasses(), LinkageSpec::Cforall, 0, new BasicType( Type::Qualifiers(), BasicType::SignedInt ), nullptr )
@@ -77,5 +76,5 @@
 		);
 
-		auto&& name = SymTab::Mangler::mangle( mainDecl.get() );
+		auto&& name = SymTab::Mangler::mangle( mainDecl );
 		// std::cerr << name << std::endl;
 		return name;
Index: src/Common/GC.h
===================================================================
--- src/Common/GC.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/Common/GC.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -66,5 +66,5 @@
 inline const GC& operator<< (const GC& gc, const T& x) { return gc; }
 
-inline void traceAll(const GC& gc) {}
+inline void traceAll(const GC&) {}
 
 /// Marks all arguments as live in current generation
@@ -94,10 +94,9 @@
 class GC_Traceable {
 	friend class GC;
-	friend class GcTracer;
+protected:
+	mutable bool mark;
 
-	mutable bool mark;
-protected:
 	/// override to trace any child objects
-	virtual void trace(const GC& gc) const {}
+	virtual void trace(const GC&) const {}
 };
 
Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/Concurrency/Keywords.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -200,13 +200,8 @@
 		StructDecl* dtor_guard_decl = nullptr;
 
-		static std::unique_ptr< Type > generic_func;
+		static Type* generic_func;
 	};
 
-	std::unique_ptr< Type > MutexKeyword::generic_func = std::unique_ptr< Type >(
-		new FunctionType(
-			noQualifiers,
-			true
-		)
-	);
+	Type* MutexKeyword::generic_func = new FunctionType{ noQualifiers, true };
 
 	//-----------------------------------------------------------------------------
Index: src/Concurrency/Waitfor.cc
===================================================================
--- src/Concurrency/Waitfor.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/Concurrency/Waitfor.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -137,6 +137,4 @@
 		StructDecl          * decl_acceptable = nullptr;
 		StructDecl          * decl_monitor    = nullptr;
-
-		static std::unique_ptr< Type > generic_func;
 
 		UniqueName namer_acc = "__acceptables_"s;
Index: src/GenPoly/GenPoly.cc
===================================================================
--- src/GenPoly/GenPoly.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/GenPoly/GenPoly.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -437,5 +437,4 @@
 		Type * newType = arg->clone();
 		if ( env ) env->apply( newType );
-		std::unique_ptr<Type> manager( newType );
 		// if the argument's type is polymorphic, we don't need to box again!
 		return ! isPolyType( newType );
Index: src/GenPoly/Specialize.cc
===================================================================
--- src/GenPoly/Specialize.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/GenPoly/Specialize.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -17,5 +17,4 @@
 #include <iterator>                      // for back_insert_iterator, back_i...
 #include <map>                           // for _Rb_tree_iterator, _Rb_tree_...
-#include <memory>                        // for unique_ptr
 #include <string>                        // for string
 #include <tuple>                         // for get
@@ -225,5 +224,4 @@
 			env->apply( actualType );
 		}
-		std::unique_ptr< FunctionType > actualTypeManager( actualType ); // for RAII
 		std::list< DeclarationWithType * >::iterator actualBegin = actualType->get_parameters().begin();
 		std::list< DeclarationWithType * >::iterator actualEnd = actualType->get_parameters().end();
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/InitTweak/InitTweak.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -122,5 +122,5 @@
 	public:
 		ExprImpl( Expression * expr ) : arg( expr ) {}
-		virtual ~ExprImp() = default;
+		virtual ~ExprImpl() = default;
 
 		virtual std::list< Expression * > next( std::list< Expression * > & indices ) {
Index: src/Makefile.in
===================================================================
--- src/Makefile.in	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/Makefile.in	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -250,5 +250,4 @@
 	SynTree/driver_cfa_cpp-TypeSubstitution.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-Attribute.$(OBJEXT) \
-	SynTree/driver_cfa_cpp-GcTracer.$(OBJEXT) \
 	SynTree/driver_cfa_cpp-VarExprReplacer.$(OBJEXT) \
 	Tuples/driver_cfa_cpp-TupleAssignment.$(OBJEXT) \
@@ -528,8 +527,7 @@
 	SynTree/NamedTypeDecl.cc SynTree/TypeDecl.cc \
 	SynTree/Initializer.cc SynTree/TypeSubstitution.cc \
-	SynTree/Attribute.cc SynTree/GcTracer.cc \
-	SynTree/VarExprReplacer.cc Tuples/TupleAssignment.cc \
-	Tuples/TupleExpansion.cc Tuples/Explode.cc \
-	Virtual/ExpandCasts.cc
+	SynTree/Attribute.cc SynTree/VarExprReplacer.cc \
+	Tuples/TupleAssignment.cc Tuples/TupleExpansion.cc \
+	Tuples/Explode.cc Virtual/ExpandCasts.cc
 MAINTAINERCLEANFILES = Parser/parser.output ${libdir}/${notdir \
 	${cfa_cpplib_PROGRAMS}}
@@ -917,6 +915,4 @@
 SynTree/driver_cfa_cpp-Attribute.$(OBJEXT): SynTree/$(am__dirstamp) \
 	SynTree/$(DEPDIR)/$(am__dirstamp)
-SynTree/driver_cfa_cpp-GcTracer.$(OBJEXT): SynTree/$(am__dirstamp) \
-	SynTree/$(DEPDIR)/$(am__dirstamp)
 SynTree/driver_cfa_cpp-VarExprReplacer.$(OBJEXT):  \
 	SynTree/$(am__dirstamp) SynTree/$(DEPDIR)/$(am__dirstamp)
@@ -1053,5 +1049,4 @@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-FunctionDecl.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-FunctionType.Po@am__quote@
-@AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-GcTracer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-Initializer.Po@am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote@SynTree/$(DEPDIR)/driver_cfa_cpp-NamedTypeDecl.Po@am__quote@
@@ -2520,18 +2515,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 SynTree/driver_cfa_cpp-Attribute.obj `if test -f 'SynTree/Attribute.cc'; then $(CYGPATH_W) 'SynTree/Attribute.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/Attribute.cc'; fi`
-
-SynTree/driver_cfa_cpp-GcTracer.o: SynTree/GcTracer.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-GcTracer.o -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-GcTracer.Tpo -c -o SynTree/driver_cfa_cpp-GcTracer.o `test -f 'SynTree/GcTracer.cc' || echo '$(srcdir)/'`SynTree/GcTracer.cc
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-GcTracer.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-GcTracer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SynTree/GcTracer.cc' object='SynTree/driver_cfa_cpp-GcTracer.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 SynTree/driver_cfa_cpp-GcTracer.o `test -f 'SynTree/GcTracer.cc' || echo '$(srcdir)/'`SynTree/GcTracer.cc
-
-SynTree/driver_cfa_cpp-GcTracer.obj: SynTree/GcTracer.cc
-@am__fastdepCXX_TRUE@	$(AM_V_CXX)$(CXX) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(driver_cfa_cpp_CXXFLAGS) $(CXXFLAGS) -MT SynTree/driver_cfa_cpp-GcTracer.obj -MD -MP -MF SynTree/$(DEPDIR)/driver_cfa_cpp-GcTracer.Tpo -c -o SynTree/driver_cfa_cpp-GcTracer.obj `if test -f 'SynTree/GcTracer.cc'; then $(CYGPATH_W) 'SynTree/GcTracer.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/GcTracer.cc'; fi`
-@am__fastdepCXX_TRUE@	$(AM_V_at)$(am__mv) SynTree/$(DEPDIR)/driver_cfa_cpp-GcTracer.Tpo SynTree/$(DEPDIR)/driver_cfa_cpp-GcTracer.Po
-@AMDEP_TRUE@@am__fastdepCXX_FALSE@	$(AM_V_CXX)source='SynTree/GcTracer.cc' object='SynTree/driver_cfa_cpp-GcTracer.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 SynTree/driver_cfa_cpp-GcTracer.obj `if test -f 'SynTree/GcTracer.cc'; then $(CYGPATH_W) 'SynTree/GcTracer.cc'; else $(CYGPATH_W) '$(srcdir)/SynTree/GcTracer.cc'; fi`
 
 SynTree/driver_cfa_cpp-VarExprReplacer.o: SynTree/VarExprReplacer.cc
Index: src/Parser/ParseNode.h
===================================================================
--- src/Parser/ParseNode.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/Parser/ParseNode.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -124,15 +124,15 @@
 
 	virtual void print( std::ostream &os, __attribute__((unused)) int indent = 0 ) const override {
-		os << expr.get() << std::endl;
+		os << expr << std::endl;
 	}
 	void printOneLine( __attribute__((unused)) std::ostream &os, __attribute__((unused)) int indent = 0 ) const {}
 
 	template<typename T>
-	bool isExpressionType() const {	return nullptr != dynamic_cast<T>(expr.get()); }
-
-	Expression * build() const { return const_cast<ExpressionNode *>(this)->expr.release(); }
+	bool isExpressionType() const {	return nullptr != dynamic_cast<T>(expr); }
+
+	Expression * build() const { return expr; }
   private:
 	bool extension = false;
-	std::unique_ptr<Expression> expr;
+	Expression* expr;
 }; // ExpressionNode
 
@@ -352,5 +352,5 @@
 
 	virtual StatementNode * clone() const final { assert( false ); return nullptr; }
-	Statement * build() const { return const_cast<StatementNode *>(this)->stmt.release(); }
+	Statement * build() const { return stmt; }
 
 	virtual StatementNode * add_label( const std::string * name, DeclarationNode * attr = nullptr ) {
@@ -364,8 +364,8 @@
 
 	virtual void print( std::ostream &os, __attribute__((unused)) int indent = 0 ) const override {
-		os << stmt.get() << std::endl;
+		os << stmt << std::endl;
 	}
   private:
-	std::unique_ptr<Statement> stmt;
+	Statement* stmt;
 }; // StatementNode
 
Index: src/Parser/StatementNode.cc
===================================================================
--- src/Parser/StatementNode.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/Parser/StatementNode.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -16,5 +16,4 @@
 #include <cassert>                 // for assert, strict_dynamic_cast, assertf
 #include <list>                    // for list
-#include <memory>                  // for unique_ptr
 #include <string>                  // for string
 
@@ -50,5 +49,5 @@
 		agg = decl;
 	} // if
-	stmt.reset( new DeclStmt( maybeMoveBuild< Declaration >(agg) ) );
+	stmt = new DeclStmt{ maybeMoveBuild< Declaration >(agg) };
 } // StatementNode::StatementNode
 
@@ -58,5 +57,5 @@
 	for ( StatementNode * curr = prev; curr != nullptr; curr = (StatementNode *)curr->get_next() ) {
 		StatementNode *node = strict_dynamic_cast< StatementNode * >(curr);
-		assert( dynamic_cast< CaseStmt * >(node->stmt.get()) );
+		assert( dynamic_cast< CaseStmt * >(node->stmt) );
 		prev = curr;
 	} // for
@@ -66,5 +65,5 @@
 	buildMoveList( stmt, stmts );
 	// splice any new Statements to end of current Statements
-	CaseStmt * caseStmt = dynamic_cast< CaseStmt * >(node->stmt.get());
+	CaseStmt * caseStmt = dynamic_cast< CaseStmt * >(node->stmt);
 	caseStmt->get_statements().splice( caseStmt->get_statements().end(), stmts );
 	return this;
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -21,5 +21,5 @@
 #include <list>                    // for _List_iterator, list, _List_const_...
 #include <map>                     // for _Rb_tree_iterator, map, _Rb_tree_c...
-#include <memory>                  // for allocator_traits<>::value_type, unique_ptr
+#include <memory>                  // for allocator_traits<>::value_type
 #include <utility>                 // for pair
 #include <vector>                  // for vector
@@ -296,18 +296,18 @@
 		// adds anonymous member interpretations whenever an aggregate value type is seen.
 		// it's okay for the aggregate expression to have reference type -- cast it to the base type to treat the aggregate as the referenced value
-		std::unique_ptr<Expression> aggrExpr( alt.expr->clone() );
+		Expression* aggrExpr = alt.expr->clone();
 		alt.env.apply( aggrExpr->get_result() );
 		Type * aggrType = aggrExpr->get_result();
 		if ( dynamic_cast< ReferenceType * >( aggrType ) ) {
 			aggrType = aggrType->stripReferences();
-			aggrExpr.reset( new CastExpr( aggrExpr.release(), aggrType->clone() ) );
+			aggrExpr = new CastExpr{ aggrExpr, aggrType->clone() };
 		}
 
 		if ( StructInstType *structInst = dynamic_cast< StructInstType* >( aggrExpr->get_result() ) ) {
 			NameExpr nameExpr( "" );
-			addAggMembers( structInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr );
+			addAggMembers( structInst, aggrExpr, alt.cost+Cost::safe, alt.env, &nameExpr );
 		} else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( aggrExpr->get_result() ) ) {
 			NameExpr nameExpr( "" );
-			addAggMembers( unionInst, aggrExpr.get(), alt.cost+Cost::safe, alt.env, &nameExpr );
+			addAggMembers( unionInst, aggrExpr, alt.cost+Cost::safe, alt.env, &nameExpr );
 		} // if
 	}
@@ -630,5 +630,5 @@
 	struct ArgPack {
 		std::size_t parent;                ///< Index of parent pack
-		std::unique_ptr<Expression> expr;  ///< The argument stored here
+		Expression* expr;                  ///< The argument stored here
 		Cost cost;                         ///< The cost of this argument
 		TypeEnvironment env;               ///< Environment for this pack
@@ -677,5 +677,5 @@
 			std::list<Expression*> exprs;
 			const ArgPack* pack = this;
-			if ( expr ) { exprs.push_front( expr.release() ); }
+			if ( expr ) { exprs.push_front( expr ); }
 			while ( pack->tupleStart == 0 ) {
 				pack = &packs[pack->parent];
@@ -684,5 +684,5 @@
 			}
 			// reset pack to appropriate tuple
-			expr.reset( new TupleExpr( exprs ) );
+			expr = new TupleExpr{ exprs };
 			tupleStart = pack->tupleStart - 1;
 			parent = pack->parent;
@@ -736,5 +736,5 @@
 
 						results.emplace_back(
-							i, expl.exprs[results[i].nextExpl].get(), copy(results[i].env),
+							i, expl.exprs[results[i].nextExpl], copy(results[i].env),
 							copy(results[i].need), copy(results[i].have),
 							copy(results[i].openVars), nextArg, nTuples, Cost::zero, nextExpl,
@@ -757,5 +757,5 @@
 							newResult.parent = i;
 							std::list<Expression*> emptyList;
-							newResult.expr.reset( new TupleExpr( emptyList ) );
+							newResult.expr = new TupleExpr{ emptyList };
 							argType = newResult.expr->get_result();
 						} else {
@@ -764,5 +764,5 @@
 							newResult.cost = results[i].cost;
 							newResult.tupleStart = results[i].tupleStart;
-							newResult.expr.reset( results[i].expr->clone() );
+							newResult.expr = results[i].expr->clone();
 							argType = newResult.expr->get_result();
 
@@ -814,5 +814,5 @@
 						// add new result
 						results.emplace_back(
-							i, expl.exprs.front().get(), move(env), copy(results[i].need),
+							i, expl.exprs.front(), move(env), copy(results[i].need),
 							copy(results[i].have), move(openVars), nextArg + 1,
 							nTuples, expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
@@ -840,5 +840,5 @@
 			if ( results[i].hasExpl() ) {
 				const ExplodedActual& expl = results[i].getExpl( args );
-				Expression* expr = expl.exprs[results[i].nextExpl].get();
+				Expression* expr = expl.exprs[results[i].nextExpl];
 
 				TypeEnvironment env = results[i].env;
@@ -911,5 +911,5 @@
 
 				// consider only first exploded actual
-				Expression* expr = expl.exprs.front().get();
+				Expression* expr = expl.exprs.front();
 				Type* actualType = expr->get_result()->clone();
 
@@ -1014,5 +1014,5 @@
 
 						results.emplace_back(
-							i, expl.exprs[results[i].nextExpl].get(), copy(results[i].env),
+							i, expl.exprs[results[i].nextExpl], copy(results[i].env),
 							copy(results[i].need), copy(results[i].have),
 							copy(results[i].openVars), nextArg, 0, Cost::zero, nextExpl,
@@ -1050,5 +1050,5 @@
 						// add new result
 						results.emplace_back(
-							i, expl.exprs.front().get(), move(env), copy(results[i].need),
+							i, expl.exprs.front(), move(env), copy(results[i].need),
 							copy(results[i].have), move(openVars), nextArg + 1, 0,
 							expl.cost, expl.exprs.size() == 1 ? 0 : 1, j );
@@ -1344,5 +1344,4 @@
 			Expression * aggrExpr = agg->expr->clone();
 			referenceToRvalueConversion( aggrExpr, cost );
-			std::unique_ptr<Expression> guard( aggrExpr );
 
 			// find member of the given type
Index: src/ResolvExpr/ExplodedActual.h
===================================================================
--- src/ResolvExpr/ExplodedActual.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/ResolvExpr/ExplodedActual.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -16,5 +16,4 @@
 #pragma once
 
-#include <memory>
 #include <vector>
 
@@ -29,5 +28,5 @@
 		TypeEnvironment env;
 		Cost cost;
-		std::vector< std::unique_ptr<Expression> > exprs;
+		std::vector< Expression* > exprs;
 
 		ExplodedActual() : env(), cost(Cost::zero), exprs() {}
Index: src/ResolvExpr/Unify.cc
===================================================================
--- src/ResolvExpr/Unify.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/ResolvExpr/Unify.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -17,5 +17,4 @@
 #include <iterator>               // for back_insert_iterator, back_inserter
 #include <map>                    // for _Rb_tree_const_iterator, _Rb_tree_i...
-#include <memory>                 // for unique_ptr
 #include <set>                    // for set
 #include <string>                 // for string, operator==, operator!=, bas...
@@ -165,7 +164,7 @@
 				Type *common = 0;
 				// attempt to unify equivalence class type (which has qualifiers stripped, so they must be restored) with the type to bind to
-				std::unique_ptr< Type > newType( curClass.type->clone() );
+				Type* newType = curClass.type->clone();
 				newType->get_qualifiers() = typeInst->get_qualifiers();
-				if ( unifyInexact( newType.get(), other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass.allowWidening, true ), indexer, common ) ) {
+				if ( unifyInexact( newType, other, env, needAssertions, haveAssertions, openVars, widenMode & WidenMode( curClass.allowWidening, true ), indexer, common ) ) {
 					if ( common ) {
 						common->get_qualifiers() = Type::Qualifiers();
@@ -466,5 +465,5 @@
 
 	template< typename Iterator, typename Func >
-	std::unique_ptr<Type> combineTypes( Iterator begin, Iterator end, Func & toType ) {
+	Type* combineTypes( Iterator begin, Iterator end, Func & toType ) {
 		std::list< Type * > types;
 		for ( ; begin != end; ++begin ) {
@@ -472,5 +471,5 @@
 			flatten( toType( *begin ), back_inserter( types ) );
 		}
-		return std::unique_ptr<Type>( new TupleType( Type::Qualifiers(), types ) );
+		return new TupleType{ Type::Qualifiers(), types };
 	}
 
@@ -487,8 +486,8 @@
 			if ( isTtype1 && ! isTtype2 ) {
 				// combine all of the things in list2, then unify
-				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ).get(), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else if ( isTtype2 && ! isTtype1 ) {
 				// combine all of the things in list1, then unify
-				return unifyExact( combineTypes( list1Begin, list1End, get_type ).get(), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( combineTypes( list1Begin, list1End, get_type ), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else if ( ! unifyExact( t1, t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer ) ) {
 				return false;
@@ -500,5 +499,5 @@
 			Type * t1 = (*list1Begin)->get_type();
 			if ( Tuples::isTtype( t1 ) ) {
-				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ).get(), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else return false;
 		} else if ( list2Begin != list2End ) {
@@ -506,5 +505,5 @@
 			Type * t2 = (*list2Begin)->get_type();
 			if ( Tuples::isTtype( t2 ) ) {
-				return unifyExact( combineTypes( list1Begin, list1End, get_type ).get(), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( combineTypes( list1Begin, list1End, get_type ), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else return false;
 		} else {
@@ -559,6 +558,6 @@
 			// flatten the parameter lists for both functions so that tuple structure
 			// doesn't affect unification. Must be a clone so that the types don't change.
-			std::unique_ptr<FunctionType> flatFunc( functionType->clone() );
-			std::unique_ptr<FunctionType> flatOther( otherFunction->clone() );
+			FunctionType* flatFunc = functionType->clone();
+			FunctionType* flatOther = otherFunction->clone();
 			flattenList( flatFunc->get_parameters(), flatFunc->get_parameters(), env );
 			flattenList( flatOther->get_parameters(), flatOther->get_parameters(), env );
@@ -701,8 +700,8 @@
 			if ( isTtype1 && ! isTtype2 ) {
 				// combine all of the things in list2, then unify
-				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ).get(), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else if ( isTtype2 && ! isTtype1 ) {
 				// combine all of the things in list1, then unify
-				return unifyExact( combineTypes( list1Begin, list1End, get_type ).get(), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( combineTypes( list1Begin, list1End, get_type ), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else if ( ! unifyExact( t1, t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer ) ) {
 				return false;
@@ -714,5 +713,5 @@
 			Type * t1 = *list1Begin;
 			if ( Tuples::isTtype( t1 ) ) {
-				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ).get(), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( t1, combineTypes( list2Begin, list2End, get_type ), env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else return false;
 		} else if ( list2Begin != list2End ) {
@@ -720,5 +719,5 @@
 			Type * t2 = *list2Begin;
 			if ( Tuples::isTtype( t2 ) ) {
-				return unifyExact( combineTypes( list1Begin, list1End, get_type ).get(), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
+				return unifyExact( combineTypes( list1Begin, list1End, get_type ), t2, env, needAssertions, haveAssertions, openVars, WidenMode( false, false ), indexer );
 			} else return false;
 		} else {
@@ -729,6 +728,6 @@
 	void Unify::postvisit(TupleType *tupleType) {
 		if ( TupleType *otherTuple = dynamic_cast< TupleType* >( type2 ) ) {
-			std::unique_ptr<TupleType> flat1( tupleType->clone() );
-			std::unique_ptr<TupleType> flat2( otherTuple->clone() );
+			TupleType* flat1 = tupleType->clone();
+			TupleType* flat2 = otherTuple->clone();
 			std::list<Type *> types1, types2;
 
@@ -737,6 +736,6 @@
 			flat2->acceptMutator( expander );
 
-			flatten( flat1.get(), back_inserter( types1 ) );
-			flatten( flat2.get(), back_inserter( types2 ) );
+			flatten( flat1, back_inserter( types1 ) );
+			flatten( flat2, back_inserter( types2 ) );
 
 			result = unifyList( types1.begin(), types1.end(), types2.begin(), types2.end(), env, needAssertions, haveAssertions, openVars, indexer );
Index: src/SymTab/Validate.cc
===================================================================
--- src/SymTab/Validate.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/SymTab/Validate.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -197,6 +197,5 @@
 		void addImplicitTypedef( AggDecl * aggDecl );
 
-		typedef std::unique_ptr<TypedefDecl> TypedefDeclPtr;
-		typedef ScopedMap< std::string, std::pair< TypedefDeclPtr, int > > TypedefMap;
+		typedef ScopedMap< std::string, std::pair< TypedefDecl*, int > > TypedefMap;
 		typedef std::map< std::string, TypeDecl * > TypeDeclMap;
 		TypedefMap typedefNames;
@@ -746,5 +745,5 @@
 			}
 		} else {
-			typedefNames[ tyDecl->get_name() ] = std::make_pair( TypedefDeclPtr( tyDecl ), scopeLevel );
+			typedefNames[ tyDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
 		} // if
 
@@ -839,6 +838,6 @@
 				type = new EnumInstType( Type::Qualifiers(), newDeclEnumDecl->get_name() );
 			} // if
-			TypedefDeclPtr tyDecl( new TypedefDecl( aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() ) );
-			typedefNames[ aggDecl->get_name() ] = std::make_pair( std::move( tyDecl ), scopeLevel );
+			TypedefDecl* tyDecl = new TypedefDecl{ aggDecl->get_name(), aggDecl->location, Type::StorageClasses(), type, aggDecl->get_linkage() };
+			typedefNames[ aggDecl->get_name() ] = std::make_pair( tyDecl, scopeLevel );
 		} // if
 	}
Index: src/SynTree/ApplicationExpr.cc
===================================================================
--- src/SynTree/ApplicationExpr.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/SynTree/ApplicationExpr.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -17,5 +17,4 @@
 #include <list>                  // for list
 #include <map>                   // for _Rb_tree_const_iterator, map, map<>:...
-#include <memory>                // for unique_ptr
 #include <ostream>               // for operator<<, ostream, basic_ostream
 #include <string>                // for operator<<, string, char_traits
Index: src/SynTree/BaseSyntaxNode.h
===================================================================
--- src/SynTree/BaseSyntaxNode.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/SynTree/BaseSyntaxNode.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -24,4 +24,5 @@
 
 class BaseSyntaxNode : GC_Object {
+  friend class GcTracer;
 public:
 	CodeLocation location;
Index: c/SynTree/GcTracer.cc
===================================================================
--- src/SynTree/GcTracer.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ 	(revision )
@@ -1,29 +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.
-//
-// GcTracer.cc --
-//
-// Author           : Aaron B. Moss
-// Created On       : Thu Mar 15 14:47:00 2018
-// Last Modified By : Aaron B. Moss
-// Last Modified On : Thu Mar 15 14:47:00 2018
-// Update Count     : 1
-//
-
-#include "GcTracer.h"
-
-#include "Expression.h"
-#include "TypeSubstitution.h"
-
-void GcTracer::postvisit( Expression * expr ) {
-
-}
-
-// Local Variables: //
-// tab-width: 4 //
-// mode: c++ //
-// compile-command: "make install" //
-// End: //
Index: src/SynTree/GcTracer.h
===================================================================
--- src/SynTree/GcTracer.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/SynTree/GcTracer.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -52,5 +52,5 @@
 static inline const GC& operator<< ( const GC& gc, const std::list<Declaration*>& translationUnit ) {
 	PassVisitor<GcTracer> tracer{ gc };
-	acceptAll( translationUnit, tracer );
+	acceptAll( const_cast<std::list<Declaration*>&>( translationUnit ), tracer );
 	return gc;
 }
Index: src/SynTree/TypeSubstitution.h
===================================================================
--- src/SynTree/TypeSubstitution.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/SynTree/TypeSubstitution.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -59,4 +59,5 @@
 	void normalize();
 
+	void accept( Visitor& v ) { v.visit( this ); }
 	TypeSubstitution * acceptMutator( Mutator & m ) { return m.mutate( this ); }
 
Index: src/SynTree/Visitor.h
===================================================================
--- src/SynTree/Visitor.h	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/SynTree/Visitor.h	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -121,4 +121,6 @@
 
 	virtual void visit( Attribute * attribute ) = 0;
+
+	virtual void visit( TypeSubstitution * sub ) = 0;
 };
 
Index: src/SynTree/module.mk
===================================================================
--- src/SynTree/module.mk	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/SynTree/module.mk	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -48,5 +48,4 @@
        SynTree/TypeSubstitution.cc \
        SynTree/Attribute.cc \
-       SynTree/GcTracer.cc \
        SynTree/VarExprReplacer.cc
 
Index: src/Tuples/Explode.cc
===================================================================
--- src/Tuples/Explode.cc	(revision 68f9c43ecf1873cbb5f06aee682704b56612ed16)
+++ src/Tuples/Explode.cc	(revision 8d7bef249652cc2b9854c7090c758bcd9ad9f613)
@@ -87,5 +87,5 @@
 				// field is consistent with the type of the tuple expr, since the field
 				// may have changed from type T to T&.
-				return new TupleIndexExpr{ tupleExpr->get_tuple(), tupleExpr->get_index() };
+				return new TupleIndexExpr( tupleExpr->get_tuple(), tupleExpr->get_index() );
 			}
 		};
