diff --git a/JNI/jninativelib.cc b/JNI/jninativelib.cc
index 6d552e413f83d1dc0ced78a3cdc20cb345794748..b68d272aaf3dab9b4b5e05a2c29b3f9d28e0e6a9 100644
--- a/JNI/jninativelib.cc
+++ b/JNI/jninativelib.cc
@@ -280,7 +280,7 @@ JNIEXPORT void JNICALL Java_org_eclipse_titan_executor_jni_JNIMiddleWare_execute
  * 
  * NOTE: Function comment is here, because function declaration is in org_eclipse_titan_executor_jni_JNIMiddleWare.h, which is generated.
  */
-JNIEXPORT jint JNICALL Java_org_eclipse_titan_executor_jni_JNIMiddleWare_get_1execute_1cfg_1len(JNIEnv *env, jobject)
+JNIEXPORT jint JNICALL Java_org_eclipse_titan_executor_jni_JNIMiddleWare_get_1execute_1cfg_1len(JNIEnv *, jobject)
 {
   return (jint)Jnimw::mycfg.execute_list_len;
 }
@@ -295,7 +295,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_titan_executor_jni_JNIMiddleWare_get_1ex
  * 
  * NOTE: Function comment is here, because function declaration is in org_eclipse_titan_executor_jni_JNIMiddleWare.h, which is generated.
  */
