Index: src/InitTweak/FixInit.cc
===================================================================
--- src/InitTweak/FixInit.cc	(revision 6242335009c5d2ebee1bb50d1d228f5aacb0e5bd)
+++ src/InitTweak/FixInit.cc	(revision b1e63ac54a1b3b3705d130858c9772e8b84c867f)
@@ -401,5 +401,5 @@
 
 		bool ResolveCopyCtors::skipCopyConstruct( Type * type ) {
-			return dynamic_cast< VarArgsType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type );
+			return dynamic_cast< VarArgsType * >( type ) || dynamic_cast< ReferenceType * >( type ) || GenPoly::getFunctionType( type ) || Tuples::isTtype( type );
 		}
 
Index: src/InitTweak/GenInit.cc
===================================================================
--- src/InitTweak/GenInit.cc	(revision 6242335009c5d2ebee1bb50d1d228f5aacb0e5bd)
+++ src/InitTweak/GenInit.cc	(revision b1e63ac54a1b3b3705d130858c9772e8b84c867f)
@@ -239,6 +239,7 @@
 			std::list< DeclarationWithType * > & params = GenPoly::getFunctionType( dwt->get_type() )->get_parameters();
 			assert( ! params.empty() );
-			PointerType * type = safe_dynamic_cast< PointerType * >( params.front()->get_type() );
-			managedTypes.insert( SymTab::Mangler::mangle( type->get_base() ) );
+			Type * type = InitTweak::getPointerBase( params.front()->get_type() );
+			assert( type );
+			managedTypes.insert( SymTab::Mangler::mangle( type ) );
 		}
 	}
Index: src/InitTweak/InitTweak.cc
===================================================================
--- src/InitTweak/InitTweak.cc	(revision 6242335009c5d2ebee1bb50d1d228f5aacb0e5bd)
+++ src/InitTweak/InitTweak.cc	(revision b1e63ac54a1b3b3705d130858c9772e8b84c867f)
@@ -458,4 +458,6 @@
 		} else if ( ArrayType * arrayType = dynamic_cast< ArrayType * >( type ) ) {
 			return arrayType->get_base();
+		} else if ( ReferenceType * refType = dynamic_cast< ReferenceType * >( type ) ) {
+			return refType->get_base();
 		} else {
 			return NULL;
@@ -543,10 +545,9 @@
 		if ( ftype->get_parameters().size() != 2 ) return 0;
 
-		Type * t1 = ftype->get_parameters().front()->get_type();
+		Type * t1 = getPointerBase( ftype->get_parameters().front()->get_type() );
 		Type * t2 = ftype->get_parameters().back()->get_type();
-		PointerType * ptrType = dynamic_cast< PointerType * > ( t1 );
-		assert( ptrType );
-
-		if ( ResolvExpr::typesCompatibleIgnoreQualifiers( ptrType->get_base(), t2, SymTab::Indexer() ) ) {
+		assert( t1 );
+
+		if ( ResolvExpr::typesCompatibleIgnoreQualifiers( t1, t2, SymTab::Indexer() ) ) {
 			return function;
 		} else {
