Index: doc/generic_types/generic_types.tex
===================================================================
--- doc/generic_types/generic_types.tex	(revision 4f57930b3a0c2c3fd3a1c4e1d5f60614fe05130d)
+++ doc/generic_types/generic_types.tex	(revision 87c5f40008c3b7a62cbe3a1a3f2827bb9794ac3a)
@@ -226,5 +226,5 @@
 \end{lstlisting}
 Within the block, the nested version of @<@ performs @>@ and this local version overrides the built-in @<@ so it is passed to @qsort@.
-Hence, programmers can easily form local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types.
+Hence, programmers can easily form a local environments, adding and modifying appropriate functions, to maximize reuse of other existing functions and types.
 
 Finally, \CFA allows variable overloading:
Index: src/ResolvExpr/AlternativeFinder.cc
===================================================================
--- src/ResolvExpr/AlternativeFinder.cc	(revision 4f57930b3a0c2c3fd3a1c4e1d5f60614fe05130d)
+++ src/ResolvExpr/AlternativeFinder.cc	(revision 87c5f40008c3b7a62cbe3a1a3f2827bb9794ac3a)
@@ -211,17 +211,5 @@
 	}
 
-	void AlternativeFinder::addAnonConversions( const Alternative & alt ) {
-		// adds anonymous member interpretations whenever an aggregate value type is seen.
-		Expression * expr = alt.expr->clone();
-		std::unique_ptr< Expression > manager( expr ); // RAII for expr
-		alt.env.apply( expr->get_result() );
-		if ( StructInstType *structInst = dynamic_cast< StructInstType* >( expr->get_result() ) ) {
-			NameExpr nameExpr( "" );
-			addAggMembers( structInst, expr, alt.cost+Cost( 0, 0, 1 ), alt.env, &nameExpr );
-		} else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( expr->get_result() ) ) {
-			NameExpr nameExpr( "" );
-			addAggMembers( unionInst, expr, alt.cost+Cost( 0, 0, 1 ), alt.env, &nameExpr );
-		} // if
-	}
+	// std::unordered_map< Expression *, UniqueExpr * > ;
 
 	template< typename StructOrUnionType >
@@ -232,10 +220,8 @@
 		std::list< Declaration* > members;
 		aggInst->lookup( name, members );
-
 		for ( std::list< Declaration* >::const_iterator i = members.begin(); i != members.end(); ++i ) {
 			if ( DeclarationWithType *dwt = dynamic_cast< DeclarationWithType* >( *i ) ) {
 				alternatives.push_back( Alternative( new MemberExpr( dwt, expr->clone() ), env, newCost ) );
 				renameTypes( alternatives.back().expr );
-				addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a member expression.
 			} else {
 				assert( false );
@@ -744,5 +730,4 @@
 		if ( candidates.empty() && ! errors.isEmpty() ) { throw errors; }
 
-		// compute conversionsion costs
 		for ( AltList::iterator withFunc = candidates.begin(); withFunc != candidates.end(); ++withFunc ) {
 			Cost cvtCost = computeConversionCost( *withFunc, indexer );
@@ -766,9 +751,4 @@
 			} // if
 		} // for
-		// function may return struct or union value, in which case we need to add alternatives for implicit conversions to each of the anonymous members
-		for ( const Alternative & alt : alternatives ) {
-			addAnonConversions( alt );
-		}
-
 		candidates.clear();
 		candidates.splice( candidates.end(), alternatives );
@@ -905,5 +885,11 @@
 			)
 			renameTypes( alternatives.back().expr );
-			addAnonConversions( alternatives.back() ); // add anonymous member interpretations whenever an aggregate value type is seen as a name expression.
+			if ( StructInstType *structInst = dynamic_cast< StructInstType* >( (*i)->get_type() ) ) {
+				NameExpr nameExpr( "" );
+				addAggMembers( structInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
+			} else if ( UnionInstType *unionInst = dynamic_cast< UnionInstType* >( (*i)->get_type() ) ) {
+				NameExpr nameExpr( "" );
+				addAggMembers( unionInst, &newExpr, Cost( 0, 0, 1 ), env, &nameExpr );
+			} // if
 		} // for
 	}
Index: src/ResolvExpr/AlternativeFinder.h
===================================================================
--- src/ResolvExpr/AlternativeFinder.h	(revision 4f57930b3a0c2c3fd3a1c4e1d5f60614fe05130d)
+++ src/ResolvExpr/AlternativeFinder.h	(revision 87c5f40008c3b7a62cbe3a1a3f2827bb9794ac3a)
@@ -78,6 +78,4 @@
 		void findSubExprs( InputIterator begin, InputIterator end, OutputIterator out );
 
-		/// Adds alternatives for anonymous members
-		void addAnonConversions( const Alternative & alt );
 		/// Adds alternatives for member expressions, given the aggregate, conversion cost for that aggregate, and name of the member
 		template< typename StructOrUnionType > void addAggMembers( StructOrUnionType *aggInst, Expression *expr, const Cost &newCost, const TypeEnvironment & env, Expression * member );
Index: src/SymTab/Autogen.cc
===================================================================
--- src/SymTab/Autogen.cc	(revision 4f57930b3a0c2c3fd3a1c4e1d5f60614fe05130d)
+++ src/SymTab/Autogen.cc	(revision 87c5f40008c3b7a62cbe3a1a3f2827bb9794ac3a)
@@ -498,5 +498,6 @@
 		makeUnionFieldsAssignment( srcParam, dstParam, back_inserter( funcDecl->get_statements()->get_kids() ) );
 		if ( returnVal ) {
-			funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
+			if ( isDynamicLayout ) makeUnionFieldsAssignment( srcParam, returnVal, back_inserter( funcDecl->get_statements()->get_kids() ) );
+			else funcDecl->get_statements()->get_kids().push_back( new ReturnStmt( noLabels, new VariableExpr( srcParam ) ) );
 		}
 	}
Index: src/SynTree/Expression.cc
===================================================================
--- src/SynTree/Expression.cc	(revision 4f57930b3a0c2c3fd3a1c4e1d5f60614fe05130d)
+++ src/SynTree/Expression.cc	(revision 87c5f40008c3b7a62cbe3a1a3f2827bb9794ac3a)
@@ -339,5 +339,5 @@
 			return TypeSubstitution( aggInst->get_baseParameters()->begin(), aggInst->get_baseParameters()->end(), aggInst->get_parameters().begin() );
 		} else {
-			assertf( false, "makeSub expects struct or union type for aggregate, but got: %s", toString( t ).c_str() );
+			assertf( false, "makeSub expects struct or union type for aggregate" );
 		}
 	}