-JNIEXPORT void JNICALL Java_org_eclipse_titan_executor_jni_JNIMiddleWare_execute_1cfg(JNIEnv *env, jobject, jint index)
+JNIEXPORT void JNICALL Java_org_eclipse_titan_executor_jni_JNIMiddleWare_execute_1cfg(JNIEnv *, jobject, jint index)
 {
   if (!Jnimw::userInterface)
     return;
diff --git a/compiler2/CodeGenHelper.cc b/compiler2/CodeGenHelper.cc
index a71fa94f9370aed5fbdc420ef1c31eacb0ff9f94..6ba921798fec5063aeba310b0b6049458d2e9c57 100644
--- a/compiler2/CodeGenHelper.cc
+++ b/compiler2/CodeGenHelper.cc
@@ -488,7 +488,7 @@ void CodeGenHelper::write_output() {
       // If we need to split
       if (num_of_chars >= chunk_size) {
         size_t base_pos = 0;
-        for (unsigned int i = 0; i < slice_num; i++) {
+        for (i = 0; i < slice_num; i++) {
           if (i == 0) { // The first slice has the module's name
             fname = output->module_dispname;
           } else {
diff --git a/compiler2/PredefFunc.cc b/compiler2/PredefFunc.cc
index d756b57a542f5a129253ddd15990096556ea855e..de4ca2c7019bccafbcb52937a13db9bd20e37078 100644
--- a/compiler2/PredefFunc.cc
+++ b/compiler2/PredefFunc.cc
@@ -971,7 +971,7 @@ static void fill_continuing_octets(int n_continuing, unsigned char *continuing_p
   }
 }
 
-ustring decode_utf8(const string & ostr, CharCoding::CharCodingType expected_coding)
+ustring decode_utf8(const string & ostr, CharCoding::CharCodingType /*expected_coding*/)
 {
   size_t length = ostr.size();
   if (0 == length) return ustring();
diff --git a/compiler2/ProjectGenHelper.cc b/compiler2/ProjectGenHelper.cc
index f149ac324e402947cb7dc061b0f3d05dd8583acb..00f86067c07b10bfb8e80e1fd448145e1f20a84f 100644
--- a/compiler2/ProjectGenHelper.cc
+++ b/compiler2/ProjectGenHelper.cc
@@ -244,14 +244,14 @@ std::string ProjectDescriptor::setRelativePathTo(const std::string& absPathTo)
   }
 
   size_t slashCount = 0;
-  for (size_t i = lastSlash; i < projectAbsWorkingDir.size(); ++i) {
+  for (i = lastSlash; i < projectAbsWorkingDir.size(); ++i) {
     if (projectAbsWorkingDir.at(i) == SEPARATOR)
       ++slashCount;
   }
 
   std::string relPath;
   const std::string upDir("../");
-  for (size_t i = 0; i < slashCount; ++i)
+  for (i = 0; i < slashCount; ++i)
     relPath.append(upDir);
 
   std::string pathTo = absPathTo.substr(lastSlash+1); // we left the heading slash
diff --git a/compiler2/Type_codegen.cc b/compiler2/Type_codegen.cc
index 9dad289341272f9e1bb9168f9cb9db129c1e386d..f429aea0d8873eb19cfa80d3f044c41b81221379 100644
--- a/compiler2/Type_codegen.cc
+++ b/compiler2/Type_codegen.cc
@@ -1204,6 +1204,7 @@ void Type::generate_code_Choice(output_struct *target)
       
       if (cftype->xerattrib != NULL) {
         sdef.elements[i].xsd_type = cftype->xerattrib->xsd_type;
+        sdef.elements[i].xerUseUnion = cftype->xerattrib->useUnion_;
       }
     }
     if (sdef.jsonAsValue) {
diff --git a/compiler2/Value.cc b/compiler2/Value.cc
index b5e219a90fd67734210bdb8059293045b3fec5e4..c3893594d9ae4b96df3b64f2ce0c277c0c7a27d7 100644
--- a/compiler2/Value.cc
+++ b/compiler2/Value.cc
@@ -8959,6 +8959,7 @@ error:
       default:
         FATAL_ERROR("Value::is_unfoldable()");
       } // switch
+      FATAL_ERROR("Value::is_unfoldable()");
       break; // should never get here
     case V_MACRO:
       switch (u.macro) {
@@ -11892,7 +11893,7 @@ error:
         Ttcn::ActualParList *parlist = u.expr.r1->get_parlist();
         Common::Assignment *ass = u.expr.r1->get_refd_assignment();
         if (parlist) str = parlist->rearrange_init_code(str, usage_mod);
-
+        (void)ass; // eliminate assigned but not used warning
         parlist = u.expr.r2->get_parlist();
         ass = u.expr.r2->get_refd_assignment();
         if (parlist) str = parlist->rearrange_init_code(str, usage_mod);
diff --git a/compiler2/asn1/AST_asn1.cc b/compiler2/asn1/AST_asn1.cc
index ee5920fbc2af2d650219e48c3325de4640a0007b..d47f79c7ac9e8ae1f04fa8cca00b94591f62de6b 100644
--- a/compiler2/asn1/AST_asn1.cc
+++ b/compiler2/asn1/AST_asn1.cc
@@ -557,7 +557,7 @@ namespace Asn {
     json.put_next_token(JSON_TOKEN_OBJECT_END);
   }
   
-  void Module::generate_debugger_init(output_struct *output)
+  void Module::generate_debugger_init(output_struct */*output*/)
   {
     // no debugging in ASN.1 modules
   }
diff --git a/compiler2/datatypes.h b/compiler2/datatypes.h
index 91d719d98f05b710066592840aa2aea1b67744c2..a9cd8474ae6078021534d8faef93ddc6db6a192f 100644
--- a/compiler2/datatypes.h
+++ b/compiler2/datatypes.h
@@ -90,6 +90,7 @@ typedef struct {
   /** true if the field is a record-of or set-of with optimized memory allocation */
   boolean optimizedMemAlloc;
   XSD_types xsd_type;
+  boolean xerUseUnion;
 } struct_field;
 
 /** Structure (record, set, union, anytype) descriptor for code generation */
diff --git a/compiler2/encdec.c b/compiler2/encdec.c
index a666643cb4ab4cf7805a88894b580c951d6b9c29..a022fd649ffc3eede5f98417894e910d9598b14f 100644
--- a/compiler2/encdec.c
+++ b/compiler2/encdec.c
@@ -64,19 +64,19 @@ void def_encdec(const char *p_classname,
 #ifndef NDEBUG
       "// written by %s in " __FILE__ " at %d\n"
 #endif
-      "int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, "
-      "embed_values_enc_struct_t*) const;\n"
+      "int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int,"
+      "unsigned int, int, embed_values_enc_struct_t*) const;\n"
       "int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int, "
       "unsigned int, embed_values_dec_struct_t*);\n"
       "static boolean can_start(const char *name, const char *uri, "
-      "XERdescriptor_t const& xd, unsigned int);\n"
+      "XERdescriptor_t const& xd, unsigned int, unsigned int);\n"
       "%s"
 #ifndef NDEBUG
       , __FUNCTION__, __LINE__
 #endif
       , use_runtime_2 ?
         "boolean can_start_v(const char *name, const char *uri, "
-        "XERdescriptor_t const& xd, unsigned int);\n" : ""
+        "XERdescriptor_t const& xd, unsigned int, unsigned int);\n" : ""
     );
   if(json) {
     def = mputprintf(def,
@@ -130,7 +130,7 @@ void def_encdec(const char *p_classname,
       /* Do not use %s_xer_ here. It supplies the XER descriptor of oldtype
        * even if encoding newtype for:
        * <ttcn>type newtype oldtype;</ttcn> */
-     "    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0);\n"
+     "    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0, 0);\n"
      "    p_buf.put_c('\\n');\n" /* make sure it has a newline */
      "    break;}\n"
      "  case TTCN_EncDec::CT_JSON: {\n"
diff --git a/compiler2/enum.c b/compiler2/enum.c
index ae3ed0fe8eae6e1334164d07cfa9421ff8593134..9d46846cbb5ee28ac6f78302ff90ba91d8c408c0 100644
--- a/compiler2/enum.c
+++ b/compiler2/enum.c
@@ -655,7 +655,7 @@ void defEnumClass(const enum_def *edef, output_struct *output)
      */
     src = mputprintf(src,
       "boolean %s::can_start(const char *name, const char *uri, "
-      "const XERdescriptor_t& xd, unsigned int flavor) {\n"
+      "const XERdescriptor_t& xd, unsigned int flavor, unsigned int) {\n"
       "  boolean exer = is_exer(flavor);\n"
       "  return check_name(name, xd, exer) && (!exer || check_namespace(uri, xd));\n"
       "}\n\n"
@@ -664,7 +664,7 @@ void defEnumClass(const enum_def *edef, output_struct *output)
 
     src = mputprintf(src,
       "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,"
-      " unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const\n"
+      " unsigned int p_flavor, unsigned int, int p_indent, embed_values_enc_struct_t*) const\n"
       "{\n"
       "  int encoded_length=(int)p_buf.get_len();\n"
       "  const boolean e_xer = is_exer(p_flavor);\n"
@@ -814,7 +814,7 @@ void defEnumClass(const enum_def *edef, output_struct *output)
       "  boolean use_default = p_td.json->default_value && 0 == p_tok.get_buffer_length();\n"
       "  if (use_default) {\n"
       // No JSON data in the buffer -> use default value
-      "    value = (char*)p_td.json->default_value;\n"
+      "    value = const_cast<char*>(p_td.json->default_value);\n"
       "    value_len = strlen(value);\n"
       "  } else {\n"
       "    dec_len = p_tok.get_next_token(&token, &value, &value_len);\n"
diff --git a/compiler2/makefile.c b/compiler2/makefile.c
index 3b2c510d244db33676c7122c765cae39c7be5258..96ce8708eabc941863753f0a89218c50f8597e4a 100644
--- a/compiler2/makefile.c
+++ b/compiler2/makefile.c
@@ -2932,9 +2932,9 @@ static void print_makefile(struct makefile_struct *makefile)
                 print_generated_file_name(fp, module, FALSE, "_setof.so");
                 print_generated_file_name(fp, module, FALSE, "_union.so");
               } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-                for (int i = 1; i < n_slices; i++) {
+                for (int slice = 1; slice < n_slices; slice++) {
                 char buffer[16]; // 6 digits + 4 chars + _part
-                sprintf(buffer, "_part_%i.so", i);
+                sprintf(buffer, "_part_%i.so", slice);
                   print_generated_file_name(fp, module, FALSE, buffer);
                 }
               }
@@ -2955,9 +2955,9 @@ static void print_makefile(struct makefile_struct *makefile)
                   print_generated_file_name(fp, module, FALSE, "_setof.so");
                   print_generated_file_name(fp, module, FALSE, "_union.so");
                 } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-                  for (int i = 1; i < n_slices; i++) {
+                  for (int slice = 1; slice < n_slices; slice++) {
                 char buffer[16]; // 6 digits + 4 chars + _part
-                sprintf(buffer, "_part_%i.so", i);
+                sprintf(buffer, "_part_%i.so", slice);
                     print_generated_file_name(fp, module, FALSE, buffer);
                   }
                 }
@@ -2978,9 +2978,9 @@ static void print_makefile(struct makefile_struct *makefile)
                 print_generated_file_name(fp, module, FALSE, "_setof.so");
                 print_generated_file_name(fp, module, FALSE, "_union.so");
               } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-                for (int i = 1; i < n_slices; i++) {
+                for (int slice = 1; slice < n_slices; slice++) {
                 char buffer[16]; // 6 digits + 4 chars + _part
-                sprintf(buffer, "_part_%i.so", i);
+                sprintf(buffer, "_part_%i.so", slice);
                   print_generated_file_name(fp, module, FALSE, buffer);
                 }
               }
@@ -3000,9 +3000,9 @@ static void print_makefile(struct makefile_struct *makefile)
                 print_generated_file_name(fp, module, FALSE, "_setof.so");
                 print_generated_file_name(fp, module, FALSE, "_union.so");
               } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-                for (int i = 1; i < n_slices; i++) {
+                for (int slice = 1; slice < n_slices; slice++) {
                 char buffer[16]; // 6 digits + 4 chars + _part
-                sprintf(buffer, "_part_%i.so", i);
+                sprintf(buffer, "_part_%i.so", slice);
                   print_generated_file_name(fp, module, FALSE, buffer);
                 }
               }
@@ -3042,9 +3042,9 @@ static void print_makefile(struct makefile_struct *makefile)
               print_generated_file_name(fp, module, FALSE, "_setof.o");
               print_generated_file_name(fp, module, FALSE, "_union.o");
             } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-              for (int i = 1; i < n_slices; i++) {
+              for (int slice = 1; slice < n_slices; slice++) {
                 char buffer[16]; // 6 digits + 4 chars + _part
-                sprintf(buffer, "_part_%i.o", i);
+                sprintf(buffer, "_part_%i.o", slice);
                 print_generated_file_name(fp, module, FALSE, buffer);
               }
             }
@@ -3065,9 +3065,9 @@ static void print_makefile(struct makefile_struct *makefile)
                 print_generated_file_name(fp, module, FALSE, "_setof.o");
                 print_generated_file_name(fp, module, FALSE, "_union.o");
               } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-                for (int i = 1; i < n_slices; i++) {
+                for (int slice = 1; slice < n_slices; slice++) {
                   char buffer[16]; // 6 digits + 4 chars + _part
-                sprintf(buffer, "_part_%i.o", i);
+                sprintf(buffer, "_part_%i.o", slice);
                   print_generated_file_name(fp, module, FALSE, buffer);
                 }
               }
@@ -3088,9 +3088,9 @@ static void print_makefile(struct makefile_struct *makefile)
               print_generated_file_name(fp, module, FALSE, "_setof.o");
               print_generated_file_name(fp, module, FALSE, "_union.o");
             } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-              for (int i = 1; i < n_slices; i++) {
+              for (int slice = 1; slice < n_slices; slice++) {
                 char buffer[16]; // 6 digits + 4 chars + _part
-                sprintf(buffer, "_part_%i.o", i);
+                sprintf(buffer, "_part_%i.o", slice);
                 print_generated_file_name(fp, module, FALSE, buffer);
               }
             }
@@ -3111,9 +3111,9 @@ static void print_makefile(struct makefile_struct *makefile)
                 print_generated_file_name(fp, module, FALSE, "_setof.o");
                 print_generated_file_name(fp, module, FALSE, "_union.o");
               } else if((n_slices = atoi(makefile->code_splitting_mode + 2))) {
-                for (int i = 1; i < n_slices; i++) {
+                for (int slice = 1; slice < n_slices; slice++) {
                   char buffer[16]; // 6 digits + 4 chars + _part
-                  sprintf(buffer, "_part_%i.o", i);
+                  sprintf(buffer, "_part_%i.o", slice);
                   print_generated_file_name(fp, module, FALSE, buffer);
                 }
               }
diff --git a/compiler2/record.c b/compiler2/record.c
index 689582b4d3242be6e683d67712e066933de5ffc9..d60f2b9130eacafa60dd182054d5197aa7121e31 100644
--- a/compiler2/record.c
+++ b/compiler2/record.c
@@ -1843,10 +1843,10 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
 
   /* Write some helper functions */
   def = mputstr(def,
-    "char **collect_ns(const XERdescriptor_t& p_td, size_t& num_ns, bool& def_ns) const;\n");
+    "char **collect_ns(const XERdescriptor_t& p_td, size_t& num_ns, bool& def_ns, unsigned int flavor = 0) const;\n");
 
   src = mputprintf(src,
-    "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num_ns, bool& def_ns) const {\n"
+    "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num_ns, bool& def_ns, unsigned int) const {\n"
     "  size_t num_collected;\n"
     "  char **collected_ns = Base_Type::collect_ns(p_td, num_collected, def_ns);\n"
     /* The above might throw but then nothing was allocated. */
@@ -1894,14 +1894,14 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
   );
 
   src = mputprintf(src,
-    "boolean %s::can_start(const char *name, const char *uri, const XERdescriptor_t& xd, unsigned int flavor) {\n"
+    "boolean %s::can_start(const char *name, const char *uri, const XERdescriptor_t& xd, unsigned int flavor, unsigned int flavor2) {\n"
     "  boolean e_xer = is_exer(flavor &= ~XER_RECOF);\n"
     "  if (!e_xer || !((xd.xer_bits & UNTAGGED) || (flavor & (USE_NIL|XER_RECOF)))) return check_name(name, xd, e_xer) && (!e_xer || check_namespace(uri, xd));\n"
     , name
   );
   for (i = start_at; i < sdef->nElements; ++i) {
     src = mputprintf(src,
-      "  else if (%s::can_start(name, uri, %s_xer_, flavor)) return TRUE;\n"
+      "  else if (%s::can_start(name, uri, %s_xer_, flavor, flavor2)) return TRUE;\n"
       /* Here we know for sure it's exer */
       , sdef->elements[i].type
       , sdef->elements[i].typegen
@@ -1915,7 +1915,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
   /* * * * * * * * * * XER_encode * * * * * * * * * * * * * * */
   src = mputprintf(src,
     "int %s::XER_encode(const XERdescriptor_t& p_td, "
-    "TTCN_Buffer& p_buf, unsigned int p_flavor, int p_indent, embed_values_enc_struct_t* emb_val_parent) const\n"
+    "TTCN_Buffer& p_buf, unsigned int p_flavor, unsigned int p_flavor2, int p_indent, embed_values_enc_struct_t* emb_val_parent) const\n"
     "{\n"
     "  if (!is_bound()) TTCN_EncDec_ErrorContext::error"
     "(TTCN_EncDec::ET_UNBOUND, \"Encoding an unbound value.\");\n"
@@ -2007,7 +2007,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
       "  if (e_xer && (p_td.xer_bits & USE_QNAME)) {\n"
       "    if (field_%s.is_value()) {\n"
       "      p_buf.put_s(11, (cbyte*)\" xmlns:b0='\");\n"
-      "      field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_indent+1, 0);\n"
+      "      field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_flavor2, p_indent+1, 0);\n"
       "      p_buf.put_c('\\'');\n"
       "    }\n"
       "    if (p_td.xer_bits & XER_ATTRIBUTE) begin_attribute(p_td, p_buf);\n"
@@ -2016,7 +2016,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
       "      p_buf.put_s(3, (cbyte*)\"b0:\");\n"
       "      sub_len += 3;\n"
       "    }\n"
-      "    sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_indent+1, 0);\n"
+      "    sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor | XER_LIST, p_flavor2, p_indent+1, 0);\n"
       "    if (p_td.xer_bits & XER_ATTRIBUTE) p_buf.put_c('\\'');\n"
       "  } else" /* no newline */
       , sdef->elements[0].name
@@ -2032,7 +2032,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
     src = mputprintf(src,
       "  if (!e_xer && (p_td.xer_bits & EMBED_VALUES)) {\n"
       "    ec_1.set_msg(\"%s': \");\n"
-      "    sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n"
+      "    sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_flavor2, p_indent+1, 0);\n"
       "  }\n"
       , sdef->elements[0].dispname
       , sdef->elements[0].name, sdef->elements[0].typegen
@@ -2042,7 +2042,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
   if (sdef->xerUseOrderPossible) {
     src = mputprintf(src,
       "  if (!e_xer && (p_td.xer_bits & USE_ORDER)) {\n"
-      "    sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n"
+      "    sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_flavor2, p_indent+1, 0);\n"
       "  }\n"
       , sdef->elements[uo].name, sdef->elements[uo].typegen
     );
@@ -2078,7 +2078,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
     if (i==0 && sdef->xerEmbedValuesPossible && (sdef->elements[i].xerAnyKind & ANY_ATTRIB_BIT)) continue ;
     src = mputprintf(src, 
       "  ec_1.set_msg(\"%s': \");\n"
-      "  tmp_len = field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n"
+      "  tmp_len = field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_flavor2, p_indent+1, 0);\n"
       "  %ssub_len += tmp_len;\n" /* do not add if attribute and EXER */
       , sdef->elements[i].dispname
       , sdef->elements[i].name, sdef->elements[i].typegen
@@ -2114,7 +2114,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
       "  if (e_xer && (p_td.xer_bits & EMBED_VALUES)) {\n"
     /* write the first string (must come AFTER the attributes) */
       "    if (%s%s%s field_%s%s.size_of() > 0) {\n"
-      "      sub_len += field_%s%s[0].XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+      "      sub_len += field_%s%s[0].XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
       "    }\n"
       "  }\n"
       , sdef->elements[0].dispname
@@ -2127,7 +2127,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
     if (want_namespaces) { /* here's another chance */
       src = mputprintf(src,
         "  else if ( !(p_td.xer_bits & EMBED_VALUES)) {\n"
-        "    %sfield_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+1, 0);\n"
+        "    %sfield_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_flavor2, p_indent+1, 0);\n"
         "  }\n"
         , ((sdef->elements[0].xerAnyKind & ANY_ATTRIB_BIT) ? "" : "sub_len += " )
         , sdef->elements[0].name, sdef->elements[0].typegen
@@ -2183,7 +2183,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
       src = mputprintf(src,
         "  if (!nil_attribute) {\n"
         "%s"
-        "  if (!e_xer) sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+!omit_tag, 0);\n"
+        "  if (!e_xer) sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor, p_flavor2, p_indent+!omit_tag, 0);\n"
         "  else" /* no newline */
         , (sdef->xerUseNilPossible ? "  if (!(p_td.xer_bits & USE_ORDER)) p_flavor |= (p_td.xer_bits & USE_NIL);\n" : "")
         /* If USE-ORDER is on, the tag-removing effect of USE-NIL has been
@@ -2238,7 +2238,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
       src = mputprintf(src,
         "    case %lu:\n"
         "      ec_1.set_msg(\"%s': \");\n"
-        "      sub_len += field_%s%s%s%s.XER_encode(%s_xer_, p_buf, p_flavor, p_indent+!omit_tag, %s);\n"
+        "      sub_len += field_%s%s%s%s.XER_encode(%s_xer_, p_buf, p_flavor, p_flavor2, p_indent+!omit_tag, %s);\n"
 
         , (unsigned long)offset++
         , sdef->elements[i].dispname
@@ -2263,7 +2263,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
         "    if (e_xer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val &&\n"
         "        %s%s%s emb_val->embval_index < field_%s%s.size_of()) { // embed-val\n"
         "      field_%s%s[emb_val->embval_index].XER_encode(\n"
-        "        UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+        "        UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
         "      ++emb_val->embval_index;\n"
         "    }\n"
         , sdef->elements[0].isOptional ? "field_" : ""
@@ -2295,13 +2295,13 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
           "  if (0 != emb_val_parent->embval_array_reg) {\n"
           "    if (emb_val_parent->embval_index < emb_val_parent->embval_array_reg->size_of()) {\n"
           "      (*emb_val_parent->embval_array_reg)[emb_val_parent->embval_index].XER_encode(UNIVERSAL_CHARSTRING_xer_"
-          "      , p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+          "      , p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
           "      ++emb_val_parent->embval_index;\n"
           "    }\n"
           "  } else {\n"
            "   if (emb_val_parent->embval_index < emb_val_parent->embval_array_opt->size_of()) {\n"
           "      (*emb_val_parent->embval_array_opt)[emb_val_parent->embval_index].XER_encode(UNIVERSAL_CHARSTRING_xer_"
-          "      , p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+          "      , p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
           "      ++emb_val_parent->embval_index;\n"
           "    }\n"
           "  }\n"
@@ -2312,7 +2312,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
         );
       }
       src = mputprintf(src,
-        "  sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor%s, p_indent+!omit_tag, %s);\n"
+        "  sub_len += field_%s.XER_encode(%s_xer_, p_buf, p_flavor%s, p_flavor2, p_indent+!omit_tag, %s);\n"
         , sdef->elements[i].name, sdef->elements[i].typegen
         , sdef->xerUseNilPossible ? "| (p_td.xer_bits & USE_NIL)" : ""
         , sdef->xerEmbedValuesPossible ? "emb_val" : "0"
@@ -2323,7 +2323,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
           "  if (e_xer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val &&\n"
           "      %s%s%s %s%s%s emb_val->embval_index < field_%s%s.size_of()) {\n"
           "    field_%s%s[emb_val->embval_index].XER_encode(\n"
-          "      UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+          "      UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
           "    ++emb_val->embval_index;\n"
           "  }\n"
           , sdef->elements[0].isOptional ? "field_" : ""
@@ -2602,7 +2602,7 @@ void gen_xer(const struct_def *sdef, char **pdef, char **psrc)
 
     if (sdef->control_ns_prefix && !(num_attributes==1 && aa_index!=-1)) {
       src = mputprintf(src,
-        "    if (parent_tag && !strcmp(attr_name, \"type\") "
+        "    if (/*parent_tag &&*/ !strcmp(attr_name, \"type\") "
         "&& !strcmp((const char*)p_reader.Prefix(), \"%s\")) {} else\n"
         , sdef->control_ns_prefix);
       /* xsi:type; already processed by parent with USE-UNION or USE-TYPE */
@@ -6016,7 +6016,7 @@ static void defEmptyRecordClass(const struct_def *sdef,
     if (xer_needed) { /* XERSTUFF codegen for empty record/SEQUENCE */
       src=mputprintf(src,
         "boolean %s::can_start(const char *p_name, const char *p_uri, "
-        "const XERdescriptor_t& p_td, unsigned int p_flavor) {\n"
+        "const XERdescriptor_t& p_td, unsigned int p_flavor, unsigned int /*p_flavor2*/) {\n"
         "  boolean e_xer = is_exer(p_flavor);\n"
         "  if (e_xer && (p_td.xer_bits & UNTAGGED)) return FALSE;\n"
         "  else return check_name(p_name, p_td, e_xer) && (!e_xer || check_namespace(p_uri, p_td));\n"
@@ -6026,7 +6026,7 @@ static void defEmptyRecordClass(const struct_def *sdef,
         );
       src = mputprintf(src,
         "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, "
-        "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const{\n"
+        "unsigned int p_flavor, unsigned int, int p_indent, embed_values_enc_struct_t*) const{\n"
         "  int encoded_length=(int)p_buf.get_len();\n"
         "  int is_indented = !is_canonical(p_flavor);\n"
         "  boolean e_xer = is_exer(p_flavor);\n"
@@ -6952,9 +6952,9 @@ check_generate_end:
         "static const XERdescriptor_t* xer_descriptors[];\n"
         "const XERdescriptor_t* xer_descr(int p_index) const;\n"
         "virtual boolean can_start_v(const char *name, const char *prefix, "
-        "XERdescriptor_t const& xd, unsigned int flavor);\n"
+        "XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2);\n"
         "static  boolean can_start  (const char *name, const char *prefix, "
-        "XERdescriptor_t const& xd, unsigned int flavor);\n");
+        "XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2);\n");
       src = mputprintf(src, "const XERdescriptor_t* %s::xer_descriptors[] = ", name);
       for (i = 0; i < sdef->nElements; i++) {
         src = mputprintf(src, "%c &%s_xer_",
@@ -6968,16 +6968,16 @@ check_generate_end:
          * We must make a virtual call in Record_Type::XER_decode because
          * we don't know the actual type (derived from Record_Type) */
         "boolean %s::can_start_v(const char *p_name, const char *p_uri, "
-        "XERdescriptor_t const& p_td, unsigned int p_flavor)\n"
-        "{ return can_start(p_name, p_uri, p_td, p_flavor); }\n"
+        "XERdescriptor_t const& p_td, unsigned int p_flavor, unsigned int p_flavor2)\n"
+        "{ return can_start(p_name, p_uri, p_td, p_flavor, p_flavor2); }\n"
         "boolean %s::can_start(const char *p_name, const char *p_uri, "
-        "XERdescriptor_t const& p_td, unsigned int p_flavor) {\n"
+        "XERdescriptor_t const& p_td, unsigned int p_flavor, unsigned int p_flavor2) {\n"
         "  boolean e_xer = is_exer(p_flavor);\n"
         "  if (!e_xer || (!(p_td.xer_bits & UNTAGGED) && !(p_flavor & USE_NIL))) return check_name(p_name, p_td, e_xer) && (!e_xer || check_namespace(p_uri, p_td));\n"
         , name , name, name);
       for (i = 0; i < sdef->nElements; i++) {
         src = mputprintf(src,
-          "  else if (%s::can_start(p_name, p_uri, %s_xer_, p_flavor)) return TRUE;\n"
+          "  else if (%s::can_start(p_name, p_uri, %s_xer_, p_flavor, p_flavor2)) return TRUE;\n"
           , sdef->elements[i].type, sdef->elements[i].typegen);
       }
       src = mputstr(src,
@@ -7001,7 +7001,7 @@ check_generate_end:
     }
     else { /* XER not needed */
       def = mputstr(def,
-        "boolean can_start_v(const char *, const char *, XERdescriptor_t const&, unsigned int)\n"
+        "boolean can_start_v(const char *, const char *, XERdescriptor_t const&, unsigned int, unsigned int)\n"
         "{ return FALSE; }\n"
         );
     } /* if (xer_needed) */
diff --git a/compiler2/record_of.c b/compiler2/record_of.c
index 4d335175c37736e624ecb1c0a10e1b47a77503a3..555a05d6517a23400be1d07cba5f4f9c8ad96555 100644
--- a/compiler2/record_of.c
+++ b/compiler2/record_of.c
@@ -1046,13 +1046,13 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
 
   if (xer_needed) { /* XERSTUFF encoder codegen for record-of, RT1 */
     def = mputstr(def,
-      "char **collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const;\n");
+      "char **collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int flavor = 0) const;\n");
 
     /* Write the body of the XER encoder/decoder functions. The declaration
      * is written by def_encdec() in encdec.c */
     src = mputprintf(src,
       "boolean %s::can_start(const char *name, const char *uri, "
-      "XERdescriptor_t const& xd, unsigned int flavor) {\n"
+      "XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2) {\n"
       "  boolean e_xer = is_exer(flavor);\n"
       "  if ((!e_xer || !(xd.xer_bits & UNTAGGED)) && !(flavor & XER_RECOF)) return "
       "check_name(name, xd, e_xer) && (!e_xer || check_namespace(uri, xd));\n"
@@ -1067,7 +1067,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
       src = mputstr(src, "{\n");
       for (f = 0; f < sdef->nFollowers; ++f) {
         src = mputprintf(src,
-          "    if (%s::can_start(name, uri, %s_xer_, flavor)) return FALSE;\n"
+          "    if (%s::can_start(name, uri, %s_xer_, flavor, flavor2)) return FALSE;\n"
           , sdef->followers[f].type
           , sdef->followers[f].typegen
           );
@@ -1079,13 +1079,13 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
     else src = mputstr(src, "return TRUE;\n");
 
     src = mputprintf(src,
-      "  return %s::can_start(name, uri, *xd.oftype_descr, flavor | XER_RECOF);\n"
+      "  return %s::can_start(name, uri, *xd.oftype_descr, flavor | XER_RECOF, flavor2);\n"
       "}\n\n"
       , sdef->type
       );
 
     src = mputprintf(src,
-      "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const {\n"
+      "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int) const {\n"
       "  size_t num_collected;\n"
       "  char **collected_ns = Base_Type::collect_ns(p_td, num_collected, def_ns);\n"
       /* The above may throw but then nothing was allocated. */
@@ -1113,7 +1113,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
 
     src=mputprintf(src,
       "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, "
-      "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t* emb_val) const\n{\n"
+      "unsigned int p_flavor, unsigned int p_flavor2, int p_indent, embed_values_enc_struct_t* emb_val) const\n{\n"
       "  if (val_ptr == 0) TTCN_error(\"Attempt to XER-encode an unbound record of\");\n" /* TODO type name */
       "  int encoded_length=(int)p_buf.get_len();\n"
       "  boolean e_xer = is_exer(p_flavor);\n"
@@ -1209,7 +1209,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
         "          p_buf.put_s(ns_len, (const unsigned char*)ns);\n"
 
         "          UNIVERSAL_CHARSTRING before(sp_at, (const universal_char*)(*val_ptr->value_elements[i]));\n"
-        "          before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n"
+        "          before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_flavor2, p_indent, 0);\n"
         // Ensure the namespace abides to its restrictions
         "          if (p_td.xer_bits & (ANY_FROM | ANY_EXCEPT)) {\n"
         "            TTCN_Buffer ns_buf;\n"
@@ -1237,7 +1237,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
         "        }\n"
 
         "        UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(*val_ptr->value_elements[i]) + j);\n"
-        "        after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n"
+        "        after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_flavor2, p_indent, 0);\n"
         // Put this attribute in a dummy element and walk through it to check its validity
         "        TTCN_Buffer check_buf;\n"
         "        check_buf.put_s(2, (const unsigned char*)\"<a\");\n"
@@ -1300,17 +1300,17 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
       "          emb_val->embval_array_reg->size_of() : emb_val->embval_array_opt->size_of())) {\n"
       "        if (0 != emb_val->embval_array_reg) {\n"
       "          (*emb_val->embval_array_reg)[emb_val->embval_index].XER_encode(\n"
-      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
       "        }\n"
       "        else {\n"
       "          (*emb_val->embval_array_opt)[emb_val->embval_index].XER_encode(\n"
-      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
       "        }\n"
       "        ++emb_val->embval_index;\n"
       "      }\n"
       "      ec_1.set_msg(\"%d: \", i);\n"
       "      if (e_xer && (p_td.xer_bits & XER_LIST) && i>0) p_buf.put_c(' ');\n"
-      "      (*this)[i].XER_encode(*p_td.oftype_descr, p_buf, p_flavor, p_indent+own_tag, emb_val);\n"
+      "      (*this)[i].XER_encode(*p_td.oftype_descr, p_buf, p_flavor, p_flavor2, p_indent+own_tag, emb_val);\n"
       "    }\n"
       "    if (indenting && !is_exerlist(p_flavor)) {\n"
     );
@@ -1486,7 +1486,7 @@ void defRecordOfClass1(const struct_of_def *sdef, output_struct *output)
       /* An untagged record-of ends if it encounters an element with a name
        * that doesn't match its component */
       "            if (!own_tag && !can_start((const char*)p_reader.LocalName(), "
-      "(const char*)p_reader.NamespaceUri(), p_td, p_flavor)) {\n"
+      "(const char*)p_reader.NamespaceUri(), p_td, p_flavor, p_flavor2)) {\n"
       "              for (; rd_ok == 1 && p_reader.Depth() > xml_depth; rd_ok = p_reader.Read()) ;\n"
       "              break;\n"
       "            }\n"
@@ -2514,13 +2514,13 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
 
   if (xer_needed) { /* XERSTUFF encoder codegen for record-of, RT1 */
     def = mputstr(def,
-      "char **collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const;\n");
+      "char **collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int flavor = 0) const;\n");
 
     /* Write the body of the XER encoder/decoder functions. The declaration
      * is written by def_encdec() in encdec.c */
     src = mputprintf(src,
       "boolean %s::can_start(const char *name, const char *uri, "
-      "XERdescriptor_t const& xd, unsigned int flavor) {\n"
+      "XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2) {\n"
       "  boolean e_xer = is_exer(flavor);\n"
       "  if ((!e_xer || !(xd.xer_bits & UNTAGGED)) && !(flavor & XER_RECOF)) return "
       "check_name(name, xd, e_xer) && (!e_xer || check_namespace(uri, xd));\n"
@@ -2535,7 +2535,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
       src = mputstr(src, "{\n");
       for (f = 0; f < sdef->nFollowers; ++f) {
         src = mputprintf(src,
-          "    if (%s::can_start(name, uri, %s_xer_, flavor)) return FALSE;\n"
+          "    if (%s::can_start(name, uri, %s_xer_, flavor, flavor2)) return FALSE;\n"
           , sdef->followers[f].type
           , sdef->followers[f].typegen
           );
@@ -2547,13 +2547,13 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
     else src = mputstr(src, "return TRUE;\n");
 
     src = mputprintf(src,
-      "  return %s::can_start(name, uri, *xd.oftype_descr, flavor | XER_RECOF);\n"
+      "  return %s::can_start(name, uri, *xd.oftype_descr, flavor | XER_RECOF, flavor2);\n"
       "}\n\n"
       , sdef->type
       );
 
     src = mputprintf(src,
-      "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const {\n"
+      "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int) const {\n"
       "  size_t num_collected;\n"
       "  char **collected_ns = Base_Type::collect_ns(p_td, num_collected, def_ns);\n"
       /* The above may throw but then nothing was allocated. */
@@ -2581,7 +2581,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
 
     src=mputprintf(src,
       "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, "
-      "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t* emb_val) const\n{\n"
+      "unsigned int p_flavor, unsigned int p_flavor2, int p_indent, embed_values_enc_struct_t* emb_val) const\n{\n"
       "  if (n_elements==-1) TTCN_error(\"Attempt to XER-encode an unbound record of\");\n" /* TODO type name */
       "  int encoded_length=(int)p_buf.get_len();\n"
       "  boolean e_xer = is_exer(p_flavor);\n"
@@ -2672,7 +2672,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
         "          p_buf.put_s(ns_len, (const unsigned char*)ns);\n"
 
         "          UNIVERSAL_CHARSTRING before(sp_at, (const universal_char*)(value_elements[i]));\n"
-        "          before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n"
+        "          before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_flavor2, p_indent, 0);\n"
         // Ensure the namespace abides to its restrictions
         "          if (p_td.xer_bits & (ANY_FROM | ANY_EXCEPT)) {\n"
         "            TTCN_Buffer ns_buf;\n"
@@ -2700,12 +2700,12 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
         "        }\n"
 
         "        UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(value_elements[i]) + j);\n"
-        "        after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_indent, 0);\n"
+        "        after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | ANY_ATTRIBUTES, p_flavor2, p_indent, 0);\n"
         // Put this attribute in a dummy element and walk through it to check its validity
         "        TTCN_Buffer check_buf;\n"
-        "        check_buf.put_s(2, (unsigned char*)\"<a\");\n"
+        "        check_buf.put_s(2, (const unsigned char*)\"<a\");\n"
         "        check_buf.put_s(p_buf.get_len() - buf_start, p_buf.get_data() + buf_start);\n"
-        "        check_buf.put_s(2, (unsigned char*)\"/>\");"
+        "        check_buf.put_s(2, (const unsigned char*)\"/>\");"
         "        XmlReaderWrap checker(check_buf);\n"
         "        while (1 == checker.Read()) ;\n"
         "      }\n"
@@ -2763,17 +2763,17 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
       "          emb_val->embval_array_reg->size_of() : emb_val->embval_array_opt->size_of())) {\n"
       "        if (0 != emb_val->embval_array_reg) {\n"
       "          (*emb_val->embval_array_reg)[emb_val->embval_index].XER_encode(\n"
-      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
       "        }\n"
       "        else {\n"
       "          (*emb_val->embval_array_opt)[emb_val->embval_index].XER_encode(\n"
-      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_indent+1, 0);\n"
+      "            UNIVERSAL_CHARSTRING_xer_, p_buf, p_flavor | EMBED_VALUES, p_flavor2, p_indent+1, 0);\n"
       "        }\n"
       "        ++emb_val->embval_index;\n"
       "      }\n"
       "      ec_1.set_msg(\"%d: \", i);\n"
       "      if (e_xer && (p_td.xer_bits & XER_LIST) && i>0) p_buf.put_c(' ');\n"
-      "      value_elements[i].XER_encode(*p_td.oftype_descr, p_buf, p_flavor, p_indent+own_tag, emb_val);\n"
+      "      value_elements[i].XER_encode(*p_td.oftype_descr, p_buf, p_flavor, p_flavor2, p_indent+own_tag, emb_val);\n"
       "    }\n"
       "    if (indenting && !is_exerlist(p_flavor)) {\n"
     );
@@ -2943,7 +2943,7 @@ void defRecordOfClassMemAllocOptimized(const struct_of_def *sdef, output_struct
       /* An untagged record-of ends if it encounters an element with a name
        * that doesn't match its component */
       "            if (!own_tag && !can_start((const char*)p_reader.LocalName(), "
-      "(const char*)p_reader.NamespaceUri(), p_td, p_flavor)) {\n"
+      "(const char*)p_reader.NamespaceUri(), p_td, p_flavor, p_flavor2)) {\n"
       "              for (; rd_ok == 1 && p_reader.Depth() > xml_depth; rd_ok = p_reader.Read()) ;\n"
       "              break;\n"
       "            }\n"
@@ -3271,20 +3271,20 @@ void defRecordOfClass2(const struct_of_def *sdef, output_struct *output)
   if (xer_needed) {
     def = mputprintf(def, "boolean isXerAttribute() const { return %s; }\n"
       "virtual boolean can_start_v(const char * name, const char *uri, "
-      "XERdescriptor_t const& xd, unsigned int);\n"
+      "XERdescriptor_t const& xd, unsigned int, unsigned int flavor2);\n"
       "static  boolean can_start  (const char * name, const char *uri, "
-      "XERdescriptor_t const& xd, unsigned int);\n",
+      "XERdescriptor_t const& xd, unsigned int, unsigned int flavor2);\n",
       sdef->xerAttribute ? "TRUE" : "FALSE");
     src = mputprintf(src,
       /* The virtual can_start_v hands off to the static can_start.
        * We must make a virtual call in Record_Of_Type::XER_decode because
        * we don't know the actual type (derived from Record_Of_Type) */
       "boolean %s::can_start_v(const char *name, const char *uri, "
-      "XERdescriptor_t const& xd, unsigned int flavor) {\n"
-      "  return can_start(name, uri, xd, flavor);\n"
+      "XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2) {\n"
+      "  return can_start(name, uri, xd, flavor, flavor2);\n"
       "}\n\n"
       "boolean %s::can_start(const char *name, const char *uri, "
-      "XERdescriptor_t const& xd, unsigned int flavor) {\n"
+      "XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2) {\n"
       "  boolean e_xer = is_exer(flavor);\n"
       /* if EXER and UNTAGGED, it can begin with the tag of the element,
        * otherwise it must be the tag of the type itself,
@@ -3304,7 +3304,7 @@ void defRecordOfClass2(const struct_of_def *sdef, output_struct *output)
       src = mputstr(src, "{\n");
       for (f = 0; f < sdef->nFollowers; ++f) {
         src = mputprintf(src,
-          "    if (%s::can_start(name, uri, %s_xer_, flavor)) return FALSE;\n"
+          "    if (%s::can_start(name, uri, %s_xer_, flavor, flavor2)) return FALSE;\n"
           , sdef->followers[f].type
           , sdef->followers[f].typegen
           );
@@ -3317,7 +3317,7 @@ void defRecordOfClass2(const struct_of_def *sdef, output_struct *output)
       src = mputstr(src, "return TRUE;\n");
     }
     src = mputprintf(src,
-      "  return %s::can_start(name, uri, *xd.oftype_descr, flavor | XER_RECOF);\n"
+      "  return %s::can_start(name, uri, *xd.oftype_descr, flavor | XER_RECOF, flavor2);\n"
       "}\n\n", sdef->type);
     def = mputprintf(def, "boolean isXmlValueList() const { return %s; }\n\n",
       sdef->xmlValueList ? "TRUE" : "FALSE");
@@ -3326,7 +3326,7 @@ void defRecordOfClass2(const struct_of_def *sdef, output_struct *output)
     /* The call in XER_decode is still there, can_start_v must exist. */
     def = mputstr(def,
       "virtual boolean can_start_v(const char *, const char *, "
-      "XERdescriptor_t const&, unsigned int) { return FALSE; }\n");
+      "XERdescriptor_t const&, unsigned int, unsigned int) { return FALSE; }\n");
   }
 
   /* end of class */
diff --git a/compiler2/ttcn3/AST_ttcn3.cc b/compiler2/ttcn3/AST_ttcn3.cc
index c827a6d008111a7faafc1e62895b40d45fce6209..66b7eb8499e223a99a254d182649276b6b09a387 100644
--- a/compiler2/ttcn3/AST_ttcn3.cc
+++ b/compiler2/ttcn3/AST_ttcn3.cc
@@ -9605,9 +9605,9 @@ namespace Ttcn {
         LazyParamData::clean();
         if (val->get_valuetype() == Value::V_REFD) {
           // check if the reference is a parameter, mark it as used if it is
-          Reference* ref = dynamic_cast<Reference*>(val->get_reference());
-          if (ref != NULL) {
-            ref->ref_usage_found();
+          Reference* r = dynamic_cast<Reference*>(val->get_reference());
+          if (r != NULL) {
+            r->ref_usage_found();
           }
         }
       } else {
@@ -9636,10 +9636,10 @@ namespace Ttcn {
         if (temp->get_DerivedRef() != NULL ||
             temp->get_Template()->get_templatetype() == Template::TEMPLATE_REFD) {
           // check if the reference is a parameter, mark it as used if it is
-          Reference* ref = dynamic_cast<Reference*>(temp->get_DerivedRef() != NULL ?
+          Reference* r = dynamic_cast<Reference*>(temp->get_DerivedRef() != NULL ?
             temp->get_DerivedRef() : temp->get_Template()->get_reference());
-          if (ref != NULL) {
-            ref->ref_usage_found();
+          if (r != NULL) {
+            r->ref_usage_found();
           }
         }
       } else {
diff --git a/compiler2/ttcn3/Attributes.cc b/compiler2/ttcn3/Attributes.cc
index eb91cd9fb5c36c5af97058e481092b0ae41873d8..8d247e787cf88fc98543b05460d226f8e6fb50ac 100644
--- a/compiler2/ttcn3/Attributes.cc
+++ b/compiler2/ttcn3/Attributes.cc
@@ -462,7 +462,7 @@ namespace Ttcn {
     return str;
   }
 
-  char* ErroneousDescriptor::generate_code_struct_str(char *str, char *& def, string genname, int field_index)
+  char* ErroneousDescriptor::generate_code_struct_str(char *str, char *& /*def*/, string genname, int field_index)
   {
     string genname_values_vec = genname + "_valsvec";
     string genname_embedded_vec = genname + "_embvec";
diff --git a/compiler2/ttcn3/Statement.cc b/compiler2/ttcn3/Statement.cc
index 3db41091534cc4bfad9959437f078a65abf318b9..102075ceaeff15d81b42269d634299079d4abdd3 100644
--- a/compiler2/ttcn3/Statement.cc
+++ b/compiler2/ttcn3/Statement.cc
@@ -3171,8 +3171,8 @@ error:
           continue;
         }
         for(size_t i2=i; i2<select_union.sus->get_nof_sus(); i2++) {
-          size_t size = select_union.sus->get_su_byIndex(i2)->get_ids().size();
-          for(size_t j2=j; j2<size; j2++) {
+          size_t size2 = select_union.sus->get_su_byIndex(i2)->get_ids().size();
+          for(size_t j2=j; j2<size2; j2++) {
             if (i == i2 && j == j2) continue;
             const Identifier *id2 = select_union.sus->get_su_byIndex(i2)->get_id_byIndex(j2);
             if (id->get_ttcnname() == id2->get_ttcnname()) {
@@ -9027,7 +9027,7 @@ error:
   }
 
   void ParamRedirect::generate_code(expression_struct_t *expr,
-                                    TemplateInstance* matched_ti, bool is_out)
+                                    TemplateInstance* matched_ti, bool /*is_out*/)
   {
     // AssignmentList is converted to VariableList during checking
     if (parredirtype != P_VAR) FATAL_ERROR("ParamRedirect::generate_code()");
@@ -11586,7 +11586,7 @@ error:
     ids.add(id);
   }
 
-  void SelectUnion::chk(Type *p_gov)
+  void SelectUnion::chk(Type */*p_gov*/)
   {
     Error_Context cntxt(this, "In select union statement");
     block->chk();
diff --git a/compiler2/ttcn3/profiler.c b/compiler2/ttcn3/profiler.c
index 6de701c4b9a1cf9092b30bc1a1b98919e001505f..12851600fdd5e3e099fa4390d52d0f0f7c321a10 100644
--- a/compiler2/ttcn3/profiler.c
+++ b/compiler2/ttcn3/profiler.c
@@ -110,7 +110,7 @@ boolean get_profiler_code_line(const char *p_file_name,
   return FALSE;
 }
 
-void free_profiler_data()
+void free_profiler_data(void)
 {
   for (size_t i = 0; i < the_data->nof_lines; ++i) {
     Free(the_data->lines[i].file_name);
diff --git a/compiler2/ttcn3/profiler.h b/compiler2/ttcn3/profiler.h
index 65cd748003c771b36494ba58e1d79e78d05774cc..a417af00c4b67fb2f4eb58f18abadb14be69623a 100644
--- a/compiler2/ttcn3/profiler.h
+++ b/compiler2/ttcn3/profiler.h
@@ -69,7 +69,7 @@ boolean get_profiler_code_line(const char *p_file_name,
   char **p_function_name, int *p_line_no);
 
 /** Frees the database (must be called once, at the end of compilation) */
-void free_profiler_data();
+void free_profiler_data(void);
 
 #ifdef	__cplusplus
 }
diff --git a/compiler2/union.c b/compiler2/union.c
index f3342ae541a5e2d33af7e9a99851bafa6e08215e..1e0537cc9a33ab50f6e5dec440841f80a21c1df5 100644
--- a/compiler2/union.c
+++ b/compiler2/union.c
@@ -1324,33 +1324,33 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
 
   if (xer_needed) { /* XERSTUFF encoder functions for union */
     def = mputstr(def,
-      "char **collect_ns(const XERdescriptor_t& p_td, size_t& num, boolean& def_ns) const;\n");
-
+      "char **collect_ns(const XERdescriptor_t& p_td, size_t& num, boolean& def_ns, unsigned int flavor = 0) const;\n");
     src=mputprintf(src,
       "boolean %s::can_start(const char *name, const char *uri,"
-      " const XERdescriptor_t& xd, unsigned int flavor) {\n"
+      " const XERdescriptor_t& xd, unsigned int flavor, unsigned int flavor2) {\n"
       "  boolean exer = is_exer(flavor);\n"
-      "  if (!exer || (!(xd.xer_bits & UNTAGGED) && !(flavor & (USE_NIL|(exer ? XER_LIST : XER_RECOF))))) "
+      "  if (!exer || (!(xd.xer_bits & UNTAGGED) && !(flavor & (USE_NIL|(exer ? XER_LIST : XER_RECOF)))%s)) "
       /* If the union has no own tag, there is nothing to check. */
       "return check_name(name, xd, exer)" /* if false, return immediately */
       " && (!exer || (flavor & USE_TYPE_ATTR) || check_namespace(uri, xd));\n"
       /* else check the ns, unless Basic XER (which has no namespaces, ever)
        * or USE_TYPE (where we only have a name from the type id attribute) */
       , name
+      , sdef->xerUseUnion ? " && !(flavor2 & FROM_UNION_USETYPE)" : ""
       );
     src = mputstr(src, "  flavor &= ~XER_RECOF;\n");
 
     /* An untagged union can start with the start tag of any alternative */
     for (i = 0; i < sdef->nElements; i++) {
       src=mputprintf(src,
-        "  if (%s::can_start(name, uri, %s_xer_, flavor)) return TRUE;\n"
+        "  if (%s::can_start(name, uri, %s_xer_, flavor, flavor2)) return TRUE;\n"
         , sdef->elements[i].type, sdef->elements[i].typegen
       );
     }
     src = mputstr(src, "  return FALSE;\n}\n\n");
 
     src = mputprintf(src,
-      "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num, boolean& def_ns) const {\n"
+      "char ** %s::collect_ns(const XERdescriptor_t& p_td, size_t& num, boolean& def_ns, unsigned int%s) const {\n"
       "  size_t num_collected;\n"
       "  char **collected_ns = Base_Type::collect_ns(p_td, num_collected, def_ns);\n"
       /* Two-level new memory allocated */
@@ -1361,11 +1361,12 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       "    boolean def_ns_1 = FALSE;\n"
       "    switch (union_selection) {\n"
       , name
+      , sdef->nElements > 0 ? " flavor" : ""
       );
     for (i = 0; i < sdef->nElements; i++) {
       src = mputprintf(src,
         "    case %s_%s:\n"
-        "      new_ns = field_%s->collect_ns(%s_xer_, num_new, def_ns_1);\n"
+        "      new_ns = field_%s->collect_ns(%s_xer_, num_new, def_ns_1, flavor);\n"
         "      def_ns = def_ns || def_ns_1;\n" /* alas, no ||= */
         "      merge_ns(collected_ns, num_collected, new_ns, num_new);\n"
         /* merge_ns() deallocated new_ns and duplicated strings,
@@ -1387,9 +1388,11 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       "    }\n" /* switch */
       "    if ((p_td.xer_bits & USE_TYPE_ATTR) && !(p_td.xer_bits & XER_ATTRIBUTE) && need_type) {\n"
       /*     control ns for type attribute */
-      "      collected_ns = (char**)Realloc(collected_ns, sizeof(char*) * ++num_collected);\n"
+      "      new_ns = (char**)Malloc(sizeof(char*));\n"
+      "      num_new = 1;\n"
       "      const namespace_t *c_ns = p_td.my_module->get_controlns();\n"
-      "      collected_ns[num_collected-1] = mprintf(\" xmlns:%s='%s'\", c_ns->px, c_ns->ns);\n"
+      "      new_ns[0] = mprintf(\" xmlns:%s='%s'\", c_ns->px, c_ns->ns);\n"
+      "      merge_ns(collected_ns, num_collected, new_ns, num_new);\n"
       "    }\n"
       "  }\n"
       "  catch (...) {\n"
@@ -1406,7 +1409,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
 
     src = mputprintf(src, /* XERSTUFF XER_encode for union */
       "int %s::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, "
-      "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const\n"
+      "unsigned int p_flavor, unsigned int p_flavor2, int p_indent, embed_values_enc_struct_t*) const\n"
       "{\n"
       "%s"
       "  if (%s==union_selection) {\n"
@@ -1418,7 +1421,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       "  int encoded_length=(int)p_buf.get_len();\n"
       , name
       , (use_runtime_2 ? "  if (err_descr) return XER_encode_negtest"
-        "(err_descr, p_td, p_buf, p_flavor, p_indent, 0);\n" : "")
+        "(err_descr, p_td, p_buf, p_flavor, p_flavor2, p_indent, 0);\n" : "")
       , unbound_value
     );
 
@@ -1426,29 +1429,30 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       src = mputstr(src,
         "  const boolean e_xer = is_exer(p_flavor);\n"
         "  boolean need_schema = FALSE;\n"
-        "  char *schema_prefix = mprintf(\"xsd\");\n"
-        "  int counter = 0;\n"
-        "  // Find a unique prefix for the xsd schema\n"
-        "  while (1) {\n"
-        "    boolean changed = FALSE;\n"
-        "    for (size_t i = 0; i < p_td.my_module->get_num_ns(); i++) {\n"
-        "      if (p_td.my_module->get_ns(i)->px != NULL &&\n"
-        "          strcmp(p_td.my_module->get_ns(i)->px, schema_prefix) == 0) {\n"
-        "        Free(schema_prefix);\n"
-        "        schema_prefix = mprintf(\"xsd%i\", counter);\n"
-        "        counter++;\n"
-        "        changed = TRUE;\n"
-        "        break; // new maybe unique prefix found\n"
-        "      }\n"
-        "    }\n"
-        "    if (!changed) {\n"
-        "      break; //break when a unique prefix found\n"
-        "    }\n"
-        "  }\n"
+        "  char *schema_prefix = NULL;\n"
         "  char *type_atr = NULL;\n"
         "  if (e_xer && (p_td.xer_bits & USE_TYPE_ATTR)) {\n"
         "    char *type_name = 0;\n"
         "    const namespace_t *control_ns;\n"
+        "    schema_prefix = mprintf(\"xsd\");\n"
+        "    int counter = 0;\n"
+        "    // Find a unique prefix for the xsd schema\n"
+        "    while (1) {\n"
+        "      boolean changed = FALSE;\n"
+        "      for (size_t i = 0; i < p_td.my_module->get_num_ns(); i++) {\n"
+        "        if (p_td.my_module->get_ns(i)->px != NULL &&\n"
+        "            strcmp(p_td.my_module->get_ns(i)->px, schema_prefix) == 0) {\n"
+        "          Free(schema_prefix);\n"
+        "          schema_prefix = mprintf(\"xsd%i\", counter);\n"
+        "          counter++;\n"
+        "          changed = TRUE;\n"
+        "          break; // new maybe unique prefix found\n"
+        "        }\n"
+        "      }\n"
+        "      if (!changed) {\n"
+        "        break; //break when a unique prefix found\n"
+        "      }\n"
+        "    }\n"
         "    switch (union_selection) {\n");
       /* In case of USE-TYPE the first field won't need the type attribute */
       int start_at = sdef->xerUseUnion ? 0 : 1;
@@ -1456,7 +1460,8 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
         src = mputprintf(src,
           "    case %s_%s:\n"
           , selection_prefix, sdef->elements[i].name);
-        if (!sdef->xerUseUnion) { // UseType
+        // UseType and not UseUnion on field
+        if (!sdef->xerUseUnion && !sdef->elements[i].xerUseUnion) {
           src = mputprintf(src,
             "      if (%s_xer_.my_module != 0 && %s_xer_.ns_index != -1 &&\n"
             "          %s_xer_.namelens[1] > 2) {\n"
@@ -1512,11 +1517,13 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
     } /* if UseTypeAttr */
     src = mputprintf(src,
       "  unsigned int flavor_1 = p_flavor;\n"
+      "  unsigned int flavor_2 = p_flavor2;\n"
       "  if (is_exer(p_flavor)) flavor_1 &= ~XER_RECOF;\n"
+      "  if (!(p_flavor & XER_LIST)) flavor_2 |= FROM_UNION_USETYPE;\n"
       "  boolean omit_tag = begin_xml(p_td, p_buf, flavor_1, p_indent, FALSE, "
-      "(collector_fn)&%s::collect_ns%s);\n"
+      "(collector_fn)&%s::collect_ns%s, flavor_2);\n"
       , sdef->name
-      , sdef->xerUseTypeAttr ? ", type_atr" : "");
+      , sdef->xerUseTypeAttr ? ", type_atr" : ", 0");
     src = mputprintf(src,
       "  unsigned int flavor_0 = (p_flavor & XER_MASK)%s;\n"
       "  switch (union_selection) {\n"
@@ -1525,7 +1532,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       src = mputprintf(src, "  case %s_%s:\n"
 	"    ec_1.set_msg(\"%s': \");\n"
 	"    field_%s->XER_encode(%s_xer_, p_buf, flavor_0, "
-	"p_indent + (!p_indent || !omit_tag), 0);\n"
+	"flavor_2, p_indent + (!p_indent || !omit_tag), 0);\n"
 	"    break;\n",
 	selection_prefix, sdef->elements[i].name,
 	sdef->elements[i].dispname,
@@ -1548,11 +1555,11 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       def = mputstr(def,
         "int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, "
         "const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, "
-        "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const;\n");
+        "unsigned int p_flavor, unsigned int p_flavor2, int p_indent, embed_values_enc_struct_t*) const;\n");
       src = mputprintf(src, /* XERSTUFF XER_encode for union */
         "int %s::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr, "
         "const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, "
-        "unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const\n"
+        "unsigned int p_flavor, unsigned int p_flavor2, int p_indent, embed_values_enc_struct_t*) const\n"
         "{\n"
         "  if (%s==union_selection) {\n"
         "    TTCN_error(\"Attempt to XER-encode an unbound union value.\");\n"
@@ -1568,29 +1575,30 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
         src = mputstr(src,
           "  const boolean e_xer = is_exer(p_flavor);\n"
           "  boolean need_schema = FALSE;\n"
-          "  char *schema_prefix = mprintf(\"xsd\");\n"
-          "  int counter = 0;\n"
-          "  // Find a unique prefix for the xsd schema\n"
-          "  while (1) {\n"
-          "    boolean changed = FALSE;\n"
-          "    for (size_t i = 0; i < p_td.my_module->get_num_ns(); i++) {\n"
-          "      if (p_td.my_module->get_ns(i)->px != NULL &&\n"
-          "          strcmp(p_td.my_module->get_ns(i)->px, schema_prefix) == 0) {\n"
-          "        Free(schema_prefix);\n"
-          "        schema_prefix = mprintf(\"xsd%i\", counter);\n"
-          "        counter++;\n"
-          "        changed = TRUE;\n"
-          "        break; // new maybe unique prefix found\n"
-          "      }\n"
-          "    }\n"
-          "    if (!changed) {\n"
-          "      break; //break when a unique prefix found\n"
-          "    }\n"
-          "  }\n"
+          "  char *schema_prefix = NULL;\n"
           "  char *type_atr = NULL;\n"
           "  if (e_xer && (p_td.xer_bits & USE_TYPE_ATTR)) {\n"
           "    char *type_name = 0;\n"
           "    const namespace_t *control_ns;\n"
+          "    schema_prefix = mprintf(\"xsd\");\n"
+          "    int counter = 0;\n"
+          "    // Find a unique prefix for the xsd schema\n"
+          "    while (1) {\n"
+          "      boolean changed = FALSE;\n"
+          "      for (size_t i = 0; i < p_td.my_module->get_num_ns(); i++) {\n"
+          "        if (p_td.my_module->get_ns(i)->px != NULL &&\n"
+          "            strcmp(p_td.my_module->get_ns(i)->px, schema_prefix) == 0) {\n"
+          "          Free(schema_prefix);\n"
+          "          schema_prefix = mprintf(\"xsd%i\", counter);\n"
+          "          counter++;\n"
+          "          changed = TRUE;\n"
+          "          break; // new maybe unique prefix found\n"
+          "        }\n"
+          "      }\n"
+          "      if (!changed) {\n"
+          "        break; //break when a unique prefix found\n"
+          "      }\n"
+          "    }\n"
           "    switch (union_selection) {\n");
         int start_at = sdef->xerUseUnion ? 0 : 1;
         for (i = start_at; i < sdef->nElements; i++) {
@@ -1676,22 +1684,24 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
           "(\"internal error: erroneous value typedescriptor missing\");\n"
           "          else err_vals->value->errval->XER_encode("
           "*err_vals->value->type_descr->xer, p_buf, flavor_0, "
-          "p_indent + (!p_indent || !omit_tag), 0);\n"
+          "p_flavor2, p_indent + (!p_indent || !omit_tag), 0);\n"
           "        }\n"
           "      }\n"
           "    } else {\n"
           "      ec_1.set_msg(\"%s': \");\n"
           "      if (emb_descr) field_%s->XER_encode_negtest(emb_descr, "
-          "%s_xer_, p_buf, flavor_0, p_indent + (!p_indent || !omit_tag), 0);\n"
+          "%s_xer_, p_buf, flavor_0, p_flavor2%s, p_indent + (!p_indent || !omit_tag), 0);\n"
           "      else field_%s->XER_encode(%s_xer_, p_buf, flavor_0, "
-          "p_indent + (!p_indent || !omit_tag), 0);\n"
+          "p_flavor2, p_indent + (!p_indent || !omit_tag), 0);\n"
           "    }\n"
           "    break;\n",
           selection_prefix, sdef->elements[i].name, /* case label */
           (unsigned long)i, (unsigned long)i,
           sdef->elements[i].dispname, /* set_msg (erroneous) */
           sdef->elements[i].dispname, /* set_msg */
-          sdef->elements[i].name, sdef->elements[i].typegen,
+          sdef->elements[i].name,
+          sdef->elements[i].typegen,
+          sdef->xerUseTypeAttr && !sdef->xerUseUnion ? "| FROM_UNION_USETYPE" : "",
           sdef->elements[i].name, sdef->elements[i].typegen /* field_%s, %s_descr */
           );
       }
@@ -1734,21 +1744,24 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       "  if (xerbits & USE_TYPE_ATTR) p_flavor &= ~XER_RECOF;\n"
       "  boolean own_tag = !(e_xer && ((xerbits & (ANY_ELEMENT | UNTAGGED)) "
       "|| (p_flavor & (USE_NIL|(e_xer ? XER_LIST : XER_RECOF)))));\n"
+      "  int other_attributes = 0;\n"
+      "  (void)other_attributes;\n"
       "  if ((e_xer || !is_record_of(p_flavor)) && own_tag)\n"
       /* Loop until the start tag */
       "  %sfor (rd_ok = p_reader.Ok(); rd_ok == 1; rd_ok = p_reader.Read()) {\n"
       "    type = p_reader.NodeType();\n"
-      "    if (type == XML_READER_TYPE_ELEMENT) {\n"
-      "      verify_name(p_reader, p_td, e_xer);\n"
+      "    if (type == XML_READER_TYPE_ELEMENT%s) {\n"
+      "      %sverify_name(p_reader, p_td, e_xer);\n"
       "      xml_depth = p_reader.Depth();\n"
       , name
       , sdef->xerUseTypeAttr ? "  char * typeatr = 0;\n" : ""
       , sdef->xerUseUnion ? "  boolean attribute = (p_td.xer_bits & XER_ATTRIBUTE) ? TRUE : FALSE;\n" : ""
       , sdef->xerUseUnion ? "if (!attribute) " : ""
+      , sdef->xerUseUnion ? " || (p_flavor & USE_TYPE_ATTR)" : ""
+      , sdef->xerUseUnion ? "if (!(p_flavor & USE_TYPE_ATTR)) " : ""
     );
     if (sdef->xerUseTypeAttr) {
       src = mputprintf(src,
-        "      int other_attributes = 0;\n"
         "      if (e_xer) {\n"
         "        for (rd_ok = p_reader.MoveToFirstAttribute(); rd_ok == 1;"
         " rd_ok = p_reader.MoveToNextAttribute()) {\n"
@@ -1760,8 +1773,9 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
         "          }\n"
         "          else ++other_attributes;\n"
         "        }\n" /* for */
-        "        rd_ok = p_reader.MoveToElement() | 1;\n"
-        , sdef->control_ns_prefix);
+        "%s"
+        , sdef->control_ns_prefix
+        , sdef->xerUseUnion ? "        rd_ok = p_reader.MoveToElement() | 1;\n" : "");
       if (!sdef->xerUseUnion) {
         /* USE-TYPE: No type attribute means the first alternative */
         src = mputprintf(src,
@@ -1776,8 +1790,8 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
     }
 
     src = mputprintf(src,
-      "      if (!(e_xer && (p_td.xer_bits & USE_TYPE_ATTR)%s)\n"
-      "        && !p_reader.IsEmptyElement()) rd_ok = p_reader.Read();\n"
+      "      if (%s(p_td.xer_bits & USE_TYPE_ATTR)%s)\n"
+      "        && !p_reader.IsEmptyElement()) { rd_ok = p_reader.Read(); }\n"
       "      break;\n"
       "    }\n"
       "  }\n"
@@ -1789,17 +1803,19 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       "    %sif (type == XML_READER_TYPE_ELEMENT) break;\n"
       "    else if (type == XML_READER_TYPE_END_ELEMENT) break;\n"
       "  }\n"
-      "  if (rd_ok) {\n"
+      "  if (%s) {\n"
       "    TTCN_EncDec_ErrorContext ec_1(\"Alternative '\");\n"
       "    TTCN_EncDec_ErrorContext ec_2;\n"
       "    const char *elem_name;\n"
       "    const char *ns_uri = 0;\n"
+      , sdef->xerUseTypeAttr && !sdef->xerUseUnion ? "!e_xer && !(" : "!(e_xer && "
       , sdef->xerUseTypeAttr ? " && other_attributes > 0" : ""
       , sdef->xerUseTypeAttr ? "if (!e_xer) " : ""
       , sdef->xerUseUnion ? "if (!attribute) " : ""
       , sdef->xerUseTypeAttr ?
         "if (e_xer) { if (type == XML_READER_TYPE_TEXT) break; }\n"
         "    else " : ""
+      , sdef->xerUseTypeAttr && !sdef->xerUseUnion ? "TRUE" : "rd_ok"
     );
 
     if (sdef->xerUseTypeAttr) {
@@ -1836,7 +1852,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
            *
            */
           "    if ((e_xer && (typeatr == NULL || !(p_td.xer_bits & USE_TYPE_ATTR))) "
-          "|| can_start(elem_name, ns_uri, %s_xer_, flavor_1) || strcmp(elem_name, \"%s\") == 0) {\n"
+          "|| can_start(elem_name, ns_uri, %s_xer_, flavor_1, p_flavor2)%s%s%s) {\n"
           "      ec_2.set_msg(\"%s': \");\n"
           "      if (%s==union_selection) {\n"
           "        matched = %d;\n"
@@ -1845,7 +1861,9 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
           "      if (field_%s->is_bound()) break; else clean_up();\n"
           "    }\n",
           sdef->elements[i].typegen,
-          XSD_type_to_xml_type(sdef->elements[i].xsd_type),
+          sdef->elements[i].xsd_type != XSD_NONE ? " || strcmp(elem_name, \"" : "",
+          sdef->elements[i].xsd_type != XSD_NONE ? XSD_type_to_xml_type(sdef->elements[i].xsd_type) : "",
+          sdef->elements[i].xsd_type != XSD_NONE ? "\") == 0" : "",
           sdef->elements[i].dispname,
           unbound_value, (int)i,
           sdef->elements[i].name,    sdef->elements[i].typegen,
@@ -1877,6 +1895,14 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
     }
     else /* not USE-UNION */
     {
+      src = mputstr(src,
+        "    unsigned int flavor2 = p_flavor2;\n");
+      if (sdef->xerUseTypeAttr) {
+        src = mputstr(src,
+          "    if (e_xer && (p_td.xer_bits & USE_TYPE_ATTR)) {\n"
+          "      flavor2 |= FROM_UNION_USETYPE;\n"
+          "    }\n");
+      }
       if (sdef->exerMaybeEmptyIndex >= 0) {
         /* There is a field which can be empty XML. Add code to detect this
          * and jump to the appropriate field which can decode "nothing". */
@@ -1890,47 +1916,70 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
       /* The field which can be empty should be checked last, otherwise we create an infinity loop with memory bomb.
        * So move that field to the last elseif branch*/
       for (i = 0; i < sdef->nElements; i++) {
-        if(sdef->exerMaybeEmptyIndex != i){
+        if(sdef->exerMaybeEmptyIndex != i) {
           src = mputprintf(src,
-            "    %sif (%s::can_start(elem_name, ns_uri, %s_xer_, flavor_1) || (%s_xer_.xer_bits & ANY_ELEMENT) || strcmp(elem_name, \"%s\") == 0) {\n"
+            "    %sif (%s::can_start(elem_name, ns_uri, %s_xer_, flavor_1, flavor2) || (%s_xer_.xer_bits & ANY_ELEMENT)%s%s%s%s) {\n"
             "      ec_2.set_msg(\"%s': \");\n"
             "      if (e_xer && (%s_xer_.xer_bits & BLOCKED)) {\n"
             "        TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG,\n"
             "          \"Attempting to decode blocked or abstract field.\");\n"
-            "      }\n"
-            "      %s%s().XER_decode(%s_xer_, p_reader, flavor_1, p_flavor2, 0);\n"
+            "      }\n",
+            i && !(i==1 && sdef->exerMaybeEmptyIndex==0) ? "else " : "",  /*  print "if(" if generate code for the first field or if the first field is the MaybeEmpty field and we generate the code for the second one*/
+            sdef->elements[i].type, sdef->elements[i].typegen, sdef->elements[i].typegen,
+            sdef->elements[i].xsd_type != XSD_NONE ? " || strcmp(elem_name, \"" : "",
+            sdef->elements[i].xsd_type != XSD_NONE ? XSD_type_to_xml_type(sdef->elements[i].xsd_type) : "",
+            sdef->elements[i].xsd_type != XSD_NONE ? "\") == 0" : "",
+            sdef->elements[i].xsd_type == XSD_NONE && sdef->elements[i].xerUseUnion ? " || (flavor2 & FROM_UNION_USETYPE)" : "",
+            sdef->elements[i].dispname,
+            sdef->elements[i].typegen);
+          if (sdef->xerUseTypeAttr) {
+            src = mputprintf(src,
+              "      if (e_xer && !(%s_xer_.xer_bits & USE_TYPE_ATTR)) {\n"
+              "        rd_ok = p_reader.MoveToElement() | 1;\n"
+              "      }\n",
+              sdef->elements[i].typegen);
+          }
+          if (!sdef->elements[i].xerUseUnion && sdef->xerUseTypeAttr) {
+            src = mputprintf(src,
+              "      if (e_xer && !((p_td.xer_bits & USE_TYPE_ATTR) && other_attributes > 0)\n"
+              "        && !p_reader.IsEmptyElement()) { rd_ok = p_reader.Read(); }\n");
+          }
+          src = mputprintf(src,
+            "      %s%s().XER_decode(%s_xer_, p_reader, flavor_1, flavor2, 0);\n"
             "      if (!%s%s().is_bound()) {\n"
             "        TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, \"Failed to decode field.\");\n"
             "      }\n"
             "    }\n",
-            i && !(i==1 && sdef->exerMaybeEmptyIndex==0) ? "else " : "",  /*  print "if(" if generate code for the first field or if the first field is the MaybeEmpty field and we generate the code for the second one*/
-            sdef->elements[i].type, sdef->elements[i].typegen, sdef->elements[i].typegen,
-            XSD_type_to_xml_type(sdef->elements[i].xsd_type),
-            sdef->elements[i].dispname,
+            at_field, sdef->elements[i].name,
             sdef->elements[i].typegen,
-            at_field, sdef->elements[i].name,    sdef->elements[i].typegen,
             at_field, sdef->elements[i].name);
           }
       }
       if(sdef->exerMaybeEmptyIndex>=0 ){
         i=sdef->exerMaybeEmptyIndex;
         src = mputprintf(src,
-          "    %sif ((e_xer && (type==XML_READER_TYPE_END_ELEMENT || !own_tag)) || %s::can_start(elem_name, ns_uri, %s_xer_, flavor_1) || (%s_xer_.xer_bits & ANY_ELEMENT) || strcmp(elem_name, \"%s\") == 0) {\n"
+          "    %sif ((e_xer && (type==XML_READER_TYPE_END_ELEMENT || !own_tag)) || %s::can_start(elem_name, ns_uri, %s_xer_, flavor_1, flavor2) || (%s_xer_.xer_bits & ANY_ELEMENT)%s%s%s) {\n"
           "empty_xml:  ec_2.set_msg(\"%s': \");\n"
           "      if (e_xer && (%s_xer_.xer_bits & BLOCKED)) {\n"
           "        TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG,\n"
           "          \"Attempting to decode blocked or abstract field.\");\n"
           "      }\n"
-          "      %s%s().XER_decode(%s_xer_, p_reader, flavor_1, p_flavor2, 0);\n"
+          "      if (e_xer && !(%s_xer_.xer_bits & USE_TYPE_ATTR)) {\n"
+          "        rd_ok = p_reader.MoveToElement() | 1;\n"
+          "      }\n"
+          "      %s%s().XER_decode(%s_xer_, p_reader, flavor_1, flavor2, 0);\n"
           "      if (!%s%s().is_bound()) {\n"
           "        TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG, \"Failed to decode field.\");\n"
           "      }\n"
           "    }\n",
           sdef->nElements>0 ? "else " : "",
           sdef->elements[i].type, sdef->elements[i].typegen, sdef->elements[i].typegen,
-          XSD_type_to_xml_type(sdef->elements[i].xsd_type),
+          sdef->elements[i].xsd_type != XSD_NONE ? " || strcmp(elem_name, \"" : "",
+          sdef->elements[i].xsd_type != XSD_NONE ? XSD_type_to_xml_type(sdef->elements[i].xsd_type) : "",
+          sdef->elements[i].xsd_type != XSD_NONE ? "\") == 0" : "",
           sdef->elements[i].dispname,
           sdef->elements[i].typegen,
+          sdef->elements[i].typegen,
           at_field, sdef->elements[i].name,    sdef->elements[i].typegen,
           at_field, sdef->elements[i].name);
       }
@@ -1949,7 +1998,7 @@ void defUnionClass(struct_def const *sdef, output_struct *output)
 
     src = mputprintf(src,
       "  }\n" /* end if(rd_ok) */
-      "  if (%s(e_xer || !is_record_of(p_flavor)) && own_tag)\n"
+      "  if (%s(e_xer || !is_record_of(p_flavor)) && own_tag && !(p_flavor2 & FROM_UNION_USETYPE))\n"
       "  for (; rd_ok == 1; rd_ok = p_reader.Read()) {\n"
       "    type = p_reader.NodeType();\n"
       "    if (type == XML_READER_TYPE_END_ELEMENT) {\n"
diff --git a/compiler2/ustring.cc b/compiler2/ustring.cc
index 6849aa7a8d86f67ffb72ed863061e1e9595b3e18..4df082404cbe3bac59cb121628dfa1966736efde 100644
--- a/compiler2/ustring.cc
+++ b/compiler2/ustring.cc
@@ -172,8 +172,8 @@ ustring::ustring(const string& s)
     delete ret;
   }
   if (isUTF8) {
-    ustring s = Common::decode_utf8(octet_str, CharCoding::UTF_8);
-    val_ptr = s.val_ptr;
+    ustring str = Common::decode_utf8(octet_str, CharCoding::UTF_8);
+    val_ptr = str.val_ptr;
     val_ptr->ref_count++;
   } else {
     init_struct(s.size());
diff --git a/compiler2/xpather.cc b/compiler2/xpather.cc
index 282158ed6c412b02a7c0986293b4a2b2289fbe4b..13c4d33c87dab9dad14b9f19652b2c390c25373e 100644
--- a/compiler2/xpather.cc
+++ b/compiler2/xpather.cc
@@ -364,11 +364,11 @@ extern "C" const char* getLibFromProject(const char* projName)
   return NULL;
 }
 
-extern "C" void erase_libs() {
+extern "C" void erase_libs(void) {
   projGenHelper.cleanUp();
 }
 
-extern "C" void print_libs() {
+extern "C" void print_libs(void) {
   projGenHelper.print();
 }
 
@@ -1592,38 +1592,40 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, char *tpdName, co
   }
 
   if (!get_config_mode) {
-    struct string2_list* last_elem = required_configs;
-    //                        To ensure that the first elem is checked too if last_elem->next is null
-    while (last_elem && last_elem->str1 != NULL && last_elem->str2 != NULL) {
-      if (!strcmp(last_elem->str1, *p_project_name) && strcmp(last_elem->str2, actcfg)) {
-        { // check if the other configuration exists
-          expstring_t xpathActCfg= mprintf(
-            "/TITAN_Project_File_Information/Configurations/"
-              "Configuration[@name='%s']/text()", last_elem->str2);
-          XPathObject theConfigEx(run_xpath(xpathCtx, xpathActCfg));
-          Free(xpathActCfg);
-
-          xmlNodeSetPtr nodes = theConfigEx->nodesetval;
-          if (nodes == NULL) {
-            ERROR("The active build configuration named '%s' of project '%s' does not exist",
-              last_elem->str2, *p_project_name);
-            for (size_t i = 0; i < folders.size(); ++i) {
-              Free(const_cast<char*>(folders.get_nth_elem(i)));
+    {
+      struct string2_list* last_elem = required_configs;
+      //                        To ensure that the first elem is checked too if last_elem->next is null
+      while (last_elem && last_elem->str1 != NULL && last_elem->str2 != NULL) {
+        if (!strcmp(last_elem->str1, *p_project_name) && strcmp(last_elem->str2, actcfg)) {
+          { // check if the other configuration exists
+            expstring_t xpathActCfg= mprintf(
+              "/TITAN_Project_File_Information/Configurations/"
+                "Configuration[@name='%s']/text()", last_elem->str2);
+            XPathObject theConfigEx(run_xpath(xpathCtx, xpathActCfg));
+            Free(xpathActCfg);
+
+            xmlNodeSetPtr nodes = theConfigEx->nodesetval;
+            if (nodes == NULL) {
+              ERROR("The active build configuration named '%s' of project '%s' does not exist",
+                last_elem->str2, *p_project_name);
+              for (size_t i = 0; i < folders.size(); ++i) {
+                Free(const_cast<char*>(folders.get_nth_elem(i)));
+              }
+              folders.clear();
+              return TPD_FAILED;
             }
-            folders.clear();
-            return TPD_FAILED;
           }
+          ERROR("Required configuration is inconsistent or circular : Project '%s' cannot have 2 "
+                "different configuration '%s' and '%s'",
+                last_elem->str1, actcfg, last_elem->str2);
+          for (size_t i = 0; i < folders.size(); ++i) {
+            Free(const_cast<char*>(folders.get_nth_elem(i)));
+          }
+          folders.clear();
+          return TPD_FAILED;
         }
-        ERROR("Required configuration is inconsistent or circular : Project '%s' cannot have 2 "
-              "different configuration '%s' and '%s'",
-              last_elem->str1, actcfg, last_elem->str2);
-        for (size_t i = 0; i < folders.size(); ++i) {
-          Free(const_cast<char*>(folders.get_nth_elem(i)));
-        }
-        folders.clear();
-        return TPD_FAILED;
+        last_elem = last_elem->next;
       }
-      last_elem = last_elem->next;
     }
 
   // Collect path variables
@@ -2027,8 +2029,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, char *tpdName, co
             " The available targets are: 'executable', 'library'", content);
       }
     }
-    ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name);
-    if (projDesc) projDesc->setLibrary(*p_Lflag);
+    ProjectDescriptor* projDescr = projGenHelper.getTargetOfProject(*p_project_name);
+    if (projDescr) projDescr->setLibrary(*p_Lflag);
   }
 
   // Executable name (don't care unless top-level invocation)
@@ -2526,8 +2528,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, char *tpdName, co
         replacechar(&content);
         last_elem->str = content;
 
-        ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name);
-        if (projDesc) projDesc->addToLinkerLibs(last_elem->str);
+        ProjectDescriptor* projDescr = projGenHelper.getTargetOfProject(*p_project_name);
+        if (projDescr) projDescr->addToLinkerLibs(last_elem->str);
       }
     }
   }
@@ -2559,8 +2561,8 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, char *tpdName, co
         replacechar(&content);
         last_elem->str = content;
 
-        ProjectDescriptor* projDesc = projGenHelper.getTargetOfProject(*p_project_name);
-        if (projDesc) projDesc->addToLibSearchPaths(last_elem->str);
+        ProjectDescriptor* projDescr = projGenHelper.getTargetOfProject(*p_project_name);
+        if (projDescr) projDescr->addToLibSearchPaths(last_elem->str);
       }
     }
   }
@@ -3136,7 +3138,7 @@ static tpd_result process_tpd_internal(const char *p_tpd_name, char *tpdName, co
   folders.clear();
   
   if(free_name) {
-    Free((char*)p_tpd_name);
+    Free(const_cast<char*>(p_tpd_name));
   }
 
   excluded_files.clear();
diff --git a/compiler2/xpather.h b/compiler2/xpather.h
index 55af8c9da69787695fed76a010e8654f726542f0..e93420d13847e999f866ded5d291eb71036a81ef 100644
--- a/compiler2/xpather.h
+++ b/compiler2/xpather.h
@@ -84,7 +84,7 @@ const char* findLibraryName(const char* libraryName, const char* projName);
 #ifdef __cplusplus
 extern "C"
 #endif
-void erase_libs();
+void erase_libs(void);
 
 #ifdef __cplusplus
 extern "C"
@@ -124,7 +124,7 @@ boolean hasSubProject(const char* projName);
 #ifdef __cplusplus
 extern "C"
 #endif
-void print_libs();
+void print_libs(void);
 
 #ifdef __cplusplus
 extern "C"
diff --git a/core/ASN_CharacterString.cc b/core/ASN_CharacterString.cc
index 86b989b7752fd9a077e205ec9b6c2d47de74c3ba..5b68be0b46e95d0adc7e78a3b6089b4d62c00ebc 100644
--- a/core/ASN_CharacterString.cc
+++ b/core/ASN_CharacterString.cc
@@ -788,7 +788,7 @@ boolean CHARACTER_STRING_identification::BER_decode_TLV(const TTCN_Typedescripto
 // FIXME maybe: XER_encode and decode is virtually identical to EMBEDDED_PDV
 
 int CHARACTER_STRING_identification::XER_encode(const XERdescriptor_t& p_td,
-               TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+               TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   int encoded_length=(int)p_buf.get_len();
 
@@ -797,22 +797,22 @@ int CHARACTER_STRING_identification::XER_encode(const XERdescriptor_t& p_td,
   flavor &= XER_MASK;
   switch (union_selection) {
   case ALT_syntaxes:
-    field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, indent, 0);
+    field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, flavor2, indent, 0);
     break;
   case ALT_syntax:
-    field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, indent, 0);
+    field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, flavor2, indent, 0);
     break;
   case ALT_presentation__context__id:
-    field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, indent, 0);
+    field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, flavor2, indent, 0);
     break;
   case ALT_context__negotiation:
-    field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, indent, 0);
+    field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, flavor2,indent, 0);
     break;
   case ALT_transfer__syntax:
-    field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, indent, 0);
+    field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, flavor2, indent, 0);
     break;
   case ALT_fixed:
-    field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, indent, 0);
+    field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, flavor2, indent, 0);
     break;
   default:
     TTCN_EncDec_ErrorContext::error_internal("Unknown selection.");
@@ -1787,14 +1787,14 @@ boolean CHARACTER_STRING_identification_syntaxes::BER_decode_TLV(const TTCN_Type
 }
 
 int CHARACTER_STRING_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td,
-               TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+               TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   int encoded_length=(int)p_buf.get_len();
 
   begin_xml(p_td, p_buf, flavor, indent++, FALSE);
 
-  field_abstract.XER_encode(CHARACTER_STRING_identification_sxs_abs_xer_, p_buf, flavor, indent, 0);
-  field_transfer.XER_encode(CHARACTER_STRING_identification_sxs_xfr_xer_, p_buf, flavor, indent, 0);
+  field_abstract.XER_encode(CHARACTER_STRING_identification_sxs_abs_xer_, p_buf, flavor, flavor2, indent, 0);
+  field_transfer.XER_encode(CHARACTER_STRING_identification_sxs_xfr_xer_, p_buf, flavor, flavor2, indent, 0);
 
   end_xml(p_td, p_buf, flavor, --indent, FALSE);
 
@@ -2518,14 +2518,14 @@ boolean CHARACTER_STRING_identification_context__negotiation::BER_decode_TLV(con
 }
 
 int CHARACTER_STRING_identification_context__negotiation::XER_encode(const XERdescriptor_t& p_td,
-               TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+               TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   int encoded_length=(int)p_buf.get_len();
 
   begin_xml(p_td, p_buf, flavor, indent++, FALSE);
 
-  field_presentation__context__id.XER_encode(CHARACTER_STRING_identification_pci_xer_, p_buf, flavor, indent, 0);
-  field_transfer__syntax         .XER_encode(CHARACTER_STRING_identification_ts_xer_ , p_buf, flavor, indent, 0);
+  field_presentation__context__id.XER_encode(CHARACTER_STRING_identification_pci_xer_, p_buf, flavor, flavor2, indent, 0);
+  field_transfer__syntax         .XER_encode(CHARACTER_STRING_identification_ts_xer_ , p_buf, flavor, flavor2, indent, 0);
 
   end_xml(p_td, p_buf, flavor, --indent, FALSE);
 
@@ -3251,7 +3251,7 @@ void CHARACTER_STRING::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0, 0);
     p_buf.put_c('\n');
     break;}
   case TTCN_EncDec::CT_JSON: {
@@ -3365,7 +3365,7 @@ boolean CHARACTER_STRING::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, cons
 }
 
 int CHARACTER_STRING::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-  unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error
@@ -3376,10 +3376,10 @@ int CHARACTER_STRING::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf
   flavor &= ~XER_RECOF; // ASN.1 character string doesn't care
   begin_xml(p_td, p_buf, flavor, indent++, FALSE);
 
-  field_identification.XER_encode(CHARACTER_STRING_identification_xer_, p_buf, flavor, indent, 0);
+  field_identification.XER_encode(CHARACTER_STRING_identification_xer_, p_buf, flavor, flavor2, indent, 0);
   // data-value-descriptor is OPTIONAL and can never be present.
   // Its encoding is empty.
-  field_string__value .XER_encode(CHARACTER_STRING_data_value_xer_    , p_buf, flavor, indent, 0);
+  field_string__value .XER_encode(CHARACTER_STRING_data_value_xer_    , p_buf, flavor, flavor2, indent, 0);
 
   end_xml(p_td, p_buf, flavor, --indent, FALSE);
 
diff --git a/core/ASN_CharacterString.hh b/core/ASN_CharacterString.hh
index d53a767912de17eed0191547ddc05ed463ce0c4c..01da0231e0d8ddd971e65a9354ebb7f68be2b7d7 100644
--- a/core/ASN_CharacterString.hh
+++ b/core/ASN_CharacterString.hh
@@ -99,7 +99,7 @@ public:
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td,
                  XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
 private:
@@ -223,7 +223,7 @@ public:
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td,
                  XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
 };
@@ -332,7 +332,7 @@ public:
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td,
                  XmlReaderWrap& reader, unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
 };
@@ -449,7 +449,7 @@ public:
   void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...);
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
-  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const;
+  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*);
 };
 
diff --git a/core/ASN_EmbeddedPDV.cc b/core/ASN_EmbeddedPDV.cc
index 33695173a85693f4af8deac28b4038b9b6da8ae1..7d2689d7bdf7ac10f13da4013107f0798160759b 100644
--- a/core/ASN_EmbeddedPDV.cc
+++ b/core/ASN_EmbeddedPDV.cc
@@ -775,7 +775,7 @@ boolean EMBEDDED_PDV_identification::BER_decode_TLV(const TTCN_Typedescriptor_t&
 // FIXME maybe: XER_encode and decode is virtually identical to CHARACTER_STRING
 
 int EMBEDDED_PDV_identification::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   int indenting = !is_canonical(flavor);
   boolean exer  = is_exer(flavor);
@@ -788,22 +788,22 @@ int EMBEDDED_PDV_identification::XER_encode(const XERdescriptor_t& p_td,
   ++indent;
   switch (union_selection) {
   case ALT_syntaxes:
-    field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, indent, 0);;
+    field_syntaxes->XER_encode(EMBEDDED_PDV_identification_sxs_xer_, p_buf, flavor, flavor2, indent, 0);;
     break;
   case ALT_syntax:
-    field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, indent, 0);;
+    field_syntax->XER_encode(EMBEDDED_PDV_identification_sx_xer_, p_buf, flavor, flavor2, indent, 0);;
     break;
   case ALT_presentation__context__id:
-    field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, indent, 0);;
+    field_presentation__context__id->XER_encode(EMBEDDED_PDV_identification_pci_xer_, p_buf, flavor, flavor2, indent, 0);;
     break;
   case ALT_context__negotiation:
-    field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, indent, 0);;
+    field_context__negotiation->XER_encode(EMBEDDED_PDV_identification_cn_xer_, p_buf, flavor, flavor2, indent, 0);;
     break;
   case ALT_transfer__syntax:
-    field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, indent, 0);;
+    field_transfer__syntax->XER_encode(EMBEDDED_PDV_identification_ts_xer_, p_buf, flavor, flavor2, indent, 0);;
     break;
   case ALT_fixed:
-    field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, indent, 0);;
+    field_fixed->XER_encode(EMBEDDED_PDV_identification_fix_xer_, p_buf, flavor, flavor2, indent, 0);;
     break;
   default:
     TTCN_EncDec_ErrorContext::error_internal("Unknown selection.");
@@ -1781,7 +1781,7 @@ boolean EMBEDDED_PDV_identification_syntaxes::BER_decode_TLV(const TTCN_Typedesc
 }
 
 int EMBEDDED_PDV_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   int indenting = !is_canonical(flavor);
   boolean exer  = is_exer(flavor);
@@ -1792,8 +1792,8 @@ int EMBEDDED_PDV_identification_syntaxes::XER_encode(const XERdescriptor_t& p_td
   p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]);
 
   ++indent;
-  field_abstract.XER_encode(EMBEDDED_PDV_identification_sxs_abs_xer_, p_buf, flavor, indent, 0);
-  field_transfer.XER_encode(EMBEDDED_PDV_identification_sxs_xfr_xer_, p_buf, flavor, indent, 0);
+  field_abstract.XER_encode(EMBEDDED_PDV_identification_sxs_abs_xer_, p_buf, flavor, flavor2, indent, 0);
+  field_transfer.XER_encode(EMBEDDED_PDV_identification_sxs_xfr_xer_, p_buf, flavor, flavor2, indent, 0);
 
   if (indenting) do_indent(p_buf, --indent);
   p_buf.put_c('<');
@@ -2522,7 +2522,7 @@ boolean EMBEDDED_PDV_identification_context__negotiation::BER_decode_TLV(const T
 }
 
 int EMBEDDED_PDV_identification_context__negotiation::XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   int indenting = !is_canonical(flavor);
   boolean exer  = is_exer(flavor);
@@ -2533,8 +2533,8 @@ int EMBEDDED_PDV_identification_context__negotiation::XER_encode(const XERdescri
   p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]);
 
   ++indent;
-  field_presentation__context__id.XER_encode(EMBEDDED_PDV_identification_cn_pci_xer_, p_buf, flavor, indent, 0);
-  field_transfer__syntax         .XER_encode(EMBEDDED_PDV_identification_cn_tsx_xer_, p_buf, flavor, indent, 0);
+  field_presentation__context__id.XER_encode(EMBEDDED_PDV_identification_cn_pci_xer_, p_buf, flavor, flavor2, indent, 0);
+  field_transfer__syntax         .XER_encode(EMBEDDED_PDV_identification_cn_tsx_xer_, p_buf, flavor, flavor2, indent, 0);
 
   if (indenting) do_indent(p_buf, --indent);
   p_buf.put_c('<');
@@ -3263,7 +3263,7 @@ void EMBEDDED_PDV::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -3376,7 +3376,7 @@ boolean EMBEDDED_PDV::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const AS
 }
 
 int EMBEDDED_PDV::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const {
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error
       (TTCN_EncDec::ET_UNBOUND, "Encoding an unbound value.");
@@ -3390,13 +3390,13 @@ int EMBEDDED_PDV::XER_encode(const XERdescriptor_t& p_td,
   p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]);
   flavor &= XER_MASK;
   ++indent;
-  field_identification         .XER_encode(EMBEDDED_PDV_identification_xer_       , p_buf, flavor, indent, 0);
+  field_identification         .XER_encode(EMBEDDED_PDV_identification_xer_       , p_buf, flavor, flavor2, indent, 0);
   if (field_data__value__descriptor.is_value()) {
     TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_INVAL_MSG,
       "data-value-descriptor not allowed for EMBEDDED PDV");
   }
-  field_data__value__descriptor.XER_encode(EMBEDDED_PDV_data_value_descriptor_xer_, p_buf, flavor, indent, 0);
-  field_data__value            .XER_encode(EMBEDDED_PDV_data_value_xer_           , p_buf, flavor, indent, 0);
+  field_data__value__descriptor.XER_encode(EMBEDDED_PDV_data_value_descriptor_xer_, p_buf, flavor, flavor2, indent, 0);
+  field_data__value            .XER_encode(EMBEDDED_PDV_data_value_xer_           , p_buf, flavor, flavor2, indent, 0);
 
   if (indenting) do_indent(p_buf, --indent);
   p_buf.put_c('<');
diff --git a/core/ASN_EmbeddedPDV.hh b/core/ASN_EmbeddedPDV.hh
index 8b962c974ea1d0dbec09b70362fe074a2c5dc9b5..d721ace9f6de896f35a9baa9560be94ac21ab783 100644
--- a/core/ASN_EmbeddedPDV.hh
+++ b/core/ASN_EmbeddedPDV.hh
@@ -99,7 +99,7 @@ public:
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                  unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
 private:
@@ -222,7 +222,7 @@ public:
   //void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...);
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
-  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const;
+  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*);
 };
 
@@ -329,7 +329,7 @@ public:
   //void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...);
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
-  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const;
+  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*);
 };
 
@@ -442,7 +442,7 @@ public:
   void decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTCN_EncDec::coding_t p_coding, ...);
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
-  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const;
+  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t&, XmlReaderWrap&, unsigned int, unsigned int, embed_values_dec_struct_t*);
 };
 
diff --git a/core/ASN_External.cc b/core/ASN_External.cc
index 9eacbc8e43ffc1295808da6d03cfe67f65a88c0c..7a5d4c27fe98f38dcff03e247e406a5a2e6d47a1 100644
--- a/core/ASN_External.cc
+++ b/core/ASN_External.cc
@@ -105,7 +105,7 @@ namespace { /* anonymous namespace */
     inline union_selection_type get_selection() const { return union_selection; }
 #ifdef TITAN_RUNTIME_2
     void set_param(Module_Param& /*param*/) { TTCN_error("Internal error: EXTERNALtransfer_encoding::set_param() called."); }
-    Module_Param* get_param(Module_Param_Name& param_name) const { TTCN_error("Internal error: EXTERNALtransfer_encoding::get_param() called."); }
+    Module_Param* get_param(Module_Param_Name& /*param_name*/) const { TTCN_error("Internal error: EXTERNALtransfer_encoding::get_param() called."); }
     void encode_text(Text_Buf& /*text_buf*/) const { TTCN_error("Internal error: EXTERNALtransfer_encoding::encode_text() called."); }
     void decode_text(Text_Buf& /*text_buf*/) { TTCN_error("Internal error: EXTERNALtransfer_encoding::decode_text() called."); }
     boolean is_bound() const { return union_selection!=UNBOUND_VALUE; }
@@ -117,7 +117,7 @@ namespace { /* anonymous namespace */
     ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
     boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
     int XER_encode(const XERdescriptor_t& p_td,
-                   TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                   TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
     int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                    unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   private:
@@ -161,7 +161,7 @@ namespace { /* anonymous namespace */
     {return field_encoding;}
 #ifdef TITAN_RUNTIME_2
     void set_param(Module_Param& /*param*/) { TTCN_error("Internal error: EXTERNALtransfer::set_param() called."); }
-    Module_Param* get_param(Module_Param_Name& param_name) const { TTCN_error("Internal error: EXTERNALtransfer::get_param() called."); }
+    Module_Param* get_param(Module_Param_Name& /*param_name*/) const { TTCN_error("Internal error: EXTERNALtransfer::get_param() called."); }
     void encode_text(Text_Buf& /*text_buf*/) const { TTCN_error("Internal error: EXTERNALtransfer::encode_text() called."); }
     void decode_text(Text_Buf& /*text_buf*/) { TTCN_error("Internal error: EXTERNALtransfer::decode_text() called."); }
     boolean is_bound() const { TTCN_error("Internal error: EXTERNALtransfer::is_bound() called."); }
@@ -175,7 +175,7 @@ namespace { /* anonymous namespace */
     ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
     boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
     int XER_encode(const XERdescriptor_t& p_td,
-                   TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                   TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
     int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                    unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   };
@@ -414,7 +414,7 @@ namespace { /* anonymous namespace */
   }
 
   int EXTERNALtransfer_encoding::XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
   {
     int indenting = !is_canonical(flavor);
     boolean exer  = is_exer(flavor);
@@ -427,13 +427,13 @@ namespace { /* anonymous namespace */
     ++indent;
     switch (union_selection) {
     case ALT_single__ASN1__type:
-      field_single__ASN1__type->XER_encode(EXTERNAL_encoding_singleASN_xer_, p_buf, flavor, indent, 0);
+      field_single__ASN1__type->XER_encode(EXTERNAL_encoding_singleASN_xer_, p_buf, flavor, flavor2, indent, 0);
       break;
     case ALT_octet__aligned:
-      field_octet__aligned    ->XER_encode(EXTERNAL_encoding_octet_aligned_xer_, p_buf, flavor, indent, 0);
+      field_octet__aligned    ->XER_encode(EXTERNAL_encoding_octet_aligned_xer_, p_buf, flavor, flavor2, indent, 0);
       break;
     case ALT_arbitrary:
-      field_arbitrary         ->XER_encode(EXTERNAL_encoding_arbitrary_xer_, p_buf, flavor, indent, 0);
+      field_arbitrary         ->XER_encode(EXTERNAL_encoding_arbitrary_xer_, p_buf, flavor, flavor2, indent, 0);
       break;
     case UNBOUND_VALUE:
       TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND,
@@ -571,7 +571,7 @@ namespace { /* anonymous namespace */
   }
 
   int EXTERNALtransfer::XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
   {
     int indenting = !is_canonical(flavor);
     boolean exer  = is_exer(flavor);
@@ -582,10 +582,10 @@ namespace { /* anonymous namespace */
     p_buf.put_s((size_t)p_td.namelens[exer] - 1 + indenting, (const unsigned char*)p_td.names[exer]);
 
     ++indent;
-    field_direct__reference      .XER_encode(EXTERNAL_direct_reference_xer_     , p_buf, flavor, indent, 0);
-    field_indirect__reference    .XER_encode(EXTERNAL_indirect_reference_xer_   , p_buf, flavor, indent, 0);
-    field_data__value__descriptor.XER_encode(EXTERNAL_data_value_descriptor_xer_, p_buf, flavor, indent, 0);
-    field_encoding               .XER_encode(EXTERNAL_encoding_xer_ , p_buf, flavor, indent, 0);
+    field_direct__reference      .XER_encode(EXTERNAL_direct_reference_xer_     , p_buf, flavor, flavor2, indent, 0);
+    field_indirect__reference    .XER_encode(EXTERNAL_indirect_reference_xer_   , p_buf, flavor, flavor2, indent, 0);
+    field_data__value__descriptor.XER_encode(EXTERNAL_data_value_descriptor_xer_, p_buf, flavor, flavor2, indent, 0);
+    field_encoding               .XER_encode(EXTERNAL_encoding_xer_ , p_buf, flavor, flavor2, indent, 0);
 
     if (indenting) do_indent(p_buf, --indent);
     p_buf.put_c('<');
@@ -716,7 +716,7 @@ boolean EXTERNAL::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BE
 }
 
 int EXTERNAL::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error
@@ -724,7 +724,7 @@ int EXTERNAL::XER_encode(const XERdescriptor_t& p_td,
   }
   EXTERNALtransfer xfer;
   xfer.load(*this);
-  return xfer.XER_encode(p_td, p_buf, flavor, indent, 0);
+  return xfer.XER_encode(p_td, p_buf, flavor, flavor2, indent, 0);
 }
 
 int EXTERNAL::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
@@ -3470,7 +3470,7 @@ void EXTERNAL::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf, TTC
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
diff --git a/core/ASN_External.hh b/core/ASN_External.hh
index 5ff895ea1bc792a3cd222f7783c861334e333a15..e4cc41ceb16a4a784a1b7e8f5b1c53af446872c2 100644
--- a/core/ASN_External.hh
+++ b/core/ASN_External.hh
@@ -422,7 +422,7 @@ public:
   ASN_BER_TLV_t* BER_encode_TLV(const TTCN_Typedescriptor_t& p_td, unsigned p_coding) const;
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td, const ASN_BER_TLV_t& p_tlv, unsigned L_form);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                  unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
 };
diff --git a/core/ASN_Null.cc b/core/ASN_Null.cc
index 539373b19ac7fb20ed0f35b2ea72e0c4fe956a16..7922b39b2b8490e9fff1c9b83d9e42f89f08252e 100644
--- a/core/ASN_Null.cc
+++ b/core/ASN_Null.cc
@@ -136,7 +136,7 @@ void ASN_NULL::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -234,7 +234,7 @@ boolean ASN_NULL::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td,
 }
 
 int ASN_NULL::XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   boolean exer  = is_exer(flavor);
   TTCN_EncDec_ErrorContext ec("While XER encoding NULL type: ");
diff --git a/core/ASN_Null.hh b/core/ASN_Null.hh
index 58b8874abf2b492a0a7ad2cc08b5dfc3035f8394..753ba1bf7235e7619832d270d97f765873902901 100644
--- a/core/ASN_Null.hh
+++ b/core/ASN_Null.hh
@@ -83,7 +83,7 @@ public:
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td,
                          const ASN_BER_TLV_t& p_tlv, unsigned L_form);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                  unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   
diff --git a/core/Basetype.cc b/core/Basetype.cc
index 0576c03d26d335fc6a3174ba46e4c292af00db34..754c628eccfcc5a30b98d3d50a2a9c42580a364d 100644
--- a/core/Basetype.cc
+++ b/core/Basetype.cc
@@ -90,7 +90,7 @@ void Base_Type::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
     if(!p_td.xer) TTCN_EncDec_ErrorContext::error_internal(
       "No XER descriptor available for type '%s'.", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0);
+    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0, 0);
     p_buf.put_c('\n');
     break;}
   case TTCN_EncDec::CT_JSON: {
@@ -232,7 +232,7 @@ static const cbyte empty_tag_end[4] = "/>\n";
 
 int Base_Type::begin_xml(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
   unsigned int& flavor, int indent, boolean empty,
-  collector_fn collector, const char *type_atr) const
+  collector_fn collector, const char *type_atr, unsigned int flavor2) const
 {
   const int indenting = !is_canonical(flavor);
   const int exer = is_exer(flavor);
@@ -276,7 +276,7 @@ int Base_Type::begin_xml(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
     char **collected_ns = NULL;
     boolean def_ns = FALSE;
     if (namespaces_needed) {
-      collected_ns = (this->*collector)(p_td, num_collected, def_ns);
+      collected_ns = (this->*collector)(p_td, num_collected, def_ns, flavor2);
     }
 
     p_buf.put_s((size_t)p_td.namelens[exer] - 2, (cbyte*)p_td.names[exer]);
@@ -322,6 +322,10 @@ int Base_Type::begin_xml(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
       (p_buf.get_data()[buf_used] == '\n')) {
       p_buf.increase_length((size_t)-1); // back up over the newline
       omit_tag = -1; // to help fix HO85831
+    } else if (exer && (p_td.xer_bits & USE_TYPE_ATTR) && type_atr && (flavor2 & FROM_UNION_USETYPE)) {
+      p_buf.increase_length((size_t)-1); // back up over the endtag
+      p_buf.put_s(mstrlen(const_cast<char*>(type_atr)), (cbyte*)type_atr);
+      p_buf.put_c('>');
     }
   }
 
@@ -982,7 +986,7 @@ int Base_Type::RAW_decode(const TTCN_Typedescriptor_t& p_td,
 }
 
 int Base_Type::XER_encode(const XERdescriptor_t& p_td,
-                          TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const
+                          TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const
 {
   TTCN_error("XER encoding requested for type '%-.*s' which has no"
              " XER encoding method.", p_td.namelens[0]-2, p_td.names[0]);
@@ -1011,14 +1015,14 @@ int Base_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer&, b
 }
 
 boolean Base_Type::can_start(const char *name, const char *uri,
-  XERdescriptor_t const& xd, unsigned int flavor)
+  XERdescriptor_t const& xd, unsigned int flavor, unsigned int /*flavor2*/)
 {
   boolean e_xer = is_exer(flavor);
   // Check the name. If EXER, check the namespace too.
   return check_name(name, xd, e_xer) && (!e_xer || check_namespace(uri, xd));
 }
 
-char ** Base_Type::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const
+char ** Base_Type::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int /* flavor */) const
 {
   def_ns = FALSE;
   char *tmp = NULL;
diff --git a/core/Basetype.hh b/core/Basetype.hh
index 29c0412d69e6fecf28b7b4ebb5d997ee820064e6..71d2d8213421e66fe86cf50059f04971309e77b3 100644
--- a/core/Basetype.hh
+++ b/core/Basetype.hh
@@ -167,7 +167,7 @@ public:
    *         FALSE otherwise.
    */
   static boolean can_start(const char *name, const char *uri,
-    XERdescriptor_t const& xd, unsigned int flavor);
+    XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2);
 
 #ifdef TITAN_RUNTIME_2
   /** Initialize this object (or one of its fields/elements) with a 
@@ -481,12 +481,12 @@ public:
    * @return number of bytes written into the buffer
    */
   VIRTUAL_IF_RUNTIME_2 int XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const;
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const;
 
 #ifdef TITAN_RUNTIME_2
   virtual int XER_encode_negtest(const Erroneous_descriptor_t* /*p_err_descr*/,
     const XERdescriptor_t& /*p_td*/, TTCN_Buffer& /*p_buf*/,
-    unsigned int /*flavor*/, int /*indent*/, embed_values_enc_struct_t* /*emb_val*/) const;
+    unsigned int /*flavor*/, unsigned int /*flavor2*/, int /*indent*/, embed_values_enc_struct_t* /*emb_val*/) const;
 #endif
 
   /** Decode the current object from the supplied buffer.
@@ -536,7 +536,7 @@ public:
    * (the space at start allows direct concatenation of the strings)
    */
   VIRTUAL_IF_RUNTIME_2 char ** collect_ns(const XERdescriptor_t& p_td,
-    size_t& num, bool& def_ns) const;
+    size_t& num, bool& def_ns, unsigned int flavor = 0) const;
 
   /** Copy strings from @p new_namespaces to @p collected_ns,
    *  discarding duplicates.
@@ -555,7 +555,7 @@ public:
     char **new_namespaces, size_t num_new);
 
   typedef char** (Base_Type::*collector_fn)
-    (const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const;
+    (const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int flavor) const;
 
   /** Start writing the XML representation
    *
@@ -576,7 +576,7 @@ public:
    */
   VIRTUAL_IF_RUNTIME_2 int begin_xml(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
     unsigned int& flavor, int indent, boolean empty,
-    collector_fn collector = &Base_Type::collect_ns, const char *type_atr = NULL) const;
+    collector_fn collector = &Base_Type::collect_ns, const char *type_atr = NULL, unsigned int flavor2 = 0) const;
   /** Finish the XML representation.
    *
    * @param[in]  p_td XER descriptor
@@ -815,13 +815,13 @@ public:
   virtual int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE);
 
   virtual int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-    unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+    unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   virtual int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
-    const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, int indent, embed_values_enc_struct_t*) const;
+    const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, unsigned flavor2, int indent, embed_values_enc_struct_t*) const;
   /// Helper for XER_encode_negtest
   int encode_element(int i, const XERdescriptor_t& p_td, const Erroneous_values_t* err_vals,
     const Erroneous_descriptor_t* emb_descr,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const;
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const;
   virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*);
   virtual boolean isXerAttribute() const;
   virtual boolean isXmlValueList() const;
@@ -848,9 +848,9 @@ public:
   /** Constant unbound element - return this instead of NULL in constant functions */
   virtual const Base_Type* get_unbound_elem() const = 0;
 
-  virtual char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const;
+  virtual char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int flavor) const;
   virtual boolean can_start_v(const char *name, const char *prefix,
-    XERdescriptor_t const& xd, unsigned int flavor) = 0;
+    XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2) = 0;
 
   void set_err_descr(Erroneous_descriptor_t* p_err_descr) { err_descr=p_err_descr; }
   Erroneous_descriptor_t* get_err_descr() const { return err_descr; }
@@ -958,10 +958,10 @@ public:
   virtual int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE);
 
   virtual int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-    unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+    unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   virtual int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
     const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-    unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+    unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
     unsigned int, unsigned int, embed_values_dec_struct_t*);
   /// @{
