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/10/09 15:41:12 UTC

[plc4x] branch feature/plc4go updated: - Implemented the serialization (Note: there is still a problem with the typeSwitch serialization)

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

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


The following commit(s) were added to refs/heads/feature/plc4go by this push:
     new 76335f8  - Implemented the serialization (Note: there is still a problem with the typeSwitch serialization)
76335f8 is described below

commit 76335f834989e36ccc87bec59ed596e0bd1ba661
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Oct 9 17:41:04 2020 +0200

    - Implemented the serialization
    (Note: there is still a problem with the typeSwitch serialization)
---
 .../language/go/GoLanguageTemplateHelper.java      | 275 ++++++++++++--------
 .../resources/templates/go/model-template.ftlh     | 288 +++++++++++++--------
 .../main/resources/protocols/modbus/modbus.mspec   |   4 +-
 .../plc4go/go/modbus/readwrite/ModbusPDU.go        | 142 ----------
 .../{go => }/modbus/readwrite/ModbusConstants.go   |  11 +
 .../{go => }/modbus/readwrite/ModbusDataType.go    |   0
 .../plc4go/modbus/readwrite/ModbusPDU.go           | 264 +++++++++++++++++++
 .../modbus/readwrite/ModbusPDUDiagnosticRequest.go |  29 +++
 .../{go => }/modbus/readwrite/ModbusPDUError.go    |  25 ++
 .../readwrite/ModbusPDUGetComEventLogRequest.go    |  21 ++
 .../readwrite/ModbusPDUGetComEventLogResponse.go   |  44 ++++
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |  33 +++
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |  33 +++
 .../modbus/readwrite/ModbusPDUReadCoilsRequest.go  |  29 +++
 .../modbus/readwrite/ModbusPDUReadCoilsResponse.go |  32 +++
 .../ModbusPDUReadDeviceIdentificationRequest.go    |  21 ++
 .../ModbusPDUReadDeviceIdentificationResponse.go   |  21 ++
 .../ModbusPDUReadDiscreteInputsRequest.go          |  29 +++
 .../ModbusPDUReadDiscreteInputsResponse.go         |  32 +++
 .../ModbusPDUReadExceptionStatusRequest.go         |  21 ++
 .../ModbusPDUReadExceptionStatusResponse.go        |  25 ++
 .../readwrite/ModbusPDUReadFifoQueueRequest.go     |  25 ++
 .../readwrite/ModbusPDUReadFifoQueueResponse.go    |  36 +++
 .../readwrite/ModbusPDUReadFileRecordRequest.go    |  39 +++
 .../ModbusPDUReadFileRecordRequestItem.go          |  24 ++
 .../readwrite/ModbusPDUReadFileRecordResponse.go   |  39 +++
 .../ModbusPDUReadFileRecordResponseItem.go         |  23 ++
 .../ModbusPDUReadHoldingRegistersRequest.go        |  29 +++
 .../ModbusPDUReadHoldingRegistersResponse.go       |  32 +++
 .../ModbusPDUReadInputRegistersRequest.go          |  29 +++
 .../ModbusPDUReadInputRegistersResponse.go         |  32 +++
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |  48 ++++
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |  32 +++
 .../readwrite/ModbusPDUReportServerIdRequest.go    |  21 ++
 .../readwrite/ModbusPDUReportServerIdResponse.go   |  32 +++
 .../readwrite/ModbusPDUWriteFileRecordRequest.go   |  39 +++
 .../ModbusPDUWriteFileRecordRequestItem.go         |  31 +++
 .../readwrite/ModbusPDUWriteFileRecordResponse.go  |  39 +++
 .../ModbusPDUWriteFileRecordResponseItem.go        |  31 +++
 .../ModbusPDUWriteMultipleCoilsRequest.go          |  40 +++
 .../ModbusPDUWriteMultipleCoilsResponse.go         |  29 +++
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |  40 +++
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |  29 +++
 .../readwrite/ModbusPDUWriteSingleCoilRequest.go   |  29 +++
 .../readwrite/ModbusPDUWriteSingleCoilResponse.go  |  29 +++
 .../ModbusPDUWriteSingleRegisterRequest.go         |  29 +++
 .../ModbusPDUWriteSingleRegisterResponse.go        |  29 +++
 .../{go => }/modbus/readwrite/ModbusSerialADU.go   |  27 ++
 .../{go => }/modbus/readwrite/ModbusTcpADU.go      |  27 ++
 sandbox/plc4go/src/main/modbus.go                  |   2 +-
 50 files changed, 1901 insertions(+), 369 deletions(-)

diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index 8e2869c..f6fd0c1 100644
--- a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -20,7 +20,6 @@
 package org.apache.plc4x.language.go;
 
 import org.apache.commons.lang3.math.NumberUtils;
-import org.apache.commons.text.WordUtils;
 import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.BaseFreemarkerLanguageTemplateHelper;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.*;
 import org.apache.plc4x.plugins.codegenerator.types.enums.EnumValue;
@@ -28,7 +27,6 @@ import org.apache.plc4x.plugins.codegenerator.types.fields.*;
 import org.apache.plc4x.plugins.codegenerator.types.references.*;
 import org.apache.plc4x.plugins.codegenerator.types.terms.*;
 
-import java.lang.reflect.Array;
 import java.util.*;
 import java.util.function.Function;
 
@@ -40,8 +38,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public String fileName(String protocolName, String languageName, String languageFlavorName) {
-        return "plc4go." + String.join("", languageName.split("\\-")) + "." +
-            String.join("", protocolName.split("\\-")) + "." +
+        return "plc4go." + String.join("", protocolName.split("\\-")) + "." +
             String.join("", languageFlavorName.split("\\-"));
     }
 
@@ -146,46 +143,19 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 case BIT: {
                     return "false";
                 }
-                case UINT: {
-                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                    if (integerTypeReference.getSizeInBits() <= 16) {
-                        return "0";
-                    }
-                    if (integerTypeReference.getSizeInBits() <= 32) {
-                        return "0l";
-                    }
-                    return "null";
-                }
+                case UINT:
                 case INT: {
-                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                    if (integerTypeReference.getSizeInBits() <= 32) {
-                        return "0";
-                    }
-                    if (integerTypeReference.getSizeInBits() <= 64) {
-                        return "0l";
-                    }
-                    return "null";
+                    return "0";
                 }
                 case FLOAT: {
-                    FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
-                    int sizeInBits = ((floatTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.FLOAT) ? 1 : 0) +
-                        floatTypeReference.getExponent() + floatTypeReference.getMantissa();
-                    if (sizeInBits <= 32) {
-                        return "0.0f";
-                    }
-                    if (sizeInBits <= 64) {
-                        return "0.0";
-                    }
-                    return "null";
+                    return "0.0";
                 }
                 case STRING: {
-                    return "null";
+                    return "";
                 }
             }
-            return "Hurz";
-        } else {
-            return "null";
         }
