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/13 10:18:37 UTC

[plc4x] branch feature/plc4go updated: - Implemented the ReadBuffer - Updated the code generation to actually work for parsing

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 6ccc466  - Implemented the ReadBuffer - Updated the code generation to actually work for parsing
6ccc466 is described below

commit 6ccc46684eb324a6379df66092347e7444d482ab
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Oct 13 12:18:29 2020 +0200

    - Implemented the ReadBuffer
    - Updated the code generation to actually work for parsing
---
 .../language/go/GoLanguageTemplateHelper.java      |   8 +-
 .../main/resources/templates/go/enum-template.ftlh |  22 +++-
 .../resources/templates/go/model-template.ftlh     | 133 ++++++++++++++-------
 sandbox/plc4go/go.mod                              |   1 +
 .../plc4go/bacnetip/readwrite/model/APDU.go        |   5 +-
 .../plc4go/bacnetip/readwrite/model/APDUAbort.go   |  21 +++-
 .../bacnetip/readwrite/model/APDUComplexAck.go     |  44 +++++--
 .../readwrite/model/APDUConfirmedRequest.go        |  59 ++++++---
 .../plc4go/bacnetip/readwrite/model/APDUError.go   |  22 ++--
 .../plc4go/bacnetip/readwrite/model/APDUReject.go  |  16 ++-
 .../bacnetip/readwrite/model/APDUSegmentAck.go     |  31 ++++-
 .../bacnetip/readwrite/model/APDUSimpleAck.go      |  16 ++-
 .../readwrite/model/APDUUnconfirmedRequest.go      |  17 +--
 .../bacnetip/readwrite/model/ApplicationTag.go     |  13 ++
 .../bacnetip/readwrite/model/BACnetAddress.go      |  12 +-
 .../readwrite/model/BACnetConfirmedServiceACK.go   |   5 +-
 .../model/BACnetConfirmedServiceRequest.go         |   5 +-
 ...firmedServiceRequestConfirmedCOVNotification.go |  76 +++++++++---
 .../BACnetConfirmedServiceRequestReadProperty.go   |  31 ++++-
 .../BACnetConfirmedServiceRequestSubscribeCOV.go   |  56 +++++++--
 .../BACnetConfirmedServiceRequestWriteProperty.go  |  69 +++++++----
 .../plc4go/bacnetip/readwrite/model/BACnetError.go |   5 +-
 .../readwrite/model/BACnetErrorReadProperty.go     |  32 ++++-
 .../bacnetip/readwrite/model/BACnetNetworkType.go  |  13 ++
 .../bacnetip/readwrite/model/BACnetNodeType.go     |  13 ++
 .../bacnetip/readwrite/model/BACnetNotifyType.go   |  13 ++
 .../bacnetip/readwrite/model/BACnetObjectType.go   |  13 ++
 .../bacnetip/readwrite/model/BACnetServiceAck.go   |   5 +-
 .../model/BACnetServiceAckReadProperty.go          |  53 +++++---
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |  27 ++++-
 .../model/BACnetTagApplicationBitString.go         |  12 +-
 .../readwrite/model/BACnetTagApplicationDouble.go  |   6 +-
 .../model/BACnetTagApplicationEnumerated.go        |   7 +-
 .../readwrite/model/BACnetTagApplicationReal.go    |   6 +-
 .../model/BACnetTagApplicationSignedInteger.go     |   7 +-
 .../model/BACnetTagApplicationUnsignedInteger.go   |   7 +-
 .../bacnetip/readwrite/model/BACnetTagContext.go   |   7 +-
 .../readwrite/model/BACnetTagWithContent.go        |  57 ++++++---
 .../model/BACnetUnconfirmedServiceRequest.go       |   5 +-
 .../model/BACnetUnconfirmedServiceRequestIAm.go    |  51 ++++++--
 ...rmedServiceRequestUnconfirmedPrivateTransfer.go |  36 ++++--
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |  41 +++++--
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |  32 ++++-
 .../plc4go/bacnetip/readwrite/model/BVLC.go        |  15 ++-
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  |  23 ++--
 .../readwrite/model/BVLCOriginalBroadcastNPDU.go   |  12 +-
 .../readwrite/model/BVLCOriginalUnicastNPDU.go     |  12 +-
 .../plc4go/bacnetip/readwrite/model/NLM.go         |  11 +-
 .../readwrite/model/NLMIAmRouterToNetwork.go       |   7 +-
 .../readwrite/model/NLMWhoIsRouterToNetwork.go     |   7 +-
 .../plc4go/bacnetip/readwrite/model/NPDU.go        | 132 +++++++++++++-------
 .../plc4go/knxnetip/readwrite/model/APCI.go        |  13 ++
 .../plc4go/knxnetip/readwrite/model/CEMI.go        |   5 +-
 .../readwrite/model/CEMIAdditionalInformation.go   |   5 +-
 .../CEMIAdditionalInformationBusmonitorInfo.go     |  35 ++++--
 .../CEMIAdditionalInformationRelativeTimestamp.go  |  17 +--
 .../knxnetip/readwrite/model/CEMIBusmonInd.go      |  25 ++--
 .../plc4go/knxnetip/readwrite/model/CEMIDataCon.go |  25 ++--
 .../knxnetip/readwrite/model/CEMIDataFrame.go      |  96 +++++++++++----
 .../plc4go/knxnetip/readwrite/model/CEMIDataInd.go |  25 ++--
 .../plc4go/knxnetip/readwrite/model/CEMIDataReq.go |  25 ++--
 .../plc4go/knxnetip/readwrite/model/CEMIFrame.go   |  36 ++++--
 .../knxnetip/readwrite/model/CEMIFrameAck.go       |   2 +-
 .../knxnetip/readwrite/model/CEMIFrameData.go      |  64 +++++++---
 .../knxnetip/readwrite/model/CEMIFrameDataExt.go   |  69 +++++++----
 .../readwrite/model/CEMIFramePollingData.go        |   2 +-
 .../readwrite/model/CEMIFramePollingDataExt.go     |   2 +-
 .../knxnetip/readwrite/model/CEMIMPropReadCon.go   |  31 ++++-
 .../knxnetip/readwrite/model/CEMIMPropReadReq.go   |  26 +++-
 .../knxnetip/readwrite/model/CEMIPriority.go       |  13 ++
 .../knxnetip/readwrite/model/ConnectionRequest.go  |  32 ++---
 .../model/ConnectionRequestInformation.go          |  10 +-
 ...ConnectionRequestInformationTunnelConnection.go |  11 +-
 .../knxnetip/readwrite/model/ConnectionResponse.go |  43 +++----
 .../readwrite/model/ConnectionResponseDataBlock.go |  10 +-
 .../ConnectionResponseDataBlockTunnelConnection.go |  12 +-
 .../readwrite/model/ConnectionStateRequest.go      |  22 ++--
 .../readwrite/model/ConnectionStateResponse.go     |  11 +-
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      |  79 +++++++-----
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |  22 ++--
 .../knxnetip/readwrite/model/DescriptionRequest.go |  12 +-
 .../readwrite/model/DescriptionResponse.go         |  22 ++--
 .../readwrite/model/DeviceConfigurationAck.go      |  12 +-
 .../model/DeviceConfigurationAckDataBlock.go       |  21 +++-
 .../readwrite/model/DeviceConfigurationRequest.go  |  22 ++--
 .../model/DeviceConfigurationRequestDataBlock.go   |  21 +++-
 .../knxnetip/readwrite/model/DeviceStatus.go       |  11 +-
 .../knxnetip/readwrite/model/DisconnectRequest.go  |  22 ++--
 .../knxnetip/readwrite/model/DisconnectResponse.go |  11 +-
 .../readwrite/model/HPAIControlEndpoint.go         |  26 ++--
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   |  26 ++--
 .../readwrite/model/HPAIDiscoveryEndpoint.go       |  26 ++--
 .../knxnetip/readwrite/model/HostProtocolCode.go   |  13 ++
 .../plc4go/knxnetip/readwrite/model/IPAddress.go   |   7 +-
 .../plc4go/knxnetip/readwrite/model/KNXAddress.go  |  16 ++-
 .../readwrite/model/KNXGroupAddress2Level.go       |  11 +-
 .../readwrite/model/KNXGroupAddress3Level.go       |  16 ++-
 .../readwrite/model/KNXGroupAddressFreeLevel.go    |   6 +-
 .../knxnetip/readwrite/model/KNXNetIPMessage.go    |  20 +++-
 .../plc4go/knxnetip/readwrite/model/KnxLayer.go    |  13 ++
 .../knxnetip/readwrite/model/KnxNetIpCore.go       |   6 +-
 .../readwrite/model/KnxNetIpDeviceManagement.go    |   6 +-
 .../knxnetip/readwrite/model/KnxNetIpTunneling.go  |   6 +-
 .../knxnetip/readwrite/model/KnxNetObjectServer.go |   6 +-
 .../model/KnxNetRemoteConfigurationAndDiagnosis.go |   6 +-
 .../readwrite/model/KnxNetRemoteLogging.go         |   6 +-
 .../plc4go/knxnetip/readwrite/model/MACAddress.go  |   7 +-
 .../model/ProjectInstallationIdentifier.go         |  11 +-
 .../knxnetip/readwrite/model/RelativeTimestamp.go  |   6 +-
 .../knxnetip/readwrite/model/SearchRequest.go      |  12 +-
 .../knxnetip/readwrite/model/SearchResponse.go     |  32 ++---
 .../plc4go/knxnetip/readwrite/model/ServiceId.go   |   5 +-
 .../plc4go/knxnetip/readwrite/model/Status.go      |  13 ++
 .../plc4go/knxnetip/readwrite/model/TPCI.go        |  13 ++
 .../knxnetip/readwrite/model/TunnelingRequest.go   |  22 ++--
 .../readwrite/model/TunnelingRequestDataBlock.go   |  21 +++-
 .../knxnetip/readwrite/model/TunnelingResponse.go  |  12 +-
 .../readwrite/model/TunnelingResponseDataBlock.go  |  21 +++-
 .../knxnetip/readwrite/model/UnknownMessage.go     |   7 +-
 .../modbus/readwrite/model/ModbusConstants.go      |   5 +-
 .../modbus/readwrite/model/ModbusDataType.go       |  14 +++
 .../plc4go/modbus/readwrite/model/ModbusPDU.go     |  10 +-
 .../readwrite/model/ModbusPDUDiagnosticRequest.go  |  11 +-
 .../modbus/readwrite/model/ModbusPDUError.go       |   6 +-
 .../model/ModbusPDUGetComEventLogResponse.go       |  27 ++++-
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |  16 ++-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |  16 ++-
 .../readwrite/model/ModbusPDUReadCoilsRequest.go   |  11 +-
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  |  12 +-
 .../model/ModbusPDUReadDiscreteInputsRequest.go    |  11 +-
 .../model/ModbusPDUReadDiscreteInputsResponse.go   |  12 +-
 .../model/ModbusPDUReadExceptionStatusResponse.go  |   6 +-
 .../model/ModbusPDUReadFifoQueueRequest.go         |   6 +-
 .../model/ModbusPDUReadFifoQueueResponse.go        |  17 ++-
 .../model/ModbusPDUReadFileRecordRequest.go        |  17 +--
 .../model/ModbusPDUReadFileRecordRequestItem.go    |  21 +++-
 .../model/ModbusPDUReadFileRecordResponse.go       |  17 +--
 .../model/ModbusPDUReadFileRecordResponseItem.go   |  17 ++-
 .../model/ModbusPDUReadHoldingRegistersRequest.go  |  11 +-
 .../model/ModbusPDUReadHoldingRegistersResponse.go |  12 +-
 .../model/ModbusPDUReadInputRegistersRequest.go    |  11 +-
 .../model/ModbusPDUReadInputRegistersResponse.go   |  12 +-
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |  32 ++++-
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |  12 +-
 .../model/ModbusPDUReportServerIdResponse.go       |  12 +-
 .../model/ModbusPDUWriteFileRecordRequest.go       |  17 +--
 .../model/ModbusPDUWriteFileRecordRequestItem.go   |  27 ++++-
 .../model/ModbusPDUWriteFileRecordResponse.go      |  17 +--
 .../model/ModbusPDUWriteFileRecordResponseItem.go  |  27 ++++-
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    |  22 +++-
 .../model/ModbusPDUWriteMultipleCoilsResponse.go   |  11 +-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |  22 +++-
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |  11 +-
 .../model/ModbusPDUWriteSingleCoilRequest.go       |  11 +-
 .../model/ModbusPDUWriteSingleCoilResponse.go      |  11 +-
 .../model/ModbusPDUWriteSingleRegisterRequest.go   |  11 +-
 .../model/ModbusPDUWriteSingleRegisterResponse.go  |  11 +-
 .../modbus/readwrite/model/ModbusSerialADU.go      |  32 +++--
 .../plc4go/modbus/readwrite/model/ModbusTcpADU.go  |  32 +++--
 .../plc4go/s7/readwrite/model/COTPPacket.go        |  38 +++---
 .../readwrite/model/COTPPacketConnectionRequest.go |  18 ++-
 .../model/COTPPacketConnectionResponse.go          |  18 ++-
 .../plc4go/s7/readwrite/model/COTPPacketData.go    |  13 +-
 .../readwrite/model/COTPPacketDisconnectRequest.go |  18 ++-
 .../model/COTPPacketDisconnectResponse.go          |  13 +-
 .../s7/readwrite/model/COTPPacketTpduError.go      |  13 +-
 .../plc4go/s7/readwrite/model/COTPParameter.go     |  10 +-
 .../s7/readwrite/model/COTPParameterCalledTsap.go  |   6 +-
 .../s7/readwrite/model/COTPParameterCallingTsap.go |   6 +-
 .../s7/readwrite/model/COTPParameterChecksum.go    |   6 +-
 ...COTPParameterDisconnectAdditionalInformation.go |   7 +-
 .../s7/readwrite/model/COTPParameterTpduSize.go    |   6 +-
 .../plc4go/s7/readwrite/model/COTPProtocolClass.go |  13 ++
 .../plc4go/s7/readwrite/model/COTPTpduSize.go      |  14 +++
 .../s7/readwrite/model/DataTransportErrorCode.go   |  13 ++
 .../plc4go/s7/readwrite/model/DataTransportSize.go |  14 +++
 .../plc4go/s7/readwrite/model/DeviceGroup.go       |  13 ++
 .../plc4go/s7/readwrite/model/MemoryArea.go        |  14 +++
 .../plc4go/s7/readwrite/model/S7Address.go         |   5 +-
 .../plc4go/s7/readwrite/model/S7AddressAny.go      |  35 ++++--
 .../plc4go/s7/readwrite/model/S7Message.go         |  70 +++++++----
 .../plc4go/s7/readwrite/model/S7MessageRequest.go  |   2 +-
 .../plc4go/s7/readwrite/model/S7MessageResponse.go |  13 +-
 .../s7/readwrite/model/S7MessageResponseData.go    |  13 +-
 .../plc4go/s7/readwrite/model/S7MessageUserData.go |   2 +-
 .../plc4go/s7/readwrite/model/S7Parameter.go       |   5 +-
 .../readwrite/model/S7ParameterReadVarRequest.go   |  17 +--
 .../readwrite/model/S7ParameterReadVarResponse.go  |   6 +-
 .../model/S7ParameterSetupCommunication.go         |  21 +++-
 .../s7/readwrite/model/S7ParameterUserData.go      |  17 +--
 .../s7/readwrite/model/S7ParameterUserDataItem.go  |   5 +-
 .../model/S7ParameterUserDataItemCPUFunctions.go   |  49 ++++++--
 .../readwrite/model/S7ParameterWriteVarRequest.go  |  17 +--
 .../readwrite/model/S7ParameterWriteVarResponse.go |   6 +-
 .../plc4go/s7/readwrite/model/S7Payload.go         |   2 +-
 .../s7/readwrite/model/S7PayloadReadVarResponse.go |  14 +--
 .../plc4go/s7/readwrite/model/S7PayloadUserData.go |  14 +--
 .../s7/readwrite/model/S7PayloadUserDataItem.go    |  30 +++--
 ...PayloadUserDataItemCpuFunctionReadSzlRequest.go |   2 +-
 ...ayloadUserDataItemCpuFunctionReadSzlResponse.go |  24 ++--
 .../s7/readwrite/model/S7PayloadWriteVarRequest.go |  14 +--
 .../readwrite/model/S7PayloadWriteVarResponse.go   |  14 +--
 .../s7/readwrite/model/S7VarPayloadDataItem.go     |  28 +++--
 .../s7/readwrite/model/S7VarPayloadStatusItem.go   |   6 +-
 .../readwrite/model/S7VarRequestParameterItem.go   |   5 +-
 .../model/S7VarRequestParameterItemAddress.go      |  17 +--
 .../plc4go/s7/readwrite/model/SzlDataTreeItem.go   |  27 ++++-
 .../internal/plc4go/s7/readwrite/model/SzlId.go    |  15 ++-
 .../s7/readwrite/model/SzlModuleTypeClass.go       |  13 ++
 .../plc4go/s7/readwrite/model/SzlSublist.go        |  13 ++
 .../plc4go/s7/readwrite/model/TPKTPacket.go        |  27 +++--
 .../plc4go/s7/readwrite/model/TransportSize.go     |  23 ++++
 sandbox/plc4go/internal/plc4go/spi/ReadBuffer.go   | 109 ++++++++++++-----
 213 files changed, 3079 insertions(+), 1119 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 00a5a1a..75feeb6 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
@@ -591,8 +591,8 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         }
         // If the current term is an optional type, we need to add pointer access
         // (Except if we're doing a nil/not-nil check)
-        else if((getFieldForNameFromCurrent(vl.getName()) instanceof OptionalField) && !suppressPointerAccess) {
-            return "*" + (serialize ? "m." : "") + vl.getName() + ((vl.getChild() != null) ?
+        if((getFieldForNameFromCurrent(vl.getName()) instanceof OptionalField) && !suppressPointerAccess) {
+            return "(*" + (serialize ? "m." : "") + vl.getName() + ")" + ((vl.getChild() != null) ?
                 "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
         }
         return (serialize ? "m." : "") + vl.getName() + ((vl.getChild() != null) ?
@@ -685,9 +685,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         List<String> imports = new ArrayList<>();
 
         // 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))) {
+        if(!((ComplexTypeDefinition) getThisTypeDefinition()).getFields().isEmpty()) {
             imports.add("\"errors\"");
         }
 
diff --git a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
index 29430be..3a55b19 100644
--- a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
@@ -25,6 +25,7 @@
 <#-- @ftlvariable name="outputFlavor" type="java.lang.String" -->
 <#-- @ftlvariable name="helper" type="org.apache.plc4x.language.go.GoLanguageTemplateHelper" -->
 <#-- @ftlvariable name="type" type="org.apache.plc4x.plugins.codegenerator.types.definitions.EnumTypeDefinition" -->
+<#-- @ftlvariable name="simpleTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference" -->
 ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/model/${type.name}.go
 //
 // Licensed to the Apache Software Foundation (ASF) under one
@@ -50,6 +51,16 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type ${type.name} <#if type.type?has_content>${helper.getLanguageTypeNameForTypeReference(type.type)}<#else>string</#if>
 
+type I${type.name} interface {
+    spi.Message
+<#if type.constantNames?has_content>
+    <#list type.constantNames as constantName>
+    ${constantName?cap_first}() ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))}
+    </#list>
+</#if>
+    Serialize(io spi.WriteBuffer)
+}
+
 const(
 <#list type.enumValues as enumValue>
     ${type.name}_${enumValue.name} ${type.name} = ${enumValue.value}
@@ -89,7 +100,16 @@ func Cast${type.name}(structType interface{}) ${type.name} {
     return castFunc(structType)
 }
 
-    <#if type.type?has_content>
+func (m ${type.name}) LengthInBits() uint16 {
+    <#assign simpleTypeReference = type.type>
+    return ${simpleTypeReference.sizeInBits}
+}
+
+func (m ${type.name}) LengthInBytes() uint16 {
+    return m.LengthInBits() / 8
+}
+
+<#if type.type?has_content>
 func ${type.name}Parse(io spi.ReadBuffer) (${type.name}, error) {
     // TODO: Implement ...
     return 0, nil
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 ca3536c..5046d6d 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
@@ -82,7 +82,7 @@ type ${type.name} struct {
 <#-- Prpoerty fields are fields that require a property in the pojo -->
 <#if type.propertyFields?has_content>
 <#list type.propertyFields as field>
-    ${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if>${helper.getLanguageTypeNameForField(field)}
+    ${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}
 </#list>
 </#if>
 <#--
@@ -107,7 +107,7 @@ type I${type.name} interface {
         </#if>
     </#list>
 </#if>
-    Serialize(io spi.WriteBuffer)
+    Serialize(io spi.WriteBuffer<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>)
 }
 
 <#if helper.isDiscriminatedChildTypeDefinition()>
@@ -126,7 +126,7 @@ func (m ${type.name}) ${discriminatorName?cap_first}() ${helper.getLanguageTypeN
 </#if>
 <#if helper.isDiscriminatedParentTypeDefinition()>
 type ${type.name}Initializer interface {
-    initialize(<#list type.getAllPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) spi.Message
+    initialize(<#list type.getAllPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) spi.Message
 }
 
     <#list helper.getDiscriminatorTypes() as discriminatorName, discriminatorType>
@@ -139,7 +139,7 @@ func ${type.name}${discriminatorName?cap_first}(m I${type.name}) ${helper.getLan
         </#if>
     </#list>
 <#else>
-<#if type.parentType??>func (m ${type.name}) initialize(<#list type.parentType.getAllPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) spi.Message {
+<#if type.parentType??>func (m ${type.name}) initialize(<#list type.parentType.getAllPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) spi.Message {
     <#list type.parentType.getAllPropertyFields() as field>
     m.${field.name} = ${field.name}
     </#list>
@@ -147,7 +147,7 @@ func ${type.name}${discriminatorName?cap_first}(m I${type.name}) ${helper.getLan
 }
 </#if>
 
-func New${type.name}(<#list type.getPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) <#if type.parentType??>${type.parentType.name}Initializer<#else>spi.Message</#if> {
+func New${type.name}(<#list type.getPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) <#if type.parentType??>${type.parentType.name}Initializer<#else>spi.Message</#if> {
     return &${type.name}{<#list type.getPropertyFields() as field>${field.name}: ${field.name}<#sep>, </#sep></#list>}
 }
 </#if>
@@ -246,7 +246,7 @@ func (m ${type.name}) LengthInBits() uint16 {
                     <#assign simpleTypeReference = optionalField.type>
         lengthInBits += ${simpleTypeReference.sizeInBits}
                 <#else>
-        lengthInBits += m.${optionalField.name}.LengthInBits()
+        lengthInBits += (*m.${optionalField.name}).LengthInBits()
                 </#if>
     }
                 <#break>
@@ -299,7 +299,7 @@ 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>, error) {
+func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (<#if type.parentType??>${type.parentType.name}Initializer<#else>spi.Message</#if>, error) {
     <#if helper.requiresStartPosAndCurPos()>
     var startPos = io.GetPos()
     var curPos uint16
@@ -314,24 +314,28 @@ 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(arrayField)}
+    var ${arrayField.name} []<#if helper.isComplexTypeReference(arrayField.type)>I</#if>${helper.getLanguageTypeNameForField(arrayField)}
             <#-- If this is a count array, we can directly initialize an array with the given size -->
                 <#if helper.isCountArrayField(field)>
     // Count array
     {
-        ${arrayField.name} := make([]${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
+        ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>I</#if>${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
         for curItem := uint16(0); curItem < uint16(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}); curItem++ {
 <#if (!helper.isSimpleTypeReference(arrayField.type)) && helper.requiresVariable(arrayField, "lastItem")>            lastItem := curItem == uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} - 1)</#if>
                     <#if helper.isSimpleTypeReference(arrayField.type)>
                         <#assign simpleTypeReference = arrayField.type>
-            ${arrayField.name} = append(${arrayField.name}, ${helper.getReadBufferReadMethodCall(simpleTypeReference)})
+            _${arrayField.name}Val, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+            if _err != nil {
+                return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
+            }
+            ${arrayField.name} = append(${arrayField.name}, _${arrayField.name}Val)
                     <#else>
             _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), 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})
+            var _item I${helper.getLanguageTypeNameForField(field)}
+            _item, _ok := _message.(I${arrayField.type.name})
             if !_ok {
                 return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
             }
@@ -348,14 +352,18 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     for ;io.GetPos() < _${arrayField.name}EndPos; {
                     <#if helper.isSimpleTypeReference(arrayField.type)>
                         <#assign simpleTypeReference = arrayField.type>
-        ${arrayField.name} = append(${arrayField.name}, ${helper.getReadBufferReadMethodCall(simpleTypeReference)})
+        _${arrayField.name}Val, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+        if _err != nil {
+            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
+        }
+        ${arrayField.name} = append(${arrayField.name}, _${arrayField.name}Val)
                     <#else>
         _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), 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})
+        var _item I${helper.getLanguageTypeNameForField(field)}
+        _item, _ok := _message.(I${arrayField.type.name})
         if !_ok {
             return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
         }
@@ -372,13 +380,18 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     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)})
+        _${arrayField.name}Val, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+        if _err != nil {
+            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
+        }
+        ${arrayField.name} = append(${arrayField.name}, _${arrayField.name}Val)
                     <#else>
         _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
         if _err != nil {
+
         }
-        var _item ${helper.getLanguageTypeNameForField(field)}
-        _item, _ok := _message.(${arrayField.type.name})
+        var _item I${helper.getLanguageTypeNameForField(field)}
+        _item, _ok := _message.(I${arrayField.type.name})
         if !_ok {
             return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
         }
@@ -400,9 +413,15 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     {
         checksum = ${helper.getNullValueForTypeReference(checksumField.type)}
         // Create an array of all the bytes read in this message element so far.
-        byte[] checksumRawData = io.getBytes(startPos, io.GetPos())
-        ${helper.getLanguageTypeNameForField(field)} checksumRef = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
-        checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
+        checksumRawData := io.getBytes(startPos, io.GetPos())
+        checksumRef, _checksumRefErr := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+        if _checksumRefErr != nil {
+            return nil, errors.New("Error parsing 'checksum' field " + _checksumRefErr.Error())
+        }
+        checksum, _checksumErr = ${helper.toParseExpression(checksumField, checksumField.checksumExpression, type.parserArguments)}
+        if _checksumErr != nil {
+            return nil, errors.New("Error parsing 'checksum' field " + _checksumErr.Error())
+        }
         if checksum != checksumRef {
             return nil, errors.New("Checksum verification failed. Expected " + (checksumRef & 0xFFFF) + " but got " + (checksum & 0xFFFF)")
         }
@@ -413,7 +432,10 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#assign simpleTypeReference = constField.type>
 
     // Const Field (${constField.name})
-    var ${constField.name} ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    ${constField.name}, _${constField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    if _${constField.name}Err != nil {
+        return nil, errors.New("Error parsing '${constField.name}' field " + _${constField.name}Err.Error())
+    }
     if ${constField.name} != ${type.name}_${constField.name?upper_case} {
         return nil, errors.New("Expected constant value " + strconv.Itoa(int(${type.name}_${constField.name?upper_case})) + " but got " + strconv.Itoa(int(${constField.name})))
     }
@@ -423,7 +445,10 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#assign simpleTypeReference = discriminatorField.type>
 
     // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
-    var ${helper.getVariableName(field)} ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    ${helper.getVariableName(field)}, _${discriminatorField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    if _${discriminatorField.name}Err != nil {
+        return nil, errors.New("Error parsing '${discriminatorField.name}' field " + _${discriminatorField.name}Err.Error())
+    }
                 <#break>
             <#case "enum">
                 <#assign enumField = field>
@@ -439,7 +464,10 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#assign simpleTypeReference = implicitField.type>
 
     // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-    var ${helper.getVariableName(field)} ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    ${helper.getVariableName(field)}, _${implicitField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    if _${implicitField.name}Err != nil {
+        return nil, errors.New("Error parsing '${implicitField.name}' field " + _${implicitField.name}Err.Error())
+    }
                 <#break>
             <#case "manualArray">
                 <#assign manualArrayField = field>
@@ -504,7 +532,10 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#assign manualField = field>
 
     // Manual Field (${manualField.name})
-    var ${manualField.name} ${helper.getLanguageTypeNameForField(field)} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(manualField, manualField.parseExpression, type.parserArguments)})
+    ${manualField.name}, _${manualField.name}Err = ${helper.toParseExpression(manualField, manualField.parseExpression, type.parserArguments)}
+    if _${implicitField.name}Err != nil {
+        return nil, errors.New("Error parsing '${manualField.name}' field " + _${manualField.name}Err.Error())
+    }
             <#break>
             <#case "optional">
                 <#assign optionalField = field>
@@ -513,20 +544,24 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#if optionalField.conditionExpression.contains("curPos")>
     curPos = io.GetPos() - startPos
                 </#if>
-    var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
+    var ${optionalField.name} *<#if helper.isComplexTypeReference(optionalField.type)>I</#if>${helper.getLanguageTypeNameForField(field)} = nil
     if ${helper.toBooleanParseExpression(optionalField.conditionExpression, type.parserArguments)} {
             <#if helper.isSimpleTypeReference(optionalField.type)>
-        _val := ${helper.getReadBufferReadMethodCall(optionalField.type)}
+        _val, _err := ${helper.getReadBufferReadMethodCall(optionalField.type)}
+        if _err != nil {
+            return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
+        }
+
         ${optionalField.name} = &_val
             <#else>
         _message, _err := ${helper.getLanguageTypeNameForField(field)}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.toTypedParseExpression(helper.getArgumentType(optionalField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
         if _err != nil {
             return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
         }
-        var _item ${helper.getLanguageTypeNameForField(field)}
-        _item, _ok := _message.(${helper.getLanguageTypeNameForField(field)})
+        var _item I${helper.getLanguageTypeNameForField(field)}
+        _item, _ok := _message.(I${helper.getLanguageTypeNameForField(field)})
         if !_ok {
-            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${helper.getLanguageTypeNameForField(field)}")
+            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to I${helper.getLanguageTypeNameForField(field)}")
         }
         ${optionalField.name} = &_item
             </#if>
@@ -541,7 +576,10 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
         _timesPadding := (${helper.toParseExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
         for ;(io.HasMore(${helper.getNumBits(simpleTypeReference)})) && (_timesPadding > 0);_timesPadding-- {
             // Just read the padding data and ignore it
-            ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+            _, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+            if _err != nil {
+                return nil, errors.New("Error parsing 'padding' field " + _err.Error())
+            }
         }
     }
                 <#break>
@@ -551,7 +589,10 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
 
     // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
     {
-        var reserved ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+        reserved, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+        if _err != nil {
+            return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+        }
         if reserved != ${helper.getReservedValue(reservedField)} {
             log.WithFields(log.Fields{
                 "expected value": ${helper.getReservedValue(reservedField)},
@@ -566,17 +607,20 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     // Simple Field (${simpleField.name})
                 <#if helper.isSimpleTypeReference(simpleField.type)>
                     <#assign simpleTypeReference = simpleField.type>
-    var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    ${simpleField.name}, _${simpleField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    if _${simpleField.name}Err != nil {
+        return nil, errors.New("Error parsing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
+    }
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
     _${simpleField.name}Message, _err := ${complexTypeReference.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(simpleField.type, parserArgument?index), 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)})
+    var ${simpleField.name} I${helper.getLanguageTypeNameForField(field)}
+    ${simpleField.name}, _${simpleField.name}Ok := _${simpleField.name}Message.(I${helper.getLanguageTypeNameForField(field)})
     if !_${simpleField.name}Ok {
-        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_${simpleField.name}Message).Name() + " to ${helper.getLanguageTypeNameForField(field)}")
+        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_${simpleField.name}Message).Name() + " to I${helper.getLanguageTypeNameForField(field)}")
     }
                 </#if>
                 <#break>
@@ -602,7 +646,11 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#assign virtualField = field>
 
     // Virtual field (Just declare a local variable so we can access it in the parser)
-    var ${virtualField.name} ${helper.getLanguageTypeNameForField(field)} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(virtualField, virtualField.valueExpression, type.parserArguments)})
+    ${virtualField.name}, _${virtualField.name}Err := ${helper.toParseExpression(virtualField, virtualField.valueExpression, type.parserArguments)}
+    if _${virtualField.name}Err != nil {
+        return nil, errors.New("Error parsing '${virtualField.name}' field " + _${virtualField.name}Err.Error())
+    }
+
                 <#break>
         </#switch>
     </#list>
@@ -620,7 +668,7 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
     <#if arraySizeInBytesHelpers?has_content>
         <#list arraySizeInBytesHelpers?keys as key>
             <#assign typeName=arraySizeInBytesHelpers[key]>
-    ${key}ArraySizeInBytes := func(items []${typeName}) uint32 {
+    ${key}ArraySizeInBytes := func(items []I${typeName}) uint32 {
         var sizeInBytes uint32 = 0
         for _, v := range items {
             sizeInBytes += uint32(v.LengthInBytes())
@@ -691,7 +739,7 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
                 <#assign enumField = field>
 
     // Enum field (${enumField.name})
-    ${enumField.name} := ${helper.getLanguageTypeNameForField(field)}(m.${enumField.name})
+    ${enumField.name} := I${helper.getLanguageTypeNameForField(field)}(m.${enumField.name})
     ${enumField.name}.Serialize(io)
                 <#break>
             <#case "implicit">
@@ -722,7 +770,7 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
                 <#assign optionalField = field>
 
     // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
-    var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
+    var ${optionalField.name} *<#if helper.isComplexTypeReference(optionalField.type)>I</#if>${helper.getLanguageTypeNameForField(field)} = nil
     if m.${optionalField.name} != nil {
         ${optionalField.name} = m.${optionalField.name}
                 <#if helper.isSimpleTypeReference(optionalField.type)>
@@ -730,7 +778,7 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
         ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "*(" + optionalField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = optionalField.type>
-        ${optionalField.name}.Serialize(io)
+        (*${optionalField.name}).Serialize(io)
                 </#if>
     }
                 <#break>
@@ -758,12 +806,13 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
                 <#assign simpleField = field>
 
     // Simple Field (${simpleField.name})
-    ${simpleField.name} := ${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name})
                 <#if helper.isSimpleTypeReference(simpleField.type)>
                     <#assign simpleTypeReference = simpleField.type>
+    ${simpleField.name} := ${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name})
     ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
+    ${simpleField.name} := I${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name})
     ${simpleField.name}.Serialize(io)
                 </#if>
                 <#break>
diff --git a/sandbox/plc4go/go.mod b/sandbox/plc4go/go.mod
index 36193f3..732da7f 100644
--- a/sandbox/plc4go/go.mod
+++ b/sandbox/plc4go/go.mod
@@ -18,3 +18,4 @@ module plc4x.apache.org/plc4go-modbus-driver/0.8.0
 go 1.15
 
 require github.com/sirupsen/logrus v1.7.0
+require github.com/icza/bitio v1.0.0
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
index 2531d24..1d23087 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
@@ -80,7 +80,10 @@ func (m APDU) LengthInBytes() uint16 {
 func APDUParse(io spi.ReadBuffer, apduLength uint16) (spi.Message, error) {
 
 	// Discriminator Field (apduType) (Used as input to a switch field)
-	var apduType uint8 = io.ReadUint8(4)
+	apduType, _apduTypeErr := io.ReadUint8(4)
+	if _apduTypeErr != nil {
+		return nil, errors.New("Error parsing 'apduType' field " + _apduTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer APDUInitializer
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
index 03168f5..e7cb54f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -96,7 +97,10 @@ func APDUAbortParse(io spi.ReadBuffer) (APDUInitializer, error) {
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(3)
+		reserved, _err := io.ReadUint8(3)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -106,13 +110,22 @@ func APDUAbortParse(io spi.ReadBuffer) (APDUInitializer, error) {
 	}
 
 	// Simple Field (server)
-	var server bool = io.ReadBit()
+	server, _serverErr := io.ReadBit()
+	if _serverErr != nil {
+		return nil, errors.New("Error parsing 'server' field " + _serverErr.Error())
+	}
 
 	// Simple Field (originalInvokeId)
-	var originalInvokeId uint8 = io.ReadUint8(8)
+	originalInvokeId, _originalInvokeIdErr := io.ReadUint8(8)
+	if _originalInvokeIdErr != nil {
+		return nil, errors.New("Error parsing 'originalInvokeId' field " + _originalInvokeIdErr.Error())
+	}
 
 	// Simple Field (abortReason)
-	var abortReason uint8 = io.ReadUint8(8)
+	abortReason, _abortReasonErr := io.ReadUint8(8)
+	if _abortReasonErr != nil {
+		return nil, errors.New("Error parsing 'abortReason' field " + _abortReasonErr.Error())
+	}
 
 	// Create the instance
 	return NewAPDUAbort(server, originalInvokeId, abortReason), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
index d369ea9..f759f46 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
@@ -32,7 +32,7 @@ type APDUComplexAck struct {
 	originalInvokeId   uint8
 	sequenceNumber     *uint8
 	proposedWindowSize *uint8
-	serviceAck         BACnetServiceAck
+	serviceAck         IBACnetServiceAck
 	APDU
 }
 
@@ -51,7 +51,7 @@ func (m APDUComplexAck) initialize() spi.Message {
 	return m
 }
 
-func NewAPDUComplexAck(segmentedMessage bool, moreFollows bool, originalInvokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceAck BACnetServiceAck) APDUInitializer {
+func NewAPDUComplexAck(segmentedMessage bool, moreFollows bool, originalInvokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceAck IBACnetServiceAck) APDUInitializer {
 	return &APDUComplexAck{segmentedMessage: segmentedMessage, moreFollows: moreFollows, originalInvokeId: originalInvokeId, sequenceNumber: sequenceNumber, proposedWindowSize: proposedWindowSize, serviceAck: serviceAck}
 }
 
@@ -113,14 +113,23 @@ func (m APDUComplexAck) LengthInBytes() uint16 {
 func APDUComplexAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 
 	// Simple Field (segmentedMessage)
-	var segmentedMessage bool = io.ReadBit()
+	segmentedMessage, _segmentedMessageErr := io.ReadBit()
+	if _segmentedMessageErr != nil {
+		return nil, errors.New("Error parsing 'segmentedMessage' field " + _segmentedMessageErr.Error())
+	}
 
 	// Simple Field (moreFollows)
-	var moreFollows bool = io.ReadBit()
+	moreFollows, _moreFollowsErr := io.ReadBit()
+	if _moreFollowsErr != nil {
+		return nil, errors.New("Error parsing 'moreFollows' field " + _moreFollowsErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(2)
+		reserved, _err := io.ReadUint8(2)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0),
@@ -130,19 +139,30 @@ func APDUComplexAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 	}
 
 	// Simple Field (originalInvokeId)
-	var originalInvokeId uint8 = io.ReadUint8(8)
+	originalInvokeId, _originalInvokeIdErr := io.ReadUint8(8)
+	if _originalInvokeIdErr != nil {
+		return nil, errors.New("Error parsing 'originalInvokeId' field " + _originalInvokeIdErr.Error())
+	}
 
 	// Optional Field (sequenceNumber) (Can be skipped, if a given expression evaluates to false)
 	var sequenceNumber *uint8 = nil
 	if segmentedMessage {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'sequenceNumber' field " + _err.Error())
+		}
+
 		sequenceNumber = &_val
 	}
 
 	// Optional Field (proposedWindowSize) (Can be skipped, if a given expression evaluates to false)
 	var proposedWindowSize *uint8 = nil
 	if segmentedMessage {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'proposedWindowSize' field " + _err.Error())
+		}
+
 		proposedWindowSize = &_val
 	}
 
@@ -151,10 +171,10 @@ func APDUComplexAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'serviceAck'. " + _err.Error())
 	}
-	var serviceAck BACnetServiceAck
-	serviceAck, _serviceAckOk := _serviceAckMessage.(BACnetServiceAck)
+	var serviceAck IBACnetServiceAck
+	serviceAck, _serviceAckOk := _serviceAckMessage.(IBACnetServiceAck)
 	if !_serviceAckOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceAckMessage).Name() + " to BACnetServiceAck")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceAckMessage).Name() + " to IBACnetServiceAck")
 	}
 
 	// Create the instance
@@ -193,6 +213,6 @@ func (m APDUComplexAck) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (serviceAck)
-	serviceAck := BACnetServiceAck(m.serviceAck)
+	serviceAck := IBACnetServiceAck(m.serviceAck)
 	serviceAck.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
index 63ade1d..01937be 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -35,7 +35,7 @@ type APDUConfirmedRequest struct {
 	invokeId                  uint8
 	sequenceNumber            *uint8
 	proposedWindowSize        *uint8
-	serviceRequest            BACnetConfirmedServiceRequest
+	serviceRequest            IBACnetConfirmedServiceRequest
 	APDU
 }
 
@@ -54,7 +54,7 @@ func (m APDUConfirmedRequest) initialize() spi.Message {
 	return m
 }
 
-func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedResponseAccepted bool, maxSegmentsAccepted uint8, maxApduLengthAccepted uint8, invokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceRequest BACnetConfirmedServiceRequest) APDUInitializer {
+func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedResponseAccepted bool, maxSegmentsAccepted uint8, maxApduLengthAccepted uint8, invokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceRequest IBACnetConfirmedServiceRequest) APDUInitializer {
 	return &APDUConfirmedRequest{segmentedMessage: segmentedMessage, moreFollows: moreFollows, segmentedResponseAccepted: segmentedResponseAccepted, maxSegmentsAccepted: maxSegmentsAccepted, maxApduLengthAccepted: maxApduLengthAccepted, invokeId: invokeId, sequenceNumber: sequenceNumber, proposedWindowSize: proposedWindowSize, serviceRequest: serviceRequest}
 }
 
@@ -125,17 +125,29 @@ func (m APDUConfirmedRequest) LengthInBytes() uint16 {
 func APDUConfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInitializer, error) {
 
 	// Simple Field (segmentedMessage)
-	var segmentedMessage bool = io.ReadBit()
+	segmentedMessage, _segmentedMessageErr := io.ReadBit()
+	if _segmentedMessageErr != nil {
+		return nil, errors.New("Error parsing 'segmentedMessage' field " + _segmentedMessageErr.Error())
+	}
 
 	// Simple Field (moreFollows)
-	var moreFollows bool = io.ReadBit()
+	moreFollows, _moreFollowsErr := io.ReadBit()
+	if _moreFollowsErr != nil {
+		return nil, errors.New("Error parsing 'moreFollows' field " + _moreFollowsErr.Error())
+	}
 
 	// Simple Field (segmentedResponseAccepted)
-	var segmentedResponseAccepted bool = io.ReadBit()
+	segmentedResponseAccepted, _segmentedResponseAcceptedErr := io.ReadBit()
+	if _segmentedResponseAcceptedErr != nil {
+		return nil, errors.New("Error parsing 'segmentedResponseAccepted' field " + _segmentedResponseAcceptedErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(2)
+		reserved, _err := io.ReadUint8(2)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0),
@@ -145,25 +157,42 @@ func APDUConfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInitia
 	}
 
 	// Simple Field (maxSegmentsAccepted)
-	var maxSegmentsAccepted uint8 = io.ReadUint8(3)
+	maxSegmentsAccepted, _maxSegmentsAcceptedErr := io.ReadUint8(3)
+	if _maxSegmentsAcceptedErr != nil {
+		return nil, errors.New("Error parsing 'maxSegmentsAccepted' field " + _maxSegmentsAcceptedErr.Error())
+	}
 
 	// Simple Field (maxApduLengthAccepted)
-	var maxApduLengthAccepted uint8 = io.ReadUint8(4)
+	maxApduLengthAccepted, _maxApduLengthAcceptedErr := io.ReadUint8(4)
+	if _maxApduLengthAcceptedErr != nil {
+		return nil, errors.New("Error parsing 'maxApduLengthAccepted' field " + _maxApduLengthAcceptedErr.Error())
+	}
 
 	// Simple Field (invokeId)
-	var invokeId uint8 = io.ReadUint8(8)
+	invokeId, _invokeIdErr := io.ReadUint8(8)
+	if _invokeIdErr != nil {
+		return nil, errors.New("Error parsing 'invokeId' field " + _invokeIdErr.Error())
+	}
 
 	// Optional Field (sequenceNumber) (Can be skipped, if a given expression evaluates to false)
 	var sequenceNumber *uint8 = nil
 	if segmentedMessage {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'sequenceNumber' field " + _err.Error())
+		}
+
 		sequenceNumber = &_val
 	}
 
 	// Optional Field (proposedWindowSize) (Can be skipped, if a given expression evaluates to false)
 	var proposedWindowSize *uint8 = nil
 	if segmentedMessage {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'proposedWindowSize' field " + _err.Error())
+		}
+
 		proposedWindowSize = &_val
 	}
 
@@ -172,10 +201,10 @@ func APDUConfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInitia
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'serviceRequest'. " + _err.Error())
 	}
-	var serviceRequest BACnetConfirmedServiceRequest
-	serviceRequest, _serviceRequestOk := _serviceRequestMessage.(BACnetConfirmedServiceRequest)
+	var serviceRequest IBACnetConfirmedServiceRequest
+	serviceRequest, _serviceRequestOk := _serviceRequestMessage.(IBACnetConfirmedServiceRequest)
 	if !_serviceRequestOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceRequestMessage).Name() + " to BACnetConfirmedServiceRequest")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceRequestMessage).Name() + " to IBACnetConfirmedServiceRequest")
 	}
 
 	// Create the instance
@@ -226,6 +255,6 @@ func (m APDUConfirmedRequest) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (serviceRequest)
-	serviceRequest := BACnetConfirmedServiceRequest(m.serviceRequest)
+	serviceRequest := IBACnetConfirmedServiceRequest(m.serviceRequest)
 	serviceRequest.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
index 3364756..c68da33 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
@@ -28,7 +28,7 @@ import (
 // The data-structure of this message
 type APDUError struct {
 	originalInvokeId uint8
-	error            BACnetError
+	error            IBACnetError
 	APDU
 }
 
@@ -47,7 +47,7 @@ func (m APDUError) initialize() spi.Message {
 	return m
 }
 
-func NewAPDUError(originalInvokeId uint8, error BACnetError) APDUInitializer {
+func NewAPDUError(originalInvokeId uint8, error IBACnetError) APDUInitializer {
 	return &APDUError{originalInvokeId: originalInvokeId, error: error}
 }
 
@@ -94,7 +94,10 @@ func APDUErrorParse(io spi.ReadBuffer) (APDUInitializer, error) {
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(4)
+		reserved, _err := io.ReadUint8(4)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -104,17 +107,20 @@ func APDUErrorParse(io spi.ReadBuffer) (APDUInitializer, error) {
 	}
 
 	// Simple Field (originalInvokeId)
-	var originalInvokeId uint8 = io.ReadUint8(8)
+	originalInvokeId, _originalInvokeIdErr := io.ReadUint8(8)
+	if _originalInvokeIdErr != nil {
+		return nil, errors.New("Error parsing 'originalInvokeId' field " + _originalInvokeIdErr.Error())
+	}
 
 	// Simple Field (error)
 	_errorMessage, _err := BACnetErrorParse(io)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'error'. " + _err.Error())
 	}
-	var error BACnetError
-	error, _errorOk := _errorMessage.(BACnetError)
+	var error IBACnetError
+	error, _errorOk := _errorMessage.(IBACnetError)
 	if !_errorOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_errorMessage).Name() + " to BACnetError")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_errorMessage).Name() + " to IBACnetError")
 	}
 
 	// Create the instance
@@ -131,6 +137,6 @@ func (m APDUError) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (originalInvokeId))
 
 	// Simple Field (error)
-	error := BACnetError(m.error)
+	error := IBACnetError(m.error)
 	error.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
index ce31a3e..3229e73 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -92,7 +93,10 @@ func APDURejectParse(io spi.ReadBuffer) (APDUInitializer, error) {
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(4)
+		reserved, _err := io.ReadUint8(4)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -102,10 +106,16 @@ func APDURejectParse(io spi.ReadBuffer) (APDUInitializer, error) {
 	}
 
 	// Simple Field (originalInvokeId)
-	var originalInvokeId uint8 = io.ReadUint8(8)
+	originalInvokeId, _originalInvokeIdErr := io.ReadUint8(8)
+	if _originalInvokeIdErr != nil {
+		return nil, errors.New("Error parsing 'originalInvokeId' field " + _originalInvokeIdErr.Error())
+	}
 
 	// Simple Field (rejectReason)
-	var rejectReason uint8 = io.ReadUint8(8)
+	rejectReason, _rejectReasonErr := io.ReadUint8(8)
+	if _rejectReasonErr != nil {
+		return nil, errors.New("Error parsing 'rejectReason' field " + _rejectReasonErr.Error())
+	}
 
 	// Create the instance
 	return NewAPDUReject(originalInvokeId, rejectReason), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
index 49afbc1..92b530c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -104,7 +105,10 @@ func APDUSegmentAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(2)
+		reserved, _err := io.ReadUint8(2)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -114,19 +118,34 @@ func APDUSegmentAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 	}
 
 	// Simple Field (negativeAck)
-	var negativeAck bool = io.ReadBit()
+	negativeAck, _negativeAckErr := io.ReadBit()
+	if _negativeAckErr != nil {
+		return nil, errors.New("Error parsing 'negativeAck' field " + _negativeAckErr.Error())
+	}
 
 	// Simple Field (server)
-	var server bool = io.ReadBit()
+	server, _serverErr := io.ReadBit()
+	if _serverErr != nil {
+		return nil, errors.New("Error parsing 'server' field " + _serverErr.Error())
+	}
 
 	// Simple Field (originalInvokeId)
-	var originalInvokeId uint8 = io.ReadUint8(8)
+	originalInvokeId, _originalInvokeIdErr := io.ReadUint8(8)
+	if _originalInvokeIdErr != nil {
+		return nil, errors.New("Error parsing 'originalInvokeId' field " + _originalInvokeIdErr.Error())
+	}
 
 	// Simple Field (sequenceNumber)
-	var sequenceNumber uint8 = io.ReadUint8(8)
+	sequenceNumber, _sequenceNumberErr := io.ReadUint8(8)
+	if _sequenceNumberErr != nil {
+		return nil, errors.New("Error parsing 'sequenceNumber' field " + _sequenceNumberErr.Error())
+	}
 
 	// Simple Field (proposedWindowSize)
-	var proposedWindowSize uint8 = io.ReadUint8(8)
+	proposedWindowSize, _proposedWindowSizeErr := io.ReadUint8(8)
+	if _proposedWindowSizeErr != nil {
+		return nil, errors.New("Error parsing 'proposedWindowSize' field " + _proposedWindowSizeErr.Error())
+	}
 
 	// Create the instance
 	return NewAPDUSegmentAck(negativeAck, server, originalInvokeId, sequenceNumber, proposedWindowSize), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
index 68be30a..b4e6e69 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -92,7 +93,10 @@ func APDUSimpleAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(4)
+		reserved, _err := io.ReadUint8(4)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0),
@@ -102,10 +106,16 @@ func APDUSimpleAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 	}
 
 	// Simple Field (originalInvokeId)
-	var originalInvokeId uint8 = io.ReadUint8(8)
+	originalInvokeId, _originalInvokeIdErr := io.ReadUint8(8)
+	if _originalInvokeIdErr != nil {
+		return nil, errors.New("Error parsing 'originalInvokeId' field " + _originalInvokeIdErr.Error())
+	}
 
 	// Simple Field (serviceChoice)
-	var serviceChoice uint8 = io.ReadUint8(8)
+	serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
+	if _serviceChoiceErr != nil {
+		return nil, errors.New("Error parsing 'serviceChoice' field " + _serviceChoiceErr.Error())
+	}
 
 	// Create the instance
 	return NewAPDUSimpleAck(originalInvokeId, serviceChoice), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
index 6f05991..1f038fd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
@@ -27,7 +27,7 @@ import (
 
 // The data-structure of this message
 type APDUUnconfirmedRequest struct {
-	serviceRequest BACnetUnconfirmedServiceRequest
+	serviceRequest IBACnetUnconfirmedServiceRequest
 	APDU
 }
 
@@ -46,7 +46,7 @@ func (m APDUUnconfirmedRequest) initialize() spi.Message {
 	return m
 }
 
-func NewAPDUUnconfirmedRequest(serviceRequest BACnetUnconfirmedServiceRequest) APDUInitializer {
+func NewAPDUUnconfirmedRequest(serviceRequest IBACnetUnconfirmedServiceRequest) APDUInitializer {
 	return &APDUUnconfirmedRequest{serviceRequest: serviceRequest}
 }
 
@@ -90,7 +90,10 @@ func APDUUnconfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInit
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(4)
+		reserved, _err := io.ReadUint8(4)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0),
@@ -104,10 +107,10 @@ func APDUUnconfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInit
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'serviceRequest'. " + _err.Error())
 	}
-	var serviceRequest BACnetUnconfirmedServiceRequest
-	serviceRequest, _serviceRequestOk := _serviceRequestMessage.(BACnetUnconfirmedServiceRequest)
+	var serviceRequest IBACnetUnconfirmedServiceRequest
+	serviceRequest, _serviceRequestOk := _serviceRequestMessage.(IBACnetUnconfirmedServiceRequest)
 	if !_serviceRequestOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceRequestMessage).Name() + " to BACnetUnconfirmedServiceRequest")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceRequestMessage).Name() + " to IBACnetUnconfirmedServiceRequest")
 	}
 
 	// Create the instance
@@ -120,6 +123,6 @@ func (m APDUUnconfirmedRequest) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, uint8(0))
 
 	// Simple Field (serviceRequest)
-	serviceRequest := BACnetUnconfirmedServiceRequest(m.serviceRequest)
+	serviceRequest := IBACnetUnconfirmedServiceRequest(m.serviceRequest)
 	serviceRequest.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
index 20460b3..d97d077 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type ApplicationTag int8
 
+type IApplicationTag interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	ApplicationTag_NULL                     ApplicationTag = 0x0
 	ApplicationTag_BOOLEAN                  ApplicationTag = 0x1
@@ -48,6 +53,14 @@ func CastApplicationTag(structType interface{}) ApplicationTag {
 	return castFunc(structType)
 }
 
+func (m ApplicationTag) LengthInBits() uint16 {
+	return 4
+}
+
+func (m ApplicationTag) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func ApplicationTagParse(io spi.ReadBuffer) (ApplicationTag, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
index 8b0a5d7..63d4a6c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -85,12 +86,19 @@ func BACnetAddressParse(io spi.ReadBuffer) (spi.Message, error) {
 		address := make([]uint8, uint16(4))
 		for curItem := uint16(0); curItem < uint16(uint16(4)); curItem++ {
 
-			address = append(address, io.ReadUint8(8))
+			_addressVal, _err := io.ReadUint8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'address' field " + _err.Error())
+			}
+			address = append(address, _addressVal)
 		}
 	}
 
 	// Simple Field (port)
-	var port uint16 = io.ReadUint16(16)
+	port, _portErr := io.ReadUint16(16)
+	if _portErr != nil {
+		return nil, errors.New("Error parsing 'port' field " + _portErr.Error())
+	}
 
 	// Create the instance
 	return NewBACnetAddress(address, port), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
index 2014132..029f5fd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
@@ -80,7 +80,10 @@ func (m BACnetConfirmedServiceACK) LengthInBytes() uint16 {
 func BACnetConfirmedServiceACKParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	var serviceChoice uint8 = io.ReadUint8(8)
+	serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
+	if _serviceChoiceErr != nil {
+		return nil, errors.New("Error parsing 'serviceChoice' field " + _serviceChoiceErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer BACnetConfirmedServiceACKInitializer
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
index acf3dec..5a75ede 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
@@ -80,7 +80,10 @@ func (m BACnetConfirmedServiceRequest) LengthInBytes() uint16 {
 func BACnetConfirmedServiceRequestParse(io spi.ReadBuffer, len uint16) (spi.Message, error) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	var serviceChoice uint8 = io.ReadUint8(8)
+	serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
+	if _serviceChoiceErr != nil {
+		return nil, errors.New("Error parsing 'serviceChoice' field " + _serviceChoiceErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer BACnetConfirmedServiceRequestInitializer
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
index b1d11dc..f8c1116 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
@@ -42,7 +42,7 @@ type BACnetConfirmedServiceRequestConfirmedCOVNotification struct {
 	issueConfirmedNotificationsInstanceNumber uint32
 	lifetimeLength                            uint8
 	lifetimeSeconds                           []int8
-	notifications                             []BACnetTagWithContent
+	notifications                             []IBACnetTagWithContent
 	BACnetConfirmedServiceRequest
 }
 
@@ -61,7 +61,7 @@ func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) initialize() spi.
 	return m
 }
 
-func NewBACnetConfirmedServiceRequestConfirmedCOVNotification(subscriberProcessIdentifier uint8, monitoredObjectType uint16, monitoredObjectInstanceNumber uint32, issueConfirmedNotificationsType uint16, issueConfirmedNotificationsInstanceNumber uint32, lifetimeLength uint8, lifetimeSeconds []int8, notifications []BACnetTagWithContent) BACnetConfirmedServiceRequestInitializer {
+func NewBACnetConfirmedServiceRequestConfirmedCOVNotification(subscriberProcessIdentifier uint8, monitoredObjectType uint16, monitoredObjectInstanceNumber uint32, issueConfirmedNotificationsType uint16, issueConfirmedNotificationsInstanceNumber uint32, lifetimeLength uint8, lifetimeSeconds []int8, notifications []IBACnetTagWithContent) BACnetConfirmedServiceRequestInitializer {
 	return &BACnetConfirmedServiceRequestConfirmedCOVNotification{subscriberProcessIdentifier: subscriberProcessIdentifier, monitoredObjectType: monitoredObjectType, monitoredObjectInstanceNumber: monitoredObjectInstanceNumber, issueConfirmedNotificationsType: issueConfirmedNotificationsType, issueConfirmedNotificationsInstanceNumber: issueConfirmedNotificationsInstanceNumber, lifetimeLength: lifetimeLength, lifetimeSeconds: lifetimeSeconds, notifications: notifications}
 }
 
@@ -146,46 +146,76 @@ func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) LengthInBytes() u
 func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io spi.ReadBuffer, len uint16) (BACnetConfirmedServiceRequestInitializer, error) {
 
 	// Const Field (subscriberProcessIdentifierHeader)
-	var subscriberProcessIdentifierHeader uint8 = io.ReadUint8(8)
+	subscriberProcessIdentifierHeader, _subscriberProcessIdentifierHeaderErr := io.ReadUint8(8)
+	if _subscriberProcessIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'subscriberProcessIdentifierHeader' field " + _subscriberProcessIdentifierHeaderErr.Error())
+	}
 	if subscriberProcessIdentifierHeader != BACnetConfirmedServiceRequestConfirmedCOVNotification_SUBSCRIBERPROCESSIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestConfirmedCOVNotification_SUBSCRIBERPROCESSIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(subscriberProcessIdentifierHeader)))
 	}
 
 	// Simple Field (subscriberProcessIdentifier)
-	var subscriberProcessIdentifier uint8 = io.ReadUint8(8)
+	subscriberProcessIdentifier, _subscriberProcessIdentifierErr := io.ReadUint8(8)
+	if _subscriberProcessIdentifierErr != nil {
+		return nil, errors.New("Error parsing 'subscriberProcessIdentifier' field " + _subscriberProcessIdentifierErr.Error())
+	}
 
 	// Const Field (monitoredObjectIdentifierHeader)
-	var monitoredObjectIdentifierHeader uint8 = io.ReadUint8(8)
+	monitoredObjectIdentifierHeader, _monitoredObjectIdentifierHeaderErr := io.ReadUint8(8)
+	if _monitoredObjectIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'monitoredObjectIdentifierHeader' field " + _monitoredObjectIdentifierHeaderErr.Error())
+	}
 	if monitoredObjectIdentifierHeader != BACnetConfirmedServiceRequestConfirmedCOVNotification_MONITOREDOBJECTIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestConfirmedCOVNotification_MONITOREDOBJECTIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(monitoredObjectIdentifierHeader)))
 	}
 
 	// Simple Field (monitoredObjectType)
-	var monitoredObjectType uint16 = io.ReadUint16(10)
+	monitoredObjectType, _monitoredObjectTypeErr := io.ReadUint16(10)
+	if _monitoredObjectTypeErr != nil {
+		return nil, errors.New("Error parsing 'monitoredObjectType' field " + _monitoredObjectTypeErr.Error())
+	}
 
 	// Simple Field (monitoredObjectInstanceNumber)
-	var monitoredObjectInstanceNumber uint32 = io.ReadUint32(22)
+	monitoredObjectInstanceNumber, _monitoredObjectInstanceNumberErr := io.ReadUint32(22)
+	if _monitoredObjectInstanceNumberErr != nil {
+		return nil, errors.New("Error parsing 'monitoredObjectInstanceNumber' field " + _monitoredObjectInstanceNumberErr.Error())
+	}
 
 	// Const Field (issueConfirmedNotificationsHeader)
-	var issueConfirmedNotificationsHeader uint8 = io.ReadUint8(8)
+	issueConfirmedNotificationsHeader, _issueConfirmedNotificationsHeaderErr := io.ReadUint8(8)
+	if _issueConfirmedNotificationsHeaderErr != nil {
+		return nil, errors.New("Error parsing 'issueConfirmedNotificationsHeader' field " + _issueConfirmedNotificationsHeaderErr.Error())
+	}
 	if issueConfirmedNotificationsHeader != BACnetConfirmedServiceRequestConfirmedCOVNotification_ISSUECONFIRMEDNOTIFICATIONSHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestConfirmedCOVNotification_ISSUECONFIRMEDNOTIFICATIONSHEADER)) + " but got " + strconv.Itoa(int(issueConfirmedNotificationsHeader)))
 	}
 
 	// Simple Field (issueConfirmedNotificationsType)
-	var issueConfirmedNotificationsType uint16 = io.ReadUint16(10)
+	issueConfirmedNotificationsType, _issueConfirmedNotificationsTypeErr := io.ReadUint16(10)
+	if _issueConfirmedNotificationsTypeErr != nil {
+		return nil, errors.New("Error parsing 'issueConfirmedNotificationsType' field " + _issueConfirmedNotificationsTypeErr.Error())
+	}
 
 	// Simple Field (issueConfirmedNotificationsInstanceNumber)
-	var issueConfirmedNotificationsInstanceNumber uint32 = io.ReadUint32(22)
+	issueConfirmedNotificationsInstanceNumber, _issueConfirmedNotificationsInstanceNumberErr := io.ReadUint32(22)
+	if _issueConfirmedNotificationsInstanceNumberErr != nil {
+		return nil, errors.New("Error parsing 'issueConfirmedNotificationsInstanceNumber' field " + _issueConfirmedNotificationsInstanceNumberErr.Error())
+	}
 
 	// Const Field (lifetimeHeader)
-	var lifetimeHeader uint8 = io.ReadUint8(5)
+	lifetimeHeader, _lifetimeHeaderErr := io.ReadUint8(5)
+	if _lifetimeHeaderErr != nil {
+		return nil, errors.New("Error parsing 'lifetimeHeader' field " + _lifetimeHeaderErr.Error())
+	}
 	if lifetimeHeader != BACnetConfirmedServiceRequestConfirmedCOVNotification_LIFETIMEHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestConfirmedCOVNotification_LIFETIMEHEADER)) + " but got " + strconv.Itoa(int(lifetimeHeader)))
 	}
 
 	// Simple Field (lifetimeLength)
-	var lifetimeLength uint8 = io.ReadUint8(3)
+	lifetimeLength, _lifetimeLengthErr := io.ReadUint8(3)
+	if _lifetimeLengthErr != nil {
+		return nil, errors.New("Error parsing 'lifetimeLength' field " + _lifetimeLengthErr.Error())
+	}
 
 	// Array field (lifetimeSeconds)
 	var lifetimeSeconds []int8
@@ -194,18 +224,25 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io spi.ReadBuffe
 		lifetimeSeconds := make([]int8, lifetimeLength)
 		for curItem := uint16(0); curItem < uint16(lifetimeLength); curItem++ {
 
-			lifetimeSeconds = append(lifetimeSeconds, io.ReadInt8(8))
+			_lifetimeSecondsVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'lifetimeSeconds' field " + _err.Error())
+			}
+			lifetimeSeconds = append(lifetimeSeconds, _lifetimeSecondsVal)
 		}
 	}
 
 	// Const Field (listOfValuesOpeningTag)
-	var listOfValuesOpeningTag uint8 = io.ReadUint8(8)
+	listOfValuesOpeningTag, _listOfValuesOpeningTagErr := io.ReadUint8(8)
+	if _listOfValuesOpeningTagErr != nil {
+		return nil, errors.New("Error parsing 'listOfValuesOpeningTag' field " + _listOfValuesOpeningTagErr.Error())
+	}
 	if listOfValuesOpeningTag != BACnetConfirmedServiceRequestConfirmedCOVNotification_LISTOFVALUESOPENINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestConfirmedCOVNotification_LISTOFVALUESOPENINGTAG)) + " but got " + strconv.Itoa(int(listOfValuesOpeningTag)))
 	}
 
 	// Array field (notifications)
-	var notifications []BACnetTagWithContent
+	var notifications []IBACnetTagWithContent
 	// Length array
 	_notificationsLength := uint16(len) - uint16(uint16(18))
 	_notificationsEndPos := io.GetPos() + uint16(_notificationsLength)
@@ -214,8 +251,8 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io spi.ReadBuffe
 		if _err != nil {
 			return nil, errors.New("Error parsing 'notifications' field " + _err.Error())
 		}
-		var _item BACnetTagWithContent
-		_item, _ok := _message.(BACnetTagWithContent)
+		var _item IBACnetTagWithContent
+		_item, _ok := _message.(IBACnetTagWithContent)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to BACnetTagWithContent")
 		}
@@ -223,7 +260,10 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io spi.ReadBuffe
 	}
 
 	// Const Field (listOfValuesClosingTag)
-	var listOfValuesClosingTag uint8 = io.ReadUint8(8)
+	listOfValuesClosingTag, _listOfValuesClosingTagErr := io.ReadUint8(8)
+	if _listOfValuesClosingTagErr != nil {
+		return nil, errors.New("Error parsing 'listOfValuesClosingTag' field " + _listOfValuesClosingTagErr.Error())
+	}
 	if listOfValuesClosingTag != BACnetConfirmedServiceRequestConfirmedCOVNotification_LISTOFVALUESCLOSINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestConfirmedCOVNotification_LISTOFVALUESCLOSINGTAG)) + " but got " + strconv.Itoa(int(listOfValuesClosingTag)))
 	}
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
index 98ced58..54938d4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
@@ -109,25 +109,40 @@ func (m BACnetConfirmedServiceRequestReadProperty) LengthInBytes() uint16 {
 func BACnetConfirmedServiceRequestReadPropertyParse(io spi.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
 
 	// Const Field (objectIdentifierHeader)
-	var objectIdentifierHeader uint8 = io.ReadUint8(8)
+	objectIdentifierHeader, _objectIdentifierHeaderErr := io.ReadUint8(8)
+	if _objectIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'objectIdentifierHeader' field " + _objectIdentifierHeaderErr.Error())
+	}
 	if objectIdentifierHeader != BACnetConfirmedServiceRequestReadProperty_OBJECTIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestReadProperty_OBJECTIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(objectIdentifierHeader)))
 	}
 
 	// Simple Field (objectType)
-	var objectType uint16 = io.ReadUint16(10)
+	objectType, _objectTypeErr := io.ReadUint16(10)
+	if _objectTypeErr != nil {
+		return nil, errors.New("Error parsing 'objectType' field " + _objectTypeErr.Error())
+	}
 
 	// Simple Field (objectInstanceNumber)
-	var objectInstanceNumber uint32 = io.ReadUint32(22)
+	objectInstanceNumber, _objectInstanceNumberErr := io.ReadUint32(22)
+	if _objectInstanceNumberErr != nil {
+		return nil, errors.New("Error parsing 'objectInstanceNumber' field " + _objectInstanceNumberErr.Error())
+	}
 
 	// Const Field (propertyIdentifierHeader)
-	var propertyIdentifierHeader uint8 = io.ReadUint8(5)
+	propertyIdentifierHeader, _propertyIdentifierHeaderErr := io.ReadUint8(5)
+	if _propertyIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'propertyIdentifierHeader' field " + _propertyIdentifierHeaderErr.Error())
+	}
 	if propertyIdentifierHeader != BACnetConfirmedServiceRequestReadProperty_PROPERTYIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestReadProperty_PROPERTYIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(propertyIdentifierHeader)))
 	}
 
 	// Simple Field (propertyIdentifierLength)
-	var propertyIdentifierLength uint8 = io.ReadUint8(3)
+	propertyIdentifierLength, _propertyIdentifierLengthErr := io.ReadUint8(3)
+	if _propertyIdentifierLengthErr != nil {
+		return nil, errors.New("Error parsing 'propertyIdentifierLength' field " + _propertyIdentifierLengthErr.Error())
+	}
 
 	// Array field (propertyIdentifier)
 	var propertyIdentifier []int8
@@ -136,7 +151,11 @@ func BACnetConfirmedServiceRequestReadPropertyParse(io spi.ReadBuffer) (BACnetCo
 		propertyIdentifier := make([]int8, propertyIdentifierLength)
 		for curItem := uint16(0); curItem < uint16(propertyIdentifierLength); curItem++ {
 
-			propertyIdentifier = append(propertyIdentifier, io.ReadInt8(8))
+			_propertyIdentifierVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'propertyIdentifier' field " + _err.Error())
+			}
+			propertyIdentifier = append(propertyIdentifier, _propertyIdentifierVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
index 8432dbb..727ceb8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
@@ -129,49 +129,79 @@ func (m BACnetConfirmedServiceRequestSubscribeCOV) LengthInBytes() uint16 {
 func BACnetConfirmedServiceRequestSubscribeCOVParse(io spi.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
 
 	// Const Field (subscriberProcessIdentifierHeader)
-	var subscriberProcessIdentifierHeader uint8 = io.ReadUint8(8)
+	subscriberProcessIdentifierHeader, _subscriberProcessIdentifierHeaderErr := io.ReadUint8(8)
+	if _subscriberProcessIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'subscriberProcessIdentifierHeader' field " + _subscriberProcessIdentifierHeaderErr.Error())
+	}
 	if subscriberProcessIdentifierHeader != BACnetConfirmedServiceRequestSubscribeCOV_SUBSCRIBERPROCESSIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestSubscribeCOV_SUBSCRIBERPROCESSIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(subscriberProcessIdentifierHeader)))
 	}
 
 	// Simple Field (subscriberProcessIdentifier)
-	var subscriberProcessIdentifier uint8 = io.ReadUint8(8)
+	subscriberProcessIdentifier, _subscriberProcessIdentifierErr := io.ReadUint8(8)
+	if _subscriberProcessIdentifierErr != nil {
+		return nil, errors.New("Error parsing 'subscriberProcessIdentifier' field " + _subscriberProcessIdentifierErr.Error())
+	}
 
 	// Const Field (monitoredObjectIdentifierHeader)
-	var monitoredObjectIdentifierHeader uint8 = io.ReadUint8(8)
+	monitoredObjectIdentifierHeader, _monitoredObjectIdentifierHeaderErr := io.ReadUint8(8)
+	if _monitoredObjectIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'monitoredObjectIdentifierHeader' field " + _monitoredObjectIdentifierHeaderErr.Error())
+	}
 	if monitoredObjectIdentifierHeader != BACnetConfirmedServiceRequestSubscribeCOV_MONITOREDOBJECTIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestSubscribeCOV_MONITOREDOBJECTIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(monitoredObjectIdentifierHeader)))
 	}
 
 	// Simple Field (monitoredObjectType)
-	var monitoredObjectType uint16 = io.ReadUint16(10)
+	monitoredObjectType, _monitoredObjectTypeErr := io.ReadUint16(10)
+	if _monitoredObjectTypeErr != nil {
+		return nil, errors.New("Error parsing 'monitoredObjectType' field " + _monitoredObjectTypeErr.Error())
+	}
 
 	// Simple Field (monitoredObjectInstanceNumber)
-	var monitoredObjectInstanceNumber uint32 = io.ReadUint32(22)
+	monitoredObjectInstanceNumber, _monitoredObjectInstanceNumberErr := io.ReadUint32(22)
+	if _monitoredObjectInstanceNumberErr != nil {
+		return nil, errors.New("Error parsing 'monitoredObjectInstanceNumber' field " + _monitoredObjectInstanceNumberErr.Error())
+	}
 
 	// Const Field (issueConfirmedNotificationsHeader)
-	var issueConfirmedNotificationsHeader uint8 = io.ReadUint8(8)
+	issueConfirmedNotificationsHeader, _issueConfirmedNotificationsHeaderErr := io.ReadUint8(8)
+	if _issueConfirmedNotificationsHeaderErr != nil {
+		return nil, errors.New("Error parsing 'issueConfirmedNotificationsHeader' field " + _issueConfirmedNotificationsHeaderErr.Error())
+	}
 	if issueConfirmedNotificationsHeader != BACnetConfirmedServiceRequestSubscribeCOV_ISSUECONFIRMEDNOTIFICATIONSHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestSubscribeCOV_ISSUECONFIRMEDNOTIFICATIONSHEADER)) + " but got " + strconv.Itoa(int(issueConfirmedNotificationsHeader)))
 	}
 
 	// Const Field (issueConfirmedNotificationsSkipBits)
-	var issueConfirmedNotificationsSkipBits uint8 = io.ReadUint8(7)
+	issueConfirmedNotificationsSkipBits, _issueConfirmedNotificationsSkipBitsErr := io.ReadUint8(7)
+	if _issueConfirmedNotificationsSkipBitsErr != nil {
+		return nil, errors.New("Error parsing 'issueConfirmedNotificationsSkipBits' field " + _issueConfirmedNotificationsSkipBitsErr.Error())
+	}
 	if issueConfirmedNotificationsSkipBits != BACnetConfirmedServiceRequestSubscribeCOV_ISSUECONFIRMEDNOTIFICATIONSSKIPBITS {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestSubscribeCOV_ISSUECONFIRMEDNOTIFICATIONSSKIPBITS)) + " but got " + strconv.Itoa(int(issueConfirmedNotificationsSkipBits)))
 	}
 
 	// Simple Field (issueConfirmedNotifications)
-	var issueConfirmedNotifications bool = io.ReadBit()
+	issueConfirmedNotifications, _issueConfirmedNotificationsErr := io.ReadBit()
+	if _issueConfirmedNotificationsErr != nil {
+		return nil, errors.New("Error parsing 'issueConfirmedNotifications' field " + _issueConfirmedNotificationsErr.Error())
+	}
 
 	// Const Field (lifetimeHeader)
-	var lifetimeHeader uint8 = io.ReadUint8(5)
+	lifetimeHeader, _lifetimeHeaderErr := io.ReadUint8(5)
+	if _lifetimeHeaderErr != nil {
+		return nil, errors.New("Error parsing 'lifetimeHeader' field " + _lifetimeHeaderErr.Error())
+	}
 	if lifetimeHeader != BACnetConfirmedServiceRequestSubscribeCOV_LIFETIMEHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestSubscribeCOV_LIFETIMEHEADER)) + " but got " + strconv.Itoa(int(lifetimeHeader)))
 	}
 
 	// Simple Field (lifetimeLength)
-	var lifetimeLength uint8 = io.ReadUint8(3)
+	lifetimeLength, _lifetimeLengthErr := io.ReadUint8(3)
+	if _lifetimeLengthErr != nil {
+		return nil, errors.New("Error parsing 'lifetimeLength' field " + _lifetimeLengthErr.Error())
+	}
 
 	// Array field (lifetimeSeconds)
 	var lifetimeSeconds []int8
@@ -180,7 +210,11 @@ func BACnetConfirmedServiceRequestSubscribeCOVParse(io spi.ReadBuffer) (BACnetCo
 		lifetimeSeconds := make([]int8, lifetimeLength)
 		for curItem := uint16(0); curItem < uint16(lifetimeLength); curItem++ {
 
-			lifetimeSeconds = append(lifetimeSeconds, io.ReadInt8(8))
+			_lifetimeSecondsVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'lifetimeSeconds' field " + _err.Error())
+			}
+			lifetimeSeconds = append(lifetimeSeconds, _lifetimeSecondsVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
index 59fd7d7..80fb4d4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
@@ -37,8 +37,8 @@ type BACnetConfirmedServiceRequestWriteProperty struct {
 	objectInstanceNumber     uint32
 	propertyIdentifierLength uint8
 	propertyIdentifier       []int8
-	value                    BACnetTag
-	priority                 *BACnetTag
+	value                    IBACnetTag
+	priority                 *IBACnetTag
 	BACnetConfirmedServiceRequest
 }
 
@@ -57,7 +57,7 @@ func (m BACnetConfirmedServiceRequestWriteProperty) initialize() spi.Message {
 	return m
 }
 
-func NewBACnetConfirmedServiceRequestWriteProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8, value BACnetTag, priority *BACnetTag) BACnetConfirmedServiceRequestInitializer {
+func NewBACnetConfirmedServiceRequestWriteProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8, value IBACnetTag, priority *IBACnetTag) BACnetConfirmedServiceRequestInitializer {
 	return &BACnetConfirmedServiceRequestWriteProperty{objectType: objectType, objectInstanceNumber: objectInstanceNumber, propertyIdentifierLength: propertyIdentifierLength, propertyIdentifier: propertyIdentifier, value: value, priority: priority}
 }
 
@@ -115,7 +115,7 @@ func (m BACnetConfirmedServiceRequestWriteProperty) LengthInBits() uint16 {
 
 	// Optional Field (priority)
 	if m.priority != nil {
-		lengthInBits += m.priority.LengthInBits()
+		lengthInBits += (*m.priority).LengthInBits()
 	}
 
 	return lengthInBits
@@ -130,25 +130,40 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io spi.ReadBuffer, len uint
 	var curPos uint16
 
 	// Const Field (objectIdentifierHeader)
-	var objectIdentifierHeader uint8 = io.ReadUint8(8)
+	objectIdentifierHeader, _objectIdentifierHeaderErr := io.ReadUint8(8)
+	if _objectIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'objectIdentifierHeader' field " + _objectIdentifierHeaderErr.Error())
+	}
 	if objectIdentifierHeader != BACnetConfirmedServiceRequestWriteProperty_OBJECTIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestWriteProperty_OBJECTIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(objectIdentifierHeader)))
 	}
 
 	// Simple Field (objectType)
-	var objectType uint16 = io.ReadUint16(10)
+	objectType, _objectTypeErr := io.ReadUint16(10)
+	if _objectTypeErr != nil {
+		return nil, errors.New("Error parsing 'objectType' field " + _objectTypeErr.Error())
+	}
 
 	// Simple Field (objectInstanceNumber)
-	var objectInstanceNumber uint32 = io.ReadUint32(22)
+	objectInstanceNumber, _objectInstanceNumberErr := io.ReadUint32(22)
+	if _objectInstanceNumberErr != nil {
+		return nil, errors.New("Error parsing 'objectInstanceNumber' field " + _objectInstanceNumberErr.Error())
+	}
 
 	// Const Field (propertyIdentifierHeader)
-	var propertyIdentifierHeader uint8 = io.ReadUint8(5)
+	propertyIdentifierHeader, _propertyIdentifierHeaderErr := io.ReadUint8(5)
+	if _propertyIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'propertyIdentifierHeader' field " + _propertyIdentifierHeaderErr.Error())
+	}
 	if propertyIdentifierHeader != BACnetConfirmedServiceRequestWriteProperty_PROPERTYIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestWriteProperty_PROPERTYIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(propertyIdentifierHeader)))
 	}
 
 	// Simple Field (propertyIdentifierLength)
-	var propertyIdentifierLength uint8 = io.ReadUint8(3)
+	propertyIdentifierLength, _propertyIdentifierLengthErr := io.ReadUint8(3)
+	if _propertyIdentifierLengthErr != nil {
+		return nil, errors.New("Error parsing 'propertyIdentifierLength' field " + _propertyIdentifierLengthErr.Error())
+	}
 
 	// Array field (propertyIdentifier)
 	var propertyIdentifier []int8
@@ -157,12 +172,19 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io spi.ReadBuffer, len uint
 		propertyIdentifier := make([]int8, propertyIdentifierLength)
 		for curItem := uint16(0); curItem < uint16(propertyIdentifierLength); curItem++ {
 
-			propertyIdentifier = append(propertyIdentifier, io.ReadInt8(8))
+			_propertyIdentifierVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'propertyIdentifier' field " + _err.Error())
+			}
+			propertyIdentifier = append(propertyIdentifier, _propertyIdentifierVal)
 		}
 	}
 
 	// Const Field (openingTag)
-	var openingTag uint8 = io.ReadUint8(8)
+	openingTag, _openingTagErr := io.ReadUint8(8)
+	if _openingTagErr != nil {
+		return nil, errors.New("Error parsing 'openingTag' field " + _openingTagErr.Error())
+	}
 	if openingTag != BACnetConfirmedServiceRequestWriteProperty_OPENINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestWriteProperty_OPENINGTAG)) + " but got " + strconv.Itoa(int(openingTag)))
 	}
@@ -172,30 +194,33 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io spi.ReadBuffer, len uint
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'value'. " + _err.Error())
 	}
-	var value BACnetTag
-	value, _valueOk := _valueMessage.(BACnetTag)
+	var value IBACnetTag
+	value, _valueOk := _valueMessage.(IBACnetTag)
 	if !_valueOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_valueMessage).Name() + " to BACnetTag")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_valueMessage).Name() + " to IBACnetTag")
 	}
 
 	// Const Field (closingTag)
-	var closingTag uint8 = io.ReadUint8(8)
+	closingTag, _closingTagErr := io.ReadUint8(8)
+	if _closingTagErr != nil {
+		return nil, errors.New("Error parsing 'closingTag' field " + _closingTagErr.Error())
+	}
 	if closingTag != BACnetConfirmedServiceRequestWriteProperty_CLOSINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestWriteProperty_CLOSINGTAG)) + " but got " + strconv.Itoa(int(closingTag)))
 	}
 
 	// Optional Field (priority) (Can be skipped, if a given expression evaluates to false)
 	curPos = io.GetPos() - startPos
-	var priority *BACnetTag = nil
+	var priority *IBACnetTag = nil
 	if bool((curPos) < ((len) - (1))) {
 		_message, _err := BACnetTagParse(io)
 		if _err != nil {
 			return nil, errors.New("Error parsing 'priority' field " + _err.Error())
 		}
-		var _item BACnetTag
-		_item, _ok := _message.(BACnetTag)
+		var _item IBACnetTag
+		_item, _ok := _message.(IBACnetTag)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to BACnetTag")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IBACnetTag")
 		}
 		priority = &_item
 	}
@@ -235,16 +260,16 @@ func (m BACnetConfirmedServiceRequestWriteProperty) Serialize(io spi.WriteBuffer
 	io.WriteUint8(8, 0x3E)
 
 	// Simple Field (value)
-	value := BACnetTag(m.value)
+	value := IBACnetTag(m.value)
 	value.Serialize(io)
 
 	// Const Field (closingTag)
 	io.WriteUint8(8, 0x3F)
 
 	// Optional Field (priority) (Can be skipped, if the value is null)
-	var priority *BACnetTag = nil
+	var priority *IBACnetTag = nil
 	if m.priority != nil {
 		priority = m.priority
-		priority.Serialize(io)
+		(*priority).Serialize(io)
 	}
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
index 7bc9dd5..bb6debd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
@@ -80,7 +80,10 @@ func (m BACnetError) LengthInBytes() uint16 {
 func BACnetErrorParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	var serviceChoice uint8 = io.ReadUint8(8)
+	serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
+	if _serviceChoiceErr != nil {
+		return nil, errors.New("Error parsing 'serviceChoice' field " + _serviceChoiceErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer BACnetErrorInitializer
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
index 7e6f0e8..90523ae 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
@@ -111,13 +111,19 @@ func (m BACnetErrorReadProperty) LengthInBytes() uint16 {
 func BACnetErrorReadPropertyParse(io spi.ReadBuffer) (BACnetErrorInitializer, error) {
 
 	// Const Field (errorClassHeader)
-	var errorClassHeader uint8 = io.ReadUint8(5)
+	errorClassHeader, _errorClassHeaderErr := io.ReadUint8(5)
+	if _errorClassHeaderErr != nil {
+		return nil, errors.New("Error parsing 'errorClassHeader' field " + _errorClassHeaderErr.Error())
+	}
 	if errorClassHeader != BACnetErrorReadProperty_ERRORCLASSHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetErrorReadProperty_ERRORCLASSHEADER)) + " but got " + strconv.Itoa(int(errorClassHeader)))
 	}
 
 	// Simple Field (errorClassLength)
-	var errorClassLength uint8 = io.ReadUint8(3)
+	errorClassLength, _errorClassLengthErr := io.ReadUint8(3)
+	if _errorClassLengthErr != nil {
+		return nil, errors.New("Error parsing 'errorClassLength' field " + _errorClassLengthErr.Error())
+	}
 
 	// Array field (errorClass)
 	var errorClass []int8
@@ -126,18 +132,28 @@ func BACnetErrorReadPropertyParse(io spi.ReadBuffer) (BACnetErrorInitializer, er
 		errorClass := make([]int8, errorClassLength)
 		for curItem := uint16(0); curItem < uint16(errorClassLength); curItem++ {
 
-			errorClass = append(errorClass, io.ReadInt8(8))
+			_errorClassVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'errorClass' field " + _err.Error())
+			}
+			errorClass = append(errorClass, _errorClassVal)
 		}
 	}
 
 	// Const Field (errorCodeHeader)
-	var errorCodeHeader uint8 = io.ReadUint8(5)
+	errorCodeHeader, _errorCodeHeaderErr := io.ReadUint8(5)
+	if _errorCodeHeaderErr != nil {
+		return nil, errors.New("Error parsing 'errorCodeHeader' field " + _errorCodeHeaderErr.Error())
+	}
 	if errorCodeHeader != BACnetErrorReadProperty_ERRORCODEHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetErrorReadProperty_ERRORCODEHEADER)) + " but got " + strconv.Itoa(int(errorCodeHeader)))
 	}
 
 	// Simple Field (errorCodeLength)
-	var errorCodeLength uint8 = io.ReadUint8(3)
+	errorCodeLength, _errorCodeLengthErr := io.ReadUint8(3)
+	if _errorCodeLengthErr != nil {
+		return nil, errors.New("Error parsing 'errorCodeLength' field " + _errorCodeLengthErr.Error())
+	}
 
 	// Array field (errorCode)
 	var errorCode []int8
@@ -146,7 +162,11 @@ func BACnetErrorReadPropertyParse(io spi.ReadBuffer) (BACnetErrorInitializer, er
 		errorCode := make([]int8, errorCodeLength)
 		for curItem := uint16(0); curItem < uint16(errorCodeLength); curItem++ {
 
-			errorCode = append(errorCode, io.ReadInt8(8))
+			_errorCodeVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'errorCode' field " + _err.Error())
+			}
+			errorCode = append(errorCode, _errorCodeVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
index 9eb834b..c749a44 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type BACnetNetworkType uint8
 
+type IBACnetNetworkType interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	BACnetNetworkType_ETHERNET           BACnetNetworkType = 0x0
 	BACnetNetworkType_ARCNET             BACnetNetworkType = 0x1
@@ -46,6 +51,14 @@ func CastBACnetNetworkType(structType interface{}) BACnetNetworkType {
 	return castFunc(structType)
 }
 
+func (m BACnetNetworkType) LengthInBits() uint16 {
+	return 4
+}
+
+func (m BACnetNetworkType) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func BACnetNetworkTypeParse(io spi.ReadBuffer) (BACnetNetworkType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
index e5313d0..a1150d5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type BACnetNodeType uint8
 
+type IBACnetNodeType interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	BACnetNodeType_UNKNOWN        BACnetNodeType = 0x00
 	BACnetNodeType_SYSTEM         BACnetNodeType = 0x01
@@ -57,6 +62,14 @@ func CastBACnetNodeType(structType interface{}) BACnetNodeType {
 	return castFunc(structType)
 }
 
+func (m BACnetNodeType) LengthInBits() uint16 {
+	return 8
+}
+
+func (m BACnetNodeType) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func BACnetNodeTypeParse(io spi.ReadBuffer) (BACnetNodeType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
index 738dea4..60ac271 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type BACnetNotifyType uint8
 
+type IBACnetNotifyType interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	BACnetNotifyType_ALARM            BACnetNotifyType = 0x0
 	BACnetNotifyType_EVENT            BACnetNotifyType = 0x1
@@ -38,6 +43,14 @@ func CastBACnetNotifyType(structType interface{}) BACnetNotifyType {
 	return castFunc(structType)
 }
 
+func (m BACnetNotifyType) LengthInBits() uint16 {
+	return 4
+}
+
+func (m BACnetNotifyType) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func BACnetNotifyTypeParse(io spi.ReadBuffer) (BACnetNotifyType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
index 9b103f5..025063a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type BACnetObjectType uint16
 
+type IBACnetObjectType interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	BACnetObjectType_ANALOG_INPUT           BACnetObjectType = 0x000
 	BACnetObjectType_ANALOG_OUTPUT          BACnetObjectType = 0x001
@@ -94,6 +99,14 @@ func CastBACnetObjectType(structType interface{}) BACnetObjectType {
 	return castFunc(structType)
 }
 
+func (m BACnetObjectType) LengthInBits() uint16 {
+	return 10
+}
+
+func (m BACnetObjectType) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func BACnetObjectTypeParse(io spi.ReadBuffer) (BACnetObjectType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
index 3062a3c..7cf12c0 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
@@ -80,7 +80,10 @@ func (m BACnetServiceAck) LengthInBytes() uint16 {
 func BACnetServiceAckParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	var serviceChoice uint8 = io.ReadUint8(8)
+	serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
+	if _serviceChoiceErr != nil {
+		return nil, errors.New("Error parsing 'serviceChoice' field " + _serviceChoiceErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer BACnetServiceAckInitializer
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
index e81d426..31740c5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
@@ -37,7 +37,7 @@ type BACnetServiceAckReadProperty struct {
 	objectInstanceNumber     uint32
 	propertyIdentifierLength uint8
 	propertyIdentifier       []int8
-	value                    BACnetTag
+	value                    IBACnetTag
 	BACnetServiceAck
 }
 
@@ -56,7 +56,7 @@ func (m BACnetServiceAckReadProperty) initialize() spi.Message {
 	return m
 }
 
-func NewBACnetServiceAckReadProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8, value BACnetTag) BACnetServiceAckInitializer {
+func NewBACnetServiceAckReadProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8, value IBACnetTag) BACnetServiceAckInitializer {
 	return &BACnetServiceAckReadProperty{objectType: objectType, objectInstanceNumber: objectInstanceNumber, propertyIdentifierLength: propertyIdentifierLength, propertyIdentifier: propertyIdentifier, value: value}
 }
 
@@ -122,25 +122,40 @@ func (m BACnetServiceAckReadProperty) LengthInBytes() uint16 {
 func BACnetServiceAckReadPropertyParse(io spi.ReadBuffer) (BACnetServiceAckInitializer, error) {
 
 	// Const Field (objectIdentifierHeader)
-	var objectIdentifierHeader uint8 = io.ReadUint8(8)
+	objectIdentifierHeader, _objectIdentifierHeaderErr := io.ReadUint8(8)
+	if _objectIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'objectIdentifierHeader' field " + _objectIdentifierHeaderErr.Error())
+	}
 	if objectIdentifierHeader != BACnetServiceAckReadProperty_OBJECTIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetServiceAckReadProperty_OBJECTIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(objectIdentifierHeader)))
 	}
 
 	// Simple Field (objectType)
-	var objectType uint16 = io.ReadUint16(10)
+	objectType, _objectTypeErr := io.ReadUint16(10)
+	if _objectTypeErr != nil {
+		return nil, errors.New("Error parsing 'objectType' field " + _objectTypeErr.Error())
+	}
 
 	// Simple Field (objectInstanceNumber)
-	var objectInstanceNumber uint32 = io.ReadUint32(22)
+	objectInstanceNumber, _objectInstanceNumberErr := io.ReadUint32(22)
+	if _objectInstanceNumberErr != nil {
+		return nil, errors.New("Error parsing 'objectInstanceNumber' field " + _objectInstanceNumberErr.Error())
+	}
 
 	// Const Field (propertyIdentifierHeader)
-	var propertyIdentifierHeader uint8 = io.ReadUint8(5)
+	propertyIdentifierHeader, _propertyIdentifierHeaderErr := io.ReadUint8(5)
+	if _propertyIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'propertyIdentifierHeader' field " + _propertyIdentifierHeaderErr.Error())
+	}
 	if propertyIdentifierHeader != BACnetServiceAckReadProperty_PROPERTYIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetServiceAckReadProperty_PROPERTYIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(propertyIdentifierHeader)))
 	}
 
 	// Simple Field (propertyIdentifierLength)
-	var propertyIdentifierLength uint8 = io.ReadUint8(3)
+	propertyIdentifierLength, _propertyIdentifierLengthErr := io.ReadUint8(3)
+	if _propertyIdentifierLengthErr != nil {
+		return nil, errors.New("Error parsing 'propertyIdentifierLength' field " + _propertyIdentifierLengthErr.Error())
+	}
 
 	// Array field (propertyIdentifier)
 	var propertyIdentifier []int8
@@ -149,12 +164,19 @@ func BACnetServiceAckReadPropertyParse(io spi.ReadBuffer) (BACnetServiceAckIniti
 		propertyIdentifier := make([]int8, propertyIdentifierLength)
 		for curItem := uint16(0); curItem < uint16(propertyIdentifierLength); curItem++ {
 
-			propertyIdentifier = append(propertyIdentifier, io.ReadInt8(8))
+			_propertyIdentifierVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'propertyIdentifier' field " + _err.Error())
+			}
+			propertyIdentifier = append(propertyIdentifier, _propertyIdentifierVal)
 		}
 	}
 
 	// Const Field (openingTag)
-	var openingTag uint8 = io.ReadUint8(8)
+	openingTag, _openingTagErr := io.ReadUint8(8)
+	if _openingTagErr != nil {
+		return nil, errors.New("Error parsing 'openingTag' field " + _openingTagErr.Error())
+	}
 	if openingTag != BACnetServiceAckReadProperty_OPENINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetServiceAckReadProperty_OPENINGTAG)) + " but got " + strconv.Itoa(int(openingTag)))
 	}
@@ -164,14 +186,17 @@ func BACnetServiceAckReadPropertyParse(io spi.ReadBuffer) (BACnetServiceAckIniti
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'value'. " + _err.Error())
 	}
-	var value BACnetTag
-	value, _valueOk := _valueMessage.(BACnetTag)
+	var value IBACnetTag
+	value, _valueOk := _valueMessage.(IBACnetTag)
 	if !_valueOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_valueMessage).Name() + " to BACnetTag")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_valueMessage).Name() + " to IBACnetTag")
 	}
 
 	// Const Field (closingTag)
-	var closingTag uint8 = io.ReadUint8(8)
+	closingTag, _closingTagErr := io.ReadUint8(8)
+	if _closingTagErr != nil {
+		return nil, errors.New("Error parsing 'closingTag' field " + _closingTagErr.Error())
+	}
 	if closingTag != BACnetServiceAckReadProperty_CLOSINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetServiceAckReadProperty_CLOSINGTAG)) + " but got " + strconv.Itoa(int(closingTag)))
 	}
@@ -211,7 +236,7 @@ func (m BACnetServiceAckReadProperty) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, 0x3E)
 
 	// Simple Field (value)
-	value := BACnetTag(m.value)
+	value := IBACnetTag(m.value)
 	value.Serialize(io)
 
 	// Const Field (closingTag)
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
index ce9c52f..3bb6d07 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
@@ -100,25 +100,42 @@ func (m BACnetTag) LengthInBytes() uint16 {
 func BACnetTagParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (typeOrTagNumber)
-	var typeOrTagNumber uint8 = io.ReadUint8(4)
+	typeOrTagNumber, _typeOrTagNumberErr := io.ReadUint8(4)
+	if _typeOrTagNumberErr != nil {
+		return nil, errors.New("Error parsing 'typeOrTagNumber' field " + _typeOrTagNumberErr.Error())
+	}
 
 	// Discriminator Field (contextSpecificTag) (Used as input to a switch field)
-	var contextSpecificTag uint8 = io.ReadUint8(1)
+	contextSpecificTag, _contextSpecificTagErr := io.ReadUint8(1)
+	if _contextSpecificTagErr != nil {
+		return nil, errors.New("Error parsing 'contextSpecificTag' field " + _contextSpecificTagErr.Error())
+	}
 
 	// Simple Field (lengthValueType)
-	var lengthValueType uint8 = io.ReadUint8(3)
+	lengthValueType, _lengthValueTypeErr := io.ReadUint8(3)
+	if _lengthValueTypeErr != nil {
+		return nil, errors.New("Error parsing 'lengthValueType' field " + _lengthValueTypeErr.Error())
+	}
 
 	// Optional Field (extTagNumber) (Can be skipped, if a given expression evaluates to false)
 	var extTagNumber *uint8 = nil
 	if bool((typeOrTagNumber) == (15)) {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'extTagNumber' field " + _err.Error())
+		}
+
 		extTagNumber = &_val
 	}
 
 	// Optional Field (extLength) (Can be skipped, if a given expression evaluates to false)
 	var extLength *uint8 = nil
 	if bool((lengthValueType) == (5)) {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'extLength' field " + _err.Error())
+		}
+
 		extLength = &_val
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
index 24c3ca7..804879d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -93,7 +94,10 @@ func (m BACnetTagApplicationBitString) LengthInBytes() uint16 {
 func BACnetTagApplicationBitStringParse(io spi.ReadBuffer, lengthValueType uint8, extLength uint8) (BACnetTagInitializer, error) {
 
 	// Simple Field (unusedBits)
-	var unusedBits uint8 = io.ReadUint8(8)
+	unusedBits, _unusedBitsErr := io.ReadUint8(8)
+	if _unusedBitsErr != nil {
+		return nil, errors.New("Error parsing 'unusedBits' field " + _unusedBitsErr.Error())
+	}
 
 	// Array field (data)
 	var data []int8
@@ -101,7 +105,11 @@ func BACnetTagApplicationBitStringParse(io spi.ReadBuffer, lengthValueType uint8
 	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(uint16(uint16(extLength)-uint16(uint16(1)))), uint16(uint16(uint16(lengthValueType)-uint16(uint16(1)))))
 	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
-		data = append(data, io.ReadInt8(8))
+		_dataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'data' field " + _err.Error())
+		}
+		data = append(data, _dataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
index f987e67..0439430 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -87,7 +88,10 @@ func (m BACnetTagApplicationDouble) LengthInBytes() uint16 {
 func BACnetTagApplicationDoubleParse(io spi.ReadBuffer, lengthValueType uint8, extLength uint8) (BACnetTagInitializer, error) {
 
 	// Simple Field (value)
-	var value float64 = io.ReadFloat64(64)
+	value, _valueErr := io.ReadFloat64(64)
+	if _valueErr != nil {
+		return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+	}
 
 	// Create the instance
 	return NewBACnetTagApplicationDouble(value), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
index ef4288f..1099853 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -94,7 +95,11 @@ func BACnetTagApplicationEnumeratedParse(io spi.ReadBuffer, lengthValueType uint
 	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
 	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
-		data = append(data, io.ReadInt8(8))
+		_dataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'data' field " + _err.Error())
+		}
+		data = append(data, _dataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
index 6f23f1e..d50514d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -87,7 +88,10 @@ func (m BACnetTagApplicationReal) LengthInBytes() uint16 {
 func BACnetTagApplicationRealParse(io spi.ReadBuffer, lengthValueType uint8, extLength uint8) (BACnetTagInitializer, error) {
 
 	// Simple Field (value)
-	var value float32 = io.ReadFloat32(32)
+	value, _valueErr := io.ReadFloat32(32)
+	if _valueErr != nil {
+		return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+	}
 
 	// Create the instance
 	return NewBACnetTagApplicationReal(value), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
index 2867a3f..419bde2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -94,7 +95,11 @@ func BACnetTagApplicationSignedIntegerParse(io spi.ReadBuffer, lengthValueType u
 	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
 	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
-		data = append(data, io.ReadInt8(8))
+		_dataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'data' field " + _err.Error())
+		}
+		data = append(data, _dataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
index 93d4161..cee347a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -94,7 +95,11 @@ func BACnetTagApplicationUnsignedIntegerParse(io spi.ReadBuffer, lengthValueType
 	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
 	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
-		data = append(data, io.ReadInt8(8))
+		_dataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'data' field " + _err.Error())
+		}
+		data = append(data, _dataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
index b9d61fc..6f870a0 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -94,7 +95,11 @@ func BACnetTagContextParse(io spi.ReadBuffer, typeOrTagNumber uint8, extTagNumbe
 	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
 	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
-		data = append(data, io.ReadInt8(8))
+		_dataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'data' field " + _err.Error())
+		}
+		data = append(data, _dataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
index 6eb3b61..a74d79a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
@@ -37,7 +37,7 @@ type BACnetTagWithContent struct {
 	extTagNumber       *uint8
 	extLength          *uint8
 	propertyIdentifier []uint8
-	value              BACnetTag
+	value              IBACnetTag
 }
 
 // The corresponding interface
@@ -46,7 +46,7 @@ type IBACnetTagWithContent interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewBACnetTagWithContent(typeOrTagNumber uint8, contextSpecificTag uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, propertyIdentifier []uint8, value BACnetTag) spi.Message {
+func NewBACnetTagWithContent(typeOrTagNumber uint8, contextSpecificTag uint8, lengthValueType uint8, extTagNumber *uint8, extLength *uint8, propertyIdentifier []uint8, value IBACnetTag) spi.Message {
 	return &BACnetTagWithContent{typeOrTagNumber: typeOrTagNumber, contextSpecificTag: contextSpecificTag, lengthValueType: lengthValueType, extTagNumber: extTagNumber, extLength: extLength, propertyIdentifier: propertyIdentifier, value: value}
 }
 
@@ -116,39 +116,63 @@ func (m BACnetTagWithContent) LengthInBytes() uint16 {
 func BACnetTagWithContentParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (typeOrTagNumber)
-	var typeOrTagNumber uint8 = io.ReadUint8(4)
+	typeOrTagNumber, _typeOrTagNumberErr := io.ReadUint8(4)
+	if _typeOrTagNumberErr != nil {
+		return nil, errors.New("Error parsing 'typeOrTagNumber' field " + _typeOrTagNumberErr.Error())
+	}
 
 	// Simple Field (contextSpecificTag)
-	var contextSpecificTag uint8 = io.ReadUint8(1)
+	contextSpecificTag, _contextSpecificTagErr := io.ReadUint8(1)
+	if _contextSpecificTagErr != nil {
+		return nil, errors.New("Error parsing 'contextSpecificTag' field " + _contextSpecificTagErr.Error())
+	}
 
 	// Simple Field (lengthValueType)
-	var lengthValueType uint8 = io.ReadUint8(3)
+	lengthValueType, _lengthValueTypeErr := io.ReadUint8(3)
+	if _lengthValueTypeErr != nil {
+		return nil, errors.New("Error parsing 'lengthValueType' field " + _lengthValueTypeErr.Error())
+	}
 
 	// Optional Field (extTagNumber) (Can be skipped, if a given expression evaluates to false)
 	var extTagNumber *uint8 = nil
 	if bool((typeOrTagNumber) == (15)) {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'extTagNumber' field " + _err.Error())
+		}
+
 		extTagNumber = &_val
 	}
 
 	// Optional Field (extLength) (Can be skipped, if a given expression evaluates to false)
 	var extLength *uint8 = nil
 	if bool((lengthValueType) == (5)) {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'extLength' field " + _err.Error())
+		}
+
 		extLength = &_val
 	}
 
 	// Array field (propertyIdentifier)
 	var propertyIdentifier []uint8
 	// Length array
-	_propertyIdentifierLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(*extLength), uint16(lengthValueType))
+	_propertyIdentifierLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16((*extLength)), uint16(lengthValueType))
 	_propertyIdentifierEndPos := io.GetPos() + uint16(_propertyIdentifierLength)
 	for io.GetPos() < _propertyIdentifierEndPos {
-		propertyIdentifier = append(propertyIdentifier, io.ReadUint8(8))
+		_propertyIdentifierVal, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'propertyIdentifier' field " + _err.Error())
+		}
+		propertyIdentifier = append(propertyIdentifier, _propertyIdentifierVal)
 	}
 
 	// Const Field (openTag)
-	var openTag uint8 = io.ReadUint8(8)
+	openTag, _openTagErr := io.ReadUint8(8)
+	if _openTagErr != nil {
+		return nil, errors.New("Error parsing 'openTag' field " + _openTagErr.Error())
+	}
 	if openTag != BACnetTagWithContent_OPENTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetTagWithContent_OPENTAG)) + " but got " + strconv.Itoa(int(openTag)))
 	}
@@ -158,14 +182,17 @@ func BACnetTagWithContentParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'value'. " + _err.Error())
 	}
-	var value BACnetTag
-	value, _valueOk := _valueMessage.(BACnetTag)
+	var value IBACnetTag
+	value, _valueOk := _valueMessage.(IBACnetTag)
 	if !_valueOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_valueMessage).Name() + " to BACnetTag")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_valueMessage).Name() + " to IBACnetTag")
 	}
 
 	// Const Field (closingTag)
-	var closingTag uint8 = io.ReadUint8(8)
+	closingTag, _closingTagErr := io.ReadUint8(8)
+	if _closingTagErr != nil {
+		return nil, errors.New("Error parsing 'closingTag' field " + _closingTagErr.Error())
+	}
 	if closingTag != BACnetTagWithContent_CLOSINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetTagWithContent_CLOSINGTAG)) + " but got " + strconv.Itoa(int(closingTag)))
 	}
@@ -213,7 +240,7 @@ func (m BACnetTagWithContent) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, 0x2e)
 
 	// Simple Field (value)
-	value := BACnetTag(m.value)
+	value := IBACnetTag(m.value)
 	value.Serialize(io)
 
 	// Const Field (closingTag)
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
index 67d59a8..c59b6f5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
@@ -80,7 +80,10 @@ func (m BACnetUnconfirmedServiceRequest) LengthInBytes() uint16 {
 func BACnetUnconfirmedServiceRequestParse(io spi.ReadBuffer, len uint16) (spi.Message, error) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	var serviceChoice uint8 = io.ReadUint8(8)
+	serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
+	if _serviceChoiceErr != nil {
+		return nil, errors.New("Error parsing 'serviceChoice' field " + _serviceChoiceErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer BACnetUnconfirmedServiceRequestInitializer
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
index b737dd1..f2dcfa8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
@@ -125,25 +125,40 @@ func (m BACnetUnconfirmedServiceRequestIAm) LengthInBytes() uint16 {
 func BACnetUnconfirmedServiceRequestIAmParse(io spi.ReadBuffer) (BACnetUnconfirmedServiceRequestInitializer, error) {
 
 	// Const Field (objectIdentifierHeader)
-	var objectIdentifierHeader uint8 = io.ReadUint8(8)
+	objectIdentifierHeader, _objectIdentifierHeaderErr := io.ReadUint8(8)
+	if _objectIdentifierHeaderErr != nil {
+		return nil, errors.New("Error parsing 'objectIdentifierHeader' field " + _objectIdentifierHeaderErr.Error())
+	}
 	if objectIdentifierHeader != BACnetUnconfirmedServiceRequestIAm_OBJECTIDENTIFIERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestIAm_OBJECTIDENTIFIERHEADER)) + " but got " + strconv.Itoa(int(objectIdentifierHeader)))
 	}
 
 	// Simple Field (objectType)
-	var objectType uint16 = io.ReadUint16(10)
+	objectType, _objectTypeErr := io.ReadUint16(10)
+	if _objectTypeErr != nil {
+		return nil, errors.New("Error parsing 'objectType' field " + _objectTypeErr.Error())
+	}
 
 	// Simple Field (objectInstanceNumber)
-	var objectInstanceNumber uint32 = io.ReadUint32(22)
+	objectInstanceNumber, _objectInstanceNumberErr := io.ReadUint32(22)
+	if _objectInstanceNumberErr != nil {
+		return nil, errors.New("Error parsing 'objectInstanceNumber' field " + _objectInstanceNumberErr.Error())
+	}
 
 	// Const Field (maximumApduLengthAcceptedHeader)
-	var maximumApduLengthAcceptedHeader uint8 = io.ReadUint8(5)
+	maximumApduLengthAcceptedHeader, _maximumApduLengthAcceptedHeaderErr := io.ReadUint8(5)
+	if _maximumApduLengthAcceptedHeaderErr != nil {
+		return nil, errors.New("Error parsing 'maximumApduLengthAcceptedHeader' field " + _maximumApduLengthAcceptedHeaderErr.Error())
+	}
 	if maximumApduLengthAcceptedHeader != BACnetUnconfirmedServiceRequestIAm_MAXIMUMAPDULENGTHACCEPTEDHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestIAm_MAXIMUMAPDULENGTHACCEPTEDHEADER)) + " but got " + strconv.Itoa(int(maximumApduLengthAcceptedHeader)))
 	}
 
 	// Simple Field (maximumApduLengthAcceptedLength)
-	var maximumApduLengthAcceptedLength uint8 = io.ReadUint8(3)
+	maximumApduLengthAcceptedLength, _maximumApduLengthAcceptedLengthErr := io.ReadUint8(3)
+	if _maximumApduLengthAcceptedLengthErr != nil {
+		return nil, errors.New("Error parsing 'maximumApduLengthAcceptedLength' field " + _maximumApduLengthAcceptedLengthErr.Error())
+	}
 
 	// Array field (maximumApduLengthAccepted)
 	var maximumApduLengthAccepted []int8
@@ -152,27 +167,43 @@ func BACnetUnconfirmedServiceRequestIAmParse(io spi.ReadBuffer) (BACnetUnconfirm
 		maximumApduLengthAccepted := make([]int8, maximumApduLengthAcceptedLength)
 		for curItem := uint16(0); curItem < uint16(maximumApduLengthAcceptedLength); curItem++ {
 
-			maximumApduLengthAccepted = append(maximumApduLengthAccepted, io.ReadInt8(8))
+			_maximumApduLengthAcceptedVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'maximumApduLengthAccepted' field " + _err.Error())
+			}
+			maximumApduLengthAccepted = append(maximumApduLengthAccepted, _maximumApduLengthAcceptedVal)
 		}
 	}
 
 	// Const Field (segmentationSupportedHeader)
-	var segmentationSupportedHeader uint8 = io.ReadUint8(8)
+	segmentationSupportedHeader, _segmentationSupportedHeaderErr := io.ReadUint8(8)
+	if _segmentationSupportedHeaderErr != nil {
+		return nil, errors.New("Error parsing 'segmentationSupportedHeader' field " + _segmentationSupportedHeaderErr.Error())
+	}
 	if segmentationSupportedHeader != BACnetUnconfirmedServiceRequestIAm_SEGMENTATIONSUPPORTEDHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestIAm_SEGMENTATIONSUPPORTEDHEADER)) + " but got " + strconv.Itoa(int(segmentationSupportedHeader)))
 	}
 
 	// Simple Field (segmentationSupported)
-	var segmentationSupported uint8 = io.ReadUint8(8)
+	segmentationSupported, _segmentationSupportedErr := io.ReadUint8(8)
+	if _segmentationSupportedErr != nil {
+		return nil, errors.New("Error parsing 'segmentationSupported' field " + _segmentationSupportedErr.Error())
+	}
 
 	// Const Field (vendorIdHeader)
-	var vendorIdHeader uint8 = io.ReadUint8(8)
+	vendorIdHeader, _vendorIdHeaderErr := io.ReadUint8(8)
+	if _vendorIdHeaderErr != nil {
+		return nil, errors.New("Error parsing 'vendorIdHeader' field " + _vendorIdHeaderErr.Error())
+	}
 	if vendorIdHeader != BACnetUnconfirmedServiceRequestIAm_VENDORIDHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestIAm_VENDORIDHEADER)) + " but got " + strconv.Itoa(int(vendorIdHeader)))
 	}
 
 	// Simple Field (vendorId)
-	var vendorId uint8 = io.ReadUint8(8)
+	vendorId, _vendorIdErr := io.ReadUint8(8)
+	if _vendorIdErr != nil {
+		return nil, errors.New("Error parsing 'vendorId' field " + _vendorIdErr.Error())
+	}
 
 	// Create the instance
 	return NewBACnetUnconfirmedServiceRequestIAm(objectType, objectInstanceNumber, maximumApduLengthAcceptedLength, maximumApduLengthAccepted, segmentationSupported, vendorId), nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
index 1744ad2..a98b4c3 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
@@ -113,25 +113,40 @@ func (m BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) LengthInBytes
 func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(io spi.ReadBuffer, len uint16) (BACnetUnconfirmedServiceRequestInitializer, error) {
 
 	// Const Field (vendorIdHeader)
-	var vendorIdHeader uint8 = io.ReadUint8(8)
+	vendorIdHeader, _vendorIdHeaderErr := io.ReadUint8(8)
+	if _vendorIdHeaderErr != nil {
+		return nil, errors.New("Error parsing 'vendorIdHeader' field " + _vendorIdHeaderErr.Error())
+	}
 	if vendorIdHeader != BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_VENDORIDHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_VENDORIDHEADER)) + " but got " + strconv.Itoa(int(vendorIdHeader)))
 	}
 
 	// Simple Field (vendorId)
-	var vendorId uint8 = io.ReadUint8(8)
+	vendorId, _vendorIdErr := io.ReadUint8(8)
+	if _vendorIdErr != nil {
+		return nil, errors.New("Error parsing 'vendorId' field " + _vendorIdErr.Error())
+	}
 
 	// Const Field (serviceNumberHeader)
-	var serviceNumberHeader uint8 = io.ReadUint8(8)
+	serviceNumberHeader, _serviceNumberHeaderErr := io.ReadUint8(8)
+	if _serviceNumberHeaderErr != nil {
+		return nil, errors.New("Error parsing 'serviceNumberHeader' field " + _serviceNumberHeaderErr.Error())
+	}
 	if serviceNumberHeader != BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_SERVICENUMBERHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_SERVICENUMBERHEADER)) + " but got " + strconv.Itoa(int(serviceNumberHeader)))
 	}
 
 	// Simple Field (serviceNumber)
-	var serviceNumber uint16 = io.ReadUint16(16)
+	serviceNumber, _serviceNumberErr := io.ReadUint16(16)
+	if _serviceNumberErr != nil {
+		return nil, errors.New("Error parsing 'serviceNumber' field " + _serviceNumberErr.Error())
+	}
 
 	// Const Field (listOfValuesOpeningTag)
-	var listOfValuesOpeningTag uint8 = io.ReadUint8(8)
+	listOfValuesOpeningTag, _listOfValuesOpeningTagErr := io.ReadUint8(8)
+	if _listOfValuesOpeningTagErr != nil {
+		return nil, errors.New("Error parsing 'listOfValuesOpeningTag' field " + _listOfValuesOpeningTagErr.Error())
+	}
 	if listOfValuesOpeningTag != BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_LISTOFVALUESOPENINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_LISTOFVALUESOPENINGTAG)) + " but got " + strconv.Itoa(int(listOfValuesOpeningTag)))
 	}
@@ -142,11 +157,18 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(io spi.ReadB
 	_valuesLength := uint16(len) - uint16(uint16(8))
 	_valuesEndPos := io.GetPos() + uint16(_valuesLength)
 	for io.GetPos() < _valuesEndPos {
-		values = append(values, io.ReadInt8(8))
+		_valuesVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'values' field " + _err.Error())
+		}
+		values = append(values, _valuesVal)
 	}
 
 	// Const Field (listOfValuesClosingTag)
-	var listOfValuesClosingTag uint8 = io.ReadUint8(8)
+	listOfValuesClosingTag, _listOfValuesClosingTagErr := io.ReadUint8(8)
+	if _listOfValuesClosingTagErr != nil {
+		return nil, errors.New("Error parsing 'listOfValuesClosingTag' field " + _listOfValuesClosingTagErr.Error())
+	}
 	if listOfValuesClosingTag != BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_LISTOFVALUESCLOSINGTAG {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer_LISTOFVALUESCLOSINGTAG)) + " but got " + strconv.Itoa(int(listOfValuesClosingTag)))
 	}
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
index 78beea7..4605e95 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
@@ -116,34 +116,55 @@ func (m BACnetUnconfirmedServiceRequestWhoHas) LengthInBytes() uint16 {
 func BACnetUnconfirmedServiceRequestWhoHasParse(io spi.ReadBuffer) (BACnetUnconfirmedServiceRequestInitializer, error) {
 
 	// Const Field (deviceInstanceLowLimitHeader)
-	var deviceInstanceLowLimitHeader uint8 = io.ReadUint8(8)
+	deviceInstanceLowLimitHeader, _deviceInstanceLowLimitHeaderErr := io.ReadUint8(8)
+	if _deviceInstanceLowLimitHeaderErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceLowLimitHeader' field " + _deviceInstanceLowLimitHeaderErr.Error())
+	}
 	if deviceInstanceLowLimitHeader != BACnetUnconfirmedServiceRequestWhoHas_DEVICEINSTANCELOWLIMITHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestWhoHas_DEVICEINSTANCELOWLIMITHEADER)) + " but got " + strconv.Itoa(int(deviceInstanceLowLimitHeader)))
 	}
 
 	// Simple Field (deviceInstanceLowLimit)
-	var deviceInstanceLowLimit uint32 = io.ReadUint32(24)
+	deviceInstanceLowLimit, _deviceInstanceLowLimitErr := io.ReadUint32(24)
+	if _deviceInstanceLowLimitErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceLowLimit' field " + _deviceInstanceLowLimitErr.Error())
+	}
 
 	// Const Field (deviceInstanceHighLimitHeader)
-	var deviceInstanceHighLimitHeader uint8 = io.ReadUint8(8)
+	deviceInstanceHighLimitHeader, _deviceInstanceHighLimitHeaderErr := io.ReadUint8(8)
+	if _deviceInstanceHighLimitHeaderErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceHighLimitHeader' field " + _deviceInstanceHighLimitHeaderErr.Error())
+	}
 	if deviceInstanceHighLimitHeader != BACnetUnconfirmedServiceRequestWhoHas_DEVICEINSTANCEHIGHLIMITHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestWhoHas_DEVICEINSTANCEHIGHLIMITHEADER)) + " but got " + strconv.Itoa(int(deviceInstanceHighLimitHeader)))
 	}
 
 	// Simple Field (deviceInstanceHighLimit)
-	var deviceInstanceHighLimit uint32 = io.ReadUint32(24)
+	deviceInstanceHighLimit, _deviceInstanceHighLimitErr := io.ReadUint32(24)
+	if _deviceInstanceHighLimitErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceHighLimit' field " + _deviceInstanceHighLimitErr.Error())
+	}
 
 	// Const Field (objectNameHeader)
-	var objectNameHeader uint8 = io.ReadUint8(8)
+	objectNameHeader, _objectNameHeaderErr := io.ReadUint8(8)
+	if _objectNameHeaderErr != nil {
+		return nil, errors.New("Error parsing 'objectNameHeader' field " + _objectNameHeaderErr.Error())
+	}
 	if objectNameHeader != BACnetUnconfirmedServiceRequestWhoHas_OBJECTNAMEHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestWhoHas_OBJECTNAMEHEADER)) + " but got " + strconv.Itoa(int(objectNameHeader)))
 	}
 
 	// Implicit Field (objectNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var objectNameLength uint8 = io.ReadUint8(8)
+	objectNameLength, _objectNameLengthErr := io.ReadUint8(8)
+	if _objectNameLengthErr != nil {
+		return nil, errors.New("Error parsing 'objectNameLength' field " + _objectNameLengthErr.Error())
+	}
 
 	// Simple Field (objectNameCharacterSet)
-	var objectNameCharacterSet uint8 = io.ReadUint8(8)
+	objectNameCharacterSet, _objectNameCharacterSetErr := io.ReadUint8(8)
+	if _objectNameCharacterSetErr != nil {
+		return nil, errors.New("Error parsing 'objectNameCharacterSet' field " + _objectNameCharacterSetErr.Error())
+	}
 
 	// Array field (objectName)
 	var objectName []int8
@@ -151,7 +172,11 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(io spi.ReadBuffer) (BACnetUnconf
 	_objectNameLength := uint16(objectNameLength) - uint16(uint16(1))
 	_objectNameEndPos := io.GetPos() + uint16(_objectNameLength)
 	for io.GetPos() < _objectNameEndPos {
-		objectName = append(objectName, io.ReadInt8(8))
+		_objectNameVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'objectName' field " + _err.Error())
+		}
+		objectName = append(objectName, _objectNameVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
index add1d7e..5e6de0a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
@@ -111,13 +111,19 @@ func (m BACnetUnconfirmedServiceRequestWhoIs) LengthInBytes() uint16 {
 func BACnetUnconfirmedServiceRequestWhoIsParse(io spi.ReadBuffer) (BACnetUnconfirmedServiceRequestInitializer, error) {
 
 	// Const Field (deviceInstanceRangeLowLimitHeader)
-	var deviceInstanceRangeLowLimitHeader uint8 = io.ReadUint8(5)
+	deviceInstanceRangeLowLimitHeader, _deviceInstanceRangeLowLimitHeaderErr := io.ReadUint8(5)
+	if _deviceInstanceRangeLowLimitHeaderErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceRangeLowLimitHeader' field " + _deviceInstanceRangeLowLimitHeaderErr.Error())
+	}
 	if deviceInstanceRangeLowLimitHeader != BACnetUnconfirmedServiceRequestWhoIs_DEVICEINSTANCERANGELOWLIMITHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestWhoIs_DEVICEINSTANCERANGELOWLIMITHEADER)) + " but got " + strconv.Itoa(int(deviceInstanceRangeLowLimitHeader)))
 	}
 
 	// Simple Field (deviceInstanceRangeLowLimitLength)
-	var deviceInstanceRangeLowLimitLength uint8 = io.ReadUint8(3)
+	deviceInstanceRangeLowLimitLength, _deviceInstanceRangeLowLimitLengthErr := io.ReadUint8(3)
+	if _deviceInstanceRangeLowLimitLengthErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceRangeLowLimitLength' field " + _deviceInstanceRangeLowLimitLengthErr.Error())
+	}
 
 	// Array field (deviceInstanceRangeLowLimit)
 	var deviceInstanceRangeLowLimit []int8
@@ -126,18 +132,28 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(io spi.ReadBuffer) (BACnetUnconfi
 		deviceInstanceRangeLowLimit := make([]int8, deviceInstanceRangeLowLimitLength)
 		for curItem := uint16(0); curItem < uint16(deviceInstanceRangeLowLimitLength); curItem++ {
 
-			deviceInstanceRangeLowLimit = append(deviceInstanceRangeLowLimit, io.ReadInt8(8))
+			_deviceInstanceRangeLowLimitVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'deviceInstanceRangeLowLimit' field " + _err.Error())
+			}
+			deviceInstanceRangeLowLimit = append(deviceInstanceRangeLowLimit, _deviceInstanceRangeLowLimitVal)
 		}
 	}
 
 	// Const Field (deviceInstanceRangeHighLimitHeader)
-	var deviceInstanceRangeHighLimitHeader uint8 = io.ReadUint8(5)
+	deviceInstanceRangeHighLimitHeader, _deviceInstanceRangeHighLimitHeaderErr := io.ReadUint8(5)
+	if _deviceInstanceRangeHighLimitHeaderErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceRangeHighLimitHeader' field " + _deviceInstanceRangeHighLimitHeaderErr.Error())
+	}
 	if deviceInstanceRangeHighLimitHeader != BACnetUnconfirmedServiceRequestWhoIs_DEVICEINSTANCERANGEHIGHLIMITHEADER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetUnconfirmedServiceRequestWhoIs_DEVICEINSTANCERANGEHIGHLIMITHEADER)) + " but got " + strconv.Itoa(int(deviceInstanceRangeHighLimitHeader)))
 	}
 
 	// Simple Field (deviceInstanceRangeHighLimitLength)
-	var deviceInstanceRangeHighLimitLength uint8 = io.ReadUint8(3)
+	deviceInstanceRangeHighLimitLength, _deviceInstanceRangeHighLimitLengthErr := io.ReadUint8(3)
+	if _deviceInstanceRangeHighLimitLengthErr != nil {
+		return nil, errors.New("Error parsing 'deviceInstanceRangeHighLimitLength' field " + _deviceInstanceRangeHighLimitLengthErr.Error())
+	}
 
 	// Array field (deviceInstanceRangeHighLimit)
 	var deviceInstanceRangeHighLimit []int8
@@ -146,7 +162,11 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(io spi.ReadBuffer) (BACnetUnconfi
 		deviceInstanceRangeHighLimit := make([]int8, deviceInstanceRangeHighLimitLength)
 		for curItem := uint16(0); curItem < uint16(deviceInstanceRangeHighLimitLength); curItem++ {
 
-			deviceInstanceRangeHighLimit = append(deviceInstanceRangeHighLimit, io.ReadInt8(8))
+			_deviceInstanceRangeHighLimitVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'deviceInstanceRangeHighLimit' field " + _err.Error())
+			}
+			deviceInstanceRangeHighLimit = append(deviceInstanceRangeHighLimit, _deviceInstanceRangeHighLimitVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
index 6921201..5323b56 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
@@ -90,16 +90,25 @@ func (m BVLC) LengthInBytes() uint16 {
 func BVLCParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Const Field (bacnetType)
-	var bacnetType uint8 = io.ReadUint8(8)
+	bacnetType, _bacnetTypeErr := io.ReadUint8(8)
+	if _bacnetTypeErr != nil {
+		return nil, errors.New("Error parsing 'bacnetType' field " + _bacnetTypeErr.Error())
+	}
 	if bacnetType != BVLC_BACNETTYPE {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(BVLC_BACNETTYPE)) + " but got " + strconv.Itoa(int(bacnetType)))
 	}
 
 	// Discriminator Field (bvlcFunction) (Used as input to a switch field)
-	var bvlcFunction uint8 = io.ReadUint8(8)
+	bvlcFunction, _bvlcFunctionErr := io.ReadUint8(8)
+	if _bvlcFunctionErr != nil {
+		return nil, errors.New("Error parsing 'bvlcFunction' field " + _bvlcFunctionErr.Error())
+	}
 
 	// Implicit Field (bvlcLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var bvlcLength uint16 = io.ReadUint16(16)
+	bvlcLength, _bvlcLengthErr := io.ReadUint16(16)
+	if _bvlcLengthErr != nil {
+		return nil, errors.New("Error parsing 'bvlcLength' field " + _bvlcLengthErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer BVLCInitializer
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
index 416b8ec..f969cac 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
@@ -28,7 +28,7 @@ import (
 type BVLCForwardedNPDU struct {
 	ip   []uint8
 	port uint16
-	npdu NPDU
+	npdu INPDU
 	BVLC
 }
 
@@ -47,7 +47,7 @@ func (m BVLCForwardedNPDU) initialize() spi.Message {
 	return m
 }
 
-func NewBVLCForwardedNPDU(ip []uint8, port uint16, npdu NPDU) BVLCInitializer {
+func NewBVLCForwardedNPDU(ip []uint8, port uint16, npdu INPDU) BVLCInitializer {
 	return &BVLCForwardedNPDU{ip: ip, port: port, npdu: npdu}
 }
 
@@ -101,22 +101,29 @@ func BVLCForwardedNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCInitializ
 		ip := make([]uint8, uint16(4))
 		for curItem := uint16(0); curItem < uint16(uint16(4)); curItem++ {
 
-			ip = append(ip, io.ReadUint8(8))
+			_ipVal, _err := io.ReadUint8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'ip' field " + _err.Error())
+			}
+			ip = append(ip, _ipVal)
 		}
 	}
 
 	// Simple Field (port)
-	var port uint16 = io.ReadUint16(16)
+	port, _portErr := io.ReadUint16(16)
+	if _portErr != nil {
+		return nil, errors.New("Error parsing 'port' field " + _portErr.Error())
+	}
 
 	// Simple Field (npdu)
 	_npduMessage, _err := NPDUParse(io, uint16(bvlcLength)-uint16(uint16(10)))
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'npdu'. " + _err.Error())
 	}
-	var npdu NPDU
-	npdu, _npduOk := _npduMessage.(NPDU)
+	var npdu INPDU
+	npdu, _npduOk := _npduMessage.(INPDU)
 	if !_npduOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_npduMessage).Name() + " to NPDU")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_npduMessage).Name() + " to INPDU")
 	}
 
 	// Create the instance
@@ -137,6 +144,6 @@ func (m BVLCForwardedNPDU) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (port))
 
 	// Simple Field (npdu)
-	npdu := NPDU(m.npdu)
+	npdu := INPDU(m.npdu)
 	npdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
index 5897142..3b4c6f7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type BVLCOriginalBroadcastNPDU struct {
-	npdu NPDU
+	npdu INPDU
 	BVLC
 }
 
@@ -45,7 +45,7 @@ func (m BVLCOriginalBroadcastNPDU) initialize() spi.Message {
 	return m
 }
 
-func NewBVLCOriginalBroadcastNPDU(npdu NPDU) BVLCInitializer {
+func NewBVLCOriginalBroadcastNPDU(npdu INPDU) BVLCInitializer {
 	return &BVLCOriginalBroadcastNPDU{npdu: npdu}
 }
 
@@ -89,10 +89,10 @@ func BVLCOriginalBroadcastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCI
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'npdu'. " + _err.Error())
 	}
-	var npdu NPDU
-	npdu, _npduOk := _npduMessage.(NPDU)
+	var npdu INPDU
+	npdu, _npduOk := _npduMessage.(INPDU)
 	if !_npduOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_npduMessage).Name() + " to NPDU")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_npduMessage).Name() + " to INPDU")
 	}
 
 	// Create the instance
@@ -102,6 +102,6 @@ func BVLCOriginalBroadcastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCI
 func (m BVLCOriginalBroadcastNPDU) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (npdu)
-	npdu := NPDU(m.npdu)
+	npdu := INPDU(m.npdu)
 	npdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
index 5020c94..2d4837d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type BVLCOriginalUnicastNPDU struct {
-	npdu NPDU
+	npdu INPDU
 	BVLC
 }
 
@@ -45,7 +45,7 @@ func (m BVLCOriginalUnicastNPDU) initialize() spi.Message {
 	return m
 }
 
-func NewBVLCOriginalUnicastNPDU(npdu NPDU) BVLCInitializer {
+func NewBVLCOriginalUnicastNPDU(npdu INPDU) BVLCInitializer {
 	return &BVLCOriginalUnicastNPDU{npdu: npdu}
 }
 
@@ -89,10 +89,10 @@ func BVLCOriginalUnicastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCIni
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'npdu'. " + _err.Error())
 	}
-	var npdu NPDU
-	npdu, _npduOk := _npduMessage.(NPDU)
+	var npdu INPDU
+	npdu, _npduOk := _npduMessage.(INPDU)
 	if !_npduOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_npduMessage).Name() + " to NPDU")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_npduMessage).Name() + " to INPDU")
 	}
 
 	// Create the instance
@@ -102,6 +102,6 @@ func BVLCOriginalUnicastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCIni
 func (m BVLCOriginalUnicastNPDU) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (npdu)
-	npdu := NPDU(m.npdu)
+	npdu := INPDU(m.npdu)
 	npdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
index 8721b08..60b86e6 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
@@ -86,12 +86,19 @@ func (m NLM) LengthInBytes() uint16 {
 func NLMParse(io spi.ReadBuffer, apduLength uint16) (spi.Message, error) {
 
 	// Discriminator Field (messageType) (Used as input to a switch field)
-	var messageType uint8 = io.ReadUint8(8)
+	messageType, _messageTypeErr := io.ReadUint8(8)
+	if _messageTypeErr != nil {
+		return nil, errors.New("Error parsing 'messageType' field " + _messageTypeErr.Error())
+	}
 
 	// Optional Field (vendorId) (Can be skipped, if a given expression evaluates to false)
 	var vendorId *uint16 = nil
 	if bool(bool(bool((messageType) >= (128)))) && bool(bool(bool((messageType) <= (255)))) {
-		_val := io.ReadUint16(16)
+		_val, _err := io.ReadUint16(16)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'vendorId' field " + _err.Error())
+		}
+
 		vendorId = &_val
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
index 139f8ad..b7a2941 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,7 +92,11 @@ func NLMIAmRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageTyp
 	_destinationNetworkAddressLength := uint16(apduLength) - uint16(uint16(spi.InlineIf(bool(bool(bool(bool((messageType) >= (128)))) && bool(bool(bool((messageType) <= (255))))), uint16(uint16(3)), uint16(uint16(1)))))
 	_destinationNetworkAddressEndPos := io.GetPos() + uint16(_destinationNetworkAddressLength)
 	for io.GetPos() < _destinationNetworkAddressEndPos {
-		destinationNetworkAddress = append(destinationNetworkAddress, io.ReadUint16(16))
+		_destinationNetworkAddressVal, _err := io.ReadUint16(16)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'destinationNetworkAddress' field " + _err.Error())
+		}
+		destinationNetworkAddress = append(destinationNetworkAddress, _destinationNetworkAddressVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
index 6b8929e..f1e5cc2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,7 +92,11 @@ func NLMWhoIsRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageT
 	_destinationNetworkAddressLength := uint16(apduLength) - uint16(uint16(spi.InlineIf(bool(bool(bool(bool((messageType) >= (128)))) && bool(bool(bool((messageType) <= (255))))), uint16(uint16(3)), uint16(uint16(1)))))
 	_destinationNetworkAddressEndPos := io.GetPos() + uint16(_destinationNetworkAddressLength)
 	for io.GetPos() < _destinationNetworkAddressEndPos {
-		destinationNetworkAddress = append(destinationNetworkAddress, io.ReadUint16(16))
+		_destinationNetworkAddressVal, _err := io.ReadUint16(16)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'destinationNetworkAddress' field " + _err.Error())
+		}
+		destinationNetworkAddress = append(destinationNetworkAddress, _destinationNetworkAddressVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
index fc9b734..953b5cd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
@@ -40,8 +40,8 @@ type NPDU struct {
 	sourceLength              *uint8
 	sourceAddress             []uint8
 	hopCount                  *uint8
-	nlm                       *NLM
-	apdu                      *APDU
+	nlm                       *INLM
+	apdu                      *IAPDU
 }
 
 // The corresponding interface
@@ -50,7 +50,7 @@ type INPDU interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewNPDU(protocolVersionNumber uint8, messageTypeFieldPresent bool, destinationSpecified bool, sourceSpecified bool, expectingReply bool, networkPriority uint8, destinationNetworkAddress *uint16, destinationLength *uint8, destinationAddress []uint8, sourceNetworkAddress *uint16, sourceLength *uint8, sourceAddress []uint8, hopCount *uint8, nlm *NLM, apdu *APDU) spi.Message {
+func NewNPDU(protocolVersionNumber uint8, messageTypeFieldPresent bool, destinationSpecified bool, sourceSpecified bool, expectingReply bool, networkPriority uint8, destinationNetworkAddress *uint16, destinationLength *uint8, destinationAddress []uint8, sourceNetworkAddress *uint16, sourceLength *uint8, sourceAddress []uint8, hopCount *uint8, nlm *INLM, apdu *IAPDU) spi.Message {
 	return &NPDU{protocolVersionNumber: protocolVersionNumber, messageTypeFieldPresent: messageTypeFieldPresent, destinationSpecified: destinationSpecified, sourceSpecified: sourceSpecified, expectingReply: expectingReply, networkPriority: networkPriority, destinationNetworkAddress: destinationNetworkAddress, destinationLength: destinationLength, destinationAddress: destinationAddress, sourceNetworkAddress: sourceNetworkAddress, sourceLength: sourceLength, sourceAddress: sourceAddress, hopC [...]
 }
 
@@ -138,12 +138,12 @@ func (m NPDU) LengthInBits() uint16 {
 
 	// Optional Field (nlm)
 	if m.nlm != nil {
-		lengthInBits += m.nlm.LengthInBits()
+		lengthInBits += (*m.nlm).LengthInBits()
 	}
 
 	// Optional Field (apdu)
 	if m.apdu != nil {
-		lengthInBits += m.apdu.LengthInBits()
+		lengthInBits += (*m.apdu).LengthInBits()
 	}
 
 	return lengthInBits
@@ -156,14 +156,23 @@ func (m NPDU) LengthInBytes() uint16 {
 func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 
 	// Simple Field (protocolVersionNumber)
-	var protocolVersionNumber uint8 = io.ReadUint8(8)
+	protocolVersionNumber, _protocolVersionNumberErr := io.ReadUint8(8)
+	if _protocolVersionNumberErr != nil {
+		return nil, errors.New("Error parsing 'protocolVersionNumber' field " + _protocolVersionNumberErr.Error())
+	}
 
 	// Simple Field (messageTypeFieldPresent)
-	var messageTypeFieldPresent bool = io.ReadBit()
+	messageTypeFieldPresent, _messageTypeFieldPresentErr := io.ReadBit()
+	if _messageTypeFieldPresentErr != nil {
+		return nil, errors.New("Error parsing 'messageTypeFieldPresent' field " + _messageTypeFieldPresentErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(1)
+		reserved, _err := io.ReadUint8(1)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0),
@@ -173,11 +182,17 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	}
 
 	// Simple Field (destinationSpecified)
-	var destinationSpecified bool = io.ReadBit()
+	destinationSpecified, _destinationSpecifiedErr := io.ReadBit()
+	if _destinationSpecifiedErr != nil {
+		return nil, errors.New("Error parsing 'destinationSpecified' field " + _destinationSpecifiedErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(1)
+		reserved, _err := io.ReadUint8(1)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0),
@@ -187,25 +202,42 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	}
 
 	// Simple Field (sourceSpecified)
-	var sourceSpecified bool = io.ReadBit()
+	sourceSpecified, _sourceSpecifiedErr := io.ReadBit()
+	if _sourceSpecifiedErr != nil {
+		return nil, errors.New("Error parsing 'sourceSpecified' field " + _sourceSpecifiedErr.Error())
+	}
 
 	// Simple Field (expectingReply)
-	var expectingReply bool = io.ReadBit()
+	expectingReply, _expectingReplyErr := io.ReadBit()
+	if _expectingReplyErr != nil {
+		return nil, errors.New("Error parsing 'expectingReply' field " + _expectingReplyErr.Error())
+	}
 
 	// Simple Field (networkPriority)
-	var networkPriority uint8 = io.ReadUint8(2)
+	networkPriority, _networkPriorityErr := io.ReadUint8(2)
+	if _networkPriorityErr != nil {
+		return nil, errors.New("Error parsing 'networkPriority' field " + _networkPriorityErr.Error())
+	}
 
 	// Optional Field (destinationNetworkAddress) (Can be skipped, if a given expression evaluates to false)
 	var destinationNetworkAddress *uint16 = nil
 	if destinationSpecified {
-		_val := io.ReadUint16(16)
+		_val, _err := io.ReadUint16(16)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'destinationNetworkAddress' field " + _err.Error())
+		}
+
 		destinationNetworkAddress = &_val
 	}
 
 	// Optional Field (destinationLength) (Can be skipped, if a given expression evaluates to false)
 	var destinationLength *uint8 = nil
 	if destinationSpecified {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'destinationLength' field " + _err.Error())
+		}
+
 		destinationLength = &_val
 	}
 
@@ -213,24 +245,36 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	var destinationAddress []uint8
 	// Count array
 	{
-		destinationAddress := make([]uint8, spi.InlineIf(destinationSpecified, uint16(*destinationLength), uint16(uint16(0))))
-		for curItem := uint16(0); curItem < uint16(spi.InlineIf(destinationSpecified, uint16(*destinationLength), uint16(uint16(0)))); curItem++ {
-
-			destinationAddress = append(destinationAddress, io.ReadUint8(8))
+		destinationAddress := make([]uint8, spi.InlineIf(destinationSpecified, uint16((*destinationLength)), uint16(uint16(0))))
+		for curItem := uint16(0); curItem < uint16(spi.InlineIf(destinationSpecified, uint16((*destinationLength)), uint16(uint16(0)))); curItem++ {
+
+			_destinationAddressVal, _err := io.ReadUint8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'destinationAddress' field " + _err.Error())
+			}
+			destinationAddress = append(destinationAddress, _destinationAddressVal)
 		}
 	}
 
 	// Optional Field (sourceNetworkAddress) (Can be skipped, if a given expression evaluates to false)
 	var sourceNetworkAddress *uint16 = nil
 	if sourceSpecified {
-		_val := io.ReadUint16(16)
+		_val, _err := io.ReadUint16(16)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'sourceNetworkAddress' field " + _err.Error())
+		}
+
 		sourceNetworkAddress = &_val
 	}
 
 	// Optional Field (sourceLength) (Can be skipped, if a given expression evaluates to false)
 	var sourceLength *uint8 = nil
 	if sourceSpecified {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'sourceLength' field " + _err.Error())
+		}
+
 		sourceLength = &_val
 	}
 
@@ -238,46 +282,54 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	var sourceAddress []uint8
 	// Count array
 	{
-		sourceAddress := make([]uint8, spi.InlineIf(sourceSpecified, uint16(*sourceLength), uint16(uint16(0))))
-		for curItem := uint16(0); curItem < uint16(spi.InlineIf(sourceSpecified, uint16(*sourceLength), uint16(uint16(0)))); curItem++ {
-
-			sourceAddress = append(sourceAddress, io.ReadUint8(8))
+		sourceAddress := make([]uint8, spi.InlineIf(sourceSpecified, uint16((*sourceLength)), uint16(uint16(0))))
+		for curItem := uint16(0); curItem < uint16(spi.InlineIf(sourceSpecified, uint16((*sourceLength)), uint16(uint16(0)))); curItem++ {
+
+			_sourceAddressVal, _err := io.ReadUint8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'sourceAddress' field " + _err.Error())
+			}
+			sourceAddress = append(sourceAddress, _sourceAddressVal)
 		}
 	}
 
 	// Optional Field (hopCount) (Can be skipped, if a given expression evaluates to false)
 	var hopCount *uint8 = nil
 	if destinationSpecified {
-		_val := io.ReadUint8(8)
+		_val, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'hopCount' field " + _err.Error())
+		}
+
 		hopCount = &_val
 	}
 
 	// Optional Field (nlm) (Can be skipped, if a given expression evaluates to false)
-	var nlm *NLM = nil
+	var nlm *INLM = nil
 	if messageTypeFieldPresent {
-		_message, _err := NLMParse(io, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(spi.InlineIf(sourceSpecified, uint16(uint16(uint16(3))+uint16(*sourceLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(destinationSpecified, uint16(uint16(uint16(3))+uint16(*destinationLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(bool(bool(destinationSpecified) || bool(sourceSpecified)), uint16(uint16(1)), uint16(uint16(0))))))))
+		_message, _err := NLMParse(io, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(spi.InlineIf(sourceSpecified, uint16(uint16(uint16(3))+uint16((*sourceLength))), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(destinationSpecified, uint16(uint16(uint16(3))+uint16((*destinationLength))), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(bool(bool(destinationSpecified) || bool(sourceSpecified)), uint16(uint16(1)), uint16(uint16(0))))))))
 		if _err != nil {
 			return nil, errors.New("Error parsing 'nlm' field " + _err.Error())
 		}
-		var _item NLM
-		_item, _ok := _message.(NLM)
+		var _item INLM
+		_item, _ok := _message.(INLM)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to NLM")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to INLM")
 		}
 		nlm = &_item
 	}
 
 	// Optional Field (apdu) (Can be skipped, if a given expression evaluates to false)
-	var apdu *APDU = nil
+	var apdu *IAPDU = nil
 	if !(messageTypeFieldPresent) {
-		_message, _err := APDUParse(io, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(spi.InlineIf(sourceSpecified, uint16(uint16(uint16(3))+uint16(*sourceLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(destinationSpecified, uint16(uint16(uint16(3))+uint16(*destinationLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(bool(bool(destinationSpecified) || bool(sourceSpecified)), uint16(uint16(1)), uint16(uint16(0))))))))
+		_message, _err := APDUParse(io, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(spi.InlineIf(sourceSpecified, uint16(uint16(uint16(3))+uint16((*sourceLength))), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(destinationSpecified, uint16(uint16(uint16(3))+uint16((*destinationLength))), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(bool(bool(destinationSpecified) || bool(sourceSpecified)), uint16(uint16(1)), uint16(uint16(0))))))))
 		if _err != nil {
 			return nil, errors.New("Error parsing 'apdu' field " + _err.Error())
 		}
-		var _item APDU
-		_item, _ok := _message.(APDU)
+		var _item IAPDU
+		_item, _ok := _message.(IAPDU)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to APDU")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IAPDU")
 		}
 		apdu = &_item
 	}
@@ -368,16 +420,16 @@ func (m NPDU) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Optional Field (nlm) (Can be skipped, if the value is null)
-	var nlm *NLM = nil
+	var nlm *INLM = nil
 	if m.nlm != nil {
 		nlm = m.nlm
-		nlm.Serialize(io)
+		(*nlm).Serialize(io)
 	}
 
 	// Optional Field (apdu) (Can be skipped, if the value is null)
-	var apdu *APDU = nil
+	var apdu *IAPDU = nil
 	if m.apdu != nil {
 		apdu = m.apdu
-		apdu.Serialize(io)
+		(*apdu).Serialize(io)
 	}
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
index ecafb4c..8822379 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type APCI uint8
 
+type IAPCI interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	APCI_GROUP_VALUE_READ_PDU            APCI = 0x0
 	APCI_GROUP_VALUE_RESPONSE_PDU        APCI = 0x1
@@ -51,6 +56,14 @@ func CastAPCI(structType interface{}) APCI {
 	return castFunc(structType)
 }
 
+func (m APCI) LengthInBits() uint16 {
+	return 4
+}
+
+func (m APCI) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func APCIParse(io spi.ReadBuffer) (APCI, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
index 5df3590..4f91622 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
@@ -80,7 +80,10 @@ func (m CEMI) LengthInBytes() uint16 {
 func CEMIParse(io spi.ReadBuffer, size uint8) (spi.Message, error) {
 
 	// Discriminator Field (messageCode) (Used as input to a switch field)
-	var messageCode uint8 = io.ReadUint8(8)
+	messageCode, _messageCodeErr := io.ReadUint8(8)
+	if _messageCodeErr != nil {
+		return nil, errors.New("Error parsing 'messageCode' field " + _messageCodeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer CEMIInitializer
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
index c7db009..a51b879 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
@@ -80,7 +80,10 @@ func (m CEMIAdditionalInformation) LengthInBytes() uint16 {
 func CEMIAdditionalInformationParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (additionalInformationType) (Used as input to a switch field)
-	var additionalInformationType uint8 = io.ReadUint8(8)
+	additionalInformationType, _additionalInformationTypeErr := io.ReadUint8(8)
+	if _additionalInformationTypeErr != nil {
+		return nil, errors.New("Error parsing 'additionalInformationType' field " + _additionalInformationTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer CEMIAdditionalInformationInitializer
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
index f8cca31..2889cbe 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
@@ -111,28 +111,49 @@ func (m CEMIAdditionalInformationBusmonitorInfo) LengthInBytes() uint16 {
 func CEMIAdditionalInformationBusmonitorInfoParse(io spi.ReadBuffer) (CEMIAdditionalInformationInitializer, error) {
 
 	// Const Field (len)
-	var len uint8 = io.ReadUint8(8)
+	len, _lenErr := io.ReadUint8(8)
+	if _lenErr != nil {
+		return nil, errors.New("Error parsing 'len' field " + _lenErr.Error())
+	}
 	if len != CEMIAdditionalInformationBusmonitorInfo_LEN {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(CEMIAdditionalInformationBusmonitorInfo_LEN)) + " but got " + strconv.Itoa(int(len)))
 	}
 
 	// Simple Field (frameErrorFlag)
-	var frameErrorFlag bool = io.ReadBit()
+	frameErrorFlag, _frameErrorFlagErr := io.ReadBit()
+	if _frameErrorFlagErr != nil {
+		return nil, errors.New("Error parsing 'frameErrorFlag' field " + _frameErrorFlagErr.Error())
+	}
 
 	// Simple Field (bitErrorFlag)
-	var bitErrorFlag bool = io.ReadBit()
+	bitErrorFlag, _bitErrorFlagErr := io.ReadBit()
+	if _bitErrorFlagErr != nil {
+		return nil, errors.New("Error parsing 'bitErrorFlag' field " + _bitErrorFlagErr.Error())
+	}
 
 	// Simple Field (parityErrorFlag)
-	var parityErrorFlag bool = io.ReadBit()
+	parityErrorFlag, _parityErrorFlagErr := io.ReadBit()
+	if _parityErrorFlagErr != nil {
+		return nil, errors.New("Error parsing 'parityErrorFlag' field " + _parityErrorFlagErr.Error())
+	}
 
 	// Simple Field (unknownFlag)
-	var unknownFlag bool = io.ReadBit()
+	unknownFlag, _unknownFlagErr := io.ReadBit()
+	if _unknownFlagErr != nil {
+		return nil, errors.New("Error parsing 'unknownFlag' field " + _unknownFlagErr.Error())
+	}
 
 	// Simple Field (lostFlag)
-	var lostFlag bool = io.ReadBit()
+	lostFlag, _lostFlagErr := io.ReadBit()
+	if _lostFlagErr != nil {
+		return nil, errors.New("Error parsing 'lostFlag' field " + _lostFlagErr.Error())
+	}
 
 	// Simple Field (sequenceNumber)
-	var sequenceNumber uint8 = io.ReadUint8(3)
+	sequenceNumber, _sequenceNumberErr := io.ReadUint8(3)
+	if _sequenceNumberErr != nil {
+		return nil, errors.New("Error parsing 'sequenceNumber' field " + _sequenceNumberErr.Error())
+	}
 
 	// Create the instance
 	return NewCEMIAdditionalInformationBusmonitorInfo(frameErrorFlag, bitErrorFlag, parityErrorFlag, unknownFlag, lostFlag, sequenceNumber), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
index 53582d5..e8adeac 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
@@ -30,7 +30,7 @@ const CEMIAdditionalInformationRelativeTimestamp_LEN uint8 = 2
 
 // The data-structure of this message
 type CEMIAdditionalInformationRelativeTimestamp struct {
-	relativeTimestamp RelativeTimestamp
+	relativeTimestamp IRelativeTimestamp
 	CEMIAdditionalInformation
 }
 
@@ -49,7 +49,7 @@ func (m CEMIAdditionalInformationRelativeTimestamp) initialize() spi.Message {
 	return m
 }
 
-func NewCEMIAdditionalInformationRelativeTimestamp(relativeTimestamp RelativeTimestamp) CEMIAdditionalInformationInitializer {
+func NewCEMIAdditionalInformationRelativeTimestamp(relativeTimestamp IRelativeTimestamp) CEMIAdditionalInformationInitializer {
 	return &CEMIAdditionalInformationRelativeTimestamp{relativeTimestamp: relativeTimestamp}
 }
 
@@ -92,7 +92,10 @@ func (m CEMIAdditionalInformationRelativeTimestamp) LengthInBytes() uint16 {
 func CEMIAdditionalInformationRelativeTimestampParse(io spi.ReadBuffer) (CEMIAdditionalInformationInitializer, error) {
 
 	// Const Field (len)
-	var len uint8 = io.ReadUint8(8)
+	len, _lenErr := io.ReadUint8(8)
+	if _lenErr != nil {
+		return nil, errors.New("Error parsing 'len' field " + _lenErr.Error())
+	}
 	if len != CEMIAdditionalInformationRelativeTimestamp_LEN {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(CEMIAdditionalInformationRelativeTimestamp_LEN)) + " but got " + strconv.Itoa(int(len)))
 	}
@@ -102,10 +105,10 @@ func CEMIAdditionalInformationRelativeTimestampParse(io spi.ReadBuffer) (CEMIAdd
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'relativeTimestamp'. " + _err.Error())
 	}
-	var relativeTimestamp RelativeTimestamp
-	relativeTimestamp, _relativeTimestampOk := _relativeTimestampMessage.(RelativeTimestamp)
+	var relativeTimestamp IRelativeTimestamp
+	relativeTimestamp, _relativeTimestampOk := _relativeTimestampMessage.(IRelativeTimestamp)
 	if !_relativeTimestampOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_relativeTimestampMessage).Name() + " to RelativeTimestamp")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_relativeTimestampMessage).Name() + " to IRelativeTimestamp")
 	}
 
 	// Create the instance
@@ -118,6 +121,6 @@ func (m CEMIAdditionalInformationRelativeTimestamp) Serialize(io spi.WriteBuffer
 	io.WriteUint8(8, 2)
 
 	// Simple Field (relativeTimestamp)
-	relativeTimestamp := RelativeTimestamp(m.relativeTimestamp)
+	relativeTimestamp := IRelativeTimestamp(m.relativeTimestamp)
 	relativeTimestamp.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
index 495c8d3..0647475 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
@@ -27,8 +27,8 @@ import (
 // The data-structure of this message
 type CEMIBusmonInd struct {
 	additionalInformationLength uint8
-	additionalInformation       []CEMIAdditionalInformation
-	cemiFrame                   CEMIFrame
+	additionalInformation       []ICEMIAdditionalInformation
+	cemiFrame                   ICEMIFrame
 	CEMI
 }
 
@@ -47,7 +47,7 @@ func (m CEMIBusmonInd) initialize() spi.Message {
 	return m
 }
 
-func NewCEMIBusmonInd(additionalInformationLength uint8, additionalInformation []CEMIAdditionalInformation, cemiFrame CEMIFrame) CEMIInitializer {
+func NewCEMIBusmonInd(additionalInformationLength uint8, additionalInformation []ICEMIAdditionalInformation, cemiFrame ICEMIFrame) CEMIInitializer {
 	return &CEMIBusmonInd{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiFrame: cemiFrame}
 }
 
@@ -97,10 +97,13 @@ func (m CEMIBusmonInd) LengthInBytes() uint16 {
 func CEMIBusmonIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 
 	// Simple Field (additionalInformationLength)
-	var additionalInformationLength uint8 = io.ReadUint8(8)
+	additionalInformationLength, _additionalInformationLengthErr := io.ReadUint8(8)
+	if _additionalInformationLengthErr != nil {
+		return nil, errors.New("Error parsing 'additionalInformationLength' field " + _additionalInformationLengthErr.Error())
+	}
 
 	// Array field (additionalInformation)
-	var additionalInformation []CEMIAdditionalInformation
+	var additionalInformation []ICEMIAdditionalInformation
 	// Length array
 	_additionalInformationLength := additionalInformationLength
 	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
@@ -109,8 +112,8 @@ func CEMIBusmonIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 		if _err != nil {
 			return nil, errors.New("Error parsing 'additionalInformation' field " + _err.Error())
 		}
-		var _item CEMIAdditionalInformation
-		_item, _ok := _message.(CEMIAdditionalInformation)
+		var _item ICEMIAdditionalInformation
+		_item, _ok := _message.(ICEMIAdditionalInformation)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to CEMIAdditionalInformation")
 		}
@@ -122,10 +125,10 @@ func CEMIBusmonIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'cemiFrame'. " + _err.Error())
 	}
-	var cemiFrame CEMIFrame
-	cemiFrame, _cemiFrameOk := _cemiFrameMessage.(CEMIFrame)
+	var cemiFrame ICEMIFrame
+	cemiFrame, _cemiFrameOk := _cemiFrameMessage.(ICEMIFrame)
 	if !_cemiFrameOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiFrameMessage).Name() + " to CEMIFrame")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiFrameMessage).Name() + " to ICEMIFrame")
 	}
 
 	// Create the instance
@@ -146,6 +149,6 @@ func (m CEMIBusmonInd) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (cemiFrame)
-	cemiFrame := CEMIFrame(m.cemiFrame)
+	cemiFrame := ICEMIFrame(m.cemiFrame)
 	cemiFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
index 708eda2..77729f3 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
@@ -27,8 +27,8 @@ import (
 // The data-structure of this message
 type CEMIDataCon struct {
 	additionalInformationLength uint8
-	additionalInformation       []CEMIAdditionalInformation
-	cemiDataFrame               CEMIDataFrame
+	additionalInformation       []ICEMIAdditionalInformation
+	cemiDataFrame               ICEMIDataFrame
 	CEMI
 }
 
@@ -47,7 +47,7 @@ func (m CEMIDataCon) initialize() spi.Message {
 	return m
 }
 
-func NewCEMIDataCon(additionalInformationLength uint8, additionalInformation []CEMIAdditionalInformation, cemiDataFrame CEMIDataFrame) CEMIInitializer {
+func NewCEMIDataCon(additionalInformationLength uint8, additionalInformation []ICEMIAdditionalInformation, cemiDataFrame ICEMIDataFrame) CEMIInitializer {
 	return &CEMIDataCon{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiDataFrame: cemiDataFrame}
 }
 
@@ -97,10 +97,13 @@ func (m CEMIDataCon) LengthInBytes() uint16 {
 func CEMIDataConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 
 	// Simple Field (additionalInformationLength)
-	var additionalInformationLength uint8 = io.ReadUint8(8)
+	additionalInformationLength, _additionalInformationLengthErr := io.ReadUint8(8)
+	if _additionalInformationLengthErr != nil {
+		return nil, errors.New("Error parsing 'additionalInformationLength' field " + _additionalInformationLengthErr.Error())
+	}
 
 	// Array field (additionalInformation)
-	var additionalInformation []CEMIAdditionalInformation
+	var additionalInformation []ICEMIAdditionalInformation
 	// Length array
 	_additionalInformationLength := additionalInformationLength
 	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
@@ -109,8 +112,8 @@ func CEMIDataConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 		if _err != nil {
 			return nil, errors.New("Error parsing 'additionalInformation' field " + _err.Error())
 		}
-		var _item CEMIAdditionalInformation
-		_item, _ok := _message.(CEMIAdditionalInformation)
+		var _item ICEMIAdditionalInformation
+		_item, _ok := _message.(ICEMIAdditionalInformation)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to CEMIAdditionalInformation")
 		}
@@ -122,10 +125,10 @@ func CEMIDataConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'cemiDataFrame'. " + _err.Error())
 	}
-	var cemiDataFrame CEMIDataFrame
-	cemiDataFrame, _cemiDataFrameOk := _cemiDataFrameMessage.(CEMIDataFrame)
+	var cemiDataFrame ICEMIDataFrame
+	cemiDataFrame, _cemiDataFrameOk := _cemiDataFrameMessage.(ICEMIDataFrame)
 	if !_cemiDataFrameOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiDataFrameMessage).Name() + " to CEMIDataFrame")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiDataFrameMessage).Name() + " to ICEMIDataFrame")
 	}
 
 	// Create the instance
@@ -146,6 +149,6 @@ func (m CEMIDataCon) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (cemiDataFrame)
-	cemiDataFrame := CEMIDataFrame(m.cemiDataFrame)
+	cemiDataFrame := ICEMIDataFrame(m.cemiDataFrame)
 	cemiDataFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
index 6c663ff..b190ef3 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
@@ -30,18 +30,18 @@ type CEMIDataFrame struct {
 	polling                 bool
 	notRepeated             bool
 	notAckFrame             bool
-	priority                CEMIPriority
+	priority                ICEMIPriority
 	acknowledgeRequested    bool
 	errorFlag               bool
 	groupDestinationAddress bool
 	hopCount                uint8
 	extendedFrameFormat     uint8
-	sourceAddress           KNXAddress
+	sourceAddress           IKNXAddress
 	destinationAddress      []int8
 	dataLength              uint8
-	tcpi                    TPCI
+	tcpi                    ITPCI
 	counter                 uint8
-	apci                    APCI
+	apci                    IAPCI
 	dataFirstByte           int8
 	data                    []int8
 }
@@ -52,7 +52,7 @@ type ICEMIDataFrame interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewCEMIDataFrame(standardFrame bool, polling bool, notRepeated bool, notAckFrame bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool, groupDestinationAddress bool, hopCount uint8, extendedFrameFormat uint8, sourceAddress KNXAddress, destinationAddress []int8, dataLength uint8, tcpi TPCI, counter uint8, apci APCI, dataFirstByte int8, data []int8) spi.Message {
+func NewCEMIDataFrame(standardFrame bool, polling bool, notRepeated bool, notAckFrame bool, priority ICEMIPriority, acknowledgeRequested bool, errorFlag bool, groupDestinationAddress bool, hopCount uint8, extendedFrameFormat uint8, sourceAddress IKNXAddress, destinationAddress []int8, dataLength uint8, tcpi ITPCI, counter uint8, apci IAPCI, dataFirstByte int8, data []int8) spi.Message {
 	return &CEMIDataFrame{standardFrame: standardFrame, polling: polling, notRepeated: notRepeated, notAckFrame: notAckFrame, priority: priority, acknowledgeRequested: acknowledgeRequested, errorFlag: errorFlag, groupDestinationAddress: groupDestinationAddress, hopCount: hopCount, extendedFrameFormat: extendedFrameFormat, sourceAddress: sourceAddress, destinationAddress: destinationAddress, dataLength: dataLength, tcpi: tcpi, counter: counter, apci: apci, dataFirstByte: dataFirstByte, data: data}
 }
 
@@ -147,16 +147,28 @@ func (m CEMIDataFrame) LengthInBytes() uint16 {
 func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (standardFrame)
-	var standardFrame bool = io.ReadBit()
+	standardFrame, _standardFrameErr := io.ReadBit()
+	if _standardFrameErr != nil {
+		return nil, errors.New("Error parsing 'standardFrame' field " + _standardFrameErr.Error())
+	}
 
 	// Simple Field (polling)
-	var polling bool = io.ReadBit()
+	polling, _pollingErr := io.ReadBit()
+	if _pollingErr != nil {
+		return nil, errors.New("Error parsing 'polling' field " + _pollingErr.Error())
+	}
 
 	// Simple Field (notRepeated)
-	var notRepeated bool = io.ReadBit()
+	notRepeated, _notRepeatedErr := io.ReadBit()
+	if _notRepeatedErr != nil {
+		return nil, errors.New("Error parsing 'notRepeated' field " + _notRepeatedErr.Error())
+	}
 
 	// Simple Field (notAckFrame)
-	var notAckFrame bool = io.ReadBit()
+	notAckFrame, _notAckFrameErr := io.ReadBit()
+	if _notAckFrameErr != nil {
+		return nil, errors.New("Error parsing 'notAckFrame' field " + _notAckFrameErr.Error())
+	}
 
 	// Enum field (priority)
 	priority, _priorityErr := CEMIPriorityParse(io)
@@ -165,29 +177,44 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 	}
 
 	// Simple Field (acknowledgeRequested)
-	var acknowledgeRequested bool = io.ReadBit()
+	acknowledgeRequested, _acknowledgeRequestedErr := io.ReadBit()
+	if _acknowledgeRequestedErr != nil {
+		return nil, errors.New("Error parsing 'acknowledgeRequested' field " + _acknowledgeRequestedErr.Error())
+	}
 
 	// Simple Field (errorFlag)
-	var errorFlag bool = io.ReadBit()
+	errorFlag, _errorFlagErr := io.ReadBit()
+	if _errorFlagErr != nil {
+		return nil, errors.New("Error parsing 'errorFlag' field " + _errorFlagErr.Error())
+	}
 
 	// Simple Field (groupDestinationAddress)
-	var groupDestinationAddress bool = io.ReadBit()
+	groupDestinationAddress, _groupDestinationAddressErr := io.ReadBit()
+	if _groupDestinationAddressErr != nil {
+		return nil, errors.New("Error parsing 'groupDestinationAddress' field " + _groupDestinationAddressErr.Error())
+	}
 
 	// Simple Field (hopCount)
-	var hopCount uint8 = io.ReadUint8(3)
+	hopCount, _hopCountErr := io.ReadUint8(3)
+	if _hopCountErr != nil {
+		return nil, errors.New("Error parsing 'hopCount' field " + _hopCountErr.Error())
+	}
 
 	// Simple Field (extendedFrameFormat)
-	var extendedFrameFormat uint8 = io.ReadUint8(4)
+	extendedFrameFormat, _extendedFrameFormatErr := io.ReadUint8(4)
+	if _extendedFrameFormatErr != nil {
+		return nil, errors.New("Error parsing 'extendedFrameFormat' field " + _extendedFrameFormatErr.Error())
+	}
 
 	// Simple Field (sourceAddress)
 	_sourceAddressMessage, _err := KNXAddressParse(io)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'sourceAddress'. " + _err.Error())
 	}
-	var sourceAddress KNXAddress
-	sourceAddress, _sourceAddressOk := _sourceAddressMessage.(KNXAddress)
+	var sourceAddress IKNXAddress
+	sourceAddress, _sourceAddressOk := _sourceAddressMessage.(IKNXAddress)
 	if !_sourceAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_sourceAddressMessage).Name() + " to KNXAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_sourceAddressMessage).Name() + " to IKNXAddress")
 	}
 
 	// Array field (destinationAddress)
@@ -197,12 +224,19 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 		destinationAddress := make([]int8, uint16(2))
 		for curItem := uint16(0); curItem < uint16(uint16(2)); curItem++ {
 
-			destinationAddress = append(destinationAddress, io.ReadInt8(8))
+			_destinationAddressVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'destinationAddress' field " + _err.Error())
+			}
+			destinationAddress = append(destinationAddress, _destinationAddressVal)
 		}
 	}
 
 	// Simple Field (dataLength)
-	var dataLength uint8 = io.ReadUint8(8)
+	dataLength, _dataLengthErr := io.ReadUint8(8)
+	if _dataLengthErr != nil {
+		return nil, errors.New("Error parsing 'dataLength' field " + _dataLengthErr.Error())
+	}
 
 	// Enum field (tcpi)
 	tcpi, _tcpiErr := TPCIParse(io)
@@ -211,7 +245,10 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 	}
 
 	// Simple Field (counter)
-	var counter uint8 = io.ReadUint8(4)
+	counter, _counterErr := io.ReadUint8(4)
+	if _counterErr != nil {
+		return nil, errors.New("Error parsing 'counter' field " + _counterErr.Error())
+	}
 
 	// Enum field (apci)
 	apci, _apciErr := APCIParse(io)
@@ -220,7 +257,10 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 	}
 
 	// Simple Field (dataFirstByte)
-	var dataFirstByte int8 = io.ReadInt8(6)
+	dataFirstByte, _dataFirstByteErr := io.ReadInt8(6)
+	if _dataFirstByteErr != nil {
+		return nil, errors.New("Error parsing 'dataFirstByte' field " + _dataFirstByteErr.Error())
+	}
 
 	// Array field (data)
 	var data []int8
@@ -229,7 +269,11 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 		data := make([]int8, uint16(dataLength)-uint16(uint16(1)))
 		for curItem := uint16(0); curItem < uint16(uint16(dataLength)-uint16(uint16(1))); curItem++ {
 
-			data = append(data, io.ReadInt8(8))
+			_dataVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'data' field " + _err.Error())
+			}
+			data = append(data, _dataVal)
 		}
 	}
 
@@ -256,7 +300,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteBit((bool)(notAckFrame))
 
 	// Enum field (priority)
-	priority := CEMIPriority(m.priority)
+	priority := ICEMIPriority(m.priority)
 	priority.Serialize(io)
 
 	// Simple Field (acknowledgeRequested)
@@ -280,7 +324,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (extendedFrameFormat))
 
 	// Simple Field (sourceAddress)
-	sourceAddress := KNXAddress(m.sourceAddress)
+	sourceAddress := IKNXAddress(m.sourceAddress)
 	sourceAddress.Serialize(io)
 
 	// Array Field (destinationAddress)
@@ -295,7 +339,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (dataLength))
 
 	// Enum field (tcpi)
-	tcpi := TPCI(m.tcpi)
+	tcpi := ITPCI(m.tcpi)
 	tcpi.Serialize(io)
 
 	// Simple Field (counter)
@@ -303,7 +347,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (counter))
 
 	// Enum field (apci)
-	apci := APCI(m.apci)
+	apci := IAPCI(m.apci)
 	apci.Serialize(io)
 
 	// Simple Field (dataFirstByte)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
index bc27264..d44cef7 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
@@ -27,8 +27,8 @@ import (
 // The data-structure of this message
 type CEMIDataInd struct {
 	additionalInformationLength uint8
-	additionalInformation       []CEMIAdditionalInformation
-	cemiDataFrame               CEMIDataFrame
+	additionalInformation       []ICEMIAdditionalInformation
+	cemiDataFrame               ICEMIDataFrame
 	CEMI
 }
 
@@ -47,7 +47,7 @@ func (m CEMIDataInd) initialize() spi.Message {
 	return m
 }
 
-func NewCEMIDataInd(additionalInformationLength uint8, additionalInformation []CEMIAdditionalInformation, cemiDataFrame CEMIDataFrame) CEMIInitializer {
+func NewCEMIDataInd(additionalInformationLength uint8, additionalInformation []ICEMIAdditionalInformation, cemiDataFrame ICEMIDataFrame) CEMIInitializer {
 	return &CEMIDataInd{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiDataFrame: cemiDataFrame}
 }
 
@@ -97,10 +97,13 @@ func (m CEMIDataInd) LengthInBytes() uint16 {
 func CEMIDataIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 
 	// Simple Field (additionalInformationLength)
-	var additionalInformationLength uint8 = io.ReadUint8(8)
+	additionalInformationLength, _additionalInformationLengthErr := io.ReadUint8(8)
+	if _additionalInformationLengthErr != nil {
+		return nil, errors.New("Error parsing 'additionalInformationLength' field " + _additionalInformationLengthErr.Error())
+	}
 
 	// Array field (additionalInformation)
-	var additionalInformation []CEMIAdditionalInformation
+	var additionalInformation []ICEMIAdditionalInformation
 	// Length array
 	_additionalInformationLength := additionalInformationLength
 	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
@@ -109,8 +112,8 @@ func CEMIDataIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 		if _err != nil {
 			return nil, errors.New("Error parsing 'additionalInformation' field " + _err.Error())
 		}
-		var _item CEMIAdditionalInformation
-		_item, _ok := _message.(CEMIAdditionalInformation)
+		var _item ICEMIAdditionalInformation
+		_item, _ok := _message.(ICEMIAdditionalInformation)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to CEMIAdditionalInformation")
 		}
@@ -122,10 +125,10 @@ func CEMIDataIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'cemiDataFrame'. " + _err.Error())
 	}
-	var cemiDataFrame CEMIDataFrame
-	cemiDataFrame, _cemiDataFrameOk := _cemiDataFrameMessage.(CEMIDataFrame)
+	var cemiDataFrame ICEMIDataFrame
+	cemiDataFrame, _cemiDataFrameOk := _cemiDataFrameMessage.(ICEMIDataFrame)
 	if !_cemiDataFrameOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiDataFrameMessage).Name() + " to CEMIDataFrame")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiDataFrameMessage).Name() + " to ICEMIDataFrame")
 	}
 
 	// Create the instance
@@ -146,6 +149,6 @@ func (m CEMIDataInd) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (cemiDataFrame)
-	cemiDataFrame := CEMIDataFrame(m.cemiDataFrame)
+	cemiDataFrame := ICEMIDataFrame(m.cemiDataFrame)
 	cemiDataFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
index fb7bc80..267457a 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
@@ -27,8 +27,8 @@ import (
 // The data-structure of this message
 type CEMIDataReq struct {
 	additionalInformationLength uint8
-	additionalInformation       []CEMIAdditionalInformation
-	cemiDataFrame               CEMIDataFrame
+	additionalInformation       []ICEMIAdditionalInformation
+	cemiDataFrame               ICEMIDataFrame
 	CEMI
 }
 
@@ -47,7 +47,7 @@ func (m CEMIDataReq) initialize() spi.Message {
 	return m
 }
 
-func NewCEMIDataReq(additionalInformationLength uint8, additionalInformation []CEMIAdditionalInformation, cemiDataFrame CEMIDataFrame) CEMIInitializer {
+func NewCEMIDataReq(additionalInformationLength uint8, additionalInformation []ICEMIAdditionalInformation, cemiDataFrame ICEMIDataFrame) CEMIInitializer {
 	return &CEMIDataReq{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiDataFrame: cemiDataFrame}
 }
 
@@ -97,10 +97,13 @@ func (m CEMIDataReq) LengthInBytes() uint16 {
 func CEMIDataReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 
 	// Simple Field (additionalInformationLength)
-	var additionalInformationLength uint8 = io.ReadUint8(8)
+	additionalInformationLength, _additionalInformationLengthErr := io.ReadUint8(8)
+	if _additionalInformationLengthErr != nil {
+		return nil, errors.New("Error parsing 'additionalInformationLength' field " + _additionalInformationLengthErr.Error())
+	}
 
 	// Array field (additionalInformation)
-	var additionalInformation []CEMIAdditionalInformation
+	var additionalInformation []ICEMIAdditionalInformation
 	// Length array
 	_additionalInformationLength := additionalInformationLength
 	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
@@ -109,8 +112,8 @@ func CEMIDataReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 		if _err != nil {
 			return nil, errors.New("Error parsing 'additionalInformation' field " + _err.Error())
 		}
-		var _item CEMIAdditionalInformation
-		_item, _ok := _message.(CEMIAdditionalInformation)
+		var _item ICEMIAdditionalInformation
+		_item, _ok := _message.(ICEMIAdditionalInformation)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to CEMIAdditionalInformation")
 		}
@@ -122,10 +125,10 @@ func CEMIDataReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'cemiDataFrame'. " + _err.Error())
 	}
-	var cemiDataFrame CEMIDataFrame
-	cemiDataFrame, _cemiDataFrameOk := _cemiDataFrameMessage.(CEMIDataFrame)
+	var cemiDataFrame ICEMIDataFrame
+	cemiDataFrame, _cemiDataFrameOk := _cemiDataFrameMessage.(ICEMIDataFrame)
 	if !_cemiDataFrameOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiDataFrameMessage).Name() + " to CEMIDataFrame")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiDataFrameMessage).Name() + " to ICEMIDataFrame")
 	}
 
 	// Create the instance
@@ -146,6 +149,6 @@ func (m CEMIDataReq) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (cemiDataFrame)
-	cemiDataFrame := CEMIDataFrame(m.cemiDataFrame)
+	cemiDataFrame := ICEMIDataFrame(m.cemiDataFrame)
 	cemiDataFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
index 451e285..3934d53 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
@@ -26,7 +26,7 @@ import (
 // The data-structure of this message
 type CEMIFrame struct {
 	repeated             bool
-	priority             CEMIPriority
+	priority             ICEMIPriority
 	acknowledgeRequested bool
 	errorFlag            bool
 }
@@ -41,7 +41,7 @@ type ICEMIFrame interface {
 }
 
 type CEMIFrameInitializer interface {
-	initialize(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message
+	initialize(repeated bool, priority ICEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message
 }
 
 func CEMIFrameNotAckFrame(m ICEMIFrame) bool {
@@ -112,16 +112,28 @@ func (m CEMIFrame) LengthInBytes() uint16 {
 func CEMIFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (standardFrame) (Used as input to a switch field)
-	var standardFrame bool = io.ReadBit()
+	standardFrame, _standardFrameErr := io.ReadBit()
+	if _standardFrameErr != nil {
+		return nil, errors.New("Error parsing 'standardFrame' field " + _standardFrameErr.Error())
+	}
 
 	// Discriminator Field (polling) (Used as input to a switch field)
-	var polling bool = io.ReadBit()
+	polling, _pollingErr := io.ReadBit()
+	if _pollingErr != nil {
+		return nil, errors.New("Error parsing 'polling' field " + _pollingErr.Error())
+	}
 
 	// Simple Field (repeated)
-	var repeated bool = io.ReadBit()
+	repeated, _repeatedErr := io.ReadBit()
+	if _repeatedErr != nil {
+		return nil, errors.New("Error parsing 'repeated' field " + _repeatedErr.Error())
+	}
 
 	// Discriminator Field (notAckFrame) (Used as input to a switch field)
-	var notAckFrame bool = io.ReadBit()
+	notAckFrame, _notAckFrameErr := io.ReadBit()
+	if _notAckFrameErr != nil {
+		return nil, errors.New("Error parsing 'notAckFrame' field " + _notAckFrameErr.Error())
+	}
 
 	// Enum field (priority)
 	priority, _priorityErr := CEMIPriorityParse(io)
@@ -130,10 +142,16 @@ func CEMIFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 	}
 
 	// Simple Field (acknowledgeRequested)
-	var acknowledgeRequested bool = io.ReadBit()
+	acknowledgeRequested, _acknowledgeRequestedErr := io.ReadBit()
+	if _acknowledgeRequestedErr != nil {
+		return nil, errors.New("Error parsing 'acknowledgeRequested' field " + _acknowledgeRequestedErr.Error())
+	}
 
 	// Simple Field (errorFlag)
-	var errorFlag bool = io.ReadBit()
+	errorFlag, _errorFlagErr := io.ReadBit()
+	if _errorFlagErr != nil {
+		return nil, errors.New("Error parsing 'errorFlag' field " + _errorFlagErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer CEMIFrameInitializer
@@ -178,7 +196,7 @@ func (m CEMIFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteBit((bool)(notAckFrame))
 
 	// Enum field (priority)
-	priority := CEMIPriority(m.priority)
+	priority := ICEMIPriority(m.priority)
 	priority.Serialize(io)
 
 	// Simple Field (acknowledgeRequested)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go
index a0ed549..317c1bd 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go
@@ -46,7 +46,7 @@ func (m CEMIFrameAck) Polling() bool {
 	return false
 }
 
-func (m CEMIFrameAck) initialize(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
+func (m CEMIFrameAck) initialize(repeated bool, priority ICEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
 	m.repeated = repeated
 	m.priority = priority
 	m.acknowledgeRequested = acknowledgeRequested
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go
index 2e4952e..f3ebd6b 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go
@@ -26,14 +26,14 @@ import (
 
 // The data-structure of this message
 type CEMIFrameData struct {
-	sourceAddress      KNXAddress
+	sourceAddress      IKNXAddress
 	destinationAddress []int8
 	groupAddress       bool
 	hopCount           uint8
 	dataLength         uint8
-	tcpi               TPCI
+	tcpi               ITPCI
 	counter            uint8
-	apci               APCI
+	apci               IAPCI
 	dataFirstByte      int8
 	data               []int8
 	crc                uint8
@@ -59,7 +59,7 @@ func (m CEMIFrameData) Polling() bool {
 	return false
 }
 
-func (m CEMIFrameData) initialize(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
+func (m CEMIFrameData) initialize(repeated bool, priority ICEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
 	m.repeated = repeated
 	m.priority = priority
 	m.acknowledgeRequested = acknowledgeRequested
@@ -67,7 +67,7 @@ func (m CEMIFrameData) initialize(repeated bool, priority CEMIPriority, acknowle
 	return m
 }
 
-func NewCEMIFrameData(sourceAddress KNXAddress, destinationAddress []int8, groupAddress bool, hopCount uint8, dataLength uint8, tcpi TPCI, counter uint8, apci APCI, dataFirstByte int8, data []int8, crc uint8) CEMIFrameInitializer {
+func NewCEMIFrameData(sourceAddress IKNXAddress, destinationAddress []int8, groupAddress bool, hopCount uint8, dataLength uint8, tcpi ITPCI, counter uint8, apci IAPCI, dataFirstByte int8, data []int8, crc uint8) CEMIFrameInitializer {
 	return &CEMIFrameData{sourceAddress: sourceAddress, destinationAddress: destinationAddress, groupAddress: groupAddress, hopCount: hopCount, dataLength: dataLength, tcpi: tcpi, counter: counter, apci: apci, dataFirstByte: dataFirstByte, data: data, crc: crc}
 }
 
@@ -145,10 +145,10 @@ func CEMIFrameDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'sourceAddress'. " + _err.Error())
 	}
-	var sourceAddress KNXAddress
-	sourceAddress, _sourceAddressOk := _sourceAddressMessage.(KNXAddress)
+	var sourceAddress IKNXAddress
+	sourceAddress, _sourceAddressOk := _sourceAddressMessage.(IKNXAddress)
 	if !_sourceAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_sourceAddressMessage).Name() + " to KNXAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_sourceAddressMessage).Name() + " to IKNXAddress")
 	}
 
 	// Array field (destinationAddress)
@@ -158,18 +158,31 @@ func CEMIFrameDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 		destinationAddress := make([]int8, uint16(2))
 		for curItem := uint16(0); curItem < uint16(uint16(2)); curItem++ {
 
-			destinationAddress = append(destinationAddress, io.ReadInt8(8))
+			_destinationAddressVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'destinationAddress' field " + _err.Error())
+			}
+			destinationAddress = append(destinationAddress, _destinationAddressVal)
 		}
 	}
 
 	// Simple Field (groupAddress)
-	var groupAddress bool = io.ReadBit()
+	groupAddress, _groupAddressErr := io.ReadBit()
+	if _groupAddressErr != nil {
+		return nil, errors.New("Error parsing 'groupAddress' field " + _groupAddressErr.Error())
+	}
 
 	// Simple Field (hopCount)
-	var hopCount uint8 = io.ReadUint8(3)
+	hopCount, _hopCountErr := io.ReadUint8(3)
+	if _hopCountErr != nil {
+		return nil, errors.New("Error parsing 'hopCount' field " + _hopCountErr.Error())
+	}
 
 	// Simple Field (dataLength)
-	var dataLength uint8 = io.ReadUint8(4)
+	dataLength, _dataLengthErr := io.ReadUint8(4)
+	if _dataLengthErr != nil {
+		return nil, errors.New("Error parsing 'dataLength' field " + _dataLengthErr.Error())
+	}
 
 	// Enum field (tcpi)
 	tcpi, _tcpiErr := TPCIParse(io)
@@ -178,7 +191,10 @@ func CEMIFrameDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 	}
 
 	// Simple Field (counter)
-	var counter uint8 = io.ReadUint8(4)
+	counter, _counterErr := io.ReadUint8(4)
+	if _counterErr != nil {
+		return nil, errors.New("Error parsing 'counter' field " + _counterErr.Error())
+	}
 
 	// Enum field (apci)
 	apci, _apciErr := APCIParse(io)
@@ -187,7 +203,10 @@ func CEMIFrameDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 	}
 
 	// Simple Field (dataFirstByte)
-	var dataFirstByte int8 = io.ReadInt8(6)
+	dataFirstByte, _dataFirstByteErr := io.ReadInt8(6)
+	if _dataFirstByteErr != nil {
+		return nil, errors.New("Error parsing 'dataFirstByte' field " + _dataFirstByteErr.Error())
+	}
 
 	// Array field (data)
 	var data []int8
@@ -196,12 +215,19 @@ func CEMIFrameDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 		data := make([]int8, uint16(dataLength)-uint16(uint16(1)))
 		for curItem := uint16(0); curItem < uint16(uint16(dataLength)-uint16(uint16(1))); curItem++ {
 
-			data = append(data, io.ReadInt8(8))
+			_dataVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'data' field " + _err.Error())
+			}
+			data = append(data, _dataVal)
 		}
 	}
 
 	// Simple Field (crc)
-	var crc uint8 = io.ReadUint8(8)
+	crc, _crcErr := io.ReadUint8(8)
+	if _crcErr != nil {
+		return nil, errors.New("Error parsing 'crc' field " + _crcErr.Error())
+	}
 
 	// Create the instance
 	return NewCEMIFrameData(sourceAddress, destinationAddress, groupAddress, hopCount, dataLength, tcpi, counter, apci, dataFirstByte, data, crc), nil
@@ -210,7 +236,7 @@ func CEMIFrameDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 func (m CEMIFrameData) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (sourceAddress)
-	sourceAddress := KNXAddress(m.sourceAddress)
+	sourceAddress := IKNXAddress(m.sourceAddress)
 	sourceAddress.Serialize(io)
 
 	// Array Field (destinationAddress)
@@ -233,7 +259,7 @@ func (m CEMIFrameData) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (dataLength))
 
 	// Enum field (tcpi)
-	tcpi := TPCI(m.tcpi)
+	tcpi := ITPCI(m.tcpi)
 	tcpi.Serialize(io)
 
 	// Simple Field (counter)
@@ -241,7 +267,7 @@ func (m CEMIFrameData) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (counter))
 
 	// Enum field (apci)
-	apci := APCI(m.apci)
+	apci := IAPCI(m.apci)
 	apci.Serialize(io)
 
 	// Simple Field (dataFirstByte)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go
index ad40a7a..8f928ab 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go
@@ -29,12 +29,12 @@ type CEMIFrameDataExt struct {
 	groupAddress        bool
 	hopCount            uint8
 	extendedFrameFormat uint8
-	sourceAddress       KNXAddress
+	sourceAddress       IKNXAddress
 	destinationAddress  []int8
 	dataLength          uint8
-	tcpi                TPCI
+	tcpi                ITPCI
 	counter             uint8
-	apci                APCI
+	apci                IAPCI
 	dataFirstByte       int8
 	data                []int8
 	crc                 uint8
@@ -60,7 +60,7 @@ func (m CEMIFrameDataExt) Polling() bool {
 	return false
 }
 
-func (m CEMIFrameDataExt) initialize(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
+func (m CEMIFrameDataExt) initialize(repeated bool, priority ICEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
 	m.repeated = repeated
 	m.priority = priority
 	m.acknowledgeRequested = acknowledgeRequested
@@ -68,7 +68,7 @@ func (m CEMIFrameDataExt) initialize(repeated bool, priority CEMIPriority, ackno
 	return m
 }
 
-func NewCEMIFrameDataExt(groupAddress bool, hopCount uint8, extendedFrameFormat uint8, sourceAddress KNXAddress, destinationAddress []int8, dataLength uint8, tcpi TPCI, counter uint8, apci APCI, dataFirstByte int8, data []int8, crc uint8) CEMIFrameInitializer {
+func NewCEMIFrameDataExt(groupAddress bool, hopCount uint8, extendedFrameFormat uint8, sourceAddress IKNXAddress, destinationAddress []int8, dataLength uint8, tcpi ITPCI, counter uint8, apci IAPCI, dataFirstByte int8, data []int8, crc uint8) CEMIFrameInitializer {
 	return &CEMIFrameDataExt{groupAddress: groupAddress, hopCount: hopCount, extendedFrameFormat: extendedFrameFormat, sourceAddress: sourceAddress, destinationAddress: destinationAddress, dataLength: dataLength, tcpi: tcpi, counter: counter, apci: apci, dataFirstByte: dataFirstByte, data: data, crc: crc}
 }
 
@@ -145,23 +145,32 @@ func (m CEMIFrameDataExt) LengthInBytes() uint16 {
 func CEMIFrameDataExtParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 
 	// Simple Field (groupAddress)
-	var groupAddress bool = io.ReadBit()
+	groupAddress, _groupAddressErr := io.ReadBit()
+	if _groupAddressErr != nil {
+		return nil, errors.New("Error parsing 'groupAddress' field " + _groupAddressErr.Error())
+	}
 
 	// Simple Field (hopCount)
-	var hopCount uint8 = io.ReadUint8(3)
+	hopCount, _hopCountErr := io.ReadUint8(3)
+	if _hopCountErr != nil {
+		return nil, errors.New("Error parsing 'hopCount' field " + _hopCountErr.Error())
+	}
 
 	// Simple Field (extendedFrameFormat)
-	var extendedFrameFormat uint8 = io.ReadUint8(4)
+	extendedFrameFormat, _extendedFrameFormatErr := io.ReadUint8(4)
+	if _extendedFrameFormatErr != nil {
+		return nil, errors.New("Error parsing 'extendedFrameFormat' field " + _extendedFrameFormatErr.Error())
+	}
 
 	// Simple Field (sourceAddress)
 	_sourceAddressMessage, _err := KNXAddressParse(io)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'sourceAddress'. " + _err.Error())
 	}
-	var sourceAddress KNXAddress
-	sourceAddress, _sourceAddressOk := _sourceAddressMessage.(KNXAddress)
+	var sourceAddress IKNXAddress
+	sourceAddress, _sourceAddressOk := _sourceAddressMessage.(IKNXAddress)
 	if !_sourceAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_sourceAddressMessage).Name() + " to KNXAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_sourceAddressMessage).Name() + " to IKNXAddress")
 	}
 
 	// Array field (destinationAddress)
@@ -171,12 +180,19 @@ func CEMIFrameDataExtParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 		destinationAddress := make([]int8, uint16(2))
 		for curItem := uint16(0); curItem < uint16(uint16(2)); curItem++ {
 
-			destinationAddress = append(destinationAddress, io.ReadInt8(8))
+			_destinationAddressVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'destinationAddress' field " + _err.Error())
+			}
+			destinationAddress = append(destinationAddress, _destinationAddressVal)
 		}
 	}
 
 	// Simple Field (dataLength)
-	var dataLength uint8 = io.ReadUint8(8)
+	dataLength, _dataLengthErr := io.ReadUint8(8)
+	if _dataLengthErr != nil {
+		return nil, errors.New("Error parsing 'dataLength' field " + _dataLengthErr.Error())
+	}
 
 	// Enum field (tcpi)
 	tcpi, _tcpiErr := TPCIParse(io)
@@ -185,7 +201,10 @@ func CEMIFrameDataExtParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 	}
 
 	// Simple Field (counter)
-	var counter uint8 = io.ReadUint8(4)
+	counter, _counterErr := io.ReadUint8(4)
+	if _counterErr != nil {
+		return nil, errors.New("Error parsing 'counter' field " + _counterErr.Error())
+	}
 
 	// Enum field (apci)
 	apci, _apciErr := APCIParse(io)
@@ -194,7 +213,10 @@ func CEMIFrameDataExtParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 	}
 
 	// Simple Field (dataFirstByte)
-	var dataFirstByte int8 = io.ReadInt8(6)
+	dataFirstByte, _dataFirstByteErr := io.ReadInt8(6)
+	if _dataFirstByteErr != nil {
+		return nil, errors.New("Error parsing 'dataFirstByte' field " + _dataFirstByteErr.Error())
+	}
 
 	// Array field (data)
 	var data []int8
@@ -203,12 +225,19 @@ func CEMIFrameDataExtParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 		data := make([]int8, uint16(dataLength)-uint16(uint16(1)))
 		for curItem := uint16(0); curItem < uint16(uint16(dataLength)-uint16(uint16(1))); curItem++ {
 
-			data = append(data, io.ReadInt8(8))
+			_dataVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'data' field " + _err.Error())
+			}
+			data = append(data, _dataVal)
 		}
 	}
 
 	// Simple Field (crc)
-	var crc uint8 = io.ReadUint8(8)
+	crc, _crcErr := io.ReadUint8(8)
+	if _crcErr != nil {
+		return nil, errors.New("Error parsing 'crc' field " + _crcErr.Error())
+	}
 
 	// Create the instance
 	return NewCEMIFrameDataExt(groupAddress, hopCount, extendedFrameFormat, sourceAddress, destinationAddress, dataLength, tcpi, counter, apci, dataFirstByte, data, crc), nil
@@ -229,7 +258,7 @@ func (m CEMIFrameDataExt) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (extendedFrameFormat))
 
 	// Simple Field (sourceAddress)
-	sourceAddress := KNXAddress(m.sourceAddress)
+	sourceAddress := IKNXAddress(m.sourceAddress)
 	sourceAddress.Serialize(io)
 
 	// Array Field (destinationAddress)
@@ -244,7 +273,7 @@ func (m CEMIFrameDataExt) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (dataLength))
 
 	// Enum field (tcpi)
-	tcpi := TPCI(m.tcpi)
+	tcpi := ITPCI(m.tcpi)
 	tcpi.Serialize(io)
 
 	// Simple Field (counter)
@@ -252,7 +281,7 @@ func (m CEMIFrameDataExt) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (counter))
 
 	// Enum field (apci)
-	apci := APCI(m.apci)
+	apci := IAPCI(m.apci)
 	apci.Serialize(io)
 
 	// Simple Field (dataFirstByte)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go
index 2fbbb40..d920ebf 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go
@@ -46,7 +46,7 @@ func (m CEMIFramePollingData) Polling() bool {
 	return true
 }
 
-func (m CEMIFramePollingData) initialize(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
+func (m CEMIFramePollingData) initialize(repeated bool, priority ICEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
 	m.repeated = repeated
 	m.priority = priority
 	m.acknowledgeRequested = acknowledgeRequested
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go
index c0da892..e9ab966 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go
@@ -46,7 +46,7 @@ func (m CEMIFramePollingDataExt) Polling() bool {
 	return true
 }
 
-func (m CEMIFramePollingDataExt) initialize(repeated bool, priority CEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
+func (m CEMIFramePollingDataExt) initialize(repeated bool, priority ICEMIPriority, acknowledgeRequested bool, errorFlag bool) spi.Message {
 	m.repeated = repeated
 	m.priority = priority
 	m.acknowledgeRequested = acknowledgeRequested
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go
index e5f480a..3bb7d28 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -103,22 +104,40 @@ func (m CEMIMPropReadCon) LengthInBytes() uint16 {
 func CEMIMPropReadConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 
 	// Simple Field (interfaceObjectType)
-	var interfaceObjectType uint16 = io.ReadUint16(16)
+	interfaceObjectType, _interfaceObjectTypeErr := io.ReadUint16(16)
+	if _interfaceObjectTypeErr != nil {
+		return nil, errors.New("Error parsing 'interfaceObjectType' field " + _interfaceObjectTypeErr.Error())
+	}
 
 	// Simple Field (objectInstance)
-	var objectInstance uint8 = io.ReadUint8(8)
+	objectInstance, _objectInstanceErr := io.ReadUint8(8)
+	if _objectInstanceErr != nil {
+		return nil, errors.New("Error parsing 'objectInstance' field " + _objectInstanceErr.Error())
+	}
 
 	// Simple Field (propertyId)
-	var propertyId uint8 = io.ReadUint8(8)
+	propertyId, _propertyIdErr := io.ReadUint8(8)
+	if _propertyIdErr != nil {
+		return nil, errors.New("Error parsing 'propertyId' field " + _propertyIdErr.Error())
+	}
 
 	// Simple Field (numberOfElements)
-	var numberOfElements uint8 = io.ReadUint8(4)
+	numberOfElements, _numberOfElementsErr := io.ReadUint8(4)
+	if _numberOfElementsErr != nil {
+		return nil, errors.New("Error parsing 'numberOfElements' field " + _numberOfElementsErr.Error())
+	}
 
 	// Simple Field (startIndex)
-	var startIndex uint16 = io.ReadUint16(12)
+	startIndex, _startIndexErr := io.ReadUint16(12)
+	if _startIndexErr != nil {
+		return nil, errors.New("Error parsing 'startIndex' field " + _startIndexErr.Error())
+	}
 
 	// Simple Field (unknown)
-	var unknown uint16 = io.ReadUint16(16)
+	unknown, _unknownErr := io.ReadUint16(16)
+	if _unknownErr != nil {
+		return nil, errors.New("Error parsing 'unknown' field " + _unknownErr.Error())
+	}
 
 	// Create the instance
 	return NewCEMIMPropReadCon(interfaceObjectType, objectInstance, propertyId, numberOfElements, startIndex, unknown), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go
index c931a69..ea35b23 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -99,19 +100,34 @@ func (m CEMIMPropReadReq) LengthInBytes() uint16 {
 func CEMIMPropReadReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 
 	// Simple Field (interfaceObjectType)
-	var interfaceObjectType uint16 = io.ReadUint16(16)
+	interfaceObjectType, _interfaceObjectTypeErr := io.ReadUint16(16)
+	if _interfaceObjectTypeErr != nil {
+		return nil, errors.New("Error parsing 'interfaceObjectType' field " + _interfaceObjectTypeErr.Error())
+	}
 
 	// Simple Field (objectInstance)
-	var objectInstance uint8 = io.ReadUint8(8)
+	objectInstance, _objectInstanceErr := io.ReadUint8(8)
+	if _objectInstanceErr != nil {
+		return nil, errors.New("Error parsing 'objectInstance' field " + _objectInstanceErr.Error())
+	}
 
 	// Simple Field (propertyId)
-	var propertyId uint8 = io.ReadUint8(8)
+	propertyId, _propertyIdErr := io.ReadUint8(8)
+	if _propertyIdErr != nil {
+		return nil, errors.New("Error parsing 'propertyId' field " + _propertyIdErr.Error())
+	}
 
 	// Simple Field (numberOfElements)
-	var numberOfElements uint8 = io.ReadUint8(4)
+	numberOfElements, _numberOfElementsErr := io.ReadUint8(4)
+	if _numberOfElementsErr != nil {
+		return nil, errors.New("Error parsing 'numberOfElements' field " + _numberOfElementsErr.Error())
+	}
 
 	// Simple Field (startIndex)
-	var startIndex uint16 = io.ReadUint16(12)
+	startIndex, _startIndexErr := io.ReadUint16(12)
+	if _startIndexErr != nil {
+		return nil, errors.New("Error parsing 'startIndex' field " + _startIndexErr.Error())
+	}
 
 	// Create the instance
 	return NewCEMIMPropReadReq(interfaceObjectType, objectInstance, propertyId, numberOfElements, startIndex), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
index 38dc4d7..636babe 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPriority.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type CEMIPriority uint8
 
+type ICEMIPriority interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	CEMIPriority_SYSTEM CEMIPriority = 0x0
 	CEMIPriority_NORMAL CEMIPriority = 0x1
@@ -39,6 +44,14 @@ func CastCEMIPriority(structType interface{}) CEMIPriority {
 	return castFunc(structType)
 }
 
+func (m CEMIPriority) LengthInBits() uint16 {
+	return 2
+}
+
+func (m CEMIPriority) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func CEMIPriorityParse(io spi.ReadBuffer) (CEMIPriority, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
index cd61ca9..fded2f1 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
@@ -26,9 +26,9 @@ import (
 
 // The data-structure of this message
 type ConnectionRequest struct {
-	hpaiDiscoveryEndpoint        HPAIDiscoveryEndpoint
-	hpaiDataEndpoint             HPAIDataEndpoint
-	connectionRequestInformation ConnectionRequestInformation
+	hpaiDiscoveryEndpoint        IHPAIDiscoveryEndpoint
+	hpaiDataEndpoint             IHPAIDataEndpoint
+	connectionRequestInformation IConnectionRequestInformation
 	KNXNetIPMessage
 }
 
@@ -47,7 +47,7 @@ func (m ConnectionRequest) initialize() spi.Message {
 	return m
 }
 
-func NewConnectionRequest(hpaiDiscoveryEndpoint HPAIDiscoveryEndpoint, hpaiDataEndpoint HPAIDataEndpoint, connectionRequestInformation ConnectionRequestInformation) KNXNetIPMessageInitializer {
+func NewConnectionRequest(hpaiDiscoveryEndpoint IHPAIDiscoveryEndpoint, hpaiDataEndpoint IHPAIDataEndpoint, connectionRequestInformation IConnectionRequestInformation) KNXNetIPMessageInitializer {
 	return &ConnectionRequest{hpaiDiscoveryEndpoint: hpaiDiscoveryEndpoint, hpaiDataEndpoint: hpaiDataEndpoint, connectionRequestInformation: connectionRequestInformation}
 }
 
@@ -97,10 +97,10 @@ func ConnectionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'hpaiDiscoveryEndpoint'. " + _err.Error())
 	}
-	var hpaiDiscoveryEndpoint HPAIDiscoveryEndpoint
-	hpaiDiscoveryEndpoint, _hpaiDiscoveryEndpointOk := _hpaiDiscoveryEndpointMessage.(HPAIDiscoveryEndpoint)
+	var hpaiDiscoveryEndpoint IHPAIDiscoveryEndpoint
+	hpaiDiscoveryEndpoint, _hpaiDiscoveryEndpointOk := _hpaiDiscoveryEndpointMessage.(IHPAIDiscoveryEndpoint)
 	if !_hpaiDiscoveryEndpointOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiDiscoveryEndpointMessage).Name() + " to HPAIDiscoveryEndpoint")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiDiscoveryEndpointMessage).Name() + " to IHPAIDiscoveryEndpoint")
 	}
 
 	// Simple Field (hpaiDataEndpoint)
@@ -108,10 +108,10 @@ func ConnectionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'hpaiDataEndpoint'. " + _err.Error())
 	}
-	var hpaiDataEndpoint HPAIDataEndpoint
-	hpaiDataEndpoint, _hpaiDataEndpointOk := _hpaiDataEndpointMessage.(HPAIDataEndpoint)
+	var hpaiDataEndpoint IHPAIDataEndpoint
+	hpaiDataEndpoint, _hpaiDataEndpointOk := _hpaiDataEndpointMessage.(IHPAIDataEndpoint)
 	if !_hpaiDataEndpointOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiDataEndpointMessage).Name() + " to HPAIDataEndpoint")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiDataEndpointMessage).Name() + " to IHPAIDataEndpoint")
 	}
 
 	// Simple Field (connectionRequestInformation)
@@ -119,10 +119,10 @@ func ConnectionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'connectionRequestInformation'. " + _err.Error())
 	}
-	var connectionRequestInformation ConnectionRequestInformation
-	connectionRequestInformation, _connectionRequestInformationOk := _connectionRequestInformationMessage.(ConnectionRequestInformation)
+	var connectionRequestInformation IConnectionRequestInformation
+	connectionRequestInformation, _connectionRequestInformationOk := _connectionRequestInformationMessage.(IConnectionRequestInformation)
 	if !_connectionRequestInformationOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_connectionRequestInformationMessage).Name() + " to ConnectionRequestInformation")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_connectionRequestInformationMessage).Name() + " to IConnectionRequestInformation")
 	}
 
 	// Create the instance
@@ -132,14 +132,14 @@ func ConnectionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 func (m ConnectionRequest) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (hpaiDiscoveryEndpoint)
-	hpaiDiscoveryEndpoint := HPAIDiscoveryEndpoint(m.hpaiDiscoveryEndpoint)
+	hpaiDiscoveryEndpoint := IHPAIDiscoveryEndpoint(m.hpaiDiscoveryEndpoint)
 	hpaiDiscoveryEndpoint.Serialize(io)
 
 	// Simple Field (hpaiDataEndpoint)
-	hpaiDataEndpoint := HPAIDataEndpoint(m.hpaiDataEndpoint)
+	hpaiDataEndpoint := IHPAIDataEndpoint(m.hpaiDataEndpoint)
 	hpaiDataEndpoint.Serialize(io)
 
 	// Simple Field (connectionRequestInformation)
-	connectionRequestInformation := ConnectionRequestInformation(m.connectionRequestInformation)
+	connectionRequestInformation := IConnectionRequestInformation(m.connectionRequestInformation)
 	connectionRequestInformation.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go
index 1f8a22f..1f5be5f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go
@@ -83,10 +83,16 @@ func (m ConnectionRequestInformation) LengthInBytes() uint16 {
 func ConnectionRequestInformationParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Discriminator Field (connectionType) (Used as input to a switch field)
-	var connectionType uint8 = io.ReadUint8(8)
+	connectionType, _connectionTypeErr := io.ReadUint8(8)
+	if _connectionTypeErr != nil {
+		return nil, errors.New("Error parsing 'connectionType' field " + _connectionTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer ConnectionRequestInformationInitializer
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go
index 038220f..262b7d0 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type ConnectionRequestInformationTunnelConnection struct {
-	knxLayer KnxLayer
+	knxLayer IKnxLayer
 	ConnectionRequestInformation
 }
 
@@ -45,7 +45,7 @@ func (m ConnectionRequestInformationTunnelConnection) initialize() spi.Message {
 	return m
 }
 
-func NewConnectionRequestInformationTunnelConnection(knxLayer KnxLayer) ConnectionRequestInformationInitializer {
+func NewConnectionRequestInformationTunnelConnection(knxLayer IKnxLayer) ConnectionRequestInformationInitializer {
 	return &ConnectionRequestInformationTunnelConnection{knxLayer: knxLayer}
 }
 
@@ -95,7 +95,10 @@ func ConnectionRequestInformationTunnelConnectionParse(io spi.ReadBuffer) (Conne
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(8)
+		reserved, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -111,7 +114,7 @@ func ConnectionRequestInformationTunnelConnectionParse(io spi.ReadBuffer) (Conne
 func (m ConnectionRequestInformationTunnelConnection) Serialize(io spi.WriteBuffer) {
 
 	// Enum field (knxLayer)
-	knxLayer := KnxLayer(m.knxLayer)
+	knxLayer := IKnxLayer(m.knxLayer)
 	knxLayer.Serialize(io)
 
 	// Reserved Field (reserved)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
index 1f971b2..972936a 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
@@ -27,9 +27,9 @@ import (
 // The data-structure of this message
 type ConnectionResponse struct {
 	communicationChannelId      uint8
-	status                      Status
-	hpaiDataEndpoint            *HPAIDataEndpoint
-	connectionResponseDataBlock *ConnectionResponseDataBlock
+	status                      IStatus
+	hpaiDataEndpoint            *IHPAIDataEndpoint
+	connectionResponseDataBlock *IConnectionResponseDataBlock
 	KNXNetIPMessage
 }
 
@@ -48,7 +48,7 @@ func (m ConnectionResponse) initialize() spi.Message {
 	return m
 }
 
-func NewConnectionResponse(communicationChannelId uint8, status Status, hpaiDataEndpoint *HPAIDataEndpoint, connectionResponseDataBlock *ConnectionResponseDataBlock) KNXNetIPMessageInitializer {
+func NewConnectionResponse(communicationChannelId uint8, status IStatus, hpaiDataEndpoint *IHPAIDataEndpoint, connectionResponseDataBlock *IConnectionResponseDataBlock) KNXNetIPMessageInitializer {
 	return &ConnectionResponse{communicationChannelId: communicationChannelId, status: status, hpaiDataEndpoint: hpaiDataEndpoint, connectionResponseDataBlock: connectionResponseDataBlock}
 }
 
@@ -83,12 +83,12 @@ func (m ConnectionResponse) LengthInBits() uint16 {
 
 	// Optional Field (hpaiDataEndpoint)
 	if m.hpaiDataEndpoint != nil {
-		lengthInBits += m.hpaiDataEndpoint.LengthInBits()
+		lengthInBits += (*m.hpaiDataEndpoint).LengthInBits()
 	}
 
 	// Optional Field (connectionResponseDataBlock)
 	if m.connectionResponseDataBlock != nil {
-		lengthInBits += m.connectionResponseDataBlock.LengthInBits()
+		lengthInBits += (*m.connectionResponseDataBlock).LengthInBits()
 	}
 
 	return lengthInBits
@@ -101,7 +101,10 @@ func (m ConnectionResponse) LengthInBytes() uint16 {
 func ConnectionResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Enum field (status)
 	status, _statusErr := StatusParse(io)
@@ -110,31 +113,31 @@ func ConnectionResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, err
 	}
 
 	// Optional Field (hpaiDataEndpoint) (Can be skipped, if a given expression evaluates to false)
-	var hpaiDataEndpoint *HPAIDataEndpoint = nil
+	var hpaiDataEndpoint *IHPAIDataEndpoint = nil
 	if bool((status) == (Status_NO_ERROR)) {
 		_message, _err := HPAIDataEndpointParse(io)
 		if _err != nil {
 			return nil, errors.New("Error parsing 'hpaiDataEndpoint' field " + _err.Error())
 		}
-		var _item HPAIDataEndpoint
-		_item, _ok := _message.(HPAIDataEndpoint)
+		var _item IHPAIDataEndpoint
+		_item, _ok := _message.(IHPAIDataEndpoint)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to HPAIDataEndpoint")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IHPAIDataEndpoint")
 		}
 		hpaiDataEndpoint = &_item
 	}
 
 	// Optional Field (connectionResponseDataBlock) (Can be skipped, if a given expression evaluates to false)
-	var connectionResponseDataBlock *ConnectionResponseDataBlock = nil
+	var connectionResponseDataBlock *IConnectionResponseDataBlock = nil
 	if bool((status) == (Status_NO_ERROR)) {
 		_message, _err := ConnectionResponseDataBlockParse(io)
 		if _err != nil {
 			return nil, errors.New("Error parsing 'connectionResponseDataBlock' field " + _err.Error())
 		}
-		var _item ConnectionResponseDataBlock
-		_item, _ok := _message.(ConnectionResponseDataBlock)
+		var _item IConnectionResponseDataBlock
+		_item, _ok := _message.(IConnectionResponseDataBlock)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ConnectionResponseDataBlock")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IConnectionResponseDataBlock")
 		}
 		connectionResponseDataBlock = &_item
 	}
@@ -150,20 +153,20 @@ func (m ConnectionResponse) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (communicationChannelId))
 
 	// Enum field (status)
-	status := Status(m.status)
+	status := IStatus(m.status)
 	status.Serialize(io)
 
 	// Optional Field (hpaiDataEndpoint) (Can be skipped, if the value is null)
-	var hpaiDataEndpoint *HPAIDataEndpoint = nil
+	var hpaiDataEndpoint *IHPAIDataEndpoint = nil
 	if m.hpaiDataEndpoint != nil {
 		hpaiDataEndpoint = m.hpaiDataEndpoint
-		hpaiDataEndpoint.Serialize(io)
+		(*hpaiDataEndpoint).Serialize(io)
 	}
 
 	// Optional Field (connectionResponseDataBlock) (Can be skipped, if the value is null)
-	var connectionResponseDataBlock *ConnectionResponseDataBlock = nil
+	var connectionResponseDataBlock *IConnectionResponseDataBlock = nil
 	if m.connectionResponseDataBlock != nil {
 		connectionResponseDataBlock = m.connectionResponseDataBlock
-		connectionResponseDataBlock.Serialize(io)
+		(*connectionResponseDataBlock).Serialize(io)
 	}
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
index 82e05c4..689b57b 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
@@ -83,10 +83,16 @@ func (m ConnectionResponseDataBlock) LengthInBytes() uint16 {
 func ConnectionResponseDataBlockParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Discriminator Field (connectionType) (Used as input to a switch field)
-	var connectionType uint8 = io.ReadUint8(8)
+	connectionType, _connectionTypeErr := io.ReadUint8(8)
+	if _connectionTypeErr != nil {
+		return nil, errors.New("Error parsing 'connectionType' field " + _connectionTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer ConnectionResponseDataBlockInitializer
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
index ac9950f..3937380 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type ConnectionResponseDataBlockTunnelConnection struct {
-	knxAddress KNXAddress
+	knxAddress IKNXAddress
 	ConnectionResponseDataBlock
 }
 
@@ -45,7 +45,7 @@ func (m ConnectionResponseDataBlockTunnelConnection) initialize() spi.Message {
 	return m
 }
 
-func NewConnectionResponseDataBlockTunnelConnection(knxAddress KNXAddress) ConnectionResponseDataBlockInitializer {
+func NewConnectionResponseDataBlockTunnelConnection(knxAddress IKNXAddress) ConnectionResponseDataBlockInitializer {
 	return &ConnectionResponseDataBlockTunnelConnection{knxAddress: knxAddress}
 }
 
@@ -89,10 +89,10 @@ func ConnectionResponseDataBlockTunnelConnectionParse(io spi.ReadBuffer) (Connec
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'knxAddress'. " + _err.Error())
 	}
-	var knxAddress KNXAddress
-	knxAddress, _knxAddressOk := _knxAddressMessage.(KNXAddress)
+	var knxAddress IKNXAddress
+	knxAddress, _knxAddressOk := _knxAddressMessage.(IKNXAddress)
 	if !_knxAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxAddressMessage).Name() + " to KNXAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxAddressMessage).Name() + " to IKNXAddress")
 	}
 
 	// Create the instance
@@ -102,6 +102,6 @@ func ConnectionResponseDataBlockTunnelConnectionParse(io spi.ReadBuffer) (Connec
 func (m ConnectionResponseDataBlockTunnelConnection) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (knxAddress)
-	knxAddress := KNXAddress(m.knxAddress)
+	knxAddress := IKNXAddress(m.knxAddress)
 	knxAddress.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
index df8a8b2..bd85e44 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
@@ -28,7 +28,7 @@ import (
 // The data-structure of this message
 type ConnectionStateRequest struct {
 	communicationChannelId uint8
-	hpaiControlEndpoint    HPAIControlEndpoint
+	hpaiControlEndpoint    IHPAIControlEndpoint
 	KNXNetIPMessage
 }
 
@@ -47,7 +47,7 @@ func (m ConnectionStateRequest) initialize() spi.Message {
 	return m
 }
 
-func NewConnectionStateRequest(communicationChannelId uint8, hpaiControlEndpoint HPAIControlEndpoint) KNXNetIPMessageInitializer {
+func NewConnectionStateRequest(communicationChannelId uint8, hpaiControlEndpoint IHPAIControlEndpoint) KNXNetIPMessageInitializer {
 	return &ConnectionStateRequest{communicationChannelId: communicationChannelId, hpaiControlEndpoint: hpaiControlEndpoint}
 }
 
@@ -93,11 +93,17 @@ func (m ConnectionStateRequest) LengthInBytes() uint16 {
 func ConnectionStateRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(8)
+		reserved, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -111,10 +117,10 @@ func ConnectionStateRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer,
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'hpaiControlEndpoint'. " + _err.Error())
 	}
-	var hpaiControlEndpoint HPAIControlEndpoint
-	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(HPAIControlEndpoint)
+	var hpaiControlEndpoint IHPAIControlEndpoint
+	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(IHPAIControlEndpoint)
 	if !_hpaiControlEndpointOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to HPAIControlEndpoint")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to IHPAIControlEndpoint")
 	}
 
 	// Create the instance
@@ -131,6 +137,6 @@ func (m ConnectionStateRequest) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, uint8(0x00))
 
 	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := HPAIControlEndpoint(m.hpaiControlEndpoint)
+	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
 	hpaiControlEndpoint.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go
index 7cbc8d4..7923043 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go
@@ -26,7 +26,7 @@ import (
 // The data-structure of this message
 type ConnectionStateResponse struct {
 	communicationChannelId uint8
-	status                 Status
+	status                 IStatus
 	KNXNetIPMessage
 }
 
@@ -45,7 +45,7 @@ func (m ConnectionStateResponse) initialize() spi.Message {
 	return m
 }
 
-func NewConnectionStateResponse(communicationChannelId uint8, status Status) KNXNetIPMessageInitializer {
+func NewConnectionStateResponse(communicationChannelId uint8, status IStatus) KNXNetIPMessageInitializer {
 	return &ConnectionStateResponse{communicationChannelId: communicationChannelId, status: status}
 }
 
@@ -88,7 +88,10 @@ func (m ConnectionStateResponse) LengthInBytes() uint16 {
 func ConnectionStateResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Enum field (status)
 	status, _statusErr := StatusParse(io)
@@ -107,6 +110,6 @@ func (m ConnectionStateResponse) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (communicationChannelId))
 
 	// Enum field (status)
-	status := Status(m.status)
+	status := IStatus(m.status)
 	status.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
index 2639f4d..f586c65 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
@@ -28,12 +28,12 @@ import (
 type DIBDeviceInfo struct {
 	descriptionType                uint8
 	knxMedium                      uint8
-	deviceStatus                   DeviceStatus
-	knxAddress                     KNXAddress
-	projectInstallationIdentifier  ProjectInstallationIdentifier
+	deviceStatus                   IDeviceStatus
+	knxAddress                     IKNXAddress
+	projectInstallationIdentifier  IProjectInstallationIdentifier
 	knxNetIpDeviceSerialNumber     []int8
-	knxNetIpDeviceMulticastAddress IPAddress
-	knxNetIpDeviceMacAddress       MACAddress
+	knxNetIpDeviceMulticastAddress IIPAddress
+	knxNetIpDeviceMacAddress       IMACAddress
 	deviceFriendlyName             []int8
 }
 
@@ -43,7 +43,7 @@ type IDIBDeviceInfo interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewDIBDeviceInfo(descriptionType uint8, knxMedium uint8, deviceStatus DeviceStatus, knxAddress KNXAddress, projectInstallationIdentifier ProjectInstallationIdentifier, knxNetIpDeviceSerialNumber []int8, knxNetIpDeviceMulticastAddress IPAddress, knxNetIpDeviceMacAddress MACAddress, deviceFriendlyName []int8) spi.Message {
+func NewDIBDeviceInfo(descriptionType uint8, knxMedium uint8, deviceStatus IDeviceStatus, knxAddress IKNXAddress, projectInstallationIdentifier IProjectInstallationIdentifier, knxNetIpDeviceSerialNumber []int8, knxNetIpDeviceMulticastAddress IIPAddress, knxNetIpDeviceMacAddress IMACAddress, deviceFriendlyName []int8) spi.Message {
 	return &DIBDeviceInfo{descriptionType: descriptionType, knxMedium: knxMedium, deviceStatus: deviceStatus, knxAddress: knxAddress, projectInstallationIdentifier: projectInstallationIdentifier, knxNetIpDeviceSerialNumber: knxNetIpDeviceSerialNumber, knxNetIpDeviceMulticastAddress: knxNetIpDeviceMulticastAddress, knxNetIpDeviceMacAddress: knxNetIpDeviceMacAddress, deviceFriendlyName: deviceFriendlyName}
 }
 
@@ -114,23 +114,32 @@ func (m DIBDeviceInfo) LengthInBytes() uint16 {
 func DIBDeviceInfoParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Simple Field (descriptionType)
-	var descriptionType uint8 = io.ReadUint8(8)
+	descriptionType, _descriptionTypeErr := io.ReadUint8(8)
+	if _descriptionTypeErr != nil {
+		return nil, errors.New("Error parsing 'descriptionType' field " + _descriptionTypeErr.Error())
+	}
 
 	// Simple Field (knxMedium)
-	var knxMedium uint8 = io.ReadUint8(8)
+	knxMedium, _knxMediumErr := io.ReadUint8(8)
+	if _knxMediumErr != nil {
+		return nil, errors.New("Error parsing 'knxMedium' field " + _knxMediumErr.Error())
+	}
 
 	// Simple Field (deviceStatus)
 	_deviceStatusMessage, _err := DeviceStatusParse(io)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'deviceStatus'. " + _err.Error())
 	}
-	var deviceStatus DeviceStatus
-	deviceStatus, _deviceStatusOk := _deviceStatusMessage.(DeviceStatus)
+	var deviceStatus IDeviceStatus
+	deviceStatus, _deviceStatusOk := _deviceStatusMessage.(IDeviceStatus)
 	if !_deviceStatusOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_deviceStatusMessage).Name() + " to DeviceStatus")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_deviceStatusMessage).Name() + " to IDeviceStatus")
 	}
 
 	// Simple Field (knxAddress)
@@ -138,10 +147,10 @@ func DIBDeviceInfoParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'knxAddress'. " + _err.Error())
 	}
-	var knxAddress KNXAddress
-	knxAddress, _knxAddressOk := _knxAddressMessage.(KNXAddress)
+	var knxAddress IKNXAddress
+	knxAddress, _knxAddressOk := _knxAddressMessage.(IKNXAddress)
 	if !_knxAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxAddressMessage).Name() + " to KNXAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxAddressMessage).Name() + " to IKNXAddress")
 	}
 
 	// Simple Field (projectInstallationIdentifier)
@@ -149,10 +158,10 @@ func DIBDeviceInfoParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'projectInstallationIdentifier'. " + _err.Error())
 	}
-	var projectInstallationIdentifier ProjectInstallationIdentifier
-	projectInstallationIdentifier, _projectInstallationIdentifierOk := _projectInstallationIdentifierMessage.(ProjectInstallationIdentifier)
+	var projectInstallationIdentifier IProjectInstallationIdentifier
+	projectInstallationIdentifier, _projectInstallationIdentifierOk := _projectInstallationIdentifierMessage.(IProjectInstallationIdentifier)
 	if !_projectInstallationIdentifierOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_projectInstallationIdentifierMessage).Name() + " to ProjectInstallationIdentifier")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_projectInstallationIdentifierMessage).Name() + " to IProjectInstallationIdentifier")
 	}
 
 	// Array field (knxNetIpDeviceSerialNumber)
@@ -162,7 +171,11 @@ func DIBDeviceInfoParse(io spi.ReadBuffer) (spi.Message, error) {
 		knxNetIpDeviceSerialNumber := make([]int8, uint16(6))
 		for curItem := uint16(0); curItem < uint16(uint16(6)); curItem++ {
 
-			knxNetIpDeviceSerialNumber = append(knxNetIpDeviceSerialNumber, io.ReadInt8(8))
+			_knxNetIpDeviceSerialNumberVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'knxNetIpDeviceSerialNumber' field " + _err.Error())
+			}
+			knxNetIpDeviceSerialNumber = append(knxNetIpDeviceSerialNumber, _knxNetIpDeviceSerialNumberVal)
 		}
 	}
 
@@ -171,10 +184,10 @@ func DIBDeviceInfoParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'knxNetIpDeviceMulticastAddress'. " + _err.Error())
 	}
-	var knxNetIpDeviceMulticastAddress IPAddress
-	knxNetIpDeviceMulticastAddress, _knxNetIpDeviceMulticastAddressOk := _knxNetIpDeviceMulticastAddressMessage.(IPAddress)
+	var knxNetIpDeviceMulticastAddress IIPAddress
+	knxNetIpDeviceMulticastAddress, _knxNetIpDeviceMulticastAddressOk := _knxNetIpDeviceMulticastAddressMessage.(IIPAddress)
 	if !_knxNetIpDeviceMulticastAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxNetIpDeviceMulticastAddressMessage).Name() + " to IPAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxNetIpDeviceMulticastAddressMessage).Name() + " to IIPAddress")
 	}
 
 	// Simple Field (knxNetIpDeviceMacAddress)
@@ -182,10 +195,10 @@ func DIBDeviceInfoParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'knxNetIpDeviceMacAddress'. " + _err.Error())
 	}
-	var knxNetIpDeviceMacAddress MACAddress
-	knxNetIpDeviceMacAddress, _knxNetIpDeviceMacAddressOk := _knxNetIpDeviceMacAddressMessage.(MACAddress)
+	var knxNetIpDeviceMacAddress IMACAddress
+	knxNetIpDeviceMacAddress, _knxNetIpDeviceMacAddressOk := _knxNetIpDeviceMacAddressMessage.(IMACAddress)
 	if !_knxNetIpDeviceMacAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxNetIpDeviceMacAddressMessage).Name() + " to MACAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_knxNetIpDeviceMacAddressMessage).Name() + " to IMACAddress")
 	}
 
 	// Array field (deviceFriendlyName)
@@ -195,7 +208,11 @@ func DIBDeviceInfoParse(io spi.ReadBuffer) (spi.Message, error) {
 		deviceFriendlyName := make([]int8, uint16(30))
 		for curItem := uint16(0); curItem < uint16(uint16(30)); curItem++ {
 
-			deviceFriendlyName = append(deviceFriendlyName, io.ReadInt8(8))
+			_deviceFriendlyNameVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'deviceFriendlyName' field " + _err.Error())
+			}
+			deviceFriendlyName = append(deviceFriendlyName, _deviceFriendlyNameVal)
 		}
 	}
 
@@ -218,15 +235,15 @@ func (m DIBDeviceInfo) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (knxMedium))
 
 	// Simple Field (deviceStatus)
-	deviceStatus := DeviceStatus(m.deviceStatus)
+	deviceStatus := IDeviceStatus(m.deviceStatus)
 	deviceStatus.Serialize(io)
 
 	// Simple Field (knxAddress)
-	knxAddress := KNXAddress(m.knxAddress)
+	knxAddress := IKNXAddress(m.knxAddress)
 	knxAddress.Serialize(io)
 
 	// Simple Field (projectInstallationIdentifier)
-	projectInstallationIdentifier := ProjectInstallationIdentifier(m.projectInstallationIdentifier)
+	projectInstallationIdentifier := IProjectInstallationIdentifier(m.projectInstallationIdentifier)
 	projectInstallationIdentifier.Serialize(io)
 
 	// Array Field (knxNetIpDeviceSerialNumber)
@@ -237,11 +254,11 @@ func (m DIBDeviceInfo) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (knxNetIpDeviceMulticastAddress)
-	knxNetIpDeviceMulticastAddress := IPAddress(m.knxNetIpDeviceMulticastAddress)
+	knxNetIpDeviceMulticastAddress := IIPAddress(m.knxNetIpDeviceMulticastAddress)
 	knxNetIpDeviceMulticastAddress.Serialize(io)
 
 	// Simple Field (knxNetIpDeviceMacAddress)
-	knxNetIpDeviceMacAddress := MACAddress(m.knxNetIpDeviceMacAddress)
+	knxNetIpDeviceMacAddress := IMACAddress(m.knxNetIpDeviceMacAddress)
 	knxNetIpDeviceMacAddress.Serialize(io)
 
 	// Array Field (deviceFriendlyName)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
index 37509ba..d71603a 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
@@ -27,7 +27,7 @@ import (
 // The data-structure of this message
 type DIBSuppSvcFamilies struct {
 	descriptionType uint8
-	serviceIds      []ServiceId
+	serviceIds      []IServiceId
 }
 
 // The corresponding interface
@@ -36,7 +36,7 @@ type IDIBSuppSvcFamilies interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewDIBSuppSvcFamilies(descriptionType uint8, serviceIds []ServiceId) spi.Message {
+func NewDIBSuppSvcFamilies(descriptionType uint8, serviceIds []IServiceId) spi.Message {
 	return &DIBSuppSvcFamilies{descriptionType: descriptionType, serviceIds: serviceIds}
 }
 
@@ -86,24 +86,30 @@ func (m DIBSuppSvcFamilies) LengthInBytes() uint16 {
 func DIBSuppSvcFamiliesParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Simple Field (descriptionType)
-	var descriptionType uint8 = io.ReadUint8(8)
+	descriptionType, _descriptionTypeErr := io.ReadUint8(8)
+	if _descriptionTypeErr != nil {
+		return nil, errors.New("Error parsing 'descriptionType' field " + _descriptionTypeErr.Error())
+	}
 
 	// Array field (serviceIds)
-	var serviceIds []ServiceId
+	var serviceIds []IServiceId
 	// Count array
 	{
-		serviceIds := make([]ServiceId, uint16(3))
+		serviceIds := make([]IServiceId, uint16(3))
 		for curItem := uint16(0); curItem < uint16(uint16(3)); curItem++ {
 
 			_message, _err := ServiceIdParse(io)
 			if _err != nil {
 				return nil, errors.New("Error parsing 'serviceIds' field " + _err.Error())
 			}
-			var _item ServiceId
-			_item, _ok := _message.(ServiceId)
+			var _item IServiceId
+			_item, _ok := _message.(IServiceId)
 			if !_ok {
 				return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ServiceId")
 			}
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
index 40db5db..322e234 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type DescriptionRequest struct {
-	hpaiControlEndpoint HPAIControlEndpoint
+	hpaiControlEndpoint IHPAIControlEndpoint
 	KNXNetIPMessage
 }
 
@@ -45,7 +45,7 @@ func (m DescriptionRequest) initialize() spi.Message {
 	return m
 }
 
-func NewDescriptionRequest(hpaiControlEndpoint HPAIControlEndpoint) KNXNetIPMessageInitializer {
+func NewDescriptionRequest(hpaiControlEndpoint IHPAIControlEndpoint) KNXNetIPMessageInitializer {
 	return &DescriptionRequest{hpaiControlEndpoint: hpaiControlEndpoint}
 }
 
@@ -89,10 +89,10 @@ func DescriptionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, err
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'hpaiControlEndpoint'. " + _err.Error())
 	}
-	var hpaiControlEndpoint HPAIControlEndpoint
-	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(HPAIControlEndpoint)
+	var hpaiControlEndpoint IHPAIControlEndpoint
+	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(IHPAIControlEndpoint)
 	if !_hpaiControlEndpointOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to HPAIControlEndpoint")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to IHPAIControlEndpoint")
 	}
 
 	// Create the instance
@@ -102,6 +102,6 @@ func DescriptionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, err
 func (m DescriptionRequest) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := HPAIControlEndpoint(m.hpaiControlEndpoint)
+	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
 	hpaiControlEndpoint.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
index 65de5e5..eacfc3b 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
@@ -26,8 +26,8 @@ import (
 
 // The data-structure of this message
 type DescriptionResponse struct {
-	dibDeviceInfo      DIBDeviceInfo
-	dibSuppSvcFamilies DIBSuppSvcFamilies
+	dibDeviceInfo      IDIBDeviceInfo
+	dibSuppSvcFamilies IDIBSuppSvcFamilies
 	KNXNetIPMessage
 }
 
@@ -46,7 +46,7 @@ func (m DescriptionResponse) initialize() spi.Message {
 	return m
 }
 
-func NewDescriptionResponse(dibDeviceInfo DIBDeviceInfo, dibSuppSvcFamilies DIBSuppSvcFamilies) KNXNetIPMessageInitializer {
+func NewDescriptionResponse(dibDeviceInfo IDIBDeviceInfo, dibSuppSvcFamilies IDIBSuppSvcFamilies) KNXNetIPMessageInitializer {
 	return &DescriptionResponse{dibDeviceInfo: dibDeviceInfo, dibSuppSvcFamilies: dibSuppSvcFamilies}
 }
 
@@ -93,10 +93,10 @@ func DescriptionResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, er
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'dibDeviceInfo'. " + _err.Error())
 	}
-	var dibDeviceInfo DIBDeviceInfo
-	dibDeviceInfo, _dibDeviceInfoOk := _dibDeviceInfoMessage.(DIBDeviceInfo)
+	var dibDeviceInfo IDIBDeviceInfo
+	dibDeviceInfo, _dibDeviceInfoOk := _dibDeviceInfoMessage.(IDIBDeviceInfo)
 	if !_dibDeviceInfoOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibDeviceInfoMessage).Name() + " to DIBDeviceInfo")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibDeviceInfoMessage).Name() + " to IDIBDeviceInfo")
 	}
 
 	// Simple Field (dibSuppSvcFamilies)
@@ -104,10 +104,10 @@ func DescriptionResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, er
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'dibSuppSvcFamilies'. " + _err.Error())
 	}
-	var dibSuppSvcFamilies DIBSuppSvcFamilies
-	dibSuppSvcFamilies, _dibSuppSvcFamiliesOk := _dibSuppSvcFamiliesMessage.(DIBSuppSvcFamilies)
+	var dibSuppSvcFamilies IDIBSuppSvcFamilies
+	dibSuppSvcFamilies, _dibSuppSvcFamiliesOk := _dibSuppSvcFamiliesMessage.(IDIBSuppSvcFamilies)
 	if !_dibSuppSvcFamiliesOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibSuppSvcFamiliesMessage).Name() + " to DIBSuppSvcFamilies")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibSuppSvcFamiliesMessage).Name() + " to IDIBSuppSvcFamilies")
 	}
 
 	// Create the instance
@@ -117,10 +117,10 @@ func DescriptionResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, er
 func (m DescriptionResponse) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (dibDeviceInfo)
-	dibDeviceInfo := DIBDeviceInfo(m.dibDeviceInfo)
+	dibDeviceInfo := IDIBDeviceInfo(m.dibDeviceInfo)
 	dibDeviceInfo.Serialize(io)
 
 	// Simple Field (dibSuppSvcFamilies)
-	dibSuppSvcFamilies := DIBSuppSvcFamilies(m.dibSuppSvcFamilies)
+	dibSuppSvcFamilies := IDIBSuppSvcFamilies(m.dibSuppSvcFamilies)
 	dibSuppSvcFamilies.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
index 068356e..c678ade 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type DeviceConfigurationAck struct {
-	deviceConfigurationAckDataBlock DeviceConfigurationAckDataBlock
+	deviceConfigurationAckDataBlock IDeviceConfigurationAckDataBlock
 	KNXNetIPMessage
 }
 
@@ -45,7 +45,7 @@ func (m DeviceConfigurationAck) initialize() spi.Message {
 	return m
 }
 
-func NewDeviceConfigurationAck(deviceConfigurationAckDataBlock DeviceConfigurationAckDataBlock) KNXNetIPMessageInitializer {
+func NewDeviceConfigurationAck(deviceConfigurationAckDataBlock IDeviceConfigurationAckDataBlock) KNXNetIPMessageInitializer {
 	return &DeviceConfigurationAck{deviceConfigurationAckDataBlock: deviceConfigurationAckDataBlock}
 }
 
@@ -89,10 +89,10 @@ func DeviceConfigurationAckParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer,
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'deviceConfigurationAckDataBlock'. " + _err.Error())
 	}
-	var deviceConfigurationAckDataBlock DeviceConfigurationAckDataBlock
-	deviceConfigurationAckDataBlock, _deviceConfigurationAckDataBlockOk := _deviceConfigurationAckDataBlockMessage.(DeviceConfigurationAckDataBlock)
+	var deviceConfigurationAckDataBlock IDeviceConfigurationAckDataBlock
+	deviceConfigurationAckDataBlock, _deviceConfigurationAckDataBlockOk := _deviceConfigurationAckDataBlockMessage.(IDeviceConfigurationAckDataBlock)
 	if !_deviceConfigurationAckDataBlockOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_deviceConfigurationAckDataBlockMessage).Name() + " to DeviceConfigurationAckDataBlock")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_deviceConfigurationAckDataBlockMessage).Name() + " to IDeviceConfigurationAckDataBlock")
 	}
 
 	// Create the instance
@@ -102,6 +102,6 @@ func DeviceConfigurationAckParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer,
 func (m DeviceConfigurationAck) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (deviceConfigurationAckDataBlock)
-	deviceConfigurationAckDataBlock := DeviceConfigurationAckDataBlock(m.deviceConfigurationAckDataBlock)
+	deviceConfigurationAckDataBlock := IDeviceConfigurationAckDataBlock(m.deviceConfigurationAckDataBlock)
 	deviceConfigurationAckDataBlock.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
index f905064..00845a8 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
@@ -27,7 +27,7 @@ import (
 type DeviceConfigurationAckDataBlock struct {
 	communicationChannelId uint8
 	sequenceCounter        uint8
-	status                 Status
+	status                 IStatus
 }
 
 // The corresponding interface
@@ -36,7 +36,7 @@ type IDeviceConfigurationAckDataBlock interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewDeviceConfigurationAckDataBlock(communicationChannelId uint8, sequenceCounter uint8, status Status) spi.Message {
+func NewDeviceConfigurationAckDataBlock(communicationChannelId uint8, sequenceCounter uint8, status IStatus) spi.Message {
 	return &DeviceConfigurationAckDataBlock{communicationChannelId: communicationChannelId, sequenceCounter: sequenceCounter, status: status}
 }
 
@@ -85,13 +85,22 @@ func (m DeviceConfigurationAckDataBlock) LengthInBytes() uint16 {
 func DeviceConfigurationAckDataBlockParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Simple Field (sequenceCounter)
-	var sequenceCounter uint8 = io.ReadUint8(8)
+	sequenceCounter, _sequenceCounterErr := io.ReadUint8(8)
+	if _sequenceCounterErr != nil {
+		return nil, errors.New("Error parsing 'sequenceCounter' field " + _sequenceCounterErr.Error())
+	}
 
 	// Enum field (status)
 	status, _statusErr := StatusParse(io)
@@ -118,6 +127,6 @@ func (m DeviceConfigurationAckDataBlock) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (sequenceCounter))
 
 	// Enum field (status)
-	status := Status(m.status)
+	status := IStatus(m.status)
 	status.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
index 62a3b25..34054c9 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
@@ -26,8 +26,8 @@ import (
 
 // The data-structure of this message
 type DeviceConfigurationRequest struct {
-	deviceConfigurationRequestDataBlock DeviceConfigurationRequestDataBlock
-	cemi                                CEMI
+	deviceConfigurationRequestDataBlock IDeviceConfigurationRequestDataBlock
+	cemi                                ICEMI
 	KNXNetIPMessage
 }
 
@@ -46,7 +46,7 @@ func (m DeviceConfigurationRequest) initialize() spi.Message {
 	return m
 }
 
-func NewDeviceConfigurationRequest(deviceConfigurationRequestDataBlock DeviceConfigurationRequestDataBlock, cemi CEMI) KNXNetIPMessageInitializer {
+func NewDeviceConfigurationRequest(deviceConfigurationRequestDataBlock IDeviceConfigurationRequestDataBlock, cemi ICEMI) KNXNetIPMessageInitializer {
 	return &DeviceConfigurationRequest{deviceConfigurationRequestDataBlock: deviceConfigurationRequestDataBlock, cemi: cemi}
 }
 
@@ -93,10 +93,10 @@ func DeviceConfigurationRequestParse(io spi.ReadBuffer, totalLength uint16) (KNX
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'deviceConfigurationRequestDataBlock'. " + _err.Error())
 	}
-	var deviceConfigurationRequestDataBlock DeviceConfigurationRequestDataBlock
-	deviceConfigurationRequestDataBlock, _deviceConfigurationRequestDataBlockOk := _deviceConfigurationRequestDataBlockMessage.(DeviceConfigurationRequestDataBlock)
+	var deviceConfigurationRequestDataBlock IDeviceConfigurationRequestDataBlock
+	deviceConfigurationRequestDataBlock, _deviceConfigurationRequestDataBlockOk := _deviceConfigurationRequestDataBlockMessage.(IDeviceConfigurationRequestDataBlock)
 	if !_deviceConfigurationRequestDataBlockOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_deviceConfigurationRequestDataBlockMessage).Name() + " to DeviceConfigurationRequestDataBlock")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_deviceConfigurationRequestDataBlockMessage).Name() + " to IDeviceConfigurationRequestDataBlock")
 	}
 
 	// Simple Field (cemi)
@@ -104,10 +104,10 @@ func DeviceConfigurationRequestParse(io spi.ReadBuffer, totalLength uint16) (KNX
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'cemi'. " + _err.Error())
 	}
-	var cemi CEMI
-	cemi, _cemiOk := _cemiMessage.(CEMI)
+	var cemi ICEMI
+	cemi, _cemiOk := _cemiMessage.(ICEMI)
 	if !_cemiOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiMessage).Name() + " to CEMI")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiMessage).Name() + " to ICEMI")
 	}
 
 	// Create the instance
@@ -117,10 +117,10 @@ func DeviceConfigurationRequestParse(io spi.ReadBuffer, totalLength uint16) (KNX
 func (m DeviceConfigurationRequest) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (deviceConfigurationRequestDataBlock)
-	deviceConfigurationRequestDataBlock := DeviceConfigurationRequestDataBlock(m.deviceConfigurationRequestDataBlock)
+	deviceConfigurationRequestDataBlock := IDeviceConfigurationRequestDataBlock(m.deviceConfigurationRequestDataBlock)
 	deviceConfigurationRequestDataBlock.Serialize(io)
 
 	// Simple Field (cemi)
-	cemi := CEMI(m.cemi)
+	cemi := ICEMI(m.cemi)
 	cemi.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
index e45a318..e936cd3 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -84,17 +85,29 @@ func (m DeviceConfigurationRequestDataBlock) LengthInBytes() uint16 {
 func DeviceConfigurationRequestDataBlockParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Simple Field (sequenceCounter)
-	var sequenceCounter uint8 = io.ReadUint8(8)
+	sequenceCounter, _sequenceCounterErr := io.ReadUint8(8)
+	if _sequenceCounterErr != nil {
+		return nil, errors.New("Error parsing 'sequenceCounter' field " + _sequenceCounterErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(8)
+		reserved, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceStatus.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceStatus.go
index e935545..e199485 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceStatus.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceStatus.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -78,7 +79,10 @@ func DeviceStatusParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(7)
+		reserved, _err := io.ReadUint8(7)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -88,7 +92,10 @@ func DeviceStatusParse(io spi.ReadBuffer) (spi.Message, error) {
 	}
 
 	// Simple Field (programMode)
-	var programMode bool = io.ReadBit()
+	programMode, _programModeErr := io.ReadBit()
+	if _programModeErr != nil {
+		return nil, errors.New("Error parsing 'programMode' field " + _programModeErr.Error())
+	}
 
 	// Create the instance
 	return NewDeviceStatus(programMode), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
index 7fe5fd1..8618d20 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
@@ -28,7 +28,7 @@ import (
 // The data-structure of this message
 type DisconnectRequest struct {
 	communicationChannelId uint8
-	hpaiControlEndpoint    HPAIControlEndpoint
+	hpaiControlEndpoint    IHPAIControlEndpoint
 	KNXNetIPMessage
 }
 
@@ -47,7 +47,7 @@ func (m DisconnectRequest) initialize() spi.Message {
 	return m
 }
 
-func NewDisconnectRequest(communicationChannelId uint8, hpaiControlEndpoint HPAIControlEndpoint) KNXNetIPMessageInitializer {
+func NewDisconnectRequest(communicationChannelId uint8, hpaiControlEndpoint IHPAIControlEndpoint) KNXNetIPMessageInitializer {
 	return &DisconnectRequest{communicationChannelId: communicationChannelId, hpaiControlEndpoint: hpaiControlEndpoint}
 }
 
@@ -93,11 +93,17 @@ func (m DisconnectRequest) LengthInBytes() uint16 {
 func DisconnectRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(8)
+		reserved, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -111,10 +117,10 @@ func DisconnectRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'hpaiControlEndpoint'. " + _err.Error())
 	}
-	var hpaiControlEndpoint HPAIControlEndpoint
-	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(HPAIControlEndpoint)
+	var hpaiControlEndpoint IHPAIControlEndpoint
+	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(IHPAIControlEndpoint)
 	if !_hpaiControlEndpointOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to HPAIControlEndpoint")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to IHPAIControlEndpoint")
 	}
 
 	// Create the instance
@@ -131,6 +137,6 @@ func (m DisconnectRequest) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, uint8(0x00))
 
 	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := HPAIControlEndpoint(m.hpaiControlEndpoint)
+	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
 	hpaiControlEndpoint.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go
index bc7165e..da0035e 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go
@@ -26,7 +26,7 @@ import (
 // The data-structure of this message
 type DisconnectResponse struct {
 	communicationChannelId uint8
-	status                 Status
+	status                 IStatus
 	KNXNetIPMessage
 }
 
@@ -45,7 +45,7 @@ func (m DisconnectResponse) initialize() spi.Message {
 	return m
 }
 
-func NewDisconnectResponse(communicationChannelId uint8, status Status) KNXNetIPMessageInitializer {
+func NewDisconnectResponse(communicationChannelId uint8, status IStatus) KNXNetIPMessageInitializer {
 	return &DisconnectResponse{communicationChannelId: communicationChannelId, status: status}
 }
 
@@ -88,7 +88,10 @@ func (m DisconnectResponse) LengthInBytes() uint16 {
 func DisconnectResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Enum field (status)
 	status, _statusErr := StatusParse(io)
@@ -107,6 +110,6 @@ func (m DisconnectResponse) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (communicationChannelId))
 
 	// Enum field (status)
-	status := Status(m.status)
+	status := IStatus(m.status)
 	status.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
index 444a2e4..31c3c75 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
@@ -26,8 +26,8 @@ import (
 
 // The data-structure of this message
 type HPAIControlEndpoint struct {
-	hostProtocolCode HostProtocolCode
-	ipAddress        IPAddress
+	hostProtocolCode IHostProtocolCode
+	ipAddress        IIPAddress
 	ipPort           uint16
 }
 
@@ -37,7 +37,7 @@ type IHPAIControlEndpoint interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewHPAIControlEndpoint(hostProtocolCode HostProtocolCode, ipAddress IPAddress, ipPort uint16) spi.Message {
+func NewHPAIControlEndpoint(hostProtocolCode IHostProtocolCode, ipAddress IIPAddress, ipPort uint16) spi.Message {
 	return &HPAIControlEndpoint{hostProtocolCode: hostProtocolCode, ipAddress: ipAddress, ipPort: ipPort}
 }
 
@@ -86,7 +86,10 @@ func (m HPAIControlEndpoint) LengthInBytes() uint16 {
 func HPAIControlEndpointParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Enum field (hostProtocolCode)
 	hostProtocolCode, _hostProtocolCodeErr := HostProtocolCodeParse(io)
@@ -99,14 +102,17 @@ func HPAIControlEndpointParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'ipAddress'. " + _err.Error())
 	}
-	var ipAddress IPAddress
-	ipAddress, _ipAddressOk := _ipAddressMessage.(IPAddress)
+	var ipAddress IIPAddress
+	ipAddress, _ipAddressOk := _ipAddressMessage.(IIPAddress)
 	if !_ipAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_ipAddressMessage).Name() + " to IPAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_ipAddressMessage).Name() + " to IIPAddress")
 	}
 
 	// Simple Field (ipPort)
-	var ipPort uint16 = io.ReadUint16(16)
+	ipPort, _ipPortErr := io.ReadUint16(16)
+	if _ipPortErr != nil {
+		return nil, errors.New("Error parsing 'ipPort' field " + _ipPortErr.Error())
+	}
 
 	// Create the instance
 	return NewHPAIControlEndpoint(hostProtocolCode, ipAddress, ipPort), nil
@@ -119,11 +125,11 @@ func (m HPAIControlEndpoint) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (structureLength))
 
 	// Enum field (hostProtocolCode)
-	hostProtocolCode := HostProtocolCode(m.hostProtocolCode)
+	hostProtocolCode := IHostProtocolCode(m.hostProtocolCode)
 	hostProtocolCode.Serialize(io)
 
 	// Simple Field (ipAddress)
-	ipAddress := IPAddress(m.ipAddress)
+	ipAddress := IIPAddress(m.ipAddress)
 	ipAddress.Serialize(io)
 
 	// Simple Field (ipPort)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
index 52aa4f8..3dc1051 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
@@ -26,8 +26,8 @@ import (
 
 // The data-structure of this message
 type HPAIDataEndpoint struct {
-	hostProtocolCode HostProtocolCode
-	ipAddress        IPAddress
+	hostProtocolCode IHostProtocolCode
+	ipAddress        IIPAddress
 	ipPort           uint16
 }
 
@@ -37,7 +37,7 @@ type IHPAIDataEndpoint interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewHPAIDataEndpoint(hostProtocolCode HostProtocolCode, ipAddress IPAddress, ipPort uint16) spi.Message {
+func NewHPAIDataEndpoint(hostProtocolCode IHostProtocolCode, ipAddress IIPAddress, ipPort uint16) spi.Message {
 	return &HPAIDataEndpoint{hostProtocolCode: hostProtocolCode, ipAddress: ipAddress, ipPort: ipPort}
 }
 
@@ -86,7 +86,10 @@ func (m HPAIDataEndpoint) LengthInBytes() uint16 {
 func HPAIDataEndpointParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Enum field (hostProtocolCode)
 	hostProtocolCode, _hostProtocolCodeErr := HostProtocolCodeParse(io)
@@ -99,14 +102,17 @@ func HPAIDataEndpointParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'ipAddress'. " + _err.Error())
 	}
-	var ipAddress IPAddress
-	ipAddress, _ipAddressOk := _ipAddressMessage.(IPAddress)
+	var ipAddress IIPAddress
+	ipAddress, _ipAddressOk := _ipAddressMessage.(IIPAddress)
 	if !_ipAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_ipAddressMessage).Name() + " to IPAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_ipAddressMessage).Name() + " to IIPAddress")
 	}
 
 	// Simple Field (ipPort)
-	var ipPort uint16 = io.ReadUint16(16)
+	ipPort, _ipPortErr := io.ReadUint16(16)
+	if _ipPortErr != nil {
+		return nil, errors.New("Error parsing 'ipPort' field " + _ipPortErr.Error())
+	}
 
 	// Create the instance
 	return NewHPAIDataEndpoint(hostProtocolCode, ipAddress, ipPort), nil
@@ -119,11 +125,11 @@ func (m HPAIDataEndpoint) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (structureLength))
 
 	// Enum field (hostProtocolCode)
-	hostProtocolCode := HostProtocolCode(m.hostProtocolCode)
+	hostProtocolCode := IHostProtocolCode(m.hostProtocolCode)
 	hostProtocolCode.Serialize(io)
 
 	// Simple Field (ipAddress)
-	ipAddress := IPAddress(m.ipAddress)
+	ipAddress := IIPAddress(m.ipAddress)
 	ipAddress.Serialize(io)
 
 	// Simple Field (ipPort)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
index 1e6a441..fb8d59f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
@@ -26,8 +26,8 @@ import (
 
 // The data-structure of this message
 type HPAIDiscoveryEndpoint struct {
-	hostProtocolCode HostProtocolCode
-	ipAddress        IPAddress
+	hostProtocolCode IHostProtocolCode
+	ipAddress        IIPAddress
 	ipPort           uint16
 }
 
@@ -37,7 +37,7 @@ type IHPAIDiscoveryEndpoint interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewHPAIDiscoveryEndpoint(hostProtocolCode HostProtocolCode, ipAddress IPAddress, ipPort uint16) spi.Message {
+func NewHPAIDiscoveryEndpoint(hostProtocolCode IHostProtocolCode, ipAddress IIPAddress, ipPort uint16) spi.Message {
 	return &HPAIDiscoveryEndpoint{hostProtocolCode: hostProtocolCode, ipAddress: ipAddress, ipPort: ipPort}
 }
 
@@ -86,7 +86,10 @@ func (m HPAIDiscoveryEndpoint) LengthInBytes() uint16 {
 func HPAIDiscoveryEndpointParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Enum field (hostProtocolCode)
 	hostProtocolCode, _hostProtocolCodeErr := HostProtocolCodeParse(io)
@@ -99,14 +102,17 @@ func HPAIDiscoveryEndpointParse(io spi.ReadBuffer) (spi.Message, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'ipAddress'. " + _err.Error())
 	}
-	var ipAddress IPAddress
-	ipAddress, _ipAddressOk := _ipAddressMessage.(IPAddress)
+	var ipAddress IIPAddress
+	ipAddress, _ipAddressOk := _ipAddressMessage.(IIPAddress)
 	if !_ipAddressOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_ipAddressMessage).Name() + " to IPAddress")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_ipAddressMessage).Name() + " to IIPAddress")
 	}
 
 	// Simple Field (ipPort)
-	var ipPort uint16 = io.ReadUint16(16)
+	ipPort, _ipPortErr := io.ReadUint16(16)
+	if _ipPortErr != nil {
+		return nil, errors.New("Error parsing 'ipPort' field " + _ipPortErr.Error())
+	}
 
 	// Create the instance
 	return NewHPAIDiscoveryEndpoint(hostProtocolCode, ipAddress, ipPort), nil
@@ -119,11 +125,11 @@ func (m HPAIDiscoveryEndpoint) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (structureLength))
 
 	// Enum field (hostProtocolCode)
-	hostProtocolCode := HostProtocolCode(m.hostProtocolCode)
+	hostProtocolCode := IHostProtocolCode(m.hostProtocolCode)
 	hostProtocolCode.Serialize(io)
 
 	// Simple Field (ipAddress)
-	ipAddress := IPAddress(m.ipAddress)
+	ipAddress := IIPAddress(m.ipAddress)
 	ipAddress.Serialize(io)
 
 	// Simple Field (ipPort)
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
index d3a6d7c..1cb1eef 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HostProtocolCode.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type HostProtocolCode uint8
 
+type IHostProtocolCode interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	HostProtocolCode_IPV4_UDP HostProtocolCode = 0x01
 	HostProtocolCode_IPV4_TCP HostProtocolCode = 0x02
@@ -37,6 +42,14 @@ func CastHostProtocolCode(structType interface{}) HostProtocolCode {
 	return castFunc(structType)
 }
 
+func (m HostProtocolCode) LengthInBits() uint16 {
+	return 8
+}
+
+func (m HostProtocolCode) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func HostProtocolCodeParse(io spi.ReadBuffer) (HostProtocolCode, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
index 897cabc..d79f2fb 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -81,7 +82,11 @@ func IPAddressParse(io spi.ReadBuffer) (spi.Message, error) {
 		addr := make([]int8, uint16(4))
 		for curItem := uint16(0); curItem < uint16(uint16(4)); curItem++ {
 
-			addr = append(addr, io.ReadInt8(8))
+			_addrVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'addr' field " + _err.Error())
+			}
+			addr = append(addr, _addrVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go
index 52abbc4..44b7472 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -81,13 +82,22 @@ func (m KNXAddress) LengthInBytes() uint16 {
 func KNXAddressParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (mainGroup)
-	var mainGroup uint8 = io.ReadUint8(4)
+	mainGroup, _mainGroupErr := io.ReadUint8(4)
+	if _mainGroupErr != nil {
+		return nil, errors.New("Error parsing 'mainGroup' field " + _mainGroupErr.Error())
+	}
 
 	// Simple Field (middleGroup)
-	var middleGroup uint8 = io.ReadUint8(4)
+	middleGroup, _middleGroupErr := io.ReadUint8(4)
+	if _middleGroupErr != nil {
+		return nil, errors.New("Error parsing 'middleGroup' field " + _middleGroupErr.Error())
+	}
 
 	// Simple Field (subGroup)
-	var subGroup uint8 = io.ReadUint8(8)
+	subGroup, _subGroupErr := io.ReadUint8(8)
+	if _subGroupErr != nil {
+		return nil, errors.New("Error parsing 'subGroup' field " + _subGroupErr.Error())
+	}
 
 	// Create the instance
 	return NewKNXAddress(mainGroup, middleGroup, subGroup), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go
index b4ed2ed..1dfe23b 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -87,10 +88,16 @@ func (m KNXGroupAddress2Level) LengthInBytes() uint16 {
 func KNXGroupAddress2LevelParse(io spi.ReadBuffer) (KNXGroupAddressInitializer, error) {
 
 	// Simple Field (mainGroup)
-	var mainGroup uint8 = io.ReadUint8(5)
+	mainGroup, _mainGroupErr := io.ReadUint8(5)
+	if _mainGroupErr != nil {
+		return nil, errors.New("Error parsing 'mainGroup' field " + _mainGroupErr.Error())
+	}
 
 	// Simple Field (subGroup)
-	var subGroup uint16 = io.ReadUint16(11)
+	subGroup, _subGroupErr := io.ReadUint16(11)
+	if _subGroupErr != nil {
+		return nil, errors.New("Error parsing 'subGroup' field " + _subGroupErr.Error())
+	}
 
 	// Create the instance
 	return NewKNXGroupAddress2Level(mainGroup, subGroup), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go
index 810109b..2e53ca0 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,13 +92,22 @@ func (m KNXGroupAddress3Level) LengthInBytes() uint16 {
 func KNXGroupAddress3LevelParse(io spi.ReadBuffer) (KNXGroupAddressInitializer, error) {
 
 	// Simple Field (mainGroup)
-	var mainGroup uint8 = io.ReadUint8(5)
+	mainGroup, _mainGroupErr := io.ReadUint8(5)
+	if _mainGroupErr != nil {
+		return nil, errors.New("Error parsing 'mainGroup' field " + _mainGroupErr.Error())
+	}
 
 	// Simple Field (middleGroup)
-	var middleGroup uint8 = io.ReadUint8(3)
+	middleGroup, _middleGroupErr := io.ReadUint8(3)
+	if _middleGroupErr != nil {
+		return nil, errors.New("Error parsing 'middleGroup' field " + _middleGroupErr.Error())
+	}
 
 	// Simple Field (subGroup)
-	var subGroup uint8 = io.ReadUint8(8)
+	subGroup, _subGroupErr := io.ReadUint8(8)
+	if _subGroupErr != nil {
+		return nil, errors.New("Error parsing 'subGroup' field " + _subGroupErr.Error())
+	}
 
 	// Create the instance
 	return NewKNXGroupAddress3Level(mainGroup, middleGroup, subGroup), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go
index 9746df2..8ea1340 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m KNXGroupAddressFreeLevel) LengthInBytes() uint16 {
 func KNXGroupAddressFreeLevelParse(io spi.ReadBuffer) (KNXGroupAddressInitializer, error) {
 
 	// Simple Field (subGroup)
-	var subGroup uint16 = io.ReadUint16(16)
+	subGroup, _subGroupErr := io.ReadUint16(16)
+	if _subGroupErr != nil {
+		return nil, errors.New("Error parsing 'subGroup' field " + _subGroupErr.Error())
+	}
 
 	// Create the instance
 	return NewKNXGroupAddressFreeLevel(subGroup), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go
index 5d2f810..2bb01eb 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go
@@ -93,19 +93,31 @@ func (m KNXNetIPMessage) LengthInBytes() uint16 {
 func KNXNetIPMessageParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _headerLengthErr := io.ReadUint8(8)
+	if _headerLengthErr != nil {
+		return nil, errors.New("Error parsing 'headerLength' field " + _headerLengthErr.Error())
+	}
 
 	// Const Field (protocolVersion)
-	var protocolVersion uint8 = io.ReadUint8(8)
+	protocolVersion, _protocolVersionErr := io.ReadUint8(8)
+	if _protocolVersionErr != nil {
+		return nil, errors.New("Error parsing 'protocolVersion' field " + _protocolVersionErr.Error())
+	}
 	if protocolVersion != KNXNetIPMessage_PROTOCOLVERSION {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(KNXNetIPMessage_PROTOCOLVERSION)) + " but got " + strconv.Itoa(int(protocolVersion)))
 	}
 
 	// Discriminator Field (msgType) (Used as input to a switch field)
-	var msgType uint16 = io.ReadUint16(16)
+	msgType, _msgTypeErr := io.ReadUint16(16)
+	if _msgTypeErr != nil {
+		return nil, errors.New("Error parsing 'msgType' field " + _msgTypeErr.Error())
+	}
 
 	// Implicit Field (totalLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var totalLength uint16 = io.ReadUint16(16)
+	totalLength, _totalLengthErr := io.ReadUint16(16)
+	if _totalLengthErr != nil {
+		return nil, errors.New("Error parsing 'totalLength' field " + _totalLengthErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer KNXNetIPMessageInitializer
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
index bc8cd1d..d9d6c9c 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxLayer.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type KnxLayer uint8
 
+type IKnxLayer interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	KnxLayer_TUNNEL_LINK_LAYER KnxLayer = 0x02
 	KnxLayer_TUNNEL_RAW        KnxLayer = 0x04
@@ -38,6 +43,14 @@ func CastKnxLayer(structType interface{}) KnxLayer {
 	return castFunc(structType)
 }
 
+func (m KnxLayer) LengthInBits() uint16 {
+	return 8
+}
+
+func (m KnxLayer) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func KnxLayerParse(io spi.ReadBuffer) (KnxLayer, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go
index 5bd174c..b17190f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m KnxNetIpCore) LengthInBytes() uint16 {
 func KnxNetIpCoreParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 
 	// Simple Field (version)
-	var version uint8 = io.ReadUint8(8)
+	version, _versionErr := io.ReadUint8(8)
+	if _versionErr != nil {
+		return nil, errors.New("Error parsing 'version' field " + _versionErr.Error())
+	}
 
 	// Create the instance
 	return NewKnxNetIpCore(version), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go
index 696269d..7c01fee 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m KnxNetIpDeviceManagement) LengthInBytes() uint16 {
 func KnxNetIpDeviceManagementParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 
 	// Simple Field (version)
-	var version uint8 = io.ReadUint8(8)
+	version, _versionErr := io.ReadUint8(8)
+	if _versionErr != nil {
+		return nil, errors.New("Error parsing 'version' field " + _versionErr.Error())
+	}
 
 	// Create the instance
 	return NewKnxNetIpDeviceManagement(version), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go
index e31e1f5..3de7278 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m KnxNetIpTunneling) LengthInBytes() uint16 {
 func KnxNetIpTunnelingParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 
 	// Simple Field (version)
-	var version uint8 = io.ReadUint8(8)
+	version, _versionErr := io.ReadUint8(8)
+	if _versionErr != nil {
+		return nil, errors.New("Error parsing 'version' field " + _versionErr.Error())
+	}
 
 	// Create the instance
 	return NewKnxNetIpTunneling(version), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go
index 7cea342..6c540ee 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m KnxNetObjectServer) LengthInBytes() uint16 {
 func KnxNetObjectServerParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 
 	// Simple Field (version)
-	var version uint8 = io.ReadUint8(8)
+	version, _versionErr := io.ReadUint8(8)
+	if _versionErr != nil {
+		return nil, errors.New("Error parsing 'version' field " + _versionErr.Error())
+	}
 
 	// Create the instance
 	return NewKnxNetObjectServer(version), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go
index 33b9816..fef2aea 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m KnxNetRemoteConfigurationAndDiagnosis) LengthInBytes() uint16 {
 func KnxNetRemoteConfigurationAndDiagnosisParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 
 	// Simple Field (version)
-	var version uint8 = io.ReadUint8(8)
+	version, _versionErr := io.ReadUint8(8)
+	if _versionErr != nil {
+		return nil, errors.New("Error parsing 'version' field " + _versionErr.Error())
+	}
 
 	// Create the instance
 	return NewKnxNetRemoteConfigurationAndDiagnosis(version), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go
index f8dbaa8..9d74086 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m KnxNetRemoteLogging) LengthInBytes() uint16 {
 func KnxNetRemoteLoggingParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 
 	// Simple Field (version)
-	var version uint8 = io.ReadUint8(8)
+	version, _versionErr := io.ReadUint8(8)
+	if _versionErr != nil {
+		return nil, errors.New("Error parsing 'version' field " + _versionErr.Error())
+	}
 
 	// Create the instance
 	return NewKnxNetRemoteLogging(version), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
index b514ca6..3f2e175 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -81,7 +82,11 @@ func MACAddressParse(io spi.ReadBuffer) (spi.Message, error) {
 		addr := make([]int8, uint16(6))
 		for curItem := uint16(0); curItem < uint16(uint16(6)); curItem++ {
 
-			addr = append(addr, io.ReadInt8(8))
+			_addrVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'addr' field " + _err.Error())
+			}
+			addr = append(addr, _addrVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go
index 86e58e3..4ec44ca 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -77,10 +78,16 @@ func (m ProjectInstallationIdentifier) LengthInBytes() uint16 {
 func ProjectInstallationIdentifierParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (projectNumber)
-	var projectNumber uint8 = io.ReadUint8(8)
+	projectNumber, _projectNumberErr := io.ReadUint8(8)
+	if _projectNumberErr != nil {
+		return nil, errors.New("Error parsing 'projectNumber' field " + _projectNumberErr.Error())
+	}
 
 	// Simple Field (installationNumber)
-	var installationNumber uint8 = io.ReadUint8(8)
+	installationNumber, _installationNumberErr := io.ReadUint8(8)
+	if _installationNumberErr != nil {
+		return nil, errors.New("Error parsing 'installationNumber' field " + _installationNumberErr.Error())
+	}
 
 	// Create the instance
 	return NewProjectInstallationIdentifier(projectNumber, installationNumber), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go
index 23b3d4d..1950aa2 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -73,7 +74,10 @@ func (m RelativeTimestamp) LengthInBytes() uint16 {
 func RelativeTimestampParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (timestamp)
-	var timestamp uint16 = io.ReadUint16(16)
+	timestamp, _timestampErr := io.ReadUint16(16)
+	if _timestampErr != nil {
+		return nil, errors.New("Error parsing 'timestamp' field " + _timestampErr.Error())
+	}
 
 	// Create the instance
 	return NewRelativeTimestamp(timestamp), nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
index 834b67a..11a2b62 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type SearchRequest struct {
-	hpaiIDiscoveryEndpoint HPAIDiscoveryEndpoint
+	hpaiIDiscoveryEndpoint IHPAIDiscoveryEndpoint
 	KNXNetIPMessage
 }
 
@@ -45,7 +45,7 @@ func (m SearchRequest) initialize() spi.Message {
 	return m
 }
 
-func NewSearchRequest(hpaiIDiscoveryEndpoint HPAIDiscoveryEndpoint) KNXNetIPMessageInitializer {
+func NewSearchRequest(hpaiIDiscoveryEndpoint IHPAIDiscoveryEndpoint) KNXNetIPMessageInitializer {
 	return &SearchRequest{hpaiIDiscoveryEndpoint: hpaiIDiscoveryEndpoint}
 }
 
@@ -89,10 +89,10 @@ func SearchRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'hpaiIDiscoveryEndpoint'. " + _err.Error())
 	}
-	var hpaiIDiscoveryEndpoint HPAIDiscoveryEndpoint
-	hpaiIDiscoveryEndpoint, _hpaiIDiscoveryEndpointOk := _hpaiIDiscoveryEndpointMessage.(HPAIDiscoveryEndpoint)
+	var hpaiIDiscoveryEndpoint IHPAIDiscoveryEndpoint
+	hpaiIDiscoveryEndpoint, _hpaiIDiscoveryEndpointOk := _hpaiIDiscoveryEndpointMessage.(IHPAIDiscoveryEndpoint)
 	if !_hpaiIDiscoveryEndpointOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiIDiscoveryEndpointMessage).Name() + " to HPAIDiscoveryEndpoint")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiIDiscoveryEndpointMessage).Name() + " to IHPAIDiscoveryEndpoint")
 	}
 
 	// Create the instance
@@ -102,6 +102,6 @@ func SearchRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 func (m SearchRequest) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (hpaiIDiscoveryEndpoint)
-	hpaiIDiscoveryEndpoint := HPAIDiscoveryEndpoint(m.hpaiIDiscoveryEndpoint)
+	hpaiIDiscoveryEndpoint := IHPAIDiscoveryEndpoint(m.hpaiIDiscoveryEndpoint)
 	hpaiIDiscoveryEndpoint.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
index af5dd30..bb4a870 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
@@ -26,9 +26,9 @@ import (
 
 // The data-structure of this message
 type SearchResponse struct {
-	hpaiControlEndpoint HPAIControlEndpoint
-	dibDeviceInfo       DIBDeviceInfo
-	dibSuppSvcFamilies  DIBSuppSvcFamilies
+	hpaiControlEndpoint IHPAIControlEndpoint
+	dibDeviceInfo       IDIBDeviceInfo
+	dibSuppSvcFamilies  IDIBSuppSvcFamilies
 	KNXNetIPMessage
 }
 
@@ -47,7 +47,7 @@ func (m SearchResponse) initialize() spi.Message {
 	return m
 }
 
-func NewSearchResponse(hpaiControlEndpoint HPAIControlEndpoint, dibDeviceInfo DIBDeviceInfo, dibSuppSvcFamilies DIBSuppSvcFamilies) KNXNetIPMessageInitializer {
+func NewSearchResponse(hpaiControlEndpoint IHPAIControlEndpoint, dibDeviceInfo IDIBDeviceInfo, dibSuppSvcFamilies IDIBSuppSvcFamilies) KNXNetIPMessageInitializer {
 	return &SearchResponse{hpaiControlEndpoint: hpaiControlEndpoint, dibDeviceInfo: dibDeviceInfo, dibSuppSvcFamilies: dibSuppSvcFamilies}
 }
 
@@ -97,10 +97,10 @@ func SearchResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'hpaiControlEndpoint'. " + _err.Error())
 	}
-	var hpaiControlEndpoint HPAIControlEndpoint
-	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(HPAIControlEndpoint)
+	var hpaiControlEndpoint IHPAIControlEndpoint
+	hpaiControlEndpoint, _hpaiControlEndpointOk := _hpaiControlEndpointMessage.(IHPAIControlEndpoint)
 	if !_hpaiControlEndpointOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to HPAIControlEndpoint")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_hpaiControlEndpointMessage).Name() + " to IHPAIControlEndpoint")
 	}
 
 	// Simple Field (dibDeviceInfo)
@@ -108,10 +108,10 @@ func SearchResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'dibDeviceInfo'. " + _err.Error())
 	}
-	var dibDeviceInfo DIBDeviceInfo
-	dibDeviceInfo, _dibDeviceInfoOk := _dibDeviceInfoMessage.(DIBDeviceInfo)
+	var dibDeviceInfo IDIBDeviceInfo
+	dibDeviceInfo, _dibDeviceInfoOk := _dibDeviceInfoMessage.(IDIBDeviceInfo)
 	if !_dibDeviceInfoOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibDeviceInfoMessage).Name() + " to DIBDeviceInfo")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibDeviceInfoMessage).Name() + " to IDIBDeviceInfo")
 	}
 
 	// Simple Field (dibSuppSvcFamilies)
@@ -119,10 +119,10 @@ func SearchResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'dibSuppSvcFamilies'. " + _err.Error())
 	}
-	var dibSuppSvcFamilies DIBSuppSvcFamilies
-	dibSuppSvcFamilies, _dibSuppSvcFamiliesOk := _dibSuppSvcFamiliesMessage.(DIBSuppSvcFamilies)
+	var dibSuppSvcFamilies IDIBSuppSvcFamilies
+	dibSuppSvcFamilies, _dibSuppSvcFamiliesOk := _dibSuppSvcFamiliesMessage.(IDIBSuppSvcFamilies)
 	if !_dibSuppSvcFamiliesOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibSuppSvcFamiliesMessage).Name() + " to DIBSuppSvcFamilies")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_dibSuppSvcFamiliesMessage).Name() + " to IDIBSuppSvcFamilies")
 	}
 
 	// Create the instance
@@ -132,14 +132,14 @@ func SearchResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error)
 func (m SearchResponse) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := HPAIControlEndpoint(m.hpaiControlEndpoint)
+	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
 	hpaiControlEndpoint.Serialize(io)
 
 	// Simple Field (dibDeviceInfo)
-	dibDeviceInfo := DIBDeviceInfo(m.dibDeviceInfo)
+	dibDeviceInfo := IDIBDeviceInfo(m.dibDeviceInfo)
 	dibDeviceInfo.Serialize(io)
 
 	// Simple Field (dibSuppSvcFamilies)
-	dibSuppSvcFamilies := DIBSuppSvcFamilies(m.dibSuppSvcFamilies)
+	dibSuppSvcFamilies := IDIBSuppSvcFamilies(m.dibSuppSvcFamilies)
 	dibSuppSvcFamilies.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go
index db8ee0c..f7e8f47 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go
@@ -80,7 +80,10 @@ func (m ServiceId) LengthInBytes() uint16 {
 func ServiceIdParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (serviceType) (Used as input to a switch field)
-	var serviceType uint8 = io.ReadUint8(8)
+	serviceType, _serviceTypeErr := io.ReadUint8(8)
+	if _serviceTypeErr != nil {
+		return nil, errors.New("Error parsing 'serviceType' field " + _serviceTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer ServiceIdInitializer
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
index 70da347..b6e5077 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/Status.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type Status uint8
 
+type IStatus interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	Status_NO_ERROR                        Status = 0x00
 	Status_PROTOCOL_TYPE_NOT_SUPPORTED     Status = 0x01
@@ -47,6 +52,14 @@ func CastStatus(structType interface{}) Status {
 	return castFunc(structType)
 }
 
+func (m Status) LengthInBits() uint16 {
+	return 8
+}
+
+func (m Status) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func StatusParse(io spi.ReadBuffer) (Status, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TPCI.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TPCI.go
index 94a3394..9c32560 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TPCI.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TPCI.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type TPCI uint8
 
+type ITPCI interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	TPCI_UNNUMBERED_DATA_PACKET TPCI = 0x0
 	TPCI_UNNUMBERED             TPCI = 0x1
@@ -39,6 +44,14 @@ func CastTPCI(structType interface{}) TPCI {
 	return castFunc(structType)
 }
 
+func (m TPCI) LengthInBits() uint16 {
+	return 2
+}
+
+func (m TPCI) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func TPCIParse(io spi.ReadBuffer) (TPCI, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
index f4821d8..abf1ab1 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
@@ -26,8 +26,8 @@ import (
 
 // The data-structure of this message
 type TunnelingRequest struct {
-	tunnelingRequestDataBlock TunnelingRequestDataBlock
-	cemi                      CEMI
+	tunnelingRequestDataBlock ITunnelingRequestDataBlock
+	cemi                      ICEMI
 	KNXNetIPMessage
 }
 
@@ -46,7 +46,7 @@ func (m TunnelingRequest) initialize() spi.Message {
 	return m
 }
 
-func NewTunnelingRequest(tunnelingRequestDataBlock TunnelingRequestDataBlock, cemi CEMI) KNXNetIPMessageInitializer {
+func NewTunnelingRequest(tunnelingRequestDataBlock ITunnelingRequestDataBlock, cemi ICEMI) KNXNetIPMessageInitializer {
 	return &TunnelingRequest{tunnelingRequestDataBlock: tunnelingRequestDataBlock, cemi: cemi}
 }
 
@@ -93,10 +93,10 @@ func TunnelingRequestParse(io spi.ReadBuffer, totalLength uint16) (KNXNetIPMessa
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'tunnelingRequestDataBlock'. " + _err.Error())
 	}
-	var tunnelingRequestDataBlock TunnelingRequestDataBlock
-	tunnelingRequestDataBlock, _tunnelingRequestDataBlockOk := _tunnelingRequestDataBlockMessage.(TunnelingRequestDataBlock)
+	var tunnelingRequestDataBlock ITunnelingRequestDataBlock
+	tunnelingRequestDataBlock, _tunnelingRequestDataBlockOk := _tunnelingRequestDataBlockMessage.(ITunnelingRequestDataBlock)
 	if !_tunnelingRequestDataBlockOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_tunnelingRequestDataBlockMessage).Name() + " to TunnelingRequestDataBlock")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_tunnelingRequestDataBlockMessage).Name() + " to ITunnelingRequestDataBlock")
 	}
 
 	// Simple Field (cemi)
@@ -104,10 +104,10 @@ func TunnelingRequestParse(io spi.ReadBuffer, totalLength uint16) (KNXNetIPMessa
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'cemi'. " + _err.Error())
 	}
-	var cemi CEMI
-	cemi, _cemiOk := _cemiMessage.(CEMI)
+	var cemi ICEMI
+	cemi, _cemiOk := _cemiMessage.(ICEMI)
 	if !_cemiOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiMessage).Name() + " to CEMI")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_cemiMessage).Name() + " to ICEMI")
 	}
 
 	// Create the instance
@@ -117,10 +117,10 @@ func TunnelingRequestParse(io spi.ReadBuffer, totalLength uint16) (KNXNetIPMessa
 func (m TunnelingRequest) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (tunnelingRequestDataBlock)
-	tunnelingRequestDataBlock := TunnelingRequestDataBlock(m.tunnelingRequestDataBlock)
+	tunnelingRequestDataBlock := ITunnelingRequestDataBlock(m.tunnelingRequestDataBlock)
 	tunnelingRequestDataBlock.Serialize(io)
 
 	// Simple Field (cemi)
-	cemi := CEMI(m.cemi)
+	cemi := ICEMI(m.cemi)
 	cemi.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
index d76dc27..5324c76 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -84,17 +85,29 @@ func (m TunnelingRequestDataBlock) LengthInBytes() uint16 {
 func TunnelingRequestDataBlockParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Simple Field (sequenceCounter)
-	var sequenceCounter uint8 = io.ReadUint8(8)
+	sequenceCounter, _sequenceCounterErr := io.ReadUint8(8)
+	if _sequenceCounterErr != nil {
+		return nil, errors.New("Error parsing 'sequenceCounter' field " + _sequenceCounterErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(8)
+		reserved, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
index eb2e117..faa4165 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type TunnelingResponse struct {
-	tunnelingResponseDataBlock TunnelingResponseDataBlock
+	tunnelingResponseDataBlock ITunnelingResponseDataBlock
 	KNXNetIPMessage
 }
 
@@ -45,7 +45,7 @@ func (m TunnelingResponse) initialize() spi.Message {
 	return m
 }
 
-func NewTunnelingResponse(tunnelingResponseDataBlock TunnelingResponseDataBlock) KNXNetIPMessageInitializer {
+func NewTunnelingResponse(tunnelingResponseDataBlock ITunnelingResponseDataBlock) KNXNetIPMessageInitializer {
 	return &TunnelingResponse{tunnelingResponseDataBlock: tunnelingResponseDataBlock}
 }
 
@@ -89,10 +89,10 @@ func TunnelingResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'tunnelingResponseDataBlock'. " + _err.Error())
 	}
-	var tunnelingResponseDataBlock TunnelingResponseDataBlock
-	tunnelingResponseDataBlock, _tunnelingResponseDataBlockOk := _tunnelingResponseDataBlockMessage.(TunnelingResponseDataBlock)
+	var tunnelingResponseDataBlock ITunnelingResponseDataBlock
+	tunnelingResponseDataBlock, _tunnelingResponseDataBlockOk := _tunnelingResponseDataBlockMessage.(ITunnelingResponseDataBlock)
 	if !_tunnelingResponseDataBlockOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_tunnelingResponseDataBlockMessage).Name() + " to TunnelingResponseDataBlock")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_tunnelingResponseDataBlockMessage).Name() + " to ITunnelingResponseDataBlock")
 	}
 
 	// Create the instance
@@ -102,6 +102,6 @@ func TunnelingResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 func (m TunnelingResponse) Serialize(io spi.WriteBuffer) {
 
 	// Simple Field (tunnelingResponseDataBlock)
-	tunnelingResponseDataBlock := TunnelingResponseDataBlock(m.tunnelingResponseDataBlock)
+	tunnelingResponseDataBlock := ITunnelingResponseDataBlock(m.tunnelingResponseDataBlock)
 	tunnelingResponseDataBlock.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
index 7b1a6c0..48af461 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
@@ -27,7 +27,7 @@ import (
 type TunnelingResponseDataBlock struct {
 	communicationChannelId uint8
 	sequenceCounter        uint8
-	status                 Status
+	status                 IStatus
 }
 
 // The corresponding interface
@@ -36,7 +36,7 @@ type ITunnelingResponseDataBlock interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewTunnelingResponseDataBlock(communicationChannelId uint8, sequenceCounter uint8, status Status) spi.Message {
+func NewTunnelingResponseDataBlock(communicationChannelId uint8, sequenceCounter uint8, status IStatus) spi.Message {
 	return &TunnelingResponseDataBlock{communicationChannelId: communicationChannelId, sequenceCounter: sequenceCounter, status: status}
 }
 
@@ -85,13 +85,22 @@ func (m TunnelingResponseDataBlock) LengthInBytes() uint16 {
 func TunnelingResponseDataBlockParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _structureLengthErr := io.ReadUint8(8)
+	if _structureLengthErr != nil {
+		return nil, errors.New("Error parsing 'structureLength' field " + _structureLengthErr.Error())
+	}
 
 	// Simple Field (communicationChannelId)
-	var communicationChannelId uint8 = io.ReadUint8(8)
+	communicationChannelId, _communicationChannelIdErr := io.ReadUint8(8)
+	if _communicationChannelIdErr != nil {
+		return nil, errors.New("Error parsing 'communicationChannelId' field " + _communicationChannelIdErr.Error())
+	}
 
 	// Simple Field (sequenceCounter)
-	var sequenceCounter uint8 = io.ReadUint8(8)
+	sequenceCounter, _sequenceCounterErr := io.ReadUint8(8)
+	if _sequenceCounterErr != nil {
+		return nil, errors.New("Error parsing 'sequenceCounter' field " + _sequenceCounterErr.Error())
+	}
 
 	// Enum field (status)
 	status, _statusErr := StatusParse(io)
@@ -118,6 +127,6 @@ func (m TunnelingResponseDataBlock) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (sequenceCounter))
 
 	// Enum field (status)
-	status := Status(m.status)
+	status := IStatus(m.status)
 	status.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
index 6b42613..6bf350a 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,7 +92,11 @@ func UnknownMessageParse(io spi.ReadBuffer, totalLength uint16) (KNXNetIPMessage
 		unknownData := make([]int8, uint16(totalLength)-uint16(uint16(6)))
 		for curItem := uint16(0); curItem < uint16(uint16(totalLength)-uint16(uint16(6))); curItem++ {
 
-			unknownData = append(unknownData, io.ReadInt8(8))
+			_unknownDataVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'unknownData' field " + _err.Error())
+			}
+			unknownData = append(unknownData, _unknownDataVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go
index 21692f1..f15f731 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go
@@ -77,7 +77,10 @@ func (m ModbusConstants) LengthInBytes() uint16 {
 func ModbusConstantsParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Const Field (modbusTcpDefaultPort)
-	var modbusTcpDefaultPort uint16 = io.ReadUint16(16)
+	modbusTcpDefaultPort, _modbusTcpDefaultPortErr := io.ReadUint16(16)
+	if _modbusTcpDefaultPortErr != nil {
+		return nil, errors.New("Error parsing 'modbusTcpDefaultPort' field " + _modbusTcpDefaultPortErr.Error())
+	}
 	if modbusTcpDefaultPort != ModbusConstants_MODBUSTCPDEFAULTPORT {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(ModbusConstants_MODBUSTCPDEFAULTPORT)) + " but got " + strconv.Itoa(int(modbusTcpDefaultPort)))
 	}
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
index 5c272e3..d00f104 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusDataType.go
@@ -22,6 +22,12 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type ModbusDataType uint8
 
+type IModbusDataType interface {
+	spi.Message
+	DataTypeSize() uint8
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	ModbusDataType_NULL           ModbusDataType = 00
 	ModbusDataType_BOOL           ModbusDataType = 01
@@ -184,6 +190,14 @@ func CastModbusDataType(structType interface{}) ModbusDataType {
 	return castFunc(structType)
 }
 
+func (m ModbusDataType) LengthInBits() uint16 {
+	return 8
+}
+
+func (m ModbusDataType) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func ModbusDataTypeParse(io spi.ReadBuffer) (ModbusDataType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go
index 95ac0b2..df3c2c8 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go
@@ -93,10 +93,16 @@ func (m ModbusPDU) LengthInBytes() uint16 {
 func ModbusPDUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 
 	// Discriminator Field (errorFlag) (Used as input to a switch field)
-	var errorFlag bool = io.ReadBit()
+	errorFlag, _errorFlagErr := io.ReadBit()
+	if _errorFlagErr != nil {
+		return nil, errors.New("Error parsing 'errorFlag' field " + _errorFlagErr.Error())
+	}
 
 	// Discriminator Field (functionFlag) (Used as input to a switch field)
-	var functionFlag uint8 = io.ReadUint8(7)
+	functionFlag, _functionFlagErr := io.ReadUint8(7)
+	if _functionFlagErr != nil {
+		return nil, errors.New("Error parsing 'functionFlag' field " + _functionFlagErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer ModbusPDUInitializer
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go
index 6b900dd..0eba78c 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUDiagnosticRequest) LengthInBytes() uint16 {
 func ModbusPDUDiagnosticRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (status)
-	var status uint16 = io.ReadUint16(16)
+	status, _statusErr := io.ReadUint16(16)
+	if _statusErr != nil {
+		return nil, errors.New("Error parsing 'status' field " + _statusErr.Error())
+	}
 
 	// Simple Field (eventCount)
-	var eventCount uint16 = io.ReadUint16(16)
+	eventCount, _eventCountErr := io.ReadUint16(16)
+	if _eventCountErr != nil {
+		return nil, errors.New("Error parsing 'eventCount' field " + _eventCountErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUDiagnosticRequest(status, eventCount), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go
index 83e84de..d4d9983 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,7 +92,10 @@ func (m ModbusPDUError) LengthInBytes() uint16 {
 func ModbusPDUErrorParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (exceptionCode)
-	var exceptionCode uint8 = io.ReadUint8(8)
+	exceptionCode, _exceptionCodeErr := io.ReadUint8(8)
+	if _exceptionCodeErr != nil {
+		return nil, errors.New("Error parsing 'exceptionCode' field " + _exceptionCodeErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUError(exceptionCode), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
index a970b61..146fa17 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -108,16 +109,28 @@ func (m ModbusPDUGetComEventLogResponse) LengthInBytes() uint16 {
 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Simple Field (status)
-	var status uint16 = io.ReadUint16(16)
+	status, _statusErr := io.ReadUint16(16)
+	if _statusErr != nil {
+		return nil, errors.New("Error parsing 'status' field " + _statusErr.Error())
+	}
 
 	// Simple Field (eventCount)
-	var eventCount uint16 = io.ReadUint16(16)
+	eventCount, _eventCountErr := io.ReadUint16(16)
+	if _eventCountErr != nil {
+		return nil, errors.New("Error parsing 'eventCount' field " + _eventCountErr.Error())
+	}
 
 	// Simple Field (messageCount)
-	var messageCount uint16 = io.ReadUint16(16)
+	messageCount, _messageCountErr := io.ReadUint16(16)
+	if _messageCountErr != nil {
+		return nil, errors.New("Error parsing 'messageCount' field " + _messageCountErr.Error())
+	}
 
 	// Array field (events)
 	var events []int8
@@ -126,7 +139,11 @@ func ModbusPDUGetComEventLogResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 		events := make([]int8, uint16(byteCount)-uint16(uint16(6)))
 		for curItem := uint16(0); curItem < uint16(uint16(byteCount)-uint16(uint16(6))); curItem++ {
 
-			events = append(events, io.ReadInt8(8))
+			_eventsVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'events' field " + _err.Error())
+			}
+			events = append(events, _eventsVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go
index 4d41a3e..a304f89 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -99,13 +100,22 @@ func (m ModbusPDUMaskWriteHoldingRegisterRequest) LengthInBytes() uint16 {
 func ModbusPDUMaskWriteHoldingRegisterRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (referenceAddress)
-	var referenceAddress uint16 = io.ReadUint16(16)
+	referenceAddress, _referenceAddressErr := io.ReadUint16(16)
+	if _referenceAddressErr != nil {
+		return nil, errors.New("Error parsing 'referenceAddress' field " + _referenceAddressErr.Error())
+	}
 
 	// Simple Field (andMask)
-	var andMask uint16 = io.ReadUint16(16)
+	andMask, _andMaskErr := io.ReadUint16(16)
+	if _andMaskErr != nil {
+		return nil, errors.New("Error parsing 'andMask' field " + _andMaskErr.Error())
+	}
 
 	// Simple Field (orMask)
-	var orMask uint16 = io.ReadUint16(16)
+	orMask, _orMaskErr := io.ReadUint16(16)
+	if _orMaskErr != nil {
+		return nil, errors.New("Error parsing 'orMask' field " + _orMaskErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUMaskWriteHoldingRegisterRequest(referenceAddress, andMask, orMask), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go
index fde8f8c..ac9fe49 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -99,13 +100,22 @@ func (m ModbusPDUMaskWriteHoldingRegisterResponse) LengthInBytes() uint16 {
 func ModbusPDUMaskWriteHoldingRegisterResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (referenceAddress)
-	var referenceAddress uint16 = io.ReadUint16(16)
+	referenceAddress, _referenceAddressErr := io.ReadUint16(16)
+	if _referenceAddressErr != nil {
+		return nil, errors.New("Error parsing 'referenceAddress' field " + _referenceAddressErr.Error())
+	}
 
 	// Simple Field (andMask)
-	var andMask uint16 = io.ReadUint16(16)
+	andMask, _andMaskErr := io.ReadUint16(16)
+	if _andMaskErr != nil {
+		return nil, errors.New("Error parsing 'andMask' field " + _andMaskErr.Error())
+	}
 
 	// Simple Field (orMask)
-	var orMask uint16 = io.ReadUint16(16)
+	orMask, _orMaskErr := io.ReadUint16(16)
+	if _orMaskErr != nil {
+		return nil, errors.New("Error parsing 'orMask' field " + _orMaskErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUMaskWriteHoldingRegisterResponse(referenceAddress, andMask, orMask), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go
index 73bb940..36cfa7c 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUReadCoilsRequest) LengthInBytes() uint16 {
 func ModbusPDUReadCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUReadCoilsRequest(startingAddress, quantity), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
index 3d06a22..256bf0a 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -96,7 +97,10 @@ func (m ModbusPDUReadCoilsResponse) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -105,7 +109,11 @@ func ModbusPDUReadCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, e
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go
index 4432b88..fe42bbd 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUReadDiscreteInputsRequest) LengthInBytes() uint16 {
 func ModbusPDUReadDiscreteInputsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUReadDiscreteInputsRequest(startingAddress, quantity), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
index 4f301df..d42da5e 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -96,7 +97,10 @@ func (m ModbusPDUReadDiscreteInputsResponse) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -105,7 +109,11 @@ func ModbusPDUReadDiscreteInputsResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go
index 59e0a21..491dc2b 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,7 +92,10 @@ func (m ModbusPDUReadExceptionStatusResponse) LengthInBytes() uint16 {
 func ModbusPDUReadExceptionStatusResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (value)
-	var value uint8 = io.ReadUint8(8)
+	value, _valueErr := io.ReadUint8(8)
+	if _valueErr != nil {
+		return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUReadExceptionStatusResponse(value), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go
index 40c3e33..ba6767f 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,7 +92,10 @@ func (m ModbusPDUReadFifoQueueRequest) LengthInBytes() uint16 {
 func ModbusPDUReadFifoQueueRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (fifoPointerAddress)
-	var fifoPointerAddress uint16 = io.ReadUint16(16)
+	fifoPointerAddress, _fifoPointerAddressErr := io.ReadUint16(16)
+	if _fifoPointerAddressErr != nil {
+		return nil, errors.New("Error parsing 'fifoPointerAddress' field " + _fifoPointerAddressErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUReadFifoQueueRequest(fifoPointerAddress), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
index d673ee0..218be8e 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -99,10 +100,16 @@ func (m ModbusPDUReadFifoQueueResponse) LengthInBytes() uint16 {
 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)
+	_, _byteCountErr := io.ReadUint16(16)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// 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)
+	fifoCount, _fifoCountErr := io.ReadUint16(16)
+	if _fifoCountErr != nil {
+		return nil, errors.New("Error parsing 'fifoCount' field " + _fifoCountErr.Error())
+	}
 
 	// Array field (fifoValue)
 	var fifoValue []uint16
@@ -111,7 +118,11 @@ func ModbusPDUReadFifoQueueResponseParse(io spi.ReadBuffer) (ModbusPDUInitialize
 		fifoValue := make([]uint16, fifoCount)
 		for curItem := uint16(0); curItem < uint16(fifoCount); curItem++ {
 
-			fifoValue = append(fifoValue, io.ReadUint16(16))
+			_fifoValueVal, _err := io.ReadUint16(16)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'fifoValue' field " + _err.Error())
+			}
+			fifoValue = append(fifoValue, _fifoValueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
index 4452cde..2ca0307 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type ModbusPDUReadFileRecordRequest struct {
-	items []ModbusPDUReadFileRecordRequestItem
+	items []IModbusPDUReadFileRecordRequestItem
 	ModbusPDU
 }
 
@@ -53,7 +53,7 @@ func (m ModbusPDUReadFileRecordRequest) initialize() spi.Message {
 	return m
 }
 
-func NewModbusPDUReadFileRecordRequest(items []ModbusPDUReadFileRecordRequestItem) ModbusPDUInitializer {
+func NewModbusPDUReadFileRecordRequest(items []IModbusPDUReadFileRecordRequestItem) ModbusPDUInitializer {
 	return &ModbusPDUReadFileRecordRequest{items: items}
 }
 
@@ -100,10 +100,13 @@ func (m ModbusPDUReadFileRecordRequest) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (items)
-	var items []ModbusPDUReadFileRecordRequestItem
+	var items []IModbusPDUReadFileRecordRequestItem
 	// Length array
 	_itemsLength := byteCount
 	_itemsEndPos := io.GetPos() + uint16(_itemsLength)
@@ -112,8 +115,8 @@ func ModbusPDUReadFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 		if _err != nil {
 			return nil, errors.New("Error parsing 'items' field " + _err.Error())
 		}
-		var _item ModbusPDUReadFileRecordRequestItem
-		_item, _ok := _message.(ModbusPDUReadFileRecordRequestItem)
+		var _item IModbusPDUReadFileRecordRequestItem
+		_item, _ok := _message.(IModbusPDUReadFileRecordRequestItem)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUReadFileRecordRequestItem")
 		}
@@ -125,7 +128,7 @@ func ModbusPDUReadFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 }
 
 func (m ModbusPDUReadFileRecordRequest) Serialize(io spi.WriteBuffer) {
-	itemsArraySizeInBytes := func(items []ModbusPDUReadFileRecordRequestItem) uint32 {
+	itemsArraySizeInBytes := func(items []IModbusPDUReadFileRecordRequestItem) uint32 {
 		var sizeInBytes uint32 = 0
 		for _, v := range items {
 			sizeInBytes += uint32(v.LengthInBytes())
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go
index af720a6..8bb5727 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -85,16 +86,28 @@ func (m ModbusPDUReadFileRecordRequestItem) LengthInBytes() uint16 {
 func ModbusPDUReadFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (referenceType)
-	var referenceType uint8 = io.ReadUint8(8)
+	referenceType, _referenceTypeErr := io.ReadUint8(8)
+	if _referenceTypeErr != nil {
+		return nil, errors.New("Error parsing 'referenceType' field " + _referenceTypeErr.Error())
+	}
 
 	// Simple Field (fileNumber)
-	var fileNumber uint16 = io.ReadUint16(16)
+	fileNumber, _fileNumberErr := io.ReadUint16(16)
+	if _fileNumberErr != nil {
+		return nil, errors.New("Error parsing 'fileNumber' field " + _fileNumberErr.Error())
+	}
 
 	// Simple Field (recordNumber)
-	var recordNumber uint16 = io.ReadUint16(16)
+	recordNumber, _recordNumberErr := io.ReadUint16(16)
+	if _recordNumberErr != nil {
+		return nil, errors.New("Error parsing 'recordNumber' field " + _recordNumberErr.Error())
+	}
 
 	// Simple Field (recordLength)
-	var recordLength uint16 = io.ReadUint16(16)
+	recordLength, _recordLengthErr := io.ReadUint16(16)
+	if _recordLengthErr != nil {
+		return nil, errors.New("Error parsing 'recordLength' field " + _recordLengthErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUReadFileRecordRequestItem(referenceType, fileNumber, recordNumber, recordLength), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
index 9957b18..2c3d71c 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type ModbusPDUReadFileRecordResponse struct {
-	items []ModbusPDUReadFileRecordResponseItem
+	items []IModbusPDUReadFileRecordResponseItem
 	ModbusPDU
 }
 
@@ -53,7 +53,7 @@ func (m ModbusPDUReadFileRecordResponse) initialize() spi.Message {
 	return m
 }
 
-func NewModbusPDUReadFileRecordResponse(items []ModbusPDUReadFileRecordResponseItem) ModbusPDUInitializer {
+func NewModbusPDUReadFileRecordResponse(items []IModbusPDUReadFileRecordResponseItem) ModbusPDUInitializer {
 	return &ModbusPDUReadFileRecordResponse{items: items}
 }
 
@@ -100,10 +100,13 @@ func (m ModbusPDUReadFileRecordResponse) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (items)
-	var items []ModbusPDUReadFileRecordResponseItem
+	var items []IModbusPDUReadFileRecordResponseItem
 	// Length array
 	_itemsLength := byteCount
 	_itemsEndPos := io.GetPos() + uint16(_itemsLength)
@@ -112,8 +115,8 @@ func ModbusPDUReadFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 		if _err != nil {
 			return nil, errors.New("Error parsing 'items' field " + _err.Error())
 		}
-		var _item ModbusPDUReadFileRecordResponseItem
-		_item, _ok := _message.(ModbusPDUReadFileRecordResponseItem)
+		var _item IModbusPDUReadFileRecordResponseItem
+		_item, _ok := _message.(IModbusPDUReadFileRecordResponseItem)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUReadFileRecordResponseItem")
 		}
@@ -125,7 +128,7 @@ func ModbusPDUReadFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 func (m ModbusPDUReadFileRecordResponse) Serialize(io spi.WriteBuffer) {
-	itemsArraySizeInBytes := func(items []ModbusPDUReadFileRecordResponseItem) uint32 {
+	itemsArraySizeInBytes := func(items []IModbusPDUReadFileRecordResponseItem) uint32 {
 		var sizeInBytes uint32 = 0
 		for _, v := range items {
 			sizeInBytes += uint32(v.LengthInBytes())
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
index 67b284c..78582c4 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -82,10 +83,16 @@ func (m ModbusPDUReadFileRecordResponseItem) LengthInBytes() 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)
+	dataLength, _dataLengthErr := io.ReadUint8(8)
+	if _dataLengthErr != nil {
+		return nil, errors.New("Error parsing 'dataLength' field " + _dataLengthErr.Error())
+	}
 
 	// Simple Field (referenceType)
-	var referenceType uint8 = io.ReadUint8(8)
+	referenceType, _referenceTypeErr := io.ReadUint8(8)
+	if _referenceTypeErr != nil {
+		return nil, errors.New("Error parsing 'referenceType' field " + _referenceTypeErr.Error())
+	}
 
 	// Array field (data)
 	var data []int8
@@ -93,7 +100,11 @@ func ModbusPDUReadFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message, e
 	_dataLength := uint16(dataLength) - uint16(uint16(1))
 	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
-		data = append(data, io.ReadInt8(8))
+		_dataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'data' field " + _err.Error())
+		}
+		data = append(data, _dataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go
index 4bbaea4..285ff5e 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUReadHoldingRegistersRequest) LengthInBytes() uint16 {
 func ModbusPDUReadHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUReadHoldingRegistersRequest(startingAddress, quantity), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
index 8393b7a..7954bef 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -96,7 +97,10 @@ func (m ModbusPDUReadHoldingRegistersResponse) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -105,7 +109,11 @@ func ModbusPDUReadHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIni
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go
index ab02c71..00382f0 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUReadInputRegistersRequest) LengthInBytes() uint16 {
 func ModbusPDUReadInputRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUReadInputRegistersRequest(startingAddress, quantity), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
index 86d2530..f8b4711 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -96,7 +97,10 @@ func (m ModbusPDUReadInputRegistersResponse) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -105,7 +109,11 @@ func ModbusPDUReadInputRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
index 4da8eb3..b2b78e8 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -112,19 +113,34 @@ func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) LengthInBytes() uint1
 func ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (readStartingAddress)
-	var readStartingAddress uint16 = io.ReadUint16(16)
+	readStartingAddress, _readStartingAddressErr := io.ReadUint16(16)
+	if _readStartingAddressErr != nil {
+		return nil, errors.New("Error parsing 'readStartingAddress' field " + _readStartingAddressErr.Error())
+	}
 
 	// Simple Field (readQuantity)
-	var readQuantity uint16 = io.ReadUint16(16)
+	readQuantity, _readQuantityErr := io.ReadUint16(16)
+	if _readQuantityErr != nil {
+		return nil, errors.New("Error parsing 'readQuantity' field " + _readQuantityErr.Error())
+	}
 
 	// Simple Field (writeStartingAddress)
-	var writeStartingAddress uint16 = io.ReadUint16(16)
+	writeStartingAddress, _writeStartingAddressErr := io.ReadUint16(16)
+	if _writeStartingAddressErr != nil {
+		return nil, errors.New("Error parsing 'writeStartingAddress' field " + _writeStartingAddressErr.Error())
+	}
 
 	// Simple Field (writeQuantity)
-	var writeQuantity uint16 = io.ReadUint16(16)
+	writeQuantity, _writeQuantityErr := io.ReadUint16(16)
+	if _writeQuantityErr != nil {
+		return nil, errors.New("Error parsing 'writeQuantity' field " + _writeQuantityErr.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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -133,7 +149,11 @@ func ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
index 83cd934..687af9e 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -96,7 +97,10 @@ func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) LengthInBytes() uint
 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -105,7 +109,11 @@ func ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer)
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
index a84ed22..0e6e2c2 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -96,7 +97,10 @@ func (m ModbusPDUReportServerIdResponse) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -105,7 +109,11 @@ func ModbusPDUReportServerIdResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
index 9b0de26..6bbc593 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type ModbusPDUWriteFileRecordRequest struct {
-	items []ModbusPDUWriteFileRecordRequestItem
+	items []IModbusPDUWriteFileRecordRequestItem
 	ModbusPDU
 }
 
@@ -53,7 +53,7 @@ func (m ModbusPDUWriteFileRecordRequest) initialize() spi.Message {
 	return m
 }
 
-func NewModbusPDUWriteFileRecordRequest(items []ModbusPDUWriteFileRecordRequestItem) ModbusPDUInitializer {
+func NewModbusPDUWriteFileRecordRequest(items []IModbusPDUWriteFileRecordRequestItem) ModbusPDUInitializer {
 	return &ModbusPDUWriteFileRecordRequest{items: items}
 }
 
@@ -100,10 +100,13 @@ func (m ModbusPDUWriteFileRecordRequest) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (items)
-	var items []ModbusPDUWriteFileRecordRequestItem
+	var items []IModbusPDUWriteFileRecordRequestItem
 	// Length array
 	_itemsLength := byteCount
 	_itemsEndPos := io.GetPos() + uint16(_itemsLength)
@@ -112,8 +115,8 @@ func ModbusPDUWriteFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitializ
 		if _err != nil {
 			return nil, errors.New("Error parsing 'items' field " + _err.Error())
 		}
-		var _item ModbusPDUWriteFileRecordRequestItem
-		_item, _ok := _message.(ModbusPDUWriteFileRecordRequestItem)
+		var _item IModbusPDUWriteFileRecordRequestItem
+		_item, _ok := _message.(IModbusPDUWriteFileRecordRequestItem)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUWriteFileRecordRequestItem")
 		}
@@ -125,7 +128,7 @@ func ModbusPDUWriteFileRecordRequestParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 func (m ModbusPDUWriteFileRecordRequest) Serialize(io spi.WriteBuffer) {
-	itemsArraySizeInBytes := func(items []ModbusPDUWriteFileRecordRequestItem) uint32 {
+	itemsArraySizeInBytes := func(items []IModbusPDUWriteFileRecordRequestItem) uint32 {
 		var sizeInBytes uint32 = 0
 		for _, v := range items {
 			sizeInBytes += uint32(v.LengthInBytes())
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
index b3a73ee..52aa1be 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -90,16 +91,28 @@ func (m ModbusPDUWriteFileRecordRequestItem) LengthInBytes() uint16 {
 func ModbusPDUWriteFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (referenceType)
-	var referenceType uint8 = io.ReadUint8(8)
+	referenceType, _referenceTypeErr := io.ReadUint8(8)
+	if _referenceTypeErr != nil {
+		return nil, errors.New("Error parsing 'referenceType' field " + _referenceTypeErr.Error())
+	}
 
 	// Simple Field (fileNumber)
-	var fileNumber uint16 = io.ReadUint16(16)
+	fileNumber, _fileNumberErr := io.ReadUint16(16)
+	if _fileNumberErr != nil {
+		return nil, errors.New("Error parsing 'fileNumber' field " + _fileNumberErr.Error())
+	}
 
 	// Simple Field (recordNumber)
-	var recordNumber uint16 = io.ReadUint16(16)
+	recordNumber, _recordNumberErr := io.ReadUint16(16)
+	if _recordNumberErr != nil {
+		return nil, errors.New("Error parsing 'recordNumber' field " + _recordNumberErr.Error())
+	}
 
 	// 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)
+	recordLength, _recordLengthErr := io.ReadUint16(16)
+	if _recordLengthErr != nil {
+		return nil, errors.New("Error parsing 'recordLength' field " + _recordLengthErr.Error())
+	}
 
 	// Array field (recordData)
 	var recordData []int8
@@ -107,7 +120,11 @@ func ModbusPDUWriteFileRecordRequestItemParse(io spi.ReadBuffer) (spi.Message, e
 	_recordDataLength := uint16(recordLength) * uint16(uint16(2))
 	_recordDataEndPos := io.GetPos() + uint16(_recordDataLength)
 	for io.GetPos() < _recordDataEndPos {
-		recordData = append(recordData, io.ReadInt8(8))
+		_recordDataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'recordData' field " + _err.Error())
+		}
+		recordData = append(recordData, _recordDataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
index 09fcdd5..e9e6533 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type ModbusPDUWriteFileRecordResponse struct {
-	items []ModbusPDUWriteFileRecordResponseItem
+	items []IModbusPDUWriteFileRecordResponseItem
 	ModbusPDU
 }
 
@@ -53,7 +53,7 @@ func (m ModbusPDUWriteFileRecordResponse) initialize() spi.Message {
 	return m
 }
 
-func NewModbusPDUWriteFileRecordResponse(items []ModbusPDUWriteFileRecordResponseItem) ModbusPDUInitializer {
+func NewModbusPDUWriteFileRecordResponse(items []IModbusPDUWriteFileRecordResponseItem) ModbusPDUInitializer {
 	return &ModbusPDUWriteFileRecordResponse{items: items}
 }
 
@@ -100,10 +100,13 @@ func (m ModbusPDUWriteFileRecordResponse) LengthInBytes() 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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (items)
-	var items []ModbusPDUWriteFileRecordResponseItem
+	var items []IModbusPDUWriteFileRecordResponseItem
 	// Length array
 	_itemsLength := byteCount
 	_itemsEndPos := io.GetPos() + uint16(_itemsLength)
@@ -112,8 +115,8 @@ func ModbusPDUWriteFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitiali
 		if _err != nil {
 			return nil, errors.New("Error parsing 'items' field " + _err.Error())
 		}
-		var _item ModbusPDUWriteFileRecordResponseItem
-		_item, _ok := _message.(ModbusPDUWriteFileRecordResponseItem)
+		var _item IModbusPDUWriteFileRecordResponseItem
+		_item, _ok := _message.(IModbusPDUWriteFileRecordResponseItem)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ModbusPDUWriteFileRecordResponseItem")
 		}
@@ -125,7 +128,7 @@ func ModbusPDUWriteFileRecordResponseParse(io spi.ReadBuffer) (ModbusPDUInitiali
 }
 
 func (m ModbusPDUWriteFileRecordResponse) Serialize(io spi.WriteBuffer) {
-	itemsArraySizeInBytes := func(items []ModbusPDUWriteFileRecordResponseItem) uint32 {
+	itemsArraySizeInBytes := func(items []IModbusPDUWriteFileRecordResponseItem) uint32 {
 		var sizeInBytes uint32 = 0
 		for _, v := range items {
 			sizeInBytes += uint32(v.LengthInBytes())
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
index 28f5ee6..f4c3f54 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -90,16 +91,28 @@ func (m ModbusPDUWriteFileRecordResponseItem) LengthInBytes() uint16 {
 func ModbusPDUWriteFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Simple Field (referenceType)
-	var referenceType uint8 = io.ReadUint8(8)
+	referenceType, _referenceTypeErr := io.ReadUint8(8)
+	if _referenceTypeErr != nil {
+		return nil, errors.New("Error parsing 'referenceType' field " + _referenceTypeErr.Error())
+	}
 
 	// Simple Field (fileNumber)
-	var fileNumber uint16 = io.ReadUint16(16)
+	fileNumber, _fileNumberErr := io.ReadUint16(16)
+	if _fileNumberErr != nil {
+		return nil, errors.New("Error parsing 'fileNumber' field " + _fileNumberErr.Error())
+	}
 
 	// Simple Field (recordNumber)
-	var recordNumber uint16 = io.ReadUint16(16)
+	recordNumber, _recordNumberErr := io.ReadUint16(16)
+	if _recordNumberErr != nil {
+		return nil, errors.New("Error parsing 'recordNumber' field " + _recordNumberErr.Error())
+	}
 
 	// 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)
+	recordLength, _recordLengthErr := io.ReadUint16(16)
+	if _recordLengthErr != nil {
+		return nil, errors.New("Error parsing 'recordLength' field " + _recordLengthErr.Error())
+	}
 
 	// Array field (recordData)
 	var recordData []int8
@@ -107,7 +120,11 @@ func ModbusPDUWriteFileRecordResponseItemParse(io spi.ReadBuffer) (spi.Message,
 	_recordDataLength := recordLength
 	_recordDataEndPos := io.GetPos() + uint16(_recordDataLength)
 	for io.GetPos() < _recordDataEndPos {
-		recordData = append(recordData, io.ReadInt8(8))
+		_recordDataVal, _err := io.ReadInt8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'recordData' field " + _err.Error())
+		}
+		recordData = append(recordData, _recordDataVal)
 	}
 
 	// Create the instance
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
index 6cec0cc..9a486ad 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -104,13 +105,22 @@ func (m ModbusPDUWriteMultipleCoilsRequest) LengthInBytes() uint16 {
 func ModbusPDUWriteMultipleCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -119,7 +129,11 @@ func ModbusPDUWriteMultipleCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go
index f46aaf4..452c3df 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUWriteMultipleCoilsResponse) LengthInBytes() uint16 {
 func ModbusPDUWriteMultipleCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUWriteMultipleCoilsResponse(startingAddress, quantity), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
index 66fa336..92218df 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -104,13 +105,22 @@ func (m ModbusPDUWriteMultipleHoldingRegistersRequest) LengthInBytes() uint16 {
 func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.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)
+	byteCount, _byteCountErr := io.ReadUint8(8)
+	if _byteCountErr != nil {
+		return nil, errors.New("Error parsing 'byteCount' field " + _byteCountErr.Error())
+	}
 
 	// Array field (value)
 	var value []int8
@@ -119,7 +129,11 @@ func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (Modb
 		value := make([]int8, byteCount)
 		for curItem := uint16(0); curItem < uint16(byteCount); curItem++ {
 
-			value = append(value, io.ReadInt8(8))
+			_valueVal, _err := io.ReadInt8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'value' field " + _err.Error())
+			}
+			value = append(value, _valueVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go
index 233f696..73c4f14 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUWriteMultipleHoldingRegistersResponse) LengthInBytes() uint16 {
 func ModbusPDUWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (startingAddress)
-	var startingAddress uint16 = io.ReadUint16(16)
+	startingAddress, _startingAddressErr := io.ReadUint16(16)
+	if _startingAddressErr != nil {
+		return nil, errors.New("Error parsing 'startingAddress' field " + _startingAddressErr.Error())
+	}
 
 	// Simple Field (quantity)
-	var quantity uint16 = io.ReadUint16(16)
+	quantity, _quantityErr := io.ReadUint16(16)
+	if _quantityErr != nil {
+		return nil, errors.New("Error parsing 'quantity' field " + _quantityErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUWriteMultipleHoldingRegistersResponse(startingAddress, quantity), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go
index 3161c16..af52726 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUWriteSingleCoilRequest) LengthInBytes() uint16 {
 func ModbusPDUWriteSingleCoilRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
-	var address uint16 = io.ReadUint16(16)
+	address, _addressErr := io.ReadUint16(16)
+	if _addressErr != nil {
+		return nil, errors.New("Error parsing 'address' field " + _addressErr.Error())
+	}
 
 	// Simple Field (value)
-	var value uint16 = io.ReadUint16(16)
+	value, _valueErr := io.ReadUint16(16)
+	if _valueErr != nil {
+		return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUWriteSingleCoilRequest(address, value), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go
index 2be46ba..9aa9c11 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUWriteSingleCoilResponse) LengthInBytes() uint16 {
 func ModbusPDUWriteSingleCoilResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
-	var address uint16 = io.ReadUint16(16)
+	address, _addressErr := io.ReadUint16(16)
+	if _addressErr != nil {
+		return nil, errors.New("Error parsing 'address' field " + _addressErr.Error())
+	}
 
 	// Simple Field (value)
-	var value uint16 = io.ReadUint16(16)
+	value, _valueErr := io.ReadUint16(16)
+	if _valueErr != nil {
+		return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUWriteSingleCoilResponse(address, value), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go
index a1f5997..3cc90e2 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUWriteSingleRegisterRequest) LengthInBytes() uint16 {
 func ModbusPDUWriteSingleRegisterRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
-	var address uint16 = io.ReadUint16(16)
+	address, _addressErr := io.ReadUint16(16)
+	if _addressErr != nil {
+		return nil, errors.New("Error parsing 'address' field " + _addressErr.Error())
+	}
 
 	// Simple Field (value)
-	var value uint16 = io.ReadUint16(16)
+	value, _valueErr := io.ReadUint16(16)
+	if _valueErr != nil {
+		return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUWriteSingleRegisterRequest(address, value), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go
index 500375f..311fab9 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -95,10 +96,16 @@ func (m ModbusPDUWriteSingleRegisterResponse) LengthInBytes() uint16 {
 func ModbusPDUWriteSingleRegisterResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 
 	// Simple Field (address)
-	var address uint16 = io.ReadUint16(16)
+	address, _addressErr := io.ReadUint16(16)
+	if _addressErr != nil {
+		return nil, errors.New("Error parsing 'address' field " + _addressErr.Error())
+	}
 
 	// Simple Field (value)
-	var value uint16 = io.ReadUint16(16)
+	value, _valueErr := io.ReadUint16(16)
+	if _valueErr != nil {
+		return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
+	}
 
 	// Create the instance
 	return NewModbusPDUWriteSingleRegisterResponse(address, value), nil
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
index 4f77e51..f457ae4 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
@@ -30,7 +30,7 @@ type ModbusSerialADU struct {
 	transactionId uint16
 	length        uint16
 	address       uint8
-	pdu           ModbusPDU
+	pdu           IModbusPDU
 }
 
 // The corresponding interface
@@ -39,7 +39,7 @@ type IModbusSerialADU interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewModbusSerialADU(transactionId uint16, length uint16, address uint8, pdu ModbusPDU) spi.Message {
+func NewModbusSerialADU(transactionId uint16, length uint16, address uint8, pdu IModbusPDU) spi.Message {
 	return &ModbusSerialADU{transactionId: transactionId, length: length, address: address, pdu: pdu}
 }
 
@@ -91,11 +91,17 @@ func (m ModbusSerialADU) LengthInBytes() uint16 {
 func ModbusSerialADUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 
 	// Simple Field (transactionId)
-	var transactionId uint16 = io.ReadUint16(16)
+	transactionId, _transactionIdErr := io.ReadUint16(16)
+	if _transactionIdErr != nil {
+		return nil, errors.New("Error parsing 'transactionId' field " + _transactionIdErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint16 = io.ReadUint16(16)
+		reserved, _err := io.ReadUint16(16)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint16(0x0000) {
 			log.WithFields(log.Fields{
 				"expected value": uint16(0x0000),
@@ -105,20 +111,26 @@ func ModbusSerialADUParse(io spi.ReadBuffer, response bool) (spi.Message, error)
 	}
 
 	// Simple Field (length)
-	var length uint16 = io.ReadUint16(16)
+	length, _lengthErr := io.ReadUint16(16)
+	if _lengthErr != nil {
+		return nil, errors.New("Error parsing 'length' field " + _lengthErr.Error())
+	}
 
 	// Simple Field (address)
-	var address uint8 = io.ReadUint8(8)
+	address, _addressErr := io.ReadUint8(8)
+	if _addressErr != nil {
+		return nil, errors.New("Error parsing 'address' field " + _addressErr.Error())
+	}
 
 	// Simple Field (pdu)
 	_pduMessage, _err := ModbusPDUParse(io, response)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'pdu'. " + _err.Error())
 	}
-	var pdu ModbusPDU
-	pdu, _pduOk := _pduMessage.(ModbusPDU)
+	var pdu IModbusPDU
+	pdu, _pduOk := _pduMessage.(IModbusPDU)
 	if !_pduOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_pduMessage).Name() + " to ModbusPDU")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_pduMessage).Name() + " to IModbusPDU")
 	}
 
 	// Create the instance
@@ -143,6 +155,6 @@ func (m ModbusSerialADU) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (address))
 
 	// Simple Field (pdu)
-	pdu := ModbusPDU(m.pdu)
+	pdu := IModbusPDU(m.pdu)
 	pdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusTcpADU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusTcpADU.go
index af2dbed..c1f4fe2 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusTcpADU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusTcpADU.go
@@ -32,7 +32,7 @@ const ModbusTcpADU_PROTOCOLIDENTIFIER uint16 = 0x0000
 type ModbusTcpADU struct {
 	transactionIdentifier uint16
 	unitIdentifier        uint8
-	pdu                   ModbusPDU
+	pdu                   IModbusPDU
 }
 
 // The corresponding interface
@@ -41,7 +41,7 @@ type IModbusTcpADU interface {
 	Serialize(io spi.WriteBuffer)
 }
 
-func NewModbusTcpADU(transactionIdentifier uint16, unitIdentifier uint8, pdu ModbusPDU) spi.Message {
+func NewModbusTcpADU(transactionIdentifier uint16, unitIdentifier uint8, pdu IModbusPDU) spi.Message {
 	return &ModbusTcpADU{transactionIdentifier: transactionIdentifier, unitIdentifier: unitIdentifier, pdu: pdu}
 }
 
@@ -93,29 +93,41 @@ func (m ModbusTcpADU) LengthInBytes() uint16 {
 func ModbusTcpADUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 
 	// Simple Field (transactionIdentifier)
-	var transactionIdentifier uint16 = io.ReadUint16(16)
+	transactionIdentifier, _transactionIdentifierErr := io.ReadUint16(16)
+	if _transactionIdentifierErr != nil {
+		return nil, errors.New("Error parsing 'transactionIdentifier' field " + _transactionIdentifierErr.Error())
+	}
 
 	// Const Field (protocolIdentifier)
-	var protocolIdentifier uint16 = io.ReadUint16(16)
+	protocolIdentifier, _protocolIdentifierErr := io.ReadUint16(16)
+	if _protocolIdentifierErr != nil {
+		return nil, errors.New("Error parsing 'protocolIdentifier' field " + _protocolIdentifierErr.Error())
+	}
 	if protocolIdentifier != ModbusTcpADU_PROTOCOLIDENTIFIER {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(ModbusTcpADU_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)
+	_, _lengthErr := io.ReadUint16(16)
+	if _lengthErr != nil {
+		return nil, errors.New("Error parsing 'length' field " + _lengthErr.Error())
+	}
 
 	// Simple Field (unitIdentifier)
-	var unitIdentifier uint8 = io.ReadUint8(8)
+	unitIdentifier, _unitIdentifierErr := io.ReadUint8(8)
+	if _unitIdentifierErr != nil {
+		return nil, errors.New("Error parsing 'unitIdentifier' field " + _unitIdentifierErr.Error())
+	}
 
 	// Simple Field (pdu)
 	_pduMessage, _err := ModbusPDUParse(io, response)
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'pdu'. " + _err.Error())
 	}
-	var pdu ModbusPDU
-	pdu, _pduOk := _pduMessage.(ModbusPDU)
+	var pdu IModbusPDU
+	pdu, _pduOk := _pduMessage.(IModbusPDU)
 	if !_pduOk {
-		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_pduMessage).Name() + " to ModbusPDU")
+		return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_pduMessage).Name() + " to IModbusPDU")
 	}
 
 	// Create the instance
@@ -140,6 +152,6 @@ func (m ModbusTcpADU) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (unitIdentifier))
 
 	// Simple Field (pdu)
-	pdu := ModbusPDU(m.pdu)
+	pdu := IModbusPDU(m.pdu)
 	pdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
index c29f5c1..4a5abc9 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
@@ -26,8 +26,8 @@ import (
 
 // The data-structure of this message
 type COTPPacket struct {
-	parameters []COTPParameter
-	payload    *S7Message
+	parameters []ICOTPParameter
+	payload    *IS7Message
 }
 
 // The corresponding interface
@@ -38,7 +38,7 @@ type ICOTPPacket interface {
 }
 
 type COTPPacketInitializer interface {
-	initialize(parameters []COTPParameter, payload *S7Message) spi.Message
+	initialize(parameters []ICOTPParameter, payload *IS7Message) spi.Message
 }
 
 func COTPPacketTpduCode(m ICOTPPacket) uint8 {
@@ -85,7 +85,7 @@ func (m COTPPacket) LengthInBits() uint16 {
 
 	// Optional Field (payload)
 	if m.payload != nil {
-		lengthInBits += m.payload.LengthInBits()
+		lengthInBits += (*m.payload).LengthInBits()
 	}
 
 	return lengthInBits
@@ -100,10 +100,16 @@ func COTPPacketParse(io spi.ReadBuffer, cotpLen uint16) (spi.Message, error) {
 	var curPos uint16
 
 	// Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var headerLength uint8 = io.ReadUint8(8)
+	headerLength, _headerLengthErr := io.ReadUint8(8)
+	if _headerLengthErr != nil {
+		return nil, errors.New("Error parsing 'headerLength' field " + _headerLengthErr.Error())
+	}
 
 	// Discriminator Field (tpduCode) (Used as input to a switch field)
-	var tpduCode uint8 = io.ReadUint8(8)
+	tpduCode, _tpduCodeErr := io.ReadUint8(8)
+	if _tpduCodeErr != nil {
+		return nil, errors.New("Error parsing 'tpduCode' field " + _tpduCodeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer COTPPacketInitializer
@@ -128,7 +134,7 @@ func COTPPacketParse(io spi.ReadBuffer, cotpLen uint16) (spi.Message, error) {
 
 	// Array field (parameters)
 	curPos = io.GetPos() - startPos
-	var parameters []COTPParameter
+	var parameters []ICOTPParameter
 	// Length array
 	_parametersLength := uint16(uint16(uint16(headerLength)+uint16(uint16(1)))) - uint16(curPos)
 	_parametersEndPos := io.GetPos() + uint16(_parametersLength)
@@ -137,8 +143,8 @@ func COTPPacketParse(io spi.ReadBuffer, cotpLen uint16) (spi.Message, error) {
 		if _err != nil {
 			return nil, errors.New("Error parsing 'parameters' field " + _err.Error())
 		}
-		var _item COTPParameter
-		_item, _ok := _message.(COTPParameter)
+		var _item ICOTPParameter
+		_item, _ok := _message.(ICOTPParameter)
 		if !_ok {
 			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to COTPParameter")
 		}
@@ -148,16 +154,16 @@ func COTPPacketParse(io spi.ReadBuffer, cotpLen uint16) (spi.Message, error) {
 
 	// Optional Field (payload) (Can be skipped, if a given expression evaluates to false)
 	curPos = io.GetPos() - startPos
-	var payload *S7Message = nil
+	var payload *IS7Message = nil
 	if bool((curPos) < (cotpLen)) {
 		_message, _err := S7MessageParse(io)
 		if _err != nil {
 			return nil, errors.New("Error parsing 'payload' field " + _err.Error())
 		}
-		var _item S7Message
-		_item, _ok := _message.(S7Message)
+		var _item IS7Message
+		_item, _ok := _message.(IS7Message)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to S7Message")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IS7Message")
 		}
 		payload = &_item
 	}
@@ -170,7 +176,7 @@ func (m COTPPacket) Serialize(io spi.WriteBuffer) {
 	iCOTPPacket := CastICOTPPacket(m)
 
 	// Implicit Field (headerLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	headerLength := uint8(uint8(uint8(m.LengthInBytes())) - uint8(uint8(uint8(uint8(spi.InlineIf(bool(bool((m.payload) != (nil))), uint16(m.payload.LengthInBytes()), uint16(uint8(0)))))+uint8(uint8(1)))))
+	headerLength := uint8(uint8(uint8(m.LengthInBytes())) - uint8(uint8(uint8(uint8(spi.InlineIf(bool(bool((m.payload) != (nil))), uint16((*m.payload).LengthInBytes()), uint16(uint8(0)))))+uint8(uint8(1)))))
 	io.WriteUint8(8, (headerLength))
 
 	// Discriminator Field (tpduCode) (Used as input to a switch field)
@@ -188,9 +194,9 @@ func (m COTPPacket) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Optional Field (payload) (Can be skipped, if the value is null)
-	var payload *S7Message = nil
+	var payload *IS7Message = nil
 	if m.payload != nil {
 		payload = m.payload
-		payload.Serialize(io)
+		(*payload).Serialize(io)
 	}
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionRequest.go
index 10179ab..6da24d4 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionRequest.go
@@ -27,7 +27,7 @@ import (
 type COTPPacketConnectionRequest struct {
 	destinationReference uint16
 	sourceReference      uint16
-	protocolClass        COTPProtocolClass
+	protocolClass        ICOTPProtocolClass
 	COTPPacket
 }
 
@@ -42,13 +42,13 @@ func (m COTPPacketConnectionRequest) TpduCode() uint8 {
 	return 0xE0
 }
 
-func (m COTPPacketConnectionRequest) initialize(parameters []COTPParameter, payload *S7Message) spi.Message {
+func (m COTPPacketConnectionRequest) initialize(parameters []ICOTPParameter, payload *IS7Message) spi.Message {
 	m.parameters = parameters
 	m.payload = payload
 	return m
 }
 
-func NewCOTPPacketConnectionRequest(destinationReference uint16, sourceReference uint16, protocolClass COTPProtocolClass) COTPPacketInitializer {
+func NewCOTPPacketConnectionRequest(destinationReference uint16, sourceReference uint16, protocolClass ICOTPProtocolClass) COTPPacketInitializer {
 	return &COTPPacketConnectionRequest{destinationReference: destinationReference, sourceReference: sourceReference, protocolClass: protocolClass}
 }
 
@@ -94,10 +94,16 @@ func (m COTPPacketConnectionRequest) LengthInBytes() uint16 {
 func COTPPacketConnectionRequestParse(io spi.ReadBuffer) (COTPPacketInitializer, error) {
 
 	// Simple Field (destinationReference)
-	var destinationReference uint16 = io.ReadUint16(16)
+	destinationReference, _destinationReferenceErr := io.ReadUint16(16)
+	if _destinationReferenceErr != nil {
+		return nil, errors.New("Error parsing 'destinationReference' field " + _destinationReferenceErr.Error())
+	}
 
 	// Simple Field (sourceReference)
-	var sourceReference uint16 = io.ReadUint16(16)
+	sourceReference, _sourceReferenceErr := io.ReadUint16(16)
+	if _sourceReferenceErr != nil {
+		return nil, errors.New("Error parsing 'sourceReference' field " + _sourceReferenceErr.Error())
+	}
 
 	// Enum field (protocolClass)
 	protocolClass, _protocolClassErr := COTPProtocolClassParse(io)
@@ -120,6 +126,6 @@ func (m COTPPacketConnectionRequest) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (sourceReference))
 
 	// Enum field (protocolClass)
-	protocolClass := COTPProtocolClass(m.protocolClass)
+	protocolClass := ICOTPProtocolClass(m.protocolClass)
 	protocolClass.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go
index 29071d5..05a875f 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go
@@ -27,7 +27,7 @@ import (
 type COTPPacketConnectionResponse struct {
 	destinationReference uint16
 	sourceReference      uint16
-	protocolClass        COTPProtocolClass
+	protocolClass        ICOTPProtocolClass
 	COTPPacket
 }
 
@@ -42,13 +42,13 @@ func (m COTPPacketConnectionResponse) TpduCode() uint8 {
 	return 0xD0
 }
 
-func (m COTPPacketConnectionResponse) initialize(parameters []COTPParameter, payload *S7Message) spi.Message {
+func (m COTPPacketConnectionResponse) initialize(parameters []ICOTPParameter, payload *IS7Message) spi.Message {
 	m.parameters = parameters
 	m.payload = payload
 	return m
 }
 
-func NewCOTPPacketConnectionResponse(destinationReference uint16, sourceReference uint16, protocolClass COTPProtocolClass) COTPPacketInitializer {
+func NewCOTPPacketConnectionResponse(destinationReference uint16, sourceReference uint16, protocolClass ICOTPProtocolClass) COTPPacketInitializer {
 	return &COTPPacketConnectionResponse{destinationReference: destinationReference, sourceReference: sourceReference, protocolClass: protocolClass}
 }
 
@@ -94,10 +94,16 @@ func (m COTPPacketConnectionResponse) LengthInBytes() uint16 {
 func COTPPacketConnectionResponseParse(io spi.ReadBuffer) (COTPPacketInitializer, error) {
 
 	// Simple Field (destinationReference)
-	var destinationReference uint16 = io.ReadUint16(16)
+	destinationReference, _destinationReferenceErr := io.ReadUint16(16)
+	if _destinationReferenceErr != nil {
+		return nil, errors.New("Error parsing 'destinationReference' field " + _destinationReferenceErr.Error())
+	}
 
 	// Simple Field (sourceReference)
-	var sourceReference uint16 = io.ReadUint16(16)
+	sourceReference, _sourceReferenceErr := io.ReadUint16(16)
+	if _sourceReferenceErr != nil {
+		return nil, errors.New("Error parsing 'sourceReference' field " + _sourceReferenceErr.Error())
+	}
 
 	// Enum field (protocolClass)
 	protocolClass, _protocolClassErr := COTPProtocolClassParse(io)
@@ -120,6 +126,6 @@ func (m COTPPacketConnectionResponse) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (sourceReference))
 
 	// Enum field (protocolClass)
-	protocolClass := COTPProtocolClass(m.protocolClass)
+	protocolClass := ICOTPProtocolClass(m.protocolClass)
 	protocolClass.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go
index 12f2852..c03a757 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -40,7 +41,7 @@ func (m COTPPacketData) TpduCode() uint8 {
 	return 0xF0
 }
 
-func (m COTPPacketData) initialize(parameters []COTPParameter, payload *S7Message) spi.Message {
+func (m COTPPacketData) initialize(parameters []ICOTPParameter, payload *IS7Message) spi.Message {
 	m.parameters = parameters
 	m.payload = payload
 	return m
@@ -89,10 +90,16 @@ func (m COTPPacketData) LengthInBytes() uint16 {
 func COTPPacketDataParse(io spi.ReadBuffer) (COTPPacketInitializer, error) {
 
 	// Simple Field (eot)
-	var eot bool = io.ReadBit()
+	eot, _eotErr := io.ReadBit()
+	if _eotErr != nil {
+		return nil, errors.New("Error parsing 'eot' field " + _eotErr.Error())
+	}
 
 	// Simple Field (tpduRef)
-	var tpduRef uint8 = io.ReadUint8(7)
+	tpduRef, _tpduRefErr := io.ReadUint8(7)
+	if _tpduRefErr != nil {
+		return nil, errors.New("Error parsing 'tpduRef' field " + _tpduRefErr.Error())
+	}
 
 	// Create the instance
 	return NewCOTPPacketData(eot, tpduRef), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go
index b3ad75f..738dcdf 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go
@@ -27,7 +27,7 @@ import (
 type COTPPacketDisconnectRequest struct {
 	destinationReference uint16
 	sourceReference      uint16
-	protocolClass        COTPProtocolClass
+	protocolClass        ICOTPProtocolClass
 	COTPPacket
 }
 
@@ -42,13 +42,13 @@ func (m COTPPacketDisconnectRequest) TpduCode() uint8 {
 	return 0x80
 }
 
-func (m COTPPacketDisconnectRequest) initialize(parameters []COTPParameter, payload *S7Message) spi.Message {
+func (m COTPPacketDisconnectRequest) initialize(parameters []ICOTPParameter, payload *IS7Message) spi.Message {
 	m.parameters = parameters
 	m.payload = payload
 	return m
 }
 
-func NewCOTPPacketDisconnectRequest(destinationReference uint16, sourceReference uint16, protocolClass COTPProtocolClass) COTPPacketInitializer {
+func NewCOTPPacketDisconnectRequest(destinationReference uint16, sourceReference uint16, protocolClass ICOTPProtocolClass) COTPPacketInitializer {
 	return &COTPPacketDisconnectRequest{destinationReference: destinationReference, sourceReference: sourceReference, protocolClass: protocolClass}
 }
 
@@ -94,10 +94,16 @@ func (m COTPPacketDisconnectRequest) LengthInBytes() uint16 {
 func COTPPacketDisconnectRequestParse(io spi.ReadBuffer) (COTPPacketInitializer, error) {
 
 	// Simple Field (destinationReference)
-	var destinationReference uint16 = io.ReadUint16(16)
+	destinationReference, _destinationReferenceErr := io.ReadUint16(16)
+	if _destinationReferenceErr != nil {
+		return nil, errors.New("Error parsing 'destinationReference' field " + _destinationReferenceErr.Error())
+	}
 
 	// Simple Field (sourceReference)
-	var sourceReference uint16 = io.ReadUint16(16)
+	sourceReference, _sourceReferenceErr := io.ReadUint16(16)
+	if _sourceReferenceErr != nil {
+		return nil, errors.New("Error parsing 'sourceReference' field " + _sourceReferenceErr.Error())
+	}
 
 	// Enum field (protocolClass)
 	protocolClass, _protocolClassErr := COTPProtocolClassParse(io)
@@ -120,6 +126,6 @@ func (m COTPPacketDisconnectRequest) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (sourceReference))
 
 	// Enum field (protocolClass)
-	protocolClass := COTPProtocolClass(m.protocolClass)
+	protocolClass := ICOTPProtocolClass(m.protocolClass)
 	protocolClass.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go
index ef44641..fa2e0af 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -40,7 +41,7 @@ func (m COTPPacketDisconnectResponse) TpduCode() uint8 {
 	return 0xC0
 }
 
-func (m COTPPacketDisconnectResponse) initialize(parameters []COTPParameter, payload *S7Message) spi.Message {
+func (m COTPPacketDisconnectResponse) initialize(parameters []ICOTPParameter, payload *IS7Message) spi.Message {
 	m.parameters = parameters
 	m.payload = payload
 	return m
@@ -89,10 +90,16 @@ func (m COTPPacketDisconnectResponse) LengthInBytes() uint16 {
 func COTPPacketDisconnectResponseParse(io spi.ReadBuffer) (COTPPacketInitializer, error) {
 
 	// Simple Field (destinationReference)
-	var destinationReference uint16 = io.ReadUint16(16)
+	destinationReference, _destinationReferenceErr := io.ReadUint16(16)
+	if _destinationReferenceErr != nil {
+		return nil, errors.New("Error parsing 'destinationReference' field " + _destinationReferenceErr.Error())
+	}
 
 	// Simple Field (sourceReference)
-	var sourceReference uint16 = io.ReadUint16(16)
+	sourceReference, _sourceReferenceErr := io.ReadUint16(16)
+	if _sourceReferenceErr != nil {
+		return nil, errors.New("Error parsing 'sourceReference' field " + _sourceReferenceErr.Error())
+	}
 
 	// Create the instance
 	return NewCOTPPacketDisconnectResponse(destinationReference, sourceReference), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go
index e3796f0..7346751 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -40,7 +41,7 @@ func (m COTPPacketTpduError) TpduCode() uint8 {
 	return 0x70
 }
 
-func (m COTPPacketTpduError) initialize(parameters []COTPParameter, payload *S7Message) spi.Message {
+func (m COTPPacketTpduError) initialize(parameters []ICOTPParameter, payload *IS7Message) spi.Message {
 	m.parameters = parameters
 	m.payload = payload
 	return m
@@ -89,10 +90,16 @@ func (m COTPPacketTpduError) LengthInBytes() uint16 {
 func COTPPacketTpduErrorParse(io spi.ReadBuffer) (COTPPacketInitializer, error) {
 
 	// Simple Field (destinationReference)
-	var destinationReference uint16 = io.ReadUint16(16)
+	destinationReference, _destinationReferenceErr := io.ReadUint16(16)
+	if _destinationReferenceErr != nil {
+		return nil, errors.New("Error parsing 'destinationReference' field " + _destinationReferenceErr.Error())
+	}
 
 	// Simple Field (rejectCause)
-	var rejectCause uint8 = io.ReadUint8(8)
+	rejectCause, _rejectCauseErr := io.ReadUint8(8)
+	if _rejectCauseErr != nil {
+		return nil, errors.New("Error parsing 'rejectCause' field " + _rejectCauseErr.Error())
+	}
 
 	// Create the instance
 	return NewCOTPPacketTpduError(destinationReference, rejectCause), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go
index 76adcbd..1bd7dc7 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go
@@ -83,10 +83,16 @@ func (m COTPParameter) LengthInBytes() uint16 {
 func COTPParameterParse(io spi.ReadBuffer, rest uint8) (spi.Message, error) {
 
 	// Discriminator Field (parameterType) (Used as input to a switch field)
-	var parameterType uint8 = io.ReadUint8(8)
+	parameterType, _parameterTypeErr := io.ReadUint8(8)
+	if _parameterTypeErr != nil {
+		return nil, errors.New("Error parsing 'parameterType' field " + _parameterTypeErr.Error())
+	}
 
 	// Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _parameterLengthErr := io.ReadUint8(8)
+	if _parameterLengthErr != nil {
+		return nil, errors.New("Error parsing 'parameterLength' field " + _parameterLengthErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer COTPParameterInitializer
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go
index 6414b92..9834254 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m COTPParameterCalledTsap) LengthInBytes() uint16 {
 func COTPParameterCalledTsapParse(io spi.ReadBuffer) (COTPParameterInitializer, error) {
 
 	// Simple Field (tsapId)
-	var tsapId uint16 = io.ReadUint16(16)
+	tsapId, _tsapIdErr := io.ReadUint16(16)
+	if _tsapIdErr != nil {
+		return nil, errors.New("Error parsing 'tsapId' field " + _tsapIdErr.Error())
+	}
 
 	// Create the instance
 	return NewCOTPParameterCalledTsap(tsapId), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go
index 5746e32..9033edf 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m COTPParameterCallingTsap) LengthInBytes() uint16 {
 func COTPParameterCallingTsapParse(io spi.ReadBuffer) (COTPParameterInitializer, error) {
 
 	// Simple Field (tsapId)
-	var tsapId uint16 = io.ReadUint16(16)
+	tsapId, _tsapIdErr := io.ReadUint16(16)
+	if _tsapIdErr != nil {
+		return nil, errors.New("Error parsing 'tsapId' field " + _tsapIdErr.Error())
+	}
 
 	// Create the instance
 	return NewCOTPParameterCallingTsap(tsapId), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go
index faff7d4..f3ae6f4 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -83,7 +84,10 @@ func (m COTPParameterChecksum) LengthInBytes() uint16 {
 func COTPParameterChecksumParse(io spi.ReadBuffer) (COTPParameterInitializer, error) {
 
 	// Simple Field (crc)
-	var crc uint8 = io.ReadUint8(8)
+	crc, _crcErr := io.ReadUint8(8)
+	if _crcErr != nil {
+		return nil, errors.New("Error parsing 'crc' field " + _crcErr.Error())
+	}
 
 	// Create the instance
 	return NewCOTPParameterChecksum(crc), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
index 27b416b..3f43328 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -91,7 +92,11 @@ func COTPParameterDisconnectAdditionalInformationParse(io spi.ReadBuffer, rest u
 		data := make([]uint8, rest)
 		for curItem := uint16(0); curItem < uint16(rest); curItem++ {
 
-			data = append(data, io.ReadUint8(8))
+			_dataVal, _err := io.ReadUint8(8)
+			if _err != nil {
+				return nil, errors.New("Error parsing 'data' field " + _err.Error())
+			}
+			data = append(data, _dataVal)
 		}
 	}
 
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go
index 7530456..018d300 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go
@@ -25,7 +25,7 @@ import (
 
 // The data-structure of this message
 type COTPParameterTpduSize struct {
-	tpduSize COTPTpduSize
+	tpduSize ICOTPTpduSize
 	COTPParameter
 }
 
@@ -44,7 +44,7 @@ func (m COTPParameterTpduSize) initialize() spi.Message {
 	return m
 }
 
-func NewCOTPParameterTpduSize(tpduSize COTPTpduSize) COTPParameterInitializer {
+func NewCOTPParameterTpduSize(tpduSize ICOTPTpduSize) COTPParameterInitializer {
 	return &COTPParameterTpduSize{tpduSize: tpduSize}
 }
 
@@ -96,6 +96,6 @@ func COTPParameterTpduSizeParse(io spi.ReadBuffer) (COTPParameterInitializer, er
 func (m COTPParameterTpduSize) Serialize(io spi.WriteBuffer) {
 
 	// Enum field (tpduSize)
-	tpduSize := COTPTpduSize(m.tpduSize)
+	tpduSize := ICOTPTpduSize(m.tpduSize)
 	tpduSize.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
index 0052116..a71dded 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPProtocolClass.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type COTPProtocolClass int8
 
+type ICOTPProtocolClass interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	COTPProtocolClass_CLASS_0 COTPProtocolClass = 0x00
 	COTPProtocolClass_CLASS_1 COTPProtocolClass = 0x10
@@ -40,6 +45,14 @@ func CastCOTPProtocolClass(structType interface{}) COTPProtocolClass {
 	return castFunc(structType)
 }
 
+func (m COTPProtocolClass) LengthInBits() uint16 {
+	return 8
+}
+
+func (m COTPProtocolClass) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func COTPProtocolClassParse(io spi.ReadBuffer) (COTPProtocolClass, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
index 34f3a7d..39bea02 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPTpduSize.go
@@ -22,6 +22,12 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type COTPTpduSize int8
 
+type ICOTPTpduSize interface {
+	spi.Message
+	SizeInBytes() uint16
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	COTPTpduSize_SIZE_128  COTPTpduSize = 0x07
 	COTPTpduSize_SIZE_256  COTPTpduSize = 0x08
@@ -79,6 +85,14 @@ func CastCOTPTpduSize(structType interface{}) COTPTpduSize {
 	return castFunc(structType)
 }
 
+func (m COTPTpduSize) LengthInBits() uint16 {
+	return 8
+}
+
+func (m COTPTpduSize) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func COTPTpduSizeParse(io spi.ReadBuffer) (COTPTpduSize, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
index ee5374f..7623762 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportErrorCode.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type DataTransportErrorCode uint8
 
+type IDataTransportErrorCode interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	DataTransportErrorCode_RESERVED                DataTransportErrorCode = 0x00
 	DataTransportErrorCode_OK                      DataTransportErrorCode = 0xFF
@@ -41,6 +46,14 @@ func CastDataTransportErrorCode(structType interface{}) DataTransportErrorCode {
 	return castFunc(structType)
 }
 
+func (m DataTransportErrorCode) LengthInBits() uint16 {
+	return 8
+}
+
+func (m DataTransportErrorCode) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func DataTransportErrorCodeParse(io spi.ReadBuffer) (DataTransportErrorCode, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
index 36400cf..767e3f3 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DataTransportSize.go
@@ -22,6 +22,12 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type DataTransportSize uint8
 
+type IDataTransportSize interface {
+	spi.Message
+	SizeInBits() bool
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	DataTransportSize_NULL            DataTransportSize = 0x00
 	DataTransportSize_BIT             DataTransportSize = 0x03
@@ -79,6 +85,14 @@ func CastDataTransportSize(structType interface{}) DataTransportSize {
 	return castFunc(structType)
 }
 
+func (m DataTransportSize) LengthInBits() uint16 {
+	return 8
+}
+
+func (m DataTransportSize) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func DataTransportSizeParse(io spi.ReadBuffer) (DataTransportSize, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
index 2298acf..1d7f6ce 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/DeviceGroup.go
@@ -22,6 +22,11 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type DeviceGroup int8
 
+type IDeviceGroup interface {
+	spi.Message
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	DeviceGroup_PG_OR_PC DeviceGroup = 0x01
 	DeviceGroup_OS       DeviceGroup = 0x02
@@ -38,6 +43,14 @@ func CastDeviceGroup(structType interface{}) DeviceGroup {
 	return castFunc(structType)
 }
 
+func (m DeviceGroup) LengthInBits() uint16 {
+	return 8
+}
+
+func (m DeviceGroup) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func DeviceGroupParse(io spi.ReadBuffer) (DeviceGroup, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
index f7c0593..18f9548 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/MemoryArea.go
@@ -22,6 +22,12 @@ import "plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 
 type MemoryArea uint8
 
+type IMemoryArea interface {
+	spi.Message
+	ShortName() string
+	Serialize(io spi.WriteBuffer)
+}
+
 const (
 	MemoryArea_COUNTERS                 MemoryArea = 0x1C
 	MemoryArea_TIMERS                   MemoryArea = 0x1D
@@ -89,6 +95,14 @@ func CastMemoryArea(structType interface{}) MemoryArea {
 	return castFunc(structType)
 }
 
+func (m MemoryArea) LengthInBits() uint16 {
+	return 8
+}
+
+func (m MemoryArea) LengthInBytes() uint16 {
+	return m.LengthInBits() / 8
+}
+
 func MemoryAreaParse(io spi.ReadBuffer) (MemoryArea, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go
index b549b08..c833dc4 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go
@@ -80,7 +80,10 @@ func (m S7Address) LengthInBytes() uint16 {
 func S7AddressParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (addressType) (Used as input to a switch field)
-	var addressType uint8 = io.ReadUint8(8)
+	addressType, _addressTypeErr := io.ReadUint8(8)
+	if _addressTypeErr != nil {
+		return nil, errors.New("Error parsing 'addressType' field " + _addressTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer S7AddressInitializer
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
index db8f1a9..0ac78d0 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
@@ -26,10 +26,10 @@ import (
 
 // The data-structure of this message
 type S7AddressAny struct {
-	transportSize    TransportSize
+	transportSize    ITransportSize
 	numberOfElements uint16
 	dbNumber         uint16
-	area             MemoryArea
+	area             IMemoryArea
 	byteAddress      uint16
 	bitAddress       uint8
 	S7Address
@@ -50,7 +50,7 @@ func (m S7AddressAny) initialize() spi.Message {
 	return m
 }
 
-func NewS7AddressAny(transportSize TransportSize, numberOfElements uint16, dbNumber uint16, area MemoryArea, byteAddress uint16, bitAddress uint8) S7AddressInitializer {
+func NewS7AddressAny(transportSize ITransportSize, numberOfElements uint16, dbNumber uint16, area IMemoryArea, byteAddress uint16, bitAddress uint8) S7AddressInitializer {
 	return &S7AddressAny{transportSize: transportSize, numberOfElements: numberOfElements, dbNumber: dbNumber, area: area, byteAddress: byteAddress, bitAddress: bitAddress}
 }
 
@@ -114,10 +114,16 @@ func S7AddressAnyParse(io spi.ReadBuffer) (S7AddressInitializer, error) {
 	}
 
 	// Simple Field (numberOfElements)
-	var numberOfElements uint16 = io.ReadUint16(16)
+	numberOfElements, _numberOfElementsErr := io.ReadUint16(16)
+	if _numberOfElementsErr != nil {
+		return nil, errors.New("Error parsing 'numberOfElements' field " + _numberOfElementsErr.Error())
+	}
 
 	// Simple Field (dbNumber)
-	var dbNumber uint16 = io.ReadUint16(16)
+	dbNumber, _dbNumberErr := io.ReadUint16(16)
+	if _dbNumberErr != nil {
+		return nil, errors.New("Error parsing 'dbNumber' field " + _dbNumberErr.Error())
+	}
 
 	// Enum field (area)
 	area, _areaErr := MemoryAreaParse(io)
@@ -127,7 +133,10 @@ func S7AddressAnyParse(io spi.ReadBuffer) (S7AddressInitializer, error) {
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(5)
+		reserved, _err := io.ReadUint8(5)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -137,10 +146,16 @@ func S7AddressAnyParse(io spi.ReadBuffer) (S7AddressInitializer, error) {
 	}
 
 	// Simple Field (byteAddress)
-	var byteAddress uint16 = io.ReadUint16(16)
+	byteAddress, _byteAddressErr := io.ReadUint16(16)
+	if _byteAddressErr != nil {
+		return nil, errors.New("Error parsing 'byteAddress' field " + _byteAddressErr.Error())
+	}
 
 	// Simple Field (bitAddress)
-	var bitAddress uint8 = io.ReadUint8(3)
+	bitAddress, _bitAddressErr := io.ReadUint8(3)
+	if _bitAddressErr != nil {
+		return nil, errors.New("Error parsing 'bitAddress' field " + _bitAddressErr.Error())
+	}
 
 	// Create the instance
 	return NewS7AddressAny(transportSize, numberOfElements, dbNumber, area, byteAddress, bitAddress), nil
@@ -149,7 +164,7 @@ func S7AddressAnyParse(io spi.ReadBuffer) (S7AddressInitializer, error) {
 func (m S7AddressAny) Serialize(io spi.WriteBuffer) {
 
 	// Enum field (transportSize)
-	transportSize := TransportSize(m.transportSize)
+	transportSize := ITransportSize(m.transportSize)
 	transportSize.Serialize(io)
 
 	// Simple Field (numberOfElements)
@@ -161,7 +176,7 @@ func (m S7AddressAny) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (dbNumber))
 
 	// Enum field (area)
-	area := MemoryArea(m.area)
+	area := IMemoryArea(m.area)
 	area.Serialize(io)
 
 	// Reserved Field (reserved)
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
index a5d1e4c..ae4332a 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
@@ -32,8 +32,8 @@ const S7Message_PROTOCOLID uint8 = 0x32
 // The data-structure of this message
 type S7Message struct {
 	tpduReference uint16
-	parameter     *S7Parameter
-	payload       *S7Payload
+	parameter     *IS7Parameter
+	payload       *IS7Payload
 }
 
 // The corresponding interface
@@ -44,7 +44,7 @@ type IS7Message interface {
 }
 
 type S7MessageInitializer interface {
-	initialize(tpduReference uint16, parameter *S7Parameter, payload *S7Payload) spi.Message
+	initialize(tpduReference uint16, parameter *IS7Parameter, payload *IS7Payload) spi.Message
 }
 
 func S7MessageMessageType(m IS7Message) uint8 {
@@ -96,12 +96,12 @@ func (m S7Message) LengthInBits() uint16 {
 
 	// Optional Field (parameter)
 	if m.parameter != nil {
-		lengthInBits += m.parameter.LengthInBits()
+		lengthInBits += (*m.parameter).LengthInBits()
 	}
 
 	// Optional Field (payload)
 	if m.payload != nil {
-		lengthInBits += m.payload.LengthInBits()
+		lengthInBits += (*m.payload).LengthInBits()
 	}
 
 	return lengthInBits
@@ -114,17 +114,26 @@ func (m S7Message) LengthInBytes() uint16 {
 func S7MessageParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Const Field (protocolId)
-	var protocolId uint8 = io.ReadUint8(8)
+	protocolId, _protocolIdErr := io.ReadUint8(8)
+	if _protocolIdErr != nil {
+		return nil, errors.New("Error parsing 'protocolId' field " + _protocolIdErr.Error())
+	}
 	if protocolId != S7Message_PROTOCOLID {
 		return nil, errors.New("Expected constant value " + strconv.Itoa(int(S7Message_PROTOCOLID)) + " but got " + strconv.Itoa(int(protocolId)))
 	}
 
 	// Discriminator Field (messageType) (Used as input to a switch field)
-	var messageType uint8 = io.ReadUint8(8)
+	messageType, _messageTypeErr := io.ReadUint8(8)
+	if _messageTypeErr != nil {
+		return nil, errors.New("Error parsing 'messageType' field " + _messageTypeErr.Error())
+	}
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint16 = io.ReadUint16(16)
+		reserved, _err := io.ReadUint16(16)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint16(0x0000) {
 			log.WithFields(log.Fields{
 				"expected value": uint16(0x0000),
@@ -134,13 +143,22 @@ func S7MessageParse(io spi.ReadBuffer) (spi.Message, error) {
 	}
 
 	// Simple Field (tpduReference)
-	var tpduReference uint16 = io.ReadUint16(16)
+	tpduReference, _tpduReferenceErr := io.ReadUint16(16)
+	if _tpduReferenceErr != nil {
+		return nil, errors.New("Error parsing 'tpduReference' field " + _tpduReferenceErr.Error())
+	}
 
 	// Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var parameterLength uint16 = io.ReadUint16(16)
+	parameterLength, _parameterLengthErr := io.ReadUint16(16)
+	if _parameterLengthErr != nil {
+		return nil, errors.New("Error parsing 'parameterLength' field " + _parameterLengthErr.Error())
+	}
 
 	// Implicit Field (payloadLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var payloadLength uint16 = io.ReadUint16(16)
+	payloadLength, _payloadLengthErr := io.ReadUint16(16)
+	if _payloadLengthErr != nil {
+		return nil, errors.New("Error parsing 'payloadLength' field " + _payloadLengthErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer S7MessageInitializer
@@ -160,31 +178,31 @@ func S7MessageParse(io spi.ReadBuffer) (spi.Message, error) {
 	}
 
 	// Optional Field (parameter) (Can be skipped, if a given expression evaluates to false)
-	var parameter *S7Parameter = nil
+	var parameter *IS7Parameter = nil
 	if bool((parameterLength) > (0)) {
 		_message, _err := S7ParameterParse(io, messageType)
 		if _err != nil {
 			return nil, errors.New("Error parsing 'parameter' field " + _err.Error())
 		}
-		var _item S7Parameter
-		_item, _ok := _message.(S7Parameter)
+		var _item IS7Parameter
+		_item, _ok := _message.(IS7Parameter)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to S7Parameter")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IS7Parameter")
 		}
 		parameter = &_item
 	}
 
 	// Optional Field (payload) (Can be skipped, if a given expression evaluates to false)
-	var payload *S7Payload = nil
+	var payload *IS7Payload = nil
 	if bool((payloadLength) > (0)) {
-		_message, _err := S7PayloadParse(io, messageType, *parameter)
+		_message, _err := S7PayloadParse(io, messageType, (*parameter))
 		if _err != nil {
 			return nil, errors.New("Error parsing 'payload' field " + _err.Error())
 		}
-		var _item S7Payload
-		_item, _ok := _message.(S7Payload)
+		var _item IS7Payload
+		_item, _ok := _message.(IS7Payload)
 		if !_ok {
-			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to S7Payload")
+			return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IS7Payload")
 		}
 		payload = &_item
 	}
@@ -211,27 +229,27 @@ func (m S7Message) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (tpduReference))
 
 	// Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	parameterLength := uint16(spi.InlineIf(bool((m.parameter) != (nil)), uint16(m.parameter.LengthInBytes()), uint16(uint16(0))))
+	parameterLength := uint16(spi.InlineIf(bool((m.parameter) != (nil)), uint16((*m.parameter).LengthInBytes()), uint16(uint16(0))))
 	io.WriteUint16(16, (parameterLength))
 
 	// Implicit Field (payloadLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	payloadLength := uint16(spi.InlineIf(bool((m.payload) != (nil)), uint16(m.payload.LengthInBytes()), uint16(uint16(0))))
+	payloadLength := uint16(spi.InlineIf(bool((m.payload) != (nil)), uint16((*m.payload).LengthInBytes()), uint16(uint16(0))))
 	io.WriteUint16(16, (payloadLength))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
 	iS7Message.Serialize(io)
 
 	// Optional Field (parameter) (Can be skipped, if the value is null)
-	var parameter *S7Parameter = nil
+	var parameter *IS7Parameter = nil
 	if m.parameter != nil {
 		parameter = m.parameter
-		parameter.Serialize(io)
+		(*parameter).Serialize(io)
 	}
 
 	// Optional Field (payload) (Can be skipped, if the value is null)
-	var payload *S7Payload = nil
+	var payload *IS7Payload = nil
 	if m.payload != nil {
 		payload = m.payload
-		payload.Serialize(io)
+		(*payload).Serialize(io)
 	}
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageRequest.go
index 2846e32..32da070 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageRequest.go
@@ -38,7 +38,7 @@ func (m S7MessageRequest) MessageType() uint8 {
 	return 0x01
 }
 
-func (m S7MessageRequest) initialize(tpduReference uint16, parameter *S7Parameter, payload *S7Payload) spi.Message {
+func (m S7MessageRequest) initialize(tpduReference uint16, parameter *IS7Parameter, payload *IS7Payload) spi.Message {
 	m.tpduReference = tpduReference
 	m.parameter = parameter
 	m.payload = payload
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go
index 15d30ba..4bc0c81 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -40,7 +41,7 @@ func (m S7MessageResponse) MessageType() uint8 {
 	return 0x02
 }
 
-func (m S7MessageResponse) initialize(tpduReference uint16, parameter *S7Parameter, payload *S7Payload) spi.Message {
+func (m S7MessageResponse) initialize(tpduReference uint16, parameter *IS7Parameter, payload *IS7Payload) spi.Message {
 	m.tpduReference = tpduReference
 	m.parameter = parameter
 	m.payload = payload
@@ -90,10 +91,16 @@ func (m S7MessageResponse) LengthInBytes() uint16 {
 func S7MessageResponseParse(io spi.ReadBuffer) (S7MessageInitializer, error) {
 
 	// Simple Field (errorClass)
-	var errorClass uint8 = io.ReadUint8(8)
+	errorClass, _errorClassErr := io.ReadUint8(8)
+	if _errorClassErr != nil {
+		return nil, errors.New("Error parsing 'errorClass' field " + _errorClassErr.Error())
+	}
 
 	// Simple Field (errorCode)
-	var errorCode uint8 = io.ReadUint8(8)
+	errorCode, _errorCodeErr := io.ReadUint8(8)
+	if _errorCodeErr != nil {
+		return nil, errors.New("Error parsing 'errorCode' field " + _errorCodeErr.Error())
+	}
 
 	// Create the instance
 	return NewS7MessageResponse(errorClass, errorCode), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go
index 61e32aa..d31ff4f 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -40,7 +41,7 @@ func (m S7MessageResponseData) MessageType() uint8 {
 	return 0x03
 }
 
-func (m S7MessageResponseData) initialize(tpduReference uint16, parameter *S7Parameter, payload *S7Payload) spi.Message {
+func (m S7MessageResponseData) initialize(tpduReference uint16, parameter *IS7Parameter, payload *IS7Payload) spi.Message {
 	m.tpduReference = tpduReference
 	m.parameter = parameter
 	m.payload = payload
@@ -90,10 +91,16 @@ func (m S7MessageResponseData) LengthInBytes() uint16 {
 func S7MessageResponseDataParse(io spi.ReadBuffer) (S7MessageInitializer, error) {
 
 	// Simple Field (errorClass)
-	var errorClass uint8 = io.ReadUint8(8)
+	errorClass, _errorClassErr := io.ReadUint8(8)
+	if _errorClassErr != nil {
+		return nil, errors.New("Error parsing 'errorClass' field " + _errorClassErr.Error())
+	}
 
 	// Simple Field (errorCode)
-	var errorCode uint8 = io.ReadUint8(8)
+	errorCode, _errorCodeErr := io.ReadUint8(8)
+	if _errorCodeErr != nil {
+		return nil, errors.New("Error parsing 'errorCode' field " + _errorCodeErr.Error())
+	}
 
 	// Create the instance
 	return NewS7MessageResponseData(errorClass, errorCode), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go
index 5b49831..99b79f7 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go
@@ -38,7 +38,7 @@ func (m S7MessageUserData) MessageType() uint8 {
 	return 0x07
 }
 
-func (m S7MessageUserData) initialize(tpduReference uint16, parameter *S7Parameter, payload *S7Payload) spi.Message {
+func (m S7MessageUserData) initialize(tpduReference uint16, parameter *IS7Parameter, payload *IS7Payload) spi.Message {
 	m.tpduReference = tpduReference
 	m.parameter = parameter
 	m.payload = payload
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go
index c668cc6..8aa021b 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go
@@ -85,7 +85,10 @@ func (m S7Parameter) LengthInBytes() uint16 {
 func S7ParameterParse(io spi.ReadBuffer, messageType uint8) (spi.Message, error) {
 
 	// Discriminator Field (parameterType) (Used as input to a switch field)
-	var parameterType uint8 = io.ReadUint8(8)
+	parameterType, _parameterTypeErr := io.ReadUint8(8)
+	if _parameterTypeErr != nil {
+		return nil, errors.New("Error parsing 'parameterType' field " + _parameterTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer S7ParameterInitializer
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
index 0333077..0754551 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type S7ParameterReadVarRequest struct {
-	items []S7VarRequestParameterItem
+	items []IS7VarRequestParameterItem
 	S7Parameter
 }
 
@@ -49,7 +49,7 @@ func (m S7ParameterReadVarRequest) initialize() spi.Message {
 	return m
 }
 
-func NewS7ParameterReadVarRequest(items []S7VarRequestParameterItem) S7ParameterInitializer {
+func NewS7ParameterReadVarRequest(items []IS7VarRequestParameterItem) S7ParameterInitializer {
 	return &S7ParameterReadVarRequest{items: items}
 }
 
@@ -96,21 +96,24 @@ func (m S7ParameterReadVarRequest) LengthInBytes() uint16 {
 func S7ParameterReadVarRequestParse(io spi.ReadBuffer) (S7ParameterInitializer, error) {
 
 	// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var numItems uint8 = io.ReadUint8(8)
+	numItems, _numItemsErr := io.ReadUint8(8)
+	if _numItemsErr != nil {
+		return nil, errors.New("Error parsing 'numItems' field " + _numItemsErr.Error())
+	}
 
 	// Array field (items)
-	var items []S7VarRequestParameterItem
+	var items []IS7VarRequestParameterItem
 	// Count array
 	{
-		items := make([]S7VarRequestParameterItem, numItems)
+		items := make([]IS7VarRequestParameterItem, numItems)
 		for curItem := uint16(0); curItem < uint16(numItems); curItem++ {
 
 			_message, _err := S7VarRequestParameterItemParse(io)
 			if _err != nil {
 				return nil, errors.New("Error parsing 'items' field " + _err.Error())
 			}
-			var _item S7VarRequestParameterItem
-			_item, _ok := _message.(S7VarRequestParameterItem)
+			var _item IS7VarRequestParameterItem
+			_item, _ok := _message.(IS7VarRequestParameterItem)
 			if !_ok {
 				return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to S7VarRequestParameterItem")
 			}
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go
index e3325b4..4b917cb 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -87,7 +88,10 @@ func (m S7ParameterReadVarResponse) LengthInBytes() uint16 {
 func S7ParameterReadVarResponseParse(io spi.ReadBuffer) (S7ParameterInitializer, error) {
 
 	// Simple Field (numItems)
-	var numItems uint8 = io.ReadUint8(8)
+	numItems, _numItemsErr := io.ReadUint8(8)
+	if _numItemsErr != nil {
+		return nil, errors.New("Error parsing 'numItems' field " + _numItemsErr.Error())
+	}
 
 	// Create the instance
 	return NewS7ParameterReadVarResponse(numItems), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go
index c401dc5..005769c 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	log "github.com/sirupsen/logrus"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
@@ -100,7 +101,10 @@ func S7ParameterSetupCommunicationParse(io spi.ReadBuffer) (S7ParameterInitializ
 
 	// Reserved Field (Compartmentalized so the "reserved" variable can't leak)
 	{
-		var reserved uint8 = io.ReadUint8(8)
+		reserved, _err := io.ReadUint8(8)
+		if _err != nil {
+			return nil, errors.New("Error parsing 'reserved' field " + _err.Error())
+		}
 		if reserved != uint8(0x00) {
 			log.WithFields(log.Fields{
 				"expected value": uint8(0x00),
@@ -110,13 +114,22 @@ func S7ParameterSetupCommunicationParse(io spi.ReadBuffer) (S7ParameterInitializ
 	}
 
 	// Simple Field (maxAmqCaller)
-	var maxAmqCaller uint16 = io.ReadUint16(16)
+	maxAmqCaller, _maxAmqCallerErr := io.ReadUint16(16)
+	if _maxAmqCallerErr != nil {
+		return nil, errors.New("Error parsing 'maxAmqCaller' field " + _maxAmqCallerErr.Error())
+	}
 
 	// Simple Field (maxAmqCallee)
-	var maxAmqCallee uint16 = io.ReadUint16(16)
+	maxAmqCallee, _maxAmqCalleeErr := io.ReadUint16(16)
+	if _maxAmqCalleeErr != nil {
+		return nil, errors.New("Error parsing 'maxAmqCallee' field " + _maxAmqCalleeErr.Error())
+	}
 
 	// Simple Field (pduLength)
-	var pduLength uint16 = io.ReadUint16(16)
+	pduLength, _pduLengthErr := io.ReadUint16(16)
+	if _pduLengthErr != nil {
+		return nil, errors.New("Error parsing 'pduLength' field " + _pduLengthErr.Error())
+	}
 
 	// Create the instance
 	return NewS7ParameterSetupCommunication(maxAmqCaller, maxAmqCallee, pduLength), nil
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
index 7707036..18d79dc 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
@@ -26,7 +26,7 @@ import (
 
 // The data-structure of this message
 type S7ParameterUserData struct {
-	items []S7ParameterUserDataItem
+	items []IS7ParameterUserDataItem
 	S7Parameter
 }
 
@@ -49,7 +49,7 @@ func (m S7ParameterUserData) initialize() spi.Message {
 	return m
 }
 
-func NewS7ParameterUserData(items []S7ParameterUserDataItem) S7ParameterInitializer {
+func NewS7ParameterUserData(items []IS7ParameterUserDataItem) S7ParameterInitializer {
 	return &S7ParameterUserData{items: items}
 }
 
@@ -96,21 +96,24 @@ func (m S7ParameterUserData) LengthInBytes() uint16 {
 func S7ParameterUserDataParse(io spi.ReadBuffer) (S7ParameterInitializer, error) {
 
 	// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var numItems uint8 = io.ReadUint8(8)
+	numItems, _numItemsErr := io.ReadUint8(8)
+	if _numItemsErr != nil {
+		return nil, errors.New("Error parsing 'numItems' field " + _numItemsErr.Error())
+	}
 
 	// Array field (items)
-	var items []S7ParameterUserDataItem
+	var items []IS7ParameterUserDataItem
 	// Count array
 	{
-		items := make([]S7ParameterUserDataItem, numItems)
+		items := make([]IS7ParameterUserDataItem, numItems)
 		for curItem := uint16(0); curItem < uint16(numItems); curItem++ {
 
 			_message, _err := S7ParameterUserDataItemParse(io)
 			if _err != nil {
 				return nil, errors.New("Error parsing 'items' field " + _err.Error())
 			}
-			var _item S7ParameterUserDataItem
-			_item, _ok := _message.(S7ParameterUserDataItem)
+			var _item IS7ParameterUserDataItem
+			_item, _ok := _message.(IS7ParameterUserDataItem)
 			if !_ok {
 				return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to S7ParameterUserDataItem")
 			}
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go
index 841a7b4..92fa486 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go
@@ -80,7 +80,10 @@ func (m S7ParameterUserDataItem) LengthInBytes() uint16 {
 func S7ParameterUserDataItemParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Discriminator Field (itemType) (Used as input to a switch field)
-	var itemType uint8 = io.ReadUint8(8)
+	itemType, _itemTypeErr := io.ReadUint8(8)
+	if _itemTypeErr != nil {
+		return nil, errors.New("Error parsing 'itemType' field " + _itemTypeErr.Error())
+	}
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	var initializer S7ParameterUserDataItemInitializer
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
index 7ded62d..58bd69f 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
@@ -19,6 +19,7 @@
 package model
 
 import (
+	"errors"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
@@ -120,41 +121,71 @@ func (m S7ParameterUserDataItemCPUFunctions) LengthInBytes() uint16 {
 func S7ParameterUserDataItemCPUFunctionsParse(io spi.ReadBuffer) (S7ParameterUserDataItemInitializer, error) {
 
 	// Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	var _ uint8 = io.ReadUint8(8)
+	_, _itemLengthErr := io.ReadUint8(8)
+	if _itemLengthErr != nil {
+		return nil, errors.New("Error parsing 'itemLength' field " + _itemLengthErr.Error())
+	}
 
 	// Simple Field (method)
-	var method uint8 = io.ReadUint8(8)
+	method, _methodErr := io.ReadUint8(8)
+	if _methodErr != nil {
+		return nil, errors.New("Error parsing 'method' field " + _methodErr.Error())
+	}
 
 	// Simple Field (cpuFunctionType)
-	var cpuFunctionType uint8 = io.ReadUint8(4)
+	cpuFunctionType, _cpuFunctionTypeErr := io.ReadUint8(4)
+	if _cpuFunctionTypeErr != nil {
... 1144 lines suppressed ...