@@ -969,9 +969,9 @@ public:
   virtual int get_xer_num_attr() const { return 0; /* default */ }
   virtual const XERdescriptor_t* xer_descr(int field_index) const;
   /// @}
-  virtual char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const;
+  virtual char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int flavor = 0) const;
   virtual boolean can_start_v(const char *name, const char *prefix,
-    XERdescriptor_t const& xd, unsigned int flavor) = 0;
+    XERdescriptor_t const& xd, unsigned int flavor, unsigned int flavor2) = 0;
   
   /** Encodes accordingly to the JSON encoding rules.
     * Returns the length of the encoded data. */
@@ -991,7 +991,7 @@ public:
 private:
   /// Helper for XER_encode_negtest
   int encode_field(int i, const Erroneous_values_t* err_vals, const Erroneous_descriptor_t* emb_descr,
-  TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent, embed_values_enc_struct_t* emb_val) const;
+  TTCN_Buffer& p_buf, unsigned int sub_flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const;
 };
 
 ////////////////////////////////////////////////////////////////////////////////
@@ -1038,7 +1038,7 @@ public:
   virtual int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, Limit_Token_List&, boolean no_err=FALSE, boolean first_call=TRUE);
 
   virtual int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-    unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+    unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   virtual int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
     unsigned int, unsigned int, embed_values_dec_struct_t*);
   
