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/10 09:18:21 UTC

[plc4x] branch feature/plc4go updated: - Removed some of the hacks from the generated code - Refactored the directory structure to be more in line with the default go project/module structure

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 7a8e809  - Removed some of the hacks from the generated code - Refactored the directory structure to be more in line with the default go project/module structure
7a8e809 is described below

commit 7a8e809bc7b090d0d418858bc1989b975bc4a059
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Sat Oct 10 11:18:12 2020 +0200

    - Removed some of the hacks from the generated code
    - Refactored the directory structure to be more in line with the default go project/module structure
---
 .../main/resources/templates/go/enum-template.ftlh |   2 +-
 .../resources/templates/go/model-template.ftlh     | 141 ++++++++++-----------
 sandbox/plc4go/{src/main => cmd/modbus}/modbus.go  |   4 +-
 .../plc4go/modbus/readwrite/ModbusConstants.go     |  13 +-
 .../plc4go/modbus/readwrite/ModbusDataType.go      |   2 +-
 .../plc4go/modbus/readwrite/ModbusPDU.go           | 111 +++-------------
 .../modbus/readwrite/ModbusPDUDiagnosticRequest.go |  25 ++--
 .../plc4go/modbus/readwrite/ModbusPDUError.go      |  17 ++-
 .../readwrite/ModbusPDUGetComEventLogRequest.go    |   9 +-
 .../readwrite/ModbusPDUGetComEventLogResponse.go   |  51 ++++----
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |  33 +++--
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |  33 +++--
 .../modbus/readwrite/ModbusPDUReadCoilsRequest.go  |  25 ++--
 .../modbus/readwrite/ModbusPDUReadCoilsResponse.go |  27 ++--
 .../ModbusPDUReadDeviceIdentificationRequest.go    |   9 +-
 .../ModbusPDUReadDeviceIdentificationResponse.go   |   9 +-
 .../ModbusPDUReadDiscreteInputsRequest.go          |  25 ++--
 .../ModbusPDUReadDiscreteInputsResponse.go         |  27 ++--
 .../ModbusPDUReadExceptionStatusRequest.go         |   9 +-
 .../ModbusPDUReadExceptionStatusResponse.go        |  17 ++-
 .../readwrite/ModbusPDUReadFifoQueueRequest.go     |  17 ++-
 .../readwrite/ModbusPDUReadFifoQueueResponse.go    |  35 +++--
 .../readwrite/ModbusPDUReadFileRecordRequest.go    |  27 ++--
 .../ModbusPDUReadFileRecordRequestItem.go          |  41 +++---
 .../readwrite/ModbusPDUReadFileRecordResponse.go   |  27 ++--
 .../ModbusPDUReadFileRecordResponseItem.go         |  35 +++--
 .../ModbusPDUReadHoldingRegistersRequest.go        |  25 ++--
 .../ModbusPDUReadHoldingRegistersResponse.go       |  27 ++--
 .../ModbusPDUReadInputRegistersRequest.go          |  25 ++--
 .../ModbusPDUReadInputRegistersResponse.go         |  27 ++--
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |  59 +++++----
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |  27 ++--
 .../readwrite/ModbusPDUReportServerIdRequest.go    |   9 +-
 .../readwrite/ModbusPDUReportServerIdResponse.go   |  27 ++--
 .../readwrite/ModbusPDUWriteFileRecordRequest.go   |  27 ++--
 .../ModbusPDUWriteFileRecordRequestItem.go         |  51 ++++----
 .../readwrite/ModbusPDUWriteFileRecordResponse.go  |  27 ++--
 .../ModbusPDUWriteFileRecordResponseItem.go        |  51 ++++----
 .../ModbusPDUWriteMultipleCoilsRequest.go          |  43 ++++---
 .../ModbusPDUWriteMultipleCoilsResponse.go         |  25 ++--
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |  43 ++++---
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |  25 ++--
 .../readwrite/ModbusPDUWriteSingleCoilRequest.go   |  25 ++--
 .../readwrite/ModbusPDUWriteSingleCoilResponse.go  |  25 ++--
 .../ModbusPDUWriteSingleRegisterRequest.go         |  25 ++--
 .../ModbusPDUWriteSingleRegisterResponse.go        |  25 ++--
 .../plc4go/modbus/readwrite/ModbusSerialADU.go     |  37 +++---
 .../plc4go/modbus/readwrite/ModbusTcpADU.go        |  37 +++---
 .../plc4go/{src => internal}/plc4go/spi/Message.go |   0
 .../{src => internal}/plc4go/spi/ReadBuffer.go     |   0
 .../{src => internal}/plc4go/spi/WriteBuffer.go    |   0
 sandbox/plc4go/pom.xml                             |  29 +++--
 52 files changed, 855 insertions(+), 637 deletions(-)

