Index: src/ResolvExpr/Alternative.cc
===================================================================
--- src/ResolvExpr/Alternative.cc	(revision 4ab95362ad50a8877c73267b3b411c0bf7ba8f3e)
+++ src/ResolvExpr/Alternative.cc	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -20,5 +20,5 @@
 
 namespace ResolvExpr {
-	Alternative::Alternative() : expr( 0 ) {}
+	Alternative::Alternative() : cost( Cost::zero ), cvtCost( Cost::zero ), expr( 0 ) {}
 
 	Alternative::Alternative( Expression *expr, const TypeEnvironment &env, const Cost& cost )
Index: src/ResolvExpr/Alternative.h
===================================================================
--- src/ResolvExpr/Alternative.h	(revision 4ab95362ad50a8877c73267b3b411c0bf7ba8f3e)
+++ src/ResolvExpr/Alternative.h	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -5,5 +5,5 @@
 // file "LICENCE" distributed with Cforall.
 //
-// Alternative.h -- 
+// Alternative.h --
 //
 // Author           : Richard C. Bilson
@@ -12,5 +12,5 @@
 // Last Modified On : Sat May 16 23:54:39 2015
 // Update Count     : 2
-// 
+//
 
 #ifndef ALTERNATIVE_H
@@ -33,9 +33,9 @@
 		Alternative &operator=( const Alternative &other );
 		~Alternative();
-  
+
 		void initialize( const Alternative &src, Alternative &dest );
-  
+
 		void print( std::ostream &os, int indent = 0 ) const;
-  
+
 		Cost cost;
 		Cost cvtCost;
@@ -43,4 +43,41 @@
 		TypeEnvironment env;
 	};
+
+	/// helper function used by explode
+	template< typename OutputIterator >
+	void explodeUnique( Expression * expr, const Alternative & alt, OutputIterator out ) {
+		Type * res = expr->get_result();
+		if ( TupleType * tupleType = dynamic_cast< TupleType * > ( res ) ) {
+			if ( TupleExpr * tupleExpr = dynamic_cast< TupleExpr * >( alt.expr ) ) {
+				for ( Expression * expr : tupleExpr->get_exprs() ) {
+					explodeUnique( expr, alt, out );
+				}
+			} else {
+				UniqueExpr * unq = new UniqueExpr( expr->clone() );
+				for ( unsigned int i = 0; i < tupleType->size(); i++ ) {
+					TupleIndexExpr * idx = new TupleIndexExpr( unq->clone(), i );
+					explodeUnique( idx, alt, out );
+					delete idx;
+				}
+				delete unq;
+			}
+		} else {
+			*out++ = Alternative( expr->clone(), alt.env, alt.cost, alt.cvtCost );
+		}
+	}
+
+	/// expands a tuple-valued alternative into multiple alternatives, each with a non-tuple-type
+	template< typename OutputIterator >
+	void explode( Alternative &alt, OutputIterator out ) {
+		explodeUnique( alt.expr, alt, out );
+	}
+
+	// explode list of alternatives
+	template< typename OutputIterator >
+	void explode( AltList & alts, OutputIterator out ) {
+		for ( Alternative & alt : alts ) {
+			explode( alt, out );
+		}
+	}
 } // namespace ResolvExpr
 
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 4ab95362ad50a8877c73267b3b411c0bf7ba8f3e)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 3c13c03a94ca1d4baa7d03b64383f9d28bb7901f)
@@ -380,4 +380,7 @@
 
 		std::list< DeclarationWithType* >::iterator formal = formals.begin();
+
+		AltList newActuals;
+		explode( actuals, back_inserter( newActuals ) );
 
 		std::list< Type * > formalTypes;
@@ -994,12 +997,5 @@
 			TupleExpr *newExpr = new TupleExpr;
 			makeExprList( *i, newExpr->get_exprs() );
-			TupleType *tupleType = new TupleType( Type::Qualifiers(true, true, true, true, true, true) );
-			Type::Qualifiers &qualifiers = tupleType->get_qualifiers();
-			for ( Expression * resultExpr : newExpr->get_exprs() ) {
-				Type * type = resultExpr->get_result()->clone();
-				tupleType->get_types().push_back( type );
-				qualifiers &= type->get_qualifiers();
-			} // for
-			newExpr->set_result( tupleType );
+			newExpr->set_result( Tuples::makeTupleType( newExpr->get_exprs() ) );
 
 			TypeEnvironment compositeEnv;
