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/08 14:31:52 UTC

[plc4x] branch feature/plc4go updated: - Got the Go code generation allmost finished ...

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 6d31075  - Got the Go code generation allmost finished ...
6d31075 is described below

commit 6d310755a93739866ec20778b2c642d561277853
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Oct 8 16:31:45 2020 +0200

    - Got the Go code generation allmost finished ...
---
 .../language/go/GoLanguageTemplateHelper.java      |  33 ++++-
 .../resources/templates/go/model-template.ftlh     | 119 ++++++++-------
 .../plc4go/go/modbus/readwrite/ModbusConstants.go  |  41 +++---
 .../plc4go/go/modbus/readwrite/ModbusPDU.go        | 163 +++++++++++----------
 .../modbus/readwrite/ModbusPDUDiagnosticRequest.go |   8 +-
 .../plc4go/go/modbus/readwrite/ModbusPDUError.go   |   8 +-
 .../readwrite/ModbusPDUGetComEventLogRequest.go    |   8 +-
 .../readwrite/ModbusPDUGetComEventLogResponse.go   | 109 +++++++-------
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |   8 +-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |   8 +-
 .../modbus/readwrite/ModbusPDUReadCoilsRequest.go  |   8 +-
 .../modbus/readwrite/ModbusPDUReadCoilsResponse.go |  67 ++++-----
 .../ModbusPDUReadDeviceIdentificationRequest.go    |   8 +-
 .../ModbusPDUReadDeviceIdentificationResponse.go   |   8 +-
 .../ModbusPDUReadDiscreteInputsRequest.go          |   8 +-
 .../ModbusPDUReadDiscreteInputsResponse.go         |  67 ++++-----
 .../ModbusPDUReadExceptionStatusRequest.go         |   8 +-
 .../ModbusPDUReadExceptionStatusResponse.go        |   8 +-
 .../readwrite/ModbusPDUReadFifoQueueRequest.go     |   8 +-
 .../readwrite/ModbusPDUReadFifoQueueResponse.go    |  83 +++++------
 .../readwrite/ModbusPDUReadFileRecordRequest.go    |  75 +++++-----
 .../ModbusPDUReadFileRecordRequestItem.go          |   8 +-
 .../readwrite/ModbusPDUReadFileRecordResponse.go   |  75 +++++-----
 .../ModbusPDUReadFileRecordResponseItem.go         |  71 ++++-----
 .../ModbusPDUReadHoldingRegistersRequest.go        |   8 +-
 .../ModbusPDUReadHoldingRegistersResponse.go       |  67 ++++-----
 .../ModbusPDUReadInputRegistersRequest.go          |   8 +-
 .../ModbusPDUReadInputRegistersResponse.go         |  67 ++++-----
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go | 121 +++++++--------
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |  67 ++++-----
 .../readwrite/ModbusPDUReportServerIdRequest.go    |   8 +-
 .../readwrite/ModbusPDUReportServerIdResponse.go   |  67 ++++-----
 .../readwrite/ModbusPDUWriteFileRecordRequest.go   |  75 +++++-----
 .../ModbusPDUWriteFileRecordRequestItem.go         | 103 ++++++-------
 .../readwrite/ModbusPDUWriteFileRecordResponse.go  |  75 +++++-----
 .../ModbusPDUWriteFileRecordResponseItem.go        | 103 ++++++-------
 .../ModbusPDUWriteMultipleCoilsRequest.go          |  97 ++++++------
 .../ModbusPDUWriteMultipleCoilsResponse.go         |   8 +-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |  97 ++++++------
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |   8 +-
 .../readwrite/ModbusPDUWriteSingleCoilRequest.go   |   8 +-
 .../readwrite/ModbusPDUWriteSingleCoilResponse.go  |   8 +-
 .../ModbusPDUWriteSingleRegisterRequest.go         |   8 +-
 .../ModbusPDUWriteSingleRegisterResponse.go        |   8 +-
 .../plc4go/go/modbus/readwrite/ModbusSerialADU.go  | 120 +++++++--------
 .../plc4go/go/modbus/readwrite/ModbusTcpADU.go     | 109 +++++++-------
 sandbox/plc4go/src/{ => main}/modbus.go            |  24 ++-
 sandbox/plc4go/src/plc4go/spi/ReadBuffer.go        |   8 +
 48 files changed, 1067 insertions(+), 1212 deletions(-)

diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index 26de96b..4a92a57 100644
--- a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -272,7 +272,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     public String getWriteBufferWriteMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
         switch (simpleTypeReference.getBaseType()) {
             case BIT: {
-                return "io.writeBit((boolean) " + fieldName + ")";
+                return "io.writeBit((bool) " + fieldName + ")";
             }
             case UINT: {
                 IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
@@ -348,7 +348,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         }
         if(term instanceof Literal) {
             if(term instanceof NullLiteral) {
-                return "null";
+                return "nil";
             } else if(term instanceof BooleanLiteral) {
                 return Boolean.toString(((BooleanLiteral) term).getValue());
             } else if(term instanceof NumericLiteral) {
@@ -729,5 +729,34 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         return filteredEnumValues.values();
     }
 
+    public List<String> getRequiredImports() {
+        List<String> imports = new ArrayList<>();
+        // At least one reserved field or simple field with complex type
+        if(((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field ->
+            (field instanceof ReservedField))) {
+            imports.add("log \"github.com/sirupsen/logrus\"");
+        }
+
+        // For "Fields with complex type", constant, typeSwitch,  fields: "errors"
+        if(((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field ->
+            (field instanceof ConstField) || (field instanceof SwitchField) ||
+                ((field instanceof TypedField) && ((TypedField) field).getType() instanceof ComplexTypeReference))) {
+            imports.add("\"errors\"");
+        }
+
+        // "Fields with complex type": "reflect"
+        if(((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field ->
+            ((field instanceof TypedField) && ((TypedField) field).getType() instanceof ComplexTypeReference))) {
+            imports.add("\"reflect\"");
+        }
+
+        // For Constant field: "strconv"
+        if(((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field ->
+            (field instanceof ReservedField))) {
+            imports.add("\"strconv\"");
+        }
+
+        return imports;
+    }
 
 }
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 bb0f2c9..af17026 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,15 +63,18 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/$
 package ${helper.packageName(outputFlavor)}
 
 import (
-    "math"
     "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+<#if helper.getRequiredImports()?has_content>
+    <#list helper.getRequiredImports() as import>
+    ${import}
+    </#list>
+</#if>
 )
 <#if type.constFields?has_content>
 
 // Constant values.
     <#list type.constFields as field>
-const ${field.name?upper_case} ${helper.getLanguageTypeNameForField(field)} = ${field.referenceValue};
+const ${field.name?upper_case} ${helper.getLanguageTypeNameForField(field)} = ${field.referenceValue}
     </#list>
 </#if>
 
@@ -231,9 +234,9 @@ func (m ${type.name}) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) <#if type.parentType??>${type.parentType.name}Initializer<#else>spi.Message</#if> {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (<#if type.parentType??>${type.parentType.name}Initializer<#else>spi.Message</#if>, error) {
+<#--    var startPos = io.GetPos()
+    var curPos uint16-->
     <#list type.fields as field>
         <#switch field.typeName>
             <#case "array">
@@ -244,63 +247,68 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#if arrayField.loopExpression.contains("curPos")>
     curPos = io.GetPos() - startPos
                 </#if>
+    var ${arrayField.name} []${helper.getLanguageTypeNameForField(field)}
             <#-- If this is a count array, we can directly initialize an array with the given size -->
                 <#if helper.isCountArrayField(field)>
     // Count array
-    if ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} > math.MaxUint8 {
-        throw new ParseException("Array count of " + (${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name};
     {
-        var itemCount := ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}
-        ${arrayField.name} = new ${helper.getLanguageTypeNameForField(field)}[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-                <#-- When parsing simple types, there is nothing that could require the "lastItem" -->
-            <#if !helper.isSimpleTypeReference(arrayField.type)>boolean lastItem = curItem == (itemCount - 1);</#if>
+        ${arrayField.name} := make([]${helper.getLanguageTypeNameForField(field)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)})
+        for curItem := uint16(0); curItem < uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}); curItem++ {
+<#if !helper.isSimpleTypeReference(arrayField.type)>            boolean lastItem = curItem == (itemCount - 1);</#if>
             ${arrayField.name}[curItem] = <#if helper.isSimpleTypeReference(arrayField.type)><#assign simpleTypeReference = arrayField.type>${helper.getReadBufferReadMethodCall(simpleTypeReference)}<#else>${arrayField.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(arrayField.type, parserArgument?index))}) (${helper.toParseExpression(arrayField, parserArgument, type.parse [...]
         }
     }
                 <#-- In all other cases do we have to work with a list, that is later converted to an array -->
-                <#else>
+                <#elseif helper.isLengthArrayField(field)>
                 <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
-                    <#if helper.isLengthArrayField(field)>
     // Length array
-    var _${arrayField.name}Length := ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}
-    List<${helper.getLanguageTypeNameForField(arrayField)}> _${arrayField.name}List = new LinkedList<>();
-    ${arrayField.name}EndPos := io.GetPos() + _${arrayField.name}Length;
-    for ;io.getPos() < ${arrayField.name}EndPos; {
-        _${arrayField.name}List.add(<#if helper.isSimpleTypeReference(arrayField.type)><#assign simpleTypeReference = arrayField.type>${helper.getReadBufferReadMethodCall(simpleTypeReference)}<#else>${arrayField.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(arrayField.type, parserArgument?index))}) (${helper.toParseExpression(arrayField, parserArgument, type.parserArgum [...]
+    _${arrayField.name}Length := uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)})
+    _${arrayField.name}EndPos := io.GetPos() + _${arrayField.name}Length
+    for ;io.GetPos() < _${arrayField.name}EndPos; {
+                    <#if helper.isSimpleTypeReference(arrayField.type)>
+                        <#assign simpleTypeReference = arrayField.type>
+        ${arrayField.name} = append(${arrayField.name}, ${helper.getReadBufferReadMethodCall(simpleTypeReference)})
+                    <#else>
+        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(simpleField.type, parserArgument?index))}(${helper.toParseExpression(simpleField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+        if _err != nil {
+            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
+        }
+        var _item ${helper.getLanguageTypeNameForField(field)}
+        _item, _ok := _message.(${arrayField.type.name})
+        if !_ok {
+            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
+        }
+        ${arrayField.name} = append(${arrayField.name}, _item)
+                    </#if>
                     <#-- After parsing, update the current position, but only if it's needed -->
-                        <#if arrayField.loopExpression.contains("curPos")>
+                    <#if arrayField.loopExpression.contains("curPos")>
         curPos = io.getPos() - startPos;
-                        </#if>
+                    </#if>
     }
                     <#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
-                    <#elseif helper.isTerminatedArrayField(field)>
+                <#elseif helper.isTerminatedArrayField(field)>
     // Terminated array
-    List<${helper.getLanguageTypeNameForField(arrayField)}> _${arrayField.name}List = new LinkedList<>();
-    for ;!((boolean) (${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)})); {
-        _${arrayField.name}List.add(<#if helper.isSimpleTypeReference(arrayField.type)><#assign simpleTypeReference = arrayField.type>${helper.getReadBufferReadMethodCall(simpleTypeReference)}<#else>${arrayField.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(arrayField.type, parserArgument?index))}) (${helper.toParseExpression(arrayField, parserArgument, type.parserArgum [...]
+    for ;!bool(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}); {
+                    <#if helper.isSimpleTypeReference(arrayField.type)>
+                        <#assign simpleTypeReference = arrayField.type>
+        ${arrayField.name} = append(${arrayField.name}, ${helper.getReadBufferReadMethodCall(simpleTypeReference)})
+                    <#else>
+        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(simpleField.type, parserArgument?index))}(${helper.toParseExpression(simpleField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+        if _err != nil {
+        }
+        var _item ${helper.getLanguageTypeNameForField(field)}
+        _item, _ok := _message.(${arrayField.type.name})
+        if !_ok {
+            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
+        }
+        ${arrayField.name} = append(${arrayField.name}, _item)
+                    </#if>
 
                     <#-- After parsing, update the current position, but only if it's needed -->
-                        <#if arrayField.loopExpression.contains("curPos")>
+                    <#if arrayField.loopExpression.contains("curPos")>
         curPos = io.getPos() - startPos
-                        </#if>
-    }
                     </#if>
-                <#--
-                    Convert the list into an array. However if the array is of a primitive
-                    type we have to iterate over it's elements and explicitly cast them.
-                    Otherwise a simple toArray call is fine.
-                -->
-                    <#if helper.isSimpleTypeReference(arrayField.type)>
-    ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = new ${helper.getLanguageTypeNameForField(field)}[_${arrayField.name}List.size()]
-    for i := 0; i < _${arrayField.name}List.size(); i++ {
-        ${arrayField.name}[i] = (${helper.getLanguageTypeNameForField(field)}) _${arrayField.name}List.get(i)
     }
-                    <#else>
-    ${helper.getLanguageTypeNameForField(field)}[] ${arrayField.name} = _${arrayField.name}List.toArray(new ${helper.getLanguageTypeNameForField(arrayField)}[0])
-                    </#if>
                 </#if>
                 <#break>
             <#case "checksum">
@@ -315,7 +323,7 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
         ${helper.getLanguageTypeNameForField(field)} checksumRef = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
         checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
         if checksum != checksumRef {
-            throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X", checksumRef & 0xFFFF, checksum & 0xFFFF));
+            return nil, errors.New("Checksum verification failed. Expected " + (checksumRef & 0xFFFF) + " but got " + (checksum & 0xFFFF)")
         }
     }
                 <#break>
@@ -326,7 +334,7 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     // Const Field (${constField.name})
     var ${constField.name} ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
     if ${constField.name} != ${constField.name?upper_case} {
-        throw new ParseException("Expected constant value " + ${type.name}.${constField.name?upper_case} + " but got " + ${constField.name})
+        return nil, errors.New("Expected constant value " + strconv.Itoa(int(${constField.name?upper_case})) + " but got " + strconv.Itoa(int(${constField.name})))
     }
                 <#break>
             <#case "discriminator">
@@ -463,15 +471,14 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
-    var _${simpleField.name}Message spi.Message = ${complexTypeReference.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(simpleField.type, parserArgument?index))}(${helper.toParseExpression(simpleField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+    _${simpleField.name}Message, _err := ${complexTypeReference.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(simpleField.type, parserArgument?index))}(${helper.toParseExpression(simpleField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+    if _err != nil {
+        return nil, errors.New("Error parsing simple field '${simpleField.name}'. " + _err.Error())
+    }
     var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)}
     ${simpleField.name}, _${simpleField.name}Ok := _${simpleField.name}Message.(${helper.getLanguageTypeNameForField(field)})
     if !_${simpleField.name}Ok {
-        log.WithFields(log.Fields{
-            "expected type": "${helper.getLanguageTypeNameForField(field)}",
-            "got type": reflect.TypeOf(_${simpleField.name}Message),
-        }).Error("Couldn't cast message")
-        throw new RuntimeException()
+        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_${simpleField.name}Message).Name() + " to ${helper.getLanguageTypeNameForField(field)}")
     }
                 </#if>
                 <#break>
@@ -481,12 +488,16 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
     var initializer ${type.name}Initializer
+    var typeSwitchError error
     switch {
                 <#list switchField.cases as case>
     <#if case.discriminatorValues?has_content>case <#list case.discriminatorValues as discriminatorValue>${helper.toParseExpression(null, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#sep> && </#sep></#list></#if>:
-        initializer = ${case.name}Parse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
+        initializer, typeSwitchError = ${case.name}Parse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
                 </#list>
     }
+    if typeSwitchError != nil {
+        return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
+    }
                 <#break>
 
             <#case "virtual">
@@ -500,9 +511,9 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
 
     // Create the instance
     <#if helper.isDiscriminatedParentTypeDefinition()>
-    return initializer.initialize(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>)
+    return initializer.initialize(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>), nil
     <#else>
-    return New${type.name}(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>)
+    return New${type.name}(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>), nil
     </#if>
 }
 
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusConstants.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusConstants.go
index ac6c3e2..97c13ea 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusConstants.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusConstants.go
@@ -19,47 +19,42 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"errors"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"strconv"
 )
 
 // Constant values.
-const MODBUSTCPDEFAULTPORT uint16 = 502;
+const MODBUSTCPDEFAULTPORT uint16 = 502
 
 type ModbusConstants struct {
-
 }
 
-
 func NewModbusConstants() spi.Message {
-    return &ModbusConstants{}
+	return &ModbusConstants{}
 }
 
 func (m ModbusConstants) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+	var lengthInBits uint16 = 0
 
-    // Const Field (modbusTcpDefaultPort)
-    lengthInBits += 16
+	// Const Field (modbusTcpDefaultPort)
+	lengthInBits += 16
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusConstants) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusConstantsParse(io spi.ReadBuffer) spi.Message {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusConstantsParse(io spi.ReadBuffer) (spi.Message, error) {
 
-    // Const Field (modbusTcpDefaultPort)
-    var modbusTcpDefaultPort uint16 = io.ReadUint16(16)
-    if modbusTcpDefaultPort != MODBUSTCPDEFAULTPORT {
-        throw new ParseException("Expected constant value " + ModbusConstants.MODBUSTCPDEFAULTPORT + " but got " + modbusTcpDefaultPort)
-    }
+	// Const Field (modbusTcpDefaultPort)
+	var modbusTcpDefaultPort uint16 = io.ReadUint16(16)
+	if modbusTcpDefaultPort != MODBUSTCPDEFAULTPORT {
+		return nil, errors.New("Expected constant value " + strconv.Itoa(int(MODBUSTCPDEFAULTPORT)) + " but got " + strconv.Itoa(int(modbusTcpDefaultPort)))
+	}
 
-    // Create the instance
-    return NewModbusConstants()
+	// Create the instance
+	return NewModbusConstants(), nil
 }
-
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDU.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDU.go
index f651e3f..6963177 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDU.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDU.go
@@ -19,8 +19,7 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -34,7 +33,7 @@ type ModbusPDUInitializer interface {
 func (m ModbusPDU) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
-	// Discriminator Field (error)
+	// Discriminator Field (errorFlag)
 	lengthInBits += 1
 
 	// Discriminator Field (function)
@@ -49,93 +48,95 @@ func (m ModbusPDU) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUParse(io spi.ReadBuffer, response bool) spi.Message {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 
-	// Discriminator Field (error) (Used as input to a switch field)
-	var error bool = io.ReadBit()
+	// Discriminator Field (errorFlag) (Used as input to a switch field)
+	var errorFlag bool = io.ReadBit()
 
 	// Discriminator Field (function) (Used as input to a switch field)
 	var function uint8 = io.ReadUint8(7)
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer ModbusPDUInitializer
+	var typeSwitchError error
 	switch {
-	case error == true:
-		initializer = ModbusPDUErrorParse(io)
-	case error == false && function == 0x02 && response == false:
-		initializer = ModbusPDUReadDiscreteInputsRequestParse(io)
-	case error == false && function == 0x02 && response == true:
-		initializer = ModbusPDUReadDiscreteInputsResponseParse(io)
-	case error == false && function == 0x01 && response == false:
-		initializer = ModbusPDUReadCoilsRequestParse(io)
-	case error == false && function == 0x01 && response == true:
-		initializer = ModbusPDUReadCoilsResponseParse(io)
-	case error == false && function == 0x05 && response == false:
-		initializer = ModbusPDUWriteSingleCoilRequestParse(io)
-	case error == false && function == 0x05 && response == true:
-		initializer = ModbusPDUWriteSingleCoilResponseParse(io)
-	case error == false && function == 0x0F && response == false:
-		initializer = ModbusPDUWriteMultipleCoilsRequestParse(io)
-	case error == false && function == 0x0F && response == true:
-		initializer = ModbusPDUWriteMultipleCoilsResponseParse(io)
-	case error == false && function == 0x04 && response == false:
-		initializer = ModbusPDUReadInputRegistersRequestParse(io)
-	case error == false && function == 0x04 && response == true:
-		initializer = ModbusPDUReadInputRegistersResponseParse(io)
-	case error == false && function == 0x03 && response == false:
-		initializer = ModbusPDUReadHoldingRegistersRequestParse(io)
-	case error == false && function == 0x03 && response == true:
-		initializer = ModbusPDUReadHoldingRegistersResponseParse(io)
-	case error == false && function == 0x06 && response == false:
-		initializer = ModbusPDUWriteSingleRegisterRequestParse(io)
-	case error == false && function == 0x06 && response == true:
-		initializer = ModbusPDUWriteSingleRegisterResponseParse(io)
-	case error == false && function == 0x10 && response == false:
-		initializer = ModbusPDUWriteMultipleHoldingRegistersRequestParse(io)
-	case error == false && function == 0x10 && response == true:
-		initializer = ModbusPDUWriteMultipleHoldingRegistersResponseParse(io)
-	case error == false && function == 0x17 && response == false:
-		initializer = ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io)
-	case error == false && function == 0x17 && response == true:
-		initializer = ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io)
-	case error == false && function == 0x16 && response == false:
-		initializer = ModbusPDUMaskWriteHoldingRegisterRequestParse(io)
-	case error == false && function == 0x16 && response == true:
-		initializer = ModbusPDUMaskWriteHoldingRegisterResponseParse(io)
-	case error == false && function == 0x18 && response == false:
-		initializer = ModbusPDUReadFifoQueueRequestParse(io)
-	case error == false && function == 0x18 && response == true:
-		initializer = ModbusPDUReadFifoQueueResponseParse(io)
-	case error == false && function == 0x14 && response == false:
-		initializer = ModbusPDUReadFileRecordRequestParse(io)
-	case error == false && function == 0x14 && response == true:
-		initializer = ModbusPDUReadFileRecordResponseParse(io)
-	case error == false && function == 0x15 && response == false:
-		initializer = ModbusPDUWriteFileRecordRequestParse(io)
-	case error == false && function == 0x15 && response == true:
-		initializer = ModbusPDUWriteFileRecordResponseParse(io)
-	case error == false && function == 0x07 && response == false:
-		initializer = ModbusPDUReadExceptionStatusRequestParse(io)
-	case error == false && function == 0x07 && response == true:
-		initializer = ModbusPDUReadExceptionStatusResponseParse(io)
-	case error == false && function == 0x08 && response == false:
-		initializer = ModbusPDUDiagnosticRequestParse(io)
-	case error == false && function == 0x0C && response == false:
-		initializer = ModbusPDUGetComEventLogRequestParse(io)
-	case error == false && function == 0x0C && response == true:
-		initializer = ModbusPDUGetComEventLogResponseParse(io)
-	case error == false && function == 0x11 && response == false:
-		initializer = ModbusPDUReportServerIdRequestParse(io)
-	case error == false && function == 0x11 && response == true:
-		initializer = ModbusPDUReportServerIdResponseParse(io)
-	case error == false && function == 0x2B && response == false:
-		initializer = ModbusPDUReadDeviceIdentificationRequestParse(io)
-	case error == false && function == 0x2B && response == true:
-		initializer = ModbusPDUReadDeviceIdentificationResponseParse(io)
+	case errorFlag == true:
+		initializer, typeSwitchError = ModbusPDUErrorParse(io)
+	case errorFlag == false && function == 0x02 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadDiscreteInputsRequestParse(io)
+	case errorFlag == false && function == 0x02 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadDiscreteInputsResponseParse(io)
+	case errorFlag == false && function == 0x01 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadCoilsRequestParse(io)
+	case errorFlag == false && function == 0x01 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadCoilsResponseParse(io)
+	case errorFlag == false && function == 0x05 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteSingleCoilRequestParse(io)
+	case errorFlag == false && function == 0x05 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteSingleCoilResponseParse(io)
+	case errorFlag == false && function == 0x0F && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleCoilsRequestParse(io)
+	case errorFlag == false && function == 0x0F && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleCoilsResponseParse(io)
+	case errorFlag == false && function == 0x04 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadInputRegistersRequestParse(io)
+	case errorFlag == false && function == 0x04 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadInputRegistersResponseParse(io)
+	case errorFlag == false && function == 0x03 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadHoldingRegistersRequestParse(io)
+	case errorFlag == false && function == 0x03 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadHoldingRegistersResponseParse(io)
+	case errorFlag == false && function == 0x06 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteSingleRegisterRequestParse(io)
+	case errorFlag == false && function == 0x06 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteSingleRegisterResponseParse(io)
+	case errorFlag == false && function == 0x10 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleHoldingRegistersRequestParse(io)
+	case errorFlag == false && function == 0x10 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteMultipleHoldingRegistersResponseParse(io)
+	case errorFlag == false && function == 0x17 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io)
+	case errorFlag == false && function == 0x17 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io)
+	case errorFlag == false && function == 0x16 && response == false:
+		initializer, typeSwitchError = ModbusPDUMaskWriteHoldingRegisterRequestParse(io)
+	case errorFlag == false && function == 0x16 && response == true:
+		initializer, typeSwitchError = ModbusPDUMaskWriteHoldingRegisterResponseParse(io)
+	case errorFlag == false && function == 0x18 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadFifoQueueRequestParse(io)
+	case errorFlag == false && function == 0x18 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadFifoQueueResponseParse(io)
+	case errorFlag == false && function == 0x14 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadFileRecordRequestParse(io)
+	case errorFlag == false && function == 0x14 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadFileRecordResponseParse(io)
+	case errorFlag == false && function == 0x15 && response == false:
+		initializer, typeSwitchError = ModbusPDUWriteFileRecordRequestParse(io)
+	case errorFlag == false && function == 0x15 && response == true:
+		initializer, typeSwitchError = ModbusPDUWriteFileRecordResponseParse(io)
+	case errorFlag == false && function == 0x07 && response == false:
+		initializer, typeSwitchError = ModbusPDUReadExceptionStatusRequestParse(io)
+	case errorFlag == false && function == 0x07 && response == true:
+		initializer, typeSwitchError = ModbusPDUReadExceptionStatusResponseParse(io)
+	case errorFlag == false && function == 0x08 && response == false:
+		initializer, typeSwitchError = ModbusPDUDiagnosticRequestParse(io)
+	case errorFlag == false && function == 0x0C && response == false:
+		initializer, typeSwitchError = ModbusPDUGetComEventLogRequestParse(io)
+	case errorFlag == false && function == 0x0C && response == true:
+		initializer, typeSwitchError = ModbusPDUGetComEventLogResponseParse(io)
+	case errorFlag == false && function == 0x11 && response == false:
+		initializer, typeSwitchError = ModbusPDUReportServerIdRequestParse(io)
+	case errorFlag == false && function == 0x11 && response == true:
+		initializer, typeSwitchError = ModbusPDUReportServerIdResponseParse(io)
+	case errorFlag == false && function == 0x2B && response == false:
+		initializer, typeSwitchError = ModbusPDUReadDeviceIdentificationRequestParse(io)
+	case errorFlag == false && function == 0x2B && response == true:
+		initializer, typeSwitchError = ModbusPDUReadDeviceIdentificationResponseParse(io)
+	}
+	if typeSwitchError != nil {
+		return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
 	}
 
 	// Create the instance
