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 13:15:00 UTC

[plc4x] branch feature/plc4go updated: - Implemented the WriteBuffer - Fixed the Serialization issues

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 4b60c0d  - Implemented the WriteBuffer - Fixed the Serialization issues
4b60c0d is described below

commit 4b60c0d71f9bc8cb5cc05109b6f5947306c4fa3f
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Oct 13 15:14:51 2020 +0200

    - Implemented the WriteBuffer
    - Fixed the Serialization issues
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |  4 ++
 .../resources/templates/go/model-template.ftlh     | 26 +++++--
 sandbox/plc4go/cmd/main/drivers/modbus.go          | 15 +++-
 .../plc4go/bacnetip/readwrite/model/APDU.go        |  8 +--
 .../plc4go/bacnetip/readwrite/model/APDUAbort.go   | 26 ++++---
 .../bacnetip/readwrite/model/APDUComplexAck.go     | 56 ++++++++-------
 .../readwrite/model/APDUConfirmedRequest.go        | 74 ++++++++++---------
 .../plc4go/bacnetip/readwrite/model/APDUError.go   | 20 +++---
 .../plc4go/bacnetip/readwrite/model/APDUReject.go  | 20 +++---
 .../bacnetip/readwrite/model/APDUSegmentAck.go     | 38 +++++-----
 .../bacnetip/readwrite/model/APDUSimpleAck.go      | 20 +++---
 .../readwrite/model/APDUUnconfirmedRequest.go      | 14 ++--
 .../bacnetip/readwrite/model/BACnetAddress.go      |  1 +
 .../readwrite/model/BACnetConfirmedServiceACK.go   |  8 +--
 .../BACnetConfirmedServiceACKAtomicReadFile.go     |  3 +
 .../BACnetConfirmedServiceACKAtomicWriteFile.go    |  3 +
 ...tConfirmedServiceACKConfirmedPrivateTransfer.go |  3 +
 .../model/BACnetConfirmedServiceACKCreateObject.go |  3 +
 .../BACnetConfirmedServiceACKGetAlarmSummary.go    |  3 +
 ...ACnetConfirmedServiceACKGetEnrollmentSummary.go |  3 +
 ...BACnetConfirmedServiceACKGetEventInformation.go |  3 +
 .../model/BACnetConfirmedServiceACKReadProperty.go |  3 +
 ...ACnetConfirmedServiceACKReadPropertyMultiple.go |  3 +
 .../model/BACnetConfirmedServiceACKReadRange.go    |  3 +
 ...BACnetConfirmedServiceACKRemovedAuthenticate.go |  3 +
 ...rmedServiceACKRemovedReadPropertyConditional.go |  3 +
 .../model/BACnetConfirmedServiceACKVTData.go       |  3 +
 .../model/BACnetConfirmedServiceACKVTOpen.go       |  3 +
 .../model/BACnetConfirmedServiceRequest.go         |  8 +--
 ...ACnetConfirmedServiceRequestAcknowledgeAlarm.go |  3 +
 .../BACnetConfirmedServiceRequestAddListElement.go |  3 +
 .../BACnetConfirmedServiceRequestAtomicReadFile.go |  3 +
 ...BACnetConfirmedServiceRequestAtomicWriteFile.go |  3 +
 ...firmedServiceRequestConfirmedCOVNotification.go | 84 +++++++++++-----------
 ...rviceRequestConfirmedCOVNotificationMultiple.go |  3 +
 ...rmedServiceRequestConfirmedEventNotification.go |  3 +
 ...firmedServiceRequestConfirmedPrivateTransfer.go |  3 +
 ...tConfirmedServiceRequestConfirmedTextMessage.go |  3 +
 .../BACnetConfirmedServiceRequestCreateObject.go   |  3 +
 .../BACnetConfirmedServiceRequestDeleteObject.go   |  3 +
 ...rmedServiceRequestDeviceCommunicationControl.go |  3 +
 ...tConfirmedServiceRequestGetEnrollmentSummary.go |  3 +
 ...etConfirmedServiceRequestGetEventInformation.go |  3 +
 ...etConfirmedServiceRequestLifeSafetyOperation.go |  3 +
 .../BACnetConfirmedServiceRequestReadProperty.go   | 38 +++++-----
 ...tConfirmedServiceRequestReadPropertyMultiple.go |  3 +
 .../BACnetConfirmedServiceRequestReadRange.go      |  3 +
 ...netConfirmedServiceRequestReinitializeDevice.go |  3 +
 ...CnetConfirmedServiceRequestRemoveListElement.go |  3 +
 ...etConfirmedServiceRequestRemovedAuthenticate.go |  3 +
 ...ServiceRequestRemovedReadPropertyConditional.go |  3 +
 ...CnetConfirmedServiceRequestRemovedRequestKey.go |  3 +
 .../BACnetConfirmedServiceRequestSubscribeCOV.go   | 62 ++++++++--------
 ...tConfirmedServiceRequestSubscribeCOVProperty.go |  3 +
 ...edServiceRequestSubscribeCOVPropertyMultiple.go |  3 +
 .../model/BACnetConfirmedServiceRequestVTClose.go  |  3 +
 .../model/BACnetConfirmedServiceRequestVTData.go   |  3 +
 .../model/BACnetConfirmedServiceRequestVTOpen.go   |  3 +
 .../BACnetConfirmedServiceRequestWriteProperty.go  | 64 +++++++++--------
 ...ConfirmedServiceRequestWritePropertyMultiple.go |  3 +
 .../plc4go/bacnetip/readwrite/model/BACnetError.go |  8 +--
 .../readwrite/model/BACnetErrorAtomicReadFile.go   |  3 +
 .../readwrite/model/BACnetErrorAtomicWriteFile.go  |  3 +
 .../model/BACnetErrorConfirmedPrivateTransfer.go   |  3 +
 .../readwrite/model/BACnetErrorCreateObject.go     |  3 +
 .../readwrite/model/BACnetErrorGetAlarmSummary.go  |  3 +
 .../model/BACnetErrorGetEnrollmentSummary.go       |  3 +
 .../model/BACnetErrorGetEventInformation.go        |  3 +
 .../readwrite/model/BACnetErrorReadProperty.go     | 42 ++++++-----
 .../model/BACnetErrorReadPropertyMultiple.go       |  3 +
 .../readwrite/model/BACnetErrorReadRange.go        |  3 +
 .../model/BACnetErrorRemovedAuthenticate.go        |  3 +
 .../BACnetErrorRemovedReadPropertyConditional.go   |  3 +
 .../bacnetip/readwrite/model/BACnetErrorVTData.go  |  3 +
 .../bacnetip/readwrite/model/BACnetErrorVTOpen.go  |  3 +
 .../bacnetip/readwrite/model/BACnetServiceAck.go   |  8 +--
 .../model/BACnetServiceAckAtomicReadFile.go        |  3 +
 .../model/BACnetServiceAckAtomicWriteFile.go       |  3 +
 .../BACnetServiceAckConfirmedPrivateTransfer.go    |  3 +
 .../model/BACnetServiceAckCreateObject.go          |  3 +
 .../model/BACnetServiceAckGetAlarmSummary.go       |  3 +
 .../model/BACnetServiceAckGetEnrollmentSummary.go  |  3 +
 .../model/BACnetServiceAckGetEventInformation.go   |  3 +
 .../model/BACnetServiceAckReadProperty.go          | 54 +++++++-------
 .../model/BACnetServiceAckReadPropertyMultiple.go  |  3 +
 .../readwrite/model/BACnetServiceAckReadRange.go   |  3 +
 .../model/BACnetServiceAckRemovedAuthenticate.go   |  3 +
 ...CnetServiceAckRemovedReadPropertyConditional.go |  3 +
 .../readwrite/model/BACnetServiceAckVTData.go      |  3 +
 .../readwrite/model/BACnetServiceAckVTOpen.go      |  3 +
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |  8 +--
 .../model/BACnetTagApplicationBitString.go         | 18 +++--
 .../readwrite/model/BACnetTagApplicationBoolean.go |  3 +
 .../model/BACnetTagApplicationCharacterString.go   |  3 +
 .../readwrite/model/BACnetTagApplicationDate.go    |  3 +
 .../readwrite/model/BACnetTagApplicationDouble.go  | 10 ++-
 .../model/BACnetTagApplicationEnumerated.go        | 12 ++--
 .../readwrite/model/BACnetTagApplicationNull.go    |  3 +
 .../model/BACnetTagApplicationObjectIdentifier.go  |  3 +
 .../model/BACnetTagApplicationOctetString.go       |  3 +
 .../readwrite/model/BACnetTagApplicationReal.go    | 10 ++-
 .../model/BACnetTagApplicationSignedInteger.go     | 12 ++--
 .../readwrite/model/BACnetTagApplicationTime.go    |  3 +
 .../model/BACnetTagApplicationUnsignedInteger.go   | 12 ++--
 .../bacnetip/readwrite/model/BACnetTagContext.go   | 12 ++--
 .../readwrite/model/BACnetTagWithContent.go        |  3 +-
 .../model/BACnetUnconfirmedServiceRequest.go       |  8 +--
 .../model/BACnetUnconfirmedServiceRequestIAm.go    | 60 ++++++++--------
 .../model/BACnetUnconfirmedServiceRequestIHave.go  |  3 +
 ...UnconfirmedServiceRequestTimeSynchronization.go |  3 +
 ...onfirmedServiceRequestUTCTimeSynchronization.go |  3 +
 ...rmedServiceRequestUnconfirmedCOVNotification.go |  3 +
 ...iceRequestUnconfirmedCOVNotificationMultiple.go |  3 +
 ...edServiceRequestUnconfirmedEventNotification.go |  3 +
 ...rmedServiceRequestUnconfirmedPrivateTransfer.go | 42 ++++++-----
 ...onfirmedServiceRequestUnconfirmedTextMessage.go |  3 +
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go | 48 +++++++------
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  | 42 ++++++-----
 .../BACnetUnconfirmedServiceRequestWriteGroup.go   |  3 +
 .../plc4go/bacnetip/readwrite/model/BVLC.go        |  8 +--
 .../model/BVLCDeleteForeignDeviceTableEntry.go     |  3 +
 .../model/BVLCDistributeBroadcastToNetwork.go      |  3 +
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  | 26 ++++---
 .../readwrite/model/BVLCOriginalBroadcastNPDU.go   | 10 ++-
 .../readwrite/model/BVLCOriginalUnicastNPDU.go     | 10 ++-
 .../model/BVLCReadBroadcastDistributionTable.go    |  3 +
 .../model/BVLCReadBroadcastDistributionTableAck.go |  3 +
 .../readwrite/model/BVLCReadForeignDeviceTable.go  |  3 +
 .../model/BVLCReadForeignDeviceTableAck.go         |  3 +
 .../readwrite/model/BVLCRegisterForeignDevice.go   |  3 +
 .../plc4go/bacnetip/readwrite/model/BVLCResult.go  |  3 +
 .../bacnetip/readwrite/model/BVLCSecureBVLL.go     |  3 +
 .../model/BVLCWideBroadcastDistributionTable.go    |  3 +
 .../plc4go/bacnetip/readwrite/model/NLM.go         |  8 +--
 .../readwrite/model/NLMIAmRouterToNetwork.go       | 12 ++--
 .../readwrite/model/NLMWhoIsRouterToNetwork.go     | 12 ++--
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |  5 +-
 .../plc4go/knxnetip/readwrite/model/CEMI.go        |  8 +--
 .../readwrite/model/CEMIAdditionalInformation.go   |  8 +--
 .../CEMIAdditionalInformationBusmonitorInfo.go     | 44 ++++++------
 .../CEMIAdditionalInformationRelativeTimestamp.go  | 14 ++--
 .../knxnetip/readwrite/model/CEMIBusmonInd.go      | 26 ++++---
 .../plc4go/knxnetip/readwrite/model/CEMIDataCon.go | 26 ++++---
 .../knxnetip/readwrite/model/CEMIDataFrame.go      |  9 +--
 .../plc4go/knxnetip/readwrite/model/CEMIDataInd.go | 26 ++++---
 .../plc4go/knxnetip/readwrite/model/CEMIDataReq.go | 26 ++++---
 .../plc4go/knxnetip/readwrite/model/CEMIFrame.go   | 14 ++--
 .../knxnetip/readwrite/model/CEMIFrameAck.go       |  3 +
 .../knxnetip/readwrite/model/CEMIFrameData.go      | 78 ++++++++++----------
 .../knxnetip/readwrite/model/CEMIFrameDataExt.go   | 84 +++++++++++-----------
 .../readwrite/model/CEMIFramePollingData.go        |  3 +
 .../readwrite/model/CEMIFramePollingDataExt.go     |  3 +
 .../knxnetip/readwrite/model/CEMIMPropReadCon.go   | 40 ++++++-----
 .../knxnetip/readwrite/model/CEMIMPropReadReq.go   | 34 +++++----
 .../knxnetip/readwrite/model/CEMIPollDataCon.go    |  3 +
 .../knxnetip/readwrite/model/CEMIPollDataReq.go    |  3 +
 .../plc4go/knxnetip/readwrite/model/CEMIRawCon.go  |  3 +
 .../plc4go/knxnetip/readwrite/model/CEMIRawInd.go  |  3 +
 .../plc4go/knxnetip/readwrite/model/CEMIRawReq.go  |  3 +
 .../knxnetip/readwrite/model/ConnectionRequest.go  | 22 +++---
 .../model/ConnectionRequestInformation.go          |  8 +--
 ...ConnectionRequestInformationDeviceManagement.go |  3 +
 ...ConnectionRequestInformationTunnelConnection.go | 14 ++--
 .../knxnetip/readwrite/model/ConnectionResponse.go | 38 +++++-----
 .../readwrite/model/ConnectionResponseDataBlock.go |  8 +--
 .../ConnectionResponseDataBlockDeviceManagement.go |  3 +
 .../ConnectionResponseDataBlockTunnelConnection.go | 10 ++-
 .../readwrite/model/ConnectionStateRequest.go      | 20 +++---
 .../readwrite/model/ConnectionStateResponse.go     | 16 +++--
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      | 11 +--
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |  1 +
 .../knxnetip/readwrite/model/DescriptionRequest.go | 10 ++-
 .../readwrite/model/DescriptionResponse.go         | 16 +++--
 .../readwrite/model/DeviceConfigurationAck.go      | 10 ++-
 .../model/DeviceConfigurationAckDataBlock.go       |  3 +-
 .../readwrite/model/DeviceConfigurationRequest.go  | 16 +++--
 .../model/DeviceConfigurationRequestDataBlock.go   |  1 +
 .../knxnetip/readwrite/model/DeviceStatus.go       |  1 +
 .../knxnetip/readwrite/model/DisconnectRequest.go  | 20 +++---
 .../knxnetip/readwrite/model/DisconnectResponse.go | 16 +++--
 .../readwrite/model/HPAIControlEndpoint.go         |  5 +-
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   |  5 +-
 .../readwrite/model/HPAIDiscoveryEndpoint.go       |  5 +-
 .../plc4go/knxnetip/readwrite/model/IPAddress.go   |  1 +
 .../plc4go/knxnetip/readwrite/model/KNXAddress.go  |  1 +
 .../knxnetip/readwrite/model/KNXGroupAddress.go    |  6 +-
 .../readwrite/model/KNXGroupAddress2Level.go       | 16 +++--
 .../readwrite/model/KNXGroupAddress3Level.go       | 22 +++---
 .../readwrite/model/KNXGroupAddressFreeLevel.go    | 10 ++-
 .../knxnetip/readwrite/model/KNXNetIPMessage.go    |  8 +--
 .../knxnetip/readwrite/model/KnxNetIpCore.go       | 10 ++-
 .../readwrite/model/KnxNetIpDeviceManagement.go    | 10 ++-
 .../knxnetip/readwrite/model/KnxNetIpTunneling.go  | 10 ++-
 .../knxnetip/readwrite/model/KnxNetObjectServer.go | 10 ++-
 .../model/KnxNetRemoteConfigurationAndDiagnosis.go | 10 ++-
 .../readwrite/model/KnxNetRemoteLogging.go         | 10 ++-
 .../plc4go/knxnetip/readwrite/model/MACAddress.go  |  1 +
 .../model/ProjectInstallationIdentifier.go         |  1 +
 .../knxnetip/readwrite/model/RelativeTimestamp.go  |  1 +
 .../knxnetip/readwrite/model/RoutingIndication.go  |  3 +
 .../knxnetip/readwrite/model/SearchRequest.go      | 10 ++-
 .../knxnetip/readwrite/model/SearchResponse.go     | 22 +++---
 .../plc4go/knxnetip/readwrite/model/ServiceId.go   |  8 +--
 .../knxnetip/readwrite/model/TunnelingRequest.go   | 16 +++--
 .../readwrite/model/TunnelingRequestDataBlock.go   |  1 +
 .../knxnetip/readwrite/model/TunnelingResponse.go  | 10 ++-
 .../readwrite/model/TunnelingResponseDataBlock.go  |  3 +-
 .../knxnetip/readwrite/model/UnknownMessage.go     | 12 ++--
 .../modbus/readwrite/model/ModbusConstants.go      |  1 +
 .../plc4go/modbus/readwrite/model/ModbusPDU.go     | 10 +--
 .../readwrite/model/ModbusPDUDiagnosticRequest.go  | 16 +++--
 .../modbus/readwrite/model/ModbusPDUError.go       | 10 ++-
 .../model/ModbusPDUGetComEventLogRequest.go        |  3 +
 .../model/ModbusPDUGetComEventLogResponse.go       | 36 +++++-----
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    | 22 +++---
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   | 22 +++---
 .../readwrite/model/ModbusPDUReadCoilsRequest.go   | 16 +++--
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  | 18 +++--
 .../ModbusPDUReadDeviceIdentificationRequest.go    |  3 +
 .../ModbusPDUReadDeviceIdentificationResponse.go   |  3 +
 .../model/ModbusPDUReadDiscreteInputsRequest.go    | 16 +++--
 .../model/ModbusPDUReadDiscreteInputsResponse.go   | 18 +++--
 .../model/ModbusPDUReadExceptionStatusRequest.go   |  3 +
 .../model/ModbusPDUReadExceptionStatusResponse.go  | 10 ++-
 .../model/ModbusPDUReadFifoQueueRequest.go         | 10 ++-
 .../model/ModbusPDUReadFifoQueueResponse.go        | 24 ++++---
 .../model/ModbusPDUReadFileRecordRequest.go        | 18 +++--
 .../model/ModbusPDUReadFileRecordRequestItem.go    |  1 +
 .../model/ModbusPDUReadFileRecordResponse.go       | 18 +++--
 .../model/ModbusPDUReadFileRecordResponseItem.go   |  1 +
 .../model/ModbusPDUReadHoldingRegistersRequest.go  | 16 +++--
 .../model/ModbusPDUReadHoldingRegistersResponse.go | 18 +++--
 .../model/ModbusPDUReadInputRegistersRequest.go    | 16 +++--
 .../model/ModbusPDUReadInputRegistersResponse.go   | 18 +++--
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go | 42 ++++++-----
 ...PDUReadWriteMultipleHoldingRegistersResponse.go | 18 +++--
 .../model/ModbusPDUReportServerIdRequest.go        |  3 +
 .../model/ModbusPDUReportServerIdResponse.go       | 18 +++--
 .../model/ModbusPDUWriteFileRecordRequest.go       | 18 +++--
 .../model/ModbusPDUWriteFileRecordRequestItem.go   |  1 +
 .../model/ModbusPDUWriteFileRecordResponse.go      | 18 +++--
 .../model/ModbusPDUWriteFileRecordResponseItem.go  |  1 +
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    | 30 ++++----
 .../model/ModbusPDUWriteMultipleCoilsResponse.go   | 16 +++--
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go | 30 ++++----
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go | 16 +++--
 .../model/ModbusPDUWriteSingleCoilRequest.go       | 16 +++--
 .../model/ModbusPDUWriteSingleCoilResponse.go      | 16 +++--
 .../model/ModbusPDUWriteSingleRegisterRequest.go   | 16 +++--
 .../model/ModbusPDUWriteSingleRegisterResponse.go  | 16 +++--
 .../modbus/readwrite/model/ModbusSerialADU.go      |  3 +-
 .../plc4go/modbus/readwrite/model/ModbusTcpADU.go  |  3 +-
 .../plc4go/s7/readwrite/model/COTPPacket.go        | 10 +--
 .../readwrite/model/COTPPacketConnectionRequest.go | 22 +++---
 .../model/COTPPacketConnectionResponse.go          | 22 +++---
 .../plc4go/s7/readwrite/model/COTPPacketData.go    | 16 +++--
 .../readwrite/model/COTPPacketDisconnectRequest.go | 22 +++---
 .../model/COTPPacketDisconnectResponse.go          | 16 +++--
 .../s7/readwrite/model/COTPPacketTpduError.go      | 16 +++--
 .../plc4go/s7/readwrite/model/COTPParameter.go     |  8 +--
 .../s7/readwrite/model/COTPParameterCalledTsap.go  | 10 ++-
 .../s7/readwrite/model/COTPParameterCallingTsap.go | 10 ++-
 .../s7/readwrite/model/COTPParameterChecksum.go    | 10 ++-
 ...COTPParameterDisconnectAdditionalInformation.go | 12 ++--
 .../s7/readwrite/model/COTPParameterTpduSize.go    | 10 ++-
 .../plc4go/s7/readwrite/model/S7Address.go         |  8 +--
 .../plc4go/s7/readwrite/model/S7AddressAny.go      | 44 ++++++------
 .../plc4go/s7/readwrite/model/S7Message.go         | 12 ++--
 .../plc4go/s7/readwrite/model/S7MessageRequest.go  |  3 +
 .../plc4go/s7/readwrite/model/S7MessageResponse.go | 16 +++--
 .../s7/readwrite/model/S7MessageResponseData.go    | 16 +++--
 .../plc4go/s7/readwrite/model/S7MessageUserData.go |  3 +
 .../plc4go/s7/readwrite/model/S7Parameter.go       |  8 +--
 .../readwrite/model/S7ParameterReadVarRequest.go   | 18 +++--
 .../readwrite/model/S7ParameterReadVarResponse.go  | 10 ++-
 .../model/S7ParameterSetupCommunication.go         | 26 ++++---
 .../s7/readwrite/model/S7ParameterUserData.go      | 18 +++--
 .../s7/readwrite/model/S7ParameterUserDataItem.go  |  8 +--
 .../model/S7ParameterUserDataItemCPUFunctions.go   | 74 ++++++++++---------
 .../readwrite/model/S7ParameterWriteVarRequest.go  | 18 +++--
 .../readwrite/model/S7ParameterWriteVarResponse.go | 10 ++-
 .../plc4go/s7/readwrite/model/S7Payload.go         |  6 +-
 .../s7/readwrite/model/S7PayloadReadVarResponse.go | 22 +++---
 .../plc4go/s7/readwrite/model/S7PayloadUserData.go | 12 ++--
 .../s7/readwrite/model/S7PayloadUserDataItem.go    | 12 ++--
 ...PayloadUserDataItemCpuFunctionReadSzlRequest.go |  3 +
 ...ayloadUserDataItemCpuFunctionReadSzlResponse.go | 22 +++---
 .../s7/readwrite/model/S7PayloadWriteVarRequest.go | 22 +++---
 .../readwrite/model/S7PayloadWriteVarResponse.go   | 12 ++--
 .../s7/readwrite/model/S7VarPayloadDataItem.go     |  5 +-
 .../s7/readwrite/model/S7VarPayloadStatusItem.go   |  3 +-
 .../readwrite/model/S7VarRequestParameterItem.go   |  8 +--
 .../model/S7VarRequestParameterItemAddress.go      | 16 +++--
 .../plc4go/s7/readwrite/model/SzlDataTreeItem.go   |  1 +
 .../internal/plc4go/s7/readwrite/model/SzlId.go    |  5 +-
 .../plc4go/s7/readwrite/model/TPKTPacket.go        |  3 +-
 sandbox/plc4go/internal/plc4go/spi/WriteBuffer.go  | 60 +++++++++++-----
 297 files changed, 2262 insertions(+), 1351 deletions(-)

diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 1e6e536..04675aa 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -286,6 +286,10 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
      * Methods related to fields.
      **********************************************************************************/
 
+    public boolean hasFieldOfType(String fieldTypeName) {
+        return ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field -> field.getTypeName().equals(fieldTypeName));
+    }
+
     public Field getFieldForNameFromCurrentOrParent(String fieldName) {
         return ((ComplexTypeDefinition) getThisTypeDefinition()).getAllPropertyFields()
             .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
diff --git a/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
index 5046d6d..37dbab0 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
@@ -663,7 +663,11 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     </#if>
 }
 
+<#if helper.isDiscriminatedParentTypeDefinition()>
+func ${type.name}Serialize(io spi.WriteBuffer, m ${type.name}, i I${type.name}, childSerialize func()<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) {
+<#else>
 func (m ${type.name}) 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>
     <#assign arraySizeInBytesHelpers=helper.requiresHelperFunctions("ARRAY_SIZE_IN_BYTES")>
     <#if arraySizeInBytesHelpers?has_content>
         <#list arraySizeInBytesHelpers?keys as key>
@@ -677,7 +681,9 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
     }
         </#list>
     </#if>
-    <#if helper.isDiscriminatedParentTypeDefinition()>i${type.name} := CastI${type.name}(m)</#if>
+    <#if helper.isDiscriminatedChildTypeDefinition()>
+    ser := func() {
+    </#if>
     <#list type.fields as field>
         <#switch field.typeName>
             <#case "array">
@@ -732,14 +738,14 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
                 <#assign simpleTypeReference = discriminatorField.type>
 
     // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
-    ${discriminatorField.name} := ${helper.getLanguageTypeNameForField(field)}(${type.name}${discriminatorField.name?cap_first}(i${type.name}))
+    ${discriminatorField.name} := ${helper.getLanguageTypeNameForField(field)}(i.${discriminatorField.name?cap_first}())
     ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
                 <#break>
             <#case "enum">
                 <#assign enumField = field>
 
     // Enum field (${enumField.name})
-    ${enumField.name} := I${helper.getLanguageTypeNameForField(field)}(m.${enumField.name})
+    ${enumField.name} := Cast${helper.getLanguageTypeNameForField(field)}(m.${enumField.name})
     ${enumField.name}.Serialize(io)
                 <#break>
             <#case "implicit">
@@ -772,13 +778,14 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
     // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
     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)>
                     <#assign simpleTypeReference = optionalField.type>
+        ${optionalField.name} = m.${optionalField.name}
         ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "*(" + optionalField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = optionalField.type>
-        (*${optionalField.name}).Serialize(io)
+        ${optionalField.name} = m.${optionalField.name}
+        CastI${helper.getLanguageTypeNameForField(field)}(*${optionalField.name}).Serialize(io)
                 </#if>
     }
                 <#break>
@@ -812,7 +819,7 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
     ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
-    ${simpleField.name} := I${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name})
+    ${simpleField.name} := CastI${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name})
     ${simpleField.name}.Serialize(io)
                 </#if>
                 <#break>
@@ -820,11 +827,16 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArgum
                 <#assign switchField = field>
 
     // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-    i${type.name}.Serialize(io)
+    childSerialize()
                 <#break>
             <#case "virtual">
                 <#break>
         </#switch>
     </#list>
+
+    <#if helper.isDiscriminatedChildTypeDefinition()>
+    }
+    ${type.parentType.name}Serialize(io, m.${type.parentType.name}, CastI${type.parentType.name}(m), ser)
+    </#if>
 }
 </#outputformat>
