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 2020/06/16 19:34:34 UTC

[plc4x] branch feature/c-code-generation-tagged-unions updated: - Continued working on the C code generation -- Fixed a lot of little issues. -- Cleaned up the usage of pointers and no-pointers

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

cdutz pushed a commit to branch feature/c-code-generation-tagged-unions
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/feature/c-code-generation-tagged-unions by this push:
     new de9ef6c  - Continued working on the C code generation -- Fixed a lot of little issues. -- Cleaned up the usage of pointers and no-pointers
de9ef6c is described below

commit de9ef6c46756b29275ad3e7db59fd5c11fe6f64b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Jun 16 21:34:25 2020 +0200

    - Continued working on the C code generation
    -- Fixed a lot of little issues.
    -- Cleaned up the usage of pointers and no-pointers
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |  18 +-
 .../plc4x/language/c/CLanguageTemplateHelper.java  | 115 ++++-
 .../resources/templates/c/pojo-template-c.ftlh     |  99 ++--
 .../resources/templates/c/pojo-template-h.ftlh     |  33 +-
 .../generated-sources/modbus/includes/modbus_pdu.h |   8 +-
 .../modbus/includes/modbus_serial_adu.h            |   2 +-
 .../modbus/includes/modbus_tcp_adu.h               |   2 +-
 .../modbus/src/modbus_constants.c                  |   6 +-
 .../generated-sources/modbus/src/modbus_pdu.c      | 560 ++++++++++++++++-----
 .../src/modbus_pdu_read_file_record_request_item.c |  12 +-
 .../modbus_pdu_read_file_record_response_item.c    |  10 +-
 .../modbus_pdu_write_file_record_request_item.c    |  14 +-
 .../modbus_pdu_write_file_record_response_item.c   |  14 +-
 .../modbus/src/modbus_serial_adu.c                 |  14 +-
 .../generated-sources/modbus/src/modbus_tcp_adu.c  |  14 +-
 .../generated-sources/s7/includes/cotp_packet.h    |   8 +-
 .../generated-sources/s7/includes/cotp_parameter.h |   2 +-
 .../generated-sources/s7/includes/s7_address.h     |   4 +-
 .../generated-sources/s7/includes/s7_parameter.h   |   6 +-
 .../s7/includes/s7_parameter_user_data_item.h      |   6 +-
 .../generated-sources/s7/includes/s7_payload.h     |   8 +-
 .../s7/includes/s7_payload_user_data_item.h        |   7 +-
 .../s7/includes/s7_var_request_parameter_item.h    |   2 +-
 .../generated-sources/s7/includes/tpkt_packet.h    |   2 +-
 .../plc4c/generated-sources/s7/src/cotp_packet.c   | 106 ++--
 .../generated-sources/s7/src/cotp_parameter.c      |  44 +-
 .../plc4c/generated-sources/s7/src/s7_address.c    |  49 +-
 .../plc4c/generated-sources/s7/src/s7_message.c    |  46 +-
 .../plc4c/generated-sources/s7/src/s7_parameter.c  | 106 +++-
 .../s7/src/s7_parameter_user_data_item.c           |  77 ++-
 .../plc4c/generated-sources/s7/src/s7_payload.c    |  72 ++-
 .../s7/src/s7_payload_user_data_item.c             |  43 +-
 .../s7/src/s7_var_payload_data_item.c              |  24 +-
 .../s7/src/s7_var_payload_status_item.c            |   6 +-
 .../s7/src/s7_var_request_parameter_item.c         |  15 +-
 .../generated-sources/s7/src/szl_data_tree_item.c  |  14 +-
 sandbox/plc4c/generated-sources/s7/src/szl_id.c    |  10 +-
 .../plc4c/generated-sources/s7/src/tpkt_packet.c   |  10 +-
 38 files changed, 1164 insertions(+), 424 deletions(-)

diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index f5ed8b7..7e576a9 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -65,6 +65,17 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
                 return 16;
             }
         });
+        builtInFields.put("lastItem", new SimpleTypeReference() {
+            @Override
+            public SimpleBaseType getBaseType() {
+                return SimpleBaseType.BIT;
+            }
+
+            @Override
+            public int getSizeInBits() {
+                return 1;
+            }
+        });
     }
 
     public BaseFreemarkerLanguageTemplateHelper(TypeDefinition thisType, String protocolName, String flavorName, Map<String, TypeDefinition> types) {
@@ -209,8 +220,7 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
             return Optional.of(builtInFields.get(propertyName));
         }
         // Check if the expression root is referencing a field
-        final Optional<PropertyField> propertyFieldOptional = baseType.getFields().stream().filter(
-            field -> field instanceof PropertyField).map(field -> (PropertyField) field).filter(
+        final Optional<PropertyField> propertyFieldOptional = baseType.getPropertyFields().stream().filter(
             propertyField -> propertyField.getName().equals(propertyName)).findFirst();
         if(propertyFieldOptional.isPresent()) {
             final PropertyField propertyField = propertyFieldOptional.get();
@@ -280,6 +290,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         return field instanceof EnumField;
     }
 
+    public boolean isOptionalField(Field field) {
+        return field instanceof OptionalField;
+    }
+
     public boolean isSwitchField(Field field) {
         return field instanceof SwitchField;
     }
diff --git a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
index 416fb11..7cec423 100644
--- a/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
+++ b/build-utils/language-c/src/main/java/org/apache/plc4x/language/c/CLanguageTemplateHelper.java
@@ -118,6 +118,46 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
         return getLanguageTypeNameForTypeReference(typeReference);
     }
 
