Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision a8e64c4029370bc62f193afaf75b9ad8e7f8a7df)
+++ src/InitTweak/FixInit.cc	(revision 134322e8f4d4a14c74012f379a803fc111da3be3)
@@ -20,23 +20,25 @@
 #include <unordered_map>
 #include <unordered_set>
+
 #include "InitTweak.h"
 #include "GenInit.h"
 #include "FixInit.h"
 #include "FixGlobalInit.h"
+#include "CodeGen/GenType.h"  // for warning/error messages
+#include "Common/PassVisitor.h"
+#include "GenPoly/DeclMutator.h"
+#include "GenPoly/PolyMutator.h"
 #include "ResolvExpr/Resolver.h"
 #include "ResolvExpr/typeops.h"
+#include "SymTab/Autogen.h"
+#include "SymTab/Indexer.h"
+#include "SynTree/AddStmtVisitor.h"
+#include "SynTree/Attribute.h"
 #include "SynTree/Declaration.h"
-#include "SynTree/Type.h"
 #include "SynTree/Expression.h"
-#include "SynTree/Attribute.h"
-#include "SynTree/Statement.h"
 #include "SynTree/Initializer.h"
 #include "SynTree/Mutator.h"
-#include "SymTab/Indexer.h"
-#include "SymTab/Autogen.h"
-#include "GenPoly/PolyMutator.h"
-#include "GenPoly/DeclMutator.h"
-#include "SynTree/AddStmtVisitor.h"
-#include "CodeGen/GenType.h"  // for warning/error messages
+#include "SynTree/Statement.h"
+#include "SynTree/Type.h"
 #include "Tuples/Tuples.h"
 
@@ -54,5 +56,5 @@
 		typedef std::unordered_map< int, int > UnqCount;
 
-		class InsertImplicitCalls final : public GenPoly::PolyMutator {
+		class InsertImplicitCalls {
 		public:
 			/// wrap function application expressions as ImplicitCopyCtorExpr nodes so that it is easy to identify which
@@ -61,11 +63,11 @@
 
 			InsertImplicitCalls( EnvMap & envMap ) : envMap( envMap ) {}
-			typedef GenPoly::PolyMutator Parent;
-			using Parent::mutate;
-			virtual Expression * mutate( ApplicationExpr * appExpr ) override;
-			virtual Expression * mutate( StmtExpr * stmtExpr ) override;
+
+			Expression * postmutate( ApplicationExpr * appExpr );
+			void premutate( StmtExpr * stmtExpr );
 
 			// collects environments for relevant nodes
 			EnvMap & envMap;
+			TypeSubstitution * env; //Magically populated by the PassVisitor
 		};
 
@@ -300,5 +302,5 @@
 	namespace {
 		void InsertImplicitCalls::insert( std::list< Declaration * > & translationUnit, EnvMap & envMap ) {
-			InsertImplicitCalls inserter( envMap );
+			PassVisitor<InsertImplicitCalls> inserter( envMap );
 			mutateAll( translationUnit, inserter );
 		}
@@ -350,6 +352,5 @@
 		}
 
-		Expression * InsertImplicitCalls::mutate( ApplicationExpr * appExpr ) {
-			appExpr = dynamic_cast< ApplicationExpr * >( Parent::mutate( appExpr ) );
+		Expression * InsertImplicitCalls::postmutate( ApplicationExpr * appExpr ) {
 			assert( appExpr );
 
@@ -393,8 +394,7 @@
 		}
 
-		Expression * InsertImplicitCalls::mutate( StmtExpr * stmtExpr ) {
+		void InsertImplicitCalls::premutate( StmtExpr * stmtExpr ) {
 			assert( env );
 			envMap[stmtExpr] = env;
-			return Parent::mutate( stmtExpr );
 		}
 