+        return "null";
     }
 
     public int getNumBits(SimpleTypeReference simpleTypeReference) {
@@ -273,39 +243,37 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     public String getWriteBufferWriteMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
         switch (simpleTypeReference.getBaseType()) {
             case BIT: {
-                return "io.writeBit((bool) " + fieldName + ")";
+                return "io.WriteBit((bool) " + fieldName + ")";
             }
             case UINT: {
                 IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                if (integerTypeReference.getSizeInBits() <= 4) {
-                    return "io.writeUnsignedByte(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())";
-                }
                 if (integerTypeReference.getSizeInBits() <= 8) {
-                    return "io.writeUnsignedShort(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())";
+                    return "io.WriteUint8(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
                 }
                 if (integerTypeReference.getSizeInBits() <= 16) {
-                    return "io.writeUnsignedInt(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())";
+                    return "io.WriteUint16(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
                 }
                 if (integerTypeReference.getSizeInBits() <= 32) {
-                    return "io.writeUnsignedLong(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())";
+                    return "io.WriteUint32(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
+                }
+                if (integerTypeReference.getSizeInBits() <= 64) {
+                    return "io.WriteUint64(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
                 }
-                return "io.writeUnsignedBigInteger(" + integerTypeReference.getSizeInBits() + ", (BigInteger) " + fieldName + ")";
             }
             case INT: {
                 IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
                 if (integerTypeReference.getSizeInBits() <= 8) {
-                    return "io.writeByte(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())";
+                    return "io.WriteInt8(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
                 }
                 if (integerTypeReference.getSizeInBits() <= 16) {
-                    return "io.writeShort(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())";
+                    return "io.WriteInt16(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
                 }
                 if (integerTypeReference.getSizeInBits() <= 32) {
-                    return "io.writeInt(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())";
+                    return "io.WriteInt32(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
                 }
                 if (integerTypeReference.getSizeInBits() <= 64) {
-                    return "io.writeLong(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())";
+                    return "io.WriteInt64(" + integerTypeReference.getSizeInBits() + ", " + fieldName + ")";
                 }
-                return "io.writeBigInteger(" + integerTypeReference.getSizeInBits() + ", BigInteger.valueOf( " + fieldName + "))";
             }
             case FLOAT:
             case UFLOAT: {
@@ -323,8 +291,8 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             }
             case STRING: {
                 StringTypeReference stringTypeReference = (StringTypeReference) simpleTypeReference;
-                return "io.writeString(" + stringTypeReference.getSizeInBits() + ", \"" +
-                    stringTypeReference.getEncoding() + "\", (String) " + fieldName + ")";
+                return "io.WriteString(" + stringTypeReference.getSizeInBits() + ", \"" +
+                    stringTypeReference.getEncoding() + "\", " + fieldName + ")";
             }
         }
         return "Hurz";
@@ -422,7 +390,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         }
         else if("STATIC_CALL".equals(vl.getName())) {
             StringBuilder sb = new StringBuilder();
-            if(!(vl.getArgs().get(0) instanceof StringLiteral)) {
+            if (!(vl.getArgs().get(0) instanceof StringLiteral)) {
                 throw new RuntimeException("Expecting the first argument of a 'STATIC_CALL' to be a StringLiteral");
             }
             // Get the class and method name
@@ -430,17 +398,17 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             // Cut off the double-quptes
             methodName = methodName.substring(1, methodName.length() - 1);
             sb.append(methodName).append("(");
-            for(int i = 1; i < vl.getArgs().size(); i++) {
+            for (int i = 1; i < vl.getArgs().size(); i++) {
                 Term arg = vl.getArgs().get(i);
-                if(i > 1) {
+                if (i > 1) {
                     sb.append(", ");
                 }
-                if(arg instanceof VariableLiteral) {
+                if (arg instanceof VariableLiteral) {
                     VariableLiteral va = (VariableLiteral) arg;
                     // "io" is the default name of the reader argument which is always available.
                     boolean isParserArg = "io".equals(va.getName());
                     boolean isTypeArg = "_type".equals(va.getName());
-                    if(!isParserArg && !isTypeArg && parserArguments != null) {
+                    if (!isParserArg && !isTypeArg && parserArguments != null) {
                         for (Argument parserArgument : parserArguments) {
                             if (parserArgument.getName().equals(va.getName())) {
                                 isParserArg = true;
@@ -448,11 +416,11 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                             }
                         }
                     }
-                    if(isParserArg) {
+                    if (isParserArg) {
                         sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
                     }
                     // We have to manually evaluate the type information at code-generation time.
-                    else if(isTypeArg) {
+                    else if (isTypeArg) {
                         String part = va.getChild().getName();
                         switch (part) {
                             case "name":
@@ -471,13 +439,16 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                     } else {
                         sb.append(toVariableParseExpression(field, va, null));
                     }
-                } else if(arg instanceof StringLiteral) {
+                } else if (arg instanceof StringLiteral) {
                     sb.append(((StringLiteral) arg).getValue());
                 }
             }
             sb.append(")");
             return sb.toString();
         }
+        else if("COUNT".equals(vl.getName())) {
+            return "uint8(len(" + vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "") + "))";
+        }
         // All uppercase names are not fields, but utility methods.
         else if(vl.getName().equals(vl.getName().toUpperCase())) {
             StringBuilder sb = new StringBuilder(vl.getName());
@@ -518,8 +489,8 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 }
                 if(arg instanceof VariableLiteral) {
                     VariableLiteral va = (VariableLiteral) arg;
-                    // "io" and "_value" are always available in every parser.
-                    boolean isSerializerArg = "io".equals(va.getName()) || "_value".equals(va.getName()) || "element".equals(va.getName());
+                    // "io" and "m" are always available in every parser.
+                    boolean isSerializerArg = "io".equals(va.getName()) || "m".equals(va.getName()) || "element".equals(va.getName());
                     boolean isTypeArg = "_type".equals(va.getName());
                     if(!isSerializerArg && !isTypeArg && serialzerArguments != null) {
                         for (Argument serializerArgument : serialzerArguments) {
@@ -557,58 +528,45 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             sb.append(")");
             return sb.toString();
         }
-        // All uppercase names are not fields, but utility methods.
-        else if(vl.getName().equals(vl.getName().toUpperCase())) {
-            StringBuilder sb = new StringBuilder(vl.getName());
-            if(vl.getArgs() != null) {
-                sb.append("(");
-                boolean firstArg = true;
-                for(Term arg : vl.getArgs()) {
-                    if(!firstArg) {
-                        sb.append(", ");
+        else if("COUNT".equals(vl.getName())) {
+            VariableLiteral va = (VariableLiteral) vl.getArgs().get(0);
+            // "io" and "m" are always available in every parser.
+            boolean isSerializerArg = "io".equals(va.getName()) || "m".equals(va.getName()) || "element".equals(va.getName());
+            if(!isSerializerArg && serialzerArguments != null) {
+                for (Argument serializerArgument : serialzerArguments) {
+                    if (serializerArgument.getName().equals(va.getName())) {
+                        isSerializerArg = true;
+                        break;
                     }
-
-                    if(arg instanceof VariableLiteral) {
-                        VariableLiteral va = (VariableLiteral) arg;
-                        boolean isSerializerArg = "io".equals(va.getName());
-                        boolean isTypeArg = "_type".equals(va.getName());
-                        if(!isSerializerArg && !isTypeArg && serialzerArguments != null) {
-                            for (Argument serializerArgument : serialzerArguments) {
-                                if (serializerArgument.getName().equals(va.getName())) {
-                                    isSerializerArg = true;
-                                    break;
-                                }
-                            }
-                        }
-                        if(isSerializerArg) {
-                            sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
-                        } else if(isTypeArg) {
-                            String part = va.getChild().getName();
-                            switch (part) {
-                                case "name":
-                                    sb.append("\"").append(field.getTypeName()).append("\"");
-                                    break;
-                                case "length":
-                                    sb.append("\"").append(((SimpleTypeReference) field).getSizeInBits()).append("\"");
-                                    break;
-                                case "encoding":
-                                    String encoding = ((StringTypeReference) field.getType()).getEncoding();
-                                    // Cut off the single quotes.
-                                    encoding = encoding.substring(1, encoding.length() - 1);
-                                    sb.append("\"").append(encoding).append("\"");
-                                    break;
-                            }
-                        } else {
-                            sb.append(toVariableSerializationExpression(field, va, null));
-                        }
-                    } else if(arg instanceof StringLiteral) {
-                        sb.append(((StringLiteral) arg).getValue());
+                }
+            }
+            StringBuilder sb = new StringBuilder();
+            if(isSerializerArg) {
+                sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
+            } else {
+                sb.append(toVariableSerializationExpression(field, va, null));
+            }
+            return getLanguageTypeNameForField(field) + "(len(" + sb.toString() + "))";
+        }
+        else if("ARRAY_SIZE_IN_BYTES".equals(vl.getName())) {
+            VariableLiteral va = (VariableLiteral) vl.getArgs().get(0);
+            // "io" and "m" are always available in every parser.
+            boolean isSerializerArg = "io".equals(va.getName()) || "m".equals(va.getName()) || "element".equals(va.getName());
+            if(!isSerializerArg && serialzerArguments != null) {
+                for (Argument serializerArgument : serialzerArguments) {
+                    if (serializerArgument.getName().equals(va.getName())) {
+                        isSerializerArg = true;
+                        break;
                     }
-                    firstArg = false;
                 }
-                sb.append(")");
             }
-            return sb.toString();
+            StringBuilder sb = new StringBuilder();
+            if(isSerializerArg) {
+                sb.append(va.getName()).append(((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
+            } else {
+                sb.append(toVariableSerializationExpression(field, va, null));
+            }
+            return getLanguageTypeNameForField(field) + "(" + ((VariableLiteral) vl.getArgs().get(0)).getName() + "ArraySizeInBytes(" + sb.toString() + "))";
         }
         // The synthetic checksumRawData is a local field and should not be accessed as bean property.
         boolean isSerializerArg = "checksumRawData".equals(vl.getName()) || "_value".equals(vl.getName()) || "element".equals(vl.getName());
@@ -639,12 +597,17 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                     return "";
             }
         } else {
-            return "_value." + toVariableExpressionRest(vl);
+            return "m." + toVariableExpressionRest(vl);
         }
     }
 
     private String toVariableExpressionRest(VariableLiteral vl) {
-        return "get" + WordUtils.capitalize(vl.getName()) + "()" + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
+        if("lengthInBytes".equals(vl.getName())) {
+            return "LengthInBytes()";
+        } else if("lengthInBits".equals(vl.getName())) {
+            return "LengthInBits()";
+        }
+        return vl.getName() + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
             ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : ""));
     }
 
@@ -835,5 +798,95 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         return "_";
     }
 
+    public boolean needsVariable(ArrayField field, String variableName, boolean serialization) {
+        if(!serialization) {
+            if (field.getLoopExpression().contains(variableName)) {
+                return true;
+            }
+        }
+        if((field.getParams() != null) && (field.getParams().length > 0)){
+            for (Term param : field.getParams()) {
+                if(param.contains(variableName)) {
+                    return true;
+                }
+            }
+        }
+        return false;
+    }
+
+    /**
+     * Right now only the ARRAY_SIZE_IN_BYTES requires helpers to be generated.
+     * Also right now only the Modbus protocol requires this and here the referenced
+     * properties are all also members of the current complex type,
+     * so we'll simplify things here for now.
+     *
+     * @param functionName name of the
+     * @return
+     */
+    public Map<String, String> requiresHelperFunctions(String functionName) {
+        Map<String, String> result = new HashMap<>();
+        // Search for array fields ...
+        for (Field curField : ((ComplexTypeDefinition) getThisTypeDefinition()).getFields()) {
+            if(curField instanceof ArrayField) {
+                ArrayField arrayField = (ArrayField) curField;
+                if(arrayField.getType() instanceof ComplexTypeReference) {
+                    result.put(arrayField.getName(), getLanguageTypeNameForField(arrayField));
+                }
+            }
+        }
+        return result;
+    }
+
+    public Term findTerm(Term baseTerm, String name) {
+        if(baseTerm instanceof VariableLiteral) {
+            VariableLiteral variableLiteral = (VariableLiteral) baseTerm;
+            if(variableLiteral.getName().equals(name)) {
+                return variableLiteral;
+            }
+            if(variableLiteral.getChild() != null) {
+                Term found = findTerm(variableLiteral.getChild(), name);
+                if(found != null) {
+                    return found;
+                }
+            }
+            for (Term arg : variableLiteral.getArgs()) {
+                Term found = findTerm(arg, name);
+                if(found != null) {
+                    return found;
+                }
+            }
+        } else if(baseTerm instanceof UnaryTerm) {
+            UnaryTerm unaryTerm = (UnaryTerm) baseTerm;
+            Term found = findTerm(unaryTerm.getA(), name);
+            if(found != null) {
+                return found;
+            }
+        } else if(baseTerm instanceof BinaryTerm) {
+            BinaryTerm binaryTerm = (BinaryTerm) baseTerm;
+            Term found = findTerm(binaryTerm.getA(), name);
+            if(found != null) {
+                return found;
+            }
+            found = findTerm(binaryTerm.getB(), name);
+            if(found != null) {
+                return found;
+            }
+        } else if(baseTerm instanceof TernaryTerm) {
+            TernaryTerm ternaryTerm = (TernaryTerm) baseTerm;
+            Term found = findTerm(ternaryTerm.getA(), name);
+            if(found != null) {
+                return found;
+            }
+            found = findTerm(ternaryTerm.getB(), name);
+            if(found != null) {
+                return found;
+            }
+            found = findTerm(ternaryTerm.getC(), name);
+            if(found != null) {
+                return found;
+            }
+        }
+        return null;
+    }
 
 }
diff --git a/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
index 6c799cb..ccc862d 100644
--- a/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
@@ -92,10 +92,56 @@ type ${type.name} struct {
 <#if type.parentType??>    ${type.parentType.name}</#if>
 }
 
+type I${type.name} interface {
+<#if helper.isDiscriminatedChildTypeDefinition()>
+    I${type.parentType.name}
+<#else>
+    spi.Message
+</#if>
+<#if helper.isDiscriminatedParentTypeDefinition()>
+    <#list helper.getDiscriminatorTypes() as discriminatorName, discriminatorType>
+    <#-- If the discriminator name matches that of another field, suppress the methods generation -->
+        <#if !helper.isNonDiscriminatorField(discriminatorName)>
+    ${discriminatorName?cap_first}() ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}
+        </#if>
+    </#list>
+</#if>
+    Serialize(io spi.WriteBuffer)
+}
+
+<#if helper.isDiscriminatedChildTypeDefinition()>
+    <#assign discriminatedChildType = type>
+    <#-- @ftlvariable name="discriminatedChildType" type="org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition" -->
+// Accessors for discriminator values.
+    <#list helper.getDiscriminatorValues(discriminatedChildType) as discriminatorName, discriminatorValue>
+        <#-- If the discriminator name matches that of another field, suppress the methods generation -->
+        <#if !helper.isNonDiscriminatorField(discriminatorName)>
+func (m ${type.name}) ${discriminatorName?cap_first}() ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])} {
+    return <#if discriminatorValue??>${discriminatorValue}<#else>${helper.getNullValueForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}</#if>
+}
+
+        </#if>
+    </#list>
+</#if>
 <#if helper.isDiscriminatedParentTypeDefinition()>
 type ${type.name}Initializer interface {
     initialize(<#list type.getAllPropertyFields() as field>${field.name}: ${field.name}<#sep>, </#sep></#list>) spi.Message
 }
+
+    <#list helper.getDiscriminatorTypes() as discriminatorName, discriminatorType>
+    <#-- If the discriminator name matches that of another field, suppress the methods generation -->
+        <#if !helper.isNonDiscriminatorField(discriminatorName)>
+// Dummy implementation ...
+func (m ${type.name}) ${discriminatorName?cap_first}() ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])} {
+    return ${helper.getNullValueForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}
+}
+
+func ${type.name}${discriminatorName?cap_first}(m I${type.name}) ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])} {
+    return m.${discriminatorName?cap_first}()
+}
+
+        </#if>
+    </#list>
 <#else>
 <#if type.parentType??>func (m ${type.name}) initialize(<#list type.parentType.getAllPropertyFields() as field>${field.name}: ${field.name}<#sep>, </#sep></#list>) spi.Message {
     return spi.Message(m)
@@ -517,155 +563,171 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     </#if>
 }
 
