Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 5af62f116761c48d951dab0d109ca3854f147542)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 908cc8363706be83b8dd16ee55ff542200c85e4e)
@@ -64,4 +64,12 @@
 	}
 
+	Cost sumCost( const AltList &in ) {
+		Cost total;
+		for ( AltList::const_iterator i = in.begin(); i != in.end(); ++i ) {
+			total += i->cost;
+		}
+		return total;
+	}
+
 	namespace {
 		void printAlts( const AltList &list, std::ostream &os, int indent = 0 ) {
@@ -76,12 +84,4 @@
 				out.push_back( i->expr->clone() );
 			}
-		}
-
-		Cost sumCost( const AltList &in ) {
-			Cost total;
-			for ( AltList::const_iterator i = in.begin(); i != in.end(); ++i ) {
-				total += i->cost;
-			}
-			return total;
 		}
 
Index: src/ResolvExpr/AlternativeFinder.h
===================================================================
--- src/ResolvExpr/AlternativeFinder.h	(revision 5af62f116761c48d951dab0d109ca3854f147542)
+++ src/ResolvExpr/AlternativeFinder.h	(revision 908cc8363706be83b8dd16ee55ff542200c85e4e)
@@ -109,4 +109,6 @@
 		std::copy( alternatives.begin(), alternatives.end(), out );
 	}
+
+	Cost sumCost( const AltList &in );
 } // namespace ResolvExpr
 
Index: src/Tuples/TupleAssignment.cc
===================================================================
--- src/Tuples/TupleAssignment.cc	(revision 5af62f116761c48d951dab0d109ca3854f147542)
+++ src/Tuples/TupleAssignment.cc	(revision 908cc8363706be83b8dd16ee55ff542200c85e4e)
@@ -56,5 +56,5 @@
 			virtual ~Matcher() {}
 			virtual void match( std::list< Expression * > &out ) = 0;
-			virtual void solve( std::list< Expression * > &assigns ) = 0;
+			virtual void solve() = 0;
 			static UntypedExpr *createAssgn( Expression *left, Expression *right );
 		  protected:
@@ -69,5 +69,5 @@
 			}
 			virtual void match( std::list< Expression * > &out );
-			virtual void solve( std::list< Expression * > &assigns );
+			virtual void solve();
 		};
 
@@ -76,5 +76,5 @@
 			MultipleAssignMatcher( TupleAssignSpotter &spot, Expression *lhs, Expression *rhs );
 			virtual void match( std::list< Expression * > &out );
-			virtual void solve( std::list< Expression * > &assigns );
+			virtual void solve();
 		};
 
@@ -150,5 +150,4 @@
 		if ( new_assigns.empty() ) return;
 		std::list< Expression * > solved_assigns;
-		ResolvExpr::AltList solved_alts;
 		ResolvExpr::AltList current;
 		// now resolve new assignments
@@ -160,10 +159,9 @@
 			assert( alts.size() == 1 );
 			assert( alts.front().expr != 0 );
-			current.push_back( finder.get_alternatives().front() );
-			solved_assigns.push_back( alts.front().expr->clone() );
+			current.push_back( alts.front() );
 		}
 		options.options.push_back( current );
 
-		matcher->solve( new_assigns );
+		matcher->solve();
 	}
 
@@ -197,16 +195,15 @@
 	}
 
-	void TupleAssignSpotter::MassAssignMatcher::solve( std::list< Expression * > &assigns ) {
+	void TupleAssignSpotter::MassAssignMatcher::solve() {
 		assert( ! spotter.options.empty() );
-		ResolvExpr::AltList winners;
 		for ( std::list< ResolvExpr::AltList >::iterator i = spotter.options.begin(); i != spotter.options.end(); ++i ) {
-			findMinCost( i->begin(), i->end(), back_inserter(winners) );
-		}
-
-		std::list< Expression *> solved_assigns;
-		for ( ResolvExpr::AltList::iterator i = winners.begin(); i != winners.end(); ++i ) {
-			solved_assigns.push_back( i->expr );
-		}
-		spotter.currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns), spotter.currentFinder.get_environ(), ResolvExpr::Cost() ) );
+			// extract expressions from the alternatives to produce a list of assignments that
+			// together form a single alternative
+			std::list< Expression *> solved_assigns;
+			for ( ResolvExpr::Alternative & alt : *i ) {
+				solved_assigns.push_back( alt.expr );
+			}
+			spotter.currentFinder.get_alternatives().push_front( ResolvExpr::Alternative(new SolvedTupleExpr(solved_assigns), spotter.currentFinder.get_environ(), ResolvExpr::sumCost( *i ) ) );
+		}
 	}
 
@@ -218,5 +215,5 @@
 	}
 
-	void TupleAssignSpotter::MultipleAssignMatcher::solve( std::list< Expression * > &assigns ) {
+	void TupleAssignSpotter::MultipleAssignMatcher::solve() {
 		// options.print( std::cerr );
 		std::list< ResolvExpr::AltList > best = spotter.options.get_best();