-	return initializer.initialize()
+	return initializer.initialize(), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUDiagnosticRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
index 6a32f40..1a14750 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUDiagnosticRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUDiagnosticRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUDiagnosticRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUDiagnosticRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (status)
 	var status uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUDiagnosticRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
 	var eventCount uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUDiagnosticRequest(status, eventCount)
+	return NewModbusPDUDiagnosticRequest(status, eventCount), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUError.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUError.go
index a8edf1d..bcd6b14 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUError.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUError.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -50,13 +48,11 @@ func (m ModbusPDUError) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUErrorParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUErrorParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (exceptionCode)
 	var exceptionCode uint8 = io.ReadUint8(8)
 
 	// Create the instance
-	return NewModbusPDUError(exceptionCode)
+	return NewModbusPDUError(exceptionCode), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
index d7ac13b..cc80958 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -46,10 +44,8 @@ func (m ModbusPDUGetComEventLogRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUGetComEventLogRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUGetComEventLogRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Create the instance
-	return NewModbusPDUGetComEventLogRequest()
+	return NewModbusPDUGetComEventLogRequest(), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
index 71e1016..f391cea 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUGetComEventLogResponse.go
@@ -19,86 +19,77 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUGetComEventLogResponse struct {
-    status uint16
-    eventCount uint16
-    messageCount uint16
-    events []int8
-    ModbusPDU
+	status       uint16
+	eventCount   uint16
+	messageCount uint16
+	events       []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUGetComEventLogResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUGetComEventLogResponse(status uint16, eventCount uint16, messageCount uint16, events []int8) ModbusPDUInitializer {
-    return &ModbusPDUGetComEventLogResponse{status: status, eventCount: eventCount, messageCount: messageCount, events: events}
+	return &ModbusPDUGetComEventLogResponse{status: status, eventCount: eventCount, messageCount: messageCount, events: events}
 }
 
 func (m ModbusPDUGetComEventLogResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Simple field (status)
-    lengthInBits += 16
+	// Simple field (status)
+	lengthInBits += 16
 
-    // Simple field (eventCount)
-    lengthInBits += 16
+	// Simple field (eventCount)
+	lengthInBits += 16
 
-    // Simple field (messageCount)
-    lengthInBits += 16
+	// Simple field (messageCount)
+	lengthInBits += 16
 
-    // Array field
-    if len(m.events) > 0 {
-        lengthInBits += 8 * uint16(len(m.events))
-    }
+	// Array field
+	if len(m.events) > 0 {
+		lengthInBits += 8 * uint16(len(m.events))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUGetComEventLogResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUGetComEventLogResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // 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 = io.ReadUint8(8)
-
-    // Simple Field (status)
-    var status uint16 = io.ReadUint16(16)
-
-    // Simple Field (eventCount)
-    var eventCount uint16 = io.ReadUint16(16)
-
-    // Simple Field (messageCount)
-    var messageCount uint16 = io.ReadUint16(16)
-
-    // Array field (events)
-    // Count array
-    if (byteCount) - (6) > math.MaxUint8 {
-        throw new ParseException("Array count of " + ((byteCount) - (6)) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] events;
-    {
-        var itemCount := (byteCount) - (6)
-        events = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            events[curItem] = io.ReadInt8(8)
-        }
-    }
-
-    // Create the instance
-    return NewModbusPDUGetComEventLogResponse(status, eventCount, messageCount, events)
-}
+func ModbusPDUGetComEventLogResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
+
+	// 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 = io.ReadUint8(8)
+
+	// Simple Field (status)
+	var status uint16 = io.ReadUint16(16)
+
+	// Simple Field (eventCount)
+	var eventCount uint16 = io.ReadUint16(16)
 
+	// Simple Field (messageCount)
+	var messageCount uint16 = io.ReadUint16(16)
+
+	// Array field (events)
+	var events []int8
+	// Count array
+	{
+		events := make([]int8, (byteCount)-(6))
+		for curItem := uint16(0); curItem < uint16((byteCount)-(6)); curItem++ {
+
+			events[curItem] = io.ReadInt8(8)
+		}
+	}
+
+	// Create the instance
+	return NewModbusPDUGetComEventLogResponse(status, eventCount, messageCount, events), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
index 0e17dbb..ac29a11 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -58,9 +56,7 @@ func (m ModbusPDUMaskWriteHoldingRegisterRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUMaskWriteHoldingRegisterRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUMaskWriteHoldingRegisterRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (referenceAddress)
 	var referenceAddress uint16 = io.ReadUint16(16)
@@ -72,5 +68,5 @@ func ModbusPDUMaskWriteHoldingRegisterRequestParse(io spi.ReadBuffer) ModbusPDUI
 	var orMask uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUMaskWriteHoldingRegisterRequest(referenceAddress, andMask, orMask)
+	return NewModbusPDUMaskWriteHoldingRegisterRequest(referenceAddress, andMask, orMask), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
index 3e3b8f4..eaf896e 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUMaskWriteHoldingRegisterResponse.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -58,9 +56,7 @@ func (m ModbusPDUMaskWriteHoldingRegisterResponse) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUMaskWriteHoldingRegisterResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUMaskWriteHoldingRegisterResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (referenceAddress)
 	var referenceAddress uint16 = io.ReadUint16(16)
@@ -72,5 +68,5 @@ func ModbusPDUMaskWriteHoldingRegisterResponseParse(io spi.ReadBuffer) ModbusPDU
 	var orMask uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUMaskWriteHoldingRegisterResponse(referenceAddress, andMask, orMask)
+	return NewModbusPDUMaskWriteHoldingRegisterResponse(referenceAddress, andMask, orMask), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
index 6d92d32..9be3ec7 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUReadCoilsRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadCoilsRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
 	var startingAddress uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUReadCoilsRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
 	var quantity uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUReadCoilsRequest(startingAddress, quantity)
+	return NewModbusPDUReadCoilsRequest(startingAddress, quantity), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
index f805fa6..f4aeb39 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadCoilsResponse.go
@@ -19,65 +19,56 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadCoilsResponse struct {
-    value []int8
-    ModbusPDU
+	value []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUReadCoilsResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadCoilsResponse(value []int8) ModbusPDUInitializer {
-    return &ModbusPDUReadCoilsResponse{value: value}
+	return &ModbusPDUReadCoilsResponse{value: value}
 }
 
 func (m ModbusPDUReadCoilsResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadCoilsResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadCoilsResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-    // Create the instance
-    return NewModbusPDUReadCoilsResponse(value)
-}
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
 
+	// Create the instance
+	return NewModbusPDUReadCoilsResponse(value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
index 974dca9..1e84908 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -46,10 +44,8 @@ func (m ModbusPDUReadDeviceIdentificationRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadDeviceIdentificationRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadDeviceIdentificationRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Create the instance
-	return NewModbusPDUReadDeviceIdentificationRequest()
+	return NewModbusPDUReadDeviceIdentificationRequest(), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
index 00e999e..69b099e 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDeviceIdentificationResponse.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -46,10 +44,8 @@ func (m ModbusPDUReadDeviceIdentificationResponse) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadDeviceIdentificationResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadDeviceIdentificationResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Create the instance
-	return NewModbusPDUReadDeviceIdentificationResponse()
+	return NewModbusPDUReadDeviceIdentificationResponse(), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
index 00f24a0..d85d551 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUReadDiscreteInputsRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadDiscreteInputsRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadDiscreteInputsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
 	var startingAddress uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUReadDiscreteInputsRequestParse(io spi.ReadBuffer) ModbusPDUInitial
 	var quantity uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUReadDiscreteInputsRequest(startingAddress, quantity)
+	return NewModbusPDUReadDiscreteInputsRequest(startingAddress, quantity), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
index b0b3a78..d1bd499 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadDiscreteInputsResponse.go
@@ -19,65 +19,56 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadDiscreteInputsResponse struct {
-    value []int8
-    ModbusPDU
+	value []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUReadDiscreteInputsResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadDiscreteInputsResponse(value []int8) ModbusPDUInitializer {
-    return &ModbusPDUReadDiscreteInputsResponse{value: value}
+	return &ModbusPDUReadDiscreteInputsResponse{value: value}
 }
 
 func (m ModbusPDUReadDiscreteInputsResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadDiscreteInputsResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadDiscreteInputsResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadDiscreteInputsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-    // Create the instance
-    return NewModbusPDUReadDiscreteInputsResponse(value)
-}
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
 
+	// Create the instance
+	return NewModbusPDUReadDiscreteInputsResponse(value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
index 2151094..f6e37a6 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -46,10 +44,8 @@ func (m ModbusPDUReadExceptionStatusRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadExceptionStatusRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadExceptionStatusRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Create the instance
-	return NewModbusPDUReadExceptionStatusRequest()
+	return NewModbusPDUReadExceptionStatusRequest(), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
index ea6477f..ba35c1a 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadExceptionStatusResponse.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -50,13 +48,11 @@ func (m ModbusPDUReadExceptionStatusResponse) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadExceptionStatusResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadExceptionStatusResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (value)
 	var value uint8 = io.ReadUint8(8)
 
 	// Create the instance
-	return NewModbusPDUReadExceptionStatusResponse(value)
+	return NewModbusPDUReadExceptionStatusResponse(value), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
index e033a96..308da82 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -50,13 +48,11 @@ func (m ModbusPDUReadFifoQueueRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadFifoQueueRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadFifoQueueRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (fifoPointerAddress)
 	var fifoPointerAddress uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUReadFifoQueueRequest(fifoPointerAddress)
+	return NewModbusPDUReadFifoQueueRequest(fifoPointerAddress), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
index c79a244..cb626bb 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFifoQueueResponse.go
@@ -19,71 +19,62 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadFifoQueueResponse struct {
-    fifoValue []uint16
-    ModbusPDU
+	fifoValue []uint16
+	ModbusPDU
 }
 
 func (m ModbusPDUReadFifoQueueResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadFifoQueueResponse(fifoValue []uint16) ModbusPDUInitializer {
-    return &ModbusPDUReadFifoQueueResponse{fifoValue: fifoValue}
+	return &ModbusPDUReadFifoQueueResponse{fifoValue: fifoValue}
 }
 
 func (m ModbusPDUReadFifoQueueResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 16
+	// Implicit Field (byteCount)
+	lengthInBits += 16
 
-    // Implicit Field (fifoCount)
-    lengthInBits += 16
+	// Implicit Field (fifoCount)
+	lengthInBits += 16
 
-    // Array field
-    if len(m.fifoValue) > 0 {
-        lengthInBits += 16 * uint16(len(m.fifoValue))
-    }
+	// Array field
+	if len(m.fifoValue) > 0 {
+		lengthInBits += 16 * uint16(len(m.fifoValue))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadFifoQueueResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadFifoQueueResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // 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 = io.ReadUint16(16)
-
-    // 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 = io.ReadUint16(16)
-
-    // Array field (fifoValue)
-    // Count array
-    if fifoCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (fifoCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    uint16[] fifoValue;
-    {
-        var itemCount := fifoCount
-        fifoValue = new uint16[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            fifoValue[curItem] = io.ReadUint16(16)
-        }
-    }
-
-    // Create the instance
-    return NewModbusPDUReadFifoQueueResponse(fifoValue)
-}
+func ModbusPDUReadFifoQueueResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
+
+	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var _ uint16 = io.ReadUint16(16)
+
+	// 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 = io.ReadUint16(16)
 
+	// Array field (fifoValue)
+	var fifoValue []uint16
+	// Count array
+	{
+		fifoValue := make([]uint16, fifoCount)
+		for curItem := uint16(0); curItem < uint16(fifoCount); curItem++ {
+
+			fifoValue[curItem] = io.ReadUint16(16)
+		}
+	}
+
+	// Create the instance
+	return NewModbusPDUReadFifoQueueResponse(fifoValue), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
index 8517314..a33b3b6 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequest.go
@@ -19,62 +19,67 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"errors"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"reflect"
 )
 
 type ModbusPDUReadFileRecordRequest struct {
-    items []ModbusPDUReadFileRecordRequestItem
-    ModbusPDU
+	items []ModbusPDUReadFileRecordRequestItem
+	ModbusPDU
 }
 
 func (m ModbusPDUReadFileRecordRequest) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadFileRecordRequest(items []ModbusPDUReadFileRecordRequestItem) ModbusPDUInitializer {
-    return &ModbusPDUReadFileRecordRequest{items: items}
+	return &ModbusPDUReadFileRecordRequest{items: items}
 }
 
 func (m ModbusPDUReadFileRecordRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.items) > 0 {
-        for _, element := range m.items {
-            lengthInBits += element.LengthInBits()
-        }
-    }
+	// Array field
+	if len(m.items) > 0 {
+		for _, element := range m.items {
+			lengthInBits += element.LengthInBits()
+		}
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadFileRecordRequest) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadFileRecordRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (items)
-    // Length array
-    var _itemsLength := byteCount
-    List<ModbusPDUReadFileRecordRequestItem> _itemsList = new LinkedList<>();
-    itemsEndPos := io.GetPos() + _itemsLength;
-    for ;io.getPos() < itemsEndPos; {
-        _itemsList.add(ModbusPDUReadFileRecordRequestItemIO.staticParse(io));
-    }
-    ModbusPDUReadFileRecordRequestItem[] items = _itemsList.toArray(new ModbusPDUReadFileRecordRequestItem[0])
+	// Array field (items)
+	var items []ModbusPDUReadFileRecordRequestItem
+	// Length array
+	_itemsLength := uint16(byteCount)
+	_itemsEndPos := io.GetPos() + _itemsLength
+	for io.GetPos() < _itemsEndPos {
+		_message, _err := ModbusPDUReadFileRecordRequestItemParse(io)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'items' field " + _err.Error())
+		}
+		var _item ModbusPDUReadFileRecordRequestItem
+		_item, _ok := _message.(ModbusPDUReadFileRecordRequestItem)
+		if !_ok {
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUReadFileRecordRequestItem")
+		}
+		items = append(items, _item)
+	}
 
-    // Create the instance
-    return NewModbusPDUReadFileRecordRequest(items)
+	// Create the instance
+	return NewModbusPDUReadFileRecordRequest(items), nil
 }
-
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
index 7440503..0fc1b51 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordRequestItem.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -57,9 +55,7 @@ func (m ModbusPDUReadFileRecordRequestItem) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadFileRecordRequestItemParse(io spi.ReadBuffer) spi.Message {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (referenceType)
 	var referenceType uint8 = io.ReadUint8(8)
@@ -74,5 +70,5 @@ func ModbusPDUReadFileRecordRequestItemParse(io spi.ReadBuffer) spi.Message {
 	var recordLength uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUReadFileRecordRequestItem(referenceType, fileNumber, recordNumber, recordLength)
+	return NewModbusPDUReadFileRecordRequestItem(referenceType, fileNumber, recordNumber, recordLength), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
index a0b522e..90548ce 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponse.go
@@ -19,62 +19,67 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"errors"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"reflect"
 )
 
 type ModbusPDUReadFileRecordResponse struct {
-    items []ModbusPDUReadFileRecordResponseItem
-    ModbusPDU
+	items []ModbusPDUReadFileRecordResponseItem
+	ModbusPDU
 }
 
 func (m ModbusPDUReadFileRecordResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadFileRecordResponse(items []ModbusPDUReadFileRecordResponseItem) ModbusPDUInitializer {
-    return &ModbusPDUReadFileRecordResponse{items: items}
+	return &ModbusPDUReadFileRecordResponse{items: items}
 }
 
 func (m ModbusPDUReadFileRecordResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.items) > 0 {
-        for _, element := range m.items {
-            lengthInBits += element.LengthInBits()
-        }
-    }
+	// Array field
+	if len(m.items) > 0 {
+		for _, element := range m.items {
+			lengthInBits += element.LengthInBits()
+		}
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadFileRecordResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadFileRecordResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (items)
-    // Length array
-    var _itemsLength := byteCount
-    List<ModbusPDUReadFileRecordResponseItem> _itemsList = new LinkedList<>();
-    itemsEndPos := io.GetPos() + _itemsLength;
-    for ;io.getPos() < itemsEndPos; {
-        _itemsList.add(ModbusPDUReadFileRecordResponseItemIO.staticParse(io));
-    }
-    ModbusPDUReadFileRecordResponseItem[] items = _itemsList.toArray(new ModbusPDUReadFileRecordResponseItem[0])
+	// Array field (items)
+	var items []ModbusPDUReadFileRecordResponseItem
+	// Length array
+	_itemsLength := uint16(byteCount)
+	_itemsEndPos := io.GetPos() + _itemsLength
+	for io.GetPos() < _itemsEndPos {
+		_message, _err := ModbusPDUReadFileRecordResponseItemParse(io)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'items' field " + _err.Error())
+		}
+		var _item ModbusPDUReadFileRecordResponseItem
+		_item, _ok := _message.(ModbusPDUReadFileRecordResponseItem)
+		if !_ok {
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUReadFileRecordResponseItem")
+		}
+		items = append(items, _item)
+	}
 
-    // Create the instance
-    return NewModbusPDUReadFileRecordResponse(items)
+	// Create the instance
+	return NewModbusPDUReadFileRecordResponse(items), nil
 }
-
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
index 7ebc23f..aff7e2e 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadFileRecordResponseItem.go
@@ -19,67 +19,56 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadFileRecordResponseItem struct {
-    referenceType uint8
-    data []int8
-
+	referenceType uint8
+	data          []int8
 }
 
-
 func NewModbusPDUReadFileRecordResponseItem(referenceType uint8, data []int8) spi.Message {
-    return &ModbusPDUReadFileRecordResponseItem{referenceType: referenceType, data: data}
+	return &ModbusPDUReadFileRecordResponseItem{referenceType: referenceType, data: data}
 }
 
 func (m ModbusPDUReadFileRecordResponseItem) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+	var lengthInBits uint16 = 0
 
-    // Implicit Field (dataLength)
-    lengthInBits += 8
+	// Implicit Field (dataLength)
+	lengthInBits += 8
 
-    // Simple field (referenceType)
-    lengthInBits += 8
+	// Simple field (referenceType)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.data) > 0 {
-        lengthInBits += 8 * uint16(len(m.data))
-    }
+	// Array field
+	if len(m.data) > 0 {
+		lengthInBits += 8 * uint16(len(m.data))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadFileRecordResponseItem) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadFileRecordResponseItemParse(io spi.ReadBuffer) spi.Message {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Simple Field (referenceType)
-    var referenceType uint8 = io.ReadUint8(8)
+	// Simple Field (referenceType)
+	var referenceType uint8 = io.ReadUint8(8)
 
-    // Array field (data)
-    // Length array
-    var _dataLength := (dataLength) - (1)
-    List<int8> _dataList = new LinkedList<>();
-    dataEndPos := io.GetPos() + _dataLength;
-    for ;io.getPos() < dataEndPos; {
-        _dataList.add(io.ReadInt8(8));
-    }
-    int8[] data = new int8[_dataList.size()]
-    for i := 0; i < _dataList.size(); i++ {
-        data[i] = (int8) _dataList.get(i)
-    }
+	// Array field (data)
+	var data []int8
+	// Length array
+	_dataLength := uint16((dataLength) - (1))
+	_dataEndPos := io.GetPos() + _dataLength
+	for io.GetPos() < _dataEndPos {
+		data = append(data, io.ReadInt8(8))
+	}
 
-    // Create the instance
-    return NewModbusPDUReadFileRecordResponseItem(referenceType, data)
+	// Create the instance
+	return NewModbusPDUReadFileRecordResponseItem(referenceType, data), nil
 }
-
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
index 910cb2b..05ccfc6 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUReadHoldingRegistersRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadHoldingRegistersRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
 	var startingAddress uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUReadHoldingRegistersRequestParse(io spi.ReadBuffer) ModbusPDUIniti
 	var quantity uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUReadHoldingRegistersRequest(startingAddress, quantity)
+	return NewModbusPDUReadHoldingRegistersRequest(startingAddress, quantity), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
index de21e38..6fcb99e 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadHoldingRegistersResponse.go
@@ -19,65 +19,56 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadHoldingRegistersResponse struct {
-    value []int8
-    ModbusPDU
+	value []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUReadHoldingRegistersResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadHoldingRegistersResponse(value []int8) ModbusPDUInitializer {
-    return &ModbusPDUReadHoldingRegistersResponse{value: value}
+	return &ModbusPDUReadHoldingRegistersResponse{value: value}
 }
 
 func (m ModbusPDUReadHoldingRegistersResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadHoldingRegistersResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadHoldingRegistersResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-    // Create the instance
-    return NewModbusPDUReadHoldingRegistersResponse(value)
-}
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
 
+	// Create the instance
+	return NewModbusPDUReadHoldingRegistersResponse(value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
index fb1af49..15384d3 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUReadInputRegistersRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadInputRegistersRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReadInputRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
 	var startingAddress uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUReadInputRegistersRequestParse(io spi.ReadBuffer) ModbusPDUInitial
 	var quantity uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUReadInputRegistersRequest(startingAddress, quantity)
+	return NewModbusPDUReadInputRegistersRequest(startingAddress, quantity), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
index 67596f5..ce92920 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadInputRegistersResponse.go
@@ -19,65 +19,56 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadInputRegistersResponse struct {
-    value []int8
-    ModbusPDU
+	value []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUReadInputRegistersResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadInputRegistersResponse(value []int8) ModbusPDUInitializer {
-    return &ModbusPDUReadInputRegistersResponse{value: value}
+	return &ModbusPDUReadInputRegistersResponse{value: value}
 }
 
 func (m ModbusPDUReadInputRegistersResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadInputRegistersResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadInputRegistersResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadInputRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-    // Create the instance
-    return NewModbusPDUReadInputRegistersResponse(value)
-}
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
 
+	// Create the instance
+	return NewModbusPDUReadInputRegistersResponse(value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
index 585f002..b39a4bd 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
@@ -19,93 +19,84 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadWriteMultipleHoldingRegistersRequest struct {
-    readStartingAddress uint16
-    readQuantity uint16
-    writeStartingAddress uint16
-    writeQuantity uint16
-    value []int8
-    ModbusPDU
+	readStartingAddress  uint16
+	readQuantity         uint16
+	writeStartingAddress uint16
+	writeQuantity        uint16
+	value                []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadWriteMultipleHoldingRegistersRequest(readStartingAddress uint16, readQuantity uint16, writeStartingAddress uint16, writeQuantity uint16, value []int8) ModbusPDUInitializer {
-    return &ModbusPDUReadWriteMultipleHoldingRegistersRequest{readStartingAddress: readStartingAddress, readQuantity: readQuantity, writeStartingAddress: writeStartingAddress, writeQuantity: writeQuantity, value: value}
+	return &ModbusPDUReadWriteMultipleHoldingRegistersRequest{readStartingAddress: readStartingAddress, readQuantity: readQuantity, writeStartingAddress: writeStartingAddress, writeQuantity: writeQuantity, value: value}
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Simple field (readStartingAddress)
-    lengthInBits += 16
+	// Simple field (readStartingAddress)
+	lengthInBits += 16
 
-    // Simple field (readQuantity)
-    lengthInBits += 16
+	// Simple field (readQuantity)
+	lengthInBits += 16
 
-    // Simple field (writeStartingAddress)
-    lengthInBits += 16
+	// Simple field (writeStartingAddress)
+	lengthInBits += 16
 
-    // Simple field (writeQuantity)
-    lengthInBits += 16
+	// Simple field (writeQuantity)
+	lengthInBits += 16
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // Simple Field (readStartingAddress)
-    var readStartingAddress uint16 = io.ReadUint16(16)
-
-    // Simple Field (readQuantity)
-    var readQuantity uint16 = io.ReadUint16(16)
-
-    // Simple Field (writeStartingAddress)
-    var writeStartingAddress uint16 = io.ReadUint16(16)
-
-    // Simple Field (writeQuantity)
-    var writeQuantity uint16 = io.ReadUint16(16)
-
-    // 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 = io.ReadUint8(8)
-
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
-
-    // Create the instance
-    return NewModbusPDUReadWriteMultipleHoldingRegistersRequest(readStartingAddress, readQuantity, writeStartingAddress, writeQuantity, value)
-}
+func ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
+
+	// Simple Field (readStartingAddress)
+	var readStartingAddress uint16 = io.ReadUint16(16)
+
+	// Simple Field (readQuantity)
+	var readQuantity uint16 = io.ReadUint16(16)
+
+	// Simple Field (writeStartingAddress)
+	var writeStartingAddress uint16 = io.ReadUint16(16)
+
+	// Simple Field (writeQuantity)
+	var writeQuantity uint16 = io.ReadUint16(16)
 
+	// 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 = io.ReadUint8(8)
+
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
+
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
+
+	// Create the instance
+	return NewModbusPDUReadWriteMultipleHoldingRegistersRequest(readStartingAddress, readQuantity, writeStartingAddress, writeQuantity, value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
index 2be4f5a..4fc0393 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
@@ -19,65 +19,56 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReadWriteMultipleHoldingRegistersResponse struct {
-    value []int8
-    ModbusPDU
+	value []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReadWriteMultipleHoldingRegistersResponse(value []int8) ModbusPDUInitializer {
-    return &ModbusPDUReadWriteMultipleHoldingRegistersResponse{value: value}
+	return &ModbusPDUReadWriteMultipleHoldingRegistersResponse{value: value}
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-    // Create the instance
-    return NewModbusPDUReadWriteMultipleHoldingRegistersResponse(value)
-}
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
 
+	// Create the instance
+	return NewModbusPDUReadWriteMultipleHoldingRegistersResponse(value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
index ada56de..07f08f0 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -46,10 +44,8 @@ func (m ModbusPDUReportServerIdRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReportServerIdRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUReportServerIdRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Create the instance
-	return NewModbusPDUReportServerIdRequest()
+	return NewModbusPDUReportServerIdRequest(), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
index 22e2ece..8143fbb 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUReportServerIdResponse.go
@@ -19,65 +19,56 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUReportServerIdResponse struct {
-    value []int8
-    ModbusPDU
+	value []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUReportServerIdResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUReportServerIdResponse(value []int8) ModbusPDUInitializer {
-    return &ModbusPDUReportServerIdResponse{value: value}
+	return &ModbusPDUReportServerIdResponse{value: value}
 }
 
 func (m ModbusPDUReportServerIdResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUReportServerIdResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUReportServerIdResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUReportServerIdResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-    // Create the instance
-    return NewModbusPDUReportServerIdResponse(value)
-}
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
 
+	// Create the instance
+	return NewModbusPDUReportServerIdResponse(value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
index 484d933..8c7371f 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequest.go
@@ -19,62 +19,67 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"errors"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"reflect"
 )
 
 type ModbusPDUWriteFileRecordRequest struct {
-    items []ModbusPDUWriteFileRecordRequestItem
-    ModbusPDU
+	items []ModbusPDUWriteFileRecordRequestItem
+	ModbusPDU
 }
 
 func (m ModbusPDUWriteFileRecordRequest) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUWriteFileRecordRequest(items []ModbusPDUWriteFileRecordRequestItem) ModbusPDUInitializer {
-    return &ModbusPDUWriteFileRecordRequest{items: items}
+	return &ModbusPDUWriteFileRecordRequest{items: items}
 }
 
 func (m ModbusPDUWriteFileRecordRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.items) > 0 {
-        for _, element := range m.items {
-            lengthInBits += element.LengthInBits()
-        }
-    }
+	// Array field
+	if len(m.items) > 0 {
+		for _, element := range m.items {
+			lengthInBits += element.LengthInBits()
+		}
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUWriteFileRecordRequest) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteFileRecordRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUWriteFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (items)
-    // Length array
-    var _itemsLength := byteCount
-    List<ModbusPDUWriteFileRecordRequestItem> _itemsList = new LinkedList<>();
-    itemsEndPos := io.GetPos() + _itemsLength;
-    for ;io.getPos() < itemsEndPos; {
-        _itemsList.add(ModbusPDUWriteFileRecordRequestItemIO.staticParse(io));
-    }
-    ModbusPDUWriteFileRecordRequestItem[] items = _itemsList.toArray(new ModbusPDUWriteFileRecordRequestItem[0])
+	// Array field (items)
+	var items []ModbusPDUWriteFileRecordRequestItem
+	// Length array
+	_itemsLength := uint16(byteCount)
+	_itemsEndPos := io.GetPos() + _itemsLength
+	for io.GetPos() < _itemsEndPos {
+		_message, _err := ModbusPDUWriteFileRecordRequestItemParse(io)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'items' field " + _err.Error())
+		}
+		var _item ModbusPDUWriteFileRecordRequestItem
+		_item, _ok := _message.(ModbusPDUWriteFileRecordRequestItem)
+		if !_ok {
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUWriteFileRecordRequestItem")
+		}
+		items = append(items, _item)
+	}
 
-    // Create the instance
-    return NewModbusPDUWriteFileRecordRequest(items)
+	// Create the instance
+	return NewModbusPDUWriteFileRecordRequest(items), nil
 }
-
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
index c134a14..fe2496f 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordRequestItem.go
@@ -19,81 +19,70 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUWriteFileRecordRequestItem struct {
-    referenceType uint8
-    fileNumber uint16
-    recordNumber uint16
-    recordData []int8
-
+	referenceType uint8
+	fileNumber    uint16
+	recordNumber  uint16
+	recordData    []int8
 }
 
-
 func NewModbusPDUWriteFileRecordRequestItem(referenceType uint8, fileNumber uint16, recordNumber uint16, recordData []int8) spi.Message {
-    return &ModbusPDUWriteFileRecordRequestItem{referenceType: referenceType, fileNumber: fileNumber, recordNumber: recordNumber, recordData: recordData}
+	return &ModbusPDUWriteFileRecordRequestItem{referenceType: referenceType, fileNumber: fileNumber, recordNumber: recordNumber, recordData: recordData}
 }
 
 func (m ModbusPDUWriteFileRecordRequestItem) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+	var lengthInBits uint16 = 0
 
-    // Simple field (referenceType)
-    lengthInBits += 8
+	// Simple field (referenceType)
+	lengthInBits += 8
 
-    // Simple field (fileNumber)
-    lengthInBits += 16
+	// Simple field (fileNumber)
+	lengthInBits += 16
 
-    // Simple field (recordNumber)
-    lengthInBits += 16
+	// Simple field (recordNumber)
+	lengthInBits += 16
 
-    // Implicit Field (recordLength)
-    lengthInBits += 16
+	// Implicit Field (recordLength)
+	lengthInBits += 16
 
-    // Array field
-    if len(m.recordData) > 0 {
-        lengthInBits += 8 * uint16(len(m.recordData))
-    }
+	// Array field
+	if len(m.recordData) > 0 {
+		lengthInBits += 8 * uint16(len(m.recordData))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUWriteFileRecordRequestItem) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteFileRecordRequestItemParse(io spi.ReadBuffer) spi.Message {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // Simple Field (referenceType)
-    var referenceType uint8 = io.ReadUint8(8)
-
-    // Simple Field (fileNumber)
-    var fileNumber uint16 = io.ReadUint16(16)
-
-    // Simple Field (recordNumber)
-    var recordNumber uint16 = io.ReadUint16(16)
-
-    // 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 = io.ReadUint16(16)
-
-    // Array field (recordData)
-    // Length array
-    var _recordDataLength := (recordLength) * (2)
-    List<int8> _recordDataList = new LinkedList<>();
-    recordDataEndPos := io.GetPos() + _recordDataLength;
-    for ;io.getPos() < recordDataEndPos; {
-        _recordDataList.add(io.ReadInt8(8));
-    }
-    int8[] recordData = new int8[_recordDataList.size()]
-    for i := 0; i < _recordDataList.size(); i++ {
-        recordData[i] = (int8) _recordDataList.get(i)
-    }
-
-    // Create the instance
-    return NewModbusPDUWriteFileRecordRequestItem(referenceType, fileNumber, recordNumber, recordData)
-}
+func ModbusPDUWriteFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, error) {
+
+	// Simple Field (referenceType)
+	var referenceType uint8 = io.ReadUint8(8)
+
+	// Simple Field (fileNumber)
+	var fileNumber uint16 = io.ReadUint16(16)
 
+	// Simple Field (recordNumber)
+	var recordNumber uint16 = io.ReadUint16(16)
+
+	// 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 = io.ReadUint16(16)
+
+	// Array field (recordData)
+	var recordData []int8
+	// Length array
+	_recordDataLength := uint16((recordLength) * (2))
+	_recordDataEndPos := io.GetPos() + _recordDataLength
+	for io.GetPos() < _recordDataEndPos {
+		recordData = append(recordData, io.ReadInt8(8))
+	}
+
+	// Create the instance
+	return NewModbusPDUWriteFileRecordRequestItem(referenceType, fileNumber, recordNumber, recordData), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
index f25b5ec..a322714 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponse.go
@@ -19,62 +19,67 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"errors"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"reflect"
 )
 
 type ModbusPDUWriteFileRecordResponse struct {
-    items []ModbusPDUWriteFileRecordResponseItem
-    ModbusPDU
+	items []ModbusPDUWriteFileRecordResponseItem
+	ModbusPDU
 }
 
 func (m ModbusPDUWriteFileRecordResponse) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUWriteFileRecordResponse(items []ModbusPDUWriteFileRecordResponseItem) ModbusPDUInitializer {
-    return &ModbusPDUWriteFileRecordResponse{items: items}
+	return &ModbusPDUWriteFileRecordResponse{items: items}
 }
 
 func (m ModbusPDUWriteFileRecordResponse) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.items) > 0 {
-        for _, element := range m.items {
-            lengthInBits += element.LengthInBits()
-        }
-    }
+	// Array field
+	if len(m.items) > 0 {
+		for _, element := range m.items {
+			lengthInBits += element.LengthInBits()
+		}
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUWriteFileRecordResponse) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteFileRecordResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
+func ModbusPDUWriteFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
-    // 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 = io.ReadUint8(8)
+	// 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 = io.ReadUint8(8)
 
-    // Array field (items)
-    // Length array
-    var _itemsLength := byteCount
-    List<ModbusPDUWriteFileRecordResponseItem> _itemsList = new LinkedList<>();
-    itemsEndPos := io.GetPos() + _itemsLength;
-    for ;io.getPos() < itemsEndPos; {
-        _itemsList.add(ModbusPDUWriteFileRecordResponseItemIO.staticParse(io));
-    }
-    ModbusPDUWriteFileRecordResponseItem[] items = _itemsList.toArray(new ModbusPDUWriteFileRecordResponseItem[0])
+	// Array field (items)
+	var items []ModbusPDUWriteFileRecordResponseItem
+	// Length array
+	_itemsLength := uint16(byteCount)
+	_itemsEndPos := io.GetPos() + _itemsLength
+	for io.GetPos() < _itemsEndPos {
+		_message, _err := ModbusPDUWriteFileRecordResponseItemParse(io)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'items' field " + _err.Error())
+		}
+		var _item ModbusPDUWriteFileRecordResponseItem
+		_item, _ok := _message.(ModbusPDUWriteFileRecordResponseItem)
+		if !_ok {
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUWriteFileRecordResponseItem")
+		}
+		items = append(items, _item)
+	}
 
-    // Create the instance
-    return NewModbusPDUWriteFileRecordResponse(items)
+	// Create the instance
+	return NewModbusPDUWriteFileRecordResponse(items), nil
 }
-
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
index 7c4848b..c526a49 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteFileRecordResponseItem.go
@@ -19,81 +19,70 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUWriteFileRecordResponseItem struct {
-    referenceType uint8
-    fileNumber uint16
-    recordNumber uint16
-    recordData []int8
-
+	referenceType uint8
+	fileNumber    uint16
+	recordNumber  uint16
+	recordData    []int8
 }
 
-
 func NewModbusPDUWriteFileRecordResponseItem(referenceType uint8, fileNumber uint16, recordNumber uint16, recordData []int8) spi.Message {
-    return &ModbusPDUWriteFileRecordResponseItem{referenceType: referenceType, fileNumber: fileNumber, recordNumber: recordNumber, recordData: recordData}
+	return &ModbusPDUWriteFileRecordResponseItem{referenceType: referenceType, fileNumber: fileNumber, recordNumber: recordNumber, recordData: recordData}
 }
 
 func (m ModbusPDUWriteFileRecordResponseItem) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+	var lengthInBits uint16 = 0
 
-    // Simple field (referenceType)
-    lengthInBits += 8
+	// Simple field (referenceType)
+	lengthInBits += 8
 
-    // Simple field (fileNumber)
-    lengthInBits += 16
+	// Simple field (fileNumber)
+	lengthInBits += 16
 
-    // Simple field (recordNumber)
-    lengthInBits += 16
+	// Simple field (recordNumber)
+	lengthInBits += 16
 
-    // Implicit Field (recordLength)
-    lengthInBits += 16
+	// Implicit Field (recordLength)
+	lengthInBits += 16
 
-    // Array field
-    if len(m.recordData) > 0 {
-        lengthInBits += 8 * uint16(len(m.recordData))
-    }
+	// Array field
+	if len(m.recordData) > 0 {
+		lengthInBits += 8 * uint16(len(m.recordData))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUWriteFileRecordResponseItem) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteFileRecordResponseItemParse(io spi.ReadBuffer) spi.Message {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // Simple Field (referenceType)
-    var referenceType uint8 = io.ReadUint8(8)
-
-    // Simple Field (fileNumber)
-    var fileNumber uint16 = io.ReadUint16(16)
-
-    // Simple Field (recordNumber)
-    var recordNumber uint16 = io.ReadUint16(16)
-
-    // 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 = io.ReadUint16(16)
-
-    // Array field (recordData)
-    // Length array
-    var _recordDataLength := recordLength
-    List<int8> _recordDataList = new LinkedList<>();
-    recordDataEndPos := io.GetPos() + _recordDataLength;
-    for ;io.getPos() < recordDataEndPos; {
-        _recordDataList.add(io.ReadInt8(8));
-    }
-    int8[] recordData = new int8[_recordDataList.size()]
-    for i := 0; i < _recordDataList.size(); i++ {
-        recordData[i] = (int8) _recordDataList.get(i)
-    }
-
-    // Create the instance
-    return NewModbusPDUWriteFileRecordResponseItem(referenceType, fileNumber, recordNumber, recordData)
-}
+func ModbusPDUWriteFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message, error) {
+
+	// Simple Field (referenceType)
+	var referenceType uint8 = io.ReadUint8(8)
+
+	// Simple Field (fileNumber)
+	var fileNumber uint16 = io.ReadUint16(16)
 
+	// Simple Field (recordNumber)
+	var recordNumber uint16 = io.ReadUint16(16)
+
+	// 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 = io.ReadUint16(16)
+
+	// Array field (recordData)
+	var recordData []int8
+	// Length array
+	_recordDataLength := uint16(recordLength)
+	_recordDataEndPos := io.GetPos() + _recordDataLength
+	for io.GetPos() < _recordDataEndPos {
+		recordData = append(recordData, io.ReadInt8(8))
+	}
+
+	// Create the instance
+	return NewModbusPDUWriteFileRecordResponseItem(referenceType, fileNumber, recordNumber, recordData), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
index 25bf05a..9b2a141 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsRequest.go
@@ -19,79 +19,70 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUWriteMultipleCoilsRequest struct {
-    startingAddress uint16
-    quantity uint16
-    value []int8
-    ModbusPDU
+	startingAddress uint16
+	quantity        uint16
+	value           []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUWriteMultipleCoilsRequest) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUWriteMultipleCoilsRequest(startingAddress uint16, quantity uint16, value []int8) ModbusPDUInitializer {
-    return &ModbusPDUWriteMultipleCoilsRequest{startingAddress: startingAddress, quantity: quantity, value: value}
+	return &ModbusPDUWriteMultipleCoilsRequest{startingAddress: startingAddress, quantity: quantity, value: value}
 }
 
 func (m ModbusPDUWriteMultipleCoilsRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Simple field (startingAddress)
-    lengthInBits += 16
+	// Simple field (startingAddress)
+	lengthInBits += 16
 
-    // Simple field (quantity)
-    lengthInBits += 16
+	// Simple field (quantity)
+	lengthInBits += 16
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUWriteMultipleCoilsRequest) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteMultipleCoilsRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // Simple Field (startingAddress)
-    var startingAddress uint16 = io.ReadUint16(16)
-
-    // Simple Field (quantity)
-    var quantity uint16 = io.ReadUint16(16)
-
-    // 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 = io.ReadUint8(8)
-
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
-
-    // Create the instance
-    return NewModbusPDUWriteMultipleCoilsRequest(startingAddress, quantity, value)
-}
+func ModbusPDUWriteMultipleCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = io.ReadUint16(16)
+
+	// Simple Field (quantity)
+	var quantity uint16 = io.ReadUint16(16)
+
+	// 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 = io.ReadUint8(8)
 
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
+
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
+
+	// Create the instance
+	return NewModbusPDUWriteMultipleCoilsRequest(startingAddress, quantity, value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
index c4e48a5..a7efa42 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleCoilsResponse.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUWriteMultipleCoilsResponse) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteMultipleCoilsResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUWriteMultipleCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
 	var startingAddress uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUWriteMultipleCoilsResponseParse(io spi.ReadBuffer) ModbusPDUInitia
 	var quantity uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUWriteMultipleCoilsResponse(startingAddress, quantity)
+	return NewModbusPDUWriteMultipleCoilsResponse(startingAddress, quantity), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
index ba8010a..b84def7 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersRequest.go
@@ -19,79 +19,70 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
 type ModbusPDUWriteMultipleHoldingRegistersRequest struct {
-    startingAddress uint16
-    quantity uint16
-    value []int8
-    ModbusPDU
+	startingAddress uint16
+	quantity        uint16
+	value           []int8
+	ModbusPDU
 }
 
 func (m ModbusPDUWriteMultipleHoldingRegistersRequest) initialize() spi.Message {
-    return spi.Message(m)
+	return spi.Message(m)
 }
 
 func NewModbusPDUWriteMultipleHoldingRegistersRequest(startingAddress uint16, quantity uint16, value []int8) ModbusPDUInitializer {
-    return &ModbusPDUWriteMultipleHoldingRegistersRequest{startingAddress: startingAddress, quantity: quantity, value: value}
+	return &ModbusPDUWriteMultipleHoldingRegistersRequest{startingAddress: startingAddress, quantity: quantity, value: value}
 }
 
 func (m ModbusPDUWriteMultipleHoldingRegistersRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
+	var lengthInBits uint16 = m.ModbusPDU.LengthInBits()
 
-    // Simple field (startingAddress)
-    lengthInBits += 16
+	// Simple field (startingAddress)
+	lengthInBits += 16
 
-    // Simple field (quantity)
-    lengthInBits += 16
+	// Simple field (quantity)
+	lengthInBits += 16
 
-    // Implicit Field (byteCount)
-    lengthInBits += 8
+	// Implicit Field (byteCount)
+	lengthInBits += 8
 
-    // Array field
-    if len(m.value) > 0 {
-        lengthInBits += 8 * uint16(len(m.value))
-    }
+	// Array field
+	if len(m.value) > 0 {
+		lengthInBits += 8 * uint16(len(m.value))
+	}
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusPDUWriteMultipleHoldingRegistersRequest) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // Simple Field (startingAddress)
-    var startingAddress uint16 = io.ReadUint16(16)
-
-    // Simple Field (quantity)
-    var quantity uint16 = io.ReadUint16(16)
-
-    // 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 = io.ReadUint8(8)
-
-    // Array field (value)
-    // Count array
-    if byteCount > math.MaxUint8 {
-        throw new ParseException("Array count of " + (byteCount) + " exceeds the maximum allowed count of " + math.MaxUint8);
-    }
-    int8[] value;
-    {
-        var itemCount := byteCount
-        value = new int8[itemCount]
-        for curItem := 0; curItem < itemCount; curItem++ {
-            
-            value[curItem] = io.ReadInt8(8)
-        }
-    }
-
-    // Create the instance
-    return NewModbusPDUWriteMultipleHoldingRegistersRequest(startingAddress, quantity, value)
-}
+func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
+
+	// Simple Field (startingAddress)
+	var startingAddress uint16 = io.ReadUint16(16)
+
+	// Simple Field (quantity)
+	var quantity uint16 = io.ReadUint16(16)
+
+	// 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 = io.ReadUint8(8)
 
+	// Array field (value)
+	var value []int8
+	// Count array
+	{
+		value := make([]int8, byteCount)
+		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
+
+			value[curItem] = io.ReadInt8(8)
+		}
+	}
+
+	// Create the instance
+	return NewModbusPDUWriteMultipleHoldingRegistersRequest(startingAddress, quantity, value), nil
+}
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
index 9de42c6..cf96414 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteMultipleHoldingRegistersResponse.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUWriteMultipleHoldingRegistersResponse) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
 	var startingAddress uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) Modb
 	var quantity uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUWriteMultipleHoldingRegistersResponse(startingAddress, quantity)
+	return NewModbusPDUWriteMultipleHoldingRegistersResponse(startingAddress, quantity), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
index 868d22a..76c610e 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUWriteSingleCoilRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteSingleCoilRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUWriteSingleCoilRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
 	var address uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUWriteSingleCoilRequestParse(io spi.ReadBuffer) ModbusPDUInitialize
 	var value uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUWriteSingleCoilRequest(address, value)
+	return NewModbusPDUWriteSingleCoilRequest(address, value), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
index 83ad56f..4a8f4aa 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleCoilResponse.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUWriteSingleCoilResponse) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteSingleCoilResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUWriteSingleCoilResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
 	var address uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUWriteSingleCoilResponseParse(io spi.ReadBuffer) ModbusPDUInitializ
 	var value uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUWriteSingleCoilResponse(address, value)
+	return NewModbusPDUWriteSingleCoilResponse(address, value), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
index 6ca3bf0..7e66236 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterRequest.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUWriteSingleRegisterRequest) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteSingleRegisterRequestParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUWriteSingleRegisterRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
 	var address uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUWriteSingleRegisterRequestParse(io spi.ReadBuffer) ModbusPDUInitia
 	var value uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUWriteSingleRegisterRequest(address, value)
+	return NewModbusPDUWriteSingleRegisterRequest(address, value), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
index 086187f..0786e57 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusPDUWriteSingleRegisterResponse.go
@@ -19,8 +19,6 @@
 package readwrite
 
 import (
-	log "github.com/sirupsen/logrus"
-	"math"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
 )
 
@@ -54,9 +52,7 @@ func (m ModbusPDUWriteSingleRegisterResponse) LengthInBytes() uint16 {
 	return m.LengthInBits() / 8
 }
 
-func ModbusPDUWriteSingleRegisterResponseParse(io spi.ReadBuffer) ModbusPDUInitializer {
-	var startPos = io.GetPos()
-	var curPos uint16
+func ModbusPDUWriteSingleRegisterResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
 	var address uint16 = io.ReadUint16(16)
@@ -65,5 +61,5 @@ func ModbusPDUWriteSingleRegisterResponseParse(io spi.ReadBuffer) ModbusPDUIniti
 	var value uint16 = io.ReadUint16(16)
 
 	// Create the instance
-	return NewModbusPDUWriteSingleRegisterResponse(address, value)
+	return NewModbusPDUWriteSingleRegisterResponse(address, value), nil
 }
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusSerialADU.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusSerialADU.go
index d9ef8c0..f678406 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusSerialADU.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusSerialADU.go
@@ -19,87 +19,81 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
-    "reflect"
+	"errors"
+	log "github.com/sirupsen/logrus"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"reflect"
 )
 
 type ModbusSerialADU struct {
-    transactionId uint16
-    length uint16
-    address uint8
-    pdu ModbusPDU
-
+	transactionId uint16
+	length        uint16
+	address       uint8
+	pdu           ModbusPDU
 }
 
-
 func NewModbusSerialADU(transactionId uint16, length uint16, address uint8, pdu ModbusPDU) spi.Message {
-    return &ModbusSerialADU{transactionId: transactionId, length: length, address: address, pdu: pdu}
+	return &ModbusSerialADU{transactionId: transactionId, length: length, address: address, pdu: pdu}
 }
 
 func (m ModbusSerialADU) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+	var lengthInBits uint16 = 0
 
-    // Simple field (transactionId)
-    lengthInBits += 16
+	// Simple field (transactionId)
+	lengthInBits += 16
 
-    // Reserved Field (reserved)
-    lengthInBits += 16
+	// Reserved Field (reserved)
+	lengthInBits += 16
 
-    // Simple field (length)
-    lengthInBits += 16
+	// Simple field (length)
+	lengthInBits += 16
 
-    // Simple field (address)
-    lengthInBits += 8
+	// Simple field (address)
+	lengthInBits += 8
 
-    // Simple field (pdu)
-    lengthInBits += m.pdu.LengthInBits()
+	// Simple field (pdu)
+	lengthInBits += m.pdu.LengthInBits()
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusSerialADU) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusSerialADUParse(io spi.ReadBuffer, response bool) spi.Message {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // Simple Field (transactionId)
-    var transactionId uint16 = io.ReadUint16(16)
-
-    // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
-    {
-        var reserved uint16 = io.ReadUint16(16)
-        if reserved != uint16(0x0000) {
-            log.WithFields(log.Fields{
-                "expected value": uint16(0x0000),
-                "got value": reserved,
-            }).Info("Got unexpected response.")
-        }
-    }
-
-    // Simple Field (length)
-    var length uint16 = io.ReadUint16(16)
-
-    // Simple Field (address)
-    var address uint8 = io.ReadUint8(8)
-
-    // Simple Field (pdu)
-    var _pduMessage spi.Message = ModbusPDUParse(io, bool(response))
-    var pdu ModbusPDU
-    pdu, _pduOk := _pduMessage.(ModbusPDU)
-    if !_pduOk {
-        log.WithFields(log.Fields{
-            "expected type": "ModbusPDU",
-            "got type": reflect.TypeOf(_pduMessage),
-        }).Error("Couldn't cast message")
-        throw new RuntimeException()
-    }
-
-    // Create the instance
-    return NewModbusSerialADU(transactionId, length, address, pdu)
+func ModbusSerialADUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
+
+	// Simple Field (transactionId)
+	var transactionId uint16 = io.ReadUint16(16)
+
+	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
+	{
+		var reserved uint16 = io.ReadUint16(16)
+		if reserved != uint16(0x0000) {
+			log.WithFields(log.Fields{
+				"expected value": uint16(0x0000),
+				"got value":      reserved,
+			}).Info("Got unexpected response.")
+		}
+	}
+
+	// Simple Field (length)
+	var length uint16 = io.ReadUint16(16)
+
+	// Simple Field (address)
+	var address uint8 = io.ReadUint8(8)
+
+	// Simple Field (pdu)
+	_pduMessage, _err := ModbusPDUParse(io, bool(response))
+	if _err != nil {
+		return nil, errors.New("Error parsing simple field 'pdu'. " + _err.Error())
+	}
+	var pdu ModbusPDU
+	pdu, _pduOk := _pduMessage.(ModbusPDU)
+	if !_pduOk {
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_pduMessage).Name() + " to ModbusPDU")
+	}
+
+	// Create the instance
+	return NewModbusSerialADU(transactionId, length, address, pdu), nil
 }
-
diff --git a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusTcpADU.go b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusTcpADU.go
index 55f212d..4037cab 100644
--- a/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusTcpADU.go
+++ b/sandbox/plc4go/generated-sources/plc4go/go/modbus/readwrite/ModbusTcpADU.go
@@ -19,83 +19,78 @@
 package readwrite
 
 import (
-    "math"
-    "plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
-    log "github.com/sirupsen/logrus"
+	"errors"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+	"reflect"
+	"strconv"
 )
 
 // Constant values.
-const PROTOCOLIDENTIFIER uint16 = 0x0000;
+const PROTOCOLIDENTIFIER uint16 = 0x0000
 
 type ModbusTcpADU struct {
-    transactionIdentifier uint16
-    unitIdentifier uint8
-    pdu ModbusPDU
-
+	transactionIdentifier uint16
+	unitIdentifier        uint8
+	pdu                   ModbusPDU
 }
 
-
 func NewModbusTcpADU(transactionIdentifier uint16, unitIdentifier uint8, pdu ModbusPDU) spi.Message {
-    return &ModbusTcpADU{transactionIdentifier: transactionIdentifier, unitIdentifier: unitIdentifier, pdu: pdu}
+	return &ModbusTcpADU{transactionIdentifier: transactionIdentifier, unitIdentifier: unitIdentifier, pdu: pdu}
 }
 
 func (m ModbusTcpADU) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+	var lengthInBits uint16 = 0
 
-    // Simple field (transactionIdentifier)
-    lengthInBits += 16
+	// Simple field (transactionIdentifier)
+	lengthInBits += 16
 
-    // Const Field (protocolIdentifier)
-    lengthInBits += 16
+	// Const Field (protocolIdentifier)
+	lengthInBits += 16
 
-    // Implicit Field (length)
-    lengthInBits += 16
+	// Implicit Field (length)
+	lengthInBits += 16
 
-    // Simple field (unitIdentifier)
-    lengthInBits += 8
+	// Simple field (unitIdentifier)
+	lengthInBits += 8
 
-    // Simple field (pdu)
-    lengthInBits += m.pdu.LengthInBits()
+	// Simple field (pdu)
+	lengthInBits += m.pdu.LengthInBits()
 
-    return lengthInBits
+	return lengthInBits
 }
 
 func (m ModbusTcpADU) LengthInBytes() uint16 {
-    return m.LengthInBits() / 8
+	return m.LengthInBits() / 8
 }
 
-func ModbusTcpADUParse(io spi.ReadBuffer, response bool) spi.Message {
-    var startPos = io.GetPos()
-    var curPos uint16
-
-    // Simple Field (transactionIdentifier)
-    var transactionIdentifier uint16 = io.ReadUint16(16)
-
-    // Const Field (protocolIdentifier)
-    var protocolIdentifier uint16 = io.ReadUint16(16)
-    if protocolIdentifier != PROTOCOLIDENTIFIER {
-        throw new ParseException("Expected constant value " + ModbusTcpADU.PROTOCOLIDENTIFIER + " but got " + protocolIdentifier)
-    }
-
-    // Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-    var length uint16 = io.ReadUint16(16)
-
-    // Simple Field (unitIdentifier)
-    var unitIdentifier uint8 = io.ReadUint8(8)
-
-    // Simple Field (pdu)
-    var _pduMessage spi.Message = ModbusPDUParse(io, bool(response))
-    var pdu ModbusPDU
-    pdu, _pduOk := _pduMessage.(ModbusPDU)
-    if !_pduOk {
-        log.WithFields(log.Fields{
-            "expected type": "ModbusPDU",
-            "got type": reflect.TypeOf(_pduMessage),
-        }).Error("Couldn't cast message")
-        throw new RuntimeException()
-    }
-
-    // Create the instance
-    return NewModbusTcpADU(transactionIdentifier, unitIdentifier, pdu)
-}
+func ModbusTcpADUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
+
+	// Simple Field (transactionIdentifier)
+	var transactionIdentifier uint16 = io.ReadUint16(16)
+
+	// Const Field (protocolIdentifier)
+	var protocolIdentifier uint16 = io.ReadUint16(16)
+	if protocolIdentifier != PROTOCOLIDENTIFIER {
+		return nil, errors.New("Expected constant value " + strconv.Itoa(int(PROTOCOLIDENTIFIER)) + " but got " + strconv.Itoa(int(protocolIdentifier)))
+	}
 
+	// Implicit Field (length) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	var _ uint16 = io.ReadUint16(16)
+
+	// Simple Field (unitIdentifier)
+	var unitIdentifier uint8 = io.ReadUint8(8)
+
+	// Simple Field (pdu)
+	_pduMessage, _err := ModbusPDUParse(io, bool(response))
+	if _err != nil {
+		return nil, errors.New("Error parsing simple field 'pdu'. " + _err.Error())
+	}
+	var pdu ModbusPDU
+	pdu, _pduOk := _pduMessage.(ModbusPDU)
+	if !_pduOk {
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_pduMessage).Name() + " to ModbusPDU")
+	}
+
+	// Create the instance
+	return NewModbusTcpADU(transactionIdentifier, unitIdentifier, pdu), nil
+}
diff --git a/sandbox/plc4go/src/modbus.go b/sandbox/plc4go/src/main/modbus.go
similarity index 57%
rename from sandbox/plc4go/src/modbus.go
rename to sandbox/plc4go/src/main/modbus.go
index c471e74..4a8f65b 100644
--- a/sandbox/plc4go/src/modbus.go
+++ b/sandbox/plc4go/src/main/modbus.go
@@ -13,4 +13,26 @@
 // specific language governing permissions and limitations
 // under the License.
 //
