You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2022/03/07 11:24:56 UTC

[plc4x] branch develop updated: fix(codegen): Worked on implementing checksum fields

This is an automated email from the ASF dual-hosted git repository.

cdutz pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 845953f  fix(codegen): Worked on implementing checksum fields
845953f is described below

commit 845953fdd17ac9f55ed08bccae8cef10be892050
Author: cdutz <ch...@c-ware.de>
AuthorDate: Mon Mar 7 12:24:37 2022 +0100

    fix(codegen): Worked on implementing checksum fields
---
 .../resources/templates/c/pojo-template.c.ftlh     | 115 +++++++++++----------
 .../resources/templates/c/pojo-template.h.ftlh     |   2 +-
 .../resources/templates/go/model-template.go.ftlh  |  14 +--
 .../templates/java/model-template.java.ftlh        |   2 +-
 .../src/main/resources/protocols/test/test.mspec   |  34 ++----
 .../modbus/include/modbus_serial_adu.h             |   2 -
 .../modbus/src/modbus_device_information_object.c  |   2 +-
 plc4c/generated-sources/modbus/src/modbus_pdu.c    |  36 +++----
 .../modbus_pdu_read_file_record_response_item.c    |   2 +-
 .../modbus_pdu_write_file_record_request_item.c    |   2 +-
 .../modbus_pdu_write_file_record_response_item.c   |   2 +-
 .../modbus/src/modbus_serial_adu.c                 |  80 +++++---------
 .../generated-sources/modbus/src/modbus_tcp_adu.c  |   2 +-
 plc4c/generated-sources/s7/src/cotp_packet.c       |   4 +-
 plc4c/generated-sources/s7/src/cotp_parameter.c    |   4 +-
 plc4c/generated-sources/s7/src/s7_address.c        |   2 +-
 .../s7/src/s7_data_alarm_message.c                 |   2 +-
 plc4c/generated-sources/s7/src/s7_message.c        |   6 +-
 plc4c/generated-sources/s7/src/s7_parameter.c      |  10 +-
 .../s7/src/s7_parameter_user_data_item.c           |   4 +-
 plc4c/generated-sources/s7/src/s7_payload.c        |   2 +-
 .../s7/src/s7_payload_user_data_item.c             |  10 +-
 .../s7/src/s7_var_payload_data_item.c              |   2 +-
 .../s7/src/s7_var_request_parameter_item.c         |   4 +-
 plc4c/generated-sources/s7/src/tpkt_packet.c       |   2 +-
 .../internal/plc4go/cbus/readwrite/ParserHelper.go |   2 -
 .../plc4go/cbus/readwrite/XmlParserHelper.go       |   2 -
 .../cbus/readwrite/model/CALDataReplyStatus.go     |  16 +--
 .../readwrite/model/CALDataReplyStatusExtended.go  |  16 +--
 .../CBusCommandPointToPointToMultiPointNormal.go   |  16 +--
 .../model/CBusPointToMultiPointCommandNormal.go    |  16 +--
 .../readwrite/model/ExtendedFormatStatusReply.go   |  14 +--
 ...dentifyReplyCommandExtendedDiagnosticSummary.go |  30 +++---
 .../model/MonitoredSALShortFormBasicMode.go        |  16 +--
 .../readwrite/model/StandardFormatStatusReply.go   |  14 +--
 .../df1/readwrite/model/DF1SymbolMessageFrame.go   |  14 +--
 .../knxnetip/readwrite/model/KnxManufacturer.go    |  58 ++++++++++-
 .../modbus/readwrite/model/ModbusSerialADU.go      | 108 ++++++-------------
 .../java/modbus/readwrite/utils/StaticHelper.java  |  29 ++++++
 .../knxnetip/readwrite/model/KnxManufacturer.cs    |  33 ++++--
 pom.xml                                            |   2 +-
 .../main/resources/protocols/modbus/modbus.mspec   |  38 +------
 42 files changed, 367 insertions(+), 404 deletions(-)

diff --git a/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh b/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh
index 9eae813..f4cef18 100644
--- a/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/pojo-template.c.ftlh
@@ -133,23 +133,25 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
     return NO_MEMORY;
   }
   {
-            <#if field.isCountArrayField()>
+            <#if arrayField.isCountArrayField()>
     // Count array
     uint16_t itemCount = (uint16_t) ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)};
     for(int curItem = 0; curItem < itemCount; curItem++) {
       <#if !elementTypeReference.isSimpleTypeReference()>bool lastItem = curItem == (itemCount - 1);</#if>
       <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
 <#if elementTypeReference.isSimpleTypeReference()>
+    <#assign simpleTypeReference = elementTypeReference.asSimpleTypeReference().orElseThrow()>
       ${helper.getLanguageTypeNameForTypeReference(elementTypeReference)}* _value = malloc(sizeof(${helper.getLanguageTypeNameForTypeReference(elementTypeReference)}));
-      _res = ${helper.getReadBufferReadMethodCall(elementTypeReference, "_value", field)};
+      _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "_value", arrayField)};
       if(_res != OK) {
         return _res;
       }
       plc4c_utils_list_insert_head_value(${arrayField.name}, _value);
 <#else>
+    <#assign nonSimpleTypeReference = elementTypeReference.asNonSimpleTypeReference().orElseThrow()>
       <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
-      ${helper.getCTypeName(elementTypeReference.name)}* _value = NULL;
-      _res = ${helper.getCTypeName(elementTypeReference.name)}_parse(readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      ${helper.getCTypeName(nonSimpleTypeReference.name)}* _value = NULL;
+      _res = ${helper.getCTypeName(nonSimpleTypeReference.name)}_parse(readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -164,16 +166,18 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
     while(plc4c_spi_read_get_pos(readBuffer) < ${arrayField.name}EndPos) {
                 <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
 <#if elementTypeReference.isSimpleTypeReference()>
+    <#assign simpleTypeReference = elementTypeReference.asSimpleTypeReference().orElseThrow()>
       ${helper.getLanguageTypeNameForTypeReference(elementTypeReference)} _value = ${helper.getNullValueForTypeReference(elementTypeReference)};
-      _res = ${helper.getReadBufferReadMethodCall(elementTypeReference, "&_value", arrayField)};
+      _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "&_value", arrayField)};
       if(_res != OK) {
         return _res;
       }
       plc4c_utils_list_insert_head_value(${arrayField.name}, &_value);
 <#else>
+    <#assign nonSimpleTypeReference = elementTypeReference.asNonSimpleTypeReference().orElseThrow()>
                 <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
-      ${helper.getCTypeName(elementTypeReference.name)}* _value = NULL;
-      _res = ${helper.getCTypeName(elementTypeReference.name)}_parse(readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      ${helper.getCTypeName(nonSimpleTypeReference.name)}* _value = NULL;
+      _res = ${helper.getCTypeName(nonSimpleTypeReference.name)}_parse(readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -187,16 +191,18 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
     while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, parserArguments)}))) {
             <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
 <#if elementTypeReference.isSimpleTypeReference()>
+    <#assign simpleTypeReference = elementTypeReference.asSimpleTypeReference().orElseThrow()>
       ${helper.getLanguageTypeNameForTypeReference(elementTypeReference)} _value = ${helper.getNullValueForTypeReference(elementTypeReference)};
-      _res = ${helper.getReadBufferReadMethodCall(elementTypeReference, "&_value", field)};
+      _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "&_value", arrayField)};
       if(_res != OK) {
         return _res;
       }
       plc4c_utils_list_insert_head_value(${arrayField.name}, &_value);
 <#else>
+    <#assign nonSimpleTypeReference = elementTypeReference.asNonSimpleTypeReference().orElseThrow()>
                 <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
-      ${helper.getCTypeName(elementTypeReference.name)}* _value = NULL;
-      _res = ${helper.getCTypeName(elementTypeReference.name)}_parse(readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
+      ${helper.getCTypeName(nonSimpleTypeReference.name)}* _value = NULL;
+      _res = ${helper.getCTypeName(nonSimpleTypeReference.name)}_parse(readBuffer<#if elementTypeReference.isNonSimpleTypeReference() && elementTypeReference.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list elementTypeReference.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, arrayField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &_value);
       if(_res != OK) {
         return _res;
       }
@@ -215,9 +221,8 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
   // Checksum Field (${checksumField.name})
   {
     // Create an array of all the bytes read in this message element so far.
-    unsigned char checksumRawData[] = plc4c_spi_read_get_bytes(readBuffer, startPos, plc4c_spi_read_get_pos(readBuffer));
     ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getNullValueForTypeReference(checksumField.type)};
-    _res = ${helper.getReadBufferReadMethodCall(checksumField.type, "&_checksumRef", field)};
+    _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "&_checksumRef", checksumField)};
     if(_res != OK) {
       return _res;
     }
@@ -234,7 +239,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
 
   // Const Field (${constField.name})
   ${helper.getLanguageTypeNameForField(field)} ${constField.name} = ${helper.getNullValueForTypeReference(constField.type)};
-  _res = ${helper.getReadBufferReadMethodCall(constField.type, "&" + constField.name, field)};
+  _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "&" + constField.name, constField)};
   if(_res != OK) {
     return _res;
   }
@@ -268,7 +273,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
   ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getNullValueForTypeReference(enumField.type)};
   {
     ${helper.getLanguageTypeNameForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))} _constantValue = ${helper.getNullValueForTypeReference(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName))};
-    _res = ${helper.getReadBufferReadMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "&_constantValue", field)};
+    _res = ${helper.getReadBufferReadMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), "&_constantValue", enumField)};
     if(_res != OK) {
       return _res;
     }
@@ -278,11 +283,11 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
             <#break>
         <#case "implicit">
             <#assign implicitField = field.asImplicitField().orElseThrow()>
-            <#assign simpleTypeReference = implicitField.type>
+            <#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
 
-  // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (${implicitField.name}) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = ${helper.getNullValueForTypeReference(implicitField.type)};
-  _res = ${helper.getReadBufferReadMethodCall(implicitField.type, "&" + implicitField.name, field)};
+  _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "&" + implicitField.name, implicitField)};
   if(_res != OK) {
     return _res;
   }
@@ -308,14 +313,16 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
   if(${helper.toParseExpression(baseType, field, optionalField.conditionExpression.get(), parserArguments)}) {
             </#if>
         <#if optionalField.type.isSimpleTypeReference()>
+            <#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
     ${optionalField.name} = malloc(sizeof(${helper.getLanguageTypeNameForField(field)}));
     if(${optionalField.name} == NULL) {
       return NO_MEMORY;
     }
     *${optionalField.name} = ${helper.getNullValueForTypeReference(optionalField.type)};
-    _res = ${helper.getReadBufferReadMethodCall(optionalField.type, optionalField.name, field)};
+    _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, optionalField.name, optionalField)};
         <#else>
-    _res = ${helper.getCTypeName(optionalField.type.name)}_parse(readBuffer<#if optionalField.type.isNonSimpleTypeReference() && optionalField.type.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list optionalField.type.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
+            <#assign nonSimpleTypeReference = optionalField.type.asNonSimpleTypeReference().orElseThrow()>
+    _res = ${helper.getCTypeName(nonSimpleTypeReference.name)}_parse(readBuffer<#if optionalField.type.isNonSimpleTypeReference() && optionalField.type.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list optionalField.type.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
         </#if>
     if(_res != OK) {
       return _res;
@@ -366,12 +373,14 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer*
   // Simple Field (${simpleField.name})
             <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
             <#if simpleField.type.isSimpleTypeReference()>
-  ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getNullValueForTypeReference(simpleField.type)};
-  _res = ${helper.getReadBufferReadMethodCall(simpleField.type, "&" + simpleField.name, simpleField)};
+                <#assign simpleTypeReference = simpleField.type.asSimpleTypeReference().orElseThrow()>
+  ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getNullValueForTypeReference(simpleTypeReference)};
+  _res = ${helper.getReadBufferReadMethodCall(simpleTypeReference, "&" + simpleField.name, simpleField)};
             <#else>
+                <#assign nonSimpleTypeReference = simpleField.type.asNonSimpleTypeReference().orElseThrow()>
             <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
   ${helper.getLanguageTypeNameForField(field)}* ${simpleField.name};
-  _res = ${helper.getCTypeName(simpleField.type.name)}_parse(readBuffer<#if simpleField.type.isNonSimpleTypeReference() && simpleField.type.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list simpleField.type.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+  _res = ${helper.getCTypeName(nonSimpleTypeReference.name)}_parse(readBuffer<#if simpleField.type.isNonSimpleTypeReference() && simpleField.type.asNonSimpleTypeReference().get().getParams().isPresent()>, <#list simpleField.type.asNonSimpleTypeReference().get().getParams().get() as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
             </#if>
   if(_res != OK) {
     return _res;
@@ -468,45 +477,41 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
             <#break>
         <#case "checksum">
             <#assign checksumField = field.asChecksumField().orElseThrow()>
-            <#assign simpleTypeReference = checksumField.type>
+            <#assign simpleTypeReference = checksumField.type.asSimpleTypeReference().orElseThrow()>
 
   // Checksum Field (${checksumField.name})
   {
     // Create an array of all the bytes read in this message element so far.
-    unsigned char checksumRawData[] = plc4c_spi_read_get_bytes(writeBuffer, startPos, plc4c_spi_read_get_pos(writeBuffer));
-    ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(simpleTypeReference, checksumField)};
-    ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, parserArguments)});
-    if(_checksum != _checksumRef) {
-      return PARSE_ERROR;
-      // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
-    }
+    ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(baseType, checksumField, checksumField.checksumExpression, parserArguments)});
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_checksum", checksumField)};
   }
             <#break>
         <#case "const">
             <#assign constField = field.asConstField().orElseThrow()>