+    public Map<ComplexTypeDefinition, ConstField> getAllConstFields() {
+        Map<ComplexTypeDefinition, ConstField> constFields = new HashMap<>();
+        ((ComplexTypeDefinition) getThisTypeDefinition()).getConstFields().forEach(
+            constField -> constFields.put((ComplexTypeDefinition) getThisTypeDefinition(), constField));
+        if(getSwitchField() != null) {
+            for (DiscriminatedComplexTypeDefinition switchCase : getSwitchField().getCases()) {
+                switchCase.getConstFields().forEach(
+                    constField -> constFields.put(switchCase, constField));
+            }
+        }
+        return constFields;
+    }
+
+    /**
+     * If a property references a complex type in an argument, we need to pass that as a pointer,
+     * same with optional fields.
+     *
+     * @param typeDefinition type that contains the property or attribute.
+     * @param propertyName name of the property or attribute
+     * @return true if the access needs to be using pointers
+     */
+    public boolean requiresPointerAccess(ComplexTypeDefinition typeDefinition, String propertyName) {
+        final Optional<NamedField> typeField = typeDefinition.getFields().stream().filter(field -> field instanceof NamedField).map(field -> (NamedField) field).filter(namedField -> namedField.getName().equals(propertyName)).findFirst();
+        // If the property name refers to a field, check if it's an optional field.
+        // If it is, pointer access is required, if not, it's not.
+        if(typeField.isPresent()) {
+            final NamedField namedField = typeField.get();
+            return namedField instanceof OptionalField;
+        }
+        final Optional<Argument> parserArgument = Arrays.stream(typeDefinition.getParserArguments()).filter(argument -> argument.getName().equals(propertyName)).findFirst();
+        // If the property name refers to a parser argument, as soon as it's a complex type,
+        // pointer access is required.
+        if(parserArgument.isPresent()) {
+            return parserArgument.get().getType() instanceof ComplexTypeReference;
+        }
+        // In all other cases, the property might be a built-in constant, so we don't need pointer
+        // access for any of these.
+        return false;
+    }
+
     /**
      * Converts a given type-reference into a concrete type in C
      * If it's a complex type, this is trivial, as the typename then follows the usual pattern.
@@ -365,15 +405,15 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
 
 
 
-    public String toParseExpression(Field field, Term term, Argument[] parserArguments) {
-        return toExpression(field, term, term1 -> toVariableParseExpression(field, term1, parserArguments));
+    public String toParseExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] parserArguments) {
+        return toExpression(baseType, field, term, term1 -> toVariableParseExpression(baseType, field, term1, parserArguments));
     }
 
-    public String toSerializationExpression(Field field, Term term, Argument[] parserArguments) {
-        return toExpression(field, term, term1 -> toVariableSerializationExpression(field, term1, parserArguments));
+    public String toSerializationExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] parserArguments) {
+        return toExpression(baseType, field, term, term1 -> toVariableSerializationExpression(baseType, field, term1, parserArguments));
     }
 
-    private String toExpression(Field field, Term term, Function<Term, String> variableExpressionGenerator) {
+    private String toExpression(ComplexTypeDefinition baseType, Field field, Term term, Function<Term, String> variableExpressionGenerator) {
         if (term == null) {
             return "";
         }
@@ -402,11 +442,11 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
             Term a = ut.getA();
             switch (ut.getOperation()) {
                 case "!":
-                    return "!(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "!(" + toExpression(baseType, field, a, variableExpressionGenerator) + ")";
                 case "-":
-                    return "-(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "-(" + toExpression(baseType, field, a, variableExpressionGenerator) + ")";
                 case "()":
-                    return "(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "(" + toExpression(baseType, field, a, variableExpressionGenerator) + ")";
                 default:
                     throw new RuntimeException("Unsupported unary operation type " + ut.getOperation());
             }
@@ -417,9 +457,9 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
             String operation = bt.getOperation();
             switch (operation) {
                 case "^":
-                    return "Math.pow((" + toExpression(field, a, variableExpressionGenerator) + "), (" + toExpression(field, b, variableExpressionGenerator) + "))";
+                    return "Math.pow((" + toExpression(baseType, field, a, variableExpressionGenerator) + "), (" + toExpression(baseType, field, b, variableExpressionGenerator) + "))";
                 default:
-                    return "(" + toExpression(field, a, variableExpressionGenerator) + ") " + operation + " (" + toExpression(field, b, variableExpressionGenerator) + ")";
+                    return "(" + toExpression(baseType, field, a, variableExpressionGenerator) + ") " + operation + " (" + toExpression(baseType, field, b, variableExpressionGenerator) + ")";
             }
         } else if (term instanceof TernaryTerm) {
             TernaryTerm tt = (TernaryTerm) term;
@@ -427,7 +467,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
                 Term a = tt.getA();
                 Term b = tt.getB();
                 Term c = tt.getC();
-                return "((" + toExpression(field, a, variableExpressionGenerator) + ") ? " + toExpression(field, b, variableExpressionGenerator) + " : " + toExpression(field, c, variableExpressionGenerator) + ")";
+                return "((" + toExpression(baseType, field, a, variableExpressionGenerator) + ") ? " + toExpression(baseType, field, b, variableExpressionGenerator) + " : " + toExpression(baseType, field, c, variableExpressionGenerator) + ")";
             } else {
                 throw new RuntimeException("Unsupported ternary operation type " + tt.getOperation());
             }
@@ -436,8 +476,45 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
         }
     }
 
-    public String toVariableParseExpression(Field field, Term term, Argument[] parserArguments) {
+    public String toVariableParseExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] parserArguments) {
         VariableLiteral vl = (VariableLiteral) term;
+        if("CAST".equals(vl.getName())) {
+
+            StringBuilder sb = new StringBuilder();
+            if((vl.getArgs() == null) || (vl.getArgs().size() != 2)) {
+                throw new RuntimeException("A CAST expression expects exactly two arguments.");
+            }
+            final VariableLiteral sourceTerm = (VariableLiteral) vl.getArgs().get(0);
+            final VariableLiteral typeTerm = (VariableLiteral) vl.getArgs().get(1);
+            ComplexTypeReference castTypeReference = typeTerm::getName;
+            final TypeDefinition castType = getTypeDefinitionForTypeReference(castTypeReference);
+            // If we're casting to a sub-type of a discriminated value, we got to cast to the parent
+            // type instead and add the name of the sub-type as prefix to the property we're tryging to
+            // access next.
+            String castToType;
+            String restExpression;
+            if(castType.getParentType() != null) {
+                castToType = castType.getParentType().getName();
+                if(vl.getChild() != null) {
+                    // Change the name of the property to contain the sub-type-prefix.
+                    restExpression = "." + camelCaseToSnakeCase(castType.getName()) + "_" + toVariableExpressionRest(vl.getChild());
+                } else {
+                    restExpression = "";
+                }
+            } else {
+                castToType = castType.getName();
+                if(vl.getChild() != null) {
+                    restExpression = "." + toVariableExpressionRest(vl.getChild());
+                } else {
+                    restExpression = "";
+                }
+            }
+            sb.append("((plc4c_").append(getCTypeName(castToType)).append(") (")
+                .append(requiresPointerAccess(baseType, sourceTerm.getName()) ? "*" : "")
+                .append(toVariableParseExpression(baseType, field, sourceTerm, parserArguments)).append("))")
+                .append(restExpression);
+            return sb.toString();
+        }
         // Any name that is full upper-case is considered a function call.
         // These are generally defined in the spi file evaluation_helper.c.
         // All should have a name prefix "plc4c_spi_evaluation_helper_".
@@ -450,7 +527,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
                     if (!firstArg) {
                         sb.append(", ");
                     }
-                    sb.append(toParseExpression(field, arg, parserArguments));
+                    sb.append(toParseExpression(baseType, field, arg, parserArguments));
                     firstArg = false;
                 }
                 sb.append(")");
@@ -465,11 +542,11 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
 
         // Try to find the type of the addressed property.
         final Optional<TypeReference> propertyTypeOptional =
-            getTypeReferenceForProperty((ComplexTypeDefinition) getThisTypeDefinition(), name);
+            getTypeReferenceForProperty(baseType, name);
 
         // If we couldn't find the type, we didn't find the property.
         if(!propertyTypeOptional.isPresent()) {
-            throw new RuntimeException("Could not find property with name '" + name + "' in type " + getThisTypeDefinition().getName());
+            throw new RuntimeException("Could not find property with name '" + name + "' in type " + baseType.getName());
         }
 
         final TypeReference propertyType = propertyTypeOptional.get();
@@ -513,7 +590,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
         return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
     }
 
-    private String toVariableSerializationExpression(Field field, Term term, Argument[] serialzerArguments) {
+    private String toVariableSerializationExpression(ComplexTypeDefinition baseType, Field field, Term term, Argument[] serialzerArguments) {
         VariableLiteral vl = (VariableLiteral) term;
         if ("STATIC_CALL".equals(vl.getName())) {
             StringBuilder sb = new StringBuilder();
@@ -568,7 +645,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
                                 break;
                         }
                     } else {
-                        sb.append(toVariableSerializationExpression(field, va, null));
+                        sb.append(toVariableSerializationExpression(baseType, field, va, null));
                     }
                 } else if (arg instanceof StringLiteral) {
                     sb.append(((StringLiteral) arg).getValue());
@@ -647,7 +724,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
                                     break;
                             }
                         } else {
-                            sb.append(toVariableSerializationExpression(field, va, null));
+                            sb.append(toVariableSerializationExpression(baseType, field, va, null));
                         }
                     } else if (arg instanceof StringLiteral) {
                         sb.append(((StringLiteral) arg).getValue());
@@ -700,7 +777,7 @@ public class CLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelpe
     }
 
     private String toVariableExpressionRest(VariableLiteral vl) {
-        return "get" + WordUtils.capitalize(vl.getName()) + "()" + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
+        return camelCaseToSnakeCase(vl.getName()) + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
             ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : ""));
     }
 
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
index 6c5fe03..fd097e1 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-c.ftlh
@@ -89,16 +89,17 @@ plc4c_${helper.getCTypeName(type.name)}_discriminator plc4c_${helper.getCTypeNam
 
 </#if>
 // Parse function.
-plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* buf, <#if type.parserArguments?has_content><#list type.parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !helper.isSimpleTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>plc4c_${helper.getCTypeName(type.name)}** message) {
+plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_buffer* buf, <#if type.parserArguments?has_content><#list type.parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#if !helper.isSimpleTypeReference(parserArgument.type)>*</#if> ${parserArgument.name}<#sep>, </#list>, </#if>plc4c_${helper.getCTypeName(type.name)}** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_${helper.getCTypeName(type.name)}* msg = malloc(sizeof(plc4c_${helper.getCTypeName(type.name)}));
+  (*_message) = malloc(sizeof(plc4c_${helper.getCTypeName(type.name)}));
 <#if type.getPropertyFields()?has_content>
 
 </#if>
-<#list type.fields as field>
+<#macro fieldName baseType field><#if baseType != type>${helper.camelCaseToSnakeCase(baseType.name)}_</#if>${helper.camelCaseToSnakeCase(field.name)}</#macro>
+<#macro fieldParser baseType field>
     <#switch field.typeName>
         <#case "array">
             <#assign arrayField = field>
@@ -113,26 +114,37 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
   {
             <#if helper.isCountArrayField(field)>
     // Count array
-    uint8_t itemCount = ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)};
+    uint8_t itemCount = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)};
     for(int curItem = 0; curItem < itemCount; curItem++) {
-      <#if !helper.isSimpleTypeReference(arrayField.type)>boolean lastItem = curItem == (itemCount - 1);</#if>
+      <#if !helper.isSimpleTypeReference(arrayField.type)>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 helper.isSimpleTypeReference(arrayField.type)>
       ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+      plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
                 <#else>
       <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
       ${helper.getLanguageTypeNameForField(field)}* value = NULL;
-      plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${arrayField.name});
+      plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &value);
+      plc4c_utils_list_insert_head_value(&${arrayField.name}, value);
                 </#if>
       plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
     }
             <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
             <#elseif helper.isLengthArrayField(field)>
     // Length array
-    uint8_t _${arrayField.name}Length = ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)};
+    uint8_t _${arrayField.name}Length = ${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)};
     uint8_t ${arrayField.name}EndPos = plc4c_spi_read_get_pos(buf) + _${arrayField.name}Length;
     while(plc4c_spi_read_get_pos(buf) < ${arrayField.name}EndPos) {
-      plc4c_utils_list_insert_head_value(&${arrayField.name}, <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${field.name})</#if>);
+                <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
+                <#if helper.isSimpleTypeReference(arrayField.type)>
+      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+      plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
+                <#else>
+                <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
+      ${helper.getLanguageTypeNameForField(field)}* value = NULL;
+      plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &value);
+      plc4c_utils_list_insert_head_value(&${arrayField.name}, value);
+                </#if>
                 <#-- After parsing, update the current position, but only if it's needed -->
                 <#if arrayField.loopExpression.contains("curPos")>
       curPos = plc4c_spi_read_get_pos(buf) - startPos;
@@ -141,8 +153,17 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
             <#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
             <#elseif helper.isTerminatedArrayField(field)>
     // Terminated array
-    while(!((boolean) (${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}))) {
-      plc4c_utils_list_insert_head_value(&${arrayField.name}, <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(arrayField.type, parserArgument?index), true)}) (${helper.toParseExpression(arrayField, parserArgument, type.parserArguments)})<#sep>, </#s [...]
+    while(!((boolean) (${helper.toParseExpression(baseType, arrayField, arrayField.loopExpression, type.parserArguments)}))) {
+            <#-- Inizialize a local variable with the simple type (Intentionally keeping the java-style names so they can be used in expressions) -->
+                <#if helper.isSimpleTypeReference(arrayField.type)>
+      ${helper.getLanguageTypeNameForTypeReference(arrayField.type)} value = ${helper.getReadBufferReadMethodCall(arrayField.type)};
+      plc4c_utils_list_insert_head_value(&${arrayField.name}, &value);
+                <#else>
+                <#-- Inizialize a local variable with the complex type (Intentionally keeping the java-style names so they can be used in expressions) -->
+      ${helper.getLanguageTypeNameForField(field)}* value = NULL;
+      plc4c_${helper.getCTypeName(arrayField.type.name)}_parse(buf<#if field.params?has_content>, <#list field.params as parserTerm>${helper.toParseExpression(baseType, field, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &value);
+      plc4c_utils_list_insert_head_value(&${arrayField.name}, value);
+                </#if>
               <#-- After parsing, update the current position, but only if it's needed -->
               <#if arrayField.loopExpression.contains("curPos")>
       curPos = plc4c_spi_read_get_pos(buf) - startPos;
@@ -150,6 +171,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
     }
             </#if>
   }
+  (*_message)-><@fieldName baseType=baseType field=arrayField/> = ${arrayField.name};
             <#break>
         <#case "checksum">
             <#assign checksumField = field>
@@ -160,7 +182,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
     // Create an array of all the bytes read in this message element so far.
     byte[] checksumRawData = plc4c_spi_read_get_bytes(buf, startPos, plc4c_spi_read_get_pos(buf));
     ${helper.getLanguageTypeNameForField(field)} _checksumRef = ${helper.getReadBufferReadMethodCall(checksumField.type)};
-    ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(checksumField, checksumField.checksumExpression, type.parserArguments)});
+    ${helper.getLanguageTypeNameForField(field)} _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, checksumField, checksumField.checksumExpression, type.parserArguments)});
     if(_checksum != _checksumRef) {
       return PARSE_ERROR;
       // throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_checksumRef & 0xFFFF, _checksum & 0xFFFF));
@@ -173,9 +195,9 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
 
   // Const Field (${constField.name})
   ${helper.getLanguageTypeNameForField(field)} ${constField.name} = ${helper.getReadBufferReadMethodCall(constField.type)};
-  if(${constField.name} != ${helper.getCTypeName(type.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case}) {
+  if(${constField.name} != ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case}) {
     return PARSE_ERROR;
-    // throw new ParseException("Expected constant value " + ${type.name}.${constField.name?upper_case} + " but got " + ${constField.name});
+    // throw new ParseException("Expected constant value " + ${helper.getCTypeName(baseType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case} + " but got " + ${constField.name});
   }
             <#break>
         <#case "discriminator">
@@ -190,7 +212,7 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
 
   // Enum field (${enumField.name})
   ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = ${helper.getReadBufferReadMethodCall(helper.getEnumBaseTypeReference(enumField.type))};
-  msg->${helper.camelCaseToSnakeCase(enumField.name)} = ${enumField.name};
+  (*_message)-><@fieldName baseType=baseType field=enumField/> = ${enumField.name};
             <#break>
         <#case "implicit">
             <#assign implicitField = field>
@@ -208,8 +230,8 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
             <#assign manualField = field>
 
   // Manual Field (${manualField.name})
-  ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualField, manualField.parseExpression, type.parserArguments)});
-  msg->${helper.camelCaseToSnakeCase(manualField.name)} = ${manualField.name};
+  ${helper.getLanguageTypeNameForField(field)} ${manualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, manualField, manualField.parseExpression, type.parserArguments)});
+  (*_message)-><@fieldName baseType=baseType field=manualField/> = ${manualField.name};
         <#break>
         <#case "optional">
             <#assign optionalField = field>
@@ -218,26 +240,31 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
             <#if optionalField.conditionExpression.contains("curPos")>
   curPos = plc4c_spi_read_get_pos(buf) - startPos;
             </#if>
-  ${helper.getLanguageTypeNameForField(field)}<#if !helper.isSimpleTypeReference(optionalField.type)>*</#if> ${optionalField.name} = <#if !helper.isSimpleTypeReference(optionalField.type)>NULL<#else>0</#if>;
-  if(${helper.toParseExpression(field, optionalField.conditionExpression, type.parserArguments)}) {
+  ${helper.getLanguageTypeNameForField(field)}* ${optionalField.name} = NULL;
+  if(${helper.toParseExpression(baseType, field, optionalField.conditionExpression, type.parserArguments)}) {
+    ${optionalField.name} = malloc(sizeof(${helper.getLanguageTypeNameForField(field)}));
+    if(${optionalField.name} == NULL) {
+      return NO_MEMORY;
+    }
         <#if helper.isSimpleTypeReference(optionalField.type)>
-    ${optionalField.name} = ${helper.getReadBufferReadMethodCall(optionalField.type)};
+    *${optionalField.name} = ${helper.getReadBufferReadMethodCall(optionalField.type)};
         <#else>
-    plc4c_${helper.getCTypeName(optionalField.type.name)}* ${field.name} = NULL;
-    plc4c_${helper.getCTypeName(optionalField.type.name)}_parse(buf<#if optionalField.params?has_content>, <#list optionalField.params as parserTerm>${helper.toParseExpression(optionalField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, &${field.name});
+    plc4c_${helper.getCTypeName(optionalField.type.name)}_parse(buf<#if optionalField.params?has_content>, <#list optionalField.params as parserTerm>${helper.toParseExpression(baseType, optionalField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, &${optionalField.name});
         </#if>
-    msg->${helper.camelCaseToSnakeCase(optionalField.name)} = ${optionalField.name};
+    (*_message)-><@fieldName baseType=baseType field=optionalField/> = ${optionalField.name};
   }
             <#break>
         <#case "padding">
             <#assign paddingField = field>
             <#assign simpleTypeReference = paddingField.type>
 
-  // Padding Field (${paddingField.name})
-  bool _${paddingField.name}NeedsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(paddingField, paddingField.paddingCondition, type.parserArguments)}));
-  if(_${paddingField.name}NeedsPadding) {
-    // Just read the padding data and ignore it
-    ${helper.getReadBufferReadMethodCall(paddingField.type)};
+  // Padding Field (padding)
+  {
+    bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, ${helper.getNumBits(paddingField.type)})) && (${helper.toParseExpression(baseType, paddingField, paddingField.paddingCondition, type.parserArguments)}));
+    if(_needsPadding) {
+      // Just read the padding data and ignore it
+      ${helper.getReadBufferReadMethodCall(paddingField.type)};
+    }
   }
             <#break>
         <#case "reserved">
@@ -261,20 +288,19 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
   ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = ${helper.getReadBufferReadMethodCall(simpleField.type)};
             <#else>
             <#-- 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} = NULL;
-  plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(simpleField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
+  ${helper.getLanguageTypeNameForField(field)} ${simpleField.name};
+  plc4c_${helper.getCTypeName(simpleField.type.name)}_parse(buf<#if simpleField.params?has_content>, <#list simpleField.params as parserTerm>${helper.toParseExpression(baseType, simpleField, parserTerm, type.parserArguments)}<#sep>, </#sep></#list></#if>, (void*) &${simpleField.name});
             </#if>
-  msg->${helper.camelCaseToSnakeCase(simpleField.name)} = ${simpleField.name};
+  (*_message)-><@fieldName baseType=baseType field=simpleField/> = ${simpleField.name};
             <#break>
         <#case "switch">
             <#assign switchField = field>
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
             <#list switchField.cases as case>
-  <#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue><#if case.discriminatorValues?size &gt; 1>(</#if>${helper.toVariableParseExpression(switchField, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#if case.discriminatorValues?size &gt; 1>)</#if><#sep> && </#sep></#list>) </#if>{ /* ${case.name} */
-                <#list case.propertyFields as caseField>
-    ${helper.getLanguageTypeNameForField(caseField)}<#if !helper.isSimpleTypeReference(caseField.type)>*</#if> ${caseField.name}<#if field.loopType??>${helper.getLoopExpressionSuffix(caseField)}</#if><#if helper.getLanguageTypeNameForField(caseField) == "plc4c_list"><#elseif !helper.isSimpleTypeReference(caseField.type)> = NULL<#else> = -1</#if>;
-    msg->${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)} = ${caseField.name};
+  <#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue><#if case.discriminatorValues?size &gt; 1>(</#if>${helper.toVariableParseExpression(baseType, switchField, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#if case.discriminatorValues?size &gt; 1>)</#if><#sep> && </#sep></#list>) </#if>{ /* ${case.name} */
+                <#list case.fields as caseField>
+                    <@fieldParser baseType=case field=caseField/>
                     <#sep >
 
                 </#list>