diff --git a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
index 3db4ae8..52b52bd 100644
--- a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
@@ -46,7 +46,7 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/$
 //
 package ${helper.packageName(outputFlavor)}
 
-import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type ${type.name} <#if type.type?has_content>${helper.getLanguageTypeNameForTypeReference(type.type)}<#else>string</#if>
 
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 7ed231b..b517ac6 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
@@ -63,7 +63,7 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/$
 package ${helper.packageName(outputFlavor)}
 
 import (
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 <#if helper.getRequiredImports()?has_content>
     <#list helper.getRequiredImports() as import>
     ${import}
@@ -78,6 +78,7 @@ const ${field.name?upper_case} ${helper.getLanguageTypeNameForField(field)} = ${
     </#list>
 </#if>
 
+// The data-structure of this message
 type ${type.name} struct {
 <#-- Prpoerty fields are fields that require a property in the pojo -->
 <#if type.propertyFields?has_content>
@@ -92,6 +93,7 @@ type ${type.name} struct {
 <#if type.parentType??>    ${type.parentType.name}</#if>
 }
 
+// The corresponding interface
 type I${type.name} interface {
 <#if helper.isDiscriminatedChildTypeDefinition()>
     I${type.parentType.name}
@@ -131,11 +133,6 @@ type ${type.name}Initializer interface {
     <#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}()
 }
@@ -577,157 +574,157 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer) {
     }
         </#list>
     </#if>
+    serializeFunc := func(typ interface{}) {
+        if <#if helper.isDiscriminatedParentTypeDefinition()>i${type.name}<#else>_</#if>, ok :=typ.(IModbusPDU); ok {
     <#list type.fields as field>
         <#switch field.typeName>
             <#case "array">
                 <#assign arrayField = field>
                 <#assign simpleTypeReference = arrayField.type>
 
-    // Array Field (${arrayField.name})
-    if m.${arrayField.name} != nil {
+            // Array Field (${arrayField.name})
+            if m.${arrayField.name} != nil {
                 <#if helper.isComplexTypeReference(arrayField.type) && helper.needsVariable(arrayField, "curItem", true)>
-        itemCount := len(m.${arrayField.name})
-        var curItem uint16 = 0
+                itemCount := len(m.${arrayField.name})
+                var curItem uint16 = 0
                 </#if>
-        for _, _element := range m.${arrayField.name} {
+                for _, _element := range m.${arrayField.name} {
                 <#if helper.isSimpleTypeReference(arrayField.type)>
                     <#assign simpleTypeReference = arrayField.type>
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_element")}
+                    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_element")}
                 <#else>
                     <#assign complexTypeReference = arrayField.type>
                     <#if helper.needsVariable(arrayField, "curItem", true)>
-            var lastItem bool = curItem == (itemCount - 1)
+                    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>)
+                    _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++
+                    curItem++
                     </#if>
-        }
-    }
+                }
+            }
                 <#break>
             <#case "checksum">
                 <#assign checksumField = field>
                 <#assign simpleTypeReference = checksumField.type>
 
-    // Checksum Field (checksum) (Calculated)
-    {
-        _checksum := ${helper.getNullValueForTypeReference(checksumField.type)}
-        // Create an array of all the bytes written in this message element so far.
-        checksumRawData []uint8 = io.getBytes(startPos, io.getPos())
-        _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
-        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")}
-    }
+            // Checksum Field (checksum) (Calculated)
+            {
+                _checksum := ${helper.getNullValueForTypeReference(checksumField.type)}
+                // Create an array of all the bytes written in this message element so far.
+                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>
 
-    // Const Field (${constField.name})
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)}
+            // Const Field (${constField.name})
+            ${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)
-    ${discriminatorField.name} := ${type.name}${discriminatorField.name?cap_first}(m)
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
+            // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
+            ${discriminatorField.name} := ${type.name}${discriminatorField.name?cap_first}(i${type.name})
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
                 <#break>
             <#case "enum">
                 <#assign enumField = field>
 
-    // Enum field (${enumField.name})
-    ${enumField.name} := m.${enumField.name}
-    ${helper.getWriteBufferWriteMethodCall(helper.getEnumBaseTypeReference(enumField.type), "(" + enumField.name + ".getValue())")}
+            // Enum field (${enumField.name})
+            ${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)
-    var ${implicitField.name} ${helper.getLanguageTypeNameForField(field)} = (${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)})
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")}
+            // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+            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 m.${manualArrayField.name} != nil {
-        for(${helper.getLanguageTypeNameForField(field)} element : m.${manualArrayField.name}) {
-            ${helper.toSerializationExpression(manualArrayField, manualArrayField.serializeExpression, type.parserArguments)}
-        }
-    }
+            // Manual Array Field (${manualArrayField.name})
+            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>
 
-    // Manual Field (${manualField.name})
-    ${helper.toSerializationExpression(manualField, manualField.serializeExpression, type.parserArguments)}
+            // Manual Field (${manualField.name})
+            ${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)
-    var ${optionalField.name} ${helper.getLanguageTypeNameForField(field)} = nil
-    if m.${optionalField.name} != nil {
-        ${optionalField.name} = m.${optionalField.name}
+            // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
+            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 + ")")}
+                ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + optionalField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = optionalField.type>
-        ${complexTypeReference.name}IO.staticSerialize(io, ${optionalField.name})
+                ${complexTypeReference.name}IO.staticSerialize(io, ${optionalField.name})
                 </#if>
-    }
+            }
                 <#break>
             <#case "padding">
                 <#assign paddingField = field>
                 <#assign simpleTypeReference = paddingField.type>
 
-    // Padding Field (padding)
-    {
-        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)")}
-        }
-    }
+            // Padding Field (padding)
+            {
+                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>
 
-    // Reserved Field (reserved)
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))}
+            // Reserved Field (reserved)
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))}
                 <#break>
             <#case "simple">
                 <#assign simpleField = field>
 
-    // Simple Field (${simpleField.name})
-    var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)} = m.${simpleField.name}
+            // Simple Field (${simpleField.name})
+            var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)} = m.${simpleField.name}
                 <#if helper.isSimpleTypeReference(simpleField.type)>
                     <#assign simpleTypeReference = simpleField.type>
-    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
-    ${simpleField.name}.Serialize(io)
+            ${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 I${type.name}(m).(type) {
-                <#list switchField.cases as case>
-        case I${case.name}:
-            I${case.name}(m).Serialize(io)
-                </#list>
-    }
+            // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+            i${type.name}.Serialize(io)
                 <#break>
             <#case "virtual">
                 <#break>
         </#switch>
     </#list>
+        }
+    }
+    serializeFunc(m)
 }
 </#outputformat>