-            <#assign simpleTypeReference = constField.type>
+            <#assign simpleTypeReference = constField.type.asSimpleTypeReference().orElseThrow()>
 
   // Const Field (${constField.name})
-  ${helper.getWriteBufferWriteMethodCall(constField.type, helper.getCTypeName(baseType.name)?upper_case + "_" + helper.camelCaseToSnakeCase(constField.name)?upper_case + "()", field)};
+  ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getCTypeName(baseType.name)?upper_case + "_" + helper.camelCaseToSnakeCase(constField.name)?upper_case + "()", constField)};
             <#break>
         <#case "discriminator">
-            <#assign discriminatorField = field>
+            <#assign discriminatorField = field.asDiscriminatorField().orElseThrow()>
         <#if helper.isEnumField(field)>
 
   // Enumerated Discriminator Field (${discriminatorField.name})
-  ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(discriminatorField.type), helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name, field)};
+  ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(discriminatorField.type), helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name, discriminatorField)};
         <#else>
-            <#assign simpleTypeReference = discriminatorField.type>
+            <#assign simpleTypeReference = discriminatorField.type.asSimpleTypeReference().orElseThrow()>
 
   // Discriminator Field (${discriminatorField.name})
-  ${helper.getWriteBufferWriteMethodCall(discriminatorField.type, helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name, field)};
+  ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getCTypeName(baseType.name) + "_get_discriminator(_message->_type)." + discriminatorField.name, discriminatorField)};
         </#if>
             <#break>
         <#case "enum">
             <#assign enumField = field.asEnumField().orElseThrow()>
+            <#assign enumTypeReference = enumField.type.asEnumTypeReference().orElseThrow()>
 
   // Enum field (${enumField.name})
-  _res = ${helper.getWriteBufferWriteMethodCall(helper.getEnumFieldSimpleTypeReference(enumField.type, enumField.fieldName), helper.getLanguageTypeNameForTypeReference(enumField.type) + "_get_" + helper.camelCaseToSnakeCase(enumField.fieldName) + "(_message->" + helper.getFieldName(baseType, enumField) + ")", field)};
+  _res = ${helper.getWriteBufferWriteMethodCall(helper.getEnumFieldSimpleTypeReference(enumTypeReference, enumField.fieldName), helper.getLanguageTypeNameForTypeReference(enumField.type) + "_get_" + helper.camelCaseToSnakeCase(enumField.fieldName) + "(_message->" + helper.getFieldName(baseType, enumField) + ")", enumField)};
   if(_res != OK) {
     return _res;
   }
@@ -516,7 +521,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
             <#assign simpleTypeReference = implicitField.type.asSimpleTypeReference().orElseThrow()>
 
   // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-  _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.toSerializationExpression(baseType, implicitField, implicitField.serializeExpression, parserArguments), field)};
+  _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.toSerializationExpression(baseType, implicitField, implicitField.serializeExpression, parserArguments), implicitField)};
   if(_res != OK) {
     return _res;
   }
@@ -541,7 +546,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
   // Optional Field (${optionalField.name})
   if(_message-><@fieldName baseType=baseType field=optionalField/> != NULL) {
             <#if optionalField.type.isSimpleTypeReference()>
-    _res = ${helper.getWriteBufferWriteMethodCall(optionalField.type.asSimpleTypeReference().orElseThrow(), "*_message->" + helper.getFieldName(baseType, optionalField), field)};
+    _res = ${helper.getWriteBufferWriteMethodCall(optionalField.type.asSimpleTypeReference().orElseThrow(), "*_message->" + helper.getFieldName(baseType, optionalField), optionalField)};
             <#else>
     _res = ${helper.getCTypeName(optionalField.type.asNonSimpleTypeReference().orElseThrow().name)}_serialize(writeBuffer, _message-><@fieldName baseType=baseType field=optionalField/>);
             </#if>
@@ -560,7 +565,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
     int _timesPadding = (int) (${helper.toSerializationExpression(baseType, paddingField, paddingField.paddingCondition, parserArguments)});
     while (_timesPadding-- > 0) {
       // Just output the default padding data
-      _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.toParseExpression(baseType, paddingField, paddingField.paddingValue, parserArguments), field)};
+      _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.toParseExpression(baseType, paddingField, paddingField.paddingValue, parserArguments), paddingField)};
       if(_res != OK) {
         return _res;
       }
@@ -572,7 +577,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
             <#assign simpleTypeReference = reservedField.type.asSimpleTypeReference().orElseThrow()>
 
   // Reserved Field
-  _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, reservedField.referenceValue, field)};
+  _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, reservedField.referenceValue, reservedField)};
   if(_res != OK) {
     return _res;
   }
@@ -582,9 +587,11 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
 
   // Simple Field (${simpleField.name})
             <#if simpleField.type.isSimpleTypeReference()>
-  _res = ${helper.getWriteBufferWriteMethodCall(simpleField.type, "_message->" + helper.getFieldName(baseType, simpleField), field)};
+                <#assign simpleTypeReference = simpleField.type.asSimpleTypeReference().orElseThrow()>
+  _res = ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_message->" + helper.getFieldName(baseType, simpleField), simpleField)};
             <#else>