\ No newline at end of file
diff --git a/sandbox/plc4go/cmd/main/drivers/modbus.go b/sandbox/plc4go/cmd/main/drivers/modbus.go
index 464e221..aa9dde9 100644
--- a/sandbox/plc4go/cmd/main/drivers/modbus.go
+++ b/sandbox/plc4go/cmd/main/drivers/modbus.go
@@ -17,22 +17,31 @@ package drivers
 
 import (
 	"encoding/hex"
+	"fmt"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/modbus/readwrite/model"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
 )
 
 func Modbus() {
+	// Create the input data
+	// "000a 0000 0006 01 03 00 00 00 04"
 	request, err := hex.DecodeString("000a00000006010300000004")
 	if err != nil {
-		// Output an error ...
+		fmt.Errorf("error preparing input buffer")
+		return
 	}
 	rb := spi.ReadBufferNew(request)
 	adu, err := model.ModbusTcpADUParse(*rb, false)
 	if err != nil {
-		// Output an error ...
+		fmt.Errorf("error parsing input")
+		return
 	}
 	if adu != nil {
-		// Output success ...
+		wb := spi.WriteBufferNew()
+		val := model.CastIModbusTcpADU(adu)
+		val.Serialize(*wb)
+		serializedRequest := hex.EncodeToString(wb.GetBytes())
+		fmt.Printf("Got result: %s", serializedRequest)
 	}
 
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
index 1d23087..360873d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
@@ -114,13 +114,13 @@ func APDUParse(io spi.ReadBuffer, apduLength uint16) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m APDU) Serialize(io spi.WriteBuffer) {
-	iAPDU := CastIAPDU(m)
+func APDUSerialize(io spi.WriteBuffer, m APDU, i IAPDU, childSerialize func()) {
 
 	// Discriminator Field (apduType) (Used as input to a switch field)
-	apduType := uint8(APDUApduType(iAPDU))
+	apduType := uint8(i.ApduType())
 	io.WriteUint8(4, (apduType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iAPDU.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
index e7cb54f..ff07cc9 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
@@ -132,19 +132,23 @@ func APDUAbortParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUAbort) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Reserved Field (reserved)
-	io.WriteUint8(3, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(3, uint8(0x00))
 
-	// Simple Field (server)
-	server := bool(m.server)
-	io.WriteBit((bool)(server))
+		// Simple Field (server)
+		server := bool(m.server)
+		io.WriteBit((bool)(server))
 
-	// Simple Field (originalInvokeId)
-	originalInvokeId := uint8(m.originalInvokeId)
-	io.WriteUint8(8, (originalInvokeId))
+		// Simple Field (originalInvokeId)
+		originalInvokeId := uint8(m.originalInvokeId)
+		io.WriteUint8(8, (originalInvokeId))
 
-	// Simple Field (abortReason)
-	abortReason := uint8(m.abortReason)
-	io.WriteUint8(8, (abortReason))
+		// Simple Field (abortReason)
+		abortReason := uint8(m.abortReason)
+		io.WriteUint8(8, (abortReason))
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
index f759f46..3153022 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
@@ -182,37 +182,41 @@ func APDUComplexAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUComplexAck) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (segmentedMessage)
-	segmentedMessage := bool(m.segmentedMessage)
-	io.WriteBit((bool)(segmentedMessage))
+		// Simple Field (segmentedMessage)
+		segmentedMessage := bool(m.segmentedMessage)
+		io.WriteBit((bool)(segmentedMessage))
 
-	// Simple Field (moreFollows)
-	moreFollows := bool(m.moreFollows)
-	io.WriteBit((bool)(moreFollows))
+		// Simple Field (moreFollows)
+		moreFollows := bool(m.moreFollows)
+		io.WriteBit((bool)(moreFollows))
 
-	// Reserved Field (reserved)
-	io.WriteUint8(2, uint8(0))
+		// Reserved Field (reserved)
+		io.WriteUint8(2, uint8(0))
 
-	// Simple Field (originalInvokeId)
-	originalInvokeId := uint8(m.originalInvokeId)
-	io.WriteUint8(8, (originalInvokeId))
+		// Simple Field (originalInvokeId)
+		originalInvokeId := uint8(m.originalInvokeId)
+		io.WriteUint8(8, (originalInvokeId))
 
-	// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
-	var sequenceNumber *uint8 = nil
-	if m.sequenceNumber != nil {
-		sequenceNumber = m.sequenceNumber
-		io.WriteUint8(8, *(sequenceNumber))
-	}
+		// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
+		var sequenceNumber *uint8 = nil
+		if m.sequenceNumber != nil {
+			sequenceNumber = m.sequenceNumber
+			io.WriteUint8(8, *(sequenceNumber))
+		}
 
-	// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
-	var proposedWindowSize *uint8 = nil
-	if m.proposedWindowSize != nil {
-		proposedWindowSize = m.proposedWindowSize
-		io.WriteUint8(8, *(proposedWindowSize))
-	}
+		// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
+		var proposedWindowSize *uint8 = nil
+		if m.proposedWindowSize != nil {
+			proposedWindowSize = m.proposedWindowSize
+			io.WriteUint8(8, *(proposedWindowSize))
+		}
 
-	// Simple Field (serviceAck)
-	serviceAck := IBACnetServiceAck(m.serviceAck)
-	serviceAck.Serialize(io)
+		// Simple Field (serviceAck)
+		serviceAck := CastIBACnetServiceAck(m.serviceAck)
+		serviceAck.Serialize(io)
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
index 01937be..472e697 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -212,49 +212,53 @@ func APDUConfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInitia
 }
 
 func (m APDUConfirmedRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (segmentedMessage)
-	segmentedMessage := bool(m.segmentedMessage)
-	io.WriteBit((bool)(segmentedMessage))
+		// Simple Field (segmentedMessage)
+		segmentedMessage := bool(m.segmentedMessage)
+		io.WriteBit((bool)(segmentedMessage))
 
-	// Simple Field (moreFollows)
-	moreFollows := bool(m.moreFollows)
-	io.WriteBit((bool)(moreFollows))
+		// Simple Field (moreFollows)
+		moreFollows := bool(m.moreFollows)
+		io.WriteBit((bool)(moreFollows))
 
-	// Simple Field (segmentedResponseAccepted)
-	segmentedResponseAccepted := bool(m.segmentedResponseAccepted)
-	io.WriteBit((bool)(segmentedResponseAccepted))
+		// Simple Field (segmentedResponseAccepted)
+		segmentedResponseAccepted := bool(m.segmentedResponseAccepted)
+		io.WriteBit((bool)(segmentedResponseAccepted))
 
-	// Reserved Field (reserved)
-	io.WriteUint8(2, uint8(0))
+		// Reserved Field (reserved)
+		io.WriteUint8(2, uint8(0))
 
-	// Simple Field (maxSegmentsAccepted)
-	maxSegmentsAccepted := uint8(m.maxSegmentsAccepted)
-	io.WriteUint8(3, (maxSegmentsAccepted))
+		// Simple Field (maxSegmentsAccepted)
+		maxSegmentsAccepted := uint8(m.maxSegmentsAccepted)
+		io.WriteUint8(3, (maxSegmentsAccepted))
 
-	// Simple Field (maxApduLengthAccepted)
-	maxApduLengthAccepted := uint8(m.maxApduLengthAccepted)
-	io.WriteUint8(4, (maxApduLengthAccepted))
+		// Simple Field (maxApduLengthAccepted)
+		maxApduLengthAccepted := uint8(m.maxApduLengthAccepted)
+		io.WriteUint8(4, (maxApduLengthAccepted))
 
-	// Simple Field (invokeId)
-	invokeId := uint8(m.invokeId)
-	io.WriteUint8(8, (invokeId))
+		// Simple Field (invokeId)
+		invokeId := uint8(m.invokeId)
+		io.WriteUint8(8, (invokeId))
 
-	// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
-	var sequenceNumber *uint8 = nil
-	if m.sequenceNumber != nil {
-		sequenceNumber = m.sequenceNumber
-		io.WriteUint8(8, *(sequenceNumber))
-	}
+		// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
+		var sequenceNumber *uint8 = nil
+		if m.sequenceNumber != nil {
+			sequenceNumber = m.sequenceNumber
+			io.WriteUint8(8, *(sequenceNumber))
+		}
 
-	// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
-	var proposedWindowSize *uint8 = nil
-	if m.proposedWindowSize != nil {
-		proposedWindowSize = m.proposedWindowSize
-		io.WriteUint8(8, *(proposedWindowSize))
-	}
+		// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
+		var proposedWindowSize *uint8 = nil
+		if m.proposedWindowSize != nil {
+			proposedWindowSize = m.proposedWindowSize
+			io.WriteUint8(8, *(proposedWindowSize))
+		}
 
-	// Simple Field (serviceRequest)
-	serviceRequest := IBACnetConfirmedServiceRequest(m.serviceRequest)
-	serviceRequest.Serialize(io)
+		// Simple Field (serviceRequest)
+		serviceRequest := CastIBACnetConfirmedServiceRequest(m.serviceRequest)
+		serviceRequest.Serialize(io)
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
index c68da33..1bc4b0f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
@@ -128,15 +128,19 @@ func APDUErrorParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUError) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Reserved Field (reserved)
-	io.WriteUint8(4, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(4, uint8(0x00))
 
-	// Simple Field (originalInvokeId)
-	originalInvokeId := uint8(m.originalInvokeId)
-	io.WriteUint8(8, (originalInvokeId))
+		// Simple Field (originalInvokeId)
+		originalInvokeId := uint8(m.originalInvokeId)
+		io.WriteUint8(8, (originalInvokeId))
 
-	// Simple Field (error)
-	error := IBACnetError(m.error)
-	error.Serialize(io)
+		// Simple Field (error)
+		error := CastIBACnetError(m.error)
+		error.Serialize(io)
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
index 3229e73..8be5e2b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
@@ -122,15 +122,19 @@ func APDURejectParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUReject) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Reserved Field (reserved)
-	io.WriteUint8(4, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(4, uint8(0x00))
 
-	// Simple Field (originalInvokeId)
-	originalInvokeId := uint8(m.originalInvokeId)
-	io.WriteUint8(8, (originalInvokeId))
+		// Simple Field (originalInvokeId)
+		originalInvokeId := uint8(m.originalInvokeId)
+		io.WriteUint8(8, (originalInvokeId))
 
-	// Simple Field (rejectReason)
-	rejectReason := uint8(m.rejectReason)
-	io.WriteUint8(8, (rejectReason))
+		// Simple Field (rejectReason)
+		rejectReason := uint8(m.rejectReason)
+		io.WriteUint8(8, (rejectReason))
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
index 92b530c..d25bc53 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
@@ -152,27 +152,31 @@ func APDUSegmentAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUSegmentAck) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Reserved Field (reserved)
-	io.WriteUint8(2, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(2, uint8(0x00))
 
-	// Simple Field (negativeAck)
-	negativeAck := bool(m.negativeAck)
-	io.WriteBit((bool)(negativeAck))
+		// Simple Field (negativeAck)
+		negativeAck := bool(m.negativeAck)
+		io.WriteBit((bool)(negativeAck))
 
-	// Simple Field (server)
-	server := bool(m.server)
-	io.WriteBit((bool)(server))
+		// Simple Field (server)
+		server := bool(m.server)
+		io.WriteBit((bool)(server))
 
-	// Simple Field (originalInvokeId)
-	originalInvokeId := uint8(m.originalInvokeId)
-	io.WriteUint8(8, (originalInvokeId))
+		// Simple Field (originalInvokeId)
+		originalInvokeId := uint8(m.originalInvokeId)
+		io.WriteUint8(8, (originalInvokeId))
 
-	// Simple Field (sequenceNumber)
-	sequenceNumber := uint8(m.sequenceNumber)
-	io.WriteUint8(8, (sequenceNumber))
+		// Simple Field (sequenceNumber)
+		sequenceNumber := uint8(m.sequenceNumber)
+		io.WriteUint8(8, (sequenceNumber))
 
-	// Simple Field (proposedWindowSize)
-	proposedWindowSize := uint8(m.proposedWindowSize)
-	io.WriteUint8(8, (proposedWindowSize))
+		// Simple Field (proposedWindowSize)
+		proposedWindowSize := uint8(m.proposedWindowSize)
+		io.WriteUint8(8, (proposedWindowSize))
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
index b4e6e69..0f53daa 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
@@ -122,15 +122,19 @@ func APDUSimpleAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUSimpleAck) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Reserved Field (reserved)
-	io.WriteUint8(4, uint8(0))
+		// Reserved Field (reserved)
+		io.WriteUint8(4, uint8(0))
 
-	// Simple Field (originalInvokeId)
-	originalInvokeId := uint8(m.originalInvokeId)
-	io.WriteUint8(8, (originalInvokeId))
+		// Simple Field (originalInvokeId)
+		originalInvokeId := uint8(m.originalInvokeId)
+		io.WriteUint8(8, (originalInvokeId))
 
-	// Simple Field (serviceChoice)
-	serviceChoice := uint8(m.serviceChoice)
-	io.WriteUint8(8, (serviceChoice))
+		// Simple Field (serviceChoice)
+		serviceChoice := uint8(m.serviceChoice)
+		io.WriteUint8(8, (serviceChoice))
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
index 1f038fd..0803ee7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
@@ -118,11 +118,15 @@ func APDUUnconfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInit
 }
 
 func (m APDUUnconfirmedRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Reserved Field (reserved)
-	io.WriteUint8(4, uint8(0))
+		// Reserved Field (reserved)
+		io.WriteUint8(4, uint8(0))
 
-	// Simple Field (serviceRequest)
-	serviceRequest := IBACnetUnconfirmedServiceRequest(m.serviceRequest)
-	serviceRequest.Serialize(io)
+		// Simple Field (serviceRequest)
+		serviceRequest := CastIBACnetUnconfirmedServiceRequest(m.serviceRequest)
+		serviceRequest.Serialize(io)
+
+	}
+	APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
index 63d4a6c..106b548 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
@@ -116,4 +116,5 @@ func (m BACnetAddress) Serialize(io spi.WriteBuffer) {
 	// Simple Field (port)
 	port := uint16(m.port)
 	io.WriteUint16(16, (port))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
index 029f5fd..86be560 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
@@ -126,13 +126,13 @@ func BACnetConfirmedServiceACKParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m BACnetConfirmedServiceACK) Serialize(io spi.WriteBuffer) {
-	iBACnetConfirmedServiceACK := CastIBACnetConfirmedServiceACK(m)
+func BACnetConfirmedServiceACKSerialize(io spi.WriteBuffer, m BACnetConfirmedServiceACK, i IBACnetConfirmedServiceACK, childSerialize func()) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	serviceChoice := uint8(BACnetConfirmedServiceACKServiceChoice(iBACnetConfirmedServiceACK))
+	serviceChoice := uint8(i.ServiceChoice())
 	io.WriteUint8(8, (serviceChoice))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iBACnetConfirmedServiceACK.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
index 63ed1b7..8484782 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKAtomicReadFileParse(io spi.ReadBuffer) (BACnetConf
 }
 
 func (m BACnetConfirmedServiceACKAtomicReadFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
index e8c1993..836bef8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKAtomicWriteFileParse(io spi.ReadBuffer) (BACnetCon
 }
 
 func (m BACnetConfirmedServiceACKAtomicWriteFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
index b303ab8..30c3090 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKConfirmedPrivateTransferParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
index 9b05f84..c61faa1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKCreateObjectParse(io spi.ReadBuffer) (BACnetConfir
 }
 
 func (m BACnetConfirmedServiceACKCreateObject) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
index 1496478..5c02bfd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKGetAlarmSummaryParse(io spi.ReadBuffer) (BACnetCon
 }
 
 func (m BACnetConfirmedServiceACKGetAlarmSummary) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
index d9d1fa8..a25b3a7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKGetEnrollmentSummaryParse(io spi.ReadBuffer) (BACn
 }
 
 func (m BACnetConfirmedServiceACKGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
index 0b94cc2..591d8c7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKGetEventInformationParse(io spi.ReadBuffer) (BACne
 }
 
 func (m BACnetConfirmedServiceACKGetEventInformation) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
index 28a9d27..8db496a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKReadPropertyParse(io spi.ReadBuffer) (BACnetConfir
 }
 
 func (m BACnetConfirmedServiceACKReadProperty) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
index 79a6be6..447e181 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKReadPropertyMultipleParse(io spi.ReadBuffer) (BACn
 }
 
 func (m BACnetConfirmedServiceACKReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
index 93bdf3a..b9e22e9 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKReadRangeParse(io spi.ReadBuffer) (BACnetConfirmed
 }
 
 func (m BACnetConfirmedServiceACKReadRange) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
index be7c544..2b97bb1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKRemovedAuthenticateParse(io spi.ReadBuffer) (BACne
 }
 
 func (m BACnetConfirmedServiceACKRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
index d410901..9eeb923 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKRemovedReadPropertyConditionalParse(io spi.ReadBuf
 }
 
 func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
index 005ccac..47485b4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKVTDataParse(io spi.ReadBuffer) (BACnetConfirmedSer
 }
 
 func (m BACnetConfirmedServiceACKVTData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
index 9896b0b..2683f1e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceACKVTOpenParse(io spi.ReadBuffer) (BACnetConfirmedSer
 }
 
 func (m BACnetConfirmedServiceACKVTOpen) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
index 5a75ede..ac4a544 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
@@ -172,13 +172,13 @@ func BACnetConfirmedServiceRequestParse(io spi.ReadBuffer, len uint16) (spi.Mess
 	return initializer.initialize(), nil
 }
 
-func (m BACnetConfirmedServiceRequest) Serialize(io spi.WriteBuffer) {
-	iBACnetConfirmedServiceRequest := CastIBACnetConfirmedServiceRequest(m)
+func BACnetConfirmedServiceRequestSerialize(io spi.WriteBuffer, m BACnetConfirmedServiceRequest, i IBACnetConfirmedServiceRequest, childSerialize func()) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	serviceChoice := uint8(BACnetConfirmedServiceRequestServiceChoice(iBACnetConfirmedServiceRequest))
+	serviceChoice := uint8(i.ServiceChoice())
 	io.WriteUint8(8, (serviceChoice))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iBACnetConfirmedServiceRequest.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
index 4383dc1..5a833b9 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestAcknowledgeAlarmParse(io spi.ReadBuffer) (BACn
 }
 
 func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
index ecc2677..b024406 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestAddListElementParse(io spi.ReadBuffer) (BACnet
 }
 
 func (m BACnetConfirmedServiceRequestAddListElement) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
index a5651cf..9460ecc 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestAtomicReadFileParse(io spi.ReadBuffer) (BACnet
 }
 
 func (m BACnetConfirmedServiceRequestAtomicReadFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
index 640ec8a..849d0d5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestAtomicWriteFileParse(io spi.ReadBuffer) (BACne
 }
 
 func (m BACnetConfirmedServiceRequestAtomicWriteFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
index f8c1116..6bd2736 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
@@ -273,60 +273,64 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io spi.ReadBuffe
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (subscriberProcessIdentifierHeader)
-	io.WriteUint8(8, 0x09)
+		// Const Field (subscriberProcessIdentifierHeader)
+		io.WriteUint8(8, 0x09)
 
-	// Simple Field (subscriberProcessIdentifier)
-	subscriberProcessIdentifier := uint8(m.subscriberProcessIdentifier)
-	io.WriteUint8(8, (subscriberProcessIdentifier))
+		// Simple Field (subscriberProcessIdentifier)
+		subscriberProcessIdentifier := uint8(m.subscriberProcessIdentifier)
+		io.WriteUint8(8, (subscriberProcessIdentifier))
 
-	// Const Field (monitoredObjectIdentifierHeader)
-	io.WriteUint8(8, 0x1C)
+		// Const Field (monitoredObjectIdentifierHeader)
+		io.WriteUint8(8, 0x1C)
 
-	// Simple Field (monitoredObjectType)
-	monitoredObjectType := uint16(m.monitoredObjectType)
-	io.WriteUint16(10, (monitoredObjectType))
+		// Simple Field (monitoredObjectType)
+		monitoredObjectType := uint16(m.monitoredObjectType)
+		io.WriteUint16(10, (monitoredObjectType))
 
-	// Simple Field (monitoredObjectInstanceNumber)
-	monitoredObjectInstanceNumber := uint32(m.monitoredObjectInstanceNumber)
-	io.WriteUint32(22, (monitoredObjectInstanceNumber))
+		// Simple Field (monitoredObjectInstanceNumber)
+		monitoredObjectInstanceNumber := uint32(m.monitoredObjectInstanceNumber)
+		io.WriteUint32(22, (monitoredObjectInstanceNumber))
 
-	// Const Field (issueConfirmedNotificationsHeader)
-	io.WriteUint8(8, 0x2C)
+		// Const Field (issueConfirmedNotificationsHeader)
+		io.WriteUint8(8, 0x2C)
 
-	// Simple Field (issueConfirmedNotificationsType)
-	issueConfirmedNotificationsType := uint16(m.issueConfirmedNotificationsType)
-	io.WriteUint16(10, (issueConfirmedNotificationsType))
+		// Simple Field (issueConfirmedNotificationsType)
+		issueConfirmedNotificationsType := uint16(m.issueConfirmedNotificationsType)
+		io.WriteUint16(10, (issueConfirmedNotificationsType))
 
-	// Simple Field (issueConfirmedNotificationsInstanceNumber)
-	issueConfirmedNotificationsInstanceNumber := uint32(m.issueConfirmedNotificationsInstanceNumber)
-	io.WriteUint32(22, (issueConfirmedNotificationsInstanceNumber))
+		// Simple Field (issueConfirmedNotificationsInstanceNumber)
+		issueConfirmedNotificationsInstanceNumber := uint32(m.issueConfirmedNotificationsInstanceNumber)
+		io.WriteUint32(22, (issueConfirmedNotificationsInstanceNumber))
 
-	// Const Field (lifetimeHeader)
-	io.WriteUint8(5, 0x07)
+		// Const Field (lifetimeHeader)
+		io.WriteUint8(5, 0x07)
 
-	// Simple Field (lifetimeLength)
-	lifetimeLength := uint8(m.lifetimeLength)
-	io.WriteUint8(3, (lifetimeLength))
+		// Simple Field (lifetimeLength)
+		lifetimeLength := uint8(m.lifetimeLength)
+		io.WriteUint8(3, (lifetimeLength))
 
-	// Array Field (lifetimeSeconds)
-	if m.lifetimeSeconds != nil {
-		for _, _element := range m.lifetimeSeconds {
-			io.WriteInt8(8, _element)
+		// Array Field (lifetimeSeconds)
+		if m.lifetimeSeconds != nil {
+			for _, _element := range m.lifetimeSeconds {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Const Field (listOfValuesOpeningTag)
-	io.WriteUint8(8, 0x4E)
+		// Const Field (listOfValuesOpeningTag)
+		io.WriteUint8(8, 0x4E)
 
-	// Array Field (notifications)
-	if m.notifications != nil {
-		for _, _element := range m.notifications {
-			_element.Serialize(io)
+		// Array Field (notifications)
+		if m.notifications != nil {
+			for _, _element := range m.notifications {
+				_element.Serialize(io)
+			}
 		}
-	}
 
-	// Const Field (listOfValuesClosingTag)
-	io.WriteUint8(8, 0x4F)
+		// Const Field (listOfValuesClosingTag)
+		io.WriteUint8(8, 0x4F)
+
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
index 63c37fb..75f77f4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationMultipleParse(io spi.R
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
index a5d1af4..7729529 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestConfirmedEventNotificationParse(io spi.ReadBuf
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedEventNotification) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
index 007d4f3..7eca520 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(io spi.ReadBuffe
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
index 53897a6..b4c7a2a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestConfirmedTextMessageParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedTextMessage) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
index b761613..29b065c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestCreateObjectParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestCreateObject) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
index 368a078..e3cb64e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestDeleteObjectParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestDeleteObject) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
index 2e5f0bc..354c6f4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestDeviceCommunicationControlParse(io spi.ReadBuf
 }
 
 func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
index c588e2b..f51cd44 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestGetEnrollmentSummaryParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
index ba6d8b1..63588cd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestGetEventInformationParse(io spi.ReadBuffer) (B
 }
 
 func (m BACnetConfirmedServiceRequestGetEventInformation) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
index 7882533..b642807 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestLifeSafetyOperationParse(io spi.ReadBuffer) (B
 }
 
 func (m BACnetConfirmedServiceRequestLifeSafetyOperation) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
index 54938d4..92f4932 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
@@ -164,29 +164,33 @@ func BACnetConfirmedServiceRequestReadPropertyParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestReadProperty) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (objectIdentifierHeader)
-	io.WriteUint8(8, 0x0C)
+		// Const Field (objectIdentifierHeader)
+		io.WriteUint8(8, 0x0C)
 
-	// Simple Field (objectType)
-	objectType := uint16(m.objectType)
-	io.WriteUint16(10, (objectType))
+		// Simple Field (objectType)
+		objectType := uint16(m.objectType)
+		io.WriteUint16(10, (objectType))
 
-	// Simple Field (objectInstanceNumber)
-	objectInstanceNumber := uint32(m.objectInstanceNumber)
-	io.WriteUint32(22, (objectInstanceNumber))
+		// Simple Field (objectInstanceNumber)
+		objectInstanceNumber := uint32(m.objectInstanceNumber)
+		io.WriteUint32(22, (objectInstanceNumber))
 
-	// Const Field (propertyIdentifierHeader)
-	io.WriteUint8(5, 0x03)
+		// Const Field (propertyIdentifierHeader)
+		io.WriteUint8(5, 0x03)
 
-	// Simple Field (propertyIdentifierLength)
-	propertyIdentifierLength := uint8(m.propertyIdentifierLength)
-	io.WriteUint8(3, (propertyIdentifierLength))
+		// Simple Field (propertyIdentifierLength)
+		propertyIdentifierLength := uint8(m.propertyIdentifierLength)
+		io.WriteUint8(3, (propertyIdentifierLength))
 
-	// Array Field (propertyIdentifier)
-	if m.propertyIdentifier != nil {
-		for _, _element := range m.propertyIdentifier {
-			io.WriteInt8(8, _element)
+		// Array Field (propertyIdentifier)
+		if m.propertyIdentifier != nil {
+			for _, _element := range m.propertyIdentifier {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
index 7b06d35..ae796a2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestReadPropertyMultipleParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
index 235c47c..a0da68b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestReadRangeParse(io spi.ReadBuffer) (BACnetConfi
 }
 
 func (m BACnetConfirmedServiceRequestReadRange) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
index c676cc2..f613f29 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestReinitializeDeviceParse(io spi.ReadBuffer) (BA
 }
 
 func (m BACnetConfirmedServiceRequestReinitializeDevice) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
index be7fbc9..08d6d64 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestRemoveListElementParse(io spi.ReadBuffer) (BAC
 }
 
 func (m BACnetConfirmedServiceRequestRemoveListElement) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
index 35c217e..f6396f1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestRemovedAuthenticateParse(io spi.ReadBuffer) (B
 }
 
 func (m BACnetConfirmedServiceRequestRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
index e2e3f54..57aaa63 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestRemovedReadPropertyConditionalParse(io spi.Rea
 }
 
 func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
index 4372335..766c3d6 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestRemovedRequestKeyParse(io spi.ReadBuffer) (BAC
 }
 
 func (m BACnetConfirmedServiceRequestRemovedRequestKey) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
index 727ceb8..eb3848e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
@@ -223,46 +223,50 @@ func BACnetConfirmedServiceRequestSubscribeCOVParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestSubscribeCOV) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (subscriberProcessIdentifierHeader)
-	io.WriteUint8(8, 0x09)
+		// Const Field (subscriberProcessIdentifierHeader)
+		io.WriteUint8(8, 0x09)
 
-	// Simple Field (subscriberProcessIdentifier)
-	subscriberProcessIdentifier := uint8(m.subscriberProcessIdentifier)
-	io.WriteUint8(8, (subscriberProcessIdentifier))
+		// Simple Field (subscriberProcessIdentifier)
+		subscriberProcessIdentifier := uint8(m.subscriberProcessIdentifier)
+		io.WriteUint8(8, (subscriberProcessIdentifier))
 
-	// Const Field (monitoredObjectIdentifierHeader)
-	io.WriteUint8(8, 0x1C)
+		// Const Field (monitoredObjectIdentifierHeader)
+		io.WriteUint8(8, 0x1C)
 
-	// Simple Field (monitoredObjectType)
-	monitoredObjectType := uint16(m.monitoredObjectType)
-	io.WriteUint16(10, (monitoredObjectType))
+		// Simple Field (monitoredObjectType)
+		monitoredObjectType := uint16(m.monitoredObjectType)
+		io.WriteUint16(10, (monitoredObjectType))
 
-	// Simple Field (monitoredObjectInstanceNumber)
-	monitoredObjectInstanceNumber := uint32(m.monitoredObjectInstanceNumber)
-	io.WriteUint32(22, (monitoredObjectInstanceNumber))
+		// Simple Field (monitoredObjectInstanceNumber)
+		monitoredObjectInstanceNumber := uint32(m.monitoredObjectInstanceNumber)
+		io.WriteUint32(22, (monitoredObjectInstanceNumber))
 
-	// Const Field (issueConfirmedNotificationsHeader)
-	io.WriteUint8(8, 0x29)
+		// Const Field (issueConfirmedNotificationsHeader)
+		io.WriteUint8(8, 0x29)
 
-	// Const Field (issueConfirmedNotificationsSkipBits)
-	io.WriteUint8(7, 0x00)
+		// Const Field (issueConfirmedNotificationsSkipBits)
+		io.WriteUint8(7, 0x00)
 
-	// Simple Field (issueConfirmedNotifications)
-	issueConfirmedNotifications := bool(m.issueConfirmedNotifications)
-	io.WriteBit((bool)(issueConfirmedNotifications))
+		// Simple Field (issueConfirmedNotifications)
+		issueConfirmedNotifications := bool(m.issueConfirmedNotifications)
+		io.WriteBit((bool)(issueConfirmedNotifications))
 
-	// Const Field (lifetimeHeader)
-	io.WriteUint8(5, 0x07)
+		// Const Field (lifetimeHeader)
+		io.WriteUint8(5, 0x07)
 
-	// Simple Field (lifetimeLength)
-	lifetimeLength := uint8(m.lifetimeLength)
-	io.WriteUint8(3, (lifetimeLength))
+		// Simple Field (lifetimeLength)
+		lifetimeLength := uint8(m.lifetimeLength)
+		io.WriteUint8(3, (lifetimeLength))
 
-	// Array Field (lifetimeSeconds)
-	if m.lifetimeSeconds != nil {
-		for _, _element := range m.lifetimeSeconds {
-			io.WriteInt8(8, _element)
+		// Array Field (lifetimeSeconds)
+		if m.lifetimeSeconds != nil {
+			for _, _element := range m.lifetimeSeconds {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
index a232600..227ed88 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestSubscribeCOVPropertyParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
index 729cf30..97d4ad2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestSubscribeCOVPropertyMultipleParse(io spi.ReadB
 }
 
 func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
index fd7c4be..3b35ceb 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestVTCloseParse(io spi.ReadBuffer) (BACnetConfirm
 }
 
 func (m BACnetConfirmedServiceRequestVTClose) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
index b28a3e2..fbbbfd5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestVTDataParse(io spi.ReadBuffer) (BACnetConfirme
 }
 
 func (m BACnetConfirmedServiceRequestVTData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
index af59c05..acddeb0 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestVTOpenParse(io spi.ReadBuffer) (BACnetConfirme
 }
 
 func (m BACnetConfirmedServiceRequestVTOpen) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
index 80fb4d4..07664c4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
@@ -230,46 +230,50 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io spi.ReadBuffer, len uint
 }
 
 func (m BACnetConfirmedServiceRequestWriteProperty) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (objectIdentifierHeader)
-	io.WriteUint8(8, 0x0C)
+		// Const Field (objectIdentifierHeader)
+		io.WriteUint8(8, 0x0C)
 
-	// Simple Field (objectType)
-	objectType := uint16(m.objectType)
-	io.WriteUint16(10, (objectType))
+		// Simple Field (objectType)
+		objectType := uint16(m.objectType)
+		io.WriteUint16(10, (objectType))
 
-	// Simple Field (objectInstanceNumber)
-	objectInstanceNumber := uint32(m.objectInstanceNumber)
-	io.WriteUint32(22, (objectInstanceNumber))
+		// Simple Field (objectInstanceNumber)
+		objectInstanceNumber := uint32(m.objectInstanceNumber)
+		io.WriteUint32(22, (objectInstanceNumber))
 
-	// Const Field (propertyIdentifierHeader)
-	io.WriteUint8(5, 0x03)
+		// Const Field (propertyIdentifierHeader)
+		io.WriteUint8(5, 0x03)
 
-	// Simple Field (propertyIdentifierLength)
-	propertyIdentifierLength := uint8(m.propertyIdentifierLength)
-	io.WriteUint8(3, (propertyIdentifierLength))
+		// Simple Field (propertyIdentifierLength)
+		propertyIdentifierLength := uint8(m.propertyIdentifierLength)
+		io.WriteUint8(3, (propertyIdentifierLength))
 
-	// Array Field (propertyIdentifier)
-	if m.propertyIdentifier != nil {
-		for _, _element := range m.propertyIdentifier {
-			io.WriteInt8(8, _element)
+		// Array Field (propertyIdentifier)
+		if m.propertyIdentifier != nil {
+			for _, _element := range m.propertyIdentifier {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Const Field (openingTag)
-	io.WriteUint8(8, 0x3E)
+		// Const Field (openingTag)
+		io.WriteUint8(8, 0x3E)
 
-	// Simple Field (value)
-	value := IBACnetTag(m.value)
-	value.Serialize(io)
+		// Simple Field (value)
+		value := CastIBACnetTag(m.value)
+		value.Serialize(io)
 
-	// Const Field (closingTag)
-	io.WriteUint8(8, 0x3F)
+		// Const Field (closingTag)
+		io.WriteUint8(8, 0x3F)
+
+		// Optional Field (priority) (Can be skipped, if the value is null)
+		var priority *IBACnetTag = nil
+		if m.priority != nil {
+			priority = m.priority
+			CastIBACnetTag(*priority).Serialize(io)
+		}
 
-	// Optional Field (priority) (Can be skipped, if the value is null)
-	var priority *IBACnetTag = nil
-	if m.priority != nil {
-		priority = m.priority
-		(*priority).Serialize(io)
 	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go
index cb49f35..30d10fa 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go
@@ -83,5 +83,8 @@ func BACnetConfirmedServiceRequestWritePropertyMultipleParse(io spi.ReadBuffer)
 }
 
 func (m BACnetConfirmedServiceRequestWritePropertyMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
index bb6debd..1e3cce8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
@@ -126,13 +126,13 @@ func BACnetErrorParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m BACnetError) Serialize(io spi.WriteBuffer) {
-	iBACnetError := CastIBACnetError(m)
+func BACnetErrorSerialize(io spi.WriteBuffer, m BACnetError, i IBACnetError, childSerialize func()) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	serviceChoice := uint8(BACnetErrorServiceChoice(iBACnetError))
+	serviceChoice := uint8(i.ServiceChoice())
 	io.WriteUint8(8, (serviceChoice))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iBACnetError.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go
index 3cca193..59e81f9 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go
@@ -83,5 +83,8 @@ func BACnetErrorAtomicReadFileParse(io spi.ReadBuffer) (BACnetErrorInitializer,
 }
 
 func (m BACnetErrorAtomicReadFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go
index 32e4873..b12ff8b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go
@@ -83,5 +83,8 @@ func BACnetErrorAtomicWriteFileParse(io spi.ReadBuffer) (BACnetErrorInitializer,
 }
 
 func (m BACnetErrorAtomicWriteFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go
index ca7ca10..35b5714 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go
@@ -83,5 +83,8 @@ func BACnetErrorConfirmedPrivateTransferParse(io spi.ReadBuffer) (BACnetErrorIni
 }
 
 func (m BACnetErrorConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go
index c14c5b4..8049a10 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go
@@ -83,5 +83,8 @@ func BACnetErrorCreateObjectParse(io spi.ReadBuffer) (BACnetErrorInitializer, er
 }
 
 func (m BACnetErrorCreateObject) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go
index 97f44aa..3a93bc2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go
@@ -83,5 +83,8 @@ func BACnetErrorGetAlarmSummaryParse(io spi.ReadBuffer) (BACnetErrorInitializer,
 }
 
 func (m BACnetErrorGetAlarmSummary) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go
index cdeb293..1b42e5b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go
@@ -83,5 +83,8 @@ func BACnetErrorGetEnrollmentSummaryParse(io spi.ReadBuffer) (BACnetErrorInitial
 }
 
 func (m BACnetErrorGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go
index 03255f2..1a34416 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go
@@ -83,5 +83,8 @@ func BACnetErrorGetEventInformationParse(io spi.ReadBuffer) (BACnetErrorInitiali
 }
 
 func (m BACnetErrorGetEventInformation) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
index 90523ae..545756c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
@@ -175,32 +175,36 @@ func BACnetErrorReadPropertyParse(io spi.ReadBuffer) (BACnetErrorInitializer, er
 }
 
 func (m BACnetErrorReadProperty) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (errorClassHeader)
-	io.WriteUint8(5, 0x12)
+		// Const Field (errorClassHeader)
+		io.WriteUint8(5, 0x12)
 
-	// Simple Field (errorClassLength)
-	errorClassLength := uint8(m.errorClassLength)
-	io.WriteUint8(3, (errorClassLength))
+		// Simple Field (errorClassLength)
+		errorClassLength := uint8(m.errorClassLength)
+		io.WriteUint8(3, (errorClassLength))
 
-	// Array Field (errorClass)
-	if m.errorClass != nil {
-		for _, _element := range m.errorClass {
-			io.WriteInt8(8, _element)
+		// Array Field (errorClass)
+		if m.errorClass != nil {
+			for _, _element := range m.errorClass {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Const Field (errorCodeHeader)
-	io.WriteUint8(5, 0x12)
+		// Const Field (errorCodeHeader)
+		io.WriteUint8(5, 0x12)
 
-	// Simple Field (errorCodeLength)
-	errorCodeLength := uint8(m.errorCodeLength)
-	io.WriteUint8(3, (errorCodeLength))
+		// Simple Field (errorCodeLength)
+		errorCodeLength := uint8(m.errorCodeLength)
+		io.WriteUint8(3, (errorCodeLength))
 
-	// Array Field (errorCode)
-	if m.errorCode != nil {
-		for _, _element := range m.errorCode {
-			io.WriteInt8(8, _element)
+		// Array Field (errorCode)
+		if m.errorCode != nil {
+			for _, _element := range m.errorCode {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go
index a24496e..df95314 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go
@@ -83,5 +83,8 @@ func BACnetErrorReadPropertyMultipleParse(io spi.ReadBuffer) (BACnetErrorInitial
 }
 
 func (m BACnetErrorReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go
index ede7d1f..19749e6 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go
@@ -83,5 +83,8 @@ func BACnetErrorReadRangeParse(io spi.ReadBuffer) (BACnetErrorInitializer, error
 }
 
 func (m BACnetErrorReadRange) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go
index 8b80694..822b39c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go
@@ -83,5 +83,8 @@ func BACnetErrorRemovedAuthenticateParse(io spi.ReadBuffer) (BACnetErrorInitiali
 }
 
 func (m BACnetErrorRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go
index d412743..6ddecc8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go
@@ -83,5 +83,8 @@ func BACnetErrorRemovedReadPropertyConditionalParse(io spi.ReadBuffer) (BACnetEr
 }
 
 func (m BACnetErrorRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go
index e2ab52d..d4edacd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go
@@ -83,5 +83,8 @@ func BACnetErrorVTDataParse(io spi.ReadBuffer) (BACnetErrorInitializer, error) {
 }
 
 func (m BACnetErrorVTData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go
index 537dd7d..2f043b5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go
@@ -83,5 +83,8 @@ func BACnetErrorVTOpenParse(io spi.ReadBuffer) (BACnetErrorInitializer, error) {
 }
 
 func (m BACnetErrorVTOpen) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetErrorSerialize(io, m.BACnetError, CastIBACnetError(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
index 7cf12c0..d810c33 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
@@ -126,13 +126,13 @@ func BACnetServiceAckParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m BACnetServiceAck) Serialize(io spi.WriteBuffer) {
-	iBACnetServiceAck := CastIBACnetServiceAck(m)
+func BACnetServiceAckSerialize(io spi.WriteBuffer, m BACnetServiceAck, i IBACnetServiceAck, childSerialize func()) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	serviceChoice := uint8(BACnetServiceAckServiceChoice(iBACnetServiceAck))
+	serviceChoice := uint8(i.ServiceChoice())
 	io.WriteUint8(8, (serviceChoice))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iBACnetServiceAck.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go
index 80759d4..cacfb3e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go
@@ -83,5 +83,8 @@ func BACnetServiceAckAtomicReadFileParse(io spi.ReadBuffer) (BACnetServiceAckIni
 }
 
 func (m BACnetServiceAckAtomicReadFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go
index ef621d2..d50795a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go
@@ -83,5 +83,8 @@ func BACnetServiceAckAtomicWriteFileParse(io spi.ReadBuffer) (BACnetServiceAckIn
 }
 
 func (m BACnetServiceAckAtomicWriteFile) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
index 220cf6c..d4e46ef 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
@@ -83,5 +83,8 @@ func BACnetServiceAckConfirmedPrivateTransferParse(io spi.ReadBuffer) (BACnetSer
 }
 
 func (m BACnetServiceAckConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
index 8ae2a81..1720452 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
@@ -83,5 +83,8 @@ func BACnetServiceAckCreateObjectParse(io spi.ReadBuffer) (BACnetServiceAckIniti
 }
 
 func (m BACnetServiceAckCreateObject) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
index 1fda891..de13799 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
@@ -83,5 +83,8 @@ func BACnetServiceAckGetAlarmSummaryParse(io spi.ReadBuffer) (BACnetServiceAckIn
 }
 
 func (m BACnetServiceAckGetAlarmSummary) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
index fb33a0e..2857ae6 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
@@ -83,5 +83,8 @@ func BACnetServiceAckGetEnrollmentSummaryParse(io spi.ReadBuffer) (BACnetService
 }
 
 func (m BACnetServiceAckGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go
index c0bd245..d118945 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go
@@ -83,5 +83,8 @@ func BACnetServiceAckGetEventInformationParse(io spi.ReadBuffer) (BACnetServiceA
 }
 
 func (m BACnetServiceAckGetEventInformation) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
index 31740c5..a641eff 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
@@ -206,39 +206,43 @@ func BACnetServiceAckReadPropertyParse(io spi.ReadBuffer) (BACnetServiceAckIniti
 }
 
 func (m BACnetServiceAckReadProperty) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (objectIdentifierHeader)
-	io.WriteUint8(8, 0x0C)
+		// Const Field (objectIdentifierHeader)
+		io.WriteUint8(8, 0x0C)
 
-	// Simple Field (objectType)
-	objectType := uint16(m.objectType)
-	io.WriteUint16(10, (objectType))
+		// Simple Field (objectType)
+		objectType := uint16(m.objectType)
+		io.WriteUint16(10, (objectType))
 
-	// Simple Field (objectInstanceNumber)
-	objectInstanceNumber := uint32(m.objectInstanceNumber)
-	io.WriteUint32(22, (objectInstanceNumber))
+		// Simple Field (objectInstanceNumber)
+		objectInstanceNumber := uint32(m.objectInstanceNumber)
+		io.WriteUint32(22, (objectInstanceNumber))
 
-	// Const Field (propertyIdentifierHeader)
-	io.WriteUint8(5, 0x03)
+		// Const Field (propertyIdentifierHeader)
+		io.WriteUint8(5, 0x03)
 
-	// Simple Field (propertyIdentifierLength)
-	propertyIdentifierLength := uint8(m.propertyIdentifierLength)
-	io.WriteUint8(3, (propertyIdentifierLength))
+		// Simple Field (propertyIdentifierLength)
+		propertyIdentifierLength := uint8(m.propertyIdentifierLength)
+		io.WriteUint8(3, (propertyIdentifierLength))
 
-	// Array Field (propertyIdentifier)
-	if m.propertyIdentifier != nil {
-		for _, _element := range m.propertyIdentifier {
-			io.WriteInt8(8, _element)
+		// Array Field (propertyIdentifier)
+		if m.propertyIdentifier != nil {
+			for _, _element := range m.propertyIdentifier {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Const Field (openingTag)
-	io.WriteUint8(8, 0x3E)
+		// Const Field (openingTag)
+		io.WriteUint8(8, 0x3E)
 
-	// Simple Field (value)
-	value := IBACnetTag(m.value)
-	value.Serialize(io)
+		// Simple Field (value)
+		value := CastIBACnetTag(m.value)
+		value.Serialize(io)
 
-	// Const Field (closingTag)
-	io.WriteUint8(8, 0x3F)
+		// Const Field (closingTag)
+		io.WriteUint8(8, 0x3F)
+
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go
index b58bc86..189f03e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go
@@ -83,5 +83,8 @@ func BACnetServiceAckReadPropertyMultipleParse(io spi.ReadBuffer) (BACnetService
 }
 
 func (m BACnetServiceAckReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
index e8f56dc..7603d13 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
@@ -83,5 +83,8 @@ func BACnetServiceAckReadRangeParse(io spi.ReadBuffer) (BACnetServiceAckInitiali
 }
 
 func (m BACnetServiceAckReadRange) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go
index 5c4aca7..9ebcaff 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go
@@ -83,5 +83,8 @@ func BACnetServiceAckRemovedAuthenticateParse(io spi.ReadBuffer) (BACnetServiceA
 }
 
 func (m BACnetServiceAckRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go
index df02236..b3d5a03 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go
@@ -83,5 +83,8 @@ func BACnetServiceAckRemovedReadPropertyConditionalParse(io spi.ReadBuffer) (BAC
 }
 
 func (m BACnetServiceAckRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
index d663304..eb6a39b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
@@ -83,5 +83,8 @@ func BACnetServiceAckVTDataParse(io spi.ReadBuffer) (BACnetServiceAckInitializer
 }
 
 func (m BACnetServiceAckVTData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
index 891735d..b63b74e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
@@ -83,5 +83,8 @@ func BACnetServiceAckVTOpenParse(io spi.ReadBuffer) (BACnetServiceAckInitializer
 }
 
 func (m BACnetServiceAckVTOpen) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetServiceAckSerialize(io, m.BACnetServiceAck, CastIBACnetServiceAck(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
index 3bb6d07..53be709 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
@@ -180,15 +180,14 @@ func BACnetTagParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(typeOrTagNumber, lengthValueType, extTagNumber, extLength), nil
 }
 
-func (m BACnetTag) Serialize(io spi.WriteBuffer) {
-	iBACnetTag := CastIBACnetTag(m)
+func BACnetTagSerialize(io spi.WriteBuffer, m BACnetTag, i IBACnetTag, childSerialize func()) {
 
 	// Simple Field (typeOrTagNumber)
 	typeOrTagNumber := uint8(m.typeOrTagNumber)
 	io.WriteUint8(4, (typeOrTagNumber))
 
 	// Discriminator Field (contextSpecificTag) (Used as input to a switch field)
-	contextSpecificTag := uint8(BACnetTagContextSpecificTag(iBACnetTag))
+	contextSpecificTag := uint8(i.ContextSpecificTag())
 	io.WriteUint8(1, (contextSpecificTag))
 
 	// Simple Field (lengthValueType)
@@ -210,5 +209,6 @@ func (m BACnetTag) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iBACnetTag.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
index 804879d..ae7150c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
@@ -117,15 +117,19 @@ func BACnetTagApplicationBitStringParse(io spi.ReadBuffer, lengthValueType uint8
 }
 
 func (m BACnetTagApplicationBitString) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (unusedBits)
-	unusedBits := uint8(m.unusedBits)
-	io.WriteUint8(8, (unusedBits))
+		// Simple Field (unusedBits)
+		unusedBits := uint8(m.unusedBits)
+		io.WriteUint8(8, (unusedBits))
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteInt8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go
index de0eef8..890751f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go
@@ -87,5 +87,8 @@ func BACnetTagApplicationBooleanParse(io spi.ReadBuffer) (BACnetTagInitializer,
 }
 
 func (m BACnetTagApplicationBoolean) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
index 5e8267a..ce498df 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
@@ -87,5 +87,8 @@ func BACnetTagApplicationCharacterStringParse(io spi.ReadBuffer) (BACnetTagIniti
 }
 
 func (m BACnetTagApplicationCharacterString) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go
index e162473..660230b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go
@@ -87,5 +87,8 @@ func BACnetTagApplicationDateParse(io spi.ReadBuffer) (BACnetTagInitializer, err
 }
 
 func (m BACnetTagApplicationDate) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
index 0439430..92a4ea8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
@@ -98,8 +98,12 @@ func BACnetTagApplicationDoubleParse(io spi.ReadBuffer, lengthValueType uint8, e
 }
 
 func (m BACnetTagApplicationDouble) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (value)
-	value := float64(m.value)
-	io.WriteFloat64(64, (value))
+		// Simple Field (value)
+		value := float64(m.value)
+		io.WriteFloat64(64, (value))
+
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
index 1099853..6981d57 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
@@ -107,11 +107,15 @@ func BACnetTagApplicationEnumeratedParse(io spi.ReadBuffer, lengthValueType uint
 }
 
 func (m BACnetTagApplicationEnumerated) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteInt8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go
index 7517310..9cd921e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go
@@ -87,5 +87,8 @@ func BACnetTagApplicationNullParse(io spi.ReadBuffer) (BACnetTagInitializer, err
 }
 
 func (m BACnetTagApplicationNull) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
index eb43208..077d6d7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
@@ -87,5 +87,8 @@ func BACnetTagApplicationObjectIdentifierParse(io spi.ReadBuffer) (BACnetTagInit
 }
 
 func (m BACnetTagApplicationObjectIdentifier) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
index 1de7c5e..065c915 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
@@ -87,5 +87,8 @@ func BACnetTagApplicationOctetStringParse(io spi.ReadBuffer) (BACnetTagInitializ
 }
 
 func (m BACnetTagApplicationOctetString) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
index d50514d..962e8d1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
@@ -98,8 +98,12 @@ func BACnetTagApplicationRealParse(io spi.ReadBuffer, lengthValueType uint8, ext
 }
 
 func (m BACnetTagApplicationReal) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (value)
-	value := float32(m.value)
-	io.WriteFloat32(32, (value))
+		// Simple Field (value)
+		value := float32(m.value)
+		io.WriteFloat32(32, (value))
+
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
index 419bde2..8e88559 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
@@ -107,11 +107,15 @@ func BACnetTagApplicationSignedIntegerParse(io spi.ReadBuffer, lengthValueType u
 }
 
 func (m BACnetTagApplicationSignedInteger) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteInt8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go
index ef07161..9431062 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go
@@ -87,5 +87,8 @@ func BACnetTagApplicationTimeParse(io spi.ReadBuffer) (BACnetTagInitializer, err
 }
 
 func (m BACnetTagApplicationTime) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
index cee347a..19e33e3 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
@@ -107,11 +107,15 @@ func BACnetTagApplicationUnsignedIntegerParse(io spi.ReadBuffer, lengthValueType
 }
 
 func (m BACnetTagApplicationUnsignedInteger) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteInt8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
index 6f870a0..b4911cc 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
@@ -107,11 +107,15 @@ func BACnetTagContextParse(io spi.ReadBuffer, typeOrTagNumber uint8, extTagNumbe
 }
 
 func (m BACnetTagContext) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteInt8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetTagSerialize(io, m.BACnetTag, CastIBACnetTag(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
index a74d79a..e375e28 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
@@ -240,9 +240,10 @@ func (m BACnetTagWithContent) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, 0x2e)
 
 	// Simple Field (value)
-	value := IBACnetTag(m.value)
+	value := CastIBACnetTag(m.value)
 	value.Serialize(io)
 
 	// Const Field (closingTag)
 	io.WriteUint8(8, 0x2f)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
index c59b6f5..55f2492 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
@@ -122,13 +122,13 @@ func BACnetUnconfirmedServiceRequestParse(io spi.ReadBuffer, len uint16) (spi.Me
 	return initializer.initialize(), nil
 }
 
-func (m BACnetUnconfirmedServiceRequest) Serialize(io spi.WriteBuffer) {
-	iBACnetUnconfirmedServiceRequest := CastIBACnetUnconfirmedServiceRequest(m)
+func BACnetUnconfirmedServiceRequestSerialize(io spi.WriteBuffer, m BACnetUnconfirmedServiceRequest, i IBACnetUnconfirmedServiceRequest, childSerialize func()) {
 
 	// Discriminator Field (serviceChoice) (Used as input to a switch field)
-	serviceChoice := uint8(BACnetUnconfirmedServiceRequestServiceChoice(iBACnetUnconfirmedServiceRequest))
+	serviceChoice := uint8(i.ServiceChoice())
 	io.WriteUint8(8, (serviceChoice))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iBACnetUnconfirmedServiceRequest.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
index f2dcfa8..3f134b7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
@@ -210,43 +210,47 @@ func BACnetUnconfirmedServiceRequestIAmParse(io spi.ReadBuffer) (BACnetUnconfirm
 }
 
 func (m BACnetUnconfirmedServiceRequestIAm) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (objectIdentifierHeader)
-	io.WriteUint8(8, 0xC4)
+		// Const Field (objectIdentifierHeader)
+		io.WriteUint8(8, 0xC4)
 
-	// Simple Field (objectType)
-	objectType := uint16(m.objectType)
-	io.WriteUint16(10, (objectType))
+		// Simple Field (objectType)
+		objectType := uint16(m.objectType)
+		io.WriteUint16(10, (objectType))
 
-	// Simple Field (objectInstanceNumber)
-	objectInstanceNumber := uint32(m.objectInstanceNumber)
-	io.WriteUint32(22, (objectInstanceNumber))
+		// Simple Field (objectInstanceNumber)
+		objectInstanceNumber := uint32(m.objectInstanceNumber)
+		io.WriteUint32(22, (objectInstanceNumber))
 
-	// Const Field (maximumApduLengthAcceptedHeader)
-	io.WriteUint8(5, 0x04)
+		// Const Field (maximumApduLengthAcceptedHeader)
+		io.WriteUint8(5, 0x04)
 
-	// Simple Field (maximumApduLengthAcceptedLength)
-	maximumApduLengthAcceptedLength := uint8(m.maximumApduLengthAcceptedLength)
-	io.WriteUint8(3, (maximumApduLengthAcceptedLength))
+		// Simple Field (maximumApduLengthAcceptedLength)
+		maximumApduLengthAcceptedLength := uint8(m.maximumApduLengthAcceptedLength)
+		io.WriteUint8(3, (maximumApduLengthAcceptedLength))
 
-	// Array Field (maximumApduLengthAccepted)
-	if m.maximumApduLengthAccepted != nil {
-		for _, _element := range m.maximumApduLengthAccepted {
-			io.WriteInt8(8, _element)
+		// Array Field (maximumApduLengthAccepted)
+		if m.maximumApduLengthAccepted != nil {
+			for _, _element := range m.maximumApduLengthAccepted {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Const Field (segmentationSupportedHeader)
-	io.WriteUint8(8, 0x91)
+		// Const Field (segmentationSupportedHeader)
+		io.WriteUint8(8, 0x91)
 
-	// Simple Field (segmentationSupported)
-	segmentationSupported := uint8(m.segmentationSupported)
-	io.WriteUint8(8, (segmentationSupported))
+		// Simple Field (segmentationSupported)
+		segmentationSupported := uint8(m.segmentationSupported)
+		io.WriteUint8(8, (segmentationSupported))
 
-	// Const Field (vendorIdHeader)
-	io.WriteUint8(8, 0x21)
+		// Const Field (vendorIdHeader)
+		io.WriteUint8(8, 0x21)
 
-	// Simple Field (vendorId)
-	vendorId := uint8(m.vendorId)
-	io.WriteUint8(8, (vendorId))
+		// Simple Field (vendorId)
+		vendorId := uint8(m.vendorId)
+		io.WriteUint8(8, (vendorId))
+
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
index c37825f..fa9d519 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestIHaveParse(io spi.ReadBuffer) (BACnetUnconfi
 }
 
 func (m BACnetUnconfirmedServiceRequestIHave) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go
index 894b283..b0b9ed4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestTimeSynchronizationParse(io spi.ReadBuffer)
 }
 
 func (m BACnetUnconfirmedServiceRequestTimeSynchronization) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go
index 9adf4b2..e05407d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestUTCTimeSynchronizationParse(io spi.ReadBuffe
 }
 
 func (m BACnetUnconfirmedServiceRequestUTCTimeSynchronization) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go
index 979a31e..26d9f5b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationParse(io spi.ReadB
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
index 2d7ff00..3bd42d4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultipleParse(io s
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go
index 70c3931..635c4da 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestUnconfirmedEventNotificationParse(io spi.Rea
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedEventNotification) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
index a98b4c3..84b6b0f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
@@ -178,31 +178,35 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(io spi.ReadB
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (vendorIdHeader)
-	io.WriteUint8(8, 0x09)
+		// Const Field (vendorIdHeader)
+		io.WriteUint8(8, 0x09)
 
-	// Simple Field (vendorId)
-	vendorId := uint8(m.vendorId)
-	io.WriteUint8(8, (vendorId))
+		// Simple Field (vendorId)
+		vendorId := uint8(m.vendorId)
+		io.WriteUint8(8, (vendorId))
 
-	// Const Field (serviceNumberHeader)
-	io.WriteUint8(8, 0x1A)
+		// Const Field (serviceNumberHeader)
+		io.WriteUint8(8, 0x1A)
 
-	// Simple Field (serviceNumber)
-	serviceNumber := uint16(m.serviceNumber)
-	io.WriteUint16(16, (serviceNumber))
+		// Simple Field (serviceNumber)
+		serviceNumber := uint16(m.serviceNumber)
+		io.WriteUint16(16, (serviceNumber))
 
-	// Const Field (listOfValuesOpeningTag)
-	io.WriteUint8(8, 0x2E)
+		// Const Field (listOfValuesOpeningTag)
+		io.WriteUint8(8, 0x2E)
 
-	// Array Field (values)
-	if m.values != nil {
-		for _, _element := range m.values {
-			io.WriteInt8(8, _element)
+		// Array Field (values)
+		if m.values != nil {
+			for _, _element := range m.values {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Const Field (listOfValuesClosingTag)
-	io.WriteUint8(8, 0x2F)
+		// Const Field (listOfValuesClosingTag)
+		io.WriteUint8(8, 0x2F)
+
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
index 27cf682..f24f2bd 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestUnconfirmedTextMessageParse(io spi.ReadBuffe
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedTextMessage) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
index 4605e95..b672aef 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
@@ -184,36 +184,40 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(io spi.ReadBuffer) (BACnetUnconf
 }
 
 func (m BACnetUnconfirmedServiceRequestWhoHas) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (deviceInstanceLowLimitHeader)
-	io.WriteUint8(8, 0x0B)
+		// Const Field (deviceInstanceLowLimitHeader)
+		io.WriteUint8(8, 0x0B)
 
-	// Simple Field (deviceInstanceLowLimit)
-	deviceInstanceLowLimit := uint32(m.deviceInstanceLowLimit)
-	io.WriteUint32(24, (deviceInstanceLowLimit))
+		// Simple Field (deviceInstanceLowLimit)
+		deviceInstanceLowLimit := uint32(m.deviceInstanceLowLimit)
+		io.WriteUint32(24, (deviceInstanceLowLimit))
 
-	// Const Field (deviceInstanceHighLimitHeader)
-	io.WriteUint8(8, 0x1B)
+		// Const Field (deviceInstanceHighLimitHeader)
+		io.WriteUint8(8, 0x1B)
 
-	// Simple Field (deviceInstanceHighLimit)
-	deviceInstanceHighLimit := uint32(m.deviceInstanceHighLimit)
-	io.WriteUint32(24, (deviceInstanceHighLimit))
+		// Simple Field (deviceInstanceHighLimit)
+		deviceInstanceHighLimit := uint32(m.deviceInstanceHighLimit)
+		io.WriteUint32(24, (deviceInstanceHighLimit))
 
-	// Const Field (objectNameHeader)
-	io.WriteUint8(8, 0x3D)
+		// Const Field (objectNameHeader)
+		io.WriteUint8(8, 0x3D)
 
-	// Implicit Field (objectNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	objectNameLength := uint8(uint8(uint8(len(m.objectName))) + uint8(uint8(1)))
-	io.WriteUint8(8, (objectNameLength))
+		// Implicit Field (objectNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		objectNameLength := uint8(uint8(uint8(len(m.objectName))) + uint8(uint8(1)))
+		io.WriteUint8(8, (objectNameLength))
 
-	// Simple Field (objectNameCharacterSet)
-	objectNameCharacterSet := uint8(m.objectNameCharacterSet)
-	io.WriteUint8(8, (objectNameCharacterSet))
+		// Simple Field (objectNameCharacterSet)
+		objectNameCharacterSet := uint8(m.objectNameCharacterSet)
+		io.WriteUint8(8, (objectNameCharacterSet))
 
-	// Array Field (objectName)
-	if m.objectName != nil {
-		for _, _element := range m.objectName {
-			io.WriteInt8(8, _element)
+		// Array Field (objectName)
+		if m.objectName != nil {
+			for _, _element := range m.objectName {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
index 5e6de0a..addf36b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
@@ -175,32 +175,36 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(io spi.ReadBuffer) (BACnetUnconfi
 }
 
 func (m BACnetUnconfirmedServiceRequestWhoIs) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (deviceInstanceRangeLowLimitHeader)
-	io.WriteUint8(5, 0x01)
+		// Const Field (deviceInstanceRangeLowLimitHeader)
+		io.WriteUint8(5, 0x01)
 
-	// Simple Field (deviceInstanceRangeLowLimitLength)
-	deviceInstanceRangeLowLimitLength := uint8(m.deviceInstanceRangeLowLimitLength)
-	io.WriteUint8(3, (deviceInstanceRangeLowLimitLength))
+		// Simple Field (deviceInstanceRangeLowLimitLength)
+		deviceInstanceRangeLowLimitLength := uint8(m.deviceInstanceRangeLowLimitLength)
+		io.WriteUint8(3, (deviceInstanceRangeLowLimitLength))
 
-	// Array Field (deviceInstanceRangeLowLimit)
-	if m.deviceInstanceRangeLowLimit != nil {
-		for _, _element := range m.deviceInstanceRangeLowLimit {
-			io.WriteInt8(8, _element)
+		// Array Field (deviceInstanceRangeLowLimit)
+		if m.deviceInstanceRangeLowLimit != nil {
+			for _, _element := range m.deviceInstanceRangeLowLimit {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Const Field (deviceInstanceRangeHighLimitHeader)
-	io.WriteUint8(5, 0x03)
+		// Const Field (deviceInstanceRangeHighLimitHeader)
+		io.WriteUint8(5, 0x03)
 
-	// Simple Field (deviceInstanceRangeHighLimitLength)
-	deviceInstanceRangeHighLimitLength := uint8(m.deviceInstanceRangeHighLimitLength)
-	io.WriteUint8(3, (deviceInstanceRangeHighLimitLength))
+		// Simple Field (deviceInstanceRangeHighLimitLength)
+		deviceInstanceRangeHighLimitLength := uint8(m.deviceInstanceRangeHighLimitLength)
+		io.WriteUint8(3, (deviceInstanceRangeHighLimitLength))
 
-	// Array Field (deviceInstanceRangeHighLimit)
-	if m.deviceInstanceRangeHighLimit != nil {
-		for _, _element := range m.deviceInstanceRangeHighLimit {
-			io.WriteInt8(8, _element)
+		// Array Field (deviceInstanceRangeHighLimit)
+		if m.deviceInstanceRangeHighLimit != nil {
+			for _, _element := range m.deviceInstanceRangeHighLimit {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
index 700f7aa..3861570 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
@@ -83,5 +83,8 @@ func BACnetUnconfirmedServiceRequestWriteGroupParse(io spi.ReadBuffer) (BACnetUn
 }
 
 func (m BACnetUnconfirmedServiceRequestWriteGroup) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BACnetUnconfirmedServiceRequestSerialize(io, m.BACnetUnconfirmedServiceRequest, CastIBACnetUnconfirmedServiceRequest(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
index 5323b56..2b14894 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
@@ -149,14 +149,13 @@ func BVLCParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m BVLC) Serialize(io spi.WriteBuffer) {
-	iBVLC := CastIBVLC(m)
+func BVLCSerialize(io spi.WriteBuffer, m BVLC, i IBVLC, childSerialize func()) {
 
 	// Const Field (bacnetType)
 	io.WriteUint8(8, 0x81)
 
 	// Discriminator Field (bvlcFunction) (Used as input to a switch field)
-	bvlcFunction := uint8(BVLCBvlcFunction(iBVLC))
+	bvlcFunction := uint8(i.BvlcFunction())
 	io.WriteUint8(8, (bvlcFunction))
 
 	// Implicit Field (bvlcLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -164,5 +163,6 @@ func (m BVLC) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (bvlcLength))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iBVLC.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go
index 8f1aeb8..9f91d2d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go
@@ -83,5 +83,8 @@ func BVLCDeleteForeignDeviceTableEntryParse(io spi.ReadBuffer) (BVLCInitializer,
 }
 
 func (m BVLCDeleteForeignDeviceTableEntry) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go
index c8a97d9..5d62afe 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go
@@ -83,5 +83,8 @@ func BVLCDistributeBroadcastToNetworkParse(io spi.ReadBuffer) (BVLCInitializer,
 }
 
 func (m BVLCDistributeBroadcastToNetwork) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
index f969cac..3e62c51 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
@@ -131,19 +131,23 @@ func BVLCForwardedNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCInitializ
 }
 
 func (m BVLCForwardedNPDU) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (ip)
-	if m.ip != nil {
-		for _, _element := range m.ip {
-			io.WriteUint8(8, _element)
+		// Array Field (ip)
+		if m.ip != nil {
+			for _, _element := range m.ip {
+				io.WriteUint8(8, _element)
+			}
 		}
-	}
 
-	// Simple Field (port)
-	port := uint16(m.port)
-	io.WriteUint16(16, (port))
+		// Simple Field (port)
+		port := uint16(m.port)
+		io.WriteUint16(16, (port))
 
-	// Simple Field (npdu)
-	npdu := INPDU(m.npdu)
-	npdu.Serialize(io)
+		// Simple Field (npdu)
+		npdu := CastINPDU(m.npdu)
+		npdu.Serialize(io)
+
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
index 3b4c6f7..b7ad290 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
@@ -100,8 +100,12 @@ func BVLCOriginalBroadcastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCI
 }
 
 func (m BVLCOriginalBroadcastNPDU) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (npdu)
-	npdu := INPDU(m.npdu)
-	npdu.Serialize(io)
+		// Simple Field (npdu)
+		npdu := CastINPDU(m.npdu)
+		npdu.Serialize(io)
+
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
index 2d4837d..e781d35 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
@@ -100,8 +100,12 @@ func BVLCOriginalUnicastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCIni
 }
 
 func (m BVLCOriginalUnicastNPDU) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (npdu)
-	npdu := INPDU(m.npdu)
-	npdu.Serialize(io)
+		// Simple Field (npdu)
+		npdu := CastINPDU(m.npdu)
+		npdu.Serialize(io)
+
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go
index f7cf6a4..026bb26 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go
@@ -83,5 +83,8 @@ func BVLCReadBroadcastDistributionTableParse(io spi.ReadBuffer) (BVLCInitializer
 }
 
 func (m BVLCReadBroadcastDistributionTable) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go
index 285fa2a..aa927d87 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go
@@ -83,5 +83,8 @@ func BVLCReadBroadcastDistributionTableAckParse(io spi.ReadBuffer) (BVLCInitiali
 }
 
 func (m BVLCReadBroadcastDistributionTableAck) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go
index 58d1389..5f530b1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go
@@ -83,5 +83,8 @@ func BVLCReadForeignDeviceTableParse(io spi.ReadBuffer) (BVLCInitializer, error)
 }
 
 func (m BVLCReadForeignDeviceTable) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go
index ccd4b18..7e53b36 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go
@@ -83,5 +83,8 @@ func BVLCReadForeignDeviceTableAckParse(io spi.ReadBuffer) (BVLCInitializer, err
 }
 
 func (m BVLCReadForeignDeviceTableAck) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go
index c5a0f40..6759be6 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go
@@ -83,5 +83,8 @@ func BVLCRegisterForeignDeviceParse(io spi.ReadBuffer) (BVLCInitializer, error)
 }
 
 func (m BVLCRegisterForeignDevice) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go
index 23841a4..b652175 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go
@@ -83,5 +83,8 @@ func BVLCResultParse(io spi.ReadBuffer) (BVLCInitializer, error) {
 }
 
 func (m BVLCResult) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go
index 179f336..9463fec 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go
@@ -83,5 +83,8 @@ func BVLCSecureBVLLParse(io spi.ReadBuffer) (BVLCInitializer, error) {
 }
 
 func (m BVLCSecureBVLL) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go
index 69f385e..7d85dd7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go
@@ -83,5 +83,8 @@ func BVLCWideBroadcastDistributionTableParse(io spi.ReadBuffer) (BVLCInitializer
 }
 
 func (m BVLCWideBroadcastDistributionTable) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	BVLCSerialize(io, m.BVLC, CastIBVLC(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
index 60b86e6..308ede2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
@@ -119,11 +119,10 @@ func NLMParse(io spi.ReadBuffer, apduLength uint16) (spi.Message, error) {
 	return initializer.initialize(vendorId), nil
 }
 
-func (m NLM) Serialize(io spi.WriteBuffer) {
-	iNLM := CastINLM(m)
+func NLMSerialize(io spi.WriteBuffer, m NLM, i INLM, childSerialize func()) {
 
 	// Discriminator Field (messageType) (Used as input to a switch field)
-	messageType := uint8(NLMMessageType(iNLM))
+	messageType := uint8(i.MessageType())
 	io.WriteUint8(8, (messageType))
 
 	// Optional Field (vendorId) (Can be skipped, if the value is null)
@@ -134,5 +133,6 @@ func (m NLM) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iNLM.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
index b7a2941..21789fa 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
@@ -104,11 +104,15 @@ func NLMIAmRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageTyp
 }
 
 func (m NLMIAmRouterToNetwork) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (destinationNetworkAddress)
-	if m.destinationNetworkAddress != nil {
-		for _, _element := range m.destinationNetworkAddress {
-			io.WriteUint16(16, _element)
+		// Array Field (destinationNetworkAddress)
+		if m.destinationNetworkAddress != nil {
+			for _, _element := range m.destinationNetworkAddress {
+				io.WriteUint16(16, _element)
+			}
 		}
+
 	}
+	NLMSerialize(io, m.NLM, CastINLM(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
index f1e5cc2..eee597a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
@@ -104,11 +104,15 @@ func NLMWhoIsRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageT
 }
 
 func (m NLMWhoIsRouterToNetwork) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (destinationNetworkAddress)
-	if m.destinationNetworkAddress != nil {
-		for _, _element := range m.destinationNetworkAddress {
-			io.WriteUint16(16, _element)
+		// Array Field (destinationNetworkAddress)
+		if m.destinationNetworkAddress != nil {
+			for _, _element := range m.destinationNetworkAddress {
+				io.WriteUint16(16, _element)
+			}
 		}
+
 	}
+	NLMSerialize(io, m.NLM, CastINLM(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
index 953b5cd..b9278f3 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
@@ -423,13 +423,14 @@ func (m NPDU) Serialize(io spi.WriteBuffer) {
 	var nlm *INLM = nil
 	if m.nlm != nil {
 		nlm = m.nlm
-		(*nlm).Serialize(io)
+		CastINLM(*nlm).Serialize(io)
 	}
 
 	// Optional Field (apdu) (Can be skipped, if the value is null)
 	var apdu *IAPDU = nil
 	if m.apdu != nil {
 		apdu = m.apdu
-		(*apdu).Serialize(io)
+		CastIAPDU(*apdu).Serialize(io)
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
index 4f91622..7e73160 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
@@ -120,13 +120,13 @@ func CEMIParse(io spi.ReadBuffer, size uint8) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m CEMI) Serialize(io spi.WriteBuffer) {
-	iCEMI := CastICEMI(m)
+func CEMISerialize(io spi.WriteBuffer, m CEMI, i ICEMI, childSerialize func()) {
 
 	// Discriminator Field (messageCode) (Used as input to a switch field)
-	messageCode := uint8(CEMIMessageCode(iCEMI))
+	messageCode := uint8(i.MessageCode())
 	io.WriteUint8(8, (messageCode))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iCEMI.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
index a51b879..4822c56 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
@@ -102,13 +102,13 @@ func CEMIAdditionalInformationParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m CEMIAdditionalInformation) Serialize(io spi.WriteBuffer) {
-	iCEMIAdditionalInformation := CastICEMIAdditionalInformation(m)
+func CEMIAdditionalInformationSerialize(io spi.WriteBuffer, m CEMIAdditionalInformation, i ICEMIAdditionalInformation, childSerialize func()) {
 
 	// Discriminator Field (additionalInformationType) (Used as input to a switch field)
-	additionalInformationType := uint8(CEMIAdditionalInformationAdditionalInformationType(iCEMIAdditionalInformation))
+	additionalInformationType := uint8(i.AdditionalInformationType())
 	io.WriteUint8(8, (additionalInformationType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iCEMIAdditionalInformation.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
index 2889cbe..701cb11 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
@@ -160,31 +160,35 @@ func CEMIAdditionalInformationBusmonitorInfoParse(io spi.ReadBuffer) (CEMIAdditi
 }
 
 func (m CEMIAdditionalInformationBusmonitorInfo) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (len)
-	io.WriteUint8(8, 1)
+		// Const Field (len)
+		io.WriteUint8(8, 1)
 
-	// Simple Field (frameErrorFlag)
-	frameErrorFlag := bool(m.frameErrorFlag)
-	io.WriteBit((bool)(frameErrorFlag))
+		// Simple Field (frameErrorFlag)
+		frameErrorFlag := bool(m.frameErrorFlag)
+		io.WriteBit((bool)(frameErrorFlag))
 
-	// Simple Field (bitErrorFlag)
-	bitErrorFlag := bool(m.bitErrorFlag)
-	io.WriteBit((bool)(bitErrorFlag))
+		// Simple Field (bitErrorFlag)
+		bitErrorFlag := bool(m.bitErrorFlag)
+		io.WriteBit((bool)(bitErrorFlag))
 
-	// Simple Field (parityErrorFlag)
-	parityErrorFlag := bool(m.parityErrorFlag)
-	io.WriteBit((bool)(parityErrorFlag))
+		// Simple Field (parityErrorFlag)
+		parityErrorFlag := bool(m.parityErrorFlag)
+		io.WriteBit((bool)(parityErrorFlag))
 
-	// Simple Field (unknownFlag)
-	unknownFlag := bool(m.unknownFlag)
-	io.WriteBit((bool)(unknownFlag))
+		// Simple Field (unknownFlag)
+		unknownFlag := bool(m.unknownFlag)
+		io.WriteBit((bool)(unknownFlag))
 
-	// Simple Field (lostFlag)
-	lostFlag := bool(m.lostFlag)
-	io.WriteBit((bool)(lostFlag))
+		// Simple Field (lostFlag)
+		lostFlag := bool(m.lostFlag)
+		io.WriteBit((bool)(lostFlag))
 
-	// Simple Field (sequenceNumber)
-	sequenceNumber := uint8(m.sequenceNumber)
-	io.WriteUint8(3, (sequenceNumber))
+		// Simple Field (sequenceNumber)
+		sequenceNumber := uint8(m.sequenceNumber)
+		io.WriteUint8(3, (sequenceNumber))
+
+	}
+	CEMIAdditionalInformationSerialize(io, m.CEMIAdditionalInformation, CastICEMIAdditionalInformation(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
index e8adeac..66bc178 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
@@ -116,11 +116,15 @@ func CEMIAdditionalInformationRelativeTimestampParse(io spi.ReadBuffer) (CEMIAdd
 }
 
 func (m CEMIAdditionalInformationRelativeTimestamp) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (len)
-	io.WriteUint8(8, 2)
+		// Const Field (len)
+		io.WriteUint8(8, 2)
 
-	// Simple Field (relativeTimestamp)
-	relativeTimestamp := IRelativeTimestamp(m.relativeTimestamp)
-	relativeTimestamp.Serialize(io)
+		// Simple Field (relativeTimestamp)
+		relativeTimestamp := CastIRelativeTimestamp(m.relativeTimestamp)
+		relativeTimestamp.Serialize(io)
+
+	}
+	CEMIAdditionalInformationSerialize(io, m.CEMIAdditionalInformation, CastICEMIAdditionalInformation(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
index 0647475..03845d0 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
@@ -136,19 +136,23 @@ func CEMIBusmonIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIBusmonInd) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (additionalInformationLength)
-	additionalInformationLength := uint8(m.additionalInformationLength)
-	io.WriteUint8(8, (additionalInformationLength))
+		// Simple Field (additionalInformationLength)
+		additionalInformationLength := uint8(m.additionalInformationLength)
+		io.WriteUint8(8, (additionalInformationLength))
 
-	// Array Field (additionalInformation)
-	if m.additionalInformation != nil {
-		for _, _element := range m.additionalInformation {
-			_element.Serialize(io)
+		// Array Field (additionalInformation)
+		if m.additionalInformation != nil {
+			for _, _element := range m.additionalInformation {
+				_element.Serialize(io)
+			}
 		}
-	}
 
-	// Simple Field (cemiFrame)
-	cemiFrame := ICEMIFrame(m.cemiFrame)
-	cemiFrame.Serialize(io)
+		// Simple Field (cemiFrame)
+		cemiFrame := CastICEMIFrame(m.cemiFrame)
+		cemiFrame.Serialize(io)
+
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
index 77729f3..92ef261 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
@@ -136,19 +136,23 @@ func CEMIDataConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIDataCon) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (additionalInformationLength)
-	additionalInformationLength := uint8(m.additionalInformationLength)
-	io.WriteUint8(8, (additionalInformationLength))
+		// Simple Field (additionalInformationLength)
+		additionalInformationLength := uint8(m.additionalInformationLength)
+		io.WriteUint8(8, (additionalInformationLength))
 
-	// Array Field (additionalInformation)
-	if m.additionalInformation != nil {
-		for _, _element := range m.additionalInformation {
-			_element.Serialize(io)
+		// Array Field (additionalInformation)
+		if m.additionalInformation != nil {
+			for _, _element := range m.additionalInformation {
+				_element.Serialize(io)
+			}
 		}
-	}
 
-	// Simple Field (cemiDataFrame)
-	cemiDataFrame := ICEMIDataFrame(m.cemiDataFrame)
-	cemiDataFrame.Serialize(io)
+		// Simple Field (cemiDataFrame)
+		cemiDataFrame := CastICEMIDataFrame(m.cemiDataFrame)
+		cemiDataFrame.Serialize(io)
+
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
index b190ef3..fe0df32 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
@@ -300,7 +300,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteBit((bool)(notAckFrame))
 
 	// Enum field (priority)
-	priority := ICEMIPriority(m.priority)
+	priority := CastCEMIPriority(m.priority)
 	priority.Serialize(io)
 
 	// Simple Field (acknowledgeRequested)
@@ -324,7 +324,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (extendedFrameFormat))
 
 	// Simple Field (sourceAddress)
-	sourceAddress := IKNXAddress(m.sourceAddress)
+	sourceAddress := CastIKNXAddress(m.sourceAddress)
 	sourceAddress.Serialize(io)
 
 	// Array Field (destinationAddress)
@@ -339,7 +339,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (dataLength))
 
 	// Enum field (tcpi)
-	tcpi := ITPCI(m.tcpi)
+	tcpi := CastTPCI(m.tcpi)
 	tcpi.Serialize(io)
 
 	// Simple Field (counter)
@@ -347,7 +347,7 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (counter))
 
 	// Enum field (apci)
-	apci := IAPCI(m.apci)
+	apci := CastAPCI(m.apci)
 	apci.Serialize(io)
 
 	// Simple Field (dataFirstByte)
@@ -360,4 +360,5 @@ func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
 			io.WriteInt8(8, _element)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
index d44cef7..76163ea 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
@@ -136,19 +136,23 @@ func CEMIDataIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIDataInd) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (additionalInformationLength)
-	additionalInformationLength := uint8(m.additionalInformationLength)
-	io.WriteUint8(8, (additionalInformationLength))
+		// Simple Field (additionalInformationLength)
+		additionalInformationLength := uint8(m.additionalInformationLength)
+		io.WriteUint8(8, (additionalInformationLength))
 
-	// Array Field (additionalInformation)
-	if m.additionalInformation != nil {
-		for _, _element := range m.additionalInformation {
-			_element.Serialize(io)
+		// Array Field (additionalInformation)
+		if m.additionalInformation != nil {
+			for _, _element := range m.additionalInformation {
+				_element.Serialize(io)
+			}
 		}
-	}
 
-	// Simple Field (cemiDataFrame)
-	cemiDataFrame := ICEMIDataFrame(m.cemiDataFrame)
-	cemiDataFrame.Serialize(io)
+		// Simple Field (cemiDataFrame)
+		cemiDataFrame := CastICEMIDataFrame(m.cemiDataFrame)
+		cemiDataFrame.Serialize(io)
+
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
index 267457a..e19d652 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
@@ -136,19 +136,23 @@ func CEMIDataReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIDataReq) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (additionalInformationLength)
-	additionalInformationLength := uint8(m.additionalInformationLength)
-	io.WriteUint8(8, (additionalInformationLength))
+		// Simple Field (additionalInformationLength)
+		additionalInformationLength := uint8(m.additionalInformationLength)
+		io.WriteUint8(8, (additionalInformationLength))
 
-	// Array Field (additionalInformation)
-	if m.additionalInformation != nil {
-		for _, _element := range m.additionalInformation {
-			_element.Serialize(io)
+		// Array Field (additionalInformation)
+		if m.additionalInformation != nil {
+			for _, _element := range m.additionalInformation {
+				_element.Serialize(io)
+			}
 		}
-	}
 
-	// Simple Field (cemiDataFrame)
-	cemiDataFrame := ICEMIDataFrame(m.cemiDataFrame)
-	cemiDataFrame.Serialize(io)
+		// Simple Field (cemiDataFrame)
+		cemiDataFrame := CastICEMIDataFrame(m.cemiDataFrame)
+		cemiDataFrame.Serialize(io)
+
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
index 3934d53..9093524 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
@@ -176,15 +176,14 @@ func CEMIFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(repeated, priority, acknowledgeRequested, errorFlag), nil
 }
 
-func (m CEMIFrame) Serialize(io spi.WriteBuffer) {
-	iCEMIFrame := CastICEMIFrame(m)
+func CEMIFrameSerialize(io spi.WriteBuffer, m CEMIFrame, i ICEMIFrame, childSerialize func()) {
 
 	// Discriminator Field (standardFrame) (Used as input to a switch field)
-	standardFrame := bool(CEMIFrameStandardFrame(iCEMIFrame))
+	standardFrame := bool(i.StandardFrame())
 	io.WriteBit((bool)(standardFrame))
 
 	// Discriminator Field (polling) (Used as input to a switch field)
-	polling := bool(CEMIFramePolling(iCEMIFrame))
+	polling := bool(i.Polling())
 	io.WriteBit((bool)(polling))
 
 	// Simple Field (repeated)
@@ -192,11 +191,11 @@ func (m CEMIFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteBit((bool)(repeated))
 
 	// Discriminator Field (notAckFrame) (Used as input to a switch field)
-	notAckFrame := bool(CEMIFrameNotAckFrame(iCEMIFrame))
+	notAckFrame := bool(i.NotAckFrame())
 	io.WriteBit((bool)(notAckFrame))
 
 	// Enum field (priority)
-	priority := ICEMIPriority(m.priority)
+	priority := CastCEMIPriority(m.priority)
 	priority.Serialize(io)
 
 	// Simple Field (acknowledgeRequested)
@@ -208,5 +207,6 @@ func (m CEMIFrame) Serialize(io spi.WriteBuffer) {
 	io.WriteBit((bool)(errorFlag))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iCEMIFrame.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go
index 317c1bd..f2cb6c7 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameAck.go
@@ -95,5 +95,8 @@ func CEMIFrameAckParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 }
 
 func (m CEMIFrameAck) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMIFrameSerialize(io, m.CEMIFrame, CastICEMIFrame(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go
index f3ebd6b..868eccf 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameData.go
@@ -234,54 +234,58 @@ func CEMIFrameDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 }
 
 func (m CEMIFrameData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (sourceAddress)
-	sourceAddress := IKNXAddress(m.sourceAddress)
-	sourceAddress.Serialize(io)
+		// Simple Field (sourceAddress)
+		sourceAddress := CastIKNXAddress(m.sourceAddress)
+		sourceAddress.Serialize(io)
 
-	// Array Field (destinationAddress)
-	if m.destinationAddress != nil {
-		for _, _element := range m.destinationAddress {
-			io.WriteInt8(8, _element)
+		// Array Field (destinationAddress)
+		if m.destinationAddress != nil {
+			for _, _element := range m.destinationAddress {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Simple Field (groupAddress)
-	groupAddress := bool(m.groupAddress)
-	io.WriteBit((bool)(groupAddress))
+		// Simple Field (groupAddress)
+		groupAddress := bool(m.groupAddress)
+		io.WriteBit((bool)(groupAddress))
 
-	// Simple Field (hopCount)
-	hopCount := uint8(m.hopCount)
-	io.WriteUint8(3, (hopCount))
+		// Simple Field (hopCount)
+		hopCount := uint8(m.hopCount)
+		io.WriteUint8(3, (hopCount))
 
-	// Simple Field (dataLength)
-	dataLength := uint8(m.dataLength)
-	io.WriteUint8(4, (dataLength))
+		// Simple Field (dataLength)
+		dataLength := uint8(m.dataLength)
+		io.WriteUint8(4, (dataLength))
 
-	// Enum field (tcpi)
-	tcpi := ITPCI(m.tcpi)
-	tcpi.Serialize(io)
+		// Enum field (tcpi)
+		tcpi := CastTPCI(m.tcpi)
+		tcpi.Serialize(io)
 
-	// Simple Field (counter)
-	counter := uint8(m.counter)
-	io.WriteUint8(4, (counter))
+		// Simple Field (counter)
+		counter := uint8(m.counter)
+		io.WriteUint8(4, (counter))
 
-	// Enum field (apci)
-	apci := IAPCI(m.apci)
-	apci.Serialize(io)
+		// Enum field (apci)
+		apci := CastAPCI(m.apci)
+		apci.Serialize(io)
 
-	// Simple Field (dataFirstByte)
-	dataFirstByte := int8(m.dataFirstByte)
-	io.WriteInt8(6, (dataFirstByte))
+		// Simple Field (dataFirstByte)
+		dataFirstByte := int8(m.dataFirstByte)
+		io.WriteInt8(6, (dataFirstByte))
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteInt8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Simple Field (crc)
-	crc := uint8(m.crc)
-	io.WriteUint8(8, (crc))
+		// Simple Field (crc)
+		crc := uint8(m.crc)
+		io.WriteUint8(8, (crc))
+
+	}
+	CEMIFrameSerialize(io, m.CEMIFrame, CastICEMIFrame(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go
index 8f928ab..cc8ee6b 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrameDataExt.go
@@ -244,58 +244,62 @@ func CEMIFrameDataExtParse(io spi.ReadBuffer) (CEMIFrameInitializer, error) {
 }
 
 func (m CEMIFrameDataExt) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (groupAddress)
-	groupAddress := bool(m.groupAddress)
-	io.WriteBit((bool)(groupAddress))
+		// Simple Field (groupAddress)
+		groupAddress := bool(m.groupAddress)
+		io.WriteBit((bool)(groupAddress))
 
-	// Simple Field (hopCount)
-	hopCount := uint8(m.hopCount)
-	io.WriteUint8(3, (hopCount))
+		// Simple Field (hopCount)
+		hopCount := uint8(m.hopCount)
+		io.WriteUint8(3, (hopCount))
 
-	// Simple Field (extendedFrameFormat)
-	extendedFrameFormat := uint8(m.extendedFrameFormat)
-	io.WriteUint8(4, (extendedFrameFormat))
+		// Simple Field (extendedFrameFormat)
+		extendedFrameFormat := uint8(m.extendedFrameFormat)
+		io.WriteUint8(4, (extendedFrameFormat))
 
-	// Simple Field (sourceAddress)
-	sourceAddress := IKNXAddress(m.sourceAddress)
-	sourceAddress.Serialize(io)
+		// Simple Field (sourceAddress)
+		sourceAddress := CastIKNXAddress(m.sourceAddress)
+		sourceAddress.Serialize(io)
 
-	// Array Field (destinationAddress)
-	if m.destinationAddress != nil {
-		for _, _element := range m.destinationAddress {
-			io.WriteInt8(8, _element)
+		// Array Field (destinationAddress)
+		if m.destinationAddress != nil {
+			for _, _element := range m.destinationAddress {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Simple Field (dataLength)
-	dataLength := uint8(m.dataLength)
-	io.WriteUint8(8, (dataLength))
+		// Simple Field (dataLength)
+		dataLength := uint8(m.dataLength)
+		io.WriteUint8(8, (dataLength))
 
-	// Enum field (tcpi)
-	tcpi := ITPCI(m.tcpi)
-	tcpi.Serialize(io)
+		// Enum field (tcpi)
+		tcpi := CastTPCI(m.tcpi)
+		tcpi.Serialize(io)
 
-	// Simple Field (counter)
-	counter := uint8(m.counter)
-	io.WriteUint8(4, (counter))
+		// Simple Field (counter)
+		counter := uint8(m.counter)
+		io.WriteUint8(4, (counter))
 
-	// Enum field (apci)
-	apci := IAPCI(m.apci)
-	apci.Serialize(io)
+		// Enum field (apci)
+		apci := CastAPCI(m.apci)
+		apci.Serialize(io)
 
-	// Simple Field (dataFirstByte)
-	dataFirstByte := int8(m.dataFirstByte)
-	io.WriteInt8(6, (dataFirstByte))
+		// Simple Field (dataFirstByte)
+		dataFirstByte := int8(m.dataFirstByte)
+		io.WriteInt8(6, (dataFirstByte))
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteInt8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteInt8(8, _element)
+			}
 		}
-	}
 
-	// Simple Field (crc)
-	crc := uint8(m.crc)
-	io.WriteUint8(8, (crc))
+		// Simple Field (crc)
+		crc := uint8(m.crc)
+		io.WriteUint8(8, (crc))
+
+	}
+	CEMIFrameSerialize(io, m.CEMIFrame, CastICEMIFrame(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go
index d920ebf..e7a5cc3 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingData.go
@@ -95,5 +95,8 @@ func CEMIFramePollingDataParse(io spi.ReadBuffer) (CEMIFrameInitializer, error)
 }
 
 func (m CEMIFramePollingData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMIFrameSerialize(io, m.CEMIFrame, CastICEMIFrame(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go
index e9ab966..ede4c4c 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFramePollingDataExt.go
@@ -95,5 +95,8 @@ func CEMIFramePollingDataExtParse(io spi.ReadBuffer) (CEMIFrameInitializer, erro
 }
 
 func (m CEMIFramePollingDataExt) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMIFrameSerialize(io, m.CEMIFrame, CastICEMIFrame(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go
index 3bb7d28..fb53334 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadCon.go
@@ -144,28 +144,32 @@ func CEMIMPropReadConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIMPropReadCon) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (interfaceObjectType)
-	interfaceObjectType := uint16(m.interfaceObjectType)
-	io.WriteUint16(16, (interfaceObjectType))
+		// Simple Field (interfaceObjectType)
+		interfaceObjectType := uint16(m.interfaceObjectType)
+		io.WriteUint16(16, (interfaceObjectType))
 
-	// Simple Field (objectInstance)
-	objectInstance := uint8(m.objectInstance)
-	io.WriteUint8(8, (objectInstance))
+		// Simple Field (objectInstance)
+		objectInstance := uint8(m.objectInstance)
+		io.WriteUint8(8, (objectInstance))
 
-	// Simple Field (propertyId)
-	propertyId := uint8(m.propertyId)
-	io.WriteUint8(8, (propertyId))
+		// Simple Field (propertyId)
+		propertyId := uint8(m.propertyId)
+		io.WriteUint8(8, (propertyId))
 
-	// Simple Field (numberOfElements)
-	numberOfElements := uint8(m.numberOfElements)
-	io.WriteUint8(4, (numberOfElements))
+		// Simple Field (numberOfElements)
+		numberOfElements := uint8(m.numberOfElements)
+		io.WriteUint8(4, (numberOfElements))
 
-	// Simple Field (startIndex)
-	startIndex := uint16(m.startIndex)
-	io.WriteUint16(12, (startIndex))
+		// Simple Field (startIndex)
+		startIndex := uint16(m.startIndex)
+		io.WriteUint16(12, (startIndex))
 
-	// Simple Field (unknown)
-	unknown := uint16(m.unknown)
-	io.WriteUint16(16, (unknown))
+		// Simple Field (unknown)
+		unknown := uint16(m.unknown)
+		io.WriteUint16(16, (unknown))
+
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go
index ea35b23..e1e40f7 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIMPropReadReq.go
@@ -134,24 +134,28 @@ func CEMIMPropReadReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIMPropReadReq) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (interfaceObjectType)
-	interfaceObjectType := uint16(m.interfaceObjectType)
-	io.WriteUint16(16, (interfaceObjectType))
+		// Simple Field (interfaceObjectType)
+		interfaceObjectType := uint16(m.interfaceObjectType)
+		io.WriteUint16(16, (interfaceObjectType))
 
-	// Simple Field (objectInstance)
-	objectInstance := uint8(m.objectInstance)
-	io.WriteUint8(8, (objectInstance))
+		// Simple Field (objectInstance)
+		objectInstance := uint8(m.objectInstance)
+		io.WriteUint8(8, (objectInstance))
 
-	// Simple Field (propertyId)
-	propertyId := uint8(m.propertyId)
-	io.WriteUint8(8, (propertyId))
+		// Simple Field (propertyId)
+		propertyId := uint8(m.propertyId)
+		io.WriteUint8(8, (propertyId))
 
-	// Simple Field (numberOfElements)
-	numberOfElements := uint8(m.numberOfElements)
-	io.WriteUint8(4, (numberOfElements))
+		// Simple Field (numberOfElements)
+		numberOfElements := uint8(m.numberOfElements)
+		io.WriteUint8(4, (numberOfElements))
 
-	// Simple Field (startIndex)
-	startIndex := uint16(m.startIndex)
-	io.WriteUint16(12, (startIndex))
+		// Simple Field (startIndex)
+		startIndex := uint16(m.startIndex)
+		io.WriteUint16(12, (startIndex))
+
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataCon.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataCon.go
index 672cb6f..6dd2b41 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataCon.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataCon.go
@@ -83,5 +83,8 @@ func CEMIPollDataConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIPollDataCon) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataReq.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataReq.go
index fe18905..5e7d925 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataReq.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIPollDataReq.go
@@ -83,5 +83,8 @@ func CEMIPollDataReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIPollDataReq) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawCon.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawCon.go
index 9493063..92f8d0f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawCon.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawCon.go
@@ -83,5 +83,8 @@ func CEMIRawConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIRawCon) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawInd.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawInd.go
index 913e319..fa8bca9 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawInd.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawInd.go
@@ -83,5 +83,8 @@ func CEMIRawIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIRawInd) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawReq.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawReq.go
index 0013afb..155a166 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawReq.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIRawReq.go
@@ -83,5 +83,8 @@ func CEMIRawReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIRawReq) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	CEMISerialize(io, m.CEMI, CastICEMI(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
index fded2f1..2462129 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequest.go
@@ -130,16 +130,20 @@ func ConnectionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 }
 
 func (m ConnectionRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (hpaiDiscoveryEndpoint)
-	hpaiDiscoveryEndpoint := IHPAIDiscoveryEndpoint(m.hpaiDiscoveryEndpoint)
-	hpaiDiscoveryEndpoint.Serialize(io)
+		// Simple Field (hpaiDiscoveryEndpoint)
+		hpaiDiscoveryEndpoint := CastIHPAIDiscoveryEndpoint(m.hpaiDiscoveryEndpoint)
+		hpaiDiscoveryEndpoint.Serialize(io)
 
-	// Simple Field (hpaiDataEndpoint)
-	hpaiDataEndpoint := IHPAIDataEndpoint(m.hpaiDataEndpoint)
-	hpaiDataEndpoint.Serialize(io)
+		// Simple Field (hpaiDataEndpoint)
+		hpaiDataEndpoint := CastIHPAIDataEndpoint(m.hpaiDataEndpoint)
+		hpaiDataEndpoint.Serialize(io)
 
-	// Simple Field (connectionRequestInformation)
-	connectionRequestInformation := IConnectionRequestInformation(m.connectionRequestInformation)
-	connectionRequestInformation.Serialize(io)
+		// Simple Field (connectionRequestInformation)
+		connectionRequestInformation := CastIConnectionRequestInformation(m.connectionRequestInformation)
+		connectionRequestInformation.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go
index 1f5be5f..42c26b0 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformation.go
@@ -111,17 +111,17 @@ func ConnectionRequestInformationParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m ConnectionRequestInformation) Serialize(io spi.WriteBuffer) {
-	iConnectionRequestInformation := CastIConnectionRequestInformation(m)
+func ConnectionRequestInformationSerialize(io spi.WriteBuffer, m ConnectionRequestInformation, i IConnectionRequestInformation, childSerialize func()) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
 	structureLength := uint8(uint8(m.LengthInBytes()))
 	io.WriteUint8(8, (structureLength))
 
 	// Discriminator Field (connectionType) (Used as input to a switch field)
-	connectionType := uint8(ConnectionRequestInformationConnectionType(iConnectionRequestInformation))
+	connectionType := uint8(i.ConnectionType())
 	io.WriteUint8(8, (connectionType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iConnectionRequestInformation.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationDeviceManagement.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationDeviceManagement.go
index 0f51059..2cc3141 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationDeviceManagement.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationDeviceManagement.go
@@ -83,5 +83,8 @@ func ConnectionRequestInformationDeviceManagementParse(io spi.ReadBuffer) (Conne
 }
 
 func (m ConnectionRequestInformationDeviceManagement) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	ConnectionRequestInformationSerialize(io, m.ConnectionRequestInformation, CastIConnectionRequestInformation(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go
index 262b7d0..f56ad09 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionRequestInformationTunnelConnection.go
@@ -112,11 +112,15 @@ func ConnectionRequestInformationTunnelConnectionParse(io spi.ReadBuffer) (Conne
 }
 
 func (m ConnectionRequestInformationTunnelConnection) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Enum field (knxLayer)
-	knxLayer := IKnxLayer(m.knxLayer)
-	knxLayer.Serialize(io)
+		// Enum field (knxLayer)
+		knxLayer := CastKnxLayer(m.knxLayer)
+		knxLayer.Serialize(io)
 
-	// Reserved Field (reserved)
-	io.WriteUint8(8, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(8, uint8(0x00))
+
+	}
+	ConnectionRequestInformationSerialize(io, m.ConnectionRequestInformation, CastIConnectionRequestInformation(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
index 972936a..314b04c 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponse.go
@@ -147,26 +147,30 @@ func ConnectionResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, err
 }
 
 func (m ConnectionResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (communicationChannelId)
-	communicationChannelId := uint8(m.communicationChannelId)
-	io.WriteUint8(8, (communicationChannelId))
+		// Simple Field (communicationChannelId)
+		communicationChannelId := uint8(m.communicationChannelId)
+		io.WriteUint8(8, (communicationChannelId))
 
-	// Enum field (status)
-	status := IStatus(m.status)
-	status.Serialize(io)
+		// Enum field (status)
+		status := CastStatus(m.status)
+		status.Serialize(io)
 
-	// Optional Field (hpaiDataEndpoint) (Can be skipped, if the value is null)
-	var hpaiDataEndpoint *IHPAIDataEndpoint = nil
-	if m.hpaiDataEndpoint != nil {
-		hpaiDataEndpoint = m.hpaiDataEndpoint
-		(*hpaiDataEndpoint).Serialize(io)
-	}
+		// Optional Field (hpaiDataEndpoint) (Can be skipped, if the value is null)
+		var hpaiDataEndpoint *IHPAIDataEndpoint = nil
+		if m.hpaiDataEndpoint != nil {
+			hpaiDataEndpoint = m.hpaiDataEndpoint
+			CastIHPAIDataEndpoint(*hpaiDataEndpoint).Serialize(io)
+		}
+
+		// Optional Field (connectionResponseDataBlock) (Can be skipped, if the value is null)
+		var connectionResponseDataBlock *IConnectionResponseDataBlock = nil
+		if m.connectionResponseDataBlock != nil {
+			connectionResponseDataBlock = m.connectionResponseDataBlock
+			CastIConnectionResponseDataBlock(*connectionResponseDataBlock).Serialize(io)
+		}
 
-	// Optional Field (connectionResponseDataBlock) (Can be skipped, if the value is null)
-	var connectionResponseDataBlock *IConnectionResponseDataBlock = nil
-	if m.connectionResponseDataBlock != nil {
-		connectionResponseDataBlock = m.connectionResponseDataBlock
-		(*connectionResponseDataBlock).Serialize(io)
 	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
index 689b57b..16cf89a 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlock.go
@@ -111,17 +111,17 @@ func ConnectionResponseDataBlockParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m ConnectionResponseDataBlock) Serialize(io spi.WriteBuffer) {
-	iConnectionResponseDataBlock := CastIConnectionResponseDataBlock(m)
+func ConnectionResponseDataBlockSerialize(io spi.WriteBuffer, m ConnectionResponseDataBlock, i IConnectionResponseDataBlock, childSerialize func()) {
 
 	// Implicit Field (structureLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
 	structureLength := uint8(uint8(m.LengthInBytes()))
 	io.WriteUint8(8, (structureLength))
 
 	// Discriminator Field (connectionType) (Used as input to a switch field)
-	connectionType := uint8(ConnectionResponseDataBlockConnectionType(iConnectionResponseDataBlock))
+	connectionType := uint8(i.ConnectionType())
 	io.WriteUint8(8, (connectionType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iConnectionResponseDataBlock.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockDeviceManagement.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockDeviceManagement.go
index e3dfb1c..4094677 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockDeviceManagement.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockDeviceManagement.go
@@ -83,5 +83,8 @@ func ConnectionResponseDataBlockDeviceManagementParse(io spi.ReadBuffer) (Connec
 }
 
 func (m ConnectionResponseDataBlockDeviceManagement) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	ConnectionResponseDataBlockSerialize(io, m.ConnectionResponseDataBlock, CastIConnectionResponseDataBlock(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
index 3937380..4c45df6 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionResponseDataBlockTunnelConnection.go
@@ -100,8 +100,12 @@ func ConnectionResponseDataBlockTunnelConnectionParse(io spi.ReadBuffer) (Connec
 }
 
 func (m ConnectionResponseDataBlockTunnelConnection) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (knxAddress)
-	knxAddress := IKNXAddress(m.knxAddress)
-	knxAddress.Serialize(io)
+		// Simple Field (knxAddress)
+		knxAddress := CastIKNXAddress(m.knxAddress)
+		knxAddress.Serialize(io)
+
+	}
+	ConnectionResponseDataBlockSerialize(io, m.ConnectionResponseDataBlock, CastIConnectionResponseDataBlock(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
index bd85e44..d8348e4 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateRequest.go
@@ -128,15 +128,19 @@ func ConnectionStateRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer,
 }
 
 func (m ConnectionStateRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (communicationChannelId)
-	communicationChannelId := uint8(m.communicationChannelId)
-	io.WriteUint8(8, (communicationChannelId))
+		// Simple Field (communicationChannelId)
+		communicationChannelId := uint8(m.communicationChannelId)
+		io.WriteUint8(8, (communicationChannelId))
 
-	// Reserved Field (reserved)
-	io.WriteUint8(8, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(8, uint8(0x00))
 
-	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
-	hpaiControlEndpoint.Serialize(io)
+		// Simple Field (hpaiControlEndpoint)
+		hpaiControlEndpoint := CastIHPAIControlEndpoint(m.hpaiControlEndpoint)
+		hpaiControlEndpoint.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go
index 7923043..a611e07 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ConnectionStateResponse.go
@@ -104,12 +104,16 @@ func ConnectionStateResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer
 }
 
 func (m ConnectionStateResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (communicationChannelId)
-	communicationChannelId := uint8(m.communicationChannelId)
-	io.WriteUint8(8, (communicationChannelId))
+		// Simple Field (communicationChannelId)
+		communicationChannelId := uint8(m.communicationChannelId)
+		io.WriteUint8(8, (communicationChannelId))
 
-	// Enum field (status)
-	status := IStatus(m.status)
-	status.Serialize(io)
+		// Enum field (status)
+		status := CastStatus(m.status)
+		status.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
index f586c65..11f3362 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBDeviceInfo.go
@@ -235,15 +235,15 @@ func (m DIBDeviceInfo) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (knxMedium))
 
 	// Simple Field (deviceStatus)
-	deviceStatus := IDeviceStatus(m.deviceStatus)
+	deviceStatus := CastIDeviceStatus(m.deviceStatus)
 	deviceStatus.Serialize(io)
 
 	// Simple Field (knxAddress)
-	knxAddress := IKNXAddress(m.knxAddress)
+	knxAddress := CastIKNXAddress(m.knxAddress)
 	knxAddress.Serialize(io)
 
 	// Simple Field (projectInstallationIdentifier)
-	projectInstallationIdentifier := IProjectInstallationIdentifier(m.projectInstallationIdentifier)
+	projectInstallationIdentifier := CastIProjectInstallationIdentifier(m.projectInstallationIdentifier)
 	projectInstallationIdentifier.Serialize(io)
 
 	// Array Field (knxNetIpDeviceSerialNumber)
@@ -254,11 +254,11 @@ func (m DIBDeviceInfo) Serialize(io spi.WriteBuffer) {
 	}
 
 	// Simple Field (knxNetIpDeviceMulticastAddress)
-	knxNetIpDeviceMulticastAddress := IIPAddress(m.knxNetIpDeviceMulticastAddress)
+	knxNetIpDeviceMulticastAddress := CastIIPAddress(m.knxNetIpDeviceMulticastAddress)
 	knxNetIpDeviceMulticastAddress.Serialize(io)
 
 	// Simple Field (knxNetIpDeviceMacAddress)
-	knxNetIpDeviceMacAddress := IMACAddress(m.knxNetIpDeviceMacAddress)
+	knxNetIpDeviceMacAddress := CastIMACAddress(m.knxNetIpDeviceMacAddress)
 	knxNetIpDeviceMacAddress.Serialize(io)
 
 	// Array Field (deviceFriendlyName)
@@ -267,4 +267,5 @@ func (m DIBDeviceInfo) Serialize(io spi.WriteBuffer) {
 			io.WriteInt8(8, _element)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
index d71603a..1832aec 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DIBSuppSvcFamilies.go
@@ -137,4 +137,5 @@ func (m DIBSuppSvcFamilies) Serialize(io spi.WriteBuffer) {
 			_element.Serialize(io)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
index 322e234..6088d2e 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionRequest.go
@@ -100,8 +100,12 @@ func DescriptionRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, err
 }
 
 func (m DescriptionRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
-	hpaiControlEndpoint.Serialize(io)
+		// Simple Field (hpaiControlEndpoint)
+		hpaiControlEndpoint := CastIHPAIControlEndpoint(m.hpaiControlEndpoint)
+		hpaiControlEndpoint.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
index eacfc3b..ed002b3 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DescriptionResponse.go
@@ -115,12 +115,16 @@ func DescriptionResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, er
 }
 
 func (m DescriptionResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (dibDeviceInfo)
-	dibDeviceInfo := IDIBDeviceInfo(m.dibDeviceInfo)
-	dibDeviceInfo.Serialize(io)
+		// Simple Field (dibDeviceInfo)
+		dibDeviceInfo := CastIDIBDeviceInfo(m.dibDeviceInfo)
+		dibDeviceInfo.Serialize(io)
 
-	// Simple Field (dibSuppSvcFamilies)
-	dibSuppSvcFamilies := IDIBSuppSvcFamilies(m.dibSuppSvcFamilies)
-	dibSuppSvcFamilies.Serialize(io)
+		// Simple Field (dibSuppSvcFamilies)
+		dibSuppSvcFamilies := CastIDIBSuppSvcFamilies(m.dibSuppSvcFamilies)
+		dibSuppSvcFamilies.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
index c678ade..d1a6259 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAck.go
@@ -100,8 +100,12 @@ func DeviceConfigurationAckParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer,
 }
 
 func (m DeviceConfigurationAck) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (deviceConfigurationAckDataBlock)
-	deviceConfigurationAckDataBlock := IDeviceConfigurationAckDataBlock(m.deviceConfigurationAckDataBlock)
-	deviceConfigurationAckDataBlock.Serialize(io)
+		// Simple Field (deviceConfigurationAckDataBlock)
+		deviceConfigurationAckDataBlock := CastIDeviceConfigurationAckDataBlock(m.deviceConfigurationAckDataBlock)
+		deviceConfigurationAckDataBlock.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
index 00845a8..551668f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationAckDataBlock.go
@@ -127,6 +127,7 @@ func (m DeviceConfigurationAckDataBlock) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (sequenceCounter))
 
 	// Enum field (status)
-	status := IStatus(m.status)
+	status := CastStatus(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 34054c9..3ee55d6 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequest.go
@@ -115,12 +115,16 @@ func DeviceConfigurationRequestParse(io spi.ReadBuffer, totalLength uint16) (KNX
 }
 
 func (m DeviceConfigurationRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (deviceConfigurationRequestDataBlock)
-	deviceConfigurationRequestDataBlock := IDeviceConfigurationRequestDataBlock(m.deviceConfigurationRequestDataBlock)
-	deviceConfigurationRequestDataBlock.Serialize(io)
+		// Simple Field (deviceConfigurationRequestDataBlock)
+		deviceConfigurationRequestDataBlock := CastIDeviceConfigurationRequestDataBlock(m.deviceConfigurationRequestDataBlock)
+		deviceConfigurationRequestDataBlock.Serialize(io)
 
-	// Simple Field (cemi)
-	cemi := ICEMI(m.cemi)
-	cemi.Serialize(io)
+		// Simple Field (cemi)
+		cemi := CastICEMI(m.cemi)
+		cemi.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
index e936cd3..8a729ac 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceConfigurationRequestDataBlock.go
@@ -136,4 +136,5 @@ func (m DeviceConfigurationRequestDataBlock) Serialize(io spi.WriteBuffer) {
 
 	// Reserved Field (reserved)
 	io.WriteUint8(8, 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 e199485..0d910e4 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceStatus.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DeviceStatus.go
@@ -109,4 +109,5 @@ func (m DeviceStatus) Serialize(io spi.WriteBuffer) {
 	// Simple Field (programMode)
 	programMode := bool(m.programMode)
 	io.WriteBit((bool)(programMode))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
index 8618d20..749d140 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectRequest.go
@@ -128,15 +128,19 @@ func DisconnectRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 }
 
 func (m DisconnectRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (communicationChannelId)
-	communicationChannelId := uint8(m.communicationChannelId)
-	io.WriteUint8(8, (communicationChannelId))
+		// Simple Field (communicationChannelId)
+		communicationChannelId := uint8(m.communicationChannelId)
+		io.WriteUint8(8, (communicationChannelId))
 
-	// Reserved Field (reserved)
-	io.WriteUint8(8, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(8, uint8(0x00))
 
-	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
-	hpaiControlEndpoint.Serialize(io)
+		// Simple Field (hpaiControlEndpoint)
+		hpaiControlEndpoint := CastIHPAIControlEndpoint(m.hpaiControlEndpoint)
+		hpaiControlEndpoint.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go
index da0035e..013199d 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/DisconnectResponse.go
@@ -104,12 +104,16 @@ func DisconnectResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, err
 }
 
 func (m DisconnectResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (communicationChannelId)
-	communicationChannelId := uint8(m.communicationChannelId)
-	io.WriteUint8(8, (communicationChannelId))
+		// Simple Field (communicationChannelId)
+		communicationChannelId := uint8(m.communicationChannelId)
+		io.WriteUint8(8, (communicationChannelId))
 
-	// Enum field (status)
-	status := IStatus(m.status)
-	status.Serialize(io)
+		// Enum field (status)
+		status := CastStatus(m.status)
+		status.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
index 31c3c75..ff7667f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIControlEndpoint.go
@@ -125,14 +125,15 @@ func (m HPAIControlEndpoint) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (structureLength))
 
 	// Enum field (hostProtocolCode)
-	hostProtocolCode := IHostProtocolCode(m.hostProtocolCode)
+	hostProtocolCode := CastHostProtocolCode(m.hostProtocolCode)
 	hostProtocolCode.Serialize(io)
 
 	// Simple Field (ipAddress)
-	ipAddress := IIPAddress(m.ipAddress)
+	ipAddress := CastIIPAddress(m.ipAddress)
 	ipAddress.Serialize(io)
 
 	// Simple Field (ipPort)
 	ipPort := uint16(m.ipPort)
 	io.WriteUint16(16, (ipPort))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
index 3dc1051..845aaef 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDataEndpoint.go
@@ -125,14 +125,15 @@ func (m HPAIDataEndpoint) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (structureLength))
 
 	// Enum field (hostProtocolCode)
-	hostProtocolCode := IHostProtocolCode(m.hostProtocolCode)
+	hostProtocolCode := CastHostProtocolCode(m.hostProtocolCode)
 	hostProtocolCode.Serialize(io)
 
 	// Simple Field (ipAddress)
-	ipAddress := IIPAddress(m.ipAddress)
+	ipAddress := CastIIPAddress(m.ipAddress)
 	ipAddress.Serialize(io)
 
 	// Simple Field (ipPort)
 	ipPort := uint16(m.ipPort)
 	io.WriteUint16(16, (ipPort))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
index fb8d59f..bae9c1e 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/HPAIDiscoveryEndpoint.go
@@ -125,14 +125,15 @@ func (m HPAIDiscoveryEndpoint) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (structureLength))
 
 	// Enum field (hostProtocolCode)
-	hostProtocolCode := IHostProtocolCode(m.hostProtocolCode)
+	hostProtocolCode := CastHostProtocolCode(m.hostProtocolCode)
 	hostProtocolCode.Serialize(io)
 
 	// Simple Field (ipAddress)
-	ipAddress := IIPAddress(m.ipAddress)
+	ipAddress := CastIIPAddress(m.ipAddress)
 	ipAddress.Serialize(io)
 
 	// Simple Field (ipPort)
 	ipPort := uint16(m.ipPort)
 	io.WriteUint16(16, (ipPort))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
index d79f2fb..86ebd76 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/IPAddress.go
@@ -102,4 +102,5 @@ func (m IPAddress) Serialize(io spi.WriteBuffer) {
 			io.WriteInt8(8, _element)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go
index 44b7472..7175cd4 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXAddress.go
@@ -116,4 +116,5 @@ func (m KNXAddress) Serialize(io spi.WriteBuffer) {
 	// Simple Field (subGroup)
 	subGroup := uint8(m.subGroup)
 	io.WriteUint8(8, (subGroup))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress.go
index d5d7328..f8d7ed5 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress.go
@@ -95,9 +95,9 @@ func KNXGroupAddressParse(io spi.ReadBuffer, numLevels uint8) (spi.Message, erro
 	return initializer.initialize(), nil
 }
 
-func (m KNXGroupAddress) Serialize(io spi.WriteBuffer) {
-	iKNXGroupAddress := CastIKNXGroupAddress(m)
+func KNXGroupAddressSerialize(io spi.WriteBuffer, m KNXGroupAddress, i IKNXGroupAddress, childSerialize func()) {
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iKNXGroupAddress.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go
index 1dfe23b..5c6d2b0 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress2Level.go
@@ -104,12 +104,16 @@ func KNXGroupAddress2LevelParse(io spi.ReadBuffer) (KNXGroupAddressInitializer,
 }
 
 func (m KNXGroupAddress2Level) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (mainGroup)
-	mainGroup := uint8(m.mainGroup)
-	io.WriteUint8(5, (mainGroup))
+		// Simple Field (mainGroup)
+		mainGroup := uint8(m.mainGroup)
+		io.WriteUint8(5, (mainGroup))
 
-	// Simple Field (subGroup)
-	subGroup := uint16(m.subGroup)
-	io.WriteUint16(11, (subGroup))
+		// Simple Field (subGroup)
+		subGroup := uint16(m.subGroup)
+		io.WriteUint16(11, (subGroup))
+
+	}
+	KNXGroupAddressSerialize(io, m.KNXGroupAddress, CastIKNXGroupAddress(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go
index 2e53ca0..17413ae 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddress3Level.go
@@ -114,16 +114,20 @@ func KNXGroupAddress3LevelParse(io spi.ReadBuffer) (KNXGroupAddressInitializer,
 }
 
 func (m KNXGroupAddress3Level) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (mainGroup)
-	mainGroup := uint8(m.mainGroup)
-	io.WriteUint8(5, (mainGroup))
+		// Simple Field (mainGroup)
+		mainGroup := uint8(m.mainGroup)
+		io.WriteUint8(5, (mainGroup))
 
-	// Simple Field (middleGroup)
-	middleGroup := uint8(m.middleGroup)
-	io.WriteUint8(3, (middleGroup))
+		// Simple Field (middleGroup)
+		middleGroup := uint8(m.middleGroup)
+		io.WriteUint8(3, (middleGroup))
 
-	// Simple Field (subGroup)
-	subGroup := uint8(m.subGroup)
-	io.WriteUint8(8, (subGroup))
+		// Simple Field (subGroup)
+		subGroup := uint8(m.subGroup)
+		io.WriteUint8(8, (subGroup))
+
+	}
+	KNXGroupAddressSerialize(io, m.KNXGroupAddress, CastIKNXGroupAddress(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go
index 8ea1340..5690f21 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXGroupAddressFreeLevel.go
@@ -94,8 +94,12 @@ func KNXGroupAddressFreeLevelParse(io spi.ReadBuffer) (KNXGroupAddressInitialize
 }
 
 func (m KNXGroupAddressFreeLevel) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (subGroup)
-	subGroup := uint16(m.subGroup)
-	io.WriteUint16(16, (subGroup))
+		// Simple Field (subGroup)
+		subGroup := uint16(m.subGroup)
+		io.WriteUint16(16, (subGroup))
+
+	}
+	KNXGroupAddressSerialize(io, m.KNXGroupAddress, CastIKNXGroupAddress(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go
index 2bb01eb..9ee8b5b 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KNXNetIPMessage.go
@@ -164,8 +164,7 @@ func KNXNetIPMessageParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m KNXNetIPMessage) Serialize(io spi.WriteBuffer) {
-	iKNXNetIPMessage := CastIKNXNetIPMessage(m)
+func KNXNetIPMessageSerialize(io spi.WriteBuffer, m KNXNetIPMessage, i IKNXNetIPMessage, childSerialize func()) {
 
 	// 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(6))
@@ -175,7 +174,7 @@ func (m KNXNetIPMessage) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, 0x10)
 
 	// Discriminator Field (msgType) (Used as input to a switch field)
-	msgType := uint16(KNXNetIPMessageMsgType(iKNXNetIPMessage))
+	msgType := uint16(i.MsgType())
 	io.WriteUint16(16, (msgType))
 
 	// Implicit Field (totalLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -183,5 +182,6 @@ func (m KNXNetIPMessage) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (totalLength))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iKNXNetIPMessage.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go
index b17190f..041b0ad 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpCore.go
@@ -94,8 +94,12 @@ func KnxNetIpCoreParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 }
 
 func (m KnxNetIpCore) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (version)
-	version := uint8(m.version)
-	io.WriteUint8(8, (version))
+		// Simple Field (version)
+		version := uint8(m.version)
+		io.WriteUint8(8, (version))
+
+	}
+	ServiceIdSerialize(io, m.ServiceId, CastIServiceId(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go
index 7c01fee..acf4b4b 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpDeviceManagement.go
@@ -94,8 +94,12 @@ func KnxNetIpDeviceManagementParse(io spi.ReadBuffer) (ServiceIdInitializer, err
 }
 
 func (m KnxNetIpDeviceManagement) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (version)
-	version := uint8(m.version)
-	io.WriteUint8(8, (version))
+		// Simple Field (version)
+		version := uint8(m.version)
+		io.WriteUint8(8, (version))
+
+	}
+	ServiceIdSerialize(io, m.ServiceId, CastIServiceId(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go
index 3de7278..1c6067f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetIpTunneling.go
@@ -94,8 +94,12 @@ func KnxNetIpTunnelingParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 }
 
 func (m KnxNetIpTunneling) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (version)
-	version := uint8(m.version)
-	io.WriteUint8(8, (version))
+		// Simple Field (version)
+		version := uint8(m.version)
+		io.WriteUint8(8, (version))
+
+	}
+	ServiceIdSerialize(io, m.ServiceId, CastIServiceId(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go
index 6c540ee..e3b6454 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetObjectServer.go
@@ -94,8 +94,12 @@ func KnxNetObjectServerParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 }
 
 func (m KnxNetObjectServer) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (version)
-	version := uint8(m.version)
-	io.WriteUint8(8, (version))
+		// Simple Field (version)
+		version := uint8(m.version)
+		io.WriteUint8(8, (version))
+
+	}
+	ServiceIdSerialize(io, m.ServiceId, CastIServiceId(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go
index fef2aea..79daf5d 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteConfigurationAndDiagnosis.go
@@ -94,8 +94,12 @@ func KnxNetRemoteConfigurationAndDiagnosisParse(io spi.ReadBuffer) (ServiceIdIni
 }
 
 func (m KnxNetRemoteConfigurationAndDiagnosis) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (version)
-	version := uint8(m.version)
-	io.WriteUint8(8, (version))
+		// Simple Field (version)
+		version := uint8(m.version)
+		io.WriteUint8(8, (version))
+
+	}
+	ServiceIdSerialize(io, m.ServiceId, CastIServiceId(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go
index 9d74086..7f448d8 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/KnxNetRemoteLogging.go
@@ -94,8 +94,12 @@ func KnxNetRemoteLoggingParse(io spi.ReadBuffer) (ServiceIdInitializer, error) {
 }
 
 func (m KnxNetRemoteLogging) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (version)
-	version := uint8(m.version)
-	io.WriteUint8(8, (version))
+		// Simple Field (version)
+		version := uint8(m.version)
+		io.WriteUint8(8, (version))
+
+	}
+	ServiceIdSerialize(io, m.ServiceId, CastIServiceId(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
index 3f2e175..622b583 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/MACAddress.go
@@ -102,4 +102,5 @@ func (m MACAddress) Serialize(io spi.WriteBuffer) {
 			io.WriteInt8(8, _element)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go
index 4ec44ca..2c9c948 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ProjectInstallationIdentifier.go
@@ -102,4 +102,5 @@ func (m ProjectInstallationIdentifier) Serialize(io spi.WriteBuffer) {
 	// Simple Field (installationNumber)
 	installationNumber := uint8(m.installationNumber)
 	io.WriteUint8(8, (installationNumber))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go
index 1950aa2..4c55b4f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RelativeTimestamp.go
@@ -88,4 +88,5 @@ func (m RelativeTimestamp) Serialize(io spi.WriteBuffer) {
 	// Simple Field (timestamp)
 	timestamp := uint16(m.timestamp)
 	io.WriteUint16(16, (timestamp))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RoutingIndication.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RoutingIndication.go
index 06265a6..0058e4f 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RoutingIndication.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/RoutingIndication.go
@@ -83,5 +83,8 @@ func RoutingIndicationParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 }
 
 func (m RoutingIndication) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
index 11a2b62..619bb6a 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchRequest.go
@@ -100,8 +100,12 @@ func SearchRequestParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error) {
 }
 
 func (m SearchRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (hpaiIDiscoveryEndpoint)
-	hpaiIDiscoveryEndpoint := IHPAIDiscoveryEndpoint(m.hpaiIDiscoveryEndpoint)
-	hpaiIDiscoveryEndpoint.Serialize(io)
+		// Simple Field (hpaiIDiscoveryEndpoint)
+		hpaiIDiscoveryEndpoint := CastIHPAIDiscoveryEndpoint(m.hpaiIDiscoveryEndpoint)
+		hpaiIDiscoveryEndpoint.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
index bb4a870..06ef837 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/SearchResponse.go
@@ -130,16 +130,20 @@ func SearchResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, error)
 }
 
 func (m SearchResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (hpaiControlEndpoint)
-	hpaiControlEndpoint := IHPAIControlEndpoint(m.hpaiControlEndpoint)
-	hpaiControlEndpoint.Serialize(io)
+		// Simple Field (hpaiControlEndpoint)
+		hpaiControlEndpoint := CastIHPAIControlEndpoint(m.hpaiControlEndpoint)
+		hpaiControlEndpoint.Serialize(io)
 
-	// Simple Field (dibDeviceInfo)
-	dibDeviceInfo := IDIBDeviceInfo(m.dibDeviceInfo)
-	dibDeviceInfo.Serialize(io)
+		// Simple Field (dibDeviceInfo)
+		dibDeviceInfo := CastIDIBDeviceInfo(m.dibDeviceInfo)
+		dibDeviceInfo.Serialize(io)
 
-	// Simple Field (dibSuppSvcFamilies)
-	dibSuppSvcFamilies := IDIBSuppSvcFamilies(m.dibSuppSvcFamilies)
-	dibSuppSvcFamilies.Serialize(io)
+		// Simple Field (dibSuppSvcFamilies)
+		dibSuppSvcFamilies := CastIDIBSuppSvcFamilies(m.dibSuppSvcFamilies)
+		dibSuppSvcFamilies.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go
index f7e8f47..13aacd7 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/ServiceId.go
@@ -110,13 +110,13 @@ func ServiceIdParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m ServiceId) Serialize(io spi.WriteBuffer) {
-	iServiceId := CastIServiceId(m)
+func ServiceIdSerialize(io spi.WriteBuffer, m ServiceId, i IServiceId, childSerialize func()) {
 
 	// Discriminator Field (serviceType) (Used as input to a switch field)
-	serviceType := uint8(ServiceIdServiceType(iServiceId))
+	serviceType := uint8(i.ServiceType())
 	io.WriteUint8(8, (serviceType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iServiceId.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
index abf1ab1..bc8c873 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequest.go
@@ -115,12 +115,16 @@ func TunnelingRequestParse(io spi.ReadBuffer, totalLength uint16) (KNXNetIPMessa
 }
 
 func (m TunnelingRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (tunnelingRequestDataBlock)
-	tunnelingRequestDataBlock := ITunnelingRequestDataBlock(m.tunnelingRequestDataBlock)
-	tunnelingRequestDataBlock.Serialize(io)
+		// Simple Field (tunnelingRequestDataBlock)
+		tunnelingRequestDataBlock := CastITunnelingRequestDataBlock(m.tunnelingRequestDataBlock)
+		tunnelingRequestDataBlock.Serialize(io)
 
-	// Simple Field (cemi)
-	cemi := ICEMI(m.cemi)
-	cemi.Serialize(io)
+		// Simple Field (cemi)
+		cemi := CastICEMI(m.cemi)
+		cemi.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
index 5324c76..b01a2d4 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingRequestDataBlock.go
@@ -136,4 +136,5 @@ func (m TunnelingRequestDataBlock) Serialize(io spi.WriteBuffer) {
 
 	// Reserved Field (reserved)
 	io.WriteUint8(8, 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 faa4165..2d5edb2 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponse.go
@@ -100,8 +100,12 @@ func TunnelingResponseParse(io spi.ReadBuffer) (KNXNetIPMessageInitializer, erro
 }
 
 func (m TunnelingResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (tunnelingResponseDataBlock)
-	tunnelingResponseDataBlock := ITunnelingResponseDataBlock(m.tunnelingResponseDataBlock)
-	tunnelingResponseDataBlock.Serialize(io)
+		// Simple Field (tunnelingResponseDataBlock)
+		tunnelingResponseDataBlock := CastITunnelingResponseDataBlock(m.tunnelingResponseDataBlock)
+		tunnelingResponseDataBlock.Serialize(io)
+
+	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
index 48af461..18523ba 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/TunnelingResponseDataBlock.go
@@ -127,6 +127,7 @@ func (m TunnelingResponseDataBlock) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (sequenceCounter))
 
 	// Enum field (status)
-	status := IStatus(m.status)
+	status := CastStatus(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 6bf350a..964a743 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/UnknownMessage.go
@@ -105,11 +105,15 @@ func UnknownMessageParse(io spi.ReadBuffer, totalLength uint16) (KNXNetIPMessage
 }
 
 func (m UnknownMessage) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (unknownData)
-	if m.unknownData != nil {
-		for _, _element := range m.unknownData {
-			io.WriteInt8(8, _element)
+		// Array Field (unknownData)
+		if m.unknownData != nil {
+			for _, _element := range m.unknownData {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	KNXNetIPMessageSerialize(io, m.KNXNetIPMessage, CastIKNXNetIPMessage(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go
index f15f731..6d3e802 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusConstants.go
@@ -93,4 +93,5 @@ func (m ModbusConstants) Serialize(io spi.WriteBuffer) {
 
 	// Const Field (modbusTcpDefaultPort)
 	io.WriteUint16(16, 502)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go
index df3c2c8..dfe474e 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDU.go
@@ -189,17 +189,17 @@ func ModbusPDUParse(io spi.ReadBuffer, response bool) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m ModbusPDU) Serialize(io spi.WriteBuffer) {
-	iModbusPDU := CastIModbusPDU(m)
+func ModbusPDUSerialize(io spi.WriteBuffer, m ModbusPDU, i IModbusPDU, childSerialize func()) {
 
 	// Discriminator Field (errorFlag) (Used as input to a switch field)
-	errorFlag := bool(ModbusPDUErrorFlag(iModbusPDU))
+	errorFlag := bool(i.ErrorFlag())
 	io.WriteBit((bool)(errorFlag))
 
 	// Discriminator Field (functionFlag) (Used as input to a switch field)
-	functionFlag := uint8(ModbusPDUFunctionFlag(iModbusPDU))
+	functionFlag := uint8(i.FunctionFlag())
 	io.WriteUint8(7, (functionFlag))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iModbusPDU.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go
index 0eba78c..e28249f 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUDiagnosticRequest.go
@@ -112,12 +112,16 @@ func ModbusPDUDiagnosticRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, e
 }
 
 func (m ModbusPDUDiagnosticRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (status)
-	status := uint16(m.status)
-	io.WriteUint16(16, (status))
+		// Simple Field (status)
+		status := uint16(m.status)
+		io.WriteUint16(16, (status))
 
-	// Simple Field (eventCount)
-	eventCount := uint16(m.eventCount)
-	io.WriteUint16(16, (eventCount))
+		// Simple Field (eventCount)
+		eventCount := uint16(m.eventCount)
+		io.WriteUint16(16, (eventCount))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go
index d4d9983..8acb1c6 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUError.go
@@ -102,8 +102,12 @@ func ModbusPDUErrorParse(io spi.ReadBuffer) (ModbusPDUInitializer, error) {
 }
 
 func (m ModbusPDUError) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (exceptionCode)
-	exceptionCode := uint8(m.exceptionCode)
-	io.WriteUint8(8, (exceptionCode))
+		// Simple Field (exceptionCode)
+		exceptionCode := uint8(m.exceptionCode)
+		io.WriteUint8(8, (exceptionCode))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogRequest.go
index c2d1645..394fd1c 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogRequest.go
@@ -91,5 +91,8 @@ func ModbusPDUGetComEventLogRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 }
 
 func (m ModbusPDUGetComEventLogRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
index 146fa17..dd396cf 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUGetComEventLogResponse.go
@@ -152,27 +152,31 @@ func ModbusPDUGetComEventLogResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 func (m ModbusPDUGetComEventLogResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(uint8(len(m.events))) + uint8(uint8(6)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(uint8(len(m.events))) + uint8(uint8(6)))
+		io.WriteUint8(8, (byteCount))
 
-	// Simple Field (status)
-	status := uint16(m.status)
-	io.WriteUint16(16, (status))
+		// Simple Field (status)
+		status := uint16(m.status)
+		io.WriteUint16(16, (status))
 
-	// Simple Field (eventCount)
-	eventCount := uint16(m.eventCount)
-	io.WriteUint16(16, (eventCount))
+		// Simple Field (eventCount)
+		eventCount := uint16(m.eventCount)
+		io.WriteUint16(16, (eventCount))
 
-	// Simple Field (messageCount)
-	messageCount := uint16(m.messageCount)
-	io.WriteUint16(16, (messageCount))
+		// Simple Field (messageCount)
+		messageCount := uint16(m.messageCount)
+		io.WriteUint16(16, (messageCount))
 
-	// Array Field (events)
-	if m.events != nil {
-		for _, _element := range m.events {
-			io.WriteInt8(8, _element)
+		// Array Field (events)
+		if m.events != nil {
+			for _, _element := range m.events {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go
index a304f89..6421e28 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterRequest.go
@@ -122,16 +122,20 @@ func ModbusPDUMaskWriteHoldingRegisterRequestParse(io spi.ReadBuffer) (ModbusPDU
 }
 
 func (m ModbusPDUMaskWriteHoldingRegisterRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (referenceAddress)
-	referenceAddress := uint16(m.referenceAddress)
-	io.WriteUint16(16, (referenceAddress))
+		// Simple Field (referenceAddress)
+		referenceAddress := uint16(m.referenceAddress)
+		io.WriteUint16(16, (referenceAddress))
 
-	// Simple Field (andMask)
-	andMask := uint16(m.andMask)
-	io.WriteUint16(16, (andMask))
+		// Simple Field (andMask)
+		andMask := uint16(m.andMask)
+		io.WriteUint16(16, (andMask))
 
-	// Simple Field (orMask)
-	orMask := uint16(m.orMask)
-	io.WriteUint16(16, (orMask))
+		// Simple Field (orMask)
+		orMask := uint16(m.orMask)
+		io.WriteUint16(16, (orMask))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go
index ac9fe49..98a8602 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUMaskWriteHoldingRegisterResponse.go
@@ -122,16 +122,20 @@ func ModbusPDUMaskWriteHoldingRegisterResponseParse(io spi.ReadBuffer) (ModbusPD
 }
 
 func (m ModbusPDUMaskWriteHoldingRegisterResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (referenceAddress)
-	referenceAddress := uint16(m.referenceAddress)
-	io.WriteUint16(16, (referenceAddress))
+		// Simple Field (referenceAddress)
+		referenceAddress := uint16(m.referenceAddress)
+		io.WriteUint16(16, (referenceAddress))
 
-	// Simple Field (andMask)
-	andMask := uint16(m.andMask)
-	io.WriteUint16(16, (andMask))
+		// Simple Field (andMask)
+		andMask := uint16(m.andMask)
+		io.WriteUint16(16, (andMask))
 
-	// Simple Field (orMask)
-	orMask := uint16(m.orMask)
-	io.WriteUint16(16, (orMask))
+		// Simple Field (orMask)
+		orMask := uint16(m.orMask)
+		io.WriteUint16(16, (orMask))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go
index 36cfa7c..41cec7f 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsRequest.go
@@ -112,12 +112,16 @@ func ModbusPDUReadCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer, er
 }
 
 func (m ModbusPDUReadCoilsRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
index 256bf0a..bf6ddc3 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadCoilsResponse.go
@@ -122,15 +122,19 @@ func ModbusPDUReadCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUInitializer, e
 }
 
 func (m ModbusPDUReadCoilsResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationRequest.go
index 397c380..23a333b 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationRequest.go
@@ -91,5 +91,8 @@ func ModbusPDUReadDeviceIdentificationRequestParse(io spi.ReadBuffer) (ModbusPDU
 }
 
 func (m ModbusPDUReadDeviceIdentificationRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go
index 092c9d4..fc3baf1 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDeviceIdentificationResponse.go
@@ -91,5 +91,8 @@ func ModbusPDUReadDeviceIdentificationResponseParse(io spi.ReadBuffer) (ModbusPD
 }
 
 func (m ModbusPDUReadDeviceIdentificationResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go
index fe42bbd..8a182ba 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsRequest.go
@@ -112,12 +112,16 @@ func ModbusPDUReadDiscreteInputsRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 }
 
 func (m ModbusPDUReadDiscreteInputsRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
index d42da5e..023ab53 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadDiscreteInputsResponse.go
@@ -122,15 +122,19 @@ func ModbusPDUReadDiscreteInputsResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 func (m ModbusPDUReadDiscreteInputsResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusRequest.go
index 4c550b4..c6d6240 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusRequest.go
@@ -91,5 +91,8 @@ func ModbusPDUReadExceptionStatusRequestParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 func (m ModbusPDUReadExceptionStatusRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go
index 491dc2b..9c81bac 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadExceptionStatusResponse.go
@@ -102,8 +102,12 @@ func ModbusPDUReadExceptionStatusResponseParse(io spi.ReadBuffer) (ModbusPDUInit
 }
 
 func (m ModbusPDUReadExceptionStatusResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (value)
-	value := uint8(m.value)
-	io.WriteUint8(8, (value))
+		// Simple Field (value)
+		value := uint8(m.value)
+		io.WriteUint8(8, (value))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go
index ba6767f..5679259 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueRequest.go
@@ -102,8 +102,12 @@ func ModbusPDUReadFifoQueueRequestParse(io spi.ReadBuffer) (ModbusPDUInitializer
 }
 
 func (m ModbusPDUReadFifoQueueRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (fifoPointerAddress)
-	fifoPointerAddress := uint16(m.fifoPointerAddress)
-	io.WriteUint16(16, (fifoPointerAddress))
+		// Simple Field (fifoPointerAddress)
+		fifoPointerAddress := uint16(m.fifoPointerAddress)
+		io.WriteUint16(16, (fifoPointerAddress))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
index 218be8e..43f19b5 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFifoQueueResponse.go
@@ -131,19 +131,23 @@ func ModbusPDUReadFifoQueueResponseParse(io spi.ReadBuffer) (ModbusPDUInitialize
 }
 
 func (m ModbusPDUReadFifoQueueResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint16(uint16(uint16(uint16(uint16(len(m.fifoValue)))*uint16(uint16(2)))) + uint16(uint16(2)))
-	io.WriteUint16(16, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint16(uint16(uint16(uint16(uint16(len(m.fifoValue)))*uint16(uint16(2)))) + uint16(uint16(2)))
+		io.WriteUint16(16, (byteCount))
 
-	// Implicit Field (fifoCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	fifoCount := uint16(uint16(uint16(uint16(uint16(len(m.fifoValue)))*uint16(uint16(2)))) / uint16(uint16(2)))
-	io.WriteUint16(16, (fifoCount))
+		// Implicit Field (fifoCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		fifoCount := uint16(uint16(uint16(uint16(uint16(len(m.fifoValue)))*uint16(uint16(2)))) / uint16(uint16(2)))
+		io.WriteUint16(16, (fifoCount))
 
-	// Array Field (fifoValue)
-	if m.fifoValue != nil {
-		for _, _element := range m.fifoValue {
-			io.WriteUint16(16, _element)
+		// Array Field (fifoValue)
+		if m.fifoValue != nil {
+			for _, _element := range m.fifoValue {
+				io.WriteUint16(16, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
index 2ca0307..412d0ee 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequest.go
@@ -135,15 +135,19 @@ func (m ModbusPDUReadFileRecordRequest) Serialize(io spi.WriteBuffer) {
 		}
 		return sizeInBytes
 	}
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go
index 8bb5727..a1b2e2b 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordRequestItem.go
@@ -130,4 +130,5 @@ func (m ModbusPDUReadFileRecordRequestItem) Serialize(io spi.WriteBuffer) {
 	// Simple Field (recordLength)
 	recordLength := uint16(m.recordLength)
 	io.WriteUint16(16, (recordLength))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
index 2c3d71c..ef7ad42 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponse.go
@@ -135,15 +135,19 @@ func (m ModbusPDUReadFileRecordResponse) Serialize(io spi.WriteBuffer) {
 		}
 		return sizeInBytes
 	}
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
index 78582c4..bce5c75 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadFileRecordResponseItem.go
@@ -127,4 +127,5 @@ func (m ModbusPDUReadFileRecordResponseItem) Serialize(io spi.WriteBuffer) {
 			io.WriteInt8(8, _element)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go
index 285ff5e..13d976d 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersRequest.go
@@ -112,12 +112,16 @@ func ModbusPDUReadHoldingRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInit
 }
 
 func (m ModbusPDUReadHoldingRegistersRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
index 7954bef..2ad530a 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadHoldingRegistersResponse.go
@@ -122,15 +122,19 @@ func ModbusPDUReadHoldingRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIni
 }
 
 func (m ModbusPDUReadHoldingRegistersResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go
index 00382f0..f8e138d 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersRequest.go
@@ -112,12 +112,16 @@ func ModbusPDUReadInputRegistersRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 }
 
 func (m ModbusPDUReadInputRegistersRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
index f8b4711..0543102 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadInputRegistersResponse.go
@@ -122,15 +122,19 @@ func ModbusPDUReadInputRegistersResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 func (m ModbusPDUReadInputRegistersResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
index b2b78e8..c89e951 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersRequest.go
@@ -162,31 +162,35 @@ func ModbusPDUReadWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (readStartingAddress)
-	readStartingAddress := uint16(m.readStartingAddress)
-	io.WriteUint16(16, (readStartingAddress))
+		// Simple Field (readStartingAddress)
+		readStartingAddress := uint16(m.readStartingAddress)
+		io.WriteUint16(16, (readStartingAddress))
 
-	// Simple Field (readQuantity)
-	readQuantity := uint16(m.readQuantity)
-	io.WriteUint16(16, (readQuantity))
+		// Simple Field (readQuantity)
+		readQuantity := uint16(m.readQuantity)
+		io.WriteUint16(16, (readQuantity))
 
-	// Simple Field (writeStartingAddress)
-	writeStartingAddress := uint16(m.writeStartingAddress)
-	io.WriteUint16(16, (writeStartingAddress))
+		// Simple Field (writeStartingAddress)
+		writeStartingAddress := uint16(m.writeStartingAddress)
+		io.WriteUint16(16, (writeStartingAddress))
 
-	// Simple Field (writeQuantity)
-	writeQuantity := uint16(m.writeQuantity)
-	io.WriteUint16(16, (writeQuantity))
+		// Simple Field (writeQuantity)
+		writeQuantity := uint16(m.writeQuantity)
+		io.WriteUint16(16, (writeQuantity))
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
index 687af9e..3f17dae 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReadWriteMultipleHoldingRegistersResponse.go
@@ -122,15 +122,19 @@ func ModbusPDUReadWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer)
 }
 
 func (m ModbusPDUReadWriteMultipleHoldingRegistersResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdRequest.go
index 6cd7368..46c3ba6 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdRequest.go
@@ -91,5 +91,8 @@ func ModbusPDUReportServerIdRequestParse(io spi.ReadBuffer) (ModbusPDUInitialize
 }
 
 func (m ModbusPDUReportServerIdRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
index 0e6e2c2..103638a 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUReportServerIdResponse.go
@@ -122,15 +122,19 @@ func ModbusPDUReportServerIdResponseParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 func (m ModbusPDUReportServerIdResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
index 6bbc593..14b25eb 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequest.go
@@ -135,15 +135,19 @@ func (m ModbusPDUWriteFileRecordRequest) Serialize(io spi.WriteBuffer) {
 		}
 		return sizeInBytes
 	}
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
index 52aa1be..b980a50 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordRequestItem.go
@@ -155,4 +155,5 @@ func (m ModbusPDUWriteFileRecordRequestItem) Serialize(io spi.WriteBuffer) {
 			io.WriteInt8(8, _element)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
index e9e6533..b749598 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponse.go
@@ -135,15 +135,19 @@ func (m ModbusPDUWriteFileRecordResponse) Serialize(io spi.WriteBuffer) {
 		}
 		return sizeInBytes
 	}
+	ser := func() {
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(itemsArraySizeInBytes(m.items)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
index f4c3f54..a6b0d6f 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteFileRecordResponseItem.go
@@ -155,4 +155,5 @@ func (m ModbusPDUWriteFileRecordResponseItem) Serialize(io spi.WriteBuffer) {
 			io.WriteInt8(8, _element)
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
index 9a486ad..36aeaba 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsRequest.go
@@ -142,23 +142,27 @@ func ModbusPDUWriteMultipleCoilsRequestParse(io spi.ReadBuffer) (ModbusPDUInitia
 }
 
 func (m ModbusPDUWriteMultipleCoilsRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go
index 452c3df..7efff10 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleCoilsResponse.go
@@ -112,12 +112,16 @@ func ModbusPDUWriteMultipleCoilsResponseParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 func (m ModbusPDUWriteMultipleCoilsResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
index 92218df..63c7286 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersRequest.go
@@ -142,23 +142,27 @@ func ModbusPDUWriteMultipleHoldingRegistersRequestParse(io spi.ReadBuffer) (Modb
 }
 
 func (m ModbusPDUWriteMultipleHoldingRegistersRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
 
-	// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	byteCount := uint8(uint8(len(m.value)))
-	io.WriteUint8(8, (byteCount))
+		// Implicit Field (byteCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		byteCount := uint8(uint8(len(m.value)))
+		io.WriteUint8(8, (byteCount))
 
-	// Array Field (value)
-	if m.value != nil {
-		for _, _element := range m.value {
-			io.WriteInt8(8, _element)
+		// Array Field (value)
+		if m.value != nil {
+			for _, _element := range m.value {
+				io.WriteInt8(8, _element)
+			}
 		}
+
 	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go
index 73c4f14..01a7474 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteMultipleHoldingRegistersResponse.go
@@ -112,12 +112,16 @@ func ModbusPDUWriteMultipleHoldingRegistersResponseParse(io spi.ReadBuffer) (Mod
 }
 
 func (m ModbusPDUWriteMultipleHoldingRegistersResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (startingAddress)
-	startingAddress := uint16(m.startingAddress)
-	io.WriteUint16(16, (startingAddress))
+		// Simple Field (startingAddress)
+		startingAddress := uint16(m.startingAddress)
+		io.WriteUint16(16, (startingAddress))
 
-	// Simple Field (quantity)
-	quantity := uint16(m.quantity)
-	io.WriteUint16(16, (quantity))
+		// Simple Field (quantity)
+		quantity := uint16(m.quantity)
+		io.WriteUint16(16, (quantity))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go
index af52726..a6dc734 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilRequest.go
@@ -112,12 +112,16 @@ func ModbusPDUWriteSingleCoilRequestParse(io spi.ReadBuffer) (ModbusPDUInitializ
 }
 
 func (m ModbusPDUWriteSingleCoilRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (address)
-	address := uint16(m.address)
-	io.WriteUint16(16, (address))
+		// Simple Field (address)
+		address := uint16(m.address)
+		io.WriteUint16(16, (address))
 
-	// Simple Field (value)
-	value := uint16(m.value)
-	io.WriteUint16(16, (value))
+		// Simple Field (value)
+		value := uint16(m.value)
+		io.WriteUint16(16, (value))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go
index 9aa9c11..0db3fbc 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleCoilResponse.go
@@ -112,12 +112,16 @@ func ModbusPDUWriteSingleCoilResponseParse(io spi.ReadBuffer) (ModbusPDUInitiali
 }
 
 func (m ModbusPDUWriteSingleCoilResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (address)
-	address := uint16(m.address)
-	io.WriteUint16(16, (address))
+		// Simple Field (address)
+		address := uint16(m.address)
+		io.WriteUint16(16, (address))
 
-	// Simple Field (value)
-	value := uint16(m.value)
-	io.WriteUint16(16, (value))
+		// Simple Field (value)
+		value := uint16(m.value)
+		io.WriteUint16(16, (value))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go
index 3cc90e2..362944f 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterRequest.go
@@ -112,12 +112,16 @@ func ModbusPDUWriteSingleRegisterRequestParse(io spi.ReadBuffer) (ModbusPDUIniti
 }
 
 func (m ModbusPDUWriteSingleRegisterRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (address)
-	address := uint16(m.address)
-	io.WriteUint16(16, (address))
+		// Simple Field (address)
+		address := uint16(m.address)
+		io.WriteUint16(16, (address))
 
-	// Simple Field (value)
-	value := uint16(m.value)
-	io.WriteUint16(16, (value))
+		// Simple Field (value)
+		value := uint16(m.value)
+		io.WriteUint16(16, (value))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go
index 311fab9..9dd89ad 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusPDUWriteSingleRegisterResponse.go
@@ -112,12 +112,16 @@ func ModbusPDUWriteSingleRegisterResponseParse(io spi.ReadBuffer) (ModbusPDUInit
 }
 
 func (m ModbusPDUWriteSingleRegisterResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (address)
-	address := uint16(m.address)
-	io.WriteUint16(16, (address))
+		// Simple Field (address)
+		address := uint16(m.address)
+		io.WriteUint16(16, (address))
 
-	// Simple Field (value)
-	value := uint16(m.value)
-	io.WriteUint16(16, (value))
+		// Simple Field (value)
+		value := uint16(m.value)
+		io.WriteUint16(16, (value))
+
+	}
+	ModbusPDUSerialize(io, m.ModbusPDU, CastIModbusPDU(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
index f457ae4..d21d277 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusSerialADU.go
@@ -155,6 +155,7 @@ func (m ModbusSerialADU) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (address))
 
 	// Simple Field (pdu)
-	pdu := IModbusPDU(m.pdu)
+	pdu := CastIModbusPDU(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 c1f4fe2..34e9a57 100644
--- a/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusTcpADU.go
+++ b/sandbox/plc4go/internal/plc4go/modbus/readwrite/model/ModbusTcpADU.go
@@ -152,6 +152,7 @@ func (m ModbusTcpADU) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (unitIdentifier))
 
 	// Simple Field (pdu)
-	pdu := IModbusPDU(m.pdu)
+	pdu := CastIModbusPDU(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 4a5abc9..2f27d38 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacket.go
@@ -172,19 +172,18 @@ func COTPPacketParse(io spi.ReadBuffer, cotpLen uint16) (spi.Message, error) {
 	return initializer.initialize(parameters, payload), nil
 }
 
-func (m COTPPacket) Serialize(io spi.WriteBuffer) {
-	iCOTPPacket := CastICOTPPacket(m)
+func COTPPacketSerialize(io spi.WriteBuffer, m COTPPacket, i ICOTPPacket, childSerialize func()) {
 
 	// 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)))))
 	io.WriteUint8(8, (headerLength))
 
 	// Discriminator Field (tpduCode) (Used as input to a switch field)
-	tpduCode := uint8(COTPPacketTpduCode(iCOTPPacket))
+	tpduCode := uint8(i.TpduCode())
 	io.WriteUint8(8, (tpduCode))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iCOTPPacket.Serialize(io)
+	childSerialize()
 
 	// Array Field (parameters)
 	if m.parameters != nil {
@@ -197,6 +196,7 @@ func (m COTPPacket) Serialize(io spi.WriteBuffer) {
 	var payload *IS7Message = nil
 	if m.payload != nil {
 		payload = m.payload
-		(*payload).Serialize(io)
+		CastIS7Message(*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 6da24d4..78217b8 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionRequest.go
@@ -116,16 +116,20 @@ func COTPPacketConnectionRequestParse(io spi.ReadBuffer) (COTPPacketInitializer,
 }
 
 func (m COTPPacketConnectionRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (destinationReference)
-	destinationReference := uint16(m.destinationReference)
-	io.WriteUint16(16, (destinationReference))
+		// Simple Field (destinationReference)
+		destinationReference := uint16(m.destinationReference)
+		io.WriteUint16(16, (destinationReference))
 
-	// Simple Field (sourceReference)
-	sourceReference := uint16(m.sourceReference)
-	io.WriteUint16(16, (sourceReference))
+		// Simple Field (sourceReference)
+		sourceReference := uint16(m.sourceReference)
+		io.WriteUint16(16, (sourceReference))
 
-	// Enum field (protocolClass)
-	protocolClass := ICOTPProtocolClass(m.protocolClass)
-	protocolClass.Serialize(io)
+		// Enum field (protocolClass)
+		protocolClass := CastCOTPProtocolClass(m.protocolClass)
+		protocolClass.Serialize(io)
+
+	}
+	COTPPacketSerialize(io, m.COTPPacket, CastICOTPPacket(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go
index 05a875f..0553355 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketConnectionResponse.go
@@ -116,16 +116,20 @@ func COTPPacketConnectionResponseParse(io spi.ReadBuffer) (COTPPacketInitializer
 }
 
 func (m COTPPacketConnectionResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (destinationReference)
-	destinationReference := uint16(m.destinationReference)
-	io.WriteUint16(16, (destinationReference))
+		// Simple Field (destinationReference)
+		destinationReference := uint16(m.destinationReference)
+		io.WriteUint16(16, (destinationReference))
 
-	// Simple Field (sourceReference)
-	sourceReference := uint16(m.sourceReference)
-	io.WriteUint16(16, (sourceReference))
+		// Simple Field (sourceReference)
+		sourceReference := uint16(m.sourceReference)
+		io.WriteUint16(16, (sourceReference))
 
-	// Enum field (protocolClass)
-	protocolClass := ICOTPProtocolClass(m.protocolClass)
-	protocolClass.Serialize(io)
+		// Enum field (protocolClass)
+		protocolClass := CastCOTPProtocolClass(m.protocolClass)
+		protocolClass.Serialize(io)
+
+	}
+	COTPPacketSerialize(io, m.COTPPacket, CastICOTPPacket(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go
index c03a757..7737610 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketData.go
@@ -106,12 +106,16 @@ func COTPPacketDataParse(io spi.ReadBuffer) (COTPPacketInitializer, error) {
 }
 
 func (m COTPPacketData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (eot)
-	eot := bool(m.eot)
-	io.WriteBit((bool)(eot))
+		// Simple Field (eot)
+		eot := bool(m.eot)
+		io.WriteBit((bool)(eot))
 
-	// Simple Field (tpduRef)
-	tpduRef := uint8(m.tpduRef)
-	io.WriteUint8(7, (tpduRef))
+		// Simple Field (tpduRef)
+		tpduRef := uint8(m.tpduRef)
+		io.WriteUint8(7, (tpduRef))
+
+	}
+	COTPPacketSerialize(io, m.COTPPacket, CastICOTPPacket(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go
index 738dcdf..134b246 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectRequest.go
@@ -116,16 +116,20 @@ func COTPPacketDisconnectRequestParse(io spi.ReadBuffer) (COTPPacketInitializer,
 }
 
 func (m COTPPacketDisconnectRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (destinationReference)
-	destinationReference := uint16(m.destinationReference)
-	io.WriteUint16(16, (destinationReference))
+		// Simple Field (destinationReference)
+		destinationReference := uint16(m.destinationReference)
+		io.WriteUint16(16, (destinationReference))
 
-	// Simple Field (sourceReference)
-	sourceReference := uint16(m.sourceReference)
-	io.WriteUint16(16, (sourceReference))
+		// Simple Field (sourceReference)
+		sourceReference := uint16(m.sourceReference)
+		io.WriteUint16(16, (sourceReference))
 
-	// Enum field (protocolClass)
-	protocolClass := ICOTPProtocolClass(m.protocolClass)
-	protocolClass.Serialize(io)
+		// Enum field (protocolClass)
+		protocolClass := CastCOTPProtocolClass(m.protocolClass)
+		protocolClass.Serialize(io)
+
+	}
+	COTPPacketSerialize(io, m.COTPPacket, CastICOTPPacket(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go
index fa2e0af..d5d1d94 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketDisconnectResponse.go
@@ -106,12 +106,16 @@ func COTPPacketDisconnectResponseParse(io spi.ReadBuffer) (COTPPacketInitializer
 }
 
 func (m COTPPacketDisconnectResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (destinationReference)
-	destinationReference := uint16(m.destinationReference)
-	io.WriteUint16(16, (destinationReference))
+		// Simple Field (destinationReference)
+		destinationReference := uint16(m.destinationReference)
+		io.WriteUint16(16, (destinationReference))
 
-	// Simple Field (sourceReference)
-	sourceReference := uint16(m.sourceReference)
-	io.WriteUint16(16, (sourceReference))
+		// Simple Field (sourceReference)
+		sourceReference := uint16(m.sourceReference)
+		io.WriteUint16(16, (sourceReference))
+
+	}
+	COTPPacketSerialize(io, m.COTPPacket, CastICOTPPacket(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go
index 7346751..802b3b3 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPPacketTpduError.go
@@ -106,12 +106,16 @@ func COTPPacketTpduErrorParse(io spi.ReadBuffer) (COTPPacketInitializer, error)
 }
 
 func (m COTPPacketTpduError) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (destinationReference)
-	destinationReference := uint16(m.destinationReference)
-	io.WriteUint16(16, (destinationReference))
+		// Simple Field (destinationReference)
+		destinationReference := uint16(m.destinationReference)
+		io.WriteUint16(16, (destinationReference))
 
-	// Simple Field (rejectCause)
-	rejectCause := uint8(m.rejectCause)
-	io.WriteUint8(8, (rejectCause))
+		// Simple Field (rejectCause)
+		rejectCause := uint8(m.rejectCause)
+		io.WriteUint8(8, (rejectCause))
+
+	}
+	COTPPacketSerialize(io, m.COTPPacket, CastICOTPPacket(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go
index 1bd7dc7..c812e90 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameter.go
@@ -117,11 +117,10 @@ func COTPParameterParse(io spi.ReadBuffer, rest uint8) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m COTPParameter) Serialize(io spi.WriteBuffer) {
-	iCOTPParameter := CastICOTPParameter(m)
+func COTPParameterSerialize(io spi.WriteBuffer, m COTPParameter, i ICOTPParameter, childSerialize func()) {
 
 	// Discriminator Field (parameterType) (Used as input to a switch field)
-	parameterType := uint8(COTPParameterParameterType(iCOTPParameter))
+	parameterType := uint8(i.ParameterType())
 	io.WriteUint8(8, (parameterType))
 
 	// Implicit Field (parameterLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -129,5 +128,6 @@ func (m COTPParameter) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(8, (parameterLength))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iCOTPParameter.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go
index 9834254..006f97f 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCalledTsap.go
@@ -94,8 +94,12 @@ func COTPParameterCalledTsapParse(io spi.ReadBuffer) (COTPParameterInitializer,
 }
 
 func (m COTPParameterCalledTsap) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (tsapId)
-	tsapId := uint16(m.tsapId)
-	io.WriteUint16(16, (tsapId))
+		// Simple Field (tsapId)
+		tsapId := uint16(m.tsapId)
+		io.WriteUint16(16, (tsapId))
+
+	}
+	COTPParameterSerialize(io, m.COTPParameter, CastICOTPParameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go
index 9033edf..16029ac 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterCallingTsap.go
@@ -94,8 +94,12 @@ func COTPParameterCallingTsapParse(io spi.ReadBuffer) (COTPParameterInitializer,
 }
 
 func (m COTPParameterCallingTsap) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (tsapId)
-	tsapId := uint16(m.tsapId)
-	io.WriteUint16(16, (tsapId))
+		// Simple Field (tsapId)
+		tsapId := uint16(m.tsapId)
+		io.WriteUint16(16, (tsapId))
+
+	}
+	COTPParameterSerialize(io, m.COTPParameter, CastICOTPParameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go
index f3ae6f4..7561921 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterChecksum.go
@@ -94,8 +94,12 @@ func COTPParameterChecksumParse(io spi.ReadBuffer) (COTPParameterInitializer, er
 }
 
 func (m COTPParameterChecksum) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (crc)
-	crc := uint8(m.crc)
-	io.WriteUint8(8, (crc))
+		// Simple Field (crc)
+		crc := uint8(m.crc)
+		io.WriteUint8(8, (crc))
+
+	}
+	COTPParameterSerialize(io, m.COTPParameter, CastICOTPParameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
index 3f43328..55f5eb1 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterDisconnectAdditionalInformation.go
@@ -105,11 +105,15 @@ func COTPParameterDisconnectAdditionalInformationParse(io spi.ReadBuffer, rest u
 }
 
 func (m COTPParameterDisconnectAdditionalInformation) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (data)
-	if m.data != nil {
-		for _, _element := range m.data {
-			io.WriteUint8(8, _element)
+		// Array Field (data)
+		if m.data != nil {
+			for _, _element := range m.data {
+				io.WriteUint8(8, _element)
+			}
 		}
+
 	}
+	COTPParameterSerialize(io, m.COTPParameter, CastICOTPParameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go
index 018d300..b39e1ad 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/COTPParameterTpduSize.go
@@ -94,8 +94,12 @@ func COTPParameterTpduSizeParse(io spi.ReadBuffer) (COTPParameterInitializer, er
 }
 
 func (m COTPParameterTpduSize) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Enum field (tpduSize)
-	tpduSize := ICOTPTpduSize(m.tpduSize)
-	tpduSize.Serialize(io)
+		// Enum field (tpduSize)
+		tpduSize := CastCOTPTpduSize(m.tpduSize)
+		tpduSize.Serialize(io)
+
+	}
+	COTPParameterSerialize(io, m.COTPParameter, CastICOTPParameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go
index c833dc4..78c019e 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Address.go
@@ -100,13 +100,13 @@ func S7AddressParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m S7Address) Serialize(io spi.WriteBuffer) {
-	iS7Address := CastIS7Address(m)
+func S7AddressSerialize(io spi.WriteBuffer, m S7Address, i IS7Address, childSerialize func()) {
 
 	// Discriminator Field (addressType) (Used as input to a switch field)
-	addressType := uint8(S7AddressAddressType(iS7Address))
+	addressType := uint8(i.AddressType())
 	io.WriteUint8(8, (addressType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iS7Address.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
index 0ac78d0..5459635 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7AddressAny.go
@@ -162,31 +162,35 @@ func S7AddressAnyParse(io spi.ReadBuffer) (S7AddressInitializer, error) {
 }
 
 func (m S7AddressAny) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Enum field (transportSize)
-	transportSize := ITransportSize(m.transportSize)
-	transportSize.Serialize(io)
+		// Enum field (transportSize)
+		transportSize := CastTransportSize(m.transportSize)
+		transportSize.Serialize(io)
 
-	// Simple Field (numberOfElements)
-	numberOfElements := uint16(m.numberOfElements)
-	io.WriteUint16(16, (numberOfElements))
+		// Simple Field (numberOfElements)
+		numberOfElements := uint16(m.numberOfElements)
+		io.WriteUint16(16, (numberOfElements))
 
-	// Simple Field (dbNumber)
-	dbNumber := uint16(m.dbNumber)
-	io.WriteUint16(16, (dbNumber))
+		// Simple Field (dbNumber)
+		dbNumber := uint16(m.dbNumber)
+		io.WriteUint16(16, (dbNumber))
 
-	// Enum field (area)
-	area := IMemoryArea(m.area)
-	area.Serialize(io)
+		// Enum field (area)
+		area := CastMemoryArea(m.area)
+		area.Serialize(io)
 
-	// Reserved Field (reserved)
-	io.WriteUint8(5, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(5, uint8(0x00))
 
-	// Simple Field (byteAddress)
-	byteAddress := uint16(m.byteAddress)
-	io.WriteUint16(16, (byteAddress))
+		// Simple Field (byteAddress)
+		byteAddress := uint16(m.byteAddress)
+		io.WriteUint16(16, (byteAddress))
 
-	// Simple Field (bitAddress)
-	bitAddress := uint8(m.bitAddress)
-	io.WriteUint8(3, (bitAddress))
+		// Simple Field (bitAddress)
+		bitAddress := uint8(m.bitAddress)
+		io.WriteUint8(3, (bitAddress))
+
+	}
+	S7AddressSerialize(io, m.S7Address, CastIS7Address(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
index ae4332a..620ac5b 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Message.go
@@ -211,14 +211,13 @@ func S7MessageParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(tpduReference, parameter, payload), nil
 }
 
-func (m S7Message) Serialize(io spi.WriteBuffer) {
-	iS7Message := CastIS7Message(m)
+func S7MessageSerialize(io spi.WriteBuffer, m S7Message, i IS7Message, childSerialize func()) {
 
 	// Const Field (protocolId)
 	io.WriteUint8(8, 0x32)
 
 	// Discriminator Field (messageType) (Used as input to a switch field)
-	messageType := uint8(S7MessageMessageType(iS7Message))
+	messageType := uint8(i.MessageType())
 	io.WriteUint8(8, (messageType))
 
 	// Reserved Field (reserved)
@@ -237,19 +236,20 @@ func (m S7Message) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (payloadLength))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iS7Message.Serialize(io)
+	childSerialize()
 
 	// Optional Field (parameter) (Can be skipped, if the value is null)
 	var parameter *IS7Parameter = nil
 	if m.parameter != nil {
 		parameter = m.parameter
-		(*parameter).Serialize(io)
+		CastIS7Parameter(*parameter).Serialize(io)
 	}
 
 	// Optional Field (payload) (Can be skipped, if the value is null)
 	var payload *IS7Payload = nil
 	if m.payload != nil {
 		payload = m.payload
-		(*payload).Serialize(io)
+		CastIS7Payload(*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 32da070..b7be815 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageRequest.go
@@ -86,5 +86,8 @@ func S7MessageRequestParse(io spi.ReadBuffer) (S7MessageInitializer, error) {
 }
 
 func (m S7MessageRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	S7MessageSerialize(io, m.S7Message, CastIS7Message(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go
index 4bc0c81..6ccc2a1 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponse.go
@@ -107,12 +107,16 @@ func S7MessageResponseParse(io spi.ReadBuffer) (S7MessageInitializer, error) {
 }
 
 func (m S7MessageResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (errorClass)
-	errorClass := uint8(m.errorClass)
-	io.WriteUint8(8, (errorClass))
+		// Simple Field (errorClass)
+		errorClass := uint8(m.errorClass)
+		io.WriteUint8(8, (errorClass))
 
-	// Simple Field (errorCode)
-	errorCode := uint8(m.errorCode)
-	io.WriteUint8(8, (errorCode))
+		// Simple Field (errorCode)
+		errorCode := uint8(m.errorCode)
+		io.WriteUint8(8, (errorCode))
+
+	}
+	S7MessageSerialize(io, m.S7Message, CastIS7Message(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go
index d31ff4f..39fc61b 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageResponseData.go
@@ -107,12 +107,16 @@ func S7MessageResponseDataParse(io spi.ReadBuffer) (S7MessageInitializer, error)
 }
 
 func (m S7MessageResponseData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (errorClass)
-	errorClass := uint8(m.errorClass)
-	io.WriteUint8(8, (errorClass))
+		// Simple Field (errorClass)
+		errorClass := uint8(m.errorClass)
+		io.WriteUint8(8, (errorClass))
 
-	// Simple Field (errorCode)
-	errorCode := uint8(m.errorCode)
-	io.WriteUint8(8, (errorCode))
+		// Simple Field (errorCode)
+		errorCode := uint8(m.errorCode)
+		io.WriteUint8(8, (errorCode))
+
+	}
+	S7MessageSerialize(io, m.S7Message, CastIS7Message(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go
index 99b79f7..ddd996c 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7MessageUserData.go
@@ -86,5 +86,8 @@ func S7MessageUserDataParse(io spi.ReadBuffer) (S7MessageInitializer, error) {
 }
 
 func (m S7MessageUserData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	S7MessageSerialize(io, m.S7Message, CastIS7Message(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go
index 8aa021b..e3230da 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Parameter.go
@@ -115,13 +115,13 @@ func S7ParameterParse(io spi.ReadBuffer, messageType uint8) (spi.Message, error)
 	return initializer.initialize(), nil
 }
 
-func (m S7Parameter) Serialize(io spi.WriteBuffer) {
-	iS7Parameter := CastIS7Parameter(m)
+func S7ParameterSerialize(io spi.WriteBuffer, m S7Parameter, i IS7Parameter, childSerialize func()) {
 
 	// Discriminator Field (parameterType) (Used as input to a switch field)
-	parameterType := uint8(S7ParameterParameterType(iS7Parameter))
+	parameterType := uint8(i.ParameterType())
 	io.WriteUint8(8, (parameterType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iS7Parameter.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
index 0754551..93094e8 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarRequest.go
@@ -126,15 +126,19 @@ func S7ParameterReadVarRequestParse(io spi.ReadBuffer) (S7ParameterInitializer,
 }
 
 func (m S7ParameterReadVarRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	numItems := uint8(uint8(len(m.items)))
-	io.WriteUint8(8, (numItems))
+		// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		numItems := uint8(uint8(len(m.items)))
+		io.WriteUint8(8, (numItems))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	S7ParameterSerialize(io, m.S7Parameter, CastIS7Parameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go
index 4b917cb..ad80ac1 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterReadVarResponse.go
@@ -98,8 +98,12 @@ func S7ParameterReadVarResponseParse(io spi.ReadBuffer) (S7ParameterInitializer,
 }
 
 func (m S7ParameterReadVarResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (numItems)
-	numItems := uint8(m.numItems)
-	io.WriteUint8(8, (numItems))
+		// Simple Field (numItems)
+		numItems := uint8(m.numItems)
+		io.WriteUint8(8, (numItems))
+
+	}
+	S7ParameterSerialize(io, m.S7Parameter, CastIS7Parameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go
index 005769c..9e617f6 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterSetupCommunication.go
@@ -136,19 +136,23 @@ func S7ParameterSetupCommunicationParse(io spi.ReadBuffer) (S7ParameterInitializ
 }
 
 func (m S7ParameterSetupCommunication) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Reserved Field (reserved)
-	io.WriteUint8(8, uint8(0x00))
+		// Reserved Field (reserved)
+		io.WriteUint8(8, uint8(0x00))
 
-	// Simple Field (maxAmqCaller)
-	maxAmqCaller := uint16(m.maxAmqCaller)
-	io.WriteUint16(16, (maxAmqCaller))
+		// Simple Field (maxAmqCaller)
+		maxAmqCaller := uint16(m.maxAmqCaller)
+		io.WriteUint16(16, (maxAmqCaller))
 
-	// Simple Field (maxAmqCallee)
-	maxAmqCallee := uint16(m.maxAmqCallee)
-	io.WriteUint16(16, (maxAmqCallee))
+		// Simple Field (maxAmqCallee)
+		maxAmqCallee := uint16(m.maxAmqCallee)
+		io.WriteUint16(16, (maxAmqCallee))
 
-	// Simple Field (pduLength)
-	pduLength := uint16(m.pduLength)
-	io.WriteUint16(16, (pduLength))
+		// Simple Field (pduLength)
+		pduLength := uint16(m.pduLength)
+		io.WriteUint16(16, (pduLength))
+
+	}
+	S7ParameterSerialize(io, m.S7Parameter, CastIS7Parameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
index 18d79dc..6988f69 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserData.go
@@ -126,15 +126,19 @@ func S7ParameterUserDataParse(io spi.ReadBuffer) (S7ParameterInitializer, error)
 }
 
 func (m S7ParameterUserData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	numItems := uint8(uint8(len(m.items)))
-	io.WriteUint8(8, (numItems))
+		// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		numItems := uint8(uint8(len(m.items)))
+		io.WriteUint8(8, (numItems))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	S7ParameterSerialize(io, m.S7Parameter, CastIS7Parameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go
index 92fa486..7ba026f 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItem.go
@@ -100,13 +100,13 @@ func S7ParameterUserDataItemParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m S7ParameterUserDataItem) Serialize(io spi.WriteBuffer) {
-	iS7ParameterUserDataItem := CastIS7ParameterUserDataItem(m)
+func S7ParameterUserDataItemSerialize(io spi.WriteBuffer, m S7ParameterUserDataItem, i IS7ParameterUserDataItem, childSerialize func()) {
 
 	// Discriminator Field (itemType) (Used as input to a switch field)
-	itemType := uint8(S7ParameterUserDataItemItemType(iS7ParameterUserDataItem))
+	itemType := uint8(i.ItemType())
 	io.WriteUint8(8, (itemType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iS7ParameterUserDataItem.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
index 58bd69f..e39b5b9 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterUserDataItemCPUFunctions.go
@@ -194,49 +194,53 @@ func S7ParameterUserDataItemCPUFunctionsParse(io spi.ReadBuffer) (S7ParameterUse
 }
 
 func (m S7ParameterUserDataItemCPUFunctions) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	itemLength := uint8(uint8(uint8(m.LengthInBytes())) - uint8(uint8(2)))
-	io.WriteUint8(8, (itemLength))
+		// Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		itemLength := uint8(uint8(uint8(m.LengthInBytes())) - uint8(uint8(2)))
+		io.WriteUint8(8, (itemLength))
 
-	// Simple Field (method)
-	method := uint8(m.method)
-	io.WriteUint8(8, (method))
+		// Simple Field (method)
+		method := uint8(m.method)
+		io.WriteUint8(8, (method))
 
-	// Simple Field (cpuFunctionType)
-	cpuFunctionType := uint8(m.cpuFunctionType)
-	io.WriteUint8(4, (cpuFunctionType))
+		// Simple Field (cpuFunctionType)
+		cpuFunctionType := uint8(m.cpuFunctionType)
+		io.WriteUint8(4, (cpuFunctionType))
 
-	// Simple Field (cpuFunctionGroup)
-	cpuFunctionGroup := uint8(m.cpuFunctionGroup)
-	io.WriteUint8(4, (cpuFunctionGroup))
+		// Simple Field (cpuFunctionGroup)
+		cpuFunctionGroup := uint8(m.cpuFunctionGroup)
+		io.WriteUint8(4, (cpuFunctionGroup))
 
-	// Simple Field (cpuSubfunction)
-	cpuSubfunction := uint8(m.cpuSubfunction)
-	io.WriteUint8(8, (cpuSubfunction))
+		// Simple Field (cpuSubfunction)
+		cpuSubfunction := uint8(m.cpuSubfunction)
+		io.WriteUint8(8, (cpuSubfunction))
 
-	// Simple Field (sequenceNumber)
-	sequenceNumber := uint8(m.sequenceNumber)
-	io.WriteUint8(8, (sequenceNumber))
+		// Simple Field (sequenceNumber)
+		sequenceNumber := uint8(m.sequenceNumber)
+		io.WriteUint8(8, (sequenceNumber))
 
-	// Optional Field (dataUnitReferenceNumber) (Can be skipped, if the value is null)
-	var dataUnitReferenceNumber *uint8 = nil
-	if m.dataUnitReferenceNumber != nil {
-		dataUnitReferenceNumber = m.dataUnitReferenceNumber
-		io.WriteUint8(8, *(dataUnitReferenceNumber))
-	}
+		// Optional Field (dataUnitReferenceNumber) (Can be skipped, if the value is null)
+		var dataUnitReferenceNumber *uint8 = nil
+		if m.dataUnitReferenceNumber != nil {
+			dataUnitReferenceNumber = m.dataUnitReferenceNumber
+			io.WriteUint8(8, *(dataUnitReferenceNumber))
+		}
 
-	// Optional Field (lastDataUnit) (Can be skipped, if the value is null)
-	var lastDataUnit *uint8 = nil
-	if m.lastDataUnit != nil {
-		lastDataUnit = m.lastDataUnit
-		io.WriteUint8(8, *(lastDataUnit))
-	}
+		// Optional Field (lastDataUnit) (Can be skipped, if the value is null)
+		var lastDataUnit *uint8 = nil
+		if m.lastDataUnit != nil {
+			lastDataUnit = m.lastDataUnit
+			io.WriteUint8(8, *(lastDataUnit))
+		}
+
+		// Optional Field (errorCode) (Can be skipped, if the value is null)
+		var errorCode *uint16 = nil
+		if m.errorCode != nil {
+			errorCode = m.errorCode
+			io.WriteUint16(16, *(errorCode))
+		}
 
-	// Optional Field (errorCode) (Can be skipped, if the value is null)
-	var errorCode *uint16 = nil
-	if m.errorCode != nil {
-		errorCode = m.errorCode
-		io.WriteUint16(16, *(errorCode))
 	}
+	S7ParameterUserDataItemSerialize(io, m.S7ParameterUserDataItem, CastIS7ParameterUserDataItem(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go
index a07861c..f27671e 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarRequest.go
@@ -126,15 +126,19 @@ func S7ParameterWriteVarRequestParse(io spi.ReadBuffer) (S7ParameterInitializer,
 }
 
 func (m S7ParameterWriteVarRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	numItems := uint8(uint8(len(m.items)))
-	io.WriteUint8(8, (numItems))
+		// Implicit Field (numItems) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		numItems := uint8(uint8(len(m.items)))
+		io.WriteUint8(8, (numItems))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	S7ParameterSerialize(io, m.S7Parameter, CastIS7Parameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarResponse.go
index 27e7e87..6804aa0 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7ParameterWriteVarResponse.go
@@ -98,8 +98,12 @@ func S7ParameterWriteVarResponseParse(io spi.ReadBuffer) (S7ParameterInitializer
 }
 
 func (m S7ParameterWriteVarResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Simple Field (numItems)
-	numItems := uint8(m.numItems)
-	io.WriteUint8(8, (numItems))
+		// Simple Field (numItems)
+		numItems := uint8(m.numItems)
+		io.WriteUint8(8, (numItems))
+
+	}
+	S7ParameterSerialize(io, m.S7Parameter, CastIS7Parameter(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Payload.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Payload.go
index 8014a34..a4f07d3 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Payload.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7Payload.go
@@ -102,9 +102,9 @@ func S7PayloadParse(io spi.ReadBuffer, messageType uint8, parameter IS7Parameter
 	return initializer.initialize(), nil
 }
 
-func (m S7Payload) Serialize(io spi.WriteBuffer) {
-	iS7Payload := CastIS7Payload(m)
+func S7PayloadSerialize(io spi.WriteBuffer, m S7Payload, i IS7Payload, childSerialize func()) {
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iS7Payload.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go
index c80aa74..e21285d 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadReadVarResponse.go
@@ -117,15 +117,19 @@ func S7PayloadReadVarResponseParse(io spi.ReadBuffer, parameter IS7Parameter) (S
 }
 
 func (m S7PayloadReadVarResponse) Serialize(io spi.WriteBuffer) {
-
-	// Array Field (items)
-	if m.items != nil {
-		itemCount := uint16(len(m.items))
-		var curItem uint16 = 0
-		for _, _element := range m.items {
-			var lastItem bool = curItem == (itemCount - 1)
-			_element.Serialize(io, lastItem)
-			curItem++
+	ser := func() {
+
+		// Array Field (items)
+		if m.items != nil {
+			itemCount := uint16(len(m.items))
+			var curItem uint16 = 0
+			for _, _element := range m.items {
+				var lastItem bool = curItem == (itemCount - 1)
+				_element.Serialize(io, lastItem)
+				curItem++
+			}
 		}
+
 	}
+	S7PayloadSerialize(io, m.S7Payload, CastIS7Payload(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go
index ee7213b..c75d906 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserData.go
@@ -117,11 +117,15 @@ func S7PayloadUserDataParse(io spi.ReadBuffer, parameter IS7Parameter) (S7Payloa
 }
 
 func (m S7PayloadUserData) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	S7PayloadSerialize(io, m.S7Payload, CastIS7Payload(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go
index acf913e..5d4f994 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItem.go
@@ -148,15 +148,14 @@ func S7PayloadUserDataItemParse(io spi.ReadBuffer, cpuFunctionType uint8) (spi.M
 	return initializer.initialize(returnCode, transportSize, szlId, szlIndex), nil
 }
 
-func (m S7PayloadUserDataItem) Serialize(io spi.WriteBuffer) {
-	iS7PayloadUserDataItem := CastIS7PayloadUserDataItem(m)
+func S7PayloadUserDataItemSerialize(io spi.WriteBuffer, m S7PayloadUserDataItem, i IS7PayloadUserDataItem, childSerialize func()) {
 
 	// Enum field (returnCode)
-	returnCode := IDataTransportErrorCode(m.returnCode)
+	returnCode := CastDataTransportErrorCode(m.returnCode)
 	returnCode.Serialize(io)
 
 	// Enum field (transportSize)
-	transportSize := IDataTransportSize(m.transportSize)
+	transportSize := CastDataTransportSize(m.transportSize)
 	transportSize.Serialize(io)
 
 	// Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -164,7 +163,7 @@ func (m S7PayloadUserDataItem) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (dataLength))
 
 	// Simple Field (szlId)
-	szlId := ISzlId(m.szlId)
+	szlId := CastISzlId(m.szlId)
 	szlId.Serialize(io)
 
 	// Simple Field (szlIndex)
@@ -172,5 +171,6 @@ func (m S7PayloadUserDataItem) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (szlIndex))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iS7PayloadUserDataItem.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlRequest.go
index 418c5a2..7d71faa 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlRequest.go
@@ -87,5 +87,8 @@ func S7PayloadUserDataItemCpuFunctionReadSzlRequestParse(io spi.ReadBuffer) (S7P
 }
 
 func (m S7PayloadUserDataItemCpuFunctionReadSzlRequest) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
+	}
+	S7PayloadUserDataItemSerialize(io, m.S7PayloadUserDataItem, CastIS7PayloadUserDataItem(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go
index 18aca8f..530893e 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadUserDataItemCpuFunctionReadSzlResponse.go
@@ -142,18 +142,22 @@ func S7PayloadUserDataItemCpuFunctionReadSzlResponseParse(io spi.ReadBuffer) (S7
 }
 
 func (m S7PayloadUserDataItemCpuFunctionReadSzlResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Const Field (szlItemLength)
-	io.WriteUint16(16, 28)
+		// Const Field (szlItemLength)
+		io.WriteUint16(16, 28)
 
-	// Implicit Field (szlItemCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	szlItemCount := uint16(uint16(len(m.items)))
-	io.WriteUint16(16, (szlItemCount))
+		// Implicit Field (szlItemCount) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		szlItemCount := uint16(uint16(len(m.items)))
+		io.WriteUint16(16, (szlItemCount))
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	S7PayloadUserDataItemSerialize(io, m.S7PayloadUserDataItem, CastIS7PayloadUserDataItem(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go
index 372823e..a3961ff 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarRequest.go
@@ -117,15 +117,19 @@ func S7PayloadWriteVarRequestParse(io spi.ReadBuffer, parameter IS7Parameter) (S
 }
 
 func (m S7PayloadWriteVarRequest) Serialize(io spi.WriteBuffer) {
-
-	// Array Field (items)
-	if m.items != nil {
-		itemCount := uint16(len(m.items))
-		var curItem uint16 = 0
-		for _, _element := range m.items {
-			var lastItem bool = curItem == (itemCount - 1)
-			_element.Serialize(io, lastItem)
-			curItem++
+	ser := func() {
+
+		// Array Field (items)
+		if m.items != nil {
+			itemCount := uint16(len(m.items))
+			var curItem uint16 = 0
+			for _, _element := range m.items {
+				var lastItem bool = curItem == (itemCount - 1)
+				_element.Serialize(io, lastItem)
+				curItem++
+			}
 		}
+
 	}
+	S7PayloadSerialize(io, m.S7Payload, CastIS7Payload(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go
index 1ff6fe5..0c2f715 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7PayloadWriteVarResponse.go
@@ -117,11 +117,15 @@ func S7PayloadWriteVarResponseParse(io spi.ReadBuffer, parameter IS7Parameter) (
 }
 
 func (m S7PayloadWriteVarResponse) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Array Field (items)
-	if m.items != nil {
-		for _, _element := range m.items {
-			_element.Serialize(io)
+		// Array Field (items)
+		if m.items != nil {
+			for _, _element := range m.items {
+				_element.Serialize(io)
+			}
 		}
+
 	}
+	S7PayloadSerialize(io, m.S7Payload, CastIS7Payload(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
index 35b666b..618007c 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadDataItem.go
@@ -145,11 +145,11 @@ func S7VarPayloadDataItemParse(io spi.ReadBuffer, lastItem bool) (spi.Message, e
 func (m S7VarPayloadDataItem) Serialize(io spi.WriteBuffer, lastItem bool) {
 
 	// Enum field (returnCode)
-	returnCode := IDataTransportErrorCode(m.returnCode)
+	returnCode := CastDataTransportErrorCode(m.returnCode)
 	returnCode.Serialize(io)
 
 	// Enum field (transportSize)
-	transportSize := IDataTransportSize(m.transportSize)
+	transportSize := CastDataTransportSize(m.transportSize)
 	transportSize.Serialize(io)
 
 	// Implicit Field (dataLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
@@ -171,4 +171,5 @@ func (m S7VarPayloadDataItem) Serialize(io spi.WriteBuffer, lastItem bool) {
 			io.WriteUint8(8, (_paddingValue))
 		}
 	}
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadStatusItem.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadStatusItem.go
index 4a1ab18..6077c1a 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadStatusItem.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarPayloadStatusItem.go
@@ -86,6 +86,7 @@ func S7VarPayloadStatusItemParse(io spi.ReadBuffer) (spi.Message, error) {
 func (m S7VarPayloadStatusItem) Serialize(io spi.WriteBuffer) {
 
 	// Enum field (returnCode)
-	returnCode := IDataTransportErrorCode(m.returnCode)
+	returnCode := CastDataTransportErrorCode(m.returnCode)
 	returnCode.Serialize(io)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItem.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItem.go
index b01467a..ad26fc3 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItem.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItem.go
@@ -100,13 +100,13 @@ func S7VarRequestParameterItemParse(io spi.ReadBuffer) (spi.Message, error) {
 	return initializer.initialize(), nil
 }
 
-func (m S7VarRequestParameterItem) Serialize(io spi.WriteBuffer) {
-	iS7VarRequestParameterItem := CastIS7VarRequestParameterItem(m)
+func S7VarRequestParameterItemSerialize(io spi.WriteBuffer, m S7VarRequestParameterItem, i IS7VarRequestParameterItem, childSerialize func()) {
 
 	// Discriminator Field (itemType) (Used as input to a switch field)
-	itemType := uint8(S7VarRequestParameterItemItemType(iS7VarRequestParameterItem))
+	itemType := uint8(i.ItemType())
 	io.WriteUint8(8, (itemType))
 
 	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-	iS7VarRequestParameterItem.Serialize(io)
+	childSerialize()
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItemAddress.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItemAddress.go
index 763d4fb..12f6937 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItemAddress.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/S7VarRequestParameterItemAddress.go
@@ -109,12 +109,16 @@ func S7VarRequestParameterItemAddressParse(io spi.ReadBuffer) (S7VarRequestParam
 }
 
 func (m S7VarRequestParameterItemAddress) Serialize(io spi.WriteBuffer) {
+	ser := func() {
 
-	// Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-	itemLength := uint8(m.address.LengthInBytes())
-	io.WriteUint8(8, (itemLength))
+		// Implicit Field (itemLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+		itemLength := uint8(m.address.LengthInBytes())
+		io.WriteUint8(8, (itemLength))
 
-	// Simple Field (address)
-	address := IS7Address(m.address)
-	address.Serialize(io)
+		// Simple Field (address)
+		address := CastIS7Address(m.address)
+		address.Serialize(io)
+
+	}
+	S7VarRequestParameterItemSerialize(io, m.S7VarRequestParameterItem, CastIS7VarRequestParameterItem(m), ser)
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
index 8b1a645..e341480 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlDataTreeItem.go
@@ -158,4 +158,5 @@ func (m SzlDataTreeItem) Serialize(io spi.WriteBuffer) {
 	// Simple Field (ausbe)
 	ausbe := uint16(m.ausbe)
 	io.WriteUint16(16, (ausbe))
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlId.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlId.go
index 8105628..15728cb 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlId.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/SzlId.go
@@ -106,7 +106,7 @@ func SzlIdParse(io spi.ReadBuffer) (spi.Message, error) {
 func (m SzlId) Serialize(io spi.WriteBuffer) {
 
 	// Enum field (typeClass)
-	typeClass := ISzlModuleTypeClass(m.typeClass)
+	typeClass := CastSzlModuleTypeClass(m.typeClass)
 	typeClass.Serialize(io)
 
 	// Simple Field (sublistExtract)
@@ -114,6 +114,7 @@ func (m SzlId) Serialize(io spi.WriteBuffer) {
 	io.WriteUint8(4, (sublistExtract))
 
 	// Enum field (sublistList)
-	sublistList := ISzlSublist(m.sublistList)
+	sublistList := CastSzlSublist(m.sublistList)
 	sublistList.Serialize(io)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/TPKTPacket.go b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/TPKTPacket.go
index fecd013..0522668 100644
--- a/sandbox/plc4go/internal/plc4go/s7/readwrite/model/TPKTPacket.go
+++ b/sandbox/plc4go/internal/plc4go/s7/readwrite/model/TPKTPacket.go
@@ -145,6 +145,7 @@ func (m TPKTPacket) Serialize(io spi.WriteBuffer) {
 	io.WriteUint16(16, (len))
 
 	// Simple Field (payload)
-	payload := ICOTPPacket(m.payload)
+	payload := CastICOTPPacket(m.payload)
 	payload.Serialize(io)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/spi/WriteBuffer.go b/sandbox/plc4go/internal/plc4go/spi/WriteBuffer.go
index 2575054..5c1e05f 100644
--- a/sandbox/plc4go/internal/plc4go/spi/WriteBuffer.go
+++ b/sandbox/plc4go/internal/plc4go/spi/WriteBuffer.go
@@ -18,10 +18,24 @@
 //
 package spi
 
+import (
+	"bytes"
+	"errors"
+	"github.com/icza/bitio"
+)
+
 type WriteBuffer struct {
-	data    []uint8
-	bytePos uint8
-	bitPos  uint8
+	data   *bytes.Buffer
+	writer *bitio.Writer
+}
+
+func WriteBufferNew() *WriteBuffer {
+	data := &bytes.Buffer{}
+	writer := bitio.NewWriter(data)
+	return &WriteBuffer{
+		data:   data,
+		writer: writer,
+	}
 }
 
 func (rb WriteBuffer) GetPos() uint16 {
@@ -29,45 +43,57 @@ func (rb WriteBuffer) GetPos() uint16 {
 }
 
 func (rb WriteBuffer) GetBytes() []uint8 {
-	return rb.data
+	return rb.data.Bytes()
 }
 
 func (rb WriteBuffer) GetTotalBytes() uint64 {
-	return 0
+	return uint64(rb.data.Len())
 }
 
-func (rb WriteBuffer) WriteBit(value bool) {
+func (rb WriteBuffer) WriteBit(value bool) error {
+	return rb.writer.WriteBool(value)
 }
 
-func (rb WriteBuffer) WriteUint8(bitLength uint8, value uint8) {
+func (rb WriteBuffer) WriteUint8(bitLength uint8, value uint8) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteUint16(bitLength uint8, value uint16) {
+func (rb WriteBuffer) WriteUint16(bitLength uint8, value uint16) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteUint32(bitLength uint8, value uint32) {
+func (rb WriteBuffer) WriteUint32(bitLength uint8, value uint32) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteUint64(bitLength uint8, value uint64) {
+func (rb WriteBuffer) WriteUint64(bitLength uint8, value uint64) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteInt8(bitLength uint8, value int8) {
+func (rb WriteBuffer) WriteInt8(bitLength uint8, value int8) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteInt16(bitLength uint8, value int16) {
+func (rb WriteBuffer) WriteInt16(bitLength uint8, value int16) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteInt32(bitLength uint8, value int32) {
+func (rb WriteBuffer) WriteInt32(bitLength uint8, value int32) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteInt64(bitLength uint8, value int64) {
+func (rb WriteBuffer) WriteInt64(bitLength uint8, value int64) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteFloat32(bitLength uint8, value float32) {
+func (rb WriteBuffer) WriteFloat32(bitLength uint8, value float32) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteFloat64(bitLength uint8, value float64) {
+func (rb WriteBuffer) WriteFloat64(bitLength uint8, value float64) error {
+	return rb.writer.WriteBits(uint64(value), bitLength)
 }
 
-func (rb WriteBuffer) WriteString(bitLength uint8, value string) {
+func (rb WriteBuffer) WriteString(bitLength uint8, value string) error {
+	return errors.New("WriteString is currently not implemented")
 }