diff --git a/compiler2/Type_codegen.cc b/compiler2/Type_codegen.cc
index e75ad46575fde634fbe59e3755a45f547e1e0f1d..b86aba055f824e07a6ab3bda280e222bf43a0eaa 100644
--- a/compiler2/Type_codegen.cc
+++ b/compiler2/Type_codegen.cc
@@ -2303,8 +2303,7 @@ void Type::generate_code_done(output_struct *target)
      use_runtime_2 ? "Value_Redirect_Interface" : genname_str, dispname_str, genname_str);
   if (use_runtime_2) {
     target->source.function_bodies = mputstr(target->source.function_bodies,
-      "value_redirect->set_values(&return_value);\n"
-      "delete value_redirect;\n");
+      "value_redirect->set_values(&return_value);\n");
   }
   else {
     target->source.function_bodies = mputstr(target->source.function_bodies,
diff --git a/regression_test/commProcedure/ProcPort.ttcn b/regression_test/commProcedure/ProcPort.ttcn
index 08b16f78592c07427c5c6aeac3b6f39b981e82c3..7ed513341fb079ff5e03c10f871ff79726a4c427 100644
--- a/regression_test/commProcedure/ProcPort.ttcn
+++ b/regression_test/commProcedure/ProcPort.ttcn
@@ -60,6 +60,8 @@ signature s_StopPTC();
 signature MyProc6(inout integer I);
 signature MyProc7(inout universal charstring x) return MyRecord2 exception(MyRecord2, MyRecord3);
 
+type integer MyInt with { extension "done" }; 
+
 template s_StopPTC StopPTC := { }
 
 template MyProc5 MyProc5Template_any := {
@@ -315,6 +317,10 @@ function GetCallParameters_behav() runs on ProcComponent3 {
   }
 }
 
+function Done_behav(in MyInt p) runs on ProcComponent return MyInt {
+  return p;
+}
+
 testcase tc1_Call() runs on ProcComponent {
   /* Non-blocking calls */
   var ProcComponent2 PC2;
@@ -784,6 +790,18 @@ testcase tc_MatchingWithAnyOrOmit() runs on ProcComponent5 {
   }
 }
 
+testcase tc_doneWithValueRedirect() runs on ProcComponent {
+  var MyInt val := 2;
+  var MyInt res;
+  var ProcComponent comp := ProcComponent.create;
+  comp.start(Done_behav(val));
+  comp.done(MyInt: ?) -> value res;
+  if (res != val) {
+    setverdict(fail, "Invalid return value. Got: ", res, ", expected: ", val);
+  }
+  setverdict(pass);
+}
+
 control {
   execute(tc1_Call());
   execute(tc2_Call());
@@ -799,5 +817,6 @@ control {
   execute(tc_PortAddress_external_usage2());
   execute(tc_GetReplyParameters());
   execute(tc_MatchingWithAnyOrOmit());
+  execute(tc_doneWithValueRedirect());
 }
 }