diff --git a/core/Bitstring.cc b/core/Bitstring.cc
index 1ff0df731a77fa37caffa3157273df7d58c132e4..51d1a181d05cda4ebc3f6491e55afe28bbf6a398 100644
--- a/core/Bitstring.cc
+++ b/core/Bitstring.cc
@@ -33,6 +33,7 @@
 #include "Logger.hh"
 #include "Encdec.hh"
 #include "Addfunc.hh"
+#include "Optional.hh"
 
 #include "../common/dbgnew.hh"
 
@@ -670,7 +671,7 @@ void BITSTRING::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -1066,7 +1067,7 @@ int BITSTRING::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff,
 }
 
 int BITSTRING::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error
@@ -1193,7 +1194,7 @@ int BITSTRING::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_
   boolean use_default = p_td.json->default_value && 0 == p_tok.get_buffer_length();
   if (use_default) {
     // No JSON data in the buffer -> use default value
-    value = (char*)p_td.json->default_value;
+    value = const_cast<char*>(p_td.json->default_value);
     value_len = strlen(value);
   } else {
     dec_len = p_tok.get_next_token(&token, &value, &value_len);
diff --git a/core/Bitstring.hh b/core/Bitstring.hh
index 98cf7b4d663df874c869125705a2ca4486403a0e..8f0d74e20f550b54e92e0219b908421bcd5e4cfe 100644
--- a/core/Bitstring.hh
+++ b/core/Bitstring.hh
@@ -27,9 +27,9 @@
 #include "Types.h"
 #include "Basetype.hh"
 #include "Template.hh"
-#include "Optional.hh"
 #include "RAW.hh"
 #include "BER.hh"
+#include "Error.hh"
 
 class INTEGER;
 class HEXSTRING;
@@ -39,6 +39,9 @@ class BITSTRING_ELEMENT;
 
 class Module_Param;
 
+template<typename T>
+class OPTIONAL;
+
 /** bitstring value class.
  * Refcounted copy-on-write implementation */
 class BITSTRING : public Base_Type {
@@ -190,7 +193,7 @@ public:
   int RAW_decode(const TTCN_Typedescriptor_t& , TTCN_Buffer&, int, raw_order_t,
      boolean no_err=FALSE, int sel_field=-1, boolean first_call=TRUE);
 
-  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const;
+  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*);
   
   /** Encodes accordingly to the JSON encoding rules.
diff --git a/core/Boolean.cc b/core/Boolean.cc
index 2a03f93338c7395fa0115093d9380da1a1db2841..3ce5c997b24af458b80811de7e26fbf472d63c21 100644
--- a/core/Boolean.cc
+++ b/core/Boolean.cc
@@ -36,6 +36,7 @@
 #include "TEXT.hh"
 #include "Charstring.hh"
 #include "XmlReader.hh"
+#include "Optional.hh"
 
 static const Token_Match boolean_true_match("^(true).*$",TRUE);
 static const Token_Match boolean_false_match("^(false).*$",TRUE);
@@ -237,7 +238,7 @@ void BOOLEAN::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -612,7 +613,7 @@ int BOOLEAN::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff,
 }
 
 int BOOLEAN::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error
diff --git a/core/Boolean.hh b/core/Boolean.hh
index e0812f667fa263e6e2756e02beb9ee43f262112b..f7c30f388516d9b999fe22cdf31452ce87f3bf18 100644
--- a/core/Boolean.hh
+++ b/core/Boolean.hh
@@ -25,11 +25,13 @@
 #include "Types.h"
 #include "Basetype.hh"
 #include "Template.hh"
-#include "Optional.hh"
 #include "Error.hh"
 
 class Module_Param;
 
+template<typename T>
+class OPTIONAL;
+
 class BOOLEAN : public Base_Type {
   friend class BOOLEAN_template;
 
@@ -117,7 +119,7 @@ public:
   int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&,  Limit_Token_List&,
                   boolean no_err=FALSE, boolean first_call=TRUE);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                  unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   
diff --git a/core/Charstring.cc b/core/Charstring.cc
index f72ce5d72bf57209d89a0f34db74187e7b544300..c737a666587e8b356e1f21c97b4a3f851b6e1e7d 100644
--- a/core/Charstring.cc
+++ b/core/Charstring.cc
@@ -806,7 +806,7 @@ void CHARSTRING::encode(const TTCN_Typedescriptor_t& p_td,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     p_buf.put_c('\n');
     break;}
   case TTCN_EncDec::CT_JSON: {
@@ -1229,7 +1229,7 @@ extern const char cb64[]=
   "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
 
 int CHARSTRING::XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND,
diff --git a/core/Charstring.hh b/core/Charstring.hh
index 7ab2d50fa918eb70dac3f81f6128bb0cdd6807a6..522c07204d6962287c99e412dbac4ba6df345c52 100644
--- a/core/Charstring.hh
+++ b/core/Charstring.hh
@@ -234,7 +234,7 @@ public:
                  TTCN_Buffer&) const;
   int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&,  Limit_Token_List&,
                   boolean no_err=FALSE, boolean first_call=TRUE);
-  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const;
+  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*);
   
   /** Returns the charstring in the format a string would appear in C or TTCN-3 code.
diff --git a/core/Component.hh b/core/Component.hh
index e2a7df793ba96279735bf8b81190900e5cfca5b0..754e0269a668d3983054c838fd0fd9c86bdf267a 100644
--- a/core/Component.hh
+++ b/core/Component.hh
@@ -22,10 +22,12 @@
 #include "Types.h"
 #include "Basetype.hh"
 #include "Template.hh"
-#include "Optional.hh"
 
 class Module_Param;
 
+template<typename T>
+class OPTIONAL;
+
 // value class for all component types
 
 class COMPONENT : public Base_Type {
diff --git a/core/DebuggerUI.cc b/core/DebuggerUI.cc
index 42675f5e17803c4b0cde0bd5d76c4440c1b417bf..0e24f5dbe8dd3da46483e6019bc736fa7d8abe34 100644
--- a/core/DebuggerUI.cc
+++ b/core/DebuggerUI.cc
@@ -259,7 +259,7 @@ void TTCN_Debugger_UI::read_loop()
       // EOF was received -> exit all
       puts("exit all");
       char** args = new char*[1];
-      args[0] = (char*)"all";
+      args[0] = const_cast<char*>("all");
       ttcn3_debugger.execute_command(D_EXIT, 1, args);
       delete [] args;
     }
diff --git a/core/Default.cc b/core/Default.cc
index bd903f04e2204d2645d273e3e8ea0aa2de9deb65..f6af3dcaa3a7c4a55c534af02a82f4a550ddc035 100644
--- a/core/Default.cc
+++ b/core/Default.cc
@@ -25,6 +25,7 @@
 #include "Logger.hh"
 #include "Error.hh"
 #include "TitanLoggerApi.hh"
+#include "Optional.hh"
 
 #include "../common/dbgnew.hh"
 
diff --git a/core/Default.hh b/core/Default.hh
index a24e21e1b5812013b079a4cd144f0132939f5f13..2c5b16246dbe6af92b272d0a2107fe30852f5e7d 100644
--- a/core/Default.hh
+++ b/core/Default.hh
@@ -22,11 +22,13 @@
 #include "Types.h"
 #include "Basetype.hh"
 #include "Template.hh"
-#include "Optional.hh"
 
 class Text_Buf;
 class Module_Param;
 
+template<typename T>
+class OPTIONAL;
+
 class Default_Base {
   friend class TTCN_Default;
   friend class DEFAULT;
diff --git a/core/Encdec.cc b/core/Encdec.cc
index 52ad6a15454c3b90a529a719bad5bb1cbe0eba95..2e08a0690852d2a1956c5a7638ed7db4c600a091 100644
--- a/core/Encdec.cc
+++ b/core/Encdec.cc
@@ -27,6 +27,7 @@
 #include "RAW.hh"
 #include "Error.hh"
 #include "Logger.hh"
+#include "string.h"
 
 const TTCN_EncDec::error_behavior_t
 TTCN_EncDec::default_error_behavior[TTCN_EncDec::ET_ALL] = {
diff --git a/core/Float.cc b/core/Float.cc
index 3169c5a2d1eadfbdd72607b4e7e1ca54b5dc8174..79331f91aa19747065e07a252484650eeb53da29 100644
--- a/core/Float.cc
+++ b/core/Float.cc
@@ -369,7 +369,7 @@ void FLOAT::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -848,7 +848,7 @@ const char* XER_NEG_INF_STR = "-INF";
 const char* XER_NAN_STR = "NaN";
 
 int FLOAT::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error(
diff --git a/core/Float.hh b/core/Float.hh
index 77a1f434a7b0af7273741b313d99628605ed8555..9755e7f5ad92930885497ca397ac16b38bcdfe59 100644
--- a/core/Float.hh
+++ b/core/Float.hh
@@ -150,7 +150,7 @@ public:
                  int sel_field=-1, boolean first_call=TRUE);
 
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                  unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   
diff --git a/core/Hexstring.cc b/core/Hexstring.cc
index d9dde38c99e27b3801f22252d486ea92e1fd7339..fb122287e08aed6706bc41ef2ca855e522259ee8 100644
--- a/core/Hexstring.cc
+++ b/core/Hexstring.cc
@@ -32,6 +32,7 @@
 #include "Encdec.hh"
 #include "RAW.hh"
 #include "Addfunc.hh"
+#include "Optional.hh"
 
 #include "../common/dbgnew.hh"
 
@@ -681,7 +682,7 @@ void HEXSTRING::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -848,7 +849,7 @@ extern char  base64_decoder_table[256];
 extern const char cb64[];
 
 int HEXSTRING::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error
@@ -1083,7 +1084,7 @@ int HEXSTRING::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_
   boolean use_default = p_td.json->default_value && 0 == p_tok.get_buffer_length();
   if (use_default) {
     // No JSON data in the buffer -> use default value
-    value = (char*)p_td.json->default_value;
+    value = const_cast<char*>(p_td.json->default_value);
     value_len = strlen(value);
   } else {
     dec_len = p_tok.get_next_token(&token, &value, &value_len);
diff --git a/core/Hexstring.hh b/core/Hexstring.hh
index 786fabc492fed15549fa1304ec633f188d4e188b..3fd48ff28195007fb21a3dfc24ddf77a0b7e1bd3 100644
--- a/core/Hexstring.hh
+++ b/core/Hexstring.hh
@@ -26,7 +26,6 @@
 
 #include "Basetype.hh"
 #include "Template.hh"
-#include "Optional.hh"
 #include "Error.hh"
 
 class INTEGER;
@@ -37,6 +36,9 @@ class HEXSTRING_ELEMENT;
 
 class Module_Param;
 
+template<typename T>
+class OPTIONAL;
+
 class HEXSTRING : public Base_Type {
 
   friend class HEXSTRING_ELEMENT;
@@ -143,7 +145,7 @@ public:
   int RAW_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&, int, raw_order_t,
                  boolean no_err=FALSE, int sel_field=-1, boolean first_call=TRUE);
   int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-    unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+    unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
     unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   
diff --git a/core/Integer.cc b/core/Integer.cc
index 2850f7d116491c028e6845bc720bd9f13f8b2036..1aa5ea81ad5b50490087fef929104cb60605d1b5 100644
--- a/core/Integer.cc
+++ b/core/Integer.cc
@@ -794,7 +794,7 @@ void INTEGER::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -1592,7 +1592,7 @@ int INTEGER::RAW_decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& buff,
 }
 
 int INTEGER::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-  unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if (!is_bound()) {
     TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND,
diff --git a/core/Integer.hh b/core/Integer.hh
index 9af7d7ea8a654c8bb679507ddb6964e566740164..596a2704b870893741f8d28c4c7b1e6c4648ddad 100644
--- a/core/Integer.hh
+++ b/core/Integer.hh
@@ -179,7 +179,7 @@ public:
   /** @brief Encode according to XML Encoding Rules.
    **/
   int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor,
-                 int indent, embed_values_enc_struct_t*) const;
+                 unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   /** @brief Decode according to XML Encoding Rules.
    **/
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
diff --git a/core/JSON.cc b/core/JSON.cc
index 900ece17fdda73906ac4587290f112b4725e4efe..b44fb1160af6095990de6edd10825be633d1d256 100644
--- a/core/JSON.cc
+++ b/core/JSON.cc
@@ -14,52 +14,52 @@
 #include "JSON.hh"
 
 // JSON descriptors for base types