\ No newline at end of file
diff --git a/sandbox/plc4go/src/main/modbus.go b/sandbox/plc4go/cmd/modbus/modbus.go
similarity index 87%
rename from sandbox/plc4go/src/main/modbus.go
rename to sandbox/plc4go/cmd/modbus/modbus.go
index 73d26b2..2126756 100644
--- a/sandbox/plc4go/src/main/modbus.go
+++ b/sandbox/plc4go/cmd/modbus/modbus.go
@@ -17,8 +17,8 @@ package main
 
 import (
 	"encoding/hex"
-	"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"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/modbus/readwrite"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
 func main() {
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusConstants.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusConstants.go
similarity index 85%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusConstants.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusConstants.go
index e2bb66e..f4cc06b 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusConstants.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusConstants.go
@@ -20,16 +20,18 @@ package readwrite
 
 import (
 	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 	"strconv"
 )
 
 // Constant values.
 const MODBUSTCPDEFAULTPORT uint16 = 502
 
+// The data-structure of this message
 type ModbusConstants struct {
 }
 
+// The corresponding interface
 type IModbusConstants interface {
 	spi.Message
 	Serialize(io spi.WriteBuffer)
@@ -65,7 +67,12 @@ func ModbusConstantsParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m ModbusConstants) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
 
-	// Const Field (modbusTcpDefaultPort)
-	io.WriteUint16(16, 502)
+			// Const Field (modbusTcpDefaultPort)
+			io.WriteUint16(16, 502)
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusDataType.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusDataType.go
similarity index 97%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusDataType.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusDataType.go
index 6c59b5b..625472f 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusDataType.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusDataType.go
@@ -18,7 +18,7 @@
 //
 package readwrite
 
-import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type ModbusDataType uint8
 
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDU.go
similarity index 64%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDU.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDU.go
index dbd5eb7..99e91ea 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDU.go
@@ -20,12 +20,14 @@ package readwrite
 
 import (
 	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDU struct {
 }
 
+// The corresponding interface
 type IModbusPDU interface {
 	spi.Message
 	ErrorFlag() bool
@@ -38,29 +40,14 @@ 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()
 }
@@ -177,88 +164,20 @@ func ModbusPDUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 }
 
 func (m ModbusPDU) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if iModbusPDU, ok := typ.(IModbusPDU); ok {
 
-	// Discriminator Field (errorFlag) (Used as input to a switch field)
-	errorFlag := ModbusPDUErrorFlag(m)
-	io.WriteBit((bool)(errorFlag))
+			// Discriminator Field (errorFlag) (Used as input to a switch field)
+			errorFlag := ModbusPDUErrorFlag(iModbusPDU)
+			io.WriteBit((bool)(errorFlag))
 
-	// Discriminator Field (functionFlag) (Used as input to a switch field)
-	functionFlag := ModbusPDUFunctionFlag(m)
-	io.WriteUint8(7, (functionFlag))
+			// Discriminator Field (functionFlag) (Used as input to a switch field)
+			functionFlag := ModbusPDUFunctionFlag(iModbusPDU)
+			io.WriteUint8(7, (functionFlag))
 
-	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	switch IModbusPDU(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)
+			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+			iModbusPDU.Serialize(io)
+		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
similarity index 83%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
index d9564a8..25417b1 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUDiagnosticRequest struct {
 	status     uint16
 	eventCount uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUDiagnosticRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUDiagnosticRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, e
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (status)
+			var status uint16 = m.status
+			io.WriteUint16(16, (status))
+
+			// Simple Field (eventCount)
+			var eventCount uint16 = m.eventCount
+			io.WriteUint16(16, (eventCount))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUError.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUError.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUError.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUError.go
index 253bdd2..4449446 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUError.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUError.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUError struct {
 	exceptionCode uint8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUError interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -76,8 +78,13 @@ func ModbusPDUErrorParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 }
 
 func (m ModbusPDUError) Serialize(io spi.WriteBuffer) {
-
-	// Simple Field (exceptionCode)
-	var exceptionCode uint8 = m.exceptionCode
-	io.WriteUint8(8, (exceptionCode))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (exceptionCode)
+			var exceptionCode uint8 = m.exceptionCode
+			io.WriteUint8(8, (exceptionCode))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
similarity index 89%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
index 476c3af..6eaa35f 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
@@ -19,13 +19,15 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUGetComEventLogRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUGetComEventLogRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -69,4 +71,9 @@ func ModbusPDUGetComEventLogRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 }
 
 func (m ModbusPDUGetComEventLogRequest) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
index 26354c7..342d1e7 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUGetComEventLogResponse struct {
 	status       uint16
 	eventCount   uint16
@@ -30,6 +31,7 @@ type ModbusPDUGetComEventLogResponse struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUGetComEventLogResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -113,27 +115,32 @@ func ModbusPDUGetComEventLogResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
similarity index 82%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
index a4f6a57..7eea348 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUMaskWriteHoldingRegisterRequest struct {
 	referenceAddress uint16
 	andMask          uint16
@@ -29,6 +30,7 @@ type ModbusPDUMaskWriteHoldingRegisterRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUMaskWriteHoldingRegisterRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -90,16 +92,21 @@ func ModbusPDUMaskWriteHoldingRegisterRequestParse(io spi.ReadBuffer) (ModbusPDU
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
similarity index 82%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
index 76561a2..08f985d 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUMaskWriteHoldingRegisterResponse struct {
 	referenceAddress uint16
 	andMask          uint16
@@ -29,6 +30,7 @@ type ModbusPDUMaskWriteHoldingRegisterResponse struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUMaskWriteHoldingRegisterResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -90,16 +92,21 @@ func ModbusPDUMaskWriteHoldingRegisterResponseParse(io spi.ReadBuffer) (ModbusPD
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
similarity index 83%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
index 8bef98b..5b457bb 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadCoilsRequest struct {
 	startingAddress uint16
 	quantity        uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadCoilsRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUReadCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, er
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (startingAddress)
+			var startingAddress uint16 = m.startingAddress
+			io.WriteUint16(16, (startingAddress))
+
+			// Simple Field (quantity)
+			var quantity uint16 = m.quantity
+			io.WriteUint16(16, (quantity))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
similarity index 81%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
index aecc563..b55f1f6 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadCoilsResponse struct {
 	value []int8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadCoilsResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -92,15 +94,20 @@ func ModbusPDUReadCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, e
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
similarity index 89%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
index 1eae221..fe2b75b 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
@@ -19,13 +19,15 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadDeviceIdentificationRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadDeviceIdentificationRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -69,4 +71,9 @@ func ModbusPDUReadDeviceIdentificationRequestParse(io spi.ReadBuffer) (ModbusPDU
 }
 
 func (m ModbusPDUReadDeviceIdentificationRequest) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
similarity index 89%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
index 225655d..c7344a8 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
@@ -19,13 +19,15 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadDeviceIdentificationResponse struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadDeviceIdentificationResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -69,4 +71,9 @@ func ModbusPDUReadDeviceIdentificationResponseParse(io spi.ReadBuffer) (ModbusPD
 }
 
 func (m ModbusPDUReadDeviceIdentificationResponse) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
similarity index 83%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
index db40260..8f4af11 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadDiscreteInputsRequest struct {
 	startingAddress uint16
 	quantity        uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadDiscreteInputsRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUReadDiscreteInputsRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (startingAddress)
+			var startingAddress uint16 = m.startingAddress
+			io.WriteUint16(16, (startingAddress))
+
+			// Simple Field (quantity)
+			var quantity uint16 = m.quantity
+			io.WriteUint16(16, (quantity))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
similarity index 81%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
index db6fa41..44a0d51 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadDiscreteInputsResponse struct {
 	value []int8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadDiscreteInputsResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -92,15 +94,20 @@ func ModbusPDUReadDiscreteInputsResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
similarity index 89%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
index d8c0cdb..926aeec 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
@@ -19,13 +19,15 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadExceptionStatusRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadExceptionStatusRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -69,4 +71,9 @@ func ModbusPDUReadExceptionStatusRequestParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 func (m ModbusPDUReadExceptionStatusRequest) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
similarity index 86%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
index 63127af..3dc82a2 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadExceptionStatusResponse struct {
 	value uint8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadExceptionStatusResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -76,8 +78,13 @@ func ModbusPDUReadExceptionStatusResponseParse(io spi.ReadBuffer) (ModbusPDUInit
 }
 
 func (m ModbusPDUReadExceptionStatusResponse) Serialize(io spi.WriteBuffer) {
-
-	// Simple Field (value)
-	var value uint8 = m.value
-	io.WriteUint8(8, (value))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (value)
+			var value uint8 = m.value
+			io.WriteUint8(8, (value))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
similarity index 85%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
index 4d4f482..ec621cf 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadFifoQueueRequest struct {
 	fifoPointerAddress uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadFifoQueueRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -76,8 +78,13 @@ func ModbusPDUReadFifoQueueRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer
 }
 
 func (m ModbusPDUReadFifoQueueRequest) Serialize(io spi.WriteBuffer) {
-
-	// Simple Field (fifoPointerAddress)
-	var fifoPointerAddress uint16 = m.fifoPointerAddress
-	io.WriteUint16(16, (fifoPointerAddress))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (fifoPointerAddress)
+			var fifoPointerAddress uint16 = m.fifoPointerAddress
+			io.WriteUint16(16, (fifoPointerAddress))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
similarity index 76%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
index e4d8f0a..9c59634 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadFifoQueueResponse struct {
 	fifoValue []uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadFifoQueueResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -98,19 +100,24 @@ func ModbusPDUReadFifoQueueResponseParse(io spi.ReadBuffer) (ModbusPDUInitialize
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
index 6edde89..0877e9a 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
@@ -20,15 +20,17 @@ package readwrite
 
 import (
 	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 	"reflect"
 )
 
+// The data-structure of this message
 type ModbusPDUReadFileRecordRequest struct {
 	items []ModbusPDUReadFileRecordRequestItem
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadFileRecordRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -110,15 +112,20 @@ func (m ModbusPDUReadFileRecordRequest) Serialize(io spi.WriteBuffer) {
 		}
 		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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
index 3ec37d7..7775e53 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadFileRecordRequestItem struct {
 	referenceType uint8
 	fileNumber    uint16
@@ -29,6 +30,7 @@ type ModbusPDUReadFileRecordRequestItem struct {
 	recordLength  uint16
 }
 
+// The corresponding interface
 type IModbusPDUReadFileRecordRequestItem interface {
 	spi.Message
 	Serialize(io spi.WriteBuffer)
@@ -79,20 +81,25 @@ func ModbusPDUReadFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, er
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
index e995698..5b50e48 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
@@ -20,15 +20,17 @@ package readwrite
 
 import (
 	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 	"reflect"
 )
 
+// The data-structure of this message
 type ModbusPDUReadFileRecordResponse struct {
 	items []ModbusPDUReadFileRecordResponseItem
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadFileRecordResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -110,15 +112,20 @@ func (m ModbusPDUReadFileRecordResponse) Serialize(io spi.WriteBuffer) {
 		}
 		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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
index 2e5f746..e9a70af 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadFileRecordResponseItem struct {
 	referenceType uint8
 	data          []int8
 }
 
+// The corresponding interface
 type IModbusPDUReadFileRecordResponseItem interface {
 	spi.Message
 	Serialize(io spi.WriteBuffer)
@@ -79,19 +81,24 @@ func ModbusPDUReadFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message, e
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
similarity index 83%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
index 863a562..40cb6cd 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadHoldingRegistersRequest struct {
 	startingAddress uint16
 	quantity        uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadHoldingRegistersRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUReadHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInit
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (startingAddress)
+			var startingAddress uint16 = m.startingAddress
+			io.WriteUint16(16, (startingAddress))
+
+			// Simple Field (quantity)
+			var quantity uint16 = m.quantity
+			io.WriteUint16(16, (quantity))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
similarity index 81%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
index bf98a55..32d39cb 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadHoldingRegistersResponse struct {
 	value []int8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadHoldingRegistersResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -92,15 +94,20 @@ func ModbusPDUReadHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIni
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
similarity index 83%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
index 70ca4b6..f7ea9a4 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadInputRegistersRequest struct {
 	startingAddress uint16
 	quantity        uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadInputRegistersRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUReadInputRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (startingAddress)
+			var startingAddress uint16 = m.startingAddress
+			io.WriteUint16(16, (startingAddress))
+
+			// Simple Field (quantity)
+			var quantity uint16 = m.quantity
+			io.WriteUint16(16, (quantity))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
similarity index 81%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
index a2ba0ae..d5e8858 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadInputRegistersResponse struct {
 	value []int8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadInputRegistersResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -92,15 +94,20 @@ func ModbusPDUReadInputRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
index bff2785..e54097d 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadWriteMultipleHoldingRegistersRequest struct {
 	readStartingAddress  uint16
 	readQuantity         uint16
@@ -31,6 +32,7 @@ type ModbusPDUReadWriteMultipleHoldingRegistersRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadWriteMultipleHoldingRegistersRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -120,31 +122,36 @@ func ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
similarity index 82%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
index 9734878..aa345ab 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReadWriteMultipleHoldingRegistersResponse struct {
 	value []int8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReadWriteMultipleHoldingRegistersResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -92,15 +94,20 @@ func ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer)
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
similarity index 89%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
index cbdb441..abd1658 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
@@ -19,13 +19,15 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReportServerIdRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReportServerIdRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -69,4 +71,9 @@ func ModbusPDUReportServerIdRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 }
 
 func (m ModbusPDUReportServerIdRequest) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
similarity index 81%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
index 731d27f..e22f6c0 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
@@ -19,14 +19,16 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUReportServerIdResponse struct {
 	value []int8
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUReportServerIdResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -92,15 +94,20 @@ func ModbusPDUReportServerIdResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
index e3c7a74..ec073b9 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
@@ -20,15 +20,17 @@ package readwrite
 
 import (
 	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 	"reflect"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteFileRecordRequest struct {
 	items []ModbusPDUWriteFileRecordRequestItem
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteFileRecordRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -110,15 +112,20 @@ func (m ModbusPDUWriteFileRecordRequest) Serialize(io spi.WriteBuffer) {
 		}
 		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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
index 2137397..4b3d266 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteFileRecordRequestItem struct {
 	referenceType uint8
 	fileNumber    uint16
@@ -29,6 +30,7 @@ type ModbusPDUWriteFileRecordRequestItem struct {
 	recordData    []int8
 }
 
+// The corresponding interface
 type IModbusPDUWriteFileRecordRequestItem interface {
 	spi.Message
 	Serialize(io spi.WriteBuffer)
@@ -93,27 +95,32 @@ func ModbusPDUWriteFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, e
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
similarity index 85%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
index 387ba1d..4cedddf 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
@@ -20,15 +20,17 @@ package readwrite
 
 import (
 	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 	"reflect"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteFileRecordResponse struct {
 	items []ModbusPDUWriteFileRecordResponseItem
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteFileRecordResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -110,15 +112,20 @@ func (m ModbusPDUWriteFileRecordResponse) Serialize(io spi.WriteBuffer) {
 		}
 		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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
similarity index 75%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
index 703f6e5..6fe8d39 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteFileRecordResponseItem struct {
 	referenceType uint8
 	fileNumber    uint16
@@ -29,6 +30,7 @@ type ModbusPDUWriteFileRecordResponseItem struct {
 	recordData    []int8
 }
 
+// The corresponding interface
 type IModbusPDUWriteFileRecordResponseItem interface {
 	spi.Message
 	Serialize(io spi.WriteBuffer)
@@ -93,27 +95,32 @@ func ModbusPDUWriteFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message,
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
similarity index 78%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
index 49c3abf..f43e395 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteMultipleCoilsRequest struct {
 	startingAddress uint16
 	quantity        uint16
@@ -29,6 +30,7 @@ type ModbusPDUWriteMultipleCoilsRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteMultipleCoilsRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -106,23 +108,28 @@ func ModbusPDUWriteMultipleCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
similarity index 83%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
index 28806fe..2973e04 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteMultipleCoilsResponse struct {
 	startingAddress uint16
 	quantity        uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteMultipleCoilsResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUWriteMultipleCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (startingAddress)
+			var startingAddress uint16 = m.startingAddress
+			io.WriteUint16(16, (startingAddress))
+
+			// Simple Field (quantity)
+			var quantity uint16 = m.quantity
+			io.WriteUint16(16, (quantity))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
similarity index 79%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
index a775c14..a21fe27 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
@@ -19,9 +19,10 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteMultipleHoldingRegistersRequest struct {
 	startingAddress uint16
 	quantity        uint16
@@ -29,6 +30,7 @@ type ModbusPDUWriteMultipleHoldingRegistersRequest struct {
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteMultipleHoldingRegistersRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -106,23 +108,28 @@ func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (Modb
 }
 
 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)
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// 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)
+				}
+			}
 		}
 	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
index 914260d..dc5fd03 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteMultipleHoldingRegistersResponse struct {
 	startingAddress uint16
 	quantity        uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteMultipleHoldingRegistersResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) (Mod
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (startingAddress)
+			var startingAddress uint16 = m.startingAddress
+			io.WriteUint16(16, (startingAddress))
+
+			// Simple Field (quantity)
+			var quantity uint16 = m.quantity
+			io.WriteUint16(16, (quantity))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
index e18173e..62deb5b 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteSingleCoilRequest struct {
 	address uint16
 	value   uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteSingleCoilRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUWriteSingleCoilRequestParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (address)
+			var address uint16 = m.address
+			io.WriteUint16(16, (address))
+
+			// Simple Field (value)
+			var value uint16 = m.value
+			io.WriteUint16(16, (value))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
index e519cf1..2e0792d 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteSingleCoilResponse struct {
 	address uint16
 	value   uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteSingleCoilResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUWriteSingleCoilResponseParse(io spi.ReadBuffer) (ModbusPDUInitiali
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (address)
+			var address uint16 = m.address
+			io.WriteUint16(16, (address))
+
+			// Simple Field (value)
+			var value uint16 = m.value
+			io.WriteUint16(16, (value))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
index a7d8231..d7e7e0d 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteSingleRegisterRequest struct {
 	address uint16
 	value   uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteSingleRegisterRequest interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUWriteSingleRegisterRequestParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (address)
+			var address uint16 = m.address
+			io.WriteUint16(16, (address))
+
+			// Simple Field (value)
+			var value uint16 = m.value
+			io.WriteUint16(16, (value))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
similarity index 84%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
index 54f07cc..730dd1c 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
@@ -19,15 +19,17 @@
 package readwrite
 
 import (
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
+// The data-structure of this message
 type ModbusPDUWriteSingleRegisterResponse struct {
 	address uint16
 	value   uint16
 	ModbusPDU
 }
 
+// The corresponding interface
 type IModbusPDUWriteSingleRegisterResponse interface {
 	IModbusPDU
 	Serialize(io spi.WriteBuffer)
@@ -83,12 +85,17 @@ func ModbusPDUWriteSingleRegisterResponseParse(io spi.ReadBuffer) (ModbusPDUInit
 }
 
 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))
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
+
+			// Simple Field (address)
+			var address uint16 = m.address
+			io.WriteUint16(16, (address))
+
+			// Simple Field (value)
+			var value uint16 = m.value
+			io.WriteUint16(16, (value))
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusSerialADU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusSerialADU.go
similarity index 80%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusSerialADU.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusSerialADU.go
index 18713e3..6c56e2c 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusSerialADU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusSerialADU.go
@@ -21,10 +21,11 @@ package readwrite
 import (
 	"errors"
 	log "github.com/sirupsen/logrus"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 	"reflect"
 )
 
+// The data-structure of this message
 type ModbusSerialADU struct {
 	transactionId uint16
 	length        uint16
@@ -32,6 +33,7 @@ type ModbusSerialADU struct {
 	pdu           ModbusPDU
 }
 
+// The corresponding interface
 type IModbusSerialADU interface {
 	spi.Message
 	Serialize(io spi.WriteBuffer)
@@ -104,23 +106,28 @@ func ModbusSerialADUParse(io spi.ReadBuffer, response bool) (spi.Message, error)
 }
 
 func (m ModbusSerialADU) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
 
-	// Simple Field (transactionId)
-	var transactionId uint16 = m.transactionId
-	io.WriteUint16(16, (transactionId))
+			// Simple Field (transactionId)
+			var transactionId uint16 = m.transactionId
+			io.WriteUint16(16, (transactionId))
 
-	// Reserved Field (reserved)
-	io.WriteUint16(16, uint16(0x0000))
+			// Reserved Field (reserved)
+			io.WriteUint16(16, uint16(0x0000))
 
-	// Simple Field (length)
-	var length uint16 = m.length
-	io.WriteUint16(16, (length))
+			// 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 (address)
+			var address uint8 = m.address
+			io.WriteUint8(8, (address))
 
-	// Simple Field (pdu)
-	var pdu ModbusPDU = m.pdu
-	pdu.Serialize(io)
+			// Simple Field (pdu)
+			var pdu ModbusPDU = m.pdu
+			pdu.Serialize(io)
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusTcpADU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusTcpADU.go
similarity index 77%
rename from sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusTcpADU.go
rename to sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusTcpADU.go
index b4e91f8..d292218 100644
--- a/sandbox/plc4go/generated-sources/plc4go/modbus/readwrite/ModbusTcpADU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/ModbusTcpADU.go
@@ -20,7 +20,7 @@ package readwrite
 
 import (
 	"errors"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 	"reflect"
 	"strconv"
 )
@@ -28,12 +28,14 @@ import (
 // Constant values.
 const PROTOCOLIDENTIFIER uint16 = 0x0000
 
+// The data-structure of this message
 type ModbusTcpADU struct {
 	transactionIdentifier uint16
 	unitIdentifier        uint8
 	pdu                   ModbusPDU
 }
 
+// The corresponding interface
 type IModbusTcpADU interface {
 	spi.Message
 	Serialize(io spi.WriteBuffer)
@@ -101,23 +103,28 @@ func ModbusTcpADUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 }
 
 func (m ModbusTcpADU) Serialize(io spi.WriteBuffer) {
+	serializeFunc := func(typ interface{}) {
+		if _, ok := typ.(IModbusPDU); ok {
 
-	// Simple Field (transactionIdentifier)
-	var transactionIdentifier uint16 = m.transactionIdentifier
-	io.WriteUint16(16, (transactionIdentifier))
+			// Simple Field (transactionIdentifier)
+			var transactionIdentifier uint16 = m.transactionIdentifier
+			io.WriteUint16(16, (transactionIdentifier))
 
-	// Const Field (protocolIdentifier)
-	io.WriteUint16(16, 0x0000)
+			// 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))
+			// 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 (unitIdentifier)
+			var unitIdentifier uint8 = m.unitIdentifier
+			io.WriteUint8(8, (unitIdentifier))
 
-	// Simple Field (pdu)
-	var pdu ModbusPDU = m.pdu
-	pdu.Serialize(io)
+			// Simple Field (pdu)
+			var pdu ModbusPDU = m.pdu
+			pdu.Serialize(io)
+		}
+	}
+	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/src/plc4go/spi/Message.go b/sandbox/plc4go/internal/plc4go/spi/Message.go
similarity index 100%
rename from sandbox/plc4go/src/plc4go/spi/Message.go
rename to sandbox/plc4go/internal/plc4go/spi/Message.go
diff --git a/sandbox/plc4go/src/plc4go/spi/ReadBuffer.go b/sandbox/plc4go/internal/plc4go/spi/ReadBuffer.go
similarity index 100%
rename from sandbox/plc4go/src/plc4go/spi/ReadBuffer.go
rename to sandbox/plc4go/internal/plc4go/spi/ReadBuffer.go
diff --git a/sandbox/plc4go/src/plc4go/spi/WriteBuffer.go b/sandbox/plc4go/internal/plc4go/spi/WriteBuffer.go
similarity index 100%
rename from sandbox/plc4go/src/plc4go/spi/WriteBuffer.go
rename to sandbox/plc4go/internal/plc4go/spi/WriteBuffer.go
diff --git a/sandbox/plc4go/pom.xml b/sandbox/plc4go/pom.xml
index c519a1d..3ae8a81 100644
--- a/sandbox/plc4go/pom.xml
+++ b/sandbox/plc4go/pom.xml
@@ -54,7 +54,7 @@
               <protocolName>modbus</protocolName>
               <languageName>go</languageName>
               <outputFlavor>read-write</outputFlavor>
-              <outputDir>${project.basedir}/generated-sources</outputDir>
+              <outputDir>${project.basedir}/internal</outputDir>
             </configuration>
           </execution>
         </executions>
@@ -65,19 +65,13 @@
         <artifactId>mvn-golang-wrapper</artifactId>
         <version>2.3.5</version>
         <extensions>true</extensions>
-        <executions>
-          <execution>
-            <goals>
-              <goal>run</goal>
-            </goals>
-            <configuration>
-              <packages>
-                <package>main.go</package>
-              </packages>
-              <sources>src,generated-sources</sources>
-            </configuration>
-          </execution>
-        </executions>
+        <configuration>
+          <moduleMode>true</moduleMode>
+          <!--packages>
+            <package>cmd/modbus/modbus.go</package>
+          </packages-->
+          <sources>.</sources>
+        </configuration>
       </plugin>
     </plugins>
   </build>
@@ -99,6 +93,13 @@
       <!-- Scope is 'provided' as this way it's not shipped with the driver -->
       <scope>provided</scope>
     </dependency>
+
+    <dependency>
+      <groupId>com.igormaznitsa</groupId>
+      <artifactId>mvn-golang-wrapper</artifactId>
+      <version>2.3.5</version>
+      <scope>provided</scope>
+    </dependency>
   </dependencies>