@@ -285,9 +311,12 @@ plc4c_return_code plc4c_${helper.getCTypeName(type.name)}_parse(plc4c_spi_read_b
             <#assign virtualField = field>
 
   // Virtual field (Just declare a local variable so we can access it in the parser)
-  ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(virtualField, virtualField.valueExpression, type.parserArguments)});
+  ${helper.getLanguageTypeNameForField(field)} ${virtualField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(baseType, virtualField, virtualField.valueExpression, type.parserArguments)});
             <#break>
     </#switch>
+</#macro>
+<#list type.fields as field>
+<@fieldParser baseType=type field=field />
 </#list>
 
   return OK;
diff --git a/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh b/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
index 3acf661..bb86055 100644
--- a/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
+++ b/build-utils/language-c/src/main/resources/templates/c/pojo-template-h.ftlh
@@ -25,22 +25,7 @@
 <#-- @ftlvariable name="helper" type="org.apache.plc4x.language.c.CLanguageTemplateHelper" -->
 <#-- @ftlvariable name="type" type="org.apache.plc4x.plugins.codegenerator.types.definitions.ComplexTypeDefinition" -->
 <#-- Declare the name and type of variables declared locally inside the template -->
-<#-- @ftlvariable name="arrayField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ArrayField" -->
-<#-- @ftlvariable name="checksumField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ChecksumField" -->
-<#-- @ftlvariable name="constField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ConstField" -->
-<#-- @ftlvariable name="discriminatorField" type="org.apache.plc4x.plugins.codegenerator.types.fields.DiscriminatorField" -->
-<#-- @ftlvariable name="enumField" type="org.apache.plc4x.plugins.codegenerator.types.fields.EnumField" -->
-<#-- @ftlvariable name="implicitField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ImplicitField" -->
-<#-- @ftlvariable name="manualArrayField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ManualArrayField" -->
-<#-- @ftlvariable name="manualField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ManualField" -->
-<#-- @ftlvariable name="optionalField" type="org.apache.plc4x.plugins.codegenerator.types.fields.OptionalField" -->
-<#-- @ftlvariable name="paddingField" type="org.apache.plc4x.plugins.codegenerator.types.fields.PaddingField" -->
-<#-- @ftlvariable name="reservedField" type="org.apache.plc4x.plugins.codegenerator.types.fields.ReservedField" -->
-<#-- @ftlvariable name="simpleField" type="org.apache.plc4x.plugins.codegenerator.types.fields.SimpleField" -->
-<#-- @ftlvariable name="switchField" type="org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField" -->
-<#-- @ftlvariable name="virtualField" type="org.apache.plc4x.plugins.codegenerator.types.fields.VirtualField" -->
-<#-- @ftlvariable name="simpleTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference" -->
-<#-- @ftlvariable name="complexTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference" -->
+<#-- @ftlvariable name="field" type="org.apache.plc4x.plugins.codegenerator.types.fields.NamedField" -->
 <#if !helper.isDiscriminatedChildTypeDefinition(type)>${helper.getIncludesDirectory()?replace(".", "/")}/${helper.camelCaseToSnakeCase(type.name)}.h
 /*
   Licensed to the Apache Software Foundation (ASF) under one
@@ -110,11 +95,11 @@ plc4c_${helper.getCTypeName(type.name)}_discriminator plc4c_${helper.getCTypeNam
     When using const fields, output the constant reference values
     as global const values so we can use them elsewhere.
 -->
-<#if type.constFields?has_content>
+<#if helper.getAllConstFields()?has_content>
 
 // Constant values.
-    <#list type.constFields as field>
-const ${helper.getLanguageTypeNameForField(field)} ${helper.getCTypeName(type.name)?upper_case}_${helper.camelCaseToSnakeCase(field.name)?upper_case} = ${field.referenceValue};
+    <#list helper.getAllConstFields() as parentType, constField>
+const ${helper.getLanguageTypeNameForField(constField)} ${helper.getCTypeName(parentType.name)?upper_case}_${helper.camelCaseToSnakeCase(constField.name)?upper_case} = ${constField.referenceValue};
     </#list>
 </#if>
 
@@ -133,15 +118,21 @@ struct plc4c_${helper.getCTypeName(type.name)} {
         <#list field.cases as case>
     struct { /* ${case.name} */
             <#list case.propertyFields as caseField>
-      ${helper.getLanguageTypeNameForField(caseField)}<#if !helper.isSimpleTypeReference(caseField.type)>*</#if> ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)}${helper.getTypeSizeForField(caseField)}<#if field.loopType??>${helper.getLoopExpressionSuffix(caseField)}</#if>;
+                <#if helper.isOptionalField(caseField)>
+      ${helper.getLanguageTypeNameForField(caseField)}* ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)};
+                <#else>
+      ${helper.getLanguageTypeNameForField(caseField)} ${helper.camelCaseToSnakeCase(case.name)}_${helper.camelCaseToSnakeCase(caseField.name)}${helper.getTypeSizeForField(caseField)}<#if field.loopType??>${helper.getLoopExpressionSuffix(caseField)}</#if>;
+                </#if>
             </#list>
     };
         </#list>
   };
     <#elseif helper.isEnumField(field)>
   ${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(field.name)};
+    <#elseif helper.isOptionalField(field)>
+  ${helper.getLanguageTypeNameForField(field)}* ${helper.camelCaseToSnakeCase(field.name)};
     <#else>
-  ${helper.getLanguageTypeNameForField(field)}<#if !helper.isSimpleTypeReference(field.type)>*</#if> ${helper.camelCaseToSnakeCase(field.name)}${helper.getTypeSizeForField(field)}<#if field.loopType??>${helper.getLoopExpressionSuffix(field)}</#if>;
+  ${helper.getLanguageTypeNameForField(field)} ${helper.camelCaseToSnakeCase(field.name)}${helper.getTypeSizeForField(field)}<#if field.loopType??>${helper.getLoopExpressionSuffix(field)}</#if>;
     </#if>
 </#list>
 };
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
index 8623cd7..38877d9 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_pdu.h
@@ -179,16 +179,16 @@ struct plc4c_modbus_read_write_modbus_pdu {
       plc4c_list modbus_pdu_read_fifo_queue_response_fifo_value;
     };
     struct { /* ModbusPDUReadFileRecordRequest */
-      plc4c_list* modbus_pdu_read_file_record_request_items;
+      plc4c_list modbus_pdu_read_file_record_request_items;
     };
     struct { /* ModbusPDUReadFileRecordResponse */
-      plc4c_list* modbus_pdu_read_file_record_response_items;
+      plc4c_list modbus_pdu_read_file_record_response_items;
     };
     struct { /* ModbusPDUWriteFileRecordRequest */
-      plc4c_list* modbus_pdu_write_file_record_request_items;
+      plc4c_list modbus_pdu_write_file_record_request_items;
     };
     struct { /* ModbusPDUWriteFileRecordResponse */
-      plc4c_list* modbus_pdu_write_file_record_response_items;
+      plc4c_list modbus_pdu_write_file_record_response_items;
     };
     struct { /* ModbusPDUReadExceptionStatusRequest */
     };
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
index 308c722..cf97b06 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_serial_adu.h
@@ -32,7 +32,7 @@ struct plc4c_modbus_read_write_modbus_serial_adu {
   uint16_t transaction_id;
   uint16_t length;
   uint8_t address;
-  plc4c_modbus_read_write_modbus_pdu* pdu;
+  plc4c_modbus_read_write_modbus_pdu pdu;
 };
 typedef struct plc4c_modbus_read_write_modbus_serial_adu plc4c_modbus_read_write_modbus_serial_adu;
 
diff --git a/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h b/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
index aa3ae1f..61418c1 100644
--- a/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
+++ b/sandbox/plc4c/generated-sources/modbus/includes/modbus_tcp_adu.h
@@ -35,7 +35,7 @@ struct plc4c_modbus_read_write_modbus_tcp_adu {
   uint16_t transaction_identifier;
   uint16_t protocol_identifier;
   uint8_t unit_identifier;
-  plc4c_modbus_read_write_modbus_pdu* pdu;
+  plc4c_modbus_read_write_modbus_pdu pdu;
 };
 typedef struct plc4c_modbus_read_write_modbus_tcp_adu plc4c_modbus_read_write_modbus_tcp_adu;
 
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
index 7bf422b..733739a 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_constants.c
@@ -24,18 +24,18 @@
 #include "modbus_constants.h"
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_constants_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_constants** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_constants_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_constants** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_constants* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_constants));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_constants));
 
   // Const Field (modbusTcpDefaultPort)
   uint16_t modbusTcpDefaultPort = plc4c_spi_read_unsigned_int(buf, 16);
   if(modbusTcpDefaultPort != MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT) {
     return PARSE_ERROR;
-    // throw new ParseException("Expected constant value " + ModbusConstants.MODBUSTCPDEFAULTPORT + " but got " + modbusTcpDefaultPort);
+    // throw new ParseException("Expected constant value " + MODBUS_READ_WRITE_MODBUS_CONSTANTS_MODBUS_TCP_DEFAULT_PORT + " but got " + modbusTcpDefaultPort);
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
index 8843dd8..3f185c9 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu.c
@@ -107,12 +107,12 @@ plc4c_modbus_read_write_modbus_pdu_discriminator plc4c_modbus_read_write_modbus_
 }
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_pdu** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_pdu** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_pdu* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu));
 
   // Discriminator Field (error) (Used as input to a switch field)
   bool error = plc4c_spi_read_bit(buf);