-const TTCN_JSONdescriptor_t INTEGER_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t INTEGER_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t FLOAT_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t FLOAT_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t BOOLEAN_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t BOOLEAN_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t BITSTRING_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t BITSTRING_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t HEXSTRING_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t HEXSTRING_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t OCTETSTRING_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t OCTETSTRING_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t CHARSTRING_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t CHARSTRING_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t UNIVERSAL_CHARSTRING_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t UNIVERSAL_CHARSTRING_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t VERDICTTYPE_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t VERDICTTYPE_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t GeneralString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t GeneralString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t NumericString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t NumericString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t UTF8String_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t UTF8String_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t PrintableString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t PrintableString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t UniversalString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t UniversalString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t BMPString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t BMPString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t GraphicString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t GraphicString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t IA5String_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t IA5String_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t TeletexString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t TeletexString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t VideotexString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t VideotexString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t VisibleString_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t VisibleString_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t ASN_NULL_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t ASN_NULL_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t OBJID_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t OBJID_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t ASN_ROID_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t ASN_ROID_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t ASN_ANY_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t ASN_ANY_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
 
-const TTCN_JSONdescriptor_t ENUMERATED_json_ = { FALSE, NULL, FALSE, NULL };
+const TTCN_JSONdescriptor_t ENUMERATED_json_ = { FALSE, NULL, FALSE, NULL, FALSE };
\ No newline at end of file
diff --git a/core/Objid.cc b/core/Objid.cc
index bfdc4fe36fe36232dd690a18f85070c9aebba4ef..a04ccaac397ee8578be14bd44119f68b4c8572d9 100644
--- a/core/Objid.cc
+++ b/core/Objid.cc
@@ -27,6 +27,7 @@
 #include <limits.h>
 #include "../common/static_check.h"
 #include "Integer.hh"