-  _res = ${helper.getCTypeName(simpleField.type.name)}_serialize(writeBuffer, <#if simpleField.type.isEnumTypeReference()>&</#if>_message-><@fieldName baseType=baseType field=simpleField/>);
+                <#assign nonSimpleTypeRererence = simpleField.type.asNonSimpleTypeReference().orElseThrow()>
+  _res = ${helper.getCTypeName(nonSimpleTypeRererence.name)}_serialize(writeBuffer, <#if simpleField.type.isEnumTypeReference()>&</#if>_message-><@fieldName baseType=baseType field=simpleField/>);
             </#if>
   if(_res != OK) {
     return _res;
@@ -593,7 +600,7 @@ plc4c_return_code ${helper.getCTypeName(type.name)}_serialize(plc4c_spi_write_bu
         <#case "switch">
             <#assign switchField = field.asSwitchField().orElseThrow()>
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
         <#list switchField.cases as case>
     case ${helper.getCTypeName(type.name)}_type_${helper.getCTypeName(case.name)}: {
@@ -652,7 +659,7 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
                 <#break>
             <#case "const">
                 <#assign constField = field.asConstField().orElseThrow()>
-                <#assign simpleTypeReference = constField.type>
+                <#assign simpleTypeReference = constField.type.asSimpleTypeReference().orElseThrow()>
 
   // Const Field (${constField.name})
   lengthInBits += ${simpleTypeReference.sizeInBits};
@@ -663,13 +670,15 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
   // Discriminator Field (${discriminatorField.name})
         <#if discriminatorField.type.isSimpleTypeReference()>
             <#assign simpleTypeReference = discriminatorField.type.asSimpleTypeReference().orElseThrow()>
-            <#if helper.getLanguageTypeNameForTypeReference(discriminatorField.type) = "String">
-  lengthInBits +=  ${helper.toParseExpression(type, discriminatorField, simpleTypeReference.getLengthExpression(), parserArguments)};
+            <#if simpleTypeReference.isVstringTypeReference()>
+                <#assign vstringTypeReference = simpleTypeReference.asVstringTypeReference().orElseThrow()>
+  lengthInBits +=  ${helper.toParseExpression(type, discriminatorField, vstringTypeReference.lengthExpression, parserArguments)};
             <#else>
   lengthInBits += ${simpleTypeReference.sizeInBits};
             </#if>
         <#elseif helper.isEnumField(field)>
-  lengthInBits += ${helper.getEnumBaseTypeReference(discriminatorField.type).sizeInBits};
+            <#assign enumTypeReference = discriminatorField.type.asEnumTypeReference().orElseThrow()>
+  lengthInBits += ${enumTypeReference.baseTypeReference.orElseThrow().sizeInBits};
         <#else>
   lengthInBits += ${discriminatorField.name}.getLengthInBits();
         </#if>
@@ -688,7 +697,7 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
   lengthInBits += ${simpleTypeReference.sizeInBits};
                 <#break>
             <#case "manualArray">
-                <#assign manualArrayField = field>
+                <#assign manualArrayField = field.asManualArrayField().orElseThrow()>
 
   // Manual Array Field (${manualArrayField.name})
   lengthInBits += ${helper.toParseExpression(type, manualArrayField, manualArrayField.lengthExpression, parserArguments)};
@@ -705,7 +714,7 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
   // Optional Field (${optionalField.name})
   if(_message-><@fieldName baseType=baseType field=optionalField/> != NULL) {
                 <#if optionalField.type.isSimpleTypeReference()>
-                    <#assign simpleTypeReference = optionalField.type>
+                    <#assign simpleTypeReference = optionalField.type.asSimpleTypeReference().orElseThrow()>
     lengthInBits += ${simpleTypeReference.sizeInBits};
                 <#else>
     lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(optionalField)}(_message-><@fieldName baseType=baseType field=optionalField/>);
@@ -714,7 +723,7 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
                 <#break>
             <#case "padding">
                 <#assign paddingField = field.asPaddingField().orElseThrow()>
-                <#assign simpleTypeReference = paddingField.type>
+                <#assign simpleTypeReference = paddingField.type.asSimpleTypeReference().orElseThrow()>
 
   // Padding Field (padding)
             <#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
@@ -725,7 +734,7 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
                 <#break>
             <#case "reserved">
                 <#assign reservedField = field.asReservedField().orElseThrow()>
-                <#assign simpleTypeReference = reservedField.type>
+                <#assign simpleTypeReference = reservedField.type.asSimpleTypeReference().orElseThrow()>
 
   // Reserved Field (reserved)
   lengthInBits += ${simpleTypeReference.sizeInBits};
@@ -735,7 +744,7 @@ uint16_t ${helper.getCTypeName(type.name)}_length_in_bits(${helper.getCTypeName(
 
   // Simple field (${simpleField.name})
                 <#if simpleField.type.isSimpleTypeReference()>
-                    <#assign simpleTypeReference = simpleField.type>
+                    <#assign simpleTypeReference = simpleField.type.asSimpleTypeReference().orElseThrow()>
   lengthInBits += ${simpleTypeReference.sizeInBits};
                 <#else>
   lengthInBits += ${helper.getLengthInBitsFunctionNameForComplexTypedField(simpleField)}(<#if simpleField.type.isEnumTypeReference()>&</#if>_message-><@fieldName baseType=baseType field=simpleField/>);
diff --git a/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh b/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh
index c5370bc..c1a65af 100644
--- a/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh
+++ b/code-generation/language-c/src/main/resources/templates/c/pojo-template.h.ftlh
@@ -156,7 +156,7 @@ struct ${helper.getCTypeName(type.name)} {
             </#if>
         </#list>
   };
-    <#elseif (field.isTypedField() && field.type.isSimpleTypeReference() || helper.isEnumField(field)) && !field.isOptionalField() && !field.isArrayField() && !field.isManualArrayField()>
+    <#elseif (field.isTypedField() && field.asTypedField().orElseThrow().type.isSimpleTypeReference() || helper.isEnumField(field)) && !field.isOptionalField() && !field.isArrayField() && !field.isManualArrayField()>
         <#assign namedField = field.asNamedField().orElseThrow()>
   ${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(namedField.name)}${helper.getTypeSizeForField(field.asTypedField().orElseThrow())}<#if field.loopType??>${helper.getLoopExpressionSuffix(field.asTypedField().orElseThrow())}</#if>;
     <#elseif field.isArrayField() || field.isManualArrayField()>
diff --git a/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh b/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
index ed43fbe..2f2318b 100644
--- a/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
+++ b/code-generation/language-go/src/main/resources/templates/go/model-template.go.ftlh
@@ -888,12 +888,9 @@ func ${type.name}Parse(readBuffer utils.ReadBuffer<#if hasParserArguments>, ${pa
 		if _checksumRefErr != nil {
 			return nil, errors.Wrap(_checksumRefErr, "Error parsing 'checksum' field")<@emitImport import="github.com/pkg/errors" />
 		}
-		checksum, _checksumErr := ${helper.toParseExpression(checksumField, checksumField.type, checksumField.checksumExpression, parserArguments)}
-		if _checksumErr != nil {
-			return nil, errors.Wrap(_checksumErr, "Error parsing 'checksum' field")<@emitImport import="github.com/pkg/errors" />
-		}
+		checksum := ${helper.toParseExpression(checksumField, checksumField.type, checksumField.checksumExpression, parserArguments)}
 		if checksum != checksumRef {
-			return nil, errors.Errorf("Checksum verification failed. Expected %d but got %d", (checksumRef & 0xFFFF), (checksum & 0xFFFF))<@emitImport import="github.com/pkg/errors" />
+			return nil, errors.Errorf("Checksum verification failed. Expected %x but got %x", checksumRef, checksum)<@emitImport import="github.com/pkg/errors" />
 		}
 	}
 				<#break>
@@ -1515,11 +1512,8 @@ func (m *${type.name}) Serialize(writeBuffer utils.WriteBuffer) error {
 
 	// Checksum Field (checksum) (Calculated)
 	{
-		_checksum, _checksumErr := ${helper.toSerializationExpression(checksumField, checksumField.type, checksumField.checksumExpression, parserArguments)}
-		if _checksumErr != nil {
-			return errors.Wrap(_checksumErr, "Error serializing 'checksum' field")<@emitImport import="github.com/pkg/errors" />
-		}
-		_checksumErr = ${helper.getWriteBufferWriteMethodCall("checksum", simpleTypeReference, "(_checksum)", checksumField)}
+		_checksum := ${helper.toSerializationExpression(checksumField, checksumField.type, checksumField.checksumExpression, parserArguments)}
+		_checksumErr := ${helper.getWriteBufferWriteMethodCall("checksum", simpleTypeReference, "(_checksum)", checksumField)}
 		if _checksumErr != nil {
 			return errors.Wrap(_checksumErr, "Error serializing 'checksum' field")<@emitImport import="github.com/pkg/errors" />
 		}
diff --git a/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
index 5441388..e8be32e 100644
--- a/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/model-template.java.ftlh
@@ -621,7 +621,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                 <#assign typedField = field.asTypedField().orElseThrow()>
                 <#assign namedField = field.asNamedField().orElseThrow()>
 
-                ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", ${helper.getDataReaderCall(typedField.type)}, ${helper.toParseExpression(checksumField, checksumField.type, checksumField.checksumExpression, parserArguments)}${helper.getFieldOptions(typedField, parserArguments)});
+                ${helper.getLanguageTypeNameForField(field)} ${namedField.name} = read${field.typeName?cap_first}Field("${namedField.name}", ${helper.getDataReaderCall(typedField.type)}, (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(checksumField, checksumField.type, checksumField.checksumExpression, parserArguments)})${helper.getFieldOptions(typedField, parserArguments)});
                 <#break>
             <#case "const">
                 <#assign constField = field.asConstField().orElseThrow()>
diff --git a/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec b/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec
index 9c1e836..40e442b 100644
--- a/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec
+++ b/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec
@@ -35,8 +35,7 @@
     //Abstract fields can only be used within discriminated base types.
     //[abstract       unit 8  abstractField]
     [array          uint 8  arrayField        count      '5']
-    //TODO: Checksums fields are not supported in C
-    //[checksum       uint 8  'checksumField'     '100']
+    [checksum       uint 8  checksumField     '100']
     [const          uint 8  constField        5]
     // Discriminated Field can't be used in simple type
     //[discriminator  uint 8  discriminatorField]
@@ -55,8 +54,7 @@
     //Abstract fields can only be used within discriminated base types.
     //[abstract       unit 8  abstractField]
     [array          uint 8  arrayField        count      '5']
-    //TODO: Checksums fields are not supported in C
-    //[checksum       uint 8  'checksumField'     '100']
+    [checksum       uint 8  checksumField     '100']
     [const          uint 8  constField        5]
     // Discriminated Field can't be used in simple type
     //[discriminator  uint 8  discriminatorField]
@@ -72,14 +70,6 @@
 
 /*
  * TODO: doesn't compile in java
-[type UFloatTypeTest
-    [simple ufloat 32 ufloatField]
-    [simple ufloat 64 udoubleField]
-]
-*/
-
-/*
- * TODO: doesn't compile in java
 [type TimeTypeTest
     [simple time 8 timeField]
     [simple date 8 dateField]
@@ -161,18 +151,14 @@
     [manualArray string  8  stringField count      'true'  'STATIC_CALL("parseString", readBuffer)' 'STATIC_CALL("serializeString", writeBuffer, _value)' '5'   ]
 ]*/
 
-//TODO: Checksums fields are not supported in C
-//[type CheckSumTypeTest
-    //Bit field cannot be used for a checksum
-    //[checksum bit 'bitField' true]
-    //[checksum int 8 'intField' '100']
-    //[checksum uint 8 'uintField' '100']
-    //Float fields cannot be used as checksums
-    //[checksum float 32 'floatField' '100.0f']
-    //[checksum float 64 'doubleField' '100.0']
-    //String field cannot be used as a checksum
-    //[checksum vstring '11 * 8' 'stringField' '"HELLO TODDY"']
-//]
+[type CheckSumTypeTest
+    //Bit field cannot be used for a checksum: [checksum bit bitField 'true']
+    [checksum int 8 intField '100']
+    [checksum uint 8 uintField '100']
+    // Float fields cannot be used as checksums: [checksum float 32 floatField '100.0']
+    // Float fields cannot be used as checksums: [checksum float 64 doubleField '100.0']
+    // String field cannot be used as a checksum: [checksum vstring '11 * 8' stringField '"HELLO TODDY"']
+]
 
 [type ConstTypeTest
     [const bit bitField true]
diff --git a/plc4c/generated-sources/modbus/include/modbus_serial_adu.h b/plc4c/generated-sources/modbus/include/modbus_serial_adu.h
index 4b28dab..0f1dfac 100644
--- a/plc4c/generated-sources/modbus/include/modbus_serial_adu.h
+++ b/plc4c/generated-sources/modbus/include/modbus_serial_adu.h
@@ -37,8 +37,6 @@ extern "C" {
 
 struct plc4c_modbus_read_write_modbus_serial_adu {
   /* Properties */
-  uint16_t transaction_id;
-  uint16_t length;
   uint8_t address;
   plc4c_modbus_read_write_modbus_pdu* pdu;
 };
diff --git a/plc4c/generated-sources/modbus/src/modbus_device_information_object.c b/plc4c/generated-sources/modbus/src/modbus_device_information_object.c
index b18c7bb..533a730 100644
--- a/plc4c/generated-sources/modbus/src/modbus_device_information_object.c
+++ b/plc4c/generated-sources/modbus/src/modbus_device_information_object.c
@@ -43,7 +43,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_device_information_object_parse
   }
   (*_message)->object_id = objectId;
 
-  // Implicit Field (objectLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (objectLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t objectLength = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &objectLength);
   if(_res != OK) {
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu.c b/plc4c/generated-sources/modbus/src/modbus_pdu.c
index 5013ec3..c18efba 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -193,7 +193,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x02 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x02 ) && ( response == true ) ) { /* ModbusPDUReadDiscreteInputsResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_discrete_inputs_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -245,7 +245,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x01 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x01 ) && ( response == true ) ) { /* ModbusPDUReadCoilsResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_coils_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -335,7 +335,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x0F ) && ( response == false )
   (*_message)->modbus_pdu_write_multiple_coils_request_quantity = quantity;
 
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -407,7 +407,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x04 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x04 ) && ( response == true ) ) { /* ModbusPDUReadInputRegistersResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_input_registers_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -459,7 +459,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x03 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x03 ) && ( response == true ) ) { /* ModbusPDUReadHoldingRegistersResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_holding_registers_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -549,7 +549,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x10 ) && ( response == false )
   (*_message)->modbus_pdu_write_multiple_holding_registers_request_quantity = quantity;
 
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -637,7 +637,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x17 ) && ( response == false )
   (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_write_quantity = writeQuantity;
 
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -669,7 +669,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x17 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x17 ) && ( response == true ) ) { /* ModbusPDUReadWriteMultipleHoldingRegistersResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_write_multiple_holding_registers_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -770,7 +770,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x18 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x18 ) && ( response == true ) ) { /* ModbusPDUReadFifoQueueResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_fifo_queue_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &byteCount);
   if(_res != OK) {
@@ -778,7 +778,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x18 ) && ( response == true ) )
   }
 
 
-  // Implicit Field (fifoCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (fifoCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t fifoCount = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &fifoCount);
   if(_res != OK) {
@@ -810,7 +810,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x18 ) && ( response == true ) )
 if( ( errorFlag == false ) && ( functionFlag == 0x14 ) && ( response == false ) ) { /* ModbusPDUReadFileRecordRequest */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_request;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -842,7 +842,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x14 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x14 ) && ( response == true ) ) { /* ModbusPDUReadFileRecordResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_read_file_record_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -874,7 +874,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x14 ) && ( response == true ) )
 if( ( errorFlag == false ) && ( functionFlag == 0x15 ) && ( response == false ) ) { /* ModbusPDUWriteFileRecordRequest */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_request;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -906,7 +906,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x15 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x15 ) && ( response == true ) ) { /* ModbusPDUWriteFileRecordResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_write_file_record_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -1018,7 +1018,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x0C ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x0C ) && ( response == true ) ) { /* ModbusPDUGetComEventLogResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_get_com_event_log_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -1080,7 +1080,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x11 ) && ( response == false )
 if( ( errorFlag == false ) && ( functionFlag == 0x11 ) && ( response == true ) ) { /* ModbusPDUReportServerIdResponse */
     (*_message)->_type = plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_report_server_id_response;
 
-  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (byteCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t byteCount = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &byteCount);
   if(_res != OK) {
@@ -1201,7 +1201,7 @@ if( ( errorFlag == false ) && ( functionFlag == 0x2B ) && ( response == true ) )
   (*_message)->modbus_pdu_read_device_identification_response_next_object_id = nextObjectId;
 
 
-  // Implicit Field (numberOfObjects) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t numberOfObjects = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &numberOfObjects);
   if(_res != OK) {
@@ -1243,7 +1243,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_serialize(plc4c_spi_write_b
   // Discriminator Field (functionFlag)
   plc4c_spi_write_unsigned_byte(writeBuffer, 7, plc4c_modbus_read_write_modbus_pdu_get_discriminator(_message->_type).functionFlag);
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_modbus_read_write_modbus_pdu_type_plc4c_modbus_read_write_modbus_pdu_error: {
 
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
index d57f0ca..003a113 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
@@ -35,7 +35,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
     return NO_MEMORY;
   }
 
-  // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t dataLength = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &dataLength);
   if(_res != OK) {
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
index d706de0..c0a43a8 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
@@ -59,7 +59,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
   }
   (*_message)->record_number = recordNumber;
 
-  // Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t recordLength = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &recordLength);
   if(_res != OK) {
diff --git a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
index 562d302..d51d9a8 100644
--- a/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
+++ b/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
@@ -59,7 +59,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
   }
   (*_message)->record_number = recordNumber;
 
-  // Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (recordLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t recordLength = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &recordLength);
   if(_res != OK) {
diff --git a/plc4c/generated-sources/modbus/src/modbus_serial_adu.c b/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
index 8ac3027..f66000a 100644
--- a/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -35,34 +35,6 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
     return NO_MEMORY;
   }
 
-  // Simple Field (transactionId)
-  uint16_t transactionId = 0;
-  _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &transactionId);
-  if(_res != OK) {
-    return _res;
-  }
-  (*_message)->transaction_id = transactionId;
-
-  // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
-  {
-    uint16_t _reserved = 0;
-    _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &_reserved);
-    if(_res != OK) {
-      return _res;
-    }
-    if(_reserved != 0x0000) {
-      printf("Expected constant value '%d' but got '%d' for reserved field.", 0x0000, _reserved);
-    }
-  }
-
-  // Simple Field (length)
-  uint16_t length = 0;
-  _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &length);
-  if(_res != OK) {
-    return _res;
-  }
-  (*_message)->length = length;
-
   // Simple Field (address)
   uint8_t address = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &address);
@@ -79,30 +51,27 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
   }
   (*_message)->pdu = pdu;
 
+  // Checksum Field (crc)
+  {
+    // Create an array of all the bytes read in this message element so far.
+    uint16_t _checksumRef = 0;
+    _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &_checksumRef);
+    if(_res != OK) {
+      return _res;
+    }
+    uint16_t _checksum = (uint16_t) (plc4c_modbus_read_write_crc_check(address, pdu));
+    if(_checksum != _checksumRef) {
+      return PARSE_ERROR;
+      // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
+    }
+  }
+
   return OK;
 }
 
 plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_modbus_read_write_modbus_serial_adu* _message) {
   plc4c_return_code _res = OK;
 
-  // Simple Field (transactionId)
-  _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->transaction_id);
-  if(_res != OK) {
-    return _res;
-  }
-
-  // Reserved Field
-  _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, 0x0000);
-  if(_res != OK) {
-    return _res;
-  }
-
-  // Simple Field (length)
-  _res = plc4c_spi_write_unsigned_short(writeBuffer, 16, _message->length);
-  if(_res != OK) {
-    return _res;
-  }
-
   // Simple Field (address)
   _res = plc4c_spi_write_unsigned_byte(writeBuffer, 8, _message->address);
   if(_res != OK) {
@@ -115,6 +84,13 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_serialize(plc4c_spi_
     return _res;
   }
 
+  // Checksum Field (crc)
+  {
+    // Create an array of all the bytes read in this message element so far.
+    uint16_t _checksum = (uint16_t) (plc4c_modbus_read_write_crc_check(_message->address, _message->pdu));
+    plc4c_spi_write_unsigned_short(writeBuffer, 16, _checksum);
+  }
+
   return OK;
 }
 
@@ -125,21 +101,15 @@ uint16_t plc4c_modbus_read_write_modbus_serial_adu_length_in_bytes(plc4c_modbus_
 uint16_t plc4c_modbus_read_write_modbus_serial_adu_length_in_bits(plc4c_modbus_read_write_modbus_serial_adu* _message) {
   uint16_t lengthInBits = 0;
 
-  // Simple field (transactionId)
-  lengthInBits += 16;
-
-  // Reserved Field (reserved)
-  lengthInBits += 16;
-
-  // Simple field (length)
-  lengthInBits += 16;
-
   // Simple field (address)
   lengthInBits += 8;
 
   // Simple field (pdu)
   lengthInBits += plc4c_modbus_read_write_modbus_pdu_length_in_bits(_message->pdu);
 
+  // Checksum Field (checksum)
+  lengthInBits += 16;
+
   return lengthInBits;
 }
 
diff --git a/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c b/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
index 7ab8c40..2d9014f 100644
--- a/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -60,7 +60,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
     // throw new ParseException("Expected constant value " + PLC4C_MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER + " but got " + protocolIdentifier);
   }
 
-  // Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (length) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t length = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &length);
   if(_res != OK) {
diff --git a/plc4c/generated-sources/s7/src/cotp_packet.c b/plc4c/generated-sources/s7/src/cotp_packet.c
index 8d85ba7..e9c74f4 100644
--- a/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -66,7 +66,7 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* r
     return NO_MEMORY;
   }
 
-  // Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (headerLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t headerLength = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &headerLength);
   if(_res != OK) {
@@ -278,7 +278,7 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_serialize(plc4c_spi_write_buff
   // Discriminator Field (tpduCode)
   plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_s7_read_write_cotp_packet_get_discriminator(_message->_type).tpduCode);
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_cotp_packet_type_plc4c_s7_read_write_cotp_packet_data: {
 
diff --git a/plc4c/generated-sources/s7/src/cotp_parameter.c b/plc4c/generated-sources/s7/src/cotp_parameter.c
index 675672d..689869c 100644
--- a/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -72,7 +72,7 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer
     return _res;
   }
 
-  // Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (parameterLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t parameterLength = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &parameterLength);
   if(_res != OK) {
@@ -164,7 +164,7 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_serialize(plc4c_spi_write_b
     return _res;
   }
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_cotp_parameter_type_plc4c_s7_read_write_cotp_parameter_tpdu_size: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_address.c b/plc4c/generated-sources/s7/src/s7_address.c
index 5503e47..a2833a2 100644
--- a/plc4c/generated-sources/s7/src/s7_address.c
+++ b/plc4c/generated-sources/s7/src/s7_address.c
@@ -148,7 +148,7 @@ plc4c_return_code plc4c_s7_read_write_s7_address_serialize(plc4c_spi_write_buffe
   // Discriminator Field (addressType)
   plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_s7_read_write_s7_address_get_discriminator(_message->_type).addressType);
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_address_type_plc4c_s7_read_write_s7_address_any: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_data_alarm_message.c b/plc4c/generated-sources/s7/src/s7_data_alarm_message.c
index 9787c9d..5b9ea00 100644
--- a/plc4c/generated-sources/s7/src/s7_data_alarm_message.c
+++ b/plc4c/generated-sources/s7/src/s7_data_alarm_message.c
@@ -224,7 +224,7 @@ plc4c_return_code plc4c_s7_read_write_s7_data_alarm_message_serialize(plc4c_spi_
   // Const Field (numberMessageObj)
   plc4c_spi_write_unsigned_byte(writeBuffer, 8, PLC4C_S7_READ_WRITE_S7_DATA_ALARM_MESSAGE_NUMBER_MESSAGE_OBJ());
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_data_alarm_message_type_plc4c_s7_read_write_s7_message_object_request: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_message.c b/plc4c/generated-sources/s7/src/s7_message.c
index 37f28ed..d33f7a3 100644
--- a/plc4c/generated-sources/s7/src/s7_message.c
+++ b/plc4c/generated-sources/s7/src/s7_message.c
@@ -107,14 +107,14 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* re
   }
   (*_message)->tpdu_reference = tpduReference;
 
-  // Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (parameterLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t parameterLength = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &parameterLength);
   if(_res != OK) {
     return _res;
   }
 
-  // Implicit Field (payloadLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (payloadLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t payloadLength = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &payloadLength);
   if(_res != OK) {
@@ -229,7 +229,7 @@ plc4c_return_code plc4c_s7_read_write_s7_message_serialize(plc4c_spi_write_buffe
     return _res;
   }
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_message_type_plc4c_s7_read_write_s7_message_request: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_parameter.c b/plc4c/generated-sources/s7/src/s7_parameter.c
index 9f81f62..2b21dc4 100644
--- a/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -122,7 +122,7 @@ if( parameterType == 0xF0 ) { /* S7ParameterSetupCommunication */
 if( ( parameterType == 0x04 ) && ( messageType == 0x01 ) ) { /* S7ParameterReadVarRequest */
     (*_message)->_type = plc4c_s7_read_write_s7_parameter_type_plc4c_s7_read_write_s7_parameter_read_var_request;
 
-  // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t numItems = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &numItems);
   if(_res != OK) {
@@ -165,7 +165,7 @@ if( ( parameterType == 0x04 ) && ( messageType == 0x03 ) ) { /* S7ParameterReadV
 if( ( parameterType == 0x05 ) && ( messageType == 0x01 ) ) { /* S7ParameterWriteVarRequest */
     (*_message)->_type = plc4c_s7_read_write_s7_parameter_type_plc4c_s7_read_write_s7_parameter_write_var_request;
 
-  // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t numItems = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &numItems);
   if(_res != OK) {
@@ -208,7 +208,7 @@ if( ( parameterType == 0x05 ) && ( messageType == 0x03 ) ) { /* S7ParameterWrite
 if( ( parameterType == 0x00 ) && ( messageType == 0x07 ) ) { /* S7ParameterUserData */
     (*_message)->_type = plc4c_s7_read_write_s7_parameter_type_plc4c_s7_read_write_s7_parameter_user_data;
 
-  // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (numItems) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t numItems = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &numItems);
   if(_res != OK) {
@@ -253,7 +253,7 @@ if( ( parameterType == 0x01 ) && ( messageType == 0x07 ) ) { /* S7ParameterModeT
   }
 
 
-  // Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t itemLength = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &itemLength);
   if(_res != OK) {
@@ -315,7 +315,7 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_serialize(plc4c_spi_write_buf
   // Discriminator Field (parameterType)
   plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_s7_read_write_s7_parameter_get_discriminator(_message->_type).parameterType);
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_parameter_type_plc4c_s7_read_write_s7_parameter_setup_communication: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c b/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
index a3bd679..0605199 100644
--- a/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
+++ b/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
@@ -68,7 +68,7 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_sp
 if( itemType == 0x12 ) { /* S7ParameterUserDataItemCPUFunctions */
     (*_message)->_type = plc4c_s7_read_write_s7_parameter_user_data_item_type_plc4c_s7_read_write_s7_parameter_user_data_item_cpu_functions;
 
-  // Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t itemLength = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &itemLength);
   if(_res != OK) {
@@ -184,7 +184,7 @@ plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_serialize(plc4
   // Discriminator Field (itemType)
   plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_s7_read_write_s7_parameter_user_data_item_get_discriminator(_message->_type).itemType);
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_parameter_user_data_item_type_plc4c_s7_read_write_s7_parameter_user_data_item_cpu_functions: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_payload.c b/plc4c/generated-sources/s7/src/s7_payload.c
index 6a9d8a2..bf22aeb 100644
--- a/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/plc4c/generated-sources/s7/src/s7_payload.c
@@ -166,7 +166,7 @@ if( ( plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).param
 plc4c_return_code plc4c_s7_read_write_s7_payload_serialize(plc4c_spi_write_buffer* writeBuffer, plc4c_s7_read_write_s7_payload* _message) {
   plc4c_return_code _res = OK;
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_payload_type_plc4c_s7_read_write_s7_payload_read_var_response: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c b/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
index f1ac5fd..07dcc98 100644
--- a/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
+++ b/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
@@ -136,7 +136,7 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_
   }
   (*_message)->transport_size = *transportSize;
 
-  // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t dataLength = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &dataLength);
   if(_res != OK) {
@@ -339,7 +339,7 @@ if( ( cpuFunctionType == 0x08 ) && ( cpuSubfunction == 0x01 ) ) { /* S7PayloadUs
   }
 
 
-  // Implicit Field (szlItemCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (szlItemCount) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t szlItemCount = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &szlItemCount);
   if(_res != OK) {
@@ -514,7 +514,7 @@ if( ( cpuFunctionType == 0x04 ) && ( cpuSubfunction == 0x0b ) ) { /* S7PayloadUs
   (*_message)->s7_payload_user_data_item_cpu_function_alarm_ack_function_id = functionId;
 
 
-  // Implicit Field (numberOfObjects) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t numberOfObjects = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &numberOfObjects);
   if(_res != OK) {
@@ -555,7 +555,7 @@ if( ( cpuFunctionType == 0x08 ) && ( cpuSubfunction == 0x0b ) ) { /* S7PayloadUs
   (*_message)->s7_payload_user_data_item_cpu_function_alarm_ack_response_function_id = functionId;
 
 
-  // Implicit Field (numberOfObjects) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (numberOfObjects) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t numberOfObjects = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &numberOfObjects);
   if(_res != OK) {
@@ -769,7 +769,7 @@ plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_serialize(plc4c_
     return _res;
   }
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_payload_user_data_item_type_plc4c_s7_read_write_s7_payload_diagnostic_message: {
 
diff --git a/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c b/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
index 184ae51..7b175ba 100644
--- a/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
+++ b/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
@@ -51,7 +51,7 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
   }
   (*_message)->transport_size = *transportSize;
 
-  // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (dataLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t dataLength = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &dataLength);
   if(_res != OK) {
diff --git a/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c b/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
index d2f6436..2c2854c 100644
--- a/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
+++ b/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
@@ -68,7 +68,7 @@ plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_
 if( itemType == 0x12 ) { /* S7VarRequestParameterItemAddress */
     (*_message)->_type = plc4c_s7_read_write_s7_var_request_parameter_item_type_plc4c_s7_read_write_s7_var_request_parameter_item_address;
 
-  // Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (itemLength) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint8_t itemLength = 0;
   _res = plc4c_spi_read_unsigned_byte(readBuffer, 8, (uint8_t*) &itemLength);
   if(_res != OK) {
@@ -94,7 +94,7 @@ plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_serialize(pl
   // Discriminator Field (itemType)
   plc4c_spi_write_unsigned_byte(writeBuffer, 8, plc4c_s7_read_write_s7_var_request_parameter_item_get_discriminator(_message->_type).itemType);
 
-  // Switch Field (Depending of the current type, serialize the sub-type elements)
+  // Switch Field (Depending on the current type, serialize the subtype elements)
   switch(_message->_type) {
     case plc4c_s7_read_write_s7_var_request_parameter_item_type_plc4c_s7_read_write_s7_var_request_parameter_item_address: {
 
diff --git a/plc4c/generated-sources/s7/src/tpkt_packet.c b/plc4c/generated-sources/s7/src/tpkt_packet.c
index 6c9d143..1791493 100644
--- a/plc4c/generated-sources/s7/src/tpkt_packet.c
+++ b/plc4c/generated-sources/s7/src/tpkt_packet.c
@@ -64,7 +64,7 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* r
     }
   }
 
-  // Implicit Field (len) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  // Implicit Field (len) (Used for parsing, but its value is not stored as it's implicitly given by the objects content)
   uint16_t len = 0;
   _res = plc4c_spi_read_unsigned_short(readBuffer, 16, (uint16_t*) &len);
   if(_res != OK) {
diff --git a/plc4go/internal/plc4go/cbus/readwrite/ParserHelper.go b/plc4go/internal/plc4go/cbus/readwrite/ParserHelper.go
index dc5d248..763d125 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/ParserHelper.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/ParserHelper.go
@@ -42,8 +42,6 @@ func (m CbusParserHelper) Parse(typeName string, arguments []string, io utils.Re
 		return model.ExclamationMarkParse(io)
 	case "NetworkRoute":
 		return model.NetworkRouteParse(io)
-	case "Application":
-		return model.ApplicationParse(io)
 	case "NetworkNumber":
 		return model.NetworkNumberParse(io)
 	case "StandardFormatStatusReply":
diff --git a/plc4go/internal/plc4go/cbus/readwrite/XmlParserHelper.go b/plc4go/internal/plc4go/cbus/readwrite/XmlParserHelper.go
index 588c469..dcf4f73 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/XmlParserHelper.go
@@ -52,8 +52,6 @@ func (m CbusXmlParserHelper) Parse(typeName string, xmlString string, parserArgu
 		return model.ExclamationMarkParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "NetworkRoute":
 		return model.NetworkRouteParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
-	case "Application":
-		return model.ApplicationParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "NetworkNumber":
 		return model.NetworkNumberParse(utils.NewXmlReadBuffer(strings.NewReader(xmlString)))
 	case "StandardFormatStatusReply":
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatus.go b/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatus.go
index 64c5a5b..37c2e0c 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatus.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatus.go
@@ -29,7 +29,7 @@ import (
 // The data-structure of this message
 type CALDataReplyStatus struct {
 	*CALData
-	Application *Application
+	Application ApplicationIdContainer
 	BlockStart  uint8
 	Data        []byte
 }
@@ -37,7 +37,7 @@ type CALDataReplyStatus struct {
 // The corresponding interface
 type ICALDataReplyStatus interface {
 	// GetApplication returns Application
-	GetApplication() *Application
+	GetApplication() ApplicationIdContainer
 	// GetBlockStart returns BlockStart
 	GetBlockStart() uint8
 	// GetData returns Data
@@ -68,7 +68,7 @@ func (m *CALDataReplyStatus) InitializeParent(parent *CALData, commandTypeContai
 ///////////////////////////////////////////////////////////
 // Accessors for property fields.
 ///////////////////////////////////////////////////////////
-func (m *CALDataReplyStatus) GetApplication() *Application {
+func (m *CALDataReplyStatus) GetApplication() ApplicationIdContainer {
 	return m.Application
 }
 
@@ -85,7 +85,7 @@ func (m *CALDataReplyStatus) GetData() []byte {
 ///////////////////////////////////////////////////////////
 
 // NewCALDataReplyStatus factory function for CALDataReplyStatus
-func NewCALDataReplyStatus(application *Application, blockStart uint8, data []byte, commandTypeContainer CALCommandTypeContainer) *CALData {
+func NewCALDataReplyStatus(application ApplicationIdContainer, blockStart uint8, data []byte, commandTypeContainer CALCommandTypeContainer) *CALData {
 	child := &CALDataReplyStatus{
 		Application: application,
 		BlockStart:  blockStart,
@@ -127,7 +127,7 @@ func (m *CALDataReplyStatus) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (application)
-	lengthInBits += m.Application.GetLengthInBits()
+	lengthInBits += 8
 
 	// Simple field (blockStart)
 	lengthInBits += 8
@@ -155,11 +155,11 @@ func CALDataReplyStatusParse(readBuffer utils.ReadBuffer, commandTypeContainer C
 	if pullErr := readBuffer.PullContext("application"); pullErr != nil {
 		return nil, pullErr
 	}
-	_application, _applicationErr := ApplicationParse(readBuffer)
+	_application, _applicationErr := ApplicationIdContainerParse(readBuffer)
 	if _applicationErr != nil {
 		return nil, errors.Wrap(_applicationErr, "Error parsing 'application' field")
 	}
-	application := CastApplication(_application)
+	application := _application
 	if closeErr := readBuffer.CloseContext("application"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -183,7 +183,7 @@ func CALDataReplyStatusParse(readBuffer utils.ReadBuffer, commandTypeContainer C
 
 	// Create a partially initialized instance
 	_child := &CALDataReplyStatus{
-		Application: CastApplication(application),
+		Application: application,
 		BlockStart:  blockStart,
 		Data:        data,
 		CALData:     &CALData{},
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatusExtended.go b/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatusExtended.go
index 5995cb9..ebcb564 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatusExtended.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/CALDataReplyStatusExtended.go
@@ -30,7 +30,7 @@ import (
 type CALDataReplyStatusExtended struct {
 	*CALData
 	Encoding    uint8
-	Application *Application
+	Application ApplicationIdContainer
 	BlockStart  uint8
 	Data        []byte
 }
@@ -40,7 +40,7 @@ type ICALDataReplyStatusExtended interface {
 	// GetEncoding returns Encoding
 	GetEncoding() uint8
 	// GetApplication returns Application
-	GetApplication() *Application
+	GetApplication() ApplicationIdContainer
 	// GetBlockStart returns BlockStart
 	GetBlockStart() uint8
 	// GetData returns Data
@@ -75,7 +75,7 @@ func (m *CALDataReplyStatusExtended) GetEncoding() uint8 {
 	return m.Encoding
 }
 
-func (m *CALDataReplyStatusExtended) GetApplication() *Application {
+func (m *CALDataReplyStatusExtended) GetApplication() ApplicationIdContainer {
 	return m.Application
 }
 
@@ -92,7 +92,7 @@ func (m *CALDataReplyStatusExtended) GetData() []byte {
 ///////////////////////////////////////////////////////////
 
 // NewCALDataReplyStatusExtended factory function for CALDataReplyStatusExtended
-func NewCALDataReplyStatusExtended(encoding uint8, application *Application, blockStart uint8, data []byte, commandTypeContainer CALCommandTypeContainer) *CALData {
+func NewCALDataReplyStatusExtended(encoding uint8, application ApplicationIdContainer, blockStart uint8, data []byte, commandTypeContainer CALCommandTypeContainer) *CALData {
 	child := &CALDataReplyStatusExtended{
 		Encoding:    encoding,
 		Application: application,
@@ -138,7 +138,7 @@ func (m *CALDataReplyStatusExtended) GetLengthInBitsConditional(lastItem bool) u
 	lengthInBits += 8
 
 	// Simple field (application)
-	lengthInBits += m.Application.GetLengthInBits()
+	lengthInBits += 8
 
 	// Simple field (blockStart)
 	lengthInBits += 8
@@ -173,11 +173,11 @@ func CALDataReplyStatusExtendedParse(readBuffer utils.ReadBuffer, commandTypeCon
 	if pullErr := readBuffer.PullContext("application"); pullErr != nil {
 		return nil, pullErr
 	}
-	_application, _applicationErr := ApplicationParse(readBuffer)
+	_application, _applicationErr := ApplicationIdContainerParse(readBuffer)
 	if _applicationErr != nil {
 		return nil, errors.Wrap(_applicationErr, "Error parsing 'application' field")
 	}
-	application := CastApplication(_application)
+	application := _application
 	if closeErr := readBuffer.CloseContext("application"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -202,7 +202,7 @@ func CALDataReplyStatusExtendedParse(readBuffer utils.ReadBuffer, commandTypeCon
 	// Create a partially initialized instance
 	_child := &CALDataReplyStatusExtended{
 		Encoding:    encoding,
-		Application: CastApplication(application),
+		Application: application,
 		BlockStart:  blockStart,
 		Data:        data,
 		CALData:     &CALData{},
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/CBusCommandPointToPointToMultiPointNormal.go b/plc4go/internal/plc4go/cbus/readwrite/model/CBusCommandPointToPointToMultiPointNormal.go
index e7d5503..acf3ed2 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/CBusCommandPointToPointToMultiPointNormal.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/CBusCommandPointToPointToMultiPointNormal.go
@@ -34,7 +34,7 @@ const CBusCommandPointToPointToMultiPointNormal_CR byte = 0xD
 // The data-structure of this message
 type CBusCommandPointToPointToMultiPointNormal struct {
 	*CBusPointToPointToMultipointCommand
-	Application *Application
+	Application ApplicationIdContainer
 	SalData     *SALData
 	Crc         *Checksum
 	PeekAlpha   byte
@@ -47,7 +47,7 @@ type CBusCommandPointToPointToMultiPointNormal struct {
 // The corresponding interface
 type ICBusCommandPointToPointToMultiPointNormal interface {
 	// GetApplication returns Application
-	GetApplication() *Application
+	GetApplication() ApplicationIdContainer
 	// GetSalData returns SalData
 	GetSalData() *SALData
 	// GetCrc returns Crc
@@ -77,7 +77,7 @@ func (m *CBusCommandPointToPointToMultiPointNormal) InitializeParent(parent *CBu
 ///////////////////////////////////////////////////////////
 // Accessors for property fields.
 ///////////////////////////////////////////////////////////
-func (m *CBusCommandPointToPointToMultiPointNormal) GetApplication() *Application {
+func (m *CBusCommandPointToPointToMultiPointNormal) GetApplication() ApplicationIdContainer {
 	return m.Application
 }
 
@@ -102,7 +102,7 @@ func (m *CBusCommandPointToPointToMultiPointNormal) GetAlpha() *Alpha {
 ///////////////////////////////////////////////////////////
 
 // NewCBusCommandPointToPointToMultiPointNormal factory function for CBusCommandPointToPointToMultiPointNormal
-func NewCBusCommandPointToPointToMultiPointNormal(application *Application, salData *SALData, crc *Checksum, peekAlpha byte, alpha *Alpha, bridgeAddress *BridgeAddress, networkRoute *NetworkRoute, peekedApplication byte, srchk bool) *CBusPointToPointToMultipointCommand {
+func NewCBusCommandPointToPointToMultiPointNormal(application ApplicationIdContainer, salData *SALData, crc *Checksum, peekAlpha byte, alpha *Alpha, bridgeAddress *BridgeAddress, networkRoute *NetworkRoute, peekedApplication byte, srchk bool) *CBusPointToPointToMultipointCommand {
 	child := &CBusCommandPointToPointToMultiPointNormal{
 		Application:                         application,
 		SalData:                             salData,
@@ -146,7 +146,7 @@ func (m *CBusCommandPointToPointToMultiPointNormal) GetLengthInBitsConditional(l
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (application)
-	lengthInBits += m.Application.GetLengthInBits()
+	lengthInBits += 8
 
 	// Simple field (salData)
 	lengthInBits += m.SalData.GetLengthInBits()
@@ -182,11 +182,11 @@ func CBusCommandPointToPointToMultiPointNormalParse(readBuffer utils.ReadBuffer,
 	if pullErr := readBuffer.PullContext("application"); pullErr != nil {
 		return nil, pullErr
 	}
-	_application, _applicationErr := ApplicationParse(readBuffer)
+	_application, _applicationErr := ApplicationIdContainerParse(readBuffer)
 	if _applicationErr != nil {
 		return nil, errors.Wrap(_applicationErr, "Error parsing 'application' field")
 	}
-	application := CastApplication(_application)
+	application := _application
 	if closeErr := readBuffer.CloseContext("application"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -270,7 +270,7 @@ func CBusCommandPointToPointToMultiPointNormalParse(readBuffer utils.ReadBuffer,
 
 	// Create a partially initialized instance
 	_child := &CBusCommandPointToPointToMultiPointNormal{
-		Application:                         CastApplication(application),
+		Application:                         application,
 		SalData:                             CastSALData(salData),
 		Crc:                                 CastChecksum(crc),
 		PeekAlpha:                           peekAlpha,
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/CBusPointToMultiPointCommandNormal.go b/plc4go/internal/plc4go/cbus/readwrite/model/CBusPointToMultiPointCommandNormal.go
index 79cf185..903e409 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/CBusPointToMultiPointCommandNormal.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/CBusPointToMultiPointCommandNormal.go
@@ -35,7 +35,7 @@ const CBusPointToMultiPointCommandNormal_CR byte = 0xD
 // The data-structure of this message
 type CBusPointToMultiPointCommandNormal struct {
 	*CBusPointToMultiPointCommand
-	Application *Application
+	Application ApplicationIdContainer
 	SalData     *SALData
 	Crc         *Checksum
 	PeekAlpha   byte
@@ -48,7 +48,7 @@ type CBusPointToMultiPointCommandNormal struct {
 // The corresponding interface
 type ICBusPointToMultiPointCommandNormal interface {
 	// GetApplication returns Application
-	GetApplication() *Application
+	GetApplication() ApplicationIdContainer
 	// GetSalData returns SalData
 	GetSalData() *SALData
 	// GetCrc returns Crc
@@ -76,7 +76,7 @@ func (m *CBusPointToMultiPointCommandNormal) InitializeParent(parent *CBusPointT
 ///////////////////////////////////////////////////////////
 // Accessors for property fields.
 ///////////////////////////////////////////////////////////
-func (m *CBusPointToMultiPointCommandNormal) GetApplication() *Application {
+func (m *CBusPointToMultiPointCommandNormal) GetApplication() ApplicationIdContainer {
 	return m.Application
 }
 
@@ -101,7 +101,7 @@ func (m *CBusPointToMultiPointCommandNormal) GetAlpha() *Alpha {
 ///////////////////////////////////////////////////////////
 
 // NewCBusPointToMultiPointCommandNormal factory function for CBusPointToMultiPointCommandNormal
-func NewCBusPointToMultiPointCommandNormal(application *Application, salData *SALData, crc *Checksum, peekAlpha byte, alpha *Alpha, peekedApplication byte, srchk bool) *CBusPointToMultiPointCommand {
+func NewCBusPointToMultiPointCommandNormal(application ApplicationIdContainer, salData *SALData, crc *Checksum, peekAlpha byte, alpha *Alpha, peekedApplication byte, srchk bool) *CBusPointToMultiPointCommand {
 	child := &CBusPointToMultiPointCommandNormal{
 		Application:                  application,
 		SalData:                      salData,
@@ -145,7 +145,7 @@ func (m *CBusPointToMultiPointCommandNormal) GetLengthInBitsConditional(lastItem
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (application)
-	lengthInBits += m.Application.GetLengthInBits()
+	lengthInBits += 8
 
 	// Reserved Field (reserved)
 	lengthInBits += 8
@@ -184,11 +184,11 @@ func CBusPointToMultiPointCommandNormalParse(readBuffer utils.ReadBuffer, srchk
 	if pullErr := readBuffer.PullContext("application"); pullErr != nil {
 		return nil, pullErr
 	}
-	_application, _applicationErr := ApplicationParse(readBuffer)
+	_application, _applicationErr := ApplicationIdContainerParse(readBuffer)
 	if _applicationErr != nil {
 		return nil, errors.Wrap(_applicationErr, "Error parsing 'application' field")
 	}
-	application := CastApplication(_application)
+	application := _application
 	if closeErr := readBuffer.CloseContext("application"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -286,7 +286,7 @@ func CBusPointToMultiPointCommandNormalParse(readBuffer utils.ReadBuffer, srchk
 
 	// Create a partially initialized instance
 	_child := &CBusPointToMultiPointCommandNormal{
-		Application:                  CastApplication(application),
+		Application:                  application,
 		SalData:                      CastSALData(salData),
 		Crc:                          CastChecksum(crc),
 		PeekAlpha:                    peekAlpha,
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/ExtendedFormatStatusReply.go b/plc4go/internal/plc4go/cbus/readwrite/model/ExtendedFormatStatusReply.go
index 2a17b1f..0330711 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/ExtendedFormatStatusReply.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/ExtendedFormatStatusReply.go
@@ -35,7 +35,7 @@ const ExtendedFormatStatusReply_LF byte = 0x0A
 type ExtendedFormatStatusReply struct {
 	StatusHeader *ExtendedStatusHeader
 	Coding       StatusCoding
-	Application  *Application
+	Application  ApplicationIdContainer
 	BlockStart   uint8
 	StatusBytes  []*StatusByte
 	Crc          *Checksum
@@ -48,7 +48,7 @@ type IExtendedFormatStatusReply interface {
 	// GetCoding returns Coding
 	GetCoding() StatusCoding
 	// GetApplication returns Application
-	GetApplication() *Application
+	GetApplication() ApplicationIdContainer
 	// GetBlockStart returns BlockStart
 	GetBlockStart() uint8
 	// GetStatusBytes returns StatusBytes
@@ -74,7 +74,7 @@ func (m *ExtendedFormatStatusReply) GetCoding() StatusCoding {
 	return m.Coding
 }
 
-func (m *ExtendedFormatStatusReply) GetApplication() *Application {
+func (m *ExtendedFormatStatusReply) GetApplication() ApplicationIdContainer {
 	return m.Application
 }
 
@@ -95,7 +95,7 @@ func (m *ExtendedFormatStatusReply) GetCrc() *Checksum {
 ///////////////////////////////////////////////////////////
 
 // NewExtendedFormatStatusReply factory function for ExtendedFormatStatusReply
-func NewExtendedFormatStatusReply(statusHeader *ExtendedStatusHeader, coding StatusCoding, application *Application, blockStart uint8, statusBytes []*StatusByte, crc *Checksum) *ExtendedFormatStatusReply {
+func NewExtendedFormatStatusReply(statusHeader *ExtendedStatusHeader, coding StatusCoding, application ApplicationIdContainer, blockStart uint8, statusBytes []*StatusByte, crc *Checksum) *ExtendedFormatStatusReply {
 	return &ExtendedFormatStatusReply{StatusHeader: statusHeader, Coding: coding, Application: application, BlockStart: blockStart, StatusBytes: statusBytes, Crc: crc}
 }
 
@@ -130,7 +130,7 @@ func (m *ExtendedFormatStatusReply) GetLengthInBitsConditional(lastItem bool) ui
 	lengthInBits += 8
 
 	// Simple field (application)
-	lengthInBits += m.Application.GetLengthInBits()
+	lengthInBits += 8
 
 	// Simple field (blockStart)
 	lengthInBits += 8
@@ -196,11 +196,11 @@ func ExtendedFormatStatusReplyParse(readBuffer utils.ReadBuffer) (*ExtendedForma
 	if pullErr := readBuffer.PullContext("application"); pullErr != nil {
 		return nil, pullErr
 	}
-	_application, _applicationErr := ApplicationParse(readBuffer)
+	_application, _applicationErr := ApplicationIdContainerParse(readBuffer)
 	if _applicationErr != nil {
 		return nil, errors.Wrap(_applicationErr, "Error parsing 'application' field")
 	}
-	application := CastApplication(_application)
+	application := _application
 	if closeErr := readBuffer.CloseContext("application"); closeErr != nil {
 		return nil, closeErr
 	}
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go b/plc4go/internal/plc4go/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go
index 8628b99..7b58a35 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/IdentifyReplyCommandExtendedDiagnosticSummary.go
@@ -30,8 +30,8 @@ import (
 // The data-structure of this message
 type IdentifyReplyCommandExtendedDiagnosticSummary struct {
 	*IdentifyReplyCommand
-	LowApplication         *Application
-	HighApplication        *Application
+	LowApplication         ApplicationIdContainer
+	HighApplication        ApplicationIdContainer
 	Area                   byte
 	Crc                    uint16
 	SerialNumber           uint32
@@ -54,9 +54,9 @@ type IdentifyReplyCommandExtendedDiagnosticSummary struct {
 // The corresponding interface
 type IIdentifyReplyCommandExtendedDiagnosticSummary interface {
 	// GetLowApplication returns LowApplication
-	GetLowApplication() *Application
+	GetLowApplication() ApplicationIdContainer
 	// GetHighApplication returns HighApplication
-	GetHighApplication() *Application
+	GetHighApplication() ApplicationIdContainer
 	// GetArea returns Area
 	GetArea() byte
 	// GetCrc returns Crc
@@ -116,11 +116,11 @@ func (m *IdentifyReplyCommandExtendedDiagnosticSummary) InitializeParent(parent
 ///////////////////////////////////////////////////////////
 // Accessors for property fields.
 ///////////////////////////////////////////////////////////
-func (m *IdentifyReplyCommandExtendedDiagnosticSummary) GetLowApplication() *Application {
+func (m *IdentifyReplyCommandExtendedDiagnosticSummary) GetLowApplication() ApplicationIdContainer {
 	return m.LowApplication
 }
 
-func (m *IdentifyReplyCommandExtendedDiagnosticSummary) GetHighApplication() *Application {
+func (m *IdentifyReplyCommandExtendedDiagnosticSummary) GetHighApplication() ApplicationIdContainer {
 	return m.HighApplication
 }
 
@@ -197,7 +197,7 @@ func (m *IdentifyReplyCommandExtendedDiagnosticSummary) GetInstallationMMIError(
 ///////////////////////////////////////////////////////////
 
 // NewIdentifyReplyCommandExtendedDiagnosticSummary factory function for IdentifyReplyCommandExtendedDiagnosticSummary
-func NewIdentifyReplyCommandExtendedDiagnosticSummary(lowApplication *Application, highApplication *Application, area byte, crc uint16, serialNumber uint32, networkVoltage byte, outputUnit bool, enableChecksumAlarm bool, networkVoltageMarginal bool, networkVoltageLow bool, unitInLearnMode bool, microPowerReset bool, internalStackOverflow bool, commsTxError bool, microReset bool, EEDataError bool, EEChecksumError bool, EEWriteError bool, installationMMIError bool) *IdentifyReplyCommand {
+func NewIdentifyReplyCommandExtendedDiagnosticSummary(lowApplication ApplicationIdContainer, highApplication ApplicationIdContainer, area byte, crc uint16, serialNumber uint32, networkVoltage byte, outputUnit bool, enableChecksumAlarm bool, networkVoltageMarginal bool, networkVoltageLow bool, unitInLearnMode bool, microPowerReset bool, internalStackOverflow bool, commsTxError bool, microReset bool, EEDataError bool, EEChecksumError bool, EEWriteError bool, installationMMIError bool) *Ide [...]
 	child := &IdentifyReplyCommandExtendedDiagnosticSummary{
 		LowApplication:         lowApplication,
 		HighApplication:        highApplication,
@@ -255,10 +255,10 @@ func (m *IdentifyReplyCommandExtendedDiagnosticSummary) GetLengthInBitsCondition
 	lengthInBits := uint16(m.GetParentLengthInBits())
 
 	// Simple field (lowApplication)
-	lengthInBits += m.LowApplication.GetLengthInBits()
+	lengthInBits += 8
 
 	// Simple field (highApplication)
-	lengthInBits += m.HighApplication.GetLengthInBits()
+	lengthInBits += 8
 
 	// Simple field (area)
 	lengthInBits += 8
@@ -338,11 +338,11 @@ func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuf
 	if pullErr := readBuffer.PullContext("lowApplication"); pullErr != nil {
 		return nil, pullErr
 	}
-	_lowApplication, _lowApplicationErr := ApplicationParse(readBuffer)
+	_lowApplication, _lowApplicationErr := ApplicationIdContainerParse(readBuffer)
 	if _lowApplicationErr != nil {
 		return nil, errors.Wrap(_lowApplicationErr, "Error parsing 'lowApplication' field")
 	}
-	lowApplication := CastApplication(_lowApplication)
+	lowApplication := _lowApplication
 	if closeErr := readBuffer.CloseContext("lowApplication"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -351,11 +351,11 @@ func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuf
 	if pullErr := readBuffer.PullContext("highApplication"); pullErr != nil {
 		return nil, pullErr
 	}
-	_highApplication, _highApplicationErr := ApplicationParse(readBuffer)
+	_highApplication, _highApplicationErr := ApplicationIdContainerParse(readBuffer)
 	if _highApplicationErr != nil {
 		return nil, errors.Wrap(_highApplicationErr, "Error parsing 'highApplication' field")
 	}
-	highApplication := CastApplication(_highApplication)
+	highApplication := _highApplication
 	if closeErr := readBuffer.CloseContext("highApplication"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -527,8 +527,8 @@ func IdentifyReplyCommandExtendedDiagnosticSummaryParse(readBuffer utils.ReadBuf
 
 	// Create a partially initialized instance
 	_child := &IdentifyReplyCommandExtendedDiagnosticSummary{
-		LowApplication:         CastApplication(lowApplication),
-		HighApplication:        CastApplication(highApplication),
+		LowApplication:         lowApplication,
+		HighApplication:        highApplication,
 		Area:                   area,
 		Crc:                    crc,
 		SerialNumber:           serialNumber,
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALShortFormBasicMode.go b/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALShortFormBasicMode.go
index 808fb95..566bc41 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALShortFormBasicMode.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/MonitoredSALShortFormBasicMode.go
@@ -34,7 +34,7 @@ type MonitoredSALShortFormBasicMode struct {
 	BridgeCount   *BridgeCount
 	NetworkNumber *NetworkNumber
 	NoCounts      *byte
-	Application   *Application
+	Application   ApplicationIdContainer
 }
 
 // The corresponding interface
@@ -48,7 +48,7 @@ type IMonitoredSALShortFormBasicMode interface {
 	// GetNoCounts returns NoCounts
 	GetNoCounts() *byte
 	// GetApplication returns Application
-	GetApplication() *Application
+	GetApplication() ApplicationIdContainer
 	// GetLengthInBytes returns the length in bytes
 	GetLengthInBytes() uint16
 	// GetLengthInBits returns the length in bits
@@ -85,7 +85,7 @@ func (m *MonitoredSALShortFormBasicMode) GetNoCounts() *byte {
 	return m.NoCounts
 }
 
-func (m *MonitoredSALShortFormBasicMode) GetApplication() *Application {
+func (m *MonitoredSALShortFormBasicMode) GetApplication() ApplicationIdContainer {
 	return m.Application
 }
 
@@ -94,7 +94,7 @@ func (m *MonitoredSALShortFormBasicMode) GetApplication() *Application {
 ///////////////////////////////////////////////////////////
 
 // NewMonitoredSALShortFormBasicMode factory function for MonitoredSALShortFormBasicMode
-func NewMonitoredSALShortFormBasicMode(counts byte, bridgeCount *BridgeCount, networkNumber *NetworkNumber, noCounts *byte, application *Application, salType byte, salData *SALData) *MonitoredSAL {
+func NewMonitoredSALShortFormBasicMode(counts byte, bridgeCount *BridgeCount, networkNumber *NetworkNumber, noCounts *byte, application ApplicationIdContainer, salType byte, salData *SALData) *MonitoredSAL {
 	child := &MonitoredSALShortFormBasicMode{
 		Counts:        counts,
 		BridgeCount:   bridgeCount,
@@ -153,7 +153,7 @@ func (m *MonitoredSALShortFormBasicMode) GetLengthInBitsConditional(lastItem boo
 	}
 
 	// Simple field (application)
-	lengthInBits += m.Application.GetLengthInBits()
+	lengthInBits += 8
 
 	return lengthInBits
 }
@@ -234,11 +234,11 @@ func MonitoredSALShortFormBasicModeParse(readBuffer utils.ReadBuffer) (*Monitore
 	if pullErr := readBuffer.PullContext("application"); pullErr != nil {
 		return nil, pullErr
 	}
-	_application, _applicationErr := ApplicationParse(readBuffer)
+	_application, _applicationErr := ApplicationIdContainerParse(readBuffer)
 	if _applicationErr != nil {
 		return nil, errors.Wrap(_applicationErr, "Error parsing 'application' field")
 	}
-	application := CastApplication(_application)
+	application := _application
 	if closeErr := readBuffer.CloseContext("application"); closeErr != nil {
 		return nil, closeErr
 	}
@@ -253,7 +253,7 @@ func MonitoredSALShortFormBasicModeParse(readBuffer utils.ReadBuffer) (*Monitore
 		BridgeCount:   CastBridgeCount(bridgeCount),
 		NetworkNumber: CastNetworkNumber(networkNumber),
 		NoCounts:      noCounts,
-		Application:   CastApplication(application),
+		Application:   application,
 		MonitoredSAL:  &MonitoredSAL{},
 	}
 	_child.MonitoredSAL.Child = _child
diff --git a/plc4go/internal/plc4go/cbus/readwrite/model/StandardFormatStatusReply.go b/plc4go/internal/plc4go/cbus/readwrite/model/StandardFormatStatusReply.go
index ef9e7f9..f929254 100644
--- a/plc4go/internal/plc4go/cbus/readwrite/model/StandardFormatStatusReply.go
+++ b/plc4go/internal/plc4go/cbus/readwrite/model/StandardFormatStatusReply.go
@@ -34,7 +34,7 @@ const StandardFormatStatusReply_LF byte = 0x0A
 // The data-structure of this message
 type StandardFormatStatusReply struct {
 	StatusHeader *StatusHeader
-	Application  *Application
+	Application  ApplicationIdContainer
 	BlockStart   uint8
 	StatusBytes  []*StatusByte
 	Crc          *Checksum
@@ -45,7 +45,7 @@ type IStandardFormatStatusReply interface {
 	// GetStatusHeader returns StatusHeader
 	GetStatusHeader() *StatusHeader
 	// GetApplication returns Application
-	GetApplication() *Application
+	GetApplication() ApplicationIdContainer
 	// GetBlockStart returns BlockStart
 	GetBlockStart() uint8
 	// GetStatusBytes returns StatusBytes
@@ -67,7 +67,7 @@ func (m *StandardFormatStatusReply) GetStatusHeader() *StatusHeader {
 	return m.StatusHeader
 }
 
-func (m *StandardFormatStatusReply) GetApplication() *Application {
+func (m *StandardFormatStatusReply) GetApplication() ApplicationIdContainer {
 	return m.Application
 }
 
@@ -88,7 +88,7 @@ func (m *StandardFormatStatusReply) GetCrc() *Checksum {
 ///////////////////////////////////////////////////////////
 
 // NewStandardFormatStatusReply factory function for StandardFormatStatusReply
-func NewStandardFormatStatusReply(statusHeader *StatusHeader, application *Application, blockStart uint8, statusBytes []*StatusByte, crc *Checksum) *StandardFormatStatusReply {
+func NewStandardFormatStatusReply(statusHeader *StatusHeader, application ApplicationIdContainer, blockStart uint8, statusBytes []*StatusByte, crc *Checksum) *StandardFormatStatusReply {
 	return &StandardFormatStatusReply{StatusHeader: statusHeader, Application: application, BlockStart: blockStart, StatusBytes: statusBytes, Crc: crc}
 }
 
@@ -120,7 +120,7 @@ func (m *StandardFormatStatusReply) GetLengthInBitsConditional(lastItem bool) ui
 	lengthInBits += m.StatusHeader.GetLengthInBits()
 
 	// Simple field (application)
-	lengthInBits += m.Application.GetLengthInBits()
+	lengthInBits += 8
 
 	// Simple field (blockStart)
 	lengthInBits += 8
@@ -173,11 +173,11 @@ func StandardFormatStatusReplyParse(readBuffer utils.ReadBuffer) (*StandardForma
 	if pullErr := readBuffer.PullContext("application"); pullErr != nil {
 		return nil, pullErr
 	}
-	_application, _applicationErr := ApplicationParse(readBuffer)
+	_application, _applicationErr := ApplicationIdContainerParse(readBuffer)
 	if _applicationErr != nil {
 		return nil, errors.Wrap(_applicationErr, "Error parsing 'application' field")
 	}
-	application := CastApplication(_application)
+	application := _application
 	if closeErr := readBuffer.CloseContext("application"); closeErr != nil {
 		return nil, closeErr
 	}
diff --git a/plc4go/internal/plc4go/df1/readwrite/model/DF1SymbolMessageFrame.go b/plc4go/internal/plc4go/df1/readwrite/model/DF1SymbolMessageFrame.go
index f209558..39ee019 100644
--- a/plc4go/internal/plc4go/df1/readwrite/model/DF1SymbolMessageFrame.go
+++ b/plc4go/internal/plc4go/df1/readwrite/model/DF1SymbolMessageFrame.go
@@ -212,12 +212,9 @@ func DF1SymbolMessageFrameParse(readBuffer utils.ReadBuffer) (*DF1Symbol, error)
 		if _checksumRefErr != nil {
 			return nil, errors.Wrap(_checksumRefErr, "Error parsing 'checksum' field")
 		}
-		checksum, _checksumErr := CrcCheck(destinationAddress, sourceAddress, command)
-		if _checksumErr != nil {
-			return nil, errors.Wrap(_checksumErr, "Error parsing 'checksum' field")
-		}
+		checksum := CrcCheck(destinationAddress, sourceAddress, command)
 		if checksum != checksumRef {
-			return nil, errors.Errorf("Checksum verification failed. Expected %d but got %d", (checksumRef & 0xFFFF), (checksum & 0xFFFF))
+			return nil, errors.Errorf("Checksum verification failed. Expected %x but got %x", checksumRef, checksum)
 		}
 	}
 
@@ -282,11 +279,8 @@ func (m *DF1SymbolMessageFrame) Serialize(writeBuffer utils.WriteBuffer) error {
 
 		// Checksum Field (checksum) (Calculated)
 		{
-			_checksum, _checksumErr := CrcCheck(m.GetDestinationAddress(), m.GetSourceAddress(), m.GetCommand())
-			if _checksumErr != nil {
-				return errors.Wrap(_checksumErr, "Error serializing 'checksum' field")
-			}
-			_checksumErr = writeBuffer.WriteUint16("checksum", 16, (_checksum))
+			_checksum := CrcCheck(m.GetDestinationAddress(), m.GetSourceAddress(), m.GetCommand())
+			_checksumErr := writeBuffer.WriteUint16("checksum", 16, (_checksum))
 			if _checksumErr != nil {
 				return errors.Wrap(_checksumErr, "Error serializing 'checksum' field")
 			}
diff --git a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
index fc25e3a..d56a508 100644
--- a/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
+++ b/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxManufacturer.go
@@ -617,8 +617,11 @@ const (
 	KnxManufacturer_M_HONEYWELL_BUILDING_TECHNOLOGIES                    KnxManufacturer = 579
 	KnxManufacturer_M_COMFORTCLICK                                       KnxManufacturer = 580
 	KnxManufacturer_M_DORBAS_ELECTRIC                                    KnxManufacturer = 581
-	KnxManufacturer_M_ABB___RESERVED                                     KnxManufacturer = 582
-	KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED                    KnxManufacturer = 583
+	KnxManufacturer_M_REMKO_GMBH_AND_CO__KG                              KnxManufacturer = 582
+	KnxManufacturer_M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD   KnxManufacturer = 583
+	KnxManufacturer_M_ANDAS                                              KnxManufacturer = 584
+	KnxManufacturer_M_ABB___RESERVED                                     KnxManufacturer = 585
+	KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED                    KnxManufacturer = 586
 )
 
 var KnxManufacturerValues []KnxManufacturer
@@ -1208,6 +1211,9 @@ func init() {
 		KnxManufacturer_M_HONEYWELL_BUILDING_TECHNOLOGIES,
 		KnxManufacturer_M_COMFORTCLICK,
 		KnxManufacturer_M_DORBAS_ELECTRIC,
+		KnxManufacturer_M_REMKO_GMBH_AND_CO__KG,
+		KnxManufacturer_M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD,
+		KnxManufacturer_M_ANDAS,
 		KnxManufacturer_M_ABB___RESERVED,
 		KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED,
 	}
@@ -3365,10 +3371,22 @@ func (e KnxManufacturer) Number() uint16 {
 		}
 	case 582:
 		{ /* '582' */
-			return 43954
+			return 640
 		}
 	case 583:
 		{ /* '583' */
+			return 641
+		}
+	case 584:
+		{ /* '584' */
+			return 642
+		}
+	case 585:
+		{ /* '585' */
+			return 43954
+		}
+	case 586:
+		{ /* '586' */
 			return 43959
 		}
 	case 59:
@@ -5719,10 +5737,22 @@ func (e KnxManufacturer) Name() string {
 		}
 	case 582:
 		{ /* '582' */
-			return "ABB - reserved"
+			return "REMKO GmbH & Co. KG"
 		}
 	case 583:
 		{ /* '583' */
+			return "Shenzhen Congxun Intelligent Technology Co., LTD"
+		}
+	case 584:
+		{ /* '584' */
+			return "ANDAS"
+		}
+	case 585:
+		{ /* '585' */
+			return "ABB - reserved"
+		}
+	case 586:
+		{ /* '586' */
 			return "Busch-Jaeger Elektro - reserved"
 		}
 	case 59:
@@ -6997,8 +7027,14 @@ func KnxManufacturerByValue(value uint16) KnxManufacturer {
 	case 581:
 		return KnxManufacturer_M_DORBAS_ELECTRIC
 	case 582:
-		return KnxManufacturer_M_ABB___RESERVED
+		return KnxManufacturer_M_REMKO_GMBH_AND_CO__KG
 	case 583:
+		return KnxManufacturer_M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD
+	case 584:
+		return KnxManufacturer_M_ANDAS
+	case 585:
+		return KnxManufacturer_M_ABB___RESERVED
+	case 586:
 		return KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED
 	case 59:
 		return KnxManufacturer_M_ELECTRAK
@@ -8170,6 +8206,12 @@ func KnxManufacturerByName(value string) KnxManufacturer {
 		return KnxManufacturer_M_COMFORTCLICK
 	case "M_DORBAS_ELECTRIC":
 		return KnxManufacturer_M_DORBAS_ELECTRIC
+	case "M_REMKO_GMBH_AND_CO__KG":
+		return KnxManufacturer_M_REMKO_GMBH_AND_CO__KG
+	case "M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD":
+		return KnxManufacturer_M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD
+	case "M_ANDAS":
+		return KnxManufacturer_M_ANDAS
 	case "M_ABB___RESERVED":
 		return KnxManufacturer_M_ABB___RESERVED
 	case "M_BUSCH_JAEGER_ELEKTRO___RESERVED":
@@ -9383,6 +9425,12 @@ func (e KnxManufacturer) name() string {
 		return "M_COMFORTCLICK"
 	case KnxManufacturer_M_DORBAS_ELECTRIC:
 		return "M_DORBAS_ELECTRIC"
+	case KnxManufacturer_M_REMKO_GMBH_AND_CO__KG:
+		return "M_REMKO_GMBH_AND_CO__KG"
+	case KnxManufacturer_M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD:
+		return "M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD"
+	case KnxManufacturer_M_ANDAS:
+		return "M_ANDAS"
 	case KnxManufacturer_M_ABB___RESERVED:
 		return "M_ABB___RESERVED"
 	case KnxManufacturer_M_BUSCH_JAEGER_ELEKTRO___RESERVED:
diff --git a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
index ae1cb22..1741c2a 100644
--- a/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
+++ b/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
@@ -22,17 +22,14 @@ package model
 import (
 	"github.com/apache/plc4x/plc4go/internal/plc4go/spi/utils"
 	"github.com/pkg/errors"
-	"github.com/rs/zerolog/log"
 )
 
 // Code generated by code-generation. DO NOT EDIT.
 
 // The data-structure of this message
 type ModbusSerialADU struct {
-	TransactionId uint16
-	Length        uint16
-	Address       uint8
-	Pdu           *ModbusPDU
+	Address uint8
+	Pdu     *ModbusPDU
 
 	// Arguments.
 	Response bool
@@ -40,10 +37,6 @@ type ModbusSerialADU struct {
 
 // The corresponding interface
 type IModbusSerialADU interface {
-	// GetTransactionId returns TransactionId
-	GetTransactionId() uint16
-	// GetLength returns Length
-	GetLength() uint16
 	// GetAddress returns Address
 	GetAddress() uint8
 	// GetPdu returns Pdu
@@ -59,14 +52,6 @@ type IModbusSerialADU interface {
 ///////////////////////////////////////////////////////////
 // Accessors for property fields.
 ///////////////////////////////////////////////////////////
-func (m *ModbusSerialADU) GetTransactionId() uint16 {
-	return m.TransactionId
-}
-
-func (m *ModbusSerialADU) GetLength() uint16 {
-	return m.Length
-}
-
 func (m *ModbusSerialADU) GetAddress() uint8 {
 	return m.Address
 }
@@ -80,8 +65,8 @@ func (m *ModbusSerialADU) GetPdu() *ModbusPDU {
 ///////////////////////////////////////////////////////////
 
 // NewModbusSerialADU factory function for ModbusSerialADU
-func NewModbusSerialADU(transactionId uint16, length uint16, address uint8, pdu *ModbusPDU, response bool) *ModbusSerialADU {
-	return &ModbusSerialADU{TransactionId: transactionId, Length: length, Address: address, Pdu: pdu, Response: response}
+func NewModbusSerialADU(address uint8, pdu *ModbusPDU, response bool) *ModbusSerialADU {
+	return &ModbusSerialADU{Address: address, Pdu: pdu, Response: response}
 }
 
 func CastModbusSerialADU(structType interface{}) *ModbusSerialADU {
@@ -108,21 +93,15 @@ func (m *ModbusSerialADU) GetLengthInBits() uint16 {
 func (m *ModbusSerialADU) GetLengthInBitsConditional(lastItem bool) uint16 {
 	lengthInBits := uint16(0)
 
-	// Simple field (transactionId)
-	lengthInBits += 16
-
-	// Reserved Field (reserved)
-	lengthInBits += 16
-
-	// Simple field (length)
-	lengthInBits += 16
-
 	// Simple field (address)
 	lengthInBits += 8
 
 	// Simple field (pdu)
 	lengthInBits += m.Pdu.GetLengthInBits()
 
+	// Checksum Field (checksum)
+	lengthInBits += 16
+
 	return lengthInBits
 }
 
@@ -137,34 +116,6 @@ func ModbusSerialADUParse(readBuffer utils.ReadBuffer, response bool) (*ModbusSe
 	currentPos := readBuffer.GetPos()
 	_ = currentPos
 
-	// Simple Field (transactionId)
-	_transactionId, _transactionIdErr := readBuffer.ReadUint16("transactionId", 16)
-	if _transactionIdErr != nil {
-		return nil, errors.Wrap(_transactionIdErr, "Error parsing 'transactionId' field")
-	}
-	transactionId := _transactionId
-
-	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
-	{
-		reserved, _err := readBuffer.ReadUint16("reserved", 16)
-		if _err != nil {
-			return nil, errors.Wrap(_err, "Error parsing 'reserved' field")
-		}
-		if reserved != uint16(0x0000) {
-			log.Info().Fields(map[string]interface{}{
-				"expected value": uint16(0x0000),
-				"got value":      reserved,
-			}).Msg("Got unexpected response.")
-		}
-	}
-
-	// Simple Field (length)
-	_length, _lengthErr := readBuffer.ReadUint16("length", 16)
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field")
-	}
-	length := _length
-
 	// Simple Field (address)
 	_address, _addressErr := readBuffer.ReadUint8("address", 8)
 	if _addressErr != nil {
@@ -185,12 +136,24 @@ func ModbusSerialADUParse(readBuffer utils.ReadBuffer, response bool) (*ModbusSe
 		return nil, closeErr
 	}
 
+	// Checksum Field (checksum)
+	{
+		checksumRef, _checksumRefErr := readBuffer.ReadUint16("checksum", 16)
+		if _checksumRefErr != nil {
+			return nil, errors.Wrap(_checksumRefErr, "Error parsing 'checksum' field")
+		}
+		checksum := CrcCheck(address, pdu)
+		if checksum != checksumRef {
+			return nil, errors.Errorf("Checksum verification failed. Expected %x but got %x", checksumRef, checksum)
+		}
+	}
+
 	if closeErr := readBuffer.CloseContext("ModbusSerialADU"); closeErr != nil {
 		return nil, closeErr
 	}
 
 	// Create the instance
-	return NewModbusSerialADU(transactionId, length, address, pdu, response), nil
+	return NewModbusSerialADU(address, pdu, response), nil
 }
 
 func (m *ModbusSerialADU) Serialize(writeBuffer utils.WriteBuffer) error {
@@ -198,28 +161,6 @@ func (m *ModbusSerialADU) Serialize(writeBuffer utils.WriteBuffer) error {
 		return pushErr
 	}
 
-	// Simple Field (transactionId)
-	transactionId := uint16(m.TransactionId)
-	_transactionIdErr := writeBuffer.WriteUint16("transactionId", 16, (transactionId))
-	if _transactionIdErr != nil {
-		return errors.Wrap(_transactionIdErr, "Error serializing 'transactionId' field")
-	}
-
-	// Reserved Field (reserved)
-	{
-		_err := writeBuffer.WriteUint16("reserved", 16, uint16(0x0000))
-		if _err != nil {
-			return errors.Wrap(_err, "Error serializing 'reserved' field")
-		}
-	}
-
-	// Simple Field (length)
-	length := uint16(m.Length)
-	_lengthErr := writeBuffer.WriteUint16("length", 16, (length))
-	if _lengthErr != nil {
-		return errors.Wrap(_lengthErr, "Error serializing 'length' field")
-	}
-
 	// Simple Field (address)
 	address := uint8(m.Address)
 	_addressErr := writeBuffer.WriteUint8("address", 8, (address))
@@ -239,6 +180,15 @@ func (m *ModbusSerialADU) Serialize(writeBuffer utils.WriteBuffer) error {
 		return errors.Wrap(_pduErr, "Error serializing 'pdu' field")
 	}
 
+	// Checksum Field (checksum) (Calculated)
+	{
+		_checksum := CrcCheck(m.GetAddress(), m.GetPdu())
+		_checksumErr := writeBuffer.WriteUint16("checksum", 16, (_checksum))
+		if _checksumErr != nil {
+			return errors.Wrap(_checksumErr, "Error serializing 'checksum' field")
+		}
+	}
+
 	if popErr := writeBuffer.PopContext("ModbusSerialADU"); popErr != nil {
 		return popErr
 	}
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/readwrite/utils/StaticHelper.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/readwrite/utils/StaticHelper.java
new file mode 100644
index 0000000..a4e11e0
--- /dev/null
+++ b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/readwrite/utils/StaticHelper.java
@@ -0,0 +1,29 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.modbus.readwrite.utils;
+
+import org.apache.plc4x.java.modbus.readwrite.ModbusPDU;
+
+public class StaticHelper {
+
+    public static int crcCheck(short address, ModbusPDU pdu) {
+        return 0;
+    }
+
+}
diff --git a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
index 8379092..1deb8d1 100644
--- a/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
+++ b/plc4net/drivers/knxnetip/src/drivers/knxnetip/readwrite/model/KnxManufacturer.cs
@@ -606,8 +606,11 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
         M_HONEYWELL_BUILDING_TECHNOLOGIES = 579,
         M_COMFORTCLICK = 580,
         M_DORBAS_ELECTRIC = 581,
-        M_ABB___RESERVED = 582,
-        M_BUSCH_JAEGER_ELEKTRO___RESERVED = 583,
+        M_REMKO_GMBH_AND_CO__KG = 582,
+        M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD = 583,
+        M_ANDAS = 584,
+        M_ABB___RESERVED = 585,
+        M_BUSCH_JAEGER_ELEKTRO___RESERVED = 586,
     }
 
     public static class KnxManufacturerInfo
@@ -2228,10 +2231,19 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
                 case KnxManufacturer.M_DORBAS_ELECTRIC: { /* '581' */
                     return 639;
                 }
-                case KnxManufacturer.M_ABB___RESERVED: { /* '582' */
+                case KnxManufacturer.M_REMKO_GMBH_AND_CO__KG: { /* '582' */
+                    return 640;
+                }
+                case KnxManufacturer.M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD: { /* '583' */
+                    return 641;
+                }
+                case KnxManufacturer.M_ANDAS: { /* '584' */
+                    return 642;
+                }
+                case KnxManufacturer.M_ABB___RESERVED: { /* '585' */
                     return 43954;
                 }
-                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '583' */
+                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '586' */
                     return 43959;
                 }
                 case KnxManufacturer.M_ELECTRAK: { /* '59' */
@@ -3990,10 +4002,19 @@ namespace org.apache.plc4net.drivers.knxnetip.readwrite.model
                 case KnxManufacturer.M_DORBAS_ELECTRIC: { /* '581' */
                     return "DORBAS ELECTRIC";
                 }
-                case KnxManufacturer.M_ABB___RESERVED: { /* '582' */
+                case KnxManufacturer.M_REMKO_GMBH_AND_CO__KG: { /* '582' */
+                    return "REMKO GmbH & Co. KG";
+                }
+                case KnxManufacturer.M_SHENZHEN_CONGXUN_INTELLIGENT_TECHNOLOGY_CO___LTD: { /* '583' */
+                    return "Shenzhen Congxun Intelligent Technology Co., LTD";
+                }
+                case KnxManufacturer.M_ANDAS: { /* '584' */
+                    return "ANDAS";
+                }
+                case KnxManufacturer.M_ABB___RESERVED: { /* '585' */
                     return "ABB - reserved";
                 }
-                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '583' */
+                case KnxManufacturer.M_BUSCH_JAEGER_ELEKTRO___RESERVED: { /* '586' */
                     return "Busch-Jaeger Elektro - reserved";
                 }
                 case KnxManufacturer.M_ELECTRAK: { /* '59' */
diff --git a/pom.xml b/pom.xml
index 4fd3429..339794c 100644
--- a/pom.xml
+++ b/pom.xml
@@ -164,7 +164,7 @@
     <asciidoctorj.version>2.5.3</asciidoctorj.version>
     <asciidoctorj.diagram.version>2.2.1</asciidoctorj.diagram.version>
 
-    <skip-code-generation-tests>true</skip-code-generation-tests>
+    <skip-code-generation-tests>false</skip-code-generation-tests>
     <skip-dependency-cve-scan>true</skip-dependency-cve-scan>
   </properties>
 
diff --git a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
index c6009b5..2d54c99 100644
--- a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
+++ b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
@@ -47,46 +47,14 @@
     [simple         ModbusPDU('response')   pdu]
 ]
 
-[type ModbusRtuADU(bit response) byteOrder='LITTLE_ENDIAN'
-    // The start is indicated by more than 3,5 chars of value 0x00 ...
-    // The protocol will take care of consuming all except the last 4 empty chars
-    // The Length is determined by starting at the last 4 empty characters
-    // to the start of the next 4 empty characters
-    [const          uint 8      space1 0x00           ] // Character '\0'
-    [const          uint 8      space2 0x00           ] // Character '\0'
-    [const          uint 8      space3 0x00           ] // Character '\0'
-    [const          uint 8      space4 0x00           ] // Character '\0'
+// This is the base type used by both ModbusRTU and ModbusASCII
+[type ModbusSerialADU(bit response) byteOrder='LITTLE_ENDIAN'
     [simple         uint 8      address]
 
     // The actual modbus payload
     [simple         ModbusPDU('response')   pdu]
-    //[checksum       uint 16     crc            ]
-
-    // The at least 4 silence chars is a separator ... so we don't actually consume them.
-    // They will be consumed by the next packet
-    //[const          uint 8      0x00           ] // Character '\0'
-    //[const          uint 8      0x00           ] // Character '\0'
-    //[const          uint 8      0x00           ] // Character '\0'
-    //[const          uint 8      0x00           ] // Character '\0'
-]
-
-[type ModbusAsciiADU(bit response) byteOrder='BIG_ENDIAN'
-    [const          uint 8      start 0x3A           ] // Character ':'
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    // Starting the ASCII encoded part where every byte is encoded as the ASCII representation of the raw byte.
-    [simple         uint 8      address        ]
-
-    // The actual modbus payload
-    [simple         ModbusPDU('response')   pdu]
-
-    //[checksum       uint 8      lrc            ]
-
-    // End the ASCII encoded part ...
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
-    [const          uint 8      cr 0x0D           ] // Character '\r'
-    [const          uint 8      lf 0x0A           ] // Character '\n'
+    [checksum       uint 16     crc         'STATIC_CALL("crcCheck", address, pdu)']
 ]
 
 [discriminatedType ModbusPDU(bit response)