@@ -122,212 +122,540 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_parse(plc4c_spi_read_buffer
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(error == true) { /* ModbusPDUError */
-    uint8_t exceptionCode = -1;
-    msg->modbus_pdu_error_exception_code = exceptionCode;
+
+  // Simple Field (exceptionCode)
+  uint8_t exceptionCode = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->modbus_pdu_error_exception_code = exceptionCode;
   } else 
   if((error == false) && (function == 0x02) && (response == false)) { /* ModbusPDUReadDiscreteInputsRequest */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_read_discrete_inputs_request_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_read_discrete_inputs_request_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_discrete_inputs_request_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_discrete_inputs_request_quantity = quantity;
   } else 
   if((error == false) && (function == 0x02) && (response == true)) { /* ModbusPDUReadDiscreteInputsResponse */
-    plc4c_list value;
-    msg->modbus_pdu_read_discrete_inputs_response_value = value;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_read_discrete_inputs_response_value = value;
   } else 
   if((error == false) && (function == 0x01) && (response == false)) { /* ModbusPDUReadCoilsRequest */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_read_coils_request_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_read_coils_request_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_coils_request_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_coils_request_quantity = quantity;
   } else 
   if((error == false) && (function == 0x01) && (response == true)) { /* ModbusPDUReadCoilsResponse */
-    plc4c_list value;
-    msg->modbus_pdu_read_coils_response_value = value;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_read_coils_response_value = value;
   } else 
   if((error == false) && (function == 0x05) && (response == false)) { /* ModbusPDUWriteSingleCoilRequest */
-    uint16_t address = -1;
-    msg->modbus_pdu_write_single_coil_request_address = address;
 
-    uint16_t value = -1;
-    msg->modbus_pdu_write_single_coil_request_value = value;
+  // Simple Field (address)
+  uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_coil_request_address = address;
+
+
+  // Simple Field (value)
+  uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_coil_request_value = value;
   } else 
   if((error == false) && (function == 0x05) && (response == true)) { /* ModbusPDUWriteSingleCoilResponse */
-    uint16_t address = -1;
-    msg->modbus_pdu_write_single_coil_response_address = address;
 
-    uint16_t value = -1;
-    msg->modbus_pdu_write_single_coil_response_value = value;
+  // Simple Field (address)
+  uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_coil_response_address = address;
+
+
+  // Simple Field (value)
+  uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_coil_response_value = value;
   } else 
   if((error == false) && (function == 0x0F) && (response == false)) { /* ModbusPDUWriteMultipleCoilsRequest */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_write_multiple_coils_request_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_write_multiple_coils_request_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_multiple_coils_request_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_multiple_coils_request_quantity = quantity;
+
 
-    plc4c_list value;
-    msg->modbus_pdu_write_multiple_coils_request_value = value;
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_write_multiple_coils_request_value = value;
   } else 
   if((error == false) && (function == 0x0F) && (response == true)) { /* ModbusPDUWriteMultipleCoilsResponse */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_write_multiple_coils_response_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_write_multiple_coils_response_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_multiple_coils_response_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_multiple_coils_response_quantity = quantity;
   } else 
   if((error == false) && (function == 0x04) && (response == false)) { /* ModbusPDUReadInputRegistersRequest */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_read_input_registers_request_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_read_input_registers_request_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_input_registers_request_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_input_registers_request_quantity = quantity;
   } else 
   if((error == false) && (function == 0x04) && (response == true)) { /* ModbusPDUReadInputRegistersResponse */
-    plc4c_list value;
-    msg->modbus_pdu_read_input_registers_response_value = value;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_read_input_registers_response_value = value;
   } else 
   if((error == false) && (function == 0x03) && (response == false)) { /* ModbusPDUReadHoldingRegistersRequest */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_read_holding_registers_request_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_read_holding_registers_request_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_holding_registers_request_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_holding_registers_request_quantity = quantity;
   } else 
   if((error == false) && (function == 0x03) && (response == true)) { /* ModbusPDUReadHoldingRegistersResponse */
-    plc4c_list value;
-    msg->modbus_pdu_read_holding_registers_response_value = value;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_read_holding_registers_response_value = value;
   } else 
   if((error == false) && (function == 0x06) && (response == false)) { /* ModbusPDUWriteSingleRegisterRequest */
-    uint16_t address = -1;
-    msg->modbus_pdu_write_single_register_request_address = address;
 
-    uint16_t value = -1;
-    msg->modbus_pdu_write_single_register_request_value = value;
+  // Simple Field (address)
+  uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_register_request_address = address;
+
+
+  // Simple Field (value)
+  uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_register_request_value = value;
   } else 
   if((error == false) && (function == 0x06) && (response == true)) { /* ModbusPDUWriteSingleRegisterResponse */
-    uint16_t address = -1;
-    msg->modbus_pdu_write_single_register_response_address = address;
 
-    uint16_t value = -1;
-    msg->modbus_pdu_write_single_register_response_value = value;
+  // Simple Field (address)
+  uint16_t address = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_register_response_address = address;
+
+
+  // Simple Field (value)
+  uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_single_register_response_value = value;
   } else 
   if((error == false) && (function == 0x10) && (response == false)) { /* ModbusPDUWriteMultipleHoldingRegistersRequest */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_write_multiple_holding_registers_request_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_write_multiple_holding_registers_request_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_multiple_holding_registers_request_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_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)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
 
-    plc4c_list value;
-    msg->modbus_pdu_write_multiple_holding_registers_request_value = value;
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_write_multiple_holding_registers_request_value = value;
   } else 
   if((error == false) && (function == 0x10) && (response == true)) { /* ModbusPDUWriteMultipleHoldingRegistersResponse */
-    uint16_t startingAddress = -1;
-    msg->modbus_pdu_write_multiple_holding_registers_response_starting_address = startingAddress;
 
-    uint16_t quantity = -1;
-    msg->modbus_pdu_write_multiple_holding_registers_response_quantity = quantity;
+  // Simple Field (startingAddress)
+  uint16_t startingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_multiple_holding_registers_response_starting_address = startingAddress;
+
+
+  // Simple Field (quantity)
+  uint16_t quantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_write_multiple_holding_registers_response_quantity = quantity;
   } else 
   if((error == false) && (function == 0x17) && (response == false)) { /* ModbusPDUReadWriteMultipleHoldingRegistersRequest */
-    uint16_t readStartingAddress = -1;
-    msg->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address = readStartingAddress;
 
-    uint16_t readQuantity = -1;
-    msg->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity = readQuantity;
+  // Simple Field (readStartingAddress)
+  uint16_t readStartingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_starting_address = readStartingAddress;
+
 
-    uint16_t writeStartingAddress = -1;
-    msg->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address = writeStartingAddress;
+  // Simple Field (readQuantity)
+  uint16_t readQuantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_read_quantity = readQuantity;
 
-    uint16_t writeQuantity = -1;
-    msg->modbus_pdu_read_write_multiple_holding_registers_request_write_quantity = writeQuantity;
 
-    plc4c_list value;
-    msg->modbus_pdu_read_write_multiple_holding_registers_request_value = value;
+  // Simple Field (writeStartingAddress)
+  uint16_t writeStartingAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_write_starting_address = writeStartingAddress;
+
+
+  // Simple Field (writeQuantity)
+  uint16_t writeQuantity = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_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)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_read_write_multiple_holding_registers_request_value = value;
   } else 
   if((error == false) && (function == 0x17) && (response == true)) { /* ModbusPDUReadWriteMultipleHoldingRegistersResponse */
-    plc4c_list value;
-    msg->modbus_pdu_read_write_multiple_holding_registers_response_value = value;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_read_write_multiple_holding_registers_response_value = value;
   } else 
   if((error == false) && (function == 0x16) && (response == false)) { /* ModbusPDUMaskWriteHoldingRegisterRequest */
-    uint16_t referenceAddress = -1;
-    msg->modbus_pdu_mask_write_holding_register_request_reference_address = referenceAddress;
 
-    uint16_t andMask = -1;
-    msg->modbus_pdu_mask_write_holding_register_request_and_mask = andMask;
+  // Simple Field (referenceAddress)
+  uint16_t referenceAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_mask_write_holding_register_request_reference_address = referenceAddress;
+
+
+  // Simple Field (andMask)
+  uint16_t andMask = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_mask_write_holding_register_request_and_mask = andMask;
 
-    uint16_t orMask = -1;
-    msg->modbus_pdu_mask_write_holding_register_request_or_mask = orMask;
+
+  // Simple Field (orMask)
+  uint16_t orMask = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_mask_write_holding_register_request_or_mask = orMask;
   } else 
   if((error == false) && (function == 0x16) && (response == true)) { /* ModbusPDUMaskWriteHoldingRegisterResponse */
-    uint16_t referenceAddress = -1;
-    msg->modbus_pdu_mask_write_holding_register_response_reference_address = referenceAddress;
 
-    uint16_t andMask = -1;
-    msg->modbus_pdu_mask_write_holding_register_response_and_mask = andMask;
+  // Simple Field (referenceAddress)
+  uint16_t referenceAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_mask_write_holding_register_response_reference_address = referenceAddress;
+
+
+  // Simple Field (andMask)
+  uint16_t andMask = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_mask_write_holding_register_response_and_mask = andMask;
 
-    uint16_t orMask = -1;
-    msg->modbus_pdu_mask_write_holding_register_response_or_mask = orMask;
+
+  // Simple Field (orMask)
+  uint16_t orMask = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_mask_write_holding_register_response_or_mask = orMask;
   } else 
   if((error == false) && (function == 0x18) && (response == false)) { /* ModbusPDUReadFifoQueueRequest */
-    uint16_t fifoPointerAddress = -1;
-    msg->modbus_pdu_read_fifo_queue_request_fifo_pointer_address = fifoPointerAddress;
+
+  // Simple Field (fifoPointerAddress)
+  uint16_t fifoPointerAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_read_fifo_queue_request_fifo_pointer_address = fifoPointerAddress;
   } else 
   if((error == false) && (function == 0x18) && (response == true)) { /* ModbusPDUReadFifoQueueResponse */
-    plc4c_list fifoValue;
-    msg->modbus_pdu_read_fifo_queue_response_fifo_value = fifoValue;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint16_t byteCount = plc4c_spi_read_unsigned_int(buf, 16);
+
+
+  // Implicit Field (fifoCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint16_t fifoCount = plc4c_spi_read_unsigned_int(buf, 16);
+
+
+  // Array field (fifoValue)
+  plc4c_list fifoValue;
+  {
+    // Count array
+    uint8_t itemCount = fifoCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(&fifoValue, &value);
+      plc4c_utils_list_insert_head_value(&fifoValue, &value);
+    }
+  }
+  (*_message)->modbus_pdu_read_fifo_queue_response_fifo_value = fifoValue;
   } else 
   if((error == false) && (function == 0x14) && (response == false)) { /* ModbusPDUReadFileRecordRequest */
-    plc4c_list* items;
-    msg->modbus_pdu_read_file_record_request_items = items;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Length array
+    uint8_t _itemsLength = byteCount;
+    uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+    while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+      plc4c_list* value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+    }
+  }
+  (*_message)->modbus_pdu_read_file_record_request_items = items;
   } else 
   if((error == false) && (function == 0x14) && (response == true)) { /* ModbusPDUReadFileRecordResponse */
-    plc4c_list* items;
-    msg->modbus_pdu_read_file_record_response_items = items;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Length array
+    uint8_t _itemsLength = byteCount;
+    uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+    while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+      plc4c_list* value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+    }
+  }
+  (*_message)->modbus_pdu_read_file_record_response_items = items;
   } else 
   if((error == false) && (function == 0x15) && (response == false)) { /* ModbusPDUWriteFileRecordRequest */
-    plc4c_list* items;
-    msg->modbus_pdu_write_file_record_request_items = items;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Length array
+    uint8_t _itemsLength = byteCount;
+    uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+    while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+      plc4c_list* value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+    }
+  }
+  (*_message)->modbus_pdu_write_file_record_request_items = items;
   } else 
   if((error == false) && (function == 0x15) && (response == true)) { /* ModbusPDUWriteFileRecordResponse */
-    plc4c_list* items;
-    msg->modbus_pdu_write_file_record_response_items = items;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Length array
+    uint8_t _itemsLength = byteCount;
+    uint8_t itemsEndPos = plc4c_spi_read_get_pos(buf) + _itemsLength;
+    while(plc4c_spi_read_get_pos(buf) < itemsEndPos) {
+      plc4c_list* value = NULL;
+      plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+    }
+  }
+  (*_message)->modbus_pdu_write_file_record_response_items = items;
   } else 
   if((error == false) && (function == 0x07) && (response == false)) { /* ModbusPDUReadExceptionStatusRequest */
   } else 
   if((error == false) && (function == 0x07) && (response == true)) { /* ModbusPDUReadExceptionStatusResponse */
-    uint8_t value = -1;
-    msg->modbus_pdu_read_exception_status_response_value = value;
+
+  // Simple Field (value)
+  uint8_t value = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->modbus_pdu_read_exception_status_response_value = value;
   } else 
   if((error == false) && (function == 0x08) && (response == false)) { /* ModbusPDUDiagnosticRequest */
-    uint16_t status = -1;
-    msg->modbus_pdu_diagnostic_request_status = status;
 
-    uint16_t eventCount = -1;
-    msg->modbus_pdu_diagnostic_request_event_count = eventCount;
+  // Simple Field (status)
+  uint16_t status = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_diagnostic_request_status = status;
+
+
+  // Simple Field (eventCount)
+  uint16_t eventCount = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_diagnostic_request_event_count = eventCount;
   } else 
   if((error == false) && (function == 0x0C) && (response == false)) { /* ModbusPDUGetComEventLogRequest */
   } else 
   if((error == false) && (function == 0x0C) && (response == true)) { /* ModbusPDUGetComEventLogResponse */
-    uint16_t status = -1;
-    msg->modbus_pdu_get_com_event_log_response_status = status;
 
-    uint16_t eventCount = -1;
-    msg->modbus_pdu_get_com_event_log_response_event_count = eventCount;
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Simple Field (status)
+  uint16_t status = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_get_com_event_log_response_status = status;
+
+
+  // Simple Field (eventCount)
+  uint16_t eventCount = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_get_com_event_log_response_event_count = eventCount;
 
-    uint16_t messageCount = -1;
-    msg->modbus_pdu_get_com_event_log_response_message_count = messageCount;
 
-    plc4c_list events;
-    msg->modbus_pdu_get_com_event_log_response_events = events;
+  // Simple Field (messageCount)
+  uint16_t messageCount = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->modbus_pdu_get_com_event_log_response_message_count = messageCount;
+
+
+  // Array field (events)
+  plc4c_list events;
+  {
+    // Count array
+    uint8_t itemCount = (byteCount) - (6);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&events, &value);
+      plc4c_utils_list_insert_head_value(&events, &value);
+    }
+  }
+  (*_message)->modbus_pdu_get_com_event_log_response_events = events;
   } else 
   if((error == false) && (function == 0x11) && (response == false)) { /* ModbusPDUReportServerIdRequest */
   } else 
   if((error == false) && (function == 0x11) && (response == true)) { /* ModbusPDUReportServerIdResponse */
-    plc4c_list value;
-    msg->modbus_pdu_report_server_id_response_value = value;
+
+  // Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t byteCount = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (value)
+  plc4c_list value;
+  {
+    // Count array
+    uint8_t itemCount = byteCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      int8_t value = plc4c_spi_read_byte(buf, 8);
+      plc4c_utils_list_insert_head_value(&value, &value);
+      plc4c_utils_list_insert_head_value(&value, &value);
+    }
+  }
+  (*_message)->modbus_pdu_report_server_id_response_value = value;
   } else 
   if((error == false) && (function == 0x2B) && (response == false)) { /* ModbusPDUReadDeviceIdentificationRequest */
   } else 
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
index dde8ef1..c679f76 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_request_item.c
@@ -24,29 +24,29 @@
 #include "modbus_pdu_read_file_record_request_item.h"
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_request_item));
 
 
   // Simple Field (referenceType)
   uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
-  msg->reference_type = referenceType;
+  (*_message)->reference_type = referenceType;
 
   // Simple Field (fileNumber)
   uint16_t fileNumber = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->file_number = fileNumber;
+  (*_message)->file_number = fileNumber;
 
   // Simple Field (recordNumber)
   uint16_t recordNumber = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->record_number = recordNumber;
+  (*_message)->record_number = recordNumber;
 
   // Simple Field (recordLength)
   uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->record_length = recordLength;
+  (*_message)->record_length = recordLength;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
index c90b073..6b582e0 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_read_file_record_response_item.c
@@ -24,12 +24,12 @@
 #include "modbus_pdu_read_file_record_response_item.h"
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_read_file_record_response_item));
 
 
   // Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -37,7 +37,7 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
 
   // Simple Field (referenceType)
   uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
-  msg->reference_type = referenceType;
+  (*_message)->reference_type = referenceType;
 
   // Array field (data)
   plc4c_list data;
@@ -46,9 +46,11 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_read_file_record_response_i
     uint8_t _dataLength = (dataLength) - (1);
     uint8_t dataEndPos = plc4c_spi_read_get_pos(buf) + _dataLength;
     while(plc4c_spi_read_get_pos(buf) < dataEndPos) {
-      plc4c_utils_list_insert_head_value(&data, plc4c_spi_read_unsigned_int(buf, 16));
+      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(&data, &value);
     }
   }
+  (*_message)->data = data;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
index 1ff3404..d1ef483 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_request_item.c
@@ -24,25 +24,25 @@
 #include "modbus_pdu_write_file_record_request_item.h"
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_request_item));
 
 
   // Simple Field (referenceType)
   uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
-  msg->reference_type = referenceType;
+  (*_message)->reference_type = referenceType;
 
   // Simple Field (fileNumber)
   uint16_t fileNumber = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->file_number = fileNumber;
+  (*_message)->file_number = fileNumber;
 
   // Simple Field (recordNumber)
   uint16_t recordNumber = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->record_number = recordNumber;
+  (*_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)
   uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
@@ -54,9 +54,11 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_request_i
     uint8_t _recordDataLength = (recordLength) * (2);
     uint8_t recordDataEndPos = plc4c_spi_read_get_pos(buf) + _recordDataLength;
     while(plc4c_spi_read_get_pos(buf) < recordDataEndPos) {
-      plc4c_utils_list_insert_head_value(&recordData, plc4c_spi_read_unsigned_int(buf, 16));
+      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(&recordData, &value);
     }
   }
+  (*_message)->record_data = recordData;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
index d577f3e..bbcfc0a 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_pdu_write_file_record_response_item.c
@@ -24,25 +24,25 @@
 #include "modbus_pdu_write_file_record_response_item.h"
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item_parse(plc4c_spi_read_buffer* buf, plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_pdu_write_file_record_response_item));
 
 
   // Simple Field (referenceType)
   uint8_t referenceType = plc4c_spi_read_unsigned_short(buf, 8);
-  msg->reference_type = referenceType;
+  (*_message)->reference_type = referenceType;
 
   // Simple Field (fileNumber)
   uint16_t fileNumber = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->file_number = fileNumber;
+  (*_message)->file_number = fileNumber;
 
   // Simple Field (recordNumber)
   uint16_t recordNumber = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->record_number = recordNumber;
+  (*_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)
   uint16_t recordLength = plc4c_spi_read_unsigned_int(buf, 16);
@@ -54,9 +54,11 @@ plc4c_return_code plc4c_modbus_read_write_modbus_pdu_write_file_record_response_
     uint8_t _recordDataLength = (recordLength) * (2);
     uint8_t recordDataEndPos = plc4c_spi_read_get_pos(buf) + _recordDataLength;
     while(plc4c_spi_read_get_pos(buf) < recordDataEndPos) {
-      plc4c_utils_list_insert_head_value(&recordData, plc4c_spi_read_unsigned_int(buf, 16));
+      uint16_t value = plc4c_spi_read_unsigned_int(buf, 16);
+      plc4c_utils_list_insert_head_value(&recordData, &value);
     }
   }
+  (*_message)->record_data = recordData;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
index cbfca8d..37bc4cb 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_serial_adu.c
@@ -24,17 +24,17 @@
 #include "modbus_serial_adu.h"
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_serial_adu** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_serial_adu** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_serial_adu* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_serial_adu));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_serial_adu));
 
 
   // Simple Field (transactionId)
   uint16_t transactionId = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->transaction_id = transactionId;
+  (*_message)->transaction_id = transactionId;
 
   // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
   {
@@ -46,16 +46,16 @@ plc4c_return_code plc4c_modbus_read_write_modbus_serial_adu_parse(plc4c_spi_read
 
   // Simple Field (length)
   uint16_t length = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->length = length;
+  (*_message)->length = length;
 
   // Simple Field (address)
   uint8_t address = plc4c_spi_read_unsigned_short(buf, 8);
-  msg->address = address;
+  (*_message)->address = address;
 
   // Simple Field (pdu)
-  plc4c_modbus_read_write_modbus_pdu* pdu = NULL;
+  plc4c_modbus_read_write_modbus_pdu pdu;
   plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
-  msg->pdu = pdu;
+  (*_message)->pdu = pdu;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
index 2f1f058..5756ede 100644
--- a/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
+++ b/sandbox/plc4c/generated-sources/modbus/src/modbus_tcp_adu.c
@@ -24,23 +24,23 @@
 #include "modbus_tcp_adu.h"
 
 // Parse function.
-plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_tcp_adu** message) {
+plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_buffer* buf, bool response, plc4c_modbus_read_write_modbus_tcp_adu** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_modbus_read_write_modbus_tcp_adu* msg = malloc(sizeof(plc4c_modbus_read_write_modbus_tcp_adu));
+  (*_message) = malloc(sizeof(plc4c_modbus_read_write_modbus_tcp_adu));
 
 
   // Simple Field (transactionIdentifier)
   uint16_t transactionIdentifier = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->transaction_identifier = transactionIdentifier;
+  (*_message)->transaction_identifier = transactionIdentifier;
 
   // Const Field (protocolIdentifier)
   uint16_t protocolIdentifier = plc4c_spi_read_unsigned_int(buf, 16);
   if(protocolIdentifier != MODBUS_READ_WRITE_MODBUS_TCP_ADU_PROTOCOL_IDENTIFIER) {
     return PARSE_ERROR;
-    // throw new ParseException("Expected constant value " + ModbusTcpADU.PROTOCOLIDENTIFIER + " but got " + protocolIdentifier);
+    // throw new ParseException("Expected constant value " + 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)
@@ -48,12 +48,12 @@ plc4c_return_code plc4c_modbus_read_write_modbus_tcp_adu_parse(plc4c_spi_read_bu
 
   // Simple Field (unitIdentifier)
   uint8_t unitIdentifier = plc4c_spi_read_unsigned_short(buf, 8);
-  msg->unit_identifier = unitIdentifier;
+  (*_message)->unit_identifier = unitIdentifier;
 
   // Simple Field (pdu)
-  plc4c_modbus_read_write_modbus_pdu* pdu = NULL;
+  plc4c_modbus_read_write_modbus_pdu pdu;
   plc4c_modbus_read_write_modbus_pdu_parse(buf, response, (void*) &pdu);
-  msg->pdu = pdu;
+  (*_message)->pdu = pdu;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
index 53add62..91d4457 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_packet.h
@@ -61,17 +61,17 @@ struct plc4c_s7_read_write_cotp_packet {
     struct { /* COTPPacketConnectionRequest */
       uint16_t cotp_packet_connection_request_destination_reference;
       uint16_t cotp_packet_connection_request_source_reference;
-      plc4c_s7_read_write_cotp_protocol_class* cotp_packet_connection_request_protocol_class;
+      plc4c_s7_read_write_cotp_protocol_class cotp_packet_connection_request_protocol_class;
     };
     struct { /* COTPPacketConnectionResponse */
       uint16_t cotp_packet_connection_response_destination_reference;
       uint16_t cotp_packet_connection_response_source_reference;
-      plc4c_s7_read_write_cotp_protocol_class* cotp_packet_connection_response_protocol_class;
+      plc4c_s7_read_write_cotp_protocol_class cotp_packet_connection_response_protocol_class;
     };
     struct { /* COTPPacketDisconnectRequest */
       uint16_t cotp_packet_disconnect_request_destination_reference;
       uint16_t cotp_packet_disconnect_request_source_reference;
-      plc4c_s7_read_write_cotp_protocol_class* cotp_packet_disconnect_request_protocol_class;
+      plc4c_s7_read_write_cotp_protocol_class cotp_packet_disconnect_request_protocol_class;
     };
     struct { /* COTPPacketDisconnectResponse */
       uint16_t cotp_packet_disconnect_response_destination_reference;
@@ -82,7 +82,7 @@ struct plc4c_s7_read_write_cotp_packet {
       uint8_t cotp_packet_tpdu_error_reject_cause;
     };
   };
-  plc4c_list* parameters;
+  plc4c_list parameters;
   plc4c_s7_read_write_s7_message* payload;
 };
 typedef struct plc4c_s7_read_write_cotp_packet plc4c_s7_read_write_cotp_packet;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
index d739637..62eb8ed 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/cotp_parameter.h
@@ -52,7 +52,7 @@ struct plc4c_s7_read_write_cotp_parameter {
   /* Properties */
   union {
     struct { /* COTPParameterTpduSize */
-      plc4c_s7_read_write_cotp_tpdu_size* cotp_parameter_tpdu_size_tpdu_size;
+      plc4c_s7_read_write_cotp_tpdu_size cotp_parameter_tpdu_size_tpdu_size;
     };
     struct { /* COTPParameterCallingTsap */
       uint16_t cotp_parameter_calling_tsap_tsap_id;
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_address.h b/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
index 9b166a1..0f5ae1a 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_address.h
@@ -49,10 +49,10 @@ struct plc4c_s7_read_write_s7_address {
   /* Properties */
   union {
     struct { /* S7AddressAny */
-      plc4c_s7_read_write_transport_size* s7_address_any_transport_size;
+      plc4c_s7_read_write_transport_size s7_address_any_transport_size;
       uint16_t s7_address_any_number_of_elements;
       uint16_t s7_address_any_db_number;
-      plc4c_s7_read_write_memory_area* s7_address_any_area;
+      plc4c_s7_read_write_memory_area s7_address_any_area;
       uint16_t s7_address_any_byte_address;
       unsigned int s7_address_any_bit_address : 3;
     };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
index f3172a4..1e126c7 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter.h
@@ -60,19 +60,19 @@ struct plc4c_s7_read_write_s7_parameter {
       uint16_t s7_parameter_setup_communication_pdu_length;
     };
     struct { /* S7ParameterReadVarRequest */
-      plc4c_list* s7_parameter_read_var_request_items;
+      plc4c_list s7_parameter_read_var_request_items;
     };
     struct { /* S7ParameterReadVarResponse */
       uint8_t s7_parameter_read_var_response_num_items;
     };
     struct { /* S7ParameterWriteVarRequest */
-      plc4c_list* s7_parameter_write_var_request_items;
+      plc4c_list s7_parameter_write_var_request_items;
     };
     struct { /* S7ParameterWriteVarResponse */
       uint8_t s7_parameter_write_var_response_num_items;
     };
     struct { /* S7ParameterUserData */
-      plc4c_list* s7_parameter_user_data_items;
+      plc4c_list s7_parameter_user_data_items;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h
index 9fbbf91..ccdf49b 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_parameter_user_data_item.h
@@ -52,9 +52,9 @@ struct plc4c_s7_read_write_s7_parameter_user_data_item {
       unsigned int s7_parameter_user_data_item_cpu_functions_cpu_function_group : 4;
       uint8_t s7_parameter_user_data_item_cpu_functions_cpu_subfunction;
       uint8_t s7_parameter_user_data_item_cpu_functions_sequence_number;
-      uint8_t s7_parameter_user_data_item_cpu_functions_data_unit_reference_number;
-      uint8_t s7_parameter_user_data_item_cpu_functions_last_data_unit;
-      uint16_t s7_parameter_user_data_item_cpu_functions_error_code;
+      uint8_t* s7_parameter_user_data_item_cpu_functions_data_unit_reference_number;
+      uint8_t* s7_parameter_user_data_item_cpu_functions_last_data_unit;
+      uint16_t* s7_parameter_user_data_item_cpu_functions_error_code;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
index 1aa5564..4e893d3 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_payload.h
@@ -55,16 +55,16 @@ struct plc4c_s7_read_write_s7_payload {
   /* Properties */
   union {
     struct { /* S7PayloadReadVarResponse */
-      plc4c_list* s7_payload_read_var_response_items;
+      plc4c_list s7_payload_read_var_response_items;
     };
     struct { /* S7PayloadWriteVarRequest */
-      plc4c_list* s7_payload_write_var_request_items;
+      plc4c_list s7_payload_write_var_request_items;
     };
     struct { /* S7PayloadWriteVarResponse */
-      plc4c_list* s7_payload_write_var_response_items;
+      plc4c_list s7_payload_write_var_response_items;
     };
     struct { /* S7PayloadUserData */
-      plc4c_list* s7_payload_user_data_items;
+      plc4c_list s7_payload_user_data_items;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
index 4bbe20b..a3c427c 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_payload_user_data_item.h
@@ -46,19 +46,22 @@ typedef enum plc4c_s7_read_write_s7_payload_user_data_item_type plc4c_s7_read_wr
 // Function to get the discriminator values for a given type.
 plc4c_s7_read_write_s7_payload_user_data_item_discriminator plc4c_s7_read_write_s7_payload_user_data_item_get_discriminator(plc4c_s7_read_write_s7_payload_user_data_item_type type);
 
+// Constant values.
+const uint16_t S7_READ_WRITE_S7_PAYLOAD_USER_DATA_ITEM_CPU_FUNCTION_READ_SZL_RESPONSE_SZL_ITEM_LENGTH = 28;
+
 struct plc4c_s7_read_write_s7_payload_user_data_item {
   /* This is an abstract type so this property saves the type of this typed union */
   plc4c_s7_read_write_s7_payload_user_data_item_type _type;
   /* Properties */
   plc4c_s7_read_write_data_transport_error_code return_code;
   plc4c_s7_read_write_data_transport_size transport_size;
-  plc4c_s7_read_write_szl_id* szl_id;
+  plc4c_s7_read_write_szl_id szl_id;
   uint16_t szl_index;
   union {
     struct { /* S7PayloadUserDataItemCpuFunctionReadSzlRequest */
     };
     struct { /* S7PayloadUserDataItemCpuFunctionReadSzlResponse */
-      plc4c_list* s7_payload_user_data_item_cpu_function_read_szl_response_items;
+      plc4c_list s7_payload_user_data_item_cpu_function_read_szl_response_items;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h b/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
index eb442d3..0c83ffa 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/s7_var_request_parameter_item.h
@@ -48,7 +48,7 @@ struct plc4c_s7_read_write_s7_var_request_parameter_item {
   /* Properties */
   union {
     struct { /* S7VarRequestParameterItemAddress */
-      plc4c_s7_read_write_s7_address* s7_var_request_parameter_item_address_address;
+      plc4c_s7_read_write_s7_address s7_var_request_parameter_item_address_address;
     };
   };
 };
diff --git a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
index 1774b50..0976125 100644
--- a/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
+++ b/sandbox/plc4c/generated-sources/s7/includes/tpkt_packet.h
@@ -33,7 +33,7 @@ const uint8_t S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID = 0x03;
 struct plc4c_s7_read_write_tpkt_packet {
   /* Properties */
   uint8_t protocol_id;
-  plc4c_s7_read_write_cotp_packet* payload;
+  plc4c_s7_read_write_cotp_packet payload;
 };
 typedef struct plc4c_s7_read_write_tpkt_packet plc4c_s7_read_write_tpkt_packet;
 
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
index 242d9de..189d302 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_packet.c
@@ -47,12 +47,12 @@ plc4c_s7_read_write_cotp_packet_discriminator plc4c_s7_read_write_cotp_packet_ge
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* buf, uint16_t cotpLen, plc4c_s7_read_write_cotp_packet** message) {
+plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* buf, uint16_t cotpLen, plc4c_s7_read_write_cotp_packet** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_cotp_packet* msg = malloc(sizeof(plc4c_s7_read_write_cotp_packet));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_cotp_packet));
 
 
   // Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -63,55 +63,85 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(tpduCode == 0xF0) { /* COTPPacketData */
-    bool eot = -1;
-    msg->cotp_packet_data_eot = eot;
 
-    unsigned int tpduRef = -1;
-    msg->cotp_packet_data_tpdu_ref = tpduRef;
+  // Simple Field (eot)
+  bool eot = plc4c_spi_read_bit(buf);
+  (*_message)->cotp_packet_data_eot = eot;
+
+
+  // Simple Field (tpduRef)
+  unsigned int tpduRef = plc4c_spi_read_unsigned_short(buf, 7);
+  (*_message)->cotp_packet_data_tpdu_ref = tpduRef;
   } else 
   if(tpduCode == 0xE0) { /* COTPPacketConnectionRequest */
-    uint16_t destinationReference = -1;
-    msg->cotp_packet_connection_request_destination_reference = destinationReference;
 
-    uint16_t sourceReference = -1;
-    msg->cotp_packet_connection_request_source_reference = sourceReference;
+  // Simple Field (destinationReference)
+  uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_connection_request_destination_reference = destinationReference;
+
+
+  // Simple Field (sourceReference)
+  uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_connection_request_source_reference = sourceReference;
 
-    plc4c_s7_read_write_cotp_protocol_class* protocolClass = NULL;
-    msg->cotp_packet_connection_request_protocol_class = protocolClass;
+
+  // Enum field (protocolClass)
+  plc4c_s7_read_write_cotp_protocol_class protocolClass = plc4c_spi_read_byte(buf, 8);
+  (*_message)->cotp_packet_connection_request_protocol_class = protocolClass;
   } else 
   if(tpduCode == 0xD0) { /* COTPPacketConnectionResponse */
-    uint16_t destinationReference = -1;
-    msg->cotp_packet_connection_response_destination_reference = destinationReference;
 
-    uint16_t sourceReference = -1;
-    msg->cotp_packet_connection_response_source_reference = sourceReference;
+  // Simple Field (destinationReference)
+  uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_connection_response_destination_reference = destinationReference;
+
+
+  // Simple Field (sourceReference)
+  uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_connection_response_source_reference = sourceReference;
+
 
-    plc4c_s7_read_write_cotp_protocol_class* protocolClass = NULL;
-    msg->cotp_packet_connection_response_protocol_class = protocolClass;
+  // Enum field (protocolClass)
+  plc4c_s7_read_write_cotp_protocol_class protocolClass = plc4c_spi_read_byte(buf, 8);
+  (*_message)->cotp_packet_connection_response_protocol_class = protocolClass;
   } else 
   if(tpduCode == 0x80) { /* COTPPacketDisconnectRequest */
-    uint16_t destinationReference = -1;
-    msg->cotp_packet_disconnect_request_destination_reference = destinationReference;
 
-    uint16_t sourceReference = -1;
-    msg->cotp_packet_disconnect_request_source_reference = sourceReference;
+  // Simple Field (destinationReference)
+  uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_disconnect_request_destination_reference = destinationReference;
 
-    plc4c_s7_read_write_cotp_protocol_class* protocolClass = NULL;
-    msg->cotp_packet_disconnect_request_protocol_class = protocolClass;
+
+  // Simple Field (sourceReference)
+  uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_disconnect_request_source_reference = sourceReference;
+
+
+  // Enum field (protocolClass)
+  plc4c_s7_read_write_cotp_protocol_class protocolClass = plc4c_spi_read_byte(buf, 8);
+  (*_message)->cotp_packet_disconnect_request_protocol_class = protocolClass;
   } else 
   if(tpduCode == 0xC0) { /* COTPPacketDisconnectResponse */
-    uint16_t destinationReference = -1;
-    msg->cotp_packet_disconnect_response_destination_reference = destinationReference;
 
-    uint16_t sourceReference = -1;
-    msg->cotp_packet_disconnect_response_source_reference = sourceReference;
+  // Simple Field (destinationReference)
+  uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_disconnect_response_destination_reference = destinationReference;
+
+
+  // Simple Field (sourceReference)
+  uint16_t sourceReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_disconnect_response_source_reference = sourceReference;
   } else 
   if(tpduCode == 0x70) { /* COTPPacketTpduError */
-    uint16_t destinationReference = -1;
-    msg->cotp_packet_tpdu_error_destination_reference = destinationReference;
 
-    uint8_t rejectCause = -1;
-    msg->cotp_packet_tpdu_error_reject_cause = rejectCause;
+  // Simple Field (destinationReference)
+  uint16_t destinationReference = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_packet_tpdu_error_destination_reference = destinationReference;
+
+
+  // Simple Field (rejectCause)
+  uint8_t rejectCause = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->cotp_packet_tpdu_error_reject_cause = rejectCause;
   }
 
   // Array field (parameters)
@@ -122,18 +152,24 @@ plc4c_return_code plc4c_s7_read_write_cotp_packet_parse(plc4c_spi_read_buffer* b
     uint8_t _parametersLength = (((headerLength) + (1))) - (curPos);
     uint8_t parametersEndPos = plc4c_spi_read_get_pos(buf) + _parametersLength;
     while(plc4c_spi_read_get_pos(buf) < parametersEndPos) {
-      plc4c_utils_list_insert_head_value(&parameters, plc4c_s7_read_write_cotp_parameter_parse(buf, (((headerLength) + (1))) - (curPos), (void*) &parameters));
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_cotp_parameter_parse(buf, (((headerLength) + (1))) - (curPos), (void*) &value);
+      plc4c_utils_list_insert_head_value(&parameters, value);
       curPos = plc4c_spi_read_get_pos(buf) - startPos;
     }
   }
+  (*_message)->parameters = parameters;
 
   // Optional Field (payload) (Can be skipped, if a given expression evaluates to false)
   curPos = plc4c_spi_read_get_pos(buf) - startPos;
   plc4c_s7_read_write_s7_message* payload = NULL;
   if((curPos) < (cotpLen)) {
-    plc4c_s7_read_write_s7_message* payload = NULL;
+    payload = malloc(sizeof(plc4c_s7_read_write_s7_message));
+    if(payload == NULL) {
+      return NO_MEMORY;
+    }
     plc4c_s7_read_write_s7_message_parse(buf, &payload);
-    msg->payload = payload;
+    (*_message)->payload = payload;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
index 50bc779..dfef1a8 100644
--- a/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/cotp_parameter.c
@@ -45,12 +45,12 @@ plc4c_s7_read_write_cotp_parameter_discriminator plc4c_s7_read_write_cotp_parame
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t rest, plc4c_s7_read_write_cotp_parameter** message) {
+plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t rest, plc4c_s7_read_write_cotp_parameter** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_cotp_parameter* msg = malloc(sizeof(plc4c_s7_read_write_cotp_parameter));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_cotp_parameter));
 
   // Discriminator Field (parameterType) (Used as input to a switch field)
   uint8_t parameterType = plc4c_spi_read_unsigned_short(buf, 8);
@@ -60,24 +60,44 @@ plc4c_return_code plc4c_s7_read_write_cotp_parameter_parse(plc4c_spi_read_buffer
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(parameterType == 0xC0) { /* COTPParameterTpduSize */
-    plc4c_s7_read_write_cotp_tpdu_size* tpduSize = NULL;
-    msg->cotp_parameter_tpdu_size_tpdu_size = tpduSize;
+
+  // Enum field (tpduSize)
+  plc4c_s7_read_write_cotp_tpdu_size tpduSize = plc4c_spi_read_byte(buf, 8);
+  (*_message)->cotp_parameter_tpdu_size_tpdu_size = tpduSize;
   } else 
   if(parameterType == 0xC1) { /* COTPParameterCallingTsap */
-    uint16_t tsapId = -1;
-    msg->cotp_parameter_calling_tsap_tsap_id = tsapId;
+
+  // Simple Field (tsapId)
+  uint16_t tsapId = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_parameter_calling_tsap_tsap_id = tsapId;
   } else 
   if(parameterType == 0xC2) { /* COTPParameterCalledTsap */
-    uint16_t tsapId = -1;
-    msg->cotp_parameter_called_tsap_tsap_id = tsapId;
+
+  // Simple Field (tsapId)
+  uint16_t tsapId = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->cotp_parameter_called_tsap_tsap_id = tsapId;
   } else 
   if(parameterType == 0xC3) { /* COTPParameterChecksum */
-    uint8_t crc = -1;
-    msg->cotp_parameter_checksum_crc = crc;
+
+  // Simple Field (crc)
+  uint8_t crc = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->cotp_parameter_checksum_crc = crc;
   } else 
   if(parameterType == 0xE0) { /* COTPParameterDisconnectAdditionalInformation */
-    plc4c_list data;
-    msg->cotp_parameter_disconnect_additional_information_data = data;
+
+  // Array field (data)
+  plc4c_list data;
+  {
+    // Count array
+    uint8_t itemCount = rest;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      
+      uint8_t value = plc4c_spi_read_unsigned_short(buf, 8);
+      plc4c_utils_list_insert_head_value(&data, &value);
+      plc4c_utils_list_insert_head_value(&data, &value);
+    }
+  }
+  (*_message)->cotp_parameter_disconnect_additional_information_data = data;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_address.c b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
index 9b2967e..27b7895 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_address.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_address.c
@@ -37,35 +37,56 @@ plc4c_s7_read_write_s7_address_discriminator plc4c_s7_read_write_s7_address_get_
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_address** message) {
+plc4c_return_code plc4c_s7_read_write_s7_address_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_address** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_address* msg = malloc(sizeof(plc4c_s7_read_write_s7_address));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_address));
 
   // Discriminator Field (addressType) (Used as input to a switch field)
   uint8_t addressType = plc4c_spi_read_unsigned_short(buf, 8);
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(addressType == 0x10) { /* S7AddressAny */
-    plc4c_s7_read_write_transport_size* transportSize = NULL;
-    msg->s7_address_any_transport_size = transportSize;
 
-    uint16_t numberOfElements = -1;
-    msg->s7_address_any_number_of_elements = numberOfElements;
+  // Enum field (transportSize)
+  plc4c_s7_read_write_transport_size transportSize = plc4c_spi_read_byte(buf, 8);
+  (*_message)->s7_address_any_transport_size = transportSize;
 
-    uint16_t dbNumber = -1;
-    msg->s7_address_any_db_number = dbNumber;
 
-    plc4c_s7_read_write_memory_area* area = NULL;
-    msg->s7_address_any_area = area;
+  // Simple Field (numberOfElements)
+  uint16_t numberOfElements = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->s7_address_any_number_of_elements = numberOfElements;
 
-    uint16_t byteAddress = -1;
-    msg->s7_address_any_byte_address = byteAddress;
 
-    unsigned int bitAddress = -1;
-    msg->s7_address_any_bit_address = bitAddress;
+  // Simple Field (dbNumber)
+  uint16_t dbNumber = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->s7_address_any_db_number = dbNumber;
+
+
+  // Enum field (area)
+  plc4c_s7_read_write_memory_area area = plc4c_spi_read_byte(buf, 8);
+  (*_message)->s7_address_any_area = area;
+
+
+  // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+  {
+    unsigned int _reserved = plc4c_spi_read_unsigned_short(buf, 5);
+    if(_reserved != 0x00) {
+      printf("Expected constant value '%d' but got '%d' for reserved field.", 0x00, _reserved);
+    }
+  }
+
+
+  // Simple Field (byteAddress)
+  uint16_t byteAddress = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->s7_address_any_byte_address = byteAddress;
+
+
+  // Simple Field (bitAddress)
+  unsigned int bitAddress = plc4c_spi_read_unsigned_byte(buf, 3);
+  (*_message)->s7_address_any_bit_address = bitAddress;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_message.c b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
index 28056d0..d172a53 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_message.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_message.c
@@ -43,19 +43,19 @@ plc4c_s7_read_write_s7_message_discriminator plc4c_s7_read_write_s7_message_get_
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_message** message) {
+plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_message** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_message* msg = malloc(sizeof(plc4c_s7_read_write_s7_message));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_message));
 
 
   // Const Field (protocolId)
   uint8_t protocolId = plc4c_spi_read_unsigned_short(buf, 8);
   if(protocolId != S7_READ_WRITE_S7_MESSAGE_PROTOCOL_ID) {
     return PARSE_ERROR;
-    // throw new ParseException("Expected constant value " + S7Message.PROTOCOLID + " but got " + protocolId);
+    // throw new ParseException("Expected constant value " + S7_READ_WRITE_S7_MESSAGE_PROTOCOL_ID + " but got " + protocolId);
   }
 
   // Discriminator Field (messageType) (Used as input to a switch field)
@@ -71,7 +71,7 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
 
   // Simple Field (tpduReference)
   uint16_t tpduReference = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->tpdu_reference = tpduReference;
+  (*_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)
   uint16_t parameterLength = plc4c_spi_read_unsigned_int(buf, 16);
@@ -83,18 +83,26 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
   if(messageType == 0x01) { /* S7MessageRequest */
   } else 
   if(messageType == 0x02) { /* S7MessageResponse */
-    uint8_t errorClass = -1;
-    msg->s7_message_response_error_class = errorClass;
 
-    uint8_t errorCode = -1;
-    msg->s7_message_response_error_code = errorCode;
+  // Simple Field (errorClass)
+  uint8_t errorClass = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_message_response_error_class = errorClass;
+
+
+  // Simple Field (errorCode)
+  uint8_t errorCode = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_message_response_error_code = errorCode;
   } else 
   if(messageType == 0x03) { /* S7MessageResponseData */
-    uint8_t errorClass = -1;
-    msg->s7_message_response_data_error_class = errorClass;
 
-    uint8_t errorCode = -1;
-    msg->s7_message_response_data_error_code = errorCode;
+  // Simple Field (errorClass)
+  uint8_t errorClass = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_message_response_data_error_class = errorClass;
+
+
+  // Simple Field (errorCode)
+  uint8_t errorCode = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_message_response_data_error_code = errorCode;
   } else 
   if(messageType == 0x07) { /* S7MessageUserData */
   }
@@ -102,17 +110,23 @@ plc4c_return_code plc4c_s7_read_write_s7_message_parse(plc4c_spi_read_buffer* bu
   // Optional Field (parameter) (Can be skipped, if a given expression evaluates to false)
   plc4c_s7_read_write_s7_parameter* parameter = NULL;
   if((parameterLength) > (0)) {
-    plc4c_s7_read_write_s7_parameter* parameter = NULL;
+    parameter = malloc(sizeof(plc4c_s7_read_write_s7_parameter));
+    if(parameter == NULL) {
+      return NO_MEMORY;
+    }
     plc4c_s7_read_write_s7_parameter_parse(buf, messageType, &parameter);
-    msg->parameter = parameter;
+    (*_message)->parameter = parameter;
   }
 
   // Optional Field (payload) (Can be skipped, if a given expression evaluates to false)
   plc4c_s7_read_write_s7_payload* payload = NULL;
   if((payloadLength) > (0)) {
-    plc4c_s7_read_write_s7_payload* payload = NULL;
+    payload = malloc(sizeof(plc4c_s7_read_write_s7_payload));
+    if(payload == NULL) {
+      return NO_MEMORY;
+    }
     plc4c_s7_read_write_s7_payload_parse(buf, messageType, parameter, &payload);
-    msg->payload = payload;
+    (*_message)->payload = payload;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
index 8f84ef2..6225708 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter.c
@@ -47,46 +47,116 @@ plc4c_s7_read_write_s7_parameter_discriminator plc4c_s7_read_write_s7_parameter_
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter** message) {
+plc4c_return_code plc4c_s7_read_write_s7_parameter_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_parameter* msg = malloc(sizeof(plc4c_s7_read_write_s7_parameter));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_parameter));
 
   // Discriminator Field (parameterType) (Used as input to a switch field)
   uint8_t parameterType = plc4c_spi_read_unsigned_short(buf, 8);
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(parameterType == 0xF0) { /* S7ParameterSetupCommunication */
-    uint16_t maxAmqCaller = -1;
-    msg->s7_parameter_setup_communication_max_amq_caller = maxAmqCaller;
 
-    uint16_t maxAmqCallee = -1;
-    msg->s7_parameter_setup_communication_max_amq_callee = maxAmqCallee;
+  // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+  {
+    uint8_t _reserved = plc4c_spi_read_unsigned_short(buf, 8);
+    if(_reserved != 0x00) {
+      printf("Expected constant value '%d' but got '%d' for reserved field.", 0x00, _reserved);
+    }
+  }
+
+
+  // Simple Field (maxAmqCaller)
+  uint16_t maxAmqCaller = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->s7_parameter_setup_communication_max_amq_caller = maxAmqCaller;
+
+
+  // Simple Field (maxAmqCallee)
+  uint16_t maxAmqCallee = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->s7_parameter_setup_communication_max_amq_callee = maxAmqCallee;
 
-    uint16_t pduLength = -1;
-    msg->s7_parameter_setup_communication_pdu_length = pduLength;
+
+  // Simple Field (pduLength)
+  uint16_t pduLength = plc4c_spi_read_unsigned_int(buf, 16);
+  (*_message)->s7_parameter_setup_communication_pdu_length = pduLength;
   } else 
   if((parameterType == 0x04) && (messageType == 0x01)) { /* S7ParameterReadVarRequest */
-    plc4c_list* items;
-    msg->s7_parameter_read_var_request_items = items;
+
+  // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = numItems;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_parameter_read_var_request_items = items;
   } else 
   if((parameterType == 0x04) && (messageType == 0x03)) { /* S7ParameterReadVarResponse */
-    uint8_t numItems = -1;
-    msg->s7_parameter_read_var_response_num_items = numItems;
+
+  // Simple Field (numItems)
+  uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_parameter_read_var_response_num_items = numItems;
   } else 
   if((parameterType == 0x05) && (messageType == 0x01)) { /* S7ParameterWriteVarRequest */
-    plc4c_list* items;
-    msg->s7_parameter_write_var_request_items = items;
+
+  // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = numItems;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_s7_var_request_parameter_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_parameter_write_var_request_items = items;
   } else 
   if((parameterType == 0x05) && (messageType == 0x03)) { /* S7ParameterWriteVarResponse */
-    uint8_t numItems = -1;
-    msg->s7_parameter_write_var_response_num_items = numItems;
+
+  // Simple Field (numItems)
+  uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_parameter_write_var_response_num_items = numItems;
   } else 
   if((parameterType == 0x00) && (messageType == 0x07)) { /* S7ParameterUserData */
-    plc4c_list* items;
-    msg->s7_parameter_user_data_items = items;
+
+  // Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t numItems = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = numItems;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_s7_parameter_user_data_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_parameter_user_data_items = items;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
index b6fad93..5512c0c 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_parameter_user_data_item.c
@@ -37,41 +37,82 @@ plc4c_s7_read_write_s7_parameter_user_data_item_discriminator plc4c_s7_read_writ
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_parameter_user_data_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_parameter_user_data_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_parameter_user_data_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_parameter_user_data_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_parameter_user_data_item));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_parameter_user_data_item));
 
   // Discriminator Field (itemType) (Used as input to a switch field)
   uint8_t itemType = plc4c_spi_read_unsigned_short(buf, 8);
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(itemType == 0x12) { /* S7ParameterUserDataItemCPUFunctions */
-    uint8_t method = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_method = method;
 
-    unsigned int cpuFunctionType = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_cpu_function_type = cpuFunctionType;
+  // Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t itemLength = plc4c_spi_read_unsigned_short(buf, 8);
 
-    unsigned int cpuFunctionGroup = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_cpu_function_group = cpuFunctionGroup;
 
-    uint8_t cpuSubfunction = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_cpu_subfunction = cpuSubfunction;
+  // Simple Field (method)
+  uint8_t method = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_parameter_user_data_item_cpu_functions_method = method;
 
-    uint8_t sequenceNumber = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_sequence_number = sequenceNumber;
 
-    uint8_t dataUnitReferenceNumber = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_data_unit_reference_number = dataUnitReferenceNumber;
+  // Simple Field (cpuFunctionType)
+  unsigned int cpuFunctionType = plc4c_spi_read_unsigned_byte(buf, 4);
+  (*_message)->s7_parameter_user_data_item_cpu_functions_cpu_function_type = cpuFunctionType;
 
-    uint8_t lastDataUnit = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_last_data_unit = lastDataUnit;
 
-    uint16_t errorCode = -1;
-    msg->s7_parameter_user_data_item_cpu_functions_error_code = errorCode;
+  // Simple Field (cpuFunctionGroup)
+  unsigned int cpuFunctionGroup = plc4c_spi_read_unsigned_byte(buf, 4);
+  (*_message)->s7_parameter_user_data_item_cpu_functions_cpu_function_group = cpuFunctionGroup;
+
+
+  // Simple Field (cpuSubfunction)
+  uint8_t cpuSubfunction = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_parameter_user_data_item_cpu_functions_cpu_subfunction = cpuSubfunction;
+
+
+  // Simple Field (sequenceNumber)
+  uint8_t sequenceNumber = plc4c_spi_read_unsigned_short(buf, 8);
+  (*_message)->s7_parameter_user_data_item_cpu_functions_sequence_number = sequenceNumber;
+
+
+  // Optional Field (dataUnitReferenceNumber) (Can be skipped, if a given expression evaluates to false)
+  uint8_t* dataUnitReferenceNumber = NULL;
+  if((cpuFunctionType) == (8)) {
+    dataUnitReferenceNumber = malloc(sizeof(uint8_t));
+    if(dataUnitReferenceNumber == NULL) {
+      return NO_MEMORY;
+    }
+    *dataUnitReferenceNumber = plc4c_spi_read_unsigned_short(buf, 8);
+    (*_message)->s7_parameter_user_data_item_cpu_functions_data_unit_reference_number = dataUnitReferenceNumber;
+  }
+
+
+  // Optional Field (lastDataUnit) (Can be skipped, if a given expression evaluates to false)
+  uint8_t* lastDataUnit = NULL;
+  if((cpuFunctionType) == (8)) {
+    lastDataUnit = malloc(sizeof(uint8_t));
+    if(lastDataUnit == NULL) {
+      return NO_MEMORY;
+    }
+    *lastDataUnit = plc4c_spi_read_unsigned_short(buf, 8);
+    (*_message)->s7_parameter_user_data_item_cpu_functions_last_data_unit = lastDataUnit;
+  }
+
+
+  // Optional Field (errorCode) (Can be skipped, if a given expression evaluates to false)
+  uint16_t* errorCode = NULL;
+  if((cpuFunctionType) == (8)) {
+    errorCode = malloc(sizeof(uint16_t));
+    if(errorCode == NULL) {
+      return NO_MEMORY;
+    }
+    *errorCode = plc4c_spi_read_unsigned_int(buf, 16);
+    (*_message)->s7_parameter_user_data_item_cpu_functions_error_code = errorCode;
+  }
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
index e01077e..252097a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload.c
@@ -43,29 +43,81 @@ plc4c_s7_read_write_s7_payload_discriminator plc4c_s7_read_write_s7_payload_get_
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter* parameter, plc4c_s7_read_write_s7_payload** message) {
+plc4c_return_code plc4c_s7_read_write_s7_payload_parse(plc4c_spi_read_buffer* buf, uint8_t messageType, plc4c_s7_read_write_s7_parameter* parameter, plc4c_s7_read_write_s7_payload** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_payload* msg = malloc(sizeof(plc4c_s7_read_write_s7_payload));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_payload));
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x04) && (messageType == 0x03)) { /* S7PayloadReadVarResponse */
-    plc4c_list* items;
-    msg->s7_payload_read_var_response_items = items;
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_read_var_response_num_items;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_payload_read_var_response_items = items;
   } else 
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x05) && (messageType == 0x01)) { /* S7PayloadWriteVarRequest */
-    plc4c_list* items;
-    msg->s7_payload_write_var_request_items = items;
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_write_var_request_items);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_s7_var_payload_data_item_parse(buf, lastItem, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_payload_write_var_request_items = items;
   } else 
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x05) && (messageType == 0x03)) { /* S7PayloadWriteVarResponse */
-    plc4c_list* items;
-    msg->s7_payload_write_var_response_items = items;
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = ((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_write_var_response_num_items;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_s7_var_payload_status_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_payload_write_var_response_items = items;
   } else 
   if((plc4c_s7_read_write_s7_parameter_get_discriminator(parameter->_type).parameterType == 0x00) && (messageType == 0x07)) { /* S7PayloadUserData */
-    plc4c_list* items;
-    msg->s7_payload_user_data_items = items;
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = plc4c_spi_evaluation_helper_count(((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_user_data_items);
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_s7_payload_user_data_item_parse(buf, ((plc4c_s7_read_write_s7_parameter_user_data_item) (((plc4c_s7_read_write_s7_parameter) (*parameter)).s7_parameter_user_data_items[0])).s7_parameter_user_data_item_cpu_functions_cpu_function_type, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_payload_user_data_items = items;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
index 06e2cc5..da87ddf 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_payload_user_data_item.c
@@ -39,40 +39,65 @@ plc4c_s7_read_write_s7_payload_user_data_item_discriminator plc4c_s7_read_write_
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_read_buffer* buf, unsigned int cpuFunctionType, plc4c_s7_read_write_s7_payload_user_data_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_payload_user_data_item_parse(plc4c_spi_read_buffer* buf, unsigned int cpuFunctionType, plc4c_s7_read_write_s7_payload_user_data_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_payload_user_data_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_payload_user_data_item));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_payload_user_data_item));
 
 
   // Enum field (returnCode)
   plc4c_s7_read_write_data_transport_error_code returnCode = plc4c_spi_read_byte(buf, 8);
-  msg->return_code = returnCode;
+  (*_message)->return_code = returnCode;
 
   // Enum field (transportSize)
   plc4c_s7_read_write_data_transport_size transportSize = plc4c_spi_read_byte(buf, 8);
-  msg->transport_size = transportSize;
+  (*_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)
   uint16_t dataLength = plc4c_spi_read_unsigned_int(buf, 16);
 
   // Simple Field (szlId)
-  plc4c_s7_read_write_szl_id* szlId = NULL;
+  plc4c_s7_read_write_szl_id szlId;
   plc4c_s7_read_write_szl_id_parse(buf, (void*) &szlId);
-  msg->szl_id = szlId;
+  (*_message)->szl_id = szlId;
 
   // Simple Field (szlIndex)
   uint16_t szlIndex = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->szl_index = szlIndex;
+  (*_message)->szl_index = szlIndex;
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(cpuFunctionType == 0x04) { /* S7PayloadUserDataItemCpuFunctionReadSzlRequest */
   } else 
   if(cpuFunctionType == 0x08) { /* S7PayloadUserDataItemCpuFunctionReadSzlResponse */
-    plc4c_list* items;
-    msg->s7_payload_user_data_item_cpu_function_read_szl_response_items = items;
+
+  // Const Field (szlItemLength)
+  uint16_t szlItemLength = plc4c_spi_read_unsigned_int(buf, 16);
+  if(szlItemLength != S7_READ_WRITE_S7_PAYLOAD_USER_DATA_ITEM_CPU_FUNCTION_READ_SZL_RESPONSE_SZL_ITEM_LENGTH) {
+    return PARSE_ERROR;
+    // throw new ParseException("Expected constant value " + S7_READ_WRITE_S7_PAYLOAD_USER_DATA_ITEM_CPU_FUNCTION_READ_SZL_RESPONSE_SZL_ITEM_LENGTH + " but got " + szlItemLength);
+  }
+
+
+  // Implicit Field (szlItemCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint16_t szlItemCount = plc4c_spi_read_unsigned_int(buf, 16);
+
+
+  // Array field (items)
+  plc4c_list items;
+  {
+    // Count array
+    uint8_t itemCount = szlItemCount;
+    for(int curItem = 0; curItem < itemCount; curItem++) {
+      bool lastItem = curItem == (itemCount - 1);
+      plc4c_list* value = NULL;
+      plc4c_s7_read_write_szl_data_tree_item_parse(buf, (void*) &value);
+      plc4c_utils_list_insert_head_value(&items, value);
+      plc4c_utils_list_insert_head_value(&items, &value);
+    }
+  }
+  (*_message)->s7_payload_user_data_item_cpu_function_read_szl_response_items = items;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
index c9e9b03..f827c4a 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_data_item.c
@@ -24,25 +24,25 @@
 #include "s7_var_payload_data_item.h"
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_read_buffer* buf, bool lastItem, plc4c_s7_read_write_s7_var_payload_data_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_read_buffer* buf, bool lastItem, plc4c_s7_read_write_s7_var_payload_data_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_var_payload_data_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_data_item));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_data_item));
 
 
   // Enum field (returnCode)
   plc4c_s7_read_write_data_transport_error_code returnCode = plc4c_spi_read_byte(buf, 8);