+#include "Optional.hh"
 
 static const size_t MIN_COMPONENTS = 2;
 
@@ -297,7 +298,7 @@ void OBJID::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -501,7 +502,7 @@ boolean OBJID::BER_decode_TLV(const TTCN_Typedescriptor_t& p_td,
 
 
 int OBJID::XER_encode(const XERdescriptor_t& p_td,
-		  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+		  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND,
@@ -626,7 +627,7 @@ int OBJID::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok,
   boolean use_default = p_td.json->default_value && 0 == p_tok.get_buffer_length();
   if (use_default) {
     // No JSON data in the buffer -> use default value
-    value = (char*)p_td.json->default_value;
+    value = const_cast<char*>(p_td.json->default_value);
     value_len = strlen(value);
   } else {
     dec_len = p_tok.get_next_token(&token, &value, &value_len);
diff --git a/core/Objid.hh b/core/Objid.hh
index 04d4b0756610125c7b32b86e30c5802209537a8a..6e283a8b916e496095310e5b53a3c656b9aa1395 100644
--- a/core/Objid.hh
+++ b/core/Objid.hh
@@ -21,10 +21,11 @@
 #ifndef OBJID_HH
 #define OBJID_HH
 
-#include "Optional.hh"
-// the following are pulled in by Optional.hh:
-//#include "Basetype.hh"
-//#include "Template.hh"
+#include "Basetype.hh"
+#include "Template.hh"
+
+template<typename T>
+class OPTIONAL;
 
 class Text_Buf;
 class Module_Param;
@@ -103,7 +104,7 @@ public:
   boolean BER_decode_TLV(const TTCN_Typedescriptor_t& p_td,
                          const ASN_BER_TLV_t& p_tlv, unsigned L_form);
   int XER_encode(const XERdescriptor_t& p_td,
-                 TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                  unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   
diff --git a/core/Octetstring.cc b/core/Octetstring.cc
index c90a8be22d878909e5140c1511638eb6dadb2fbb..834edcf979f6e2ebaf7f05503846644ddbfe6ca1 100644
--- a/core/Octetstring.cc
+++ b/core/Octetstring.cc
@@ -34,6 +34,7 @@
 #include "BER.hh"
 #include "TEXT.hh"
 #include "Addfunc.hh"
+#include "Optional.hh"
 
 #include "../common/dbgnew.hh"
 #include <string.h>
@@ -630,7 +631,7 @@ void OCTETSTRING::encode(const TTCN_Typedescriptor_t& p_td,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While TEXT-encoding type '%s': ", p_td.name);
@@ -915,7 +916,7 @@ extern unsigned int xlate(cbyte* in, int phase, unsigned char* dest);
 extern const char cb64[];
 
 int OCTETSTRING::XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error
@@ -1306,7 +1307,7 @@ int OCTETSTRING::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer&
   boolean use_default = p_td.json->default_value && 0 == p_tok.get_buffer_length();
   if (use_default) {
     // No JSON data in the buffer -> use default value
-    value = (char*)p_td.json->default_value;
+    value = const_cast<char*>(p_td.json->default_value);
     value_len = strlen(value);
   } else {
     dec_len = p_tok.get_next_token(&token, &value, &value_len);
diff --git a/core/Octetstring.hh b/core/Octetstring.hh
index f104eaf1ed4f9e720b0b478c92eabfbaf1652b7a..795538d52e01d9c5ad490cceccdde555990acf00 100644
--- a/core/Octetstring.hh
+++ b/core/Octetstring.hh
@@ -28,7 +28,6 @@
 
 #include "Basetype.hh"
 #include "Template.hh"
-#include "Optional.hh"
 #include "Error.hh"
 
 class INTEGER;
@@ -38,6 +37,9 @@ class CHARSTRING;
 class OCTETSTRING_ELEMENT;
 class Module_Param;
 
+template<typename T>
+class OPTIONAL;
+
 // octetstring value class
 
 class OCTETSTRING : public Base_Type {
@@ -173,7 +175,7 @@ public:
   int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&,  Limit_Token_List&,
                  boolean no_err=FALSE, boolean first_call=TRUE);
   int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-                 unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+                 unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
                  unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   
diff --git a/core/Optional.hh b/core/Optional.hh
index 5a079914f28b3aed3cd71b286d2d22801078cef3..e3b35f052898b48504b933662e1289b44a04181c 100644
--- a/core/Optional.hh
+++ b/core/Optional.hh
@@ -283,11 +283,11 @@ public:
 #endif
 
   int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor,
-    int indent, embed_values_enc_struct_t* emb_val) const;
+    unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const;
 #ifdef TITAN_RUNTIME_2
   int XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
     const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor,
-    int indent, embed_values_enc_struct_t* emb_val) const;
+    unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const;
 #endif
   /** Used during XML decoding, in case this object is an AnyElement field in a record.
     * Determines whether XER_decode() should be called or this field should be omitted.
@@ -302,7 +302,7 @@ public:
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
     unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t* emb_val);
 
-  char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const;
+  char ** collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int flavor = 0) const;
 
   operator T_type&();
   operator const T_type&() const;
@@ -981,7 +981,8 @@ int OPTIONAL<T_type>::RAW_decode(const TTCN_Typedescriptor_t& p_td,
 
 template<typename T_type>
 int
-OPTIONAL<T_type>::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const
+OPTIONAL<T_type>::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor,
+  unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const
 {
 #ifdef TITAN_RUNTIME_2
   switch (get_selection()) {
@@ -989,7 +990,7 @@ OPTIONAL<T_type>::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsi
   switch (optional_selection) {
 #endif
   case OPTIONAL_PRESENT:
-    return optional_value->XER_encode(p_td, buf, flavor, indent, emb_val);
+    return optional_value->XER_encode(p_td, buf, flavor, flavor2, indent, emb_val);
   case OPTIONAL_OMIT:
     return 0; // nothing to do !
   default:
@@ -1003,12 +1004,12 @@ OPTIONAL<T_type>::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsi
 template<typename T_type>
 int
 OPTIONAL<T_type>::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
-  const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, int indent,
-  embed_values_enc_struct_t* emb_val) const
+  const XERdescriptor_t& p_td, TTCN_Buffer& buf, unsigned int flavor, unsigned int flavor2,
+  int indent, embed_values_enc_struct_t* emb_val) const
 {
   switch (get_selection()) {
   case OPTIONAL_PRESENT:
-    return optional_value->XER_encode_negtest(p_err_descr, p_td, buf, flavor, indent, emb_val);
+    return optional_value->XER_encode_negtest(p_err_descr, p_td, buf, flavor, flavor2, indent, emb_val);
   case OPTIONAL_OMIT:
     return 0; // nothing to do !
   default:
@@ -1098,7 +1099,7 @@ OPTIONAL<T_type>::XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
             || ( (p_td.xer_bits & UNTAGGED) && !reader.IsEmptyElement())
           // If the optional field (a string) has anyElement, accept the element
           // regardless of its name. Else the name (and namespace) must match.
-          || T_type::can_start(name, ns_uri, p_td, flavor)) { // it is us
+          || T_type::can_start(name, ns_uri, p_td, flavor, flavor2)) { // it is us
           found_it:
           set_to_present();
           //success = reader.Read(); // move to next thing TODO should it loop till an element ?
@@ -1128,7 +1129,7 @@ finished:
 }
 
 template<typename T_type>
-char ** OPTIONAL<T_type>::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const {
+char ** OPTIONAL<T_type>::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int /*flavor*/) const {
 #ifdef TITAN_RUNTIME_2
   switch (get_selection()) {
 #else
diff --git a/core/ProfilerTools.cc b/core/ProfilerTools.cc
index 3d32dbbf37fffba898e13ae4be0a4b1ecfd808d1..f3d854eaedb062be5f37594727a6d2462f195f40 100644
--- a/core/ProfilerTools.cc
+++ b/core/ProfilerTools.cc
@@ -489,8 +489,8 @@ namespace Profiler_Tools {
 
   // Compare function for sorting stats data based on total execution time (descending)
   int stats_data_cmp_time(const void* p_left, const void* p_right) {
-    const stats_data_t* p_left_data = (stats_data_t*)p_left;
-    const stats_data_t* p_right_data = (stats_data_t*)p_right;
+    const stats_data_t* p_left_data = (const stats_data_t*)p_left;
+    const stats_data_t* p_right_data = (const stats_data_t*)p_right;
     if (p_left_data->total_time.tv_sec > p_right_data->total_time.tv_sec) return -1;
     if (p_left_data->total_time.tv_sec < p_right_data->total_time.tv_sec) return 1;
     if (p_left_data->total_time.tv_usec > p_right_data->total_time.tv_usec) return -1;
@@ -500,13 +500,13 @@ namespace Profiler_Tools {
 
   // Compare function for sorting stats data based on execution count (descending)
   int stats_data_cmp_count(const void* p_left, const void* p_right) {
-    return ((stats_data_t*)p_right)->exec_count - ((stats_data_t*)p_left)->exec_count;
+    return ((const stats_data_t*)p_right)->exec_count - ((const stats_data_t*)p_left)->exec_count;
   }
 
   // Compare function for sorting stats data based on total time per execution count (descending)
   int stats_data_cmp_avg(const void* p_left, const void* p_right) {
-    const stats_data_t* p_left_data = (stats_data_t*)p_left;
-    const stats_data_t* p_right_data = (stats_data_t*)p_right;
+    const stats_data_t* p_left_data = (const stats_data_t*)p_left;
+    const stats_data_t* p_right_data = (const stats_data_t*)p_right;
     double left_time = p_left_data->total_time.tv_sec + p_left_data->total_time.tv_usec / 1000000.0;
     double right_time = p_right_data->total_time.tv_sec + p_right_data->total_time.tv_usec / 1000000.0;
     double diff = (right_time / p_right_data->exec_count) - (left_time / p_left_data->exec_count);
diff --git a/core/Universal_charstring.cc b/core/Universal_charstring.cc
index dd5b5f2c463094c6b6484010d78f1219fb177e36..992688a2afdedd18cae5eee98f2046a158488ce9 100644
--- a/core/Universal_charstring.cc
+++ b/core/Universal_charstring.cc
@@ -1138,7 +1138,7 @@ void UNIVERSAL_CHARSTRING::encode(const TTCN_Typedescriptor_t& p_td,
     default: // nothing to do
       break;
     }
-    XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer,p_buf, XER_coding, 0, 0, 0);
     p_buf.put_c('\n');
     break; }
   case TTCN_EncDec::CT_JSON: {
@@ -1778,7 +1778,7 @@ boolean UNIVERSAL_CHARSTRING::BER_decode_TLV
 extern void xml_escape(const unsigned int c, TTCN_Buffer& p_buf);
 
 int UNIVERSAL_CHARSTRING::XER_encode(const XERdescriptor_t& p_td,
-    TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+    TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   if(!is_bound()) {
     TTCN_EncDec_ErrorContext::error(TTCN_EncDec::ET_UNBOUND,
diff --git a/core/Universal_charstring.hh b/core/Universal_charstring.hh
index 6a0940694c145dc3661ea88fd1752ea14c8d78df..436a0baccc25618c91f1351efa7610a9fc380d3c 100644
--- a/core/Universal_charstring.hh
+++ b/core/Universal_charstring.hh
@@ -264,6 +264,10 @@ public:
 
   int lengthof() const;
   
+  /* returns the CHARSTRING representation of this. Quadruples are converted
+   into the form: \q{group,plane,row,cell} */
+  CHARSTRING get_stringRepr_for_pattern() const;
+  
   void dump() const;
 
 private:
@@ -272,9 +276,6 @@ private:
   
   UNIVERSAL_CHARSTRING extract_matched_section(int start, int end) const;
 
-  /* returns the CHARSTRING representation of this. Quadruples are converted
-     into the form: \q{group,plane,row,cell} */
-  CHARSTRING get_stringRepr_for_pattern() const;
 
   void convert_cstr_to_uni();
 //checks if an valid BOM is at the head of the string. Returns the length of BOM
@@ -361,7 +362,7 @@ public:
                  TTCN_Buffer&) const;
   int TEXT_decode(const TTCN_Typedescriptor_t&, TTCN_Buffer&,  Limit_Token_List&,
                   boolean no_err=FALSE, boolean first_call=TRUE);
-  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, int, embed_values_enc_struct_t*) const;
+  int XER_encode(const XERdescriptor_t&, TTCN_Buffer&, unsigned int, unsigned int, int, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t&, XmlReaderWrap& reader, unsigned int, unsigned int, embed_values_dec_struct_t*);
   /** Decodes UTF-8 into the internal representation (UCS4-BE)
    *
diff --git a/core/Verdicttype.cc b/core/Verdicttype.cc
index fe24ee04c304f4d2d4432b70cf373960497bedc6..7225a07e24e8d1fa587be82587f533fad9468a87 100644
--- a/core/Verdicttype.cc
+++ b/core/Verdicttype.cc
@@ -26,6 +26,7 @@
 #include "Error.hh"
 #include "Logger.hh"
 #include "Textbuf.hh"
+#include "Optional.hh"
 
 #include "../common/dbgnew.hh"
 
@@ -185,7 +186,7 @@ void VERDICTTYPE::encode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0);
+    XER_encode(*p_td.xer, p_buf, XER_coding, 0, 0, 0);
     break;}
   case TTCN_EncDec::CT_JSON: {
     TTCN_EncDec_ErrorContext ec("While JSON-encoding type '%s': ", p_td.name);
@@ -284,7 +285,7 @@ void VERDICTTYPE::decode(const TTCN_Typedescriptor_t& p_td, TTCN_Buffer& p_buf,
 
 
 int VERDICTTYPE::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-  unsigned int p_flavor, int p_indent, embed_values_enc_struct_t*) const
+  unsigned int p_flavor, unsigned int /*p_flavor2*/, int p_indent, embed_values_enc_struct_t*) const
 {
   int encoded_length=(int)p_buf.get_len();
   //const boolean e_xer = is_exer(p_flavor);
@@ -389,7 +390,7 @@ int VERDICTTYPE::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer&
   boolean use_default = p_td.json->default_value && 0 == p_tok.get_buffer_length();
   if (use_default) {
     // No JSON data in the buffer -> use default value
-    value = (char*)p_td.json->default_value;
+    value = const_cast<char*>(p_td.json->default_value);
     value_len = strlen(value);
   } else {
     dec_len = p_tok.get_next_token(&token, &value, &value_len);
diff --git a/core/Verdicttype.hh b/core/Verdicttype.hh
index 67f71f0641a9deefa84a95432a924e4885c2e16f..6b401a15224e32f3370ad0855b141ca47c9293b6 100644
--- a/core/Verdicttype.hh
+++ b/core/Verdicttype.hh
@@ -23,10 +23,12 @@
 
 #include "Basetype.hh"
 #include "Template.hh"
-#include "Optional.hh"
 
 class Module_Param;
 
+template<typename T>
+class OPTIONAL;
+
 /// verdicttype value class
 
 class VERDICTTYPE: public Base_Type {
@@ -96,7 +98,7 @@ public:
               TTCN_EncDec::coding_t p_coding, ...);
 
   int XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-    unsigned int flavor, int indent, embed_values_enc_struct_t*) const;
+    unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const;
   int XER_decode(const XERdescriptor_t& p_td, XmlReaderWrap& reader,
     unsigned int flavor, unsigned int flavor2, embed_values_dec_struct_t*);
   
diff --git a/core/XER.hh b/core/XER.hh
index 723536146da01297d202dc0e508cdda99cda2826..c984c857bb971f932fa1524bb2a856f8aaa39a32 100644
--- a/core/XER.hh
+++ b/core/XER.hh
@@ -106,7 +106,8 @@ enum XER_flavor {
 };
 
 enum XER_flavor2 {
-    USE_NIL_PARENT_TAG = 1U << 0 // Content field has attribute that was read by parent
+    USE_NIL_PARENT_TAG = 1U << 0, // Content field has attribute that was read by parent
+    FROM_UNION_USETYPE = 1U << 1 // When the parent of a useUnion field is a union with useType
 };
 
 /** WHITESPACE actions.
diff --git a/core2/Basetype2.cc b/core2/Basetype2.cc
index 25ee272a2245e300fbae2deab31b374104799d4c..d82e04657b86d687ac2edf95374ceeb0a501259c 100644
--- a/core2/Basetype2.cc
+++ b/core2/Basetype2.cc
@@ -197,9 +197,9 @@ int Base_Type::JSON_encode_negtest_raw(JSON_Tokenizer&) const
 }
 
 int Base_Type::XER_encode_negtest(const Erroneous_descriptor_t* /*p_err_descr*/,
-  const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t*) const
 {
-  return XER_encode(p_td, p_buf, flavor, indent, 0); // ignore erroneous
+  return XER_encode(p_td, p_buf, flavor, flavor2, indent, 0); // ignore erroneous
 }
 
 int Base_Type::RAW_encode_negtest(const Erroneous_descriptor_t *,
@@ -1685,7 +1685,7 @@ void Record_Of_Type::encode(const TTCN_Typedescriptor_t& p_td,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0);
+    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0, 0);
     p_buf.put_c('\n');
     break;}
   case TTCN_EncDec::CT_JSON: {
@@ -1775,7 +1775,7 @@ void Record_Of_Type::decode(const TTCN_Typedescriptor_t& p_td,
   va_end(pvar);
 }
 
-char **Record_Of_Type::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const
+char **Record_Of_Type::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int /*flavor*/) const
 {
   size_t num_collected = 0;
   // First, our own namespace. Sets num_collected to 0 or 1.
@@ -1809,10 +1809,10 @@ static const universal_char sp = { 0,0,0,' ' };
 static const universal_char tb = { 0,0,0,9 };
 
 int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-  unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val) const
+  unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const
 {
   if (err_descr) {
-    return XER_encode_negtest(err_descr, p_td, p_buf, flavor, indent, emb_val);
+    return XER_encode_negtest(err_descr, p_td, p_buf, flavor, flavor2, indent, emb_val);
   }
 
   if (val_ptr == 0) TTCN_error(
@@ -1828,7 +1828,7 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
 
   flavor = flavor
     | ( (exer && (p_td.xer_bits & XER_LIST))
-      || is_exerlist(flavor) ? SIMPLE_TYPE : 0);
+      || is_exerlist(flavor) ? SIMPLE_TYPE : XER_NONE /* = 0 */);
   flavor &= ~XER_RECOF; // record-of doesn't care
   int nof_elements = get_nof_elements();
   Base_Type::begin_xml(p_td, p_buf, flavor, indent, !nof_elements,
@@ -1902,7 +1902,7 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
           check_namespace_restrictions(p_td, (const char*)cs);
         }
         before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf,
-          flavor | ANY_ATTRIBUTES, indent, 0);
+          flavor | ANY_ATTRIBUTES, flavor2, indent, 0);
 
         p_buf.put_c('\'');
         p_buf.put_c(' ');
@@ -1924,7 +1924,7 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
 
       UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(*elem) + j);
       after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf,
-        flavor | ANY_ATTRIBUTES, indent, 0);
+        flavor | ANY_ATTRIBUTES, flavor2, indent, 0);
       
       // Put this attribute in a dummy element and walk through it to check its validity
       TTCN_Buffer check_buf;
@@ -1947,13 +1947,13 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
       if (i > 0 && !own_tag && 0 != emb_val &&
           emb_val->embval_index < emb_val->embval_array->size_of()) {
         emb_val->embval_array->get_at(emb_val->embval_index)->XER_encode(
-          UNIVERSAL_CHARSTRING_xer_, p_buf, flavor | EMBED_VALUES, indent+1, 0);
+          UNIVERSAL_CHARSTRING_xer_, p_buf, flavor | EMBED_VALUES, flavor2, indent+1, 0);
         ++emb_val->embval_index;
       }
       ec_1.set_msg("%d: ", i);
       if (exer && (p_td.xer_bits & XER_LIST) && i>0) p_buf.put_c(' ');
       get_at(i)->XER_encode(*p_td.oftype_descr, p_buf,
-        sub_flavor, indent+own_tag, emb_val);
+        sub_flavor, flavor2, indent+own_tag, emb_val);
     }
 
     if (indenting && nof_elements && !is_exerlist(flavor)) {
@@ -1983,7 +1983,7 @@ int Record_Of_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
  */
 int Record_Of_Type::encode_element(int i, const XERdescriptor_t& p_td,
   const Erroneous_values_t* ev, const Erroneous_descriptor_t* ed,
-  TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent, embed_values_enc_struct_t* emb_val) const
+  TTCN_Buffer& p_buf, unsigned int sub_flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const
 {
   int enc_len = p_buf.get_len();
   TTCN_EncDec_ErrorContext ec;
@@ -2000,7 +2000,7 @@ int Record_Of_Type::encode_element(int i, const XERdescriptor_t& p_td,
       if (ev->before->type_descr==NULL) TTCN_error(
         "internal error: erroneous before type descriptor missing");
       ev->before->errval->XER_encode(*ev->before->type_descr->xer,
-        p_buf, sub_flavor, indent, 0);
+        p_buf, sub_flavor, flavor2, indent, 0);
     }
   }
 