-    <#--if outputFlavor != "passive">
 func (m ${type.name}) Serialize(io spi.WriteBuffer) {
-    int startPos = io.getPos();
-
-        <#list type.fields as field>
-            <#switch field.typeName>
-                <#case "array">
-                    <#assign arrayField = field>
-                    <#assign simpleTypeReference = arrayField.type>
+    <#assign arraySizeInBytesHelpers=helper.requiresHelperFunctions("ARRAY_SIZE_IN_BYTES")>
+    <#if arraySizeInBytesHelpers?has_content>
+        <#list arraySizeInBytesHelpers?keys as key>
+            <#assign typeName=arraySizeInBytesHelpers[key]>
+    ${key}ArraySizeInBytes := func(items []${typeName}) uint32 {
+        var sizeInBytes uint32 = 0
+        for _, v := range items {
+            sizeInBytes += uint32(v.LengthInBytes())
+        }
+        return sizeInBytes
+    }
+        </#list>
+    </#if>
+    <#list type.fields as field>
+        <#switch field.typeName>
+            <#case "array">
+                <#assign arrayField = field>
+                <#assign simpleTypeReference = arrayField.type>
 
     // Array Field (${arrayField.name})
-    if(_value.get${arrayField.name?cap_first}() != null) {
-        int itemCount = (int) _value.get${arrayField.name?cap_first}().length;
-        int curItem = 0;
-        for(${helper.getLanguageTypeNameForField(field)} element : _value.get${arrayField.name?cap_first}()) {
-                    <#if helper.isSimpleTypeReference(arrayField.type)>
-                        <#assign simpleTypeReference = arrayField.type>
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "element")};
-                    <#else>
-                        <#assign complexTypeReference = arrayField.type>
-            boolean lastItem = curItem == (itemCount - 1);
-            ${complexTypeReference.name}IO.staticSerialize(io, element<#if helper.getSerializerTerms(field.params)?has_content>, <#list helper.getSerializerTerms(field.params) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);
+    if m.${arrayField.name} != nil {
+                <#if helper.isComplexTypeReference(arrayField.type) && helper.needsVariable(arrayField, "curItem", true)>
+        itemCount := len(m.${arrayField.name})
+        var curItem uint16 = 0
+                </#if>
+        for _, _element := range m.${arrayField.name} {
+                <#if helper.isSimpleTypeReference(arrayField.type)>
+                    <#assign simpleTypeReference = arrayField.type>
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_element")}
+                <#else>
+                    <#assign complexTypeReference = arrayField.type>
+                    <#if helper.needsVariable(arrayField, "curItem", true)>
+            var lastItem bool = curItem == (itemCount - 1)
+                    </#if>
+            _element.Serialize(io<#if helper.getSerializerTerms(field.params)?has_content>, <#list helper.getSerializerTerms(field.params) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
+                </#if>
+                    <#if helper.needsVariable(arrayField, "curItem", true)>
+            curItem++
                     </#if>
-            curItem++;
         }
     }
-                    <#break>
-                <#case "checksum">
-                    <#assign checksumField = field>
-                    <#assign simpleTypeReference = checksumField.type>
+                <#break>
+            <#case "checksum">
+                <#assign checksumField = field>
+                <#assign simpleTypeReference = checksumField.type>
 
     // Checksum Field (checksum) (Calculated)
     {
-        ${helper.getLanguageTypeNameForField(field)} _checksum = ${helper.getNullValueForTypeReference(checksumField.type)};
+        _checksum := ${helper.getNullValueForTypeReference(checksumField.type)}
         // Create an array of all the bytes written in this message element so far.
-        byte[] checksumRawData = io.getBytes(startPos, io.getPos());
-        _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)});
-        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")};
+        checksumRawData []uint8 = io.getBytes(startPos, io.getPos())
+        _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")}
     }
-                    <#break>
-                <#case "const">
-                    <#assign constField = field>
-                    <#assign simpleTypeReference = constField.type>
+                <#break>
+            <#case "const">
+                <#assign constField = field>
+                <#assign simpleTypeReference = constField.type>
 
     // Const Field (${constField.name})
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)};
-                    <#break>
-                <#case "discriminator">
-                    <#assign discriminatorField = field>
-                    <#assign simpleTypeReference = discriminatorField.type>
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)}
+                <#break>
+            <#case "discriminator">
+                <#assign discriminatorField = field>
+                <#assign simpleTypeReference = discriminatorField.type>
 
     // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
-    ${helper.getLanguageTypeNameForField(field)} ${discriminatorField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${discriminatorField.name?cap_first}();
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")};
-                    <#break>
-                <#case "enum">
-                    <#assign enumField = field>
+    ${discriminatorField.name} := ${type.name}${discriminatorField.name?cap_first}(m)
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
+                <#break>
+            <#case "enum">
+                <#assign enumField = field>
 
     // Enum field (${enumField.name})
-    ${helper.getLanguageTypeNameForField(field)} ${enumField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${enumField.name?cap_first}();
-    ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())")};
-                    <#break>
-                <#case "implicit">
-                    <#assign implicitField = field>
-                    <#assign simpleTypeReference = implicitField.type>
+    ${enumField.name} := m.${enumField.name}
+    ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())")}
+                <#break>
+            <#case "implicit">
+                <#assign implicitField = field>
+                <#assign simpleTypeReference = implicitField.type>
 
     // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-    ${helper.getLanguageTypeNameForField(field)} ${implicitField.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)});
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")};
-                    <#break>
-                <#case "manualArray">
-                    <#assign manualArrayField = field>
+    var ${implicitField.name} ${helper.getLanguageTypeNameForField(field)} = (${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)})
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")}
+                <#break>
+            <#case "manualArray">
+                <#assign manualArrayField = field>
 
     // Manual Array Field (${manualArrayField.name})
-    if(_value.get${manualArrayField.name?cap_first}() != null) {
-        for(${helper.getLanguageTypeNameForField(field)} element : _value.get${manualArrayField.name?cap_first}()) {
-            ${helper.toSerializationExpression(manualArrayField, manualArrayField.serializeExpression, type.parserArguments)};
+    if m.${manualArrayField.name} != nil {
+        for(${helper.getLanguageTypeNameForField(field)} element : m.${manualArrayField.name}) {
+            ${helper.toSerializationExpression(manualArrayField, manualArrayField.serializeExpression, type.parserArguments)}
         }
     }
-                    <#break>
-                <#case "manual">
-                    <#assign manualField = field>
+                <#break>
+            <#case "manual">
+                <#assign manualField = field>
 
     // Manual Field (${manualField.name})
-    ${helper.toSerializationExpression(manualField, manualField.serializeExpression, type.parserArguments)};
-                    <#break>
-                <#case "optional">
-                    <#assign optionalField = field>
+    ${helper.toSerializationExpression(manualField, manualField.serializeExpression, type.parserArguments)}
+                <#break>
+            <#case "optional">
+                <#assign optionalField = field>
 
     // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
-    ${helper.getLanguageTypeNameForField(field)} ${optionalField.name} = null;
-    if(_value.get${optionalField.name?cap_first}() != null) {
-        ${optionalField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${optionalField.name?cap_first}();
-                    <#if helper.isSimpleTypeReference(optionalField.type)>
-                        <#assign simpleTypeReference = optionalField.type>
-        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + optionalField.name + ")")};
-                    <#else>
-                        <#assign complexTypeReference = optionalField.type>
-        ${complexTypeReference.name}IO.staticSerialize(io, ${optionalField.name});
-                    </#if>
+    var ${optionalField.name} ${helper.getLanguageTypeNameForField(field)} = nil
+    if m.${optionalField.name} != nil {
+        ${optionalField.name} = m.${optionalField.name}
+                <#if helper.isSimpleTypeReference(optionalField.type)>
+                    <#assign simpleTypeReference = optionalField.type>
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + optionalField.name + ")")}
+                <#else>
+                    <#assign complexTypeReference = optionalField.type>
+        ${complexTypeReference.name}IO.staticSerialize(io, ${optionalField.name})
+                </#if>
     }
-                    <#break>
-                <#case "padding">
-                    <#assign paddingField = field>
-                    <#assign simpleTypeReference = paddingField.type>
+                <#break>
+            <#case "padding">
+                <#assign paddingField = field>
+                <#assign simpleTypeReference = paddingField.type>
 
     // Padding Field (padding)
     {
-        int _timesPadding = (int) (${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)});
-        while (_timesPadding-- > 0) {
-            ${helper.getLanguageTypeNameForField(field)} _paddingValue = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(paddingField, paddingField.paddingValue, type.parserArguments)});
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_paddingValue)")};
+        int _timesPadding = (int) (${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
+        for ;_timesPadding > 0; _timesPadding-- {
+            ${helper.getLanguageTypeNameForField(field)} _paddingValue = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(paddingField, paddingField.paddingValue, type.parserArguments)})
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_paddingValue)")}
         }
     }
-                    <#break>
-                <#case "reserved">
-                    <#assign reservedField = field>
-                    <#assign simpleTypeReference = reservedField.type>
+                <#break>
+            <#case "reserved">
+                <#assign reservedField = field>
+                <#assign simpleTypeReference = reservedField.type>
 
     // Reserved Field (reserved)
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))};
-                    <#break>
-                <#case "simple">
-                    <#assign simpleField = field>
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))}
+                <#break>
+            <#case "simple">
+                <#assign simpleField = field>
 
     // Simple Field (${simpleField.name})
-    ${helper.getLanguageTypeNameForField(field)} ${simpleField.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${simpleField.name?cap_first}();
-                    <#if helper.isSimpleTypeReference(simpleField.type)>
-                        <#assign simpleTypeReference = simpleField.type>
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")};
-                    <#else>
-                        <#assign complexTypeReference = simpleField.type>
-    ${complexTypeReference.name}IO.staticSerialize(io, ${simpleField.name});
-                    </#if>
-                    <#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(_value instanceof ${case.name}) {
-        ${case.name}IO.staticSerialize(io, (${case.name}) _value);
-    }<#sep> else </#sep>
-                    </#list>
-                    <#break>
-                <#case "virtual">
-                    <#break>
-            </#switch>
-        </#list>
+    var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)} = m.${simpleField.name}
+                <#if helper.isSimpleTypeReference(simpleField.type)>
+                    <#assign simpleTypeReference = simpleField.type>
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
+                <#else>
+                    <#assign complexTypeReference = simpleField.type>
+    ${simpleField.name}.Serialize(io)
+                </#if>
+                <#break>
+            <#case "switch">
+                <#assign switchField = field>
+
+    // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+    switch m.(type) {
+                <#list switchField.cases as case>
+        case I${case.name}:
+            I${case.name}(m).Serialize(io)
+                </#list>
+    }
+                <#break>
+            <#case "virtual">
+                <#break>
+        </#switch>
+    </#list>
 }
-    </#if-->
 </#outputformat>
