diff --git a/compiler2/Type_codegen.cc b/compiler2/Type_codegen.cc
index 04e5c6c3a373ed77040571870c6586cde961fd0d..8d2aa7a5e4d2b11a41301dbd8e68e88222b652db 100644
--- a/compiler2/Type_codegen.cc
+++ b/compiler2/Type_codegen.cc
@@ -2591,19 +2591,32 @@ void Type::generate_code_ispresentbound(expression_struct *expr,
         closing_brackets = closing_brackets2;
       
         const string& tmp_id = module->get_temporary_id();
+        const string& tmp_id2 = module->get_temporary_id();
         const char *tmp_id_str = tmp_id.c_str();
+        const char *tmp_id2_str = tmp_id2.c_str();
+        
+        // Own const ref to the temp value
+        expr->expr = mputprintf(expr->expr,
+          "const %s%s& %s = %s;\n",
+          t->get_genname_value(module).c_str(),
+          is_template ? "_template" : "",
+          tmp_id_str, tmp_generalid_str);
+        // Get the const ref of the field from the previous const ref
+        // If we would get the const ref of the field immediately then the
+        // value in the const ref would be free-d instantly.
         expr->expr = mputprintf(expr->expr,
           "const %s%s& %s = %s.%s%s();\n",
           next_t->get_genname_value(module).c_str(),
-          is_template?"_template":"", tmp_id_str, tmp_generalid_str,
+          is_template ? "_template" : "",
+          tmp_id2_str, tmp_id_str,
           t->typetype == T_ANYTYPE ? "AT_" : "", id.get_name().c_str());
 
         expr->expr = mputprintf(expr->expr,
           "%s = %s.%s(%s);\n", global_id.c_str(),
-          tmp_id_str, isbound||(i!=(nof_refs-1)) ? "is_bound" : "is_present",
+          tmp_id2_str, isbound||(i!=(nof_refs-1)) ? "is_bound" : "is_present",
           (!(isbound||(i!=(nof_refs-1))) && is_template && omit_in_value_list) ? "TRUE" : "");
         Free(tmp_generalid_str);
-        tmp_generalid_str = mcopystr(tmp_id_str);
+        tmp_generalid_str = mcopystr(tmp_id2_str);
       }
 
       t = next_t;
diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc
index 1a81106363a1293e82b549f277fb0501ba9d1ba5..b891ef2266be69327e60b6c20026ee99fe2f8f72 100644
--- a/compiler2/ttcn3/AST_ttcn3.cc
+++ b/compiler2/ttcn3/AST_ttcn3.cc
@@ -784,19 +784,33 @@ namespace Ttcn {
     Common::Assignment *ass = get_refd_assignment();
     const string& ass_id = ass->get_genname_from_scope(my_scope);
     const char *ass_id_str = ass_id.c_str();
-
+    
+    expression_struct_t t;
+    Code::init_expr(&t);
+    // Generate the default parameters if needed
+    if (parlist) {
+      parlist->generate_code_alias(&t, ass->get_FormalParList(),
+        ass->get_RunsOnType(), false);
+    }
+    string ass_id2 = ass_id;
+    if (t.expr != NULL) {
+      ass_id2 = ass_id2 + "(" + t.expr + ")";
+      ass_id_str = ass_id2.c_str();
+    }
+    Code::free_expr(&t);
+    
     if (subrefs.get_nof_refs() > 0) {
       const string& tmp_generalid = my_scope->get_scope_mod_gen()
           ->get_temporary_id();
       const char *tmp_generalid_str = tmp_generalid.c_str();
-
+      
       expression_struct isbound_expr;
       Code::init_expr(&isbound_expr);
       isbound_expr.preamble = mputprintf(isbound_expr.preamble,
           "boolean %s = %s.is_bound();\n", tmp_generalid_str,
           ass_id_str);
       ass->get_Type()->generate_code_ispresentbound(&isbound_expr, &subrefs, my_scope->get_scope_mod_gen(),
-          tmp_generalid, ass_id, is_template, isbound);
+          tmp_generalid, ass_id2, is_template, isbound);
 
       expr->preamble = mputstr(expr->preamble, isbound_expr.preamble);
       expr->preamble = mputstr(expr->preamble, isbound_expr.expr);
diff --git a/regression_test/recordOper/TrecordOper.ttcn b/regression_test/recordOper/TrecordOper.ttcn
index 3d5c025faae8d88e992c6409b763aa7d57425228..f67b5102106a7f2d891a6aba03096fa233354937 100644
--- a/regression_test/recordOper/TrecordOper.ttcn
+++ b/regression_test/recordOper/TrecordOper.ttcn
@@ -1542,6 +1542,779 @@ testcase tc_record_partiallyInit13() runs on recordOper_mycomp {
     if(ispresent(vl_r.roi[0])){setverdict(fail)}else {setverdict(pass)};
     if(ispresent(vl_r.roi[90])){setverdict(fail)}else {setverdict(pass)};
   }
+
+
+  
+
+
+ //##########################################################################//
+
+   type record ExampleType {
+    integer a,
+    boolean b 
+  }  
+
+  template ExampleType exampleTemplate1 := {
+    a := 4,
+    b := false
+  }
+
+  testcase tc_rec_template() runs on recordOper_mycomp {
+
+    if (isbound(exampleTemplate1)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate1)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate1.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate1.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+//###########################################################################//
+
+  template ExampleType exampleTemplate2(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) := {
+    a := MyintTemplate, 
+    b := MyBoolTemplate
+  }
+
+  testcase tc_rec_template_param() runs on recordOper_mycomp {
+
+    if (isbound(exampleTemplate2)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate2)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate2.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate2.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate2(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate2(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate2(true).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate2(true).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate2(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate2(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate2(true, 3).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate2(true, 3).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+//###########################################################################//
+
+  template ExampleType exampleTemplate3(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) modifies exampleTemplate2 := {
+    a := MyintTemplate,
+    b := MyBoolTemplate
+  }
+
+    testcase tc_rec_template_param_modifies() runs on recordOper_mycomp {
+
+    if (isbound(exampleTemplate3)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate3)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate3.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate3.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate3(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate3(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate3(true).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate3(true).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate3(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate3(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleTemplate3(true, 3).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleTemplate3(true, 3).a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+//###########################################################################//
+
+  type record ExampleType2 {
+    integer a,
+    ExampleType t
+  }
+
+
+  template ExampleType2 exampleEmbTemplate1 := {
+    a := 4,
+    t := {3, true}
+  }
+
+  testcase tc_emb_rec_template() runs on recordOper_mycomp {
+
+    if (isbound(exampleEmbTemplate1)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate1)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate1.t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate1.t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate1.t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate1.t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+//###########################################################################//
+
+  template ExampleType2 exampleEmbTemplate2(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) := {
+    a := MyintTemplate, 
+    t := {MyintTemplate, MyBoolTemplate}
+  }
+
+  testcase tc_emb_rec_template_param() runs on recordOper_mycomp {
+
+    if (isbound(exampleEmbTemplate2)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2.t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2.t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2.t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2.t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2(true).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2(true).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2(true).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2(true).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2(true, 3).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2(true, 3).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate2(true, 3).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate2(true, 3).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+//###########################################################################//
+
+  template ExampleType2 exampleEmbTemplate3(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) modifies exampleEmbTemplate2 := {
+    a := MyintTemplate,
+    t := {MyintTemplate, MyBoolTemplate}
+  }
+
+  testcase tc_emb_rec_template_param_modifies() runs on recordOper_mycomp {
+
+    if (isbound(exampleEmbTemplate3)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3.t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3.t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3.t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3.t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3(true).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3(true).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3(true).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3(true).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3(true, 3).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3(true, 3).t)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleEmbTemplate3(true, 3).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleEmbTemplate3(true, 3).t.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+//###########################################################################//
+
+template anytype exampleAnyTypeTemplate1 := {
+  ExampleType := {2, false}
+}
+
+testcase tc_anytype_rec_template() runs on recordOper_mycomp {
+
+    if (isbound(exampleAnyTypeTemplate1)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate1)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate1.ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate1.ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate1.ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate1.ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+  template anytype exampleAnyTypeTemplate2(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) := {
+    ExampleType := {MyintTemplate, MyBoolTemplate}
+  }
+
+  testcase tc_anytype_rec_template_param() runs on recordOper_mycomp {
+
+    if (isbound(exampleAnyTypeTemplate2)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2.ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2.ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2.ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2.ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2(true).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2(true).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2(true).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2(true).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2(true, 3).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2(true, 3).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate2(true, 3).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate2(true, 3).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+  template anytype exampleAnyTypeTemplate3(template boolean MyBoolTemplate := false, template integer MyintTemplate := 1) modifies exampleAnyTypeTemplate2 := {
+    ExampleType := {MyintTemplate, MyBoolTemplate}
+  }
+
+  testcase tc_anytype_rec_template_param_modifies() runs on recordOper_mycomp {
+
+    if (isbound(exampleAnyTypeTemplate3)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3.ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3.ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3.ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3.ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3(true))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3(true).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3(true).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3(true).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3(true).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3(true, 3))) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3(true, 3).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3(true, 3).ExampleType)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (isbound(exampleAnyTypeTemplate3(true, 3).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+
+    if (ispresent(exampleAnyTypeTemplate3(true, 3).ExampleType.a)) {
+      setverdict(pass);
+    } else {
+      setverdict(fail);
+    }
+  }
+
+
+//###########################################################################//
     
 control {
  const recordOper_trecord cl_temp1:={ x1:=omit, x2:=3.4 }; // can constants be declared in the control part
@@ -1613,5 +2386,20 @@ control {
  execute(tc_record_omit2());
  execute(tc_record_omit_HQ51693());
  execute(tc_recordOf_omit());
+
+ execute(tc_rec_template());
+ execute(tc_rec_template_param());
+ execute(tc_rec_template_param_modifies());
+
+ execute(tc_emb_rec_template());
+ execute(tc_emb_rec_template_param());
+ execute(tc_emb_rec_template_param_modifies());
+
+ execute(tc_anytype_rec_template());
+ execute(tc_anytype_rec_template_param());
+ execute(tc_anytype_rec_template_param_modifies());
 }
 }
+with {
+  extension "anytype ExampleType"
+}
\ No newline at end of file
diff --git a/regression_test/templateInt/TtemplateInt.ttcn b/regression_test/templateInt/TtemplateInt.ttcn
index 137516271b14cfcfea812022d8d9f80ed9a2f0df..54740a371a666a8e70909a1dd558e1e905f9d4b7 100644
--- a/regression_test/templateInt/TtemplateInt.ttcn
+++ b/regression_test/templateInt/TtemplateInt.ttcn
@@ -346,6 +346,35 @@ testcase templateIntReverseOrderImported2() runs on templateInt_mycomp {
   }
 }
 
+template integer IntTemplateParam(template integer i := 3) := i;
+
+testcase templateIntParam() runs on templateInt_mycomp {
+  if (ispresent(IntTemplateParam)) {
+    setverdict(pass);
+  } else {
+    setverdict(fail);
+  }
+
+  if (ispresent(IntTemplateParam(2))) {
+    setverdict(pass);
+  } else {
+    setverdict(fail);
+  }
+
+  if (isbound(IntTemplateParam)) {
+    setverdict(pass);
+  } else {
+    setverdict(fail);
+  }
+
+  if (isbound(IntTemplateParam(2))) {
+    setverdict(pass);
+  } else {
+    setverdict(fail);
+  }
+}
+
+
 control {
  execute(templateIntSpec());
  execute(templateIntList());
@@ -363,5 +392,6 @@ control {
  execute(templateIntReverseOrder());
  execute(templateIntReverseOrderImported());
  execute(templateIntReverseOrderImported2());
+ execute(templateIntParam());
 }
 }
diff --git a/regression_test/templateOmit/Common/Templates.ttcn b/regression_test/templateOmit/Common/Templates.ttcn
index f6f57b680894f503af03939e262f12adcf1ca624..e83a1bc668897ed2d1fa7cc5b4e58e87d87aa69d 100644
--- a/regression_test/templateOmit/Common/Templates.ttcn
+++ b/regression_test/templateOmit/Common/Templates.ttcn
@@ -19,6 +19,8 @@ import from Types all;
 template integer t_int_value_list := ( 1, 3, 5, 7 );
 template integer t_int_comp_list := complement ( 2, 4, 6, 8 );
 
+template integer t_int_comp_list_p(template integer ti := 2) := complement ( ti, 4, 6, 8 );
+
 template charstring t_char_value_list := ( "a", "aa", "aaa" );
 template charstring t_char_comp_list := complement ( "b", "bb", "bbb" );
 
diff --git a/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn b/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn
index 61c1a672b10237fdfb2b359b9adc7e8104984f86..f2cc45d8593f4a0263c5f7a29ac9a8ec7524f87a 100644
--- a/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn
+++ b/regression_test/templateOmit/LegacyTests/LegacyTestcases.ttcn
@@ -96,6 +96,9 @@ testcase tc_ispresent_legacy() runs on CT
   if (ispresent(t_int_comp_list)) {
     setverdict(fail, t_int_comp_list, " should not be present");
   }
+  if (ispresent(t_int_comp_list_p)) {
+    setverdict(fail, t_int_comp_list_p, " should not be present");
+  }
   if (ispresent(t_char_comp_list)) {
     setverdict(fail, t_char_comp_list, " should not be present");
   }