@@ -2020,16 +2020,16 @@ int Record_Of_Type::encode_element(int i, const XERdescriptor_t& p_td,
         if (ev->value->type_descr==NULL) TTCN_error(
           "internal error: erroneous value type descriptor missing");
         ev->value->errval->XER_encode(*ev->value->type_descr->xer,
-          p_buf, sub_flavor, indent, 0);
+          p_buf, sub_flavor, flavor2, indent, 0);
       }
     } // else -> omit
   } else {
     ec.set_msg("Component #%d: ", i);
     if (ed) {
-      get_at(i)->XER_encode_negtest(ed, p_td, p_buf, sub_flavor, indent, emb_val);
+      get_at(i)->XER_encode_negtest(ed, p_td, p_buf, sub_flavor, flavor2, indent, emb_val);
     } else {
       // the "real" encoder
-      get_at(i)->XER_encode(p_td, p_buf, sub_flavor, indent, emb_val);
+      get_at(i)->XER_encode(p_td, p_buf, sub_flavor, flavor2, indent, emb_val);
     }
   }
 
@@ -2044,7 +2044,7 @@ int Record_Of_Type::encode_element(int i, const XERdescriptor_t& p_td,
       if (ev->after->type_descr==NULL) TTCN_error(
         "internal error: erroneous after type descriptor missing");
       ev->after->errval->XER_encode(*ev->after->type_descr->xer,
-        p_buf, sub_flavor, indent, 0);
+        p_buf, sub_flavor, flavor2, indent, 0);
     }
   }
 
@@ -2053,7 +2053,7 @@ int Record_Of_Type::encode_element(int i, const XERdescriptor_t& p_td,
 
 // XERSTUFF Record_Of_Type::XER_encode_negtest
 int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
-  const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, int indent,
+  const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned flavor, unsigned int flavor2, int indent,
   embed_values_enc_struct_t* emb_val) const
 {
   if (val_ptr == 0) TTCN_error(
@@ -2069,7 +2069,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
 
   flavor = flavor
     | ( (exer && (p_td.xer_bits & XER_LIST))
-      || is_exerlist(flavor) ? SIMPLE_TYPE : 0);
+      || is_exerlist(flavor) ? SIMPLE_TYPE : XER_NONE /* = 0 */);
   flavor &= ~XER_RECOF; // record-of doesn't care
   int nof_elements = get_nof_elements();
   Base_Type::begin_xml(p_td, p_buf, flavor, indent, !nof_elements,
@@ -2116,7 +2116,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
           if (ev->before->type_descr==NULL) TTCN_error(
             "internal error: erroneous before type descriptor missing");
           else ev->before->errval->XER_encode(*ev->before->type_descr->xer,
-            p_buf, flavor, indent, 0);
+            p_buf, flavor, flavor2, indent, 0);
         }
       }
 
@@ -2127,7 +2127,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
             if (ev->value->type_descr==NULL) TTCN_error(
               "internal error: erroneous value type descriptor missing");
             else ev->value->errval->XER_encode(*ev->value->type_descr->xer,
-              p_buf, flavor, indent, 0);
+              p_buf, flavor, flavor2, indent, 0);
           }
         }
       }
@@ -2168,7 +2168,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
 
             UNIVERSAL_CHARSTRING before(sp_at, (const universal_char*)(*elem));
             before.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf,
-              flavor | ANY_ATTRIBUTES, indent, 0);
+              flavor | ANY_ATTRIBUTES, flavor2, indent, 0);
 
             p_buf.put_c('\'');
             p_buf.put_c(' ');
@@ -2185,7 +2185,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
 
           UNIVERSAL_CHARSTRING after(len - j, (const universal_char*)(*elem) + j);
           after.XER_encode(UNIVERSAL_CHARSTRING_xer_, p_buf,
-            flavor | ANY_ATTRIBUTES, indent, 0);
+            flavor | ANY_ATTRIBUTES, flavor2, indent, 0);
         }
       }
 
@@ -2198,7 +2198,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
             if (ev->after->type_descr==NULL) TTCN_error(
               "internal error: erroneous after type descriptor missing");
             else ev->after->errval->XER_encode(*ev->after->type_descr->xer,
-              p_buf, flavor, indent, 0);
+              p_buf, flavor, flavor2, indent, 0);
           }
         }
       }
@@ -2227,7 +2227,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
           ed0_i = emb_val->embval_err->next_field_emb_descr (emb_val->embval_index, emb_val->embval_err_descr_idx);
         }
         emb_val->embval_array->encode_element(emb_val->embval_index, UNIVERSAL_CHARSTRING_xer_,
-          ev0_i, ed0_i, p_buf, flavor | EMBED_VALUES, indent + own_tag, 0);
+          ev0_i, ed0_i, p_buf, flavor | EMBED_VALUES, flavor2, indent + own_tag, 0);
         ++emb_val->embval_index;
       }
 
@@ -2236,7 +2236,7 @@ int Record_Of_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr
       const Erroneous_descriptor_t* emb_descr =
         p_err_descr->next_field_emb_descr (i, edescr_idx);
 