\ No newline at end of file
diff --git a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
index a3f3f55..4e72019 100644
--- a/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
+++ b/protocols/modbus/src/main/resources/protocols/modbus/modbus.mspec
@@ -57,8 +57,8 @@
 
 [discriminatedType 'ModbusPDU' [bit 'response']
     [discriminator bit         'errorFlag']
-    [discriminator uint 7      'function']
-    [typeSwitch 'errorFlag','function','response'
+    [discriminator uint 7      'functionFlag']
+    [typeSwitch 'errorFlag','functionFlag','response'
         ['true'                     ModbusPDUError
             [simple     uint 8      'exceptionCode']
         ]
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDU.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDU.go
deleted file mode 100644
index 6963177..0000000
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDU.go
+++ /dev/null
@@ -1,142 +0,0 @@
-//
-// Licensed to the Apache Software Foundation (ASF) under one
-// or more contributor license agreements.  See the NOTICE file
-// distributed with this work for additional information
-// regarding copyright ownership.  The ASF licenses this file
-// to you under the Apache License, Version 2.0 (the
-// "License"); you may not use this file except in compliance
-// with the License.  You may obtain a copy of the License at
-//
-//      http://www.apache.org/licenses/LICENSE-2.0
-//
-// Unless required by applicable law or agreed to in writing,
-// software distributed under the License is distributed on an
-// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-// KIND, either express or implied.  See the License for the
-// specific language governing permissions and limitations
-// under the License.
-//
-package readwrite
-
-import (
-	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-)
-
-type ModbusPDU struct {
-}
-
-type ModbusPDUInitializer interface {
-	initialize() spi.Message
-}
-
-func (m ModbusPDU) LengthInBits() uint16 {
-	var lengthInBits uint16 = 0
-
-	// Discriminator Field (errorFlag)
-	lengthInBits += 1
-
-	// Discriminator Field (function)
-	lengthInBits += 7
-
-	// Length of sub-type elements will be added by sub-type...
-
-	return lengthInBits
-}
-
-func (m ModbusPDU) LengthInBytes() uint16 {
-	return m.LengthInBits() / 8
-}
-
-func ModbusPDUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
-
-	// Discriminator Field (errorFlag) (Used as input to a switch field)
-	var errorFlag bool = io.ReadBit()
-
-	// Discriminator Field (function) (Used as input to a switch field)
-	var function uint8 = io.ReadUint8(7)
-
-	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-	var initializer ModbusPDUInitializer
-	var typeSwitchError error
-	switch {
-	case errorFlag == true:
-		initializer, typeSwitchError = ModbusPDUErrorParse(io)
-	case errorFlag == false && function == 0x02 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadDiscreteInputsRequestParse(io)
-	case errorFlag == false && function == 0x02 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadDiscreteInputsResponseParse(io)
-	case errorFlag == false && function == 0x01 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadCoilsRequestParse(io)
-	case errorFlag == false && function == 0x01 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadCoilsResponseParse(io)
-	case errorFlag == false && function == 0x05 && response == false:
-		initializer, typeSwitchError = ModbusPDUWriteSingleCoilRequestParse(io)
-	case errorFlag == false && function == 0x05 && response == true:
-		initializer, typeSwitchError = ModbusPDUWriteSingleCoilResponseParse(io)
-	case errorFlag == false && function == 0x0F && response == false:
-		initializer, typeSwitchError = ModbusPDUWriteMultipleCoilsRequestParse(io)
-	case errorFlag == false && function == 0x0F && response == true:
-		initializer, typeSwitchError = ModbusPDUWriteMultipleCoilsResponseParse(io)
-	case errorFlag == false && function == 0x04 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadInputRegistersRequestParse(io)
-	case errorFlag == false && function == 0x04 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadInputRegistersResponseParse(io)
-	case errorFlag == false && function == 0x03 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadHoldingRegistersRequestParse(io)
-	case errorFlag == false && function == 0x03 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadHoldingRegistersResponseParse(io)
-	case errorFlag == false && function == 0x06 && response == false:
-		initializer, typeSwitchError = ModbusPDUWriteSingleRegisterRequestParse(io)
-	case errorFlag == false && function == 0x06 && response == true:
-		initializer, typeSwitchError = ModbusPDUWriteSingleRegisterResponseParse(io)
-	case errorFlag == false && function == 0x10 && response == false:
-		initializer, typeSwitchError = ModbusPDUWriteMultipleHoldingRegistersRequestParse(io)
-	case errorFlag == false && function == 0x10 && response == true:
-		initializer, typeSwitchError = ModbusPDUWriteMultipleHoldingRegistersResponseParse(io)
-	case errorFlag == false && function == 0x17 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io)
-	case errorFlag == false && function == 0x17 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io)
-	case errorFlag == false && function == 0x16 && response == false:
-		initializer, typeSwitchError = ModbusPDUMaskWriteHoldingRegisterRequestParse(io)
-	case errorFlag == false && function == 0x16 && response == true:
-		initializer, typeSwitchError = ModbusPDUMaskWriteHoldingRegisterResponseParse(io)
-	case errorFlag == false && function == 0x18 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadFifoQueueRequestParse(io)
-	case errorFlag == false && function == 0x18 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadFifoQueueResponseParse(io)
-	case errorFlag == false && function == 0x14 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadFileRecordRequestParse(io)
-	case errorFlag == false && function == 0x14 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadFileRecordResponseParse(io)
-	case errorFlag == false && function == 0x15 && response == false:
-		initializer, typeSwitchError = ModbusPDUWriteFileRecordRequestParse(io)
-	case errorFlag == false && function == 0x15 && response == true:
-		initializer, typeSwitchError = ModbusPDUWriteFileRecordResponseParse(io)
-	case errorFlag == false && function == 0x07 && response == false:
-		initializer, typeSwitchError = ModbusPDUReadExceptionStatusRequestParse(io)
-	case errorFlag == false && function == 0x07 && response == true:
-		initializer, typeSwitchError = ModbusPDUReadExceptionStatusResponseParse(io)
-	case errorFlag == false && function == 0x08 && response == false:
-		initializer, typeSwitchError = ModbusPDUDiagnosticRequestParse(io)
-	case errorFlag == false && function == 0x0C && response == false:
-		initializer, typeSwitchError = ModbusPDUGetComEventLogRequestParse(io)
-	case errorFlag == false && function == 0x0C && response == true:
-		initializer, typeSwitchError = ModbusPDUGetComEventLogResponseParse(io)
-	case errorFlag == false && function == 0x11 && response == false:
-		initializer, typeSwitchError = ModbusPDUReportServerIdRequestParse(io)
-	case errorFlag == false && function == 0x11 && response == true:
-		initializer, typeSwitchError = ModbusPDUReportServerIdResponseParse(io)
-	case errorFlag == false && function == 0x2B && response == false:
-		initializer, typeSwitchError = ModbusPDUReadDeviceIdentificationRequestParse(io)
-	case errorFlag == false && function == 0x2B && response == true:
-		initializer, typeSwitchError = ModbusPDUReadDeviceIdentificationResponseParse(io)
-	}
-	if typeSwitchError != nil {
-		return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
-	}
-
-	// Create the instance
-	return initializer.initialize(), nil
-}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusConstants.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusConstants.go
similarity index 89%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusConstants.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusConstants.go
index 97c13ea..e2bb66e 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusConstants.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusConstants.go
@@ -30,6 +30,11 @@ const MODBUSTCPDEFAULTPORT uint16 = 502
 type ModbusConstants struct {
 }
 
+type IModbusConstants interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 func NewModbusConstants() spi.Message {
 	return &ModbusConstants{}
 }
@@ -58,3 +63,9 @@ func ModbusConstantsParse(io spi.ReadBuffer) (spi.Message, error) {
 	// Create the instance
 	return NewModbusConstants(), nil
 }