-  msg->return_code = returnCode;
+  (*_message)->return_code = returnCode;
 
   // Enum field (transportSize)
   plc4c_s7_read_write_data_transport_size transportSize = plc4c_spi_read_byte(buf, 8);
-  msg->transport_size = transportSize;
+  (*_message)->transport_size = transportSize;
 
   // Simple Field (dataLength)
   uint16_t dataLength = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->data_length = dataLength;
+  (*_message)->data_length = dataLength;
 
   // Array field (data)
   plc4c_list data;
@@ -53,14 +53,18 @@ plc4c_return_code plc4c_s7_read_write_s7_var_payload_data_item_parse(plc4c_spi_r
       
       int8_t value = plc4c_spi_read_byte(buf, 8);
       plc4c_utils_list_insert_head_value(&data, &value);
+      plc4c_utils_list_insert_head_value(&data, &value);
     }
   }
+  (*_message)->data = data;
 
-  // Padding Field (pad)
-  bool _padNeedsPadding = (bool) ((plc4c_spi_read_has_more(buf, 8)) && ((!(lastItem)) && (((((plc4c_spi_evaluation_helper_count(data)) % (2))) == (1)))));
-  if(_padNeedsPadding) {
-    // Just read the padding data and ignore it
-    plc4c_spi_read_unsigned_short(buf, 8);
+  // Padding Field (padding)
+  {
+    bool _needsPadding = (bool) ((plc4c_spi_read_has_more(buf, 8)) && ((!(lastItem)) && (((((plc4c_spi_evaluation_helper_count(data)) % (2))) == (1)))));
+    if(_needsPadding) {
+      // Just read the padding data and ignore it
+      plc4c_spi_read_unsigned_short(buf, 8);
+    }
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
index ae8ca78..e3bad0d 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_payload_status_item.c
@@ -24,17 +24,17 @@
 #include "s7_var_payload_status_item.h"
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_payload_status_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_payload_status_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_payload_status_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_var_payload_status_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_status_item));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_payload_status_item));
 
 
   // Enum field (returnCode)
   plc4c_s7_read_write_data_transport_error_code returnCode = plc4c_spi_read_byte(buf, 8);
-  msg->return_code = returnCode;
+  (*_message)->return_code = returnCode;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
index c50fbd6..db826a5 100644
--- a/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/s7_var_request_parameter_item.c
@@ -37,20 +37,27 @@ plc4c_s7_read_write_s7_var_request_parameter_item_discriminator plc4c_s7_read_wr
 }
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_request_parameter_item** message) {
+plc4c_return_code plc4c_s7_read_write_s7_var_request_parameter_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_s7_var_request_parameter_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_s7_var_request_parameter_item* msg = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_s7_var_request_parameter_item));
 
   // Discriminator Field (itemType) (Used as input to a switch field)
   uint8_t itemType = plc4c_spi_read_unsigned_short(buf, 8);
 
   // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
   if(itemType == 0x12) { /* S7VarRequestParameterItemAddress */
-    plc4c_s7_read_write_s7_address* address = NULL;
-    msg->s7_var_request_parameter_item_address_address = address;
+
+  // Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+  uint8_t itemLength = plc4c_spi_read_unsigned_short(buf, 8);
+
+
+  // Simple Field (address)
+  plc4c_s7_read_write_s7_address address;
+  plc4c_s7_read_write_s7_address_parse(buf, (void*) &address);
+  (*_message)->s7_var_request_parameter_item_address_address = address;
   }
 
   return OK;
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
index 900598e..a8be5e5 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_data_tree_item.c
@@ -24,17 +24,17 @@
 #include "szl_data_tree_item.h"
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_data_tree_item** message) {
+plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_data_tree_item** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_szl_data_tree_item* msg = malloc(sizeof(plc4c_s7_read_write_szl_data_tree_item));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_szl_data_tree_item));
 
 
   // Simple Field (itemIndex)
   uint16_t itemIndex = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->item_index = itemIndex;
+  (*_message)->item_index = itemIndex;
 
   // Array field (mlfb)
   plc4c_list mlfb;
@@ -45,20 +45,22 @@ plc4c_return_code plc4c_s7_read_write_szl_data_tree_item_parse(plc4c_spi_read_bu
       
       int8_t value = plc4c_spi_read_byte(buf, 8);
       plc4c_utils_list_insert_head_value(&mlfb, &value);
+      plc4c_utils_list_insert_head_value(&mlfb, &value);
     }
   }
+  (*_message)->mlfb = mlfb;
 
   // Simple Field (moduleTypeId)
   uint16_t moduleTypeId = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->module_type_id = moduleTypeId;
+  (*_message)->module_type_id = moduleTypeId;
 
   // Simple Field (ausbg)
   uint16_t ausbg = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->ausbg = ausbg;
+  (*_message)->ausbg = ausbg;
 
   // Simple Field (ausbe)
   uint16_t ausbe = plc4c_spi_read_unsigned_int(buf, 16);
-  msg->ausbe = ausbe;
+  (*_message)->ausbe = ausbe;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/szl_id.c b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
index 87edb3e..484ba7c 100644
--- a/sandbox/plc4c/generated-sources/s7/src/szl_id.c
+++ b/sandbox/plc4c/generated-sources/s7/src/szl_id.c
@@ -24,25 +24,25 @@
 #include "szl_id.h"
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_szl_id_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_id** message) {
+plc4c_return_code plc4c_s7_read_write_szl_id_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_szl_id** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_szl_id* msg = malloc(sizeof(plc4c_s7_read_write_szl_id));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_szl_id));
 
 
   // Enum field (typeClass)
   plc4c_s7_read_write_szl_module_type_class typeClass = plc4c_spi_read_byte(buf, 4);
-  msg->type_class = typeClass;
+  (*_message)->type_class = typeClass;
 
   // Simple Field (sublistExtract)
   unsigned int sublistExtract = plc4c_spi_read_unsigned_byte(buf, 4);
-  msg->sublist_extract = sublistExtract;
+  (*_message)->sublist_extract = sublistExtract;
 
   // Enum field (sublistList)
   plc4c_s7_read_write_szl_sublist sublistList = plc4c_spi_read_byte(buf, 8);
-  msg->sublist_list = sublistList;
+  (*_message)->sublist_list = sublistList;
 
   return OK;
 }
diff --git a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
index f8d9206..c83283e 100644
--- a/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
+++ b/sandbox/plc4c/generated-sources/s7/src/tpkt_packet.c
@@ -24,19 +24,19 @@
 #include "tpkt_packet.h"
 
 // Parse function.
-plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_tpkt_packet** message) {
+plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* buf, plc4c_s7_read_write_tpkt_packet** _message) {
   uint16_t startPos = plc4c_spi_read_get_pos(buf);
   uint16_t curPos;
 
   // Pointer to the parsed data structure.
-  plc4c_s7_read_write_tpkt_packet* msg = malloc(sizeof(plc4c_s7_read_write_tpkt_packet));
+  (*_message) = malloc(sizeof(plc4c_s7_read_write_tpkt_packet));
 
 
   // Const Field (protocolId)
   uint8_t protocolId = plc4c_spi_read_unsigned_short(buf, 8);
   if(protocolId != S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID) {
     return PARSE_ERROR;
-    // throw new ParseException("Expected constant value " + TPKTPacket.PROTOCOLID + " but got " + protocolId);
+    // throw new ParseException("Expected constant value " + S7_READ_WRITE_TPKT_PACKET_PROTOCOL_ID + " but got " + protocolId);
   }
 
   // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
@@ -51,9 +51,9 @@ plc4c_return_code plc4c_s7_read_write_tpkt_packet_parse(plc4c_spi_read_buffer* b
   uint16_t len = plc4c_spi_read_unsigned_int(buf, 16);
 
   // Simple Field (payload)
-  plc4c_s7_read_write_cotp_packet* payload = NULL;
+  plc4c_s7_read_write_cotp_packet payload;
   plc4c_s7_read_write_cotp_packet_parse(buf, (len) - (4), (void*) &payload);
-  msg->payload = payload;
+  (*_message)->payload = payload;
 
   return OK;
 }