-      encode_element(i, *p_td.oftype_descr, err_vals, emb_descr, p_buf, sub_flavor, indent+own_tag, emb_val);
+      encode_element(i, *p_td.oftype_descr, err_vals, emb_descr, p_buf, sub_flavor, flavor2, indent+own_tag, emb_val);
 
       // omit_after value -1 becomes "very big"
       if ((unsigned int)i >= (unsigned int)p_err_descr->omit_after) break;
@@ -2390,7 +2390,7 @@ int Record_Of_Type::XER_decode(const XERdescriptor_t& p_td,
              * belong to the embedded type, the record-of has already ended. */
             if (!own_tag && !can_start_v(
               (const char*)reader.LocalName(), (const char*)reader.NamespaceUri(),
-              p_td, flavor | UNTAGGED))
+              p_td, flavor | UNTAGGED, flavor2))
             {
               for (; success == 1 && reader.Depth() > depth; success = reader.Read()) ;
               // We should now be back at the same depth as we started.
@@ -2863,7 +2863,7 @@ void Record_Type::encode(const TTCN_Typedescriptor_t& p_td,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0);
+    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0, 0);
     p_buf.put_c('\n');
     break;}
   case TTCN_EncDec::CT_JSON: {
@@ -4057,7 +4057,7 @@ const XERdescriptor_t* Record_Type::xer_descr(int /*field_index*/) const
   return NULL;
 }
 
-char ** Record_Type::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns) const
+char ** Record_Type::collect_ns(const XERdescriptor_t& p_td, size_t& num, bool& def_ns, unsigned int /*flavor*/) const
 {
   const int field_cnt = get_count();
   // The USE-ORDER member is first, unless preempted by EMBED-VALUES
@@ -4118,10 +4118,10 @@ int Record_Type::get_index_byname(const char *name, const char *uri) const {
 }
 
 int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
-  unsigned int flavor, int indent, embed_values_enc_struct_t* emb_val_parent) const
+  unsigned int flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val_parent) const
 {
   if (err_descr) {
-    return XER_encode_negtest(err_descr, p_td, p_buf, flavor, indent, 0);
+    return XER_encode_negtest(err_descr, p_td, p_buf, flavor, flavor2, indent, 0);
   }
   if (!is_bound()) {
     TTCN_EncDec_ErrorContext::error
@@ -4236,7 +4236,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
     const Base_Type * const q_uri = get_at(0);
     if (q_uri->is_present()) {
       p_buf.put_s(11, (cbyte*)" xmlns:b0='");
-      q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, indent+1, 0);
+      q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, flavor2, indent+1, 0);
       p_buf.put_c('\'');
     }
 
@@ -4248,18 +4248,18 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
       sub_len += 3;
     }
     const Base_Type* const q_name = get_at(1);
-    sub_len += q_name->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, indent+1, 0);
+    sub_len += q_name->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, flavor2, indent+1, 0);
     if (p_td.xer_bits & XER_ATTRIBUTE) p_buf.put_c('\'');
   }
   else { // not USE-QNAME
     if (!exer && (p_td.xer_bits & EMBED_VALUES) && embed_values != NULL) {
       // The EMBED-VALUES member as an ordinary record of string
-      sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, indent+1, 0);
+      sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, flavor2, indent+1, 0);
     }
 
     if (!exer && (p_td.xer_bits & USE_ORDER)) {
       // The USE-ORDER member as an ordinary record of enumerated
-      sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, indent+1, 0);
+      sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, flavor2, indent+1, 0);
     }
 
     if (exer && (indent==0 || (flavor & DEF_NS_SQUASHED))) // write namespaces for toplevel only
@@ -4286,7 +4286,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
     for (i = start_at; i < first_nonattr; ++i) {
       boolean is_xer_attr_field = xer_descr(i)->xer_bits & XER_ATTRIBUTE;
       ec_1.set_msg("%s': ", fld_name(i)); // attr
-      int tmp_len = get_at(i)->XER_encode(*xer_descr(i), p_buf, flavor, indent+1, 0);
+      int tmp_len = get_at(i)->XER_encode(*xer_descr(i), p_buf, flavor, flavor2, indent+1, 0);
       if (is_xer_attr_field && !exer) sub_len += tmp_len; /* do not add if attribute and EXER */
     }
 
@@ -4322,7 +4322,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
       /* write the first string */
       if (embed_values != NULL && embed_values->size_of() > 0) {
         sub_len += embed_values->get_at(0)->XER_encode(UNIVERSAL_CHARSTRING_xer_,
-          p_buf, flavor | EMBED_VALUES, indent+1, 0);
+          p_buf, flavor | EMBED_VALUES, flavor2, indent+1, 0);
       }
     }
 
@@ -4421,7 +4421,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
         if (p_td.xer_bits & UNTAGGED && i > 0 && exer && embed_values == NULL && 0 != emb_val_parent &&
           emb_val_parent->embval_index < emb_val_parent->embval_array->size_of()) {
           emb_val_parent->embval_array->get_at(emb_val_parent->embval_index)->XER_encode(UNIVERSAL_CHARSTRING_xer_
-            , p_buf, flavor | EMBED_VALUES, indent+1, 0);
+            , p_buf, flavor | EMBED_VALUES, flavor2, indent+1, 0);
           ++emb_val_parent->embval_index;
         }
         
@@ -4436,13 +4436,13 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
           // because the tag-stripping effect of USE-NIL has been achieved
           // by encoding the sub-fields directly).
           flavor | ((exer && !use_order && (i == field_cnt-1)) ? (p_td.xer_bits & USE_NIL) : 0),
-          indent+!omit_tag, emb_val);
+          flavor2, indent+!omit_tag, emb_val);
 
         // Now the next embed-values string (NOT affected by USE-ORDER!)
         if (exer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val &&
             embed_values != NULL && emb_val->embval_index < embed_values->size_of() && ordered->get_at(ai)->is_present()) {
           embed_values->get_at(emb_val->embval_index)->XER_encode(UNIVERSAL_CHARSTRING_xer_
-            , p_buf, flavor | EMBED_VALUES, indent+1, 0);
+            , p_buf, flavor | EMBED_VALUES, flavor2, indent+1, 0);
           ++emb_val->embval_index;
         }
       } //for
@@ -4509,7 +4509,7 @@ int Record_Type::XER_encode(const XERdescriptor_t& p_td, TTCN_Buffer& p_buf,
  */
 int Record_Type::encode_field(int i,
   const Erroneous_values_t* err_vals, const Erroneous_descriptor_t* emb_descr,
-  TTCN_Buffer& p_buf, unsigned int sub_flavor, int indent, embed_values_enc_struct_t* emb_val) const
+  TTCN_Buffer& p_buf, unsigned int sub_flavor, unsigned int flavor2, int indent, embed_values_enc_struct_t* emb_val) const
 {
   int enc_len = 0;
   TTCN_EncDec_ErrorContext ec;
@@ -4523,7 +4523,7 @@ int Record_Type::encode_field(int i,
       if (err_vals->before->type_descr==NULL) TTCN_error(
         "internal error: erroneous before typedescriptor missing");
       enc_len += err_vals->before->errval->XER_encode(
-        *err_vals->before->type_descr->xer, p_buf, sub_flavor, indent, 0);
+        *err_vals->before->type_descr->xer, p_buf, sub_flavor, flavor2, indent, 0);
     }
   }
 
@@ -4536,18 +4536,18 @@ int Record_Type::encode_field(int i,
         if (err_vals->value->type_descr==NULL) TTCN_error(
           "internal error: erroneous value typedescriptor missing");
         enc_len += err_vals->value->errval->XER_encode(
-          *err_vals->value->type_descr->xer, p_buf, sub_flavor, indent, 0);
+          *err_vals->value->type_descr->xer, p_buf, sub_flavor, flavor2, indent, 0);
       }
     } // else -> omit
   } else {
     ec.set_msg("Component %s: ", fld_name(i));
     if (emb_descr) {
       enc_len += get_at(i)->XER_encode_negtest(emb_descr, *xer_descr(i), p_buf,
-        sub_flavor, indent, emb_val);
+        sub_flavor, flavor2, indent, emb_val);
     } else {
       // the "real" encoder
       enc_len += get_at(i)->XER_encode(*xer_descr(i), p_buf,
-        sub_flavor, indent, emb_val);
+        sub_flavor, flavor2, indent, emb_val);
     }
   }
 
@@ -4561,7 +4561,7 @@ int Record_Type::encode_field(int i,
       if (err_vals->after->type_descr==NULL) TTCN_error(
         "internal error: erroneous after typedescriptor missing");
       enc_len += err_vals->after->errval->XER_encode(
-        *err_vals->after->type_descr->xer, p_buf, sub_flavor, indent, 0);
+        *err_vals->after->type_descr->xer, p_buf, sub_flavor, flavor2, indent, 0);
     }
   }
 
@@ -4570,7 +4570,7 @@ int Record_Type::encode_field(int i,
 
 // XERSTUFF Record_Type::XER_encode_negtest
 int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
-  const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, int indent,
+  const XERdescriptor_t& p_td, TTCN_Buffer& p_buf, unsigned int flavor, unsigned int flavor2, int indent,
   embed_values_enc_struct_t*) const
 {
   if (!is_bound()) {
@@ -4695,7 +4695,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
         if (ev->before->type_descr==NULL) TTCN_error(
           "internal error: erroneous before typedescriptor missing");
         sub_len += ev->before->errval->XER_encode(
-          *ev->before->type_descr->xer, p_buf, flavor, indent, 0);
+          *ev->before->type_descr->xer, p_buf, flavor, flavor2, indent, 0);
       }
     }
 
@@ -4708,7 +4708,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
           if (ev->value->type_descr==NULL) TTCN_error(
             "internal error: erroneous value typedescriptor missing");
           sub_len += ev->value->errval->XER_encode(
-            *ev->value->type_descr->xer, p_buf, flavor, indent, 0);
+            *ev->value->type_descr->xer, p_buf, flavor, flavor2, indent, 0);
         }
       } // else -> omit
     } else {
@@ -4722,7 +4722,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
         // the "real" encoder
         if (q_uri->is_present()) {
           p_buf.put_s(11, (cbyte*)" xmlns:b0='");
-          sub_len += q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, indent+1, 0);
+          sub_len += q_uri->XER_encode(*xer_descr(0), p_buf, flavor | XER_LIST, flavor2, indent+1, 0);
           p_buf.put_c('\'');
         }
       }
@@ -4738,7 +4738,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
         if (ev->after->type_descr==NULL) TTCN_error(
           "internal error: erroneous after typedescriptor missing");
         sub_len += ev->after->errval->XER_encode(
-          *ev->after->type_descr->xer, p_buf, flavor, indent, 0);
+          *ev->after->type_descr->xer, p_buf, flavor, flavor2, indent, 0);
       }
     }
 
@@ -4759,7 +4759,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
         if (ev->before->type_descr==NULL) TTCN_error(
           "internal error: erroneous before typedescriptor missing");
         sub_len += ev->before->errval->XER_encode(
-          *ev->before->type_descr->xer, p_buf, flavor, indent, 0);
+          *ev->before->type_descr->xer, p_buf, flavor, flavor2, indent, 0);
       }
     }
 
@@ -4772,7 +4772,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
           if (ev->value->type_descr==NULL) TTCN_error(
             "internal error: erroneous value typedescriptor missing");
           sub_len += ev->value->errval->XER_encode(
-            *ev->value->type_descr->xer, p_buf, flavor, indent, 0);
+            *ev->value->type_descr->xer, p_buf, flavor, flavor2, indent, 0);
         }
       } // else -> omit
     } else {
@@ -4787,7 +4787,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
           sub_len += 3;
         }
 
-        sub_len += get_at(1)->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, indent+1, 0);
+        sub_len += get_at(1)->XER_encode(*xer_descr(1), p_buf, flavor | XER_LIST, flavor2, indent+1, 0);
       }
     }
 
@@ -4801,7 +4801,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
         if (ev->after->type_descr==NULL) TTCN_error(
           "internal error: erroneous after typedescriptor missing");
         sub_len += ev->after->errval->XER_encode(
-          *ev->after->type_descr->xer, p_buf, flavor, indent, 0);
+          *ev->after->type_descr->xer, p_buf, flavor, flavor2, indent, 0);
       }
     }
 
@@ -4810,12 +4810,12 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
   else { // not USE-QNAME
     if (!exer && (p_td.xer_bits & EMBED_VALUES)) {
       // The EMBED-VALUES member as an ordinary record of string
-      sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, indent+1, 0);
+      sub_len += embed_values->XER_encode(*xer_descr(0), p_buf, flavor, flavor2, indent+1, 0);
     }
 
     if (!exer && (p_td.xer_bits & USE_ORDER)) {
       // The USE-ORDER member as an ordinary record of enumerated
-      sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, indent+1, 0);
+      sub_len += use_order->XER_encode(*xer_descr(uo_index), p_buf, flavor, flavor2, indent+1, 0);
     }
 
     if (exer && (indent==0 || (flavor & DEF_NS_SQUASHED))) // write namespaces for toplevel only
@@ -4856,7 +4856,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
       boolean is_xer_attr_field = xer_descr(i)->xer_bits & XER_ATTRIBUTE;
       ec_1.set_msg("%s': ", fld_name(i)); // attr
 
-      tmp_len = encode_field(i, ev, ed, p_buf, flavor, indent + !omit_tag, 0);
+      tmp_len = encode_field(i, ev, ed, p_buf, flavor, flavor2, indent + !omit_tag, 0);
 
       if (is_xer_attr_field && !exer) sub_len += tmp_len; // do not add if attribute and EXER
 
@@ -4933,7 +4933,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
           ed0_0 = ed0->next_field_emb_descr (0, embed_values_descr_idx);
         }
         sub_len += embed_values->encode_element(0, UNIVERSAL_CHARSTRING_xer_,
-          ev0_0, ed0_0, p_buf, flavor | EMBED_VALUES, indent+!omit_tag, 0);
+          ev0_0, ed0_0, p_buf, flavor | EMBED_VALUES, flavor2, indent+!omit_tag, 0);
       }
     }
 
@@ -5075,7 +5075,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
           // because the tag-stripping effect of USE-NIL has been achieved
           // by encoding the sub-fields directly).
           flavor | ((exer && !use_order && (i == field_cnt-1)) ? (p_td.xer_bits & USE_NIL) : 0),
-          indent + !omit_tag, emb_val);
+          flavor2, indent + !omit_tag, emb_val);
 
         // Now the next embed-values string (NOT affected by USE-ORDER!)
         if (exer && (p_td.xer_bits & EMBED_VALUES) && 0 != emb_val &&
@@ -5087,7 +5087,7 @@ int Record_Type::XER_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
             ed0_i = ed0->next_field_emb_descr (emb_val->embval_index, emb_val->embval_err_descr_idx);
           }
           embed_values->encode_element(emb_val->embval_index, UNIVERSAL_CHARSTRING_xer_,
-            ev0_i, ed0_i, p_buf, flavor | EMBED_VALUES, indent + !omit_tag, 0);
+            ev0_i, ed0_i, p_buf, flavor | EMBED_VALUES, flavor2, indent + !omit_tag, 0);
           ++emb_val->embval_index;
         }
       } //for
@@ -5787,7 +5787,7 @@ int Record_Type::JSON_encode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer&
 }
 
 int Record_Type::JSON_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
-                                     const TTCN_Typedescriptor_t& p_td,
+                                     const TTCN_Typedescriptor_t& /*p_td*/,
                                      JSON_Tokenizer& p_tok) const 
 {
   if (!is_bound()) {
@@ -5886,7 +5886,7 @@ int Record_Type::JSON_encode_negtest(const Erroneous_descriptor_t* p_err_descr,
   return enc_len;
 }
 
-int Record_Type::JSON_decode(const TTCN_Typedescriptor_t& p_td, JSON_Tokenizer& p_tok, boolean p_silent)
+int Record_Type::JSON_decode(const TTCN_Typedescriptor_t& /*p_td*/, JSON_Tokenizer& p_tok, boolean p_silent)
 {
   json_token_t token = JSON_TOKEN_NONE;
   size_t dec_len = p_tok.get_next_token(&token, NULL, NULL);
@@ -6162,7 +6162,7 @@ void Empty_Record_Type::encode(const TTCN_Typedescriptor_t& p_td,
   case TTCN_EncDec::CT_XER: {
     TTCN_EncDec_ErrorContext ec("While XER-encoding type '%s': ", p_td.name);
     unsigned XER_coding=va_arg(pvar, unsigned);
-    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0);
+    XER_encode(*(p_td.xer),p_buf, XER_coding, 0, 0, 0);
     p_buf.put_c('\n');
     break;}
   case TTCN_EncDec::CT_JSON: {
@@ -6344,7 +6344,7 @@ int Empty_Record_Type::TEXT_decode(const TTCN_Typedescriptor_t& p_td,
 }
 
 int Empty_Record_Type::XER_encode(const XERdescriptor_t& p_td,
-  TTCN_Buffer& p_buf, unsigned int flavor, int indent, embed_values_enc_struct_t*) const
+  TTCN_Buffer& p_buf, unsigned int flavor, unsigned int /*flavor2*/, int indent, embed_values_enc_struct_t*) const
 {
   int encoded_length=(int)p_buf.get_len();
   int indenting = !is_canonical(flavor);
diff --git a/regression_test/XML/EXER-whitepaper/UseUnion.ttcnpp b/regression_test/XML/EXER-whitepaper/UseUnion.ttcnpp
index bf455c093571052f3392fd0ee177e49ad44a6a09..5fc67e078c44075f567785c31c06b88db298047e 100644
--- a/regression_test/XML/EXER-whitepaper/UseUnion.ttcnpp
+++ b/regression_test/XML/EXER-whitepaper/UseUnion.ttcnpp
@@ -358,6 +358,7 @@ type union UUVal {
   variant (hs) "XSD:token";
   variant (f) "XSD:float";
   variant (size) "XSD:string";
+  variant (vt) "XSD:NCName"
   variant (cs) "XSD:normalizedString";
   variant (ucs) "XSD:Name";
 }
@@ -404,7 +405,7 @@ const universal charstring str_uu_rec :=
 "\t<UU xmlns:xsd='http://www.w3.org/2001/XMLSchema' xsi:type='xsd:string'>Small</UU>\n" &
 "\t<UU>1101</UU>\n" &
 "\t<UU xmlns:xsd='http://www.w3.org/2001/XMLSchema' xsi:type='xsd:boolean'>true</UU>\n" &
-"\t<UU>inconc</UU>\n" &
+"\t<UU xmlns:xsd='http://www.w3.org/2001/XMLSchema' xsi:type='xsd:NCName'>inconc</UU>\n" &
 "\t<UU xmlns:xsd='http://www.w3.org/2001/XMLSchema' xsi:type='xsd:float'>1.600000</UU>\n" &
 "\t<UU xmlns:xsd='http://www.w3.org/2001/XMLSchema' xsi:type='xsd:token'>164FA</UU>\n" &
 "\t<UU xmlns:xsd='http://www.w3.org/2001/XMLSchema' xsi:type='xsd:hexBinary'>1BC6</UU>\n" &
@@ -452,7 +453,7 @@ DECLARE_EXER_ENCODERS(UUNoAttr, uu_no_attr);
 const UUNoAttr c_uu_na1 := { { hs := '117BA'H }, { size := Huge } };
 
 const universal charstring str_uu_na1 :=
-"<UUNoAttr xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' uuatr='117BA'>Huge</UUNoAttr>\n\n";
+"<UUNoAttr xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' uuatr='117BA' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xsi:type='xsd:string'>Huge</UUNoAttr>\n\n";
 
 const UUNoAttr c_uu_na2 := { { roi := { 1, 2, 3, 4 } }, { roi := { 5, 6, 7, 8 } } };
 
diff --git a/regression_test/XML/XSDBaseType/XSDBaseTypeTest.ttcn b/regression_test/XML/XSDBaseType/XSDBaseTypeTest.ttcn
index f08a14ac2ac9588dde40a6b2236c8d8eae3861d5..ecf9c2ed7525b99c608aeaa6456ee2a702a9bd68 100644
--- a/regression_test/XML/XSDBaseType/XSDBaseTypeTest.ttcn
+++ b/regression_test/XML/XSDBaseType/XSDBaseTypeTest.ttcn
@@ -1142,9 +1142,22 @@ module XSDBaseTypeTest {
         setverdict(fail, match(my_type_result, my_type));
       }
 
-      // Currently works incorrectly: Bug 507270
-      /*my_type := { t := { cs := "cs" } }
-      expected := "<UseTypeWithUseUnion xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd1='http://www.w3.org/2001/XMLSchema' xsi:type='xsd1:Name'>name</UseTypeWithUseUnion>\n\n";
+      // Bug 507270
+      my_type := { t := { cs := "cs" } }
+      expected := "<UseTypeWithUseUnion xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd0='http://www.w3.org/2001/XMLSchema' xsi:type='xsd0:string'>cs</UseTypeWithUseUnion>\n\n";
+      
+      result := enc_UseTypeWithUseUnion(my_type);
+      if (oct2unichar(result) != expected) {
+        setverdict(fail, match(oct2unichar(result), expected));
+      }
+      my_type_result := dec_UseTypeWithUseUnion(result);
+      if (my_type_result != my_type) {
+        setverdict(fail, match(my_type_result, my_type));
+      }
+
+      my_type := { t := { os := 'ABCD'O } }
+      expected := "<UseTypeWithUseUnion xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:xsd0='http://www.w3.org/2001/XMLSchema' xsi:type='xsd0:hexBinary'>ABCD</UseTypeWithUseUnion>\n\n";
+      
       result := enc_UseTypeWithUseUnion(my_type);
       if (oct2unichar(result) != expected) {
         setverdict(fail, match(oct2unichar(result), expected));
@@ -1152,7 +1165,7 @@ module XSDBaseTypeTest {
       my_type_result := dec_UseTypeWithUseUnion(result);
       if (my_type_result != my_type) {
         setverdict(fail, match(my_type_result, my_type));
-      }*/
+      }
 
       setverdict(pass);
     }