+
+func (m ModbusConstants) Serialize(io spi.WriteBuffer) {
+
+	// Const Field (modbusTcpDefaultPort)
+	io.WriteUint16(16, 502)
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusDataType.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusDataType.go
similarity index 100%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusDataType.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusDataType.go
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDU.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDU.go
new file mode 100644
index 0000000..e230cf2
--- /dev/null
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDU.go
@@ -0,0 +1,264 @@
+//
+// Licensed to the Apache Software Foundation (ASF) under one
+// or more contributor license agreements.  See the NOTICE file
+// distributed with this work for additional information
+// regarding copyright ownership.  The ASF licenses this file
+// to you under the Apache License, Version 2.0 (the
+// "License"); you may not use this file except in compliance
+// with the License.  You may obtain a copy of the License at
+//
+//      http://www.apache.org/licenses/LICENSE-2.0
+//
+// Unless required by applicable law or agreed to in writing,
+// software distributed under the License is distributed on an
+// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+// KIND, either express or implied.  See the License for the
+// specific language governing permissions and limitations
+// under the License.
+//
+package readwrite
+
+import (
+	"errors"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+)
+
+type ModbusPDU struct {
+}
+
+type IModbusPDU interface {
+	spi.Message
+	ErrorFlag() bool
+	FunctionFlag() uint8
+	Response() bool
+	Serialize(io spi.WriteBuffer)
+}
+
+type ModbusPDUInitializer interface {
+	initialize() spi.Message
+}
+
+// Dummy implementation ...
+func (m ModbusPDU) ErrorFlag() bool {
+	return false
+}
+
+func ModbusPDUErrorFlag(m IModbusPDU) bool {
+	return m.ErrorFlag()
+}
+
+// Dummy implementation ...
+func (m ModbusPDU) FunctionFlag() uint8 {
+	return 0
+}
+
+func ModbusPDUFunctionFlag(m IModbusPDU) uint8 {
+	return m.FunctionFlag()
+}
+
+// Dummy implementation ...
+func (m ModbusPDU) Response() bool {
+	return false
+}
+
+func ModbusPDUResponse(m IModbusPDU) bool {
+	return m.Response()
+}
+
+func (m ModbusPDU) LengthInBits() uint16 {
+	var lengthInBits uint16 = 0
+
+	// Discriminator Field (errorFlag)
+	lengthInBits += 1
+
+	// Discriminator Field (functionFlag)
+	lengthInBits += 7
+
+	// Length of sub-type elements will be added by sub-type...
+
+	return lengthInBits
+}
+
+func (m ModbusPDU) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
+func ModbusPDUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
+
+	// Discriminator Field (errorFlag) (Used as input to a switch field)
+	var errorFlag bool = io.ReadBit()
+
+	// Discriminator Field (functionFlag) (Used as input to a switch field)
+	var functionFlag uint8 = io.ReadUint8(7)
+
+	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+	var initializer ModbusPDUInitializer
+	var typeSwitchError error
+	switch {
+	case errorFlag == true:
+		initializer, typeSwitchError = ModbusPDUErrorParse(io)
+	case errorFlag == false && functionFlag == 0x02 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadDiscreteInputsRequestParse(io)
+	case errorFlag == false && functionFlag == 0x02 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadDiscreteInputsResponseParse(io)
+	case errorFlag == false && functionFlag == 0x01 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadCoilsRequestParse(io)
+	case errorFlag == false && functionFlag == 0x01 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadCoilsResponseParse(io)
+	case errorFlag == false && functionFlag == 0x05 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteSingleCoilRequestParse(io)
+	case errorFlag == false && functionFlag == 0x05 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteSingleCoilResponseParse(io)
+	case errorFlag == false && functionFlag == 0x0F && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleCoilsRequestParse(io)
+	case errorFlag == false && functionFlag == 0x0F && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleCoilsResponseParse(io)
+	case errorFlag == false && functionFlag == 0x04 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadInputRegistersRequestParse(io)
+	case errorFlag == false && functionFlag == 0x04 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadInputRegistersResponseParse(io)
+	case errorFlag == false && functionFlag == 0x03 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadHoldingRegistersRequestParse(io)
+	case errorFlag == false && functionFlag == 0x03 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadHoldingRegistersResponseParse(io)
+	case errorFlag == false && functionFlag == 0x06 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteSingleRegisterRequestParse(io)
+	case errorFlag == false && functionFlag == 0x06 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteSingleRegisterResponseParse(io)
+	case errorFlag == false && functionFlag == 0x10 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleHoldingRegistersRequestParse(io)
+	case errorFlag == false && functionFlag == 0x10 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleHoldingRegistersResponseParse(io)
+	case errorFlag == false && functionFlag == 0x17 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io)
+	case errorFlag == false && functionFlag == 0x17 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io)
+	case errorFlag == false && functionFlag == 0x16 && response == false:
+		initializer, typeSwitchError = ModbusPDUMaskWriteHoldingRegisterRequestParse(io)
+	case errorFlag == false && functionFlag == 0x16 && response == true:
+		initializer, typeSwitchError = ModbusPDUMaskWriteHoldingRegisterResponseParse(io)
+	case errorFlag == false && functionFlag == 0x18 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadFifoQueueRequestParse(io)
+	case errorFlag == false && functionFlag == 0x18 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadFifoQueueResponseParse(io)
+	case errorFlag == false && functionFlag == 0x14 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadFileRecordRequestParse(io)
+	case errorFlag == false && functionFlag == 0x14 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadFileRecordResponseParse(io)
+	case errorFlag == false && functionFlag == 0x15 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteFileRecordRequestParse(io)
+	case errorFlag == false && functionFlag == 0x15 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteFileRecordResponseParse(io)
+	case errorFlag == false && functionFlag == 0x07 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadExceptionStatusRequestParse(io)
+	case errorFlag == false && functionFlag == 0x07 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadExceptionStatusResponseParse(io)
+	case errorFlag == false && functionFlag == 0x08 && response == false:
+		initializer, typeSwitchError = ModbusPDUDiagnosticRequestParse(io)
+	case errorFlag == false && functionFlag == 0x0C && response == false:
+		initializer, typeSwitchError = ModbusPDUGetComEventLogRequestParse(io)
+	case errorFlag == false && functionFlag == 0x0C && response == true:
+		initializer, typeSwitchError = ModbusPDUGetComEventLogResponseParse(io)
+	case errorFlag == false && functionFlag == 0x11 && response == false:
+		initializer, typeSwitchError = ModbusPDUReportServerIdRequestParse(io)
+	case errorFlag == false && functionFlag == 0x11 && response == true:
+		initializer, typeSwitchError = ModbusPDUReportServerIdResponseParse(io)
+	case errorFlag == false && functionFlag == 0x2B && response == false:
+		initializer, typeSwitchError = ModbusPDUReadDeviceIdentificationRequestParse(io)
+	case errorFlag == false && functionFlag == 0x2B && response == true:
+		initializer, typeSwitchError = ModbusPDUReadDeviceIdentificationResponseParse(io)
+	}
+	if typeSwitchError != nil {
+		return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
+	}
+
+	// Create the instance
+	return initializer.initialize(), nil
+}
+
+func (m ModbusPDU) Serialize(io spi.WriteBuffer) {
+
+	// Discriminator Field (errorFlag) (Used as input to a switch field)
+	errorFlag := ModbusPDUErrorFlag(m)
+	io.WriteBit((bool)(errorFlag))
+
+	// Discriminator Field (functionFlag) (Used as input to a switch field)
+	functionFlag := ModbusPDUFunctionFlag(m)
+	io.WriteUint8(7, (functionFlag))
+
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	switch m.(type) {
+	case IModbusPDUError:
+		IModbusPDUError(m).Serialize(io)
+	case IModbusPDUReadDiscreteInputsRequest:
+		IModbusPDUReadDiscreteInputsRequest(m).Serialize(io)
+	case IModbusPDUReadDiscreteInputsResponse:
+		IModbusPDUReadDiscreteInputsResponse(m).Serialize(io)
+	case IModbusPDUReadCoilsRequest:
+		IModbusPDUReadCoilsRequest(m).Serialize(io)
+	case IModbusPDUReadCoilsResponse:
+		IModbusPDUReadCoilsResponse(m).Serialize(io)
+	case IModbusPDUWriteSingleCoilRequest:
+		IModbusPDUWriteSingleCoilRequest(m).Serialize(io)
+	case IModbusPDUWriteSingleCoilResponse:
+		IModbusPDUWriteSingleCoilResponse(m).Serialize(io)
+	case IModbusPDUWriteMultipleCoilsRequest:
+		IModbusPDUWriteMultipleCoilsRequest(m).Serialize(io)
+	case IModbusPDUWriteMultipleCoilsResponse:
+		IModbusPDUWriteMultipleCoilsResponse(m).Serialize(io)
+	case IModbusPDUReadInputRegistersRequest:
+		IModbusPDUReadInputRegistersRequest(m).Serialize(io)
+	case IModbusPDUReadInputRegistersResponse:
+		IModbusPDUReadInputRegistersResponse(m).Serialize(io)
+	case IModbusPDUReadHoldingRegistersRequest:
+		IModbusPDUReadHoldingRegistersRequest(m).Serialize(io)
+	case IModbusPDUReadHoldingRegistersResponse:
+		IModbusPDUReadHoldingRegistersResponse(m).Serialize(io)
+	case IModbusPDUWriteSingleRegisterRequest:
+		IModbusPDUWriteSingleRegisterRequest(m).Serialize(io)
+	case IModbusPDUWriteSingleRegisterResponse:
+		IModbusPDUWriteSingleRegisterResponse(m).Serialize(io)
+	case IModbusPDUWriteMultipleHoldingRegistersRequest:
+		IModbusPDUWriteMultipleHoldingRegistersRequest(m).Serialize(io)
+	case IModbusPDUWriteMultipleHoldingRegistersResponse:
+		IModbusPDUWriteMultipleHoldingRegistersResponse(m).Serialize(io)
+	case IModbusPDUReadWriteMultipleHoldingRegistersRequest:
+		IModbusPDUReadWriteMultipleHoldingRegistersRequest(m).Serialize(io)
+	case IModbusPDUReadWriteMultipleHoldingRegistersResponse:
+		IModbusPDUReadWriteMultipleHoldingRegistersResponse(m).Serialize(io)
+	case IModbusPDUMaskWriteHoldingRegisterRequest:
+		IModbusPDUMaskWriteHoldingRegisterRequest(m).Serialize(io)
+	case IModbusPDUMaskWriteHoldingRegisterResponse:
+		IModbusPDUMaskWriteHoldingRegisterResponse(m).Serialize(io)
+	case IModbusPDUReadFifoQueueRequest:
+		IModbusPDUReadFifoQueueRequest(m).Serialize(io)
+	case IModbusPDUReadFifoQueueResponse:
+		IModbusPDUReadFifoQueueResponse(m).Serialize(io)
+	case IModbusPDUReadFileRecordRequest:
+		IModbusPDUReadFileRecordRequest(m).Serialize(io)
+	case IModbusPDUReadFileRecordResponse:
+		IModbusPDUReadFileRecordResponse(m).Serialize(io)
+	case IModbusPDUWriteFileRecordRequest:
+		IModbusPDUWriteFileRecordRequest(m).Serialize(io)
+	case IModbusPDUWriteFileRecordResponse:
+		IModbusPDUWriteFileRecordResponse(m).Serialize(io)
+	case IModbusPDUReadExceptionStatusRequest:
+		IModbusPDUReadExceptionStatusRequest(m).Serialize(io)
+	case IModbusPDUReadExceptionStatusResponse:
+		IModbusPDUReadExceptionStatusResponse(m).Serialize(io)
+	case IModbusPDUDiagnosticRequest:
+		IModbusPDUDiagnosticRequest(m).Serialize(io)
+	case IModbusPDUGetComEventLogRequest:
+		IModbusPDUGetComEventLogRequest(m).Serialize(io)
+	case IModbusPDUGetComEventLogResponse:
+		IModbusPDUGetComEventLogResponse(m).Serialize(io)
+	case IModbusPDUReportServerIdRequest:
+		IModbusPDUReportServerIdRequest(m).Serialize(io)
+	case IModbusPDUReportServerIdResponse:
+		IModbusPDUReportServerIdResponse(m).Serialize(io)
+	case IModbusPDUReadDeviceIdentificationRequest:
+		IModbusPDUReadDeviceIdentificationRequest(m).Serialize(io)
+	case IModbusPDUReadDeviceIdentificationResponse:
+		IModbusPDUReadDeviceIdentificationResponse(m).Serialize(io)
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUDiagnosticRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
index 1a14750..d9564a8 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
@@ -28,6 +28,24 @@ type ModbusPDUDiagnosticRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUDiagnosticRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUDiagnosticRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUDiagnosticRequest) FunctionFlag() uint8 {
+	return 0x08
+}
+
+func (m ModbusPDUDiagnosticRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUDiagnosticRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUDiagnosticRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, e
 	// Create the instance
 	return NewModbusPDUDiagnosticRequest(status, eventCount), nil
 }
+
+func (m ModbusPDUDiagnosticRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (status)
+	var status uint16 = m.status
+	io.WriteUint16(16, (status))
+
+	// Simple Field (eventCount)
+	var eventCount uint16 = m.eventCount
+	io.WriteUint16(16, (eventCount))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUError.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUError.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUError.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUError.go
index bcd6b14..253bdd2 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUError.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUError.go
@@ -27,6 +27,24 @@ type ModbusPDUError struct {
 	ModbusPDU
 }
 
+type IModbusPDUError interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUError) ErrorFlag() bool {
+	return true
+}
+
+func (m ModbusPDUError) FunctionFlag() uint8 {
+	return 0
+}
+
+func (m ModbusPDUError) Response() bool {
+	return false
+}
+
 func (m ModbusPDUError) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -56,3 +74,10 @@ func ModbusPDUErrorParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 	// Create the instance
 	return NewModbusPDUError(exceptionCode), nil
 }
+
+func (m ModbusPDUError) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (exceptionCode)
+	var exceptionCode uint8 = m.exceptionCode
+	io.WriteUint8(8, (exceptionCode))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
similarity index 78%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
index cc80958..476c3af 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
@@ -26,6 +26,24 @@ type ModbusPDUGetComEventLogRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUGetComEventLogRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUGetComEventLogRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUGetComEventLogRequest) FunctionFlag() uint8 {
+	return 0x0C
+}
+
+func (m ModbusPDUGetComEventLogRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUGetComEventLogRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -49,3 +67,6 @@ func ModbusPDUGetComEventLogRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 	// Create the instance
 	return NewModbusPDUGetComEventLogRequest(), nil
 }
+
+func (m ModbusPDUGetComEventLogRequest) Serialize(io spi.WriteBuffer) {
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
similarity index 71%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
index f391cea..26354c7 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
@@ -30,6 +30,24 @@ type ModbusPDUGetComEventLogResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUGetComEventLogResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUGetComEventLogResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUGetComEventLogResponse) FunctionFlag() uint8 {
+	return 0x0C
+}
+
+func (m ModbusPDUGetComEventLogResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUGetComEventLogResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -93,3 +111,29 @@ func ModbusPDUGetComEventLogResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 	// Create the instance
 	return NewModbusPDUGetComEventLogResponse(status, eventCount, messageCount, events), nil
 }
