diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc
index 7b81b1b4f3dcd9bc5c4d5e4a8b73f933c22f0e94..6ff1c4401d6c9f066906b6d059e9363f39981f82 100644
--- a/compiler2/ttcn3/AST_ttcn3.cc
+++ b/compiler2/ttcn3/AST_ttcn3.cc
@@ -9446,6 +9446,8 @@ namespace Ttcn {
       case Common::Assignment::A_PAR_TEMPL_IN:
       case Common::Assignment::A_PAR_VAL_INOUT:
       case Common::Assignment::A_PAR_TEMPL_INOUT:
+      case Common::Assignment::A_PAR_VAL_OUT:
+      case Common::Assignment::A_PAR_TEMPL_OUT:
         if (is_startable && par->get_Type()->is_component_internal())
           is_startable = false;
         break;
@@ -9482,6 +9484,8 @@ namespace Ttcn {
       case Common::Assignment::A_PAR_TEMPL_IN:
       case Common::Assignment::A_PAR_VAL_INOUT:
       case Common::Assignment::A_PAR_TEMPL_INOUT:
+      case Common::Assignment::A_PAR_VAL_OUT:
+      case Common::Assignment::A_PAR_TEMPL_OUT:
         if (par->get_Type()->is_component_internal()) {
           map<Type*,void> type_chain;
           char* err_str = mprintf("a parameter or embedded in a parameter of "
diff --git a/regression_test/commMessage/TcommMessage.ttcn b/regression_test/commMessage/TcommMessage.ttcn
index be9b454f8157941885ea544c647c365a5ec7bd1a..0ab555fcb89f9df18b1a0d680a857ce6940d2826 100644
--- a/regression_test/commMessage/TcommMessage.ttcn
+++ b/regression_test/commMessage/TcommMessage.ttcn
@@ -1514,6 +1514,60 @@ testcase commMessageReceiveAnyOrOmit() runs on commMessage_comp1 {
   }
 }
 
+function commMessage_behav_all_params(
+  in integer p_in, inout boolean p_inout, out octetstring p_out,
+  in template commMessage_tenum pt_in, inout template commMessage_trecord pt_inout, out template commMessage_tsetof pt_out)
+  runs on commMessage_comp1
+{
+  if (p_in != 10) {
+    setverdict(fail, "Incorrect 'in' value parameter: ", p_in);
+  }
+  if (p_inout != true) {
+    setverdict(fail, "Incorrect 'inout' value parameter: ", p_inout);
+  }
+  if (isbound(p_out)) {
+    setverdict(fail, "Incorrect 'out' value parameter: ", p_out);
+  }
+  if (log2str(pt_in) != "(exx1 (0), exx2 (1))") {
+    setverdict(fail, "Incorrect 'in' template parameter: ", pt_in);
+  }
+  if (not isvalue(pt_inout) or valueof(pt_inout) != { x1 := 5, x2 := 2.6 }) {
+    setverdict(fail, "Incorrect 'inout' template parameter: ", pt_inout);
+  }
+  if (isbound(pt_out)) {
+    setverdict(fail, "Incorrect 'out' template parameter: ", pt_out);
+  }
+  setverdict(pass);
+  p_inout := false;
+  p_out := 'ABCD'O;
+  pt_inout := ?;
+  pt_out := *;
+}
+
+testcase commMessageBehaviorFunctionParams() runs on commMessage_comp1 {
+  var boolean v_b := true;
+  var octetstring v_os := '1234'O;
+  var template commMessage_trecord vt_rec := { x1 := 5, x2 := 2.6 };
+  var template commMessage_tsetof vt_setof := { };
+  var commMessage_comp1 v_comp := commMessage_comp1.create;
+  v_comp.start(commMessage_behav_all_params(10, v_b, v_os,
+   commMessage_tenum: (exx1, exx2), vt_rec, vt_setof));
+  v_comp.done;
+  if (v_b != true) {
+    setverdict(fail, "'inout' value parameter was changed to: ", v_b);
+  }
+  if (v_os != '1234'O) {
+    setverdict(fail, "'out' value parameter was changed to: ", v_os);
+  }
+  if (not isvalue(vt_rec) or valueof(vt_rec) != { x1 := 5, x2 := 2.6 }) {
+    setverdict(fail, "'inout' template parameter was changed to: ", vt_rec);
+  }
+  if (not isvalue(vt_setof) or valueof(vt_setof) != { }) {
+    setverdict(fail, "'out' template parameter was changed to: ", vt_setof);
+  }
+  setverdict(pass);
+}
+
 control {
  execute(commMessageIntegerEncode());
  execute(commMessageValue());
@@ -1554,5 +1608,6 @@ control {
  execute(commMessageDualFacedPorts1());
  execute(commMessageDualFacedPorts2());
  execute(commMessageReceiveAnyOrOmit());
+ execute(commMessageBehaviorFunctionParams());
 }
 }