Index: src/SynTree/DeclReplacer.cc
===================================================================
--- src/SynTree/DeclReplacer.cc	(revision 0e73845c79836fc811677075d13e2a1858071a38)
+++ src/SynTree/DeclReplacer.cc	(revision 90152a4860529aff7214be01cd22abd37012cd19)
@@ -38,4 +38,16 @@
 			void previsit( TypeInstType * inst );
 		};
+
+		/// Mutator that replaces uses of declarations with arbitrary expressions, according to the supplied mapping
+		struct ExprDeclReplacer {
+		private:
+			const ExprMap & exprMap;
+			bool debug;
+		public:
+			ExprDeclReplacer( const ExprMap & exprMap, bool debug = false );
+
+			// replace variable with new node from expr map
+			Expression * postmutate( VariableExpr * varExpr );
+		};
 	}
 
@@ -53,4 +65,9 @@
 		DeclMap declMap;
 		replace( node, declMap, typeMap, debug );
+	}
+
+	void replace( BaseSyntaxNode *& node, const ExprMap & exprMap, bool debug ) {
+		PassVisitor<ExprDeclReplacer> replacer( exprMap, debug );
+		node = maybeMutate( node, replacer );
 	}
 
@@ -79,4 +96,19 @@
 			}
 		}
+
+		ExprDeclReplacer::ExprDeclReplacer( const ExprMap & exprMap, bool debug ) : exprMap( exprMap ), debug( debug ) {}
+
+		Expression * ExprDeclReplacer::postmutate( VariableExpr * varExpr ) {
+			if ( exprMap.count( varExpr->var ) ) {
+				Expression * replacement = exprMap.at( varExpr->var )->clone();
+				if ( debug ) {
+					std::cerr << "replacing variable reference: " << (void*)varExpr->var << " " << varExpr->var << " with " << (void*)replacement << " " << replacement << std::endl;
+				}
+				std::swap( varExpr->env, replacement->env );
+				delete varExpr;
+				return replacement;
+			}
+			return varExpr;
+		}
 	}
 } // namespace VarExprReplacer
Index: src/SynTree/DeclReplacer.h
===================================================================
--- src/SynTree/DeclReplacer.h	(revision 0e73845c79836fc811677075d13e2a1858071a38)
+++ src/SynTree/DeclReplacer.h	(revision 90152a4860529aff7214be01cd22abd37012cd19)
@@ -26,8 +26,19 @@
 	typedef std::map< DeclarationWithType *, DeclarationWithType * > DeclMap;
 	typedef std::map< TypeDecl *, TypeDecl * > TypeMap;
+	typedef std::map< DeclarationWithType *, Expression * > ExprMap;
 
 	void replace( BaseSyntaxNode * node, const DeclMap & declMap, bool debug = false );
 	void replace( BaseSyntaxNode * node, const TypeMap & typeMap, bool debug = false );
 	void replace( BaseSyntaxNode * node, const DeclMap & declMap, const TypeMap & typeMap, bool debug = false );
+
+	void replace( BaseSyntaxNode *& node, const ExprMap & exprMap, bool debug = false);
+	template<typename T>
+		void replace( T *& node, const ExprMap & exprMap, bool debug = false ) {
+		if ( ! node ) return;
+		BaseSyntaxNode * arg = node;
+		replace( arg, exprMap, debug );
+		node = dynamic_cast<T *>( arg );
+		assertf( node, "DeclReplacer fundamentally changed the type of its argument." );
+	}
 }
 
