Index: src/Concurrency/Keywords.cc
===================================================================
--- src/Concurrency/Keywords.cc	(revision ba3706fcc236a2f6c927dc1a9da14313751a7aa4)
+++ src/Concurrency/Keywords.cc	(revision ce7ed2c471e181877b9a80ae0c960ec1bc581a8e)
@@ -257,4 +257,15 @@
 	// Generic keyword implementation
 	//=============================================================================================
+	void fixupGenerics(FunctionType * func, StructDecl * decl) {
+		cloneAll(decl->parameters, func->forall);
+		for ( TypeDecl * td : func->forall ) {
+			strict_dynamic_cast<StructInstType*>(
+				func->parameters.front()->get_type()->stripReferences()
+			)->parameters.push_back(
+				new TypeExpr( new TypeInstType( noQualifiers, td->name, td ) )
+			);
+		}
+	}
+
 	void ConcurrentSueKeyword::postvisit(StructDecl * decl) {
 		if( decl->name == type_name && decl->body ) {
@@ -301,5 +312,5 @@
 		);
 
-		get_type->get_parameters().push_back( this_decl );
+		get_type->get_parameters().push_back( this_decl->clone() );
 		get_type->get_returnVals().push_back(
 			new ObjectDecl(
@@ -318,4 +329,5 @@
 			)
 		);
+		fixupGenerics(get_type, decl);
 
 		FunctionDecl * get_decl = new FunctionDecl(
@@ -343,5 +355,8 @@
 				nullptr
 			);
-		}
+			fixupGenerics(main_type, decl);
+		}
+
+		delete this_decl;
 
 		declsToAddBefore.push_back( forward );
@@ -377,5 +392,8 @@
 					new MemberExpr(
 						field,
-						UntypedExpr::createDeref( new VariableExpr( func->get_functionType()->get_parameters().front() ) )
+						new CastExpr(
+							new VariableExpr( func->get_functionType()->get_parameters().front() ),
+							func->get_functionType()->get_parameters().front()->get_type()->stripReferences()->clone()
+						)
 					)
 				)
