Index: src/SynTree/ApplicationExpr.cc
===================================================================
--- src/SynTree/ApplicationExpr.cc	(revision 6c89ecc6f88e055fd37187ef13c252282c1929be)
+++ src/SynTree/ApplicationExpr.cc	(revision aeb8f70056004f741c9dcb505f8cb1cecb640ff1)
@@ -29,5 +29,5 @@
 
 ParamEntry::ParamEntry( const ParamEntry &other ) :
-		decl( other.decl ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) ), inferParams( new InferredParams( *other.inferParams ) ) {
+		decl( other.decl ), actualType( maybeClone( other.actualType ) ), formalType( maybeClone( other.formalType ) ), expr( maybeClone( other.expr ) )/*, inferParams( new InferredParams( *other.inferParams ) )*/ {
 }
 
@@ -39,5 +39,5 @@
 	formalType = maybeClone( other.formalType );
 	expr = maybeClone( other.expr );
-	*inferParams = *other.inferParams;
+	// *inferParams = *other.inferParams;
 	return *this;
 }
@@ -50,5 +50,5 @@
 
 ParamEntry::ParamEntry( ParamEntry && other ) :
-		decl( other.decl ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr ), inferParams( std::move( other.inferParams ) ) {
+		decl( other.decl ), actualType( other.actualType ), formalType( other.formalType ), expr( other.expr )/*, inferParams( std::move( other.inferParams ) )*/ {
 	other.actualType = nullptr;
 	other.formalType = nullptr;
@@ -68,5 +68,5 @@
 	other.formalType = nullptr;
 	other.expr = nullptr;
-	inferParams = std::move( other.inferParams );
+	// inferParams = std::move( other.inferParams );
 	return *this;
 }
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 6c89ecc6f88e055fd37187ef13c252282c1929be)
+++ src/SynTree/Expression.cc	(revision aeb8f70056004f741c9dcb505f8cb1cecb640ff1)
@@ -40,5 +40,5 @@
 			Declaration::declFromId( i->second.decl )->printShort( os, indent+1 );
 			os << std::endl;
-			printInferParams( *i->second.inferParams, os, indent+1, level+1 );
+			printInferParams( i->second.expr->inferParams, os, indent+1, level+1 );
 		} // for
 	} // if
@@ -47,6 +47,5 @@
 Expression::Expression() : result( 0 ), env( 0 ) {}
 
-Expression::Expression( const Expression &other ) : BaseSyntaxNode( other ), result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), extension( other.extension ), inferParams( other.inferParams ) {
-}
+Expression::Expression( const Expression &other ) : BaseSyntaxNode( other ), result( maybeClone( other.result ) ), env( maybeClone( other.env ) ), extension( other.extension ), inferParams( other.inferParams ), resnSlots( other.resnSlots ) {}
 
 void Expression::spliceInferParams( Expression * other ) {
@@ -55,4 +54,5 @@
 		inferParams[p.first] = std::move( p.second );
 	}
+	resnSlots.insert( resnSlots.end(), other->resnSlots.begin(), other->resnSlots.end() );
 }
 
Index: src/SynTree/Expression.h
===================================================================
--- src/SynTree/Expression.h	(revision 6c89ecc6f88e055fd37187ef13c252282c1929be)
+++ src/SynTree/Expression.h	(revision aeb8f70056004f741c9dcb505f8cb1cecb640ff1)
@@ -21,4 +21,5 @@
 #include <memory>                 // for allocator, unique_ptr
 #include <string>                 // for string
+#include <vector>                 // for vector
 
 #include "BaseSyntaxNode.h"       // for BaseSyntaxNode
@@ -38,6 +39,6 @@
 /// but subject to decay-to-pointer and type parameter renaming
 struct ParamEntry {
-	ParamEntry(): decl( 0 ), actualType( 0 ), formalType( 0 ), expr( 0 ), inferParams( new InferredParams ) {}
-	ParamEntry( UniqueId decl, Type * actualType, Type * formalType, Expression* expr ): decl( decl ), actualType( actualType ), formalType( formalType ), expr( expr ), inferParams( new InferredParams ) {}
+	ParamEntry(): decl( 0 ), actualType( 0 ), formalType( 0 ), expr( 0 )/*, inferParams( new InferredParams )*/ {}
+	ParamEntry( UniqueId decl, Type * actualType, Type * formalType, Expression* expr ): decl( decl ), actualType( actualType ), formalType( formalType ), expr( expr )/*, inferParams( new InferredParams )*/ {}
 	ParamEntry( const ParamEntry & other );
 	ParamEntry( ParamEntry && other );
@@ -50,5 +51,5 @@
 	Type * formalType;
 	Expression * expr;
-	std::unique_ptr< InferredParams > inferParams;
+	// std::unique_ptr< InferredParams > inferParams;
 };
 
@@ -59,5 +60,8 @@
 	TypeSubstitution * env;
 	bool extension = false;
-	InferredParams inferParams;
+	InferredParams inferParams;       ///< Post-resolution inferred parameter slots
+	std::vector<UniqueId> resnSlots;  ///< Pre-resolution inferred parameter slots
+	
+	// xxx - should turn inferParams+resnSlots into a union to save some memory
 
 	Expression();
@@ -73,6 +77,4 @@
 	bool get_extension() const { return extension; }
 	Expression * set_extension( bool exten ) { extension = exten; return this; }
-
-	InferredParams & get_inferParams() { return inferParams; }
 
 	// move other's inferParams to this
