Index: src/GenPoly/Box.cc
===================================================================
--- src/GenPoly/Box.cc	(revision 1cced2816c1a5a6e545b33c42c2e4ce165024ef1)
+++ src/GenPoly/Box.cc	(revision b18b0b59617aeb385ca202a34147f5e7c3b88d83)
@@ -492,7 +492,4 @@
 			assert( arg );
 			if ( isPolyType( realParam->get_type(), tyVars ) ) {
-//     if ( dynamic_cast< PointerType *>( arg->get_type() ) ) {
-//       return new CastExpr( new VariableExpr( param ), arg->get_type()->clone() );
-//     } else {
 				if ( dynamic_cast<TypeInstType *>(arg->get_type()) == NULL ) {
 					UntypedExpr *deref = new UntypedExpr( new NameExpr( "*?" ) );
@@ -501,5 +498,4 @@
 					return deref;
 				} // if
-//     }
 			} // if
 			return new VariableExpr( param );
@@ -1036,5 +1032,5 @@
 
 			// add size/align for generic types to parameter list
-			std::set< std::string > seenTypes; //< sizeofName for generic types we've seen
+			std::set< std::string > seenTypes; // sizeofName for generic types we've seen
 			for ( std::list< DeclarationWithType* >::const_iterator fnParm = last; fnParm != funcType->get_parameters().end(); ++fnParm ) {
 				Type *parmType = (*fnParm)->get_type();
Index: src/GenPoly/ScrubTyVars.cc
===================================================================
--- src/GenPoly/ScrubTyVars.cc	(revision 1cced2816c1a5a6e545b33c42c2e4ce165024ef1)
+++ src/GenPoly/ScrubTyVars.cc	(revision b18b0b59617aeb385ca202a34147f5e7c3b88d83)
@@ -44,4 +44,21 @@
 	}
 
+	Type * ScrubTyVars::mutateAggregateType( Type *ty ) {
+		if ( doAll ? isPolyType( ty ) : isPolyType( ty, tyVars ) ) {
+			PointerType *ret = new PointerType( Type::Qualifiers(), new VoidType( ty->get_qualifiers() ) );
+			delete ty;
+			return ret;
+		}
+		return ty;
+	}
+	
+	Type * ScrubTyVars::mutate( StructInstType *structInst ) {
+		return mutateAggregateType( structInst );
+	}
+
+	Type * ScrubTyVars::mutate( UnionInstType *unionInst ) {
+		return mutateAggregateType( unionInst );
+	}
+
 	Expression * ScrubTyVars::mutate( SizeofExpr *szeof ) {
 		// sizeof( T ) => _sizeof_T parameter, which is the size of T
Index: src/GenPoly/ScrubTyVars.h
===================================================================
--- src/GenPoly/ScrubTyVars.h	(revision 1cced2816c1a5a6e545b33c42c2e4ce165024ef1)
+++ src/GenPoly/ScrubTyVars.h	(revision b18b0b59617aeb385ca202a34147f5e7c3b88d83)
@@ -35,10 +35,16 @@
 		template< typename SynTreeClass >
 		static SynTreeClass *scrub( SynTreeClass *target );
-  
+
 		virtual Type* mutate( TypeInstType *typeInst );
-		Expression* mutate( SizeofExpr *szeof );
-		Expression* mutate( AlignofExpr *algnof );
+		virtual Type* mutate( StructInstType *structInst );
+		virtual Type* mutate( UnionInstType *unionInst );
+		virtual Expression* mutate( SizeofExpr *szeof );
+		virtual Expression* mutate( AlignofExpr *algnof );
 		virtual Type* mutate( PointerType *pointer );
+
 	  private:
+		/// Mutates (possibly generic) aggregate types appropriately
+		Type* mutateAggregateType( Type *ty );
+		
 		bool doAll;
 		const TyVarMap &tyVars;