-package modbus
+package main
+
+import (
+	"encoding/hex"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/generated-sources/plc4go/go/modbus/readwrite"
+	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/src/plc4go/spi"
+)
+
+func main() {
+	request, err := hex.DecodeString("000a00000006010300000004")
+	if err != nil {
+		// Output an error ...
+	}
+	rb := spi.ReadBufferNew(request)
+	adu, err := readwrite.ModbusTcpADUParse(*rb, false)
+	if err != nil {
+		// Output an error ...
+	}
+	if adu != nil {
+		// Output success ...
+	}
+
+}
diff --git a/sandbox/plc4go/src/plc4go/spi/ReadBuffer.go b/sandbox/plc4go/src/plc4go/spi/ReadBuffer.go
index 37b7996..82999da 100644
--- a/sandbox/plc4go/src/plc4go/spi/ReadBuffer.go
+++ b/sandbox/plc4go/src/plc4go/spi/ReadBuffer.go
@@ -24,6 +24,14 @@ type ReadBuffer struct {
 	bitPos  uint8
 }
 
+func ReadBufferNew(data []uint8) *ReadBuffer {
+	return &ReadBuffer{
+		data:    data,
+		bytePos: 0,
+		bitPos:  0,
+	}
+}
+
 func (rb ReadBuffer) GetPos() uint16 {
 	return 0
 }