+
+func (m ModbusPDUGetComEventLogResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = ((uint8(len(m.events))) + (6))
+	io.WriteUint8(8, (byteCount))
+
+	// Simple Field (status)
+	var status uint16 = m.status
+	io.WriteUint16(16, (status))
+
+	// Simple Field (eventCount)
+	var eventCount uint16 = m.eventCount
+	io.WriteUint16(16, (eventCount))
+
+	// Simple Field (messageCount)
+	var messageCount uint16 = m.messageCount
+	io.WriteUint16(16, (messageCount))
+
+	// Array Field (events)
+	if m.events != nil {
+		for _, _element := range m.events {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
index ac29a11..a4f6a57 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
@@ -29,6 +29,24 @@ type ModbusPDUMaskWriteHoldingRegisterRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUMaskWriteHoldingRegisterRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUMaskWriteHoldingRegisterRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUMaskWriteHoldingRegisterRequest) FunctionFlag() uint8 {
+	return 0x16
+}
+
+func (m ModbusPDUMaskWriteHoldingRegisterRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUMaskWriteHoldingRegisterRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -70,3 +88,18 @@ func ModbusPDUMaskWriteHoldingRegisterRequestParse(io spi.ReadBuffer) (ModbusPDU
 	// Create the instance
 	return NewModbusPDUMaskWriteHoldingRegisterRequest(referenceAddress, andMask, orMask), nil
 }
+
+func (m ModbusPDUMaskWriteHoldingRegisterRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (referenceAddress)
+	var referenceAddress uint16 = m.referenceAddress
+	io.WriteUint16(16, (referenceAddress))
+
+	// Simple Field (andMask)
+	var andMask uint16 = m.andMask
+	io.WriteUint16(16, (andMask))
+
+	// Simple Field (orMask)
+	var orMask uint16 = m.orMask
+	io.WriteUint16(16, (orMask))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
index eaf896e..76561a2 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
@@ -29,6 +29,24 @@ type ModbusPDUMaskWriteHoldingRegisterResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUMaskWriteHoldingRegisterResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUMaskWriteHoldingRegisterResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUMaskWriteHoldingRegisterResponse) FunctionFlag() uint8 {
+	return 0x16
+}
+
+func (m ModbusPDUMaskWriteHoldingRegisterResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUMaskWriteHoldingRegisterResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -70,3 +88,18 @@ func ModbusPDUMaskWriteHoldingRegisterResponseParse(io spi.ReadBuffer) (ModbusPD
 	// Create the instance
 	return NewModbusPDUMaskWriteHoldingRegisterResponse(referenceAddress, andMask, orMask), nil
 }
+
+func (m ModbusPDUMaskWriteHoldingRegisterResponse) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (referenceAddress)
+	var referenceAddress uint16 = m.referenceAddress
+	io.WriteUint16(16, (referenceAddress))
+
+	// Simple Field (andMask)
+	var andMask uint16 = m.andMask
+	io.WriteUint16(16, (andMask))
+
+	// Simple Field (orMask)
+	var orMask uint16 = m.orMask
+	io.WriteUint16(16, (orMask))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
index 9be3ec7..8bef98b 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
@@ -28,6 +28,24 @@ type ModbusPDUReadCoilsRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadCoilsRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadCoilsRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadCoilsRequest) FunctionFlag() uint8 {
+	return 0x01
+}
+
+func (m ModbusPDUReadCoilsRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadCoilsRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUReadCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, er
 	// Create the instance
 	return NewModbusPDUReadCoilsRequest(startingAddress, quantity), nil
 }
+
+func (m ModbusPDUReadCoilsRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
index f4aeb39..aecc563 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReadCoilsResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadCoilsResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadCoilsResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadCoilsResponse) FunctionFlag() uint8 {
+	return 0x01
+}
+
+func (m ModbusPDUReadCoilsResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadCoilsResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -72,3 +90,17 @@ func ModbusPDUReadCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, e
 	// Create the instance
 	return NewModbusPDUReadCoilsResponse(value), nil
 }
+
+func (m ModbusPDUReadCoilsResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
index 1e84908..1eae221 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
@@ -26,6 +26,24 @@ type ModbusPDUReadDeviceIdentificationRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadDeviceIdentificationRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadDeviceIdentificationRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadDeviceIdentificationRequest) FunctionFlag() uint8 {
+	return 0x2B
+}
+
+func (m ModbusPDUReadDeviceIdentificationRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadDeviceIdentificationRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -49,3 +67,6 @@ func ModbusPDUReadDeviceIdentificationRequestParse(io spi.ReadBuffer) (ModbusPDU
 	// Create the instance
 	return NewModbusPDUReadDeviceIdentificationRequest(), nil
 }
+
+func (m ModbusPDUReadDeviceIdentificationRequest) Serialize(io spi.WriteBuffer) {
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
index 69b099e..225655d 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
@@ -26,6 +26,24 @@ type ModbusPDUReadDeviceIdentificationResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadDeviceIdentificationResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadDeviceIdentificationResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadDeviceIdentificationResponse) FunctionFlag() uint8 {
+	return 0x2B
+}
+
+func (m ModbusPDUReadDeviceIdentificationResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadDeviceIdentificationResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -49,3 +67,6 @@ func ModbusPDUReadDeviceIdentificationResponseParse(io spi.ReadBuffer) (ModbusPD
 	// Create the instance
 	return NewModbusPDUReadDeviceIdentificationResponse(), nil
 }
+
+func (m ModbusPDUReadDeviceIdentificationResponse) Serialize(io spi.WriteBuffer) {
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
similarity index 74%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
index d85d551..db40260 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
@@ -28,6 +28,24 @@ type ModbusPDUReadDiscreteInputsRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadDiscreteInputsRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadDiscreteInputsRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadDiscreteInputsRequest) FunctionFlag() uint8 {
+	return 0x02
+}
+
+func (m ModbusPDUReadDiscreteInputsRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadDiscreteInputsRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUReadDiscreteInputsRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 	// Create the instance
 	return NewModbusPDUReadDiscreteInputsRequest(startingAddress, quantity), nil
 }
+
+func (m ModbusPDUReadDiscreteInputsRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
index d1bd499..db6fa41 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReadDiscreteInputsResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadDiscreteInputsResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadDiscreteInputsResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadDiscreteInputsResponse) FunctionFlag() uint8 {
+	return 0x02
+}
+
+func (m ModbusPDUReadDiscreteInputsResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadDiscreteInputsResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -72,3 +90,17 @@ func ModbusPDUReadDiscreteInputsResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 	// Create the instance
 	return NewModbusPDUReadDiscreteInputsResponse(value), nil
 }
+
+func (m ModbusPDUReadDiscreteInputsResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
index f6e37a6..d8c0cdb 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
@@ -26,6 +26,24 @@ type ModbusPDUReadExceptionStatusRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadExceptionStatusRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadExceptionStatusRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadExceptionStatusRequest) FunctionFlag() uint8 {
+	return 0x07
+}
+
+func (m ModbusPDUReadExceptionStatusRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadExceptionStatusRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -49,3 +67,6 @@ func ModbusPDUReadExceptionStatusRequestParse(io spi.ReadBuffer) (ModbusPDUIniti
 	// Create the instance
 	return NewModbusPDUReadExceptionStatusRequest(), nil
 }
+
+func (m ModbusPDUReadExceptionStatusRequest) Serialize(io spi.WriteBuffer) {
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
similarity index 76%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
index ba35c1a..63127af 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReadExceptionStatusResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadExceptionStatusResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadExceptionStatusResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadExceptionStatusResponse) FunctionFlag() uint8 {
+	return 0x07
+}
+
+func (m ModbusPDUReadExceptionStatusResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadExceptionStatusResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -56,3 +74,10 @@ func ModbusPDUReadExceptionStatusResponseParse(io spi.ReadBuffer) (ModbusPDUInit
 	// Create the instance
 	return NewModbusPDUReadExceptionStatusResponse(value), nil
 }
+
+func (m ModbusPDUReadExceptionStatusResponse) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (value)
+	var value uint8 = m.value
+	io.WriteUint8(8, (value))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
similarity index 76%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
index 308da82..4d4f482 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
@@ -27,6 +27,24 @@ type ModbusPDUReadFifoQueueRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadFifoQueueRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadFifoQueueRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadFifoQueueRequest) FunctionFlag() uint8 {
+	return 0x18
+}
+
+func (m ModbusPDUReadFifoQueueRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadFifoQueueRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -56,3 +74,10 @@ func ModbusPDUReadFifoQueueRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer
 	// Create the instance
 	return NewModbusPDUReadFifoQueueRequest(fifoPointerAddress), nil
 }
+
+func (m ModbusPDUReadFifoQueueRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (fifoPointerAddress)
+	var fifoPointerAddress uint16 = m.fifoPointerAddress
+	io.WriteUint16(16, (fifoPointerAddress))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
similarity index 70%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
index cb626bb..e4d8f0a 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReadFifoQueueResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadFifoQueueResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadFifoQueueResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadFifoQueueResponse) FunctionFlag() uint8 {
+	return 0x18
+}
+
+func (m ModbusPDUReadFifoQueueResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadFifoQueueResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -78,3 +96,21 @@ func ModbusPDUReadFifoQueueResponseParse(io spi.ReadBuffer) (ModbusPDUInitialize
 	// Create the instance
 	return NewModbusPDUReadFifoQueueResponse(fifoValue), nil
 }
+
+func (m ModbusPDUReadFifoQueueResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint16 = (((uint16(len(m.fifoValue))) * (2)) + (2))
+	io.WriteUint16(16, (byteCount))
+
+	// Implicit Field (fifoCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var fifoCount uint16 = (((uint16(len(m.fifoValue))) * (2)) / (2))
+	io.WriteUint16(16, (fifoCount))
+
+	// Array Field (fifoValue)
+	if m.fifoValue != nil {
+		for _, _element := range m.fifoValue {
+			io.WriteUint16(16, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
index a33b3b6..6edde89 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
@@ -29,6 +29,24 @@ type ModbusPDUReadFileRecordRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadFileRecordRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadFileRecordRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadFileRecordRequest) FunctionFlag() uint8 {
+	return 0x14
+}
+
+func (m ModbusPDUReadFileRecordRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadFileRecordRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -83,3 +101,24 @@ func ModbusPDUReadFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 	// Create the instance
 	return NewModbusPDUReadFileRecordRequest(items), nil
 }
+
+func (m ModbusPDUReadFileRecordRequest) Serialize(io spi.WriteBuffer) {
+	itemsArraySizeInBytes := func(items []ModbusPDUReadFileRecordRequestItem) uint32 {
+		var sizeInBytes uint32 = 0
+		for _, v := range items {
+			sizeInBytes += uint32(v.LengthInBytes())
+		}
+		return sizeInBytes
+	}
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(itemsArraySizeInBytes(m.items)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (items)
+	if m.items != nil {
+		for _, _element := range m.items {
+			_element.Serialize(io)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
similarity index 78%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
index 0fc1b51..3ec37d7 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
@@ -29,6 +29,11 @@ type ModbusPDUReadFileRecordRequestItem struct {
 	recordLength  uint16
 }
 
+type IModbusPDUReadFileRecordRequestItem interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 func NewModbusPDUReadFileRecordRequestItem(referenceType uint8, fileNumber uint16, recordNumber uint16, recordLength uint16) spi.Message {
 	return &ModbusPDUReadFileRecordRequestItem{referenceType: referenceType, fileNumber: fileNumber, recordNumber: recordNumber, recordLength: recordLength}
 }
@@ -72,3 +77,22 @@ func ModbusPDUReadFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, er
 	// Create the instance
 	return NewModbusPDUReadFileRecordRequestItem(referenceType, fileNumber, recordNumber, recordLength), nil
 }
+
+func (m ModbusPDUReadFileRecordRequestItem) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (referenceType)
+	var referenceType uint8 = m.referenceType
+	io.WriteUint8(8, (referenceType))
+
+	// Simple Field (fileNumber)
+	var fileNumber uint16 = m.fileNumber
+	io.WriteUint16(16, (fileNumber))
+
+	// Simple Field (recordNumber)
+	var recordNumber uint16 = m.recordNumber
+	io.WriteUint16(16, (recordNumber))
+
+	// Simple Field (recordLength)
+	var recordLength uint16 = m.recordLength
+	io.WriteUint16(16, (recordLength))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
index 90548ce..e995698 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
@@ -29,6 +29,24 @@ type ModbusPDUReadFileRecordResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadFileRecordResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadFileRecordResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadFileRecordResponse) FunctionFlag() uint8 {
+	return 0x14
+}
+
+func (m ModbusPDUReadFileRecordResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadFileRecordResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -83,3 +101,24 @@ func ModbusPDUReadFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 	// Create the instance
 	return NewModbusPDUReadFileRecordResponse(items), nil
 }
+
+func (m ModbusPDUReadFileRecordResponse) Serialize(io spi.WriteBuffer) {
+	itemsArraySizeInBytes := func(items []ModbusPDUReadFileRecordResponseItem) uint32 {
+		var sizeInBytes uint32 = 0
+		for _, v := range items {
+			sizeInBytes += uint32(v.LengthInBytes())
+		}
+		return sizeInBytes
+	}
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(itemsArraySizeInBytes(m.items)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (items)
+	if m.items != nil {
+		for _, _element := range m.items {
+			_element.Serialize(io)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
similarity index 78%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
index aff7e2e..2e5f746 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
@@ -27,6 +27,11 @@ type ModbusPDUReadFileRecordResponseItem struct {
 	data          []int8
 }
 
+type IModbusPDUReadFileRecordResponseItem interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 func NewModbusPDUReadFileRecordResponseItem(referenceType uint8, data []int8) spi.Message {
 	return &ModbusPDUReadFileRecordResponseItem{referenceType: referenceType, data: data}
 }
@@ -72,3 +77,21 @@ func ModbusPDUReadFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message, e
 	// Create the instance
 	return NewModbusPDUReadFileRecordResponseItem(referenceType, data), nil
 }
+
+func (m ModbusPDUReadFileRecordResponseItem) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var dataLength uint8 = ((uint8(len(m.data))) + (1))
+	io.WriteUint8(8, (dataLength))
+
+	// Simple Field (referenceType)
+	var referenceType uint8 = m.referenceType
+	io.WriteUint8(8, (referenceType))
+
+	// Array Field (data)
+	if m.data != nil {
+		for _, _element := range m.data {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
similarity index 74%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
index 05ccfc6..863a562 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
@@ -28,6 +28,24 @@ type ModbusPDUReadHoldingRegistersRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadHoldingRegistersRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadHoldingRegistersRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadHoldingRegistersRequest) FunctionFlag() uint8 {
+	return 0x03
+}
+
+func (m ModbusPDUReadHoldingRegistersRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadHoldingRegistersRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUReadHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInit
 	// Create the instance
 	return NewModbusPDUReadHoldingRegistersRequest(startingAddress, quantity), nil
 }
+
+func (m ModbusPDUReadHoldingRegistersRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
index 6fcb99e..bf98a55 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReadHoldingRegistersResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadHoldingRegistersResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadHoldingRegistersResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadHoldingRegistersResponse) FunctionFlag() uint8 {
+	return 0x03
+}
+
+func (m ModbusPDUReadHoldingRegistersResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadHoldingRegistersResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -72,3 +90,17 @@ func ModbusPDUReadHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIni
 	// Create the instance
 	return NewModbusPDUReadHoldingRegistersResponse(value), nil
 }
+
+func (m ModbusPDUReadHoldingRegistersResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
similarity index 74%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
index 15384d3..70ca4b6 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
@@ -28,6 +28,24 @@ type ModbusPDUReadInputRegistersRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadInputRegistersRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadInputRegistersRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadInputRegistersRequest) FunctionFlag() uint8 {
+	return 0x04
+}
+
+func (m ModbusPDUReadInputRegistersRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadInputRegistersRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUReadInputRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 	// Create the instance
 	return NewModbusPDUReadInputRegistersRequest(startingAddress, quantity), nil
 }
+
+func (m ModbusPDUReadInputRegistersRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
index ce92920..a2ba0ae 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReadInputRegistersResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadInputRegistersResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadInputRegistersResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadInputRegistersResponse) FunctionFlag() uint8 {
+	return 0x04
+}
+
+func (m ModbusPDUReadInputRegistersResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadInputRegistersResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -72,3 +90,17 @@ func ModbusPDUReadInputRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 	// Create the instance
 	return NewModbusPDUReadInputRegistersResponse(value), nil
 }
+
+func (m ModbusPDUReadInputRegistersResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
similarity index 70%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
index b39a4bd..bff2785 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
@@ -31,6 +31,24 @@ type ModbusPDUReadWriteMultipleHoldingRegistersRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadWriteMultipleHoldingRegistersRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) FunctionFlag() uint8 {
+	return 0x17
+}
+
+func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -100,3 +118,33 @@ func ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (
 	// Create the instance
 	return NewModbusPDUReadWriteMultipleHoldingRegistersRequest(readStartingAddress, readQuantity, writeStartingAddress, writeQuantity, value), nil
 }
+
+func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (readStartingAddress)
+	var readStartingAddress uint16 = m.readStartingAddress
+	io.WriteUint16(16, (readStartingAddress))
+
+	// Simple Field (readQuantity)
+	var readQuantity uint16 = m.readQuantity
+	io.WriteUint16(16, (readQuantity))
+
+	// Simple Field (writeStartingAddress)
+	var writeStartingAddress uint16 = m.writeStartingAddress
+	io.WriteUint16(16, (writeStartingAddress))
+
+	// Simple Field (writeQuantity)
+	var writeQuantity uint16 = m.writeQuantity
+	io.WriteUint16(16, (writeQuantity))
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
similarity index 72%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
index 4fc0393..9734878 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReadWriteMultipleHoldingRegistersResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReadWriteMultipleHoldingRegistersResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) FunctionFlag() uint8 {
+	return 0x17
+}
+
+func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -72,3 +90,17 @@ func ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer)
 	// Create the instance
 	return NewModbusPDUReadWriteMultipleHoldingRegistersResponse(value), nil
 }
+
+func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
similarity index 78%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
index 07f08f0..cbdb441 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
@@ -26,6 +26,24 @@ type ModbusPDUReportServerIdRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUReportServerIdRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReportServerIdRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReportServerIdRequest) FunctionFlag() uint8 {
+	return 0x11
+}
+
+func (m ModbusPDUReportServerIdRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUReportServerIdRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -49,3 +67,6 @@ func ModbusPDUReportServerIdRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 	// Create the instance
 	return NewModbusPDUReportServerIdRequest(), nil
 }
+
+func (m ModbusPDUReportServerIdRequest) Serialize(io spi.WriteBuffer) {
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
index 8143fbb..731d27f 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
@@ -27,6 +27,24 @@ type ModbusPDUReportServerIdResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUReportServerIdResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUReportServerIdResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUReportServerIdResponse) FunctionFlag() uint8 {
+	return 0x11
+}
+
+func (m ModbusPDUReportServerIdResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUReportServerIdResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -72,3 +90,17 @@ func ModbusPDUReportServerIdResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 	// Create the instance
 	return NewModbusPDUReportServerIdResponse(value), nil
 }
+
+func (m ModbusPDUReportServerIdResponse) Serialize(io spi.WriteBuffer) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
index 8c7371f..e3c7a74 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
@@ -29,6 +29,24 @@ type ModbusPDUWriteFileRecordRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteFileRecordRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteFileRecordRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteFileRecordRequest) FunctionFlag() uint8 {
+	return 0x15
+}
+
+func (m ModbusPDUWriteFileRecordRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUWriteFileRecordRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -83,3 +101,24 @@ func ModbusPDUWriteFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitializ
 	// Create the instance
 	return NewModbusPDUWriteFileRecordRequest(items), nil
 }
+
+func (m ModbusPDUWriteFileRecordRequest) Serialize(io spi.WriteBuffer) {
+	itemsArraySizeInBytes := func(items []ModbusPDUWriteFileRecordRequestItem) uint32 {
+		var sizeInBytes uint32 = 0
+		for _, v := range items {
+			sizeInBytes += uint32(v.LengthInBytes())
+		}
+		return sizeInBytes
+	}
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(itemsArraySizeInBytes(m.items)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (items)
+	if m.items != nil {
+		for _, _element := range m.items {
+			_element.Serialize(io)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
index fe2496f..2137397 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
@@ -29,6 +29,11 @@ type ModbusPDUWriteFileRecordRequestItem struct {
 	recordData    []int8
 }
 
+type IModbusPDUWriteFileRecordRequestItem interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 func NewModbusPDUWriteFileRecordRequestItem(referenceType uint8, fileNumber uint16, recordNumber uint16, recordData []int8) spi.Message {
 	return &ModbusPDUWriteFileRecordRequestItem{referenceType: referenceType, fileNumber: fileNumber, recordNumber: recordNumber, recordData: recordData}
 }
@@ -86,3 +91,29 @@ func ModbusPDUWriteFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, e
 	// Create the instance
 	return NewModbusPDUWriteFileRecordRequestItem(referenceType, fileNumber, recordNumber, recordData), nil
 }
+
+func (m ModbusPDUWriteFileRecordRequestItem) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (referenceType)
+	var referenceType uint8 = m.referenceType
+	io.WriteUint8(8, (referenceType))
+
+	// Simple Field (fileNumber)
+	var fileNumber uint16 = m.fileNumber
+	io.WriteUint16(16, (fileNumber))
+
+	// Simple Field (recordNumber)
+	var recordNumber uint16 = m.recordNumber
+	io.WriteUint16(16, (recordNumber))
+
+	// Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var recordLength uint16 = ((uint16(len(m.recordData))) / (2))
+	io.WriteUint16(16, (recordLength))
+
+	// Array Field (recordData)
+	if m.recordData != nil {
+		for _, _element := range m.recordData {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
similarity index 73%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
index a322714..387ba1d 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
@@ -29,6 +29,24 @@ type ModbusPDUWriteFileRecordResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteFileRecordResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteFileRecordResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteFileRecordResponse) FunctionFlag() uint8 {
+	return 0x15
+}
+
+func (m ModbusPDUWriteFileRecordResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUWriteFileRecordResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -83,3 +101,24 @@ func ModbusPDUWriteFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitiali
 	// Create the instance
 	return NewModbusPDUWriteFileRecordResponse(items), nil
 }
+
+func (m ModbusPDUWriteFileRecordResponse) Serialize(io spi.WriteBuffer) {
+	itemsArraySizeInBytes := func(items []ModbusPDUWriteFileRecordResponseItem) uint32 {
+		var sizeInBytes uint32 = 0
+		for _, v := range items {
+			sizeInBytes += uint32(v.LengthInBytes())
+		}
+		return sizeInBytes
+	}
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(itemsArraySizeInBytes(m.items)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (items)
+	if m.items != nil {
+		for _, _element := range m.items {
+			_element.Serialize(io)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
index c526a49..703f6e5 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
@@ -29,6 +29,11 @@ type ModbusPDUWriteFileRecordResponseItem struct {
 	recordData    []int8
 }
 
+type IModbusPDUWriteFileRecordResponseItem interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 func NewModbusPDUWriteFileRecordResponseItem(referenceType uint8, fileNumber uint16, recordNumber uint16, recordData []int8) spi.Message {
 	return &ModbusPDUWriteFileRecordResponseItem{referenceType: referenceType, fileNumber: fileNumber, recordNumber: recordNumber, recordData: recordData}
 }
@@ -86,3 +91,29 @@ func ModbusPDUWriteFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message,
 	// Create the instance
 	return NewModbusPDUWriteFileRecordResponseItem(referenceType, fileNumber, recordNumber, recordData), nil
 }
+
+func (m ModbusPDUWriteFileRecordResponseItem) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (referenceType)
+	var referenceType uint8 = m.referenceType
+	io.WriteUint8(8, (referenceType))
+
+	// Simple Field (fileNumber)
+	var fileNumber uint16 = m.fileNumber
+	io.WriteUint16(16, (fileNumber))
+
+	// Simple Field (recordNumber)
+	var recordNumber uint16 = m.recordNumber
+	io.WriteUint16(16, (recordNumber))
+
+	// Implicit Field (recordLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var recordLength uint16 = ((uint16(len(m.recordData))) / (2))
+	io.WriteUint16(16, (recordLength))
+
+	// Array Field (recordData)
+	if m.recordData != nil {
+		for _, _element := range m.recordData {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
similarity index 72%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
index 9b2a141..49c3abf 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
@@ -29,6 +29,24 @@ type ModbusPDUWriteMultipleCoilsRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteMultipleCoilsRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteMultipleCoilsRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteMultipleCoilsRequest) FunctionFlag() uint8 {
+	return 0x0F
+}
+
+func (m ModbusPDUWriteMultipleCoilsRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUWriteMultipleCoilsRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -86,3 +104,25 @@ func ModbusPDUWriteMultipleCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 	// Create the instance
 	return NewModbusPDUWriteMultipleCoilsRequest(startingAddress, quantity, value), nil
 }
+
+func (m ModbusPDUWriteMultipleCoilsRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
similarity index 74%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
index a7efa42..28806fe 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
@@ -28,6 +28,24 @@ type ModbusPDUWriteMultipleCoilsResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteMultipleCoilsResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteMultipleCoilsResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteMultipleCoilsResponse) FunctionFlag() uint8 {
+	return 0x0F
+}
+
+func (m ModbusPDUWriteMultipleCoilsResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUWriteMultipleCoilsResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUWriteMultipleCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 	// Create the instance
 	return NewModbusPDUWriteMultipleCoilsResponse(startingAddress, quantity), nil
 }
+
+func (m ModbusPDUWriteMultipleCoilsResponse) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
similarity index 71%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
index b84def7..a775c14 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
@@ -29,6 +29,24 @@ type ModbusPDUWriteMultipleHoldingRegistersRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteMultipleHoldingRegistersRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteMultipleHoldingRegistersRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteMultipleHoldingRegistersRequest) FunctionFlag() uint8 {
+	return 0x10
+}
+
+func (m ModbusPDUWriteMultipleHoldingRegistersRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUWriteMultipleHoldingRegistersRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -86,3 +104,25 @@ func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (Modb
 	// Create the instance
 	return NewModbusPDUWriteMultipleHoldingRegistersRequest(startingAddress, quantity, value), nil
 }
+
+func (m ModbusPDUWriteMultipleHoldingRegistersRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var byteCount uint8 = (uint8(len(m.value)))
+	io.WriteUint8(8, (byteCount))
+
+	// Array Field (value)
+	if m.value != nil {
+		for _, _element := range m.value {
+			io.WriteInt8(8, _element)
+		}
+	}
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
similarity index 74%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
index cf96414..914260d 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
@@ -28,6 +28,24 @@ type ModbusPDUWriteMultipleHoldingRegistersResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteMultipleHoldingRegistersResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteMultipleHoldingRegistersResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteMultipleHoldingRegistersResponse) FunctionFlag() uint8 {
+	return 0x10
+}
+
+func (m ModbusPDUWriteMultipleHoldingRegistersResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUWriteMultipleHoldingRegistersResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) (Mod
 	// Create the instance
 	return NewModbusPDUWriteMultipleHoldingRegistersResponse(startingAddress, quantity), nil
 }
+
+func (m ModbusPDUWriteMultipleHoldingRegistersResponse) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = m.startingAddress
+	io.WriteUint16(16, (startingAddress))
+
+	// Simple Field (quantity)
+	var quantity uint16 = m.quantity
+	io.WriteUint16(16, (quantity))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
index 76c610e..e18173e 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
@@ -28,6 +28,24 @@ type ModbusPDUWriteSingleCoilRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteSingleCoilRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteSingleCoilRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteSingleCoilRequest) FunctionFlag() uint8 {
+	return 0x05
+}
+
+func (m ModbusPDUWriteSingleCoilRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUWriteSingleCoilRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUWriteSingleCoilRequestParse(io spi.ReadBuffer) (ModbusPDUInitializ
 	// Create the instance
 	return NewModbusPDUWriteSingleCoilRequest(address, value), nil
 }
+
+func (m ModbusPDUWriteSingleCoilRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (address)
+	var address uint16 = m.address
+	io.WriteUint16(16, (address))
+
+	// Simple Field (value)
+	var value uint16 = m.value
+	io.WriteUint16(16, (value))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
index 4a8f4aa..e519cf1 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
@@ -28,6 +28,24 @@ type ModbusPDUWriteSingleCoilResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteSingleCoilResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteSingleCoilResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteSingleCoilResponse) FunctionFlag() uint8 {
+	return 0x05
+}
+
+func (m ModbusPDUWriteSingleCoilResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUWriteSingleCoilResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUWriteSingleCoilResponseParse(io spi.ReadBuffer) (ModbusPDUInitiali
 	// Create the instance
 	return NewModbusPDUWriteSingleCoilResponse(address, value), nil
 }
+
+func (m ModbusPDUWriteSingleCoilResponse) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (address)
+	var address uint16 = m.address
+	io.WriteUint16(16, (address))
+
+	// Simple Field (value)
+	var value uint16 = m.value
+	io.WriteUint16(16, (value))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
index 7e66236..a7d8231 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
@@ -28,6 +28,24 @@ type ModbusPDUWriteSingleRegisterRequest struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteSingleRegisterRequest interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteSingleRegisterRequest) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteSingleRegisterRequest) FunctionFlag() uint8 {
+	return 0x06
+}
+
+func (m ModbusPDUWriteSingleRegisterRequest) Response() bool {
+	return false
+}
+
 func (m ModbusPDUWriteSingleRegisterRequest) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUWriteSingleRegisterRequestParse(io spi.ReadBuffer) (ModbusPDUIniti
 	// Create the instance
 	return NewModbusPDUWriteSingleRegisterRequest(address, value), nil
 }
+
+func (m ModbusPDUWriteSingleRegisterRequest) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (address)
+	var address uint16 = m.address
+	io.WriteUint16(16, (address))
+
+	// Simple Field (value)
+	var value uint16 = m.value
+	io.WriteUint16(16, (value))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
index 0786e57..54f07cc 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
@@ -28,6 +28,24 @@ type ModbusPDUWriteSingleRegisterResponse struct {
 	ModbusPDU
 }
 
+type IModbusPDUWriteSingleRegisterResponse interface {
+	IModbusPDU
+	Serialize(io spi.WriteBuffer)
+}
+
+// Accessors for discriminator values.
+func (m ModbusPDUWriteSingleRegisterResponse) ErrorFlag() bool {
+	return false
+}
+
+func (m ModbusPDUWriteSingleRegisterResponse) FunctionFlag() uint8 {
+	return 0x06
+}
+
+func (m ModbusPDUWriteSingleRegisterResponse) Response() bool {
+	return true
+}
+
 func (m ModbusPDUWriteSingleRegisterResponse) initialize() spi.Message {
 	return spi.Message(m)
 }
@@ -63,3 +81,14 @@ func ModbusPDUWriteSingleRegisterResponseParse(io spi.ReadBuffer) (ModbusPDUInit
 	// Create the instance
 	return NewModbusPDUWriteSingleRegisterResponse(address, value), nil
 }
+
+func (m ModbusPDUWriteSingleRegisterResponse) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (address)
+	var address uint16 = m.address
+	io.WriteUint16(16, (address))
+
+	// Simple Field (value)
+	var value uint16 = m.value
+	io.WriteUint16(16, (value))
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusSerialADU.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusSerialADU.go
similarity index 83%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusSerialADU.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusSerialADU.go
index f678406..18713e3 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusSerialADU.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusSerialADU.go
@@ -32,6 +32,11 @@ type ModbusSerialADU struct {
 	pdu           ModbusPDU
 }
 
+type IModbusSerialADU interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 func NewModbusSerialADU(transactionId uint16, length uint16, address uint8, pdu ModbusPDU) spi.Message {
 	return &ModbusSerialADU{transactionId: transactionId, length: length, address: address, pdu: pdu}
 }
@@ -97,3 +102,25 @@ func ModbusSerialADUParse(io spi.ReadBuffer, response bool) (spi.Message, error)
 	// Create the instance
 	return NewModbusSerialADU(transactionId, length, address, pdu), nil
 }
+
+func (m ModbusSerialADU) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (transactionId)
+	var transactionId uint16 = m.transactionId
+	io.WriteUint16(16, (transactionId))
+
+	// Reserved Field (reserved)
+	io.WriteUint16(16, uint16(0x0000))
+
+	// Simple Field (length)
+	var length uint16 = m.length
+	io.WriteUint16(16, (length))
+
+	// Simple Field (address)
+	var address uint8 = m.address
+	io.WriteUint8(8, (address))
+
+	// Simple Field (pdu)
+	var pdu ModbusPDU = m.pdu
+	pdu.Serialize(io)
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusTcpADU.go b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusTcpADU.go
similarity index 79%
rename from sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusTcpADU.go
rename to sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusTcpADU.go
index 4037cab..b4e91f8 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusTcpADU.go
+++ b/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusTcpADU.go
@@ -34,6 +34,11 @@ type ModbusTcpADU struct {
 	pdu                   ModbusPDU
 }
 
+type IModbusTcpADU interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 func NewModbusTcpADU(transactionIdentifier uint16, unitIdentifier uint8, pdu ModbusPDU) spi.Message {
 	return &ModbusTcpADU{transactionIdentifier: transactionIdentifier, unitIdentifier: unitIdentifier, pdu: pdu}
 }
@@ -94,3 +99,25 @@ func ModbusTcpADUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 	// Create the instance
 	return NewModbusTcpADU(transactionIdentifier, unitIdentifier, pdu), nil
 }
+
+func (m ModbusTcpADU) Serialize(io spi.WriteBuffer) {
+
+	// Simple Field (transactionIdentifier)
+	var transactionIdentifier uint16 = m.transactionIdentifier
+	io.WriteUint16(16, (transactionIdentifier))
+
+	// Const Field (protocolIdentifier)
+	io.WriteUint16(16, 0x0000)
+
+	// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var length uint16 = ((m.pdu.LengthInBytes()) + (1))
+	io.WriteUint16(16, (length))
+
+	// Simple Field (unitIdentifier)
+	var unitIdentifier uint8 = m.unitIdentifier
+	io.WriteUint8(8, (unitIdentifier))
+
+	// Simple Field (pdu)
+	var pdu ModbusPDU = m.pdu
+	pdu.Serialize(io)
+}
diff --git a/sandbox/plc4go/src/main/modbus.go b/sandbox/plc4go/src/main/modbus.go
index 4a8f65b..73d26b2 100644
--- a/sandbox/plc4go/src/main/modbus.go
+++ b/sandbox/plc4go/src/main/modbus.go
@@ -17,7 +17,7 @@ package main
 
 import (
 	"encoding/hex"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/generated-sources/plc4go/go/modbus/readwrite"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/generated-sources/plc4go/modbus/readwrite"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )