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/11/06 20:03:29 UTC

[plc4x] branch feature/plc4go updated: - Changed the Go code generation from inheritance to composition - Did a lot of tweaking in the temporal PlcValues

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 d3caf72  - Changed the Go code generation from inheritance to composition - Did a lot of tweaking in the temporal PlcValues
d3caf72 is described below

commit d3caf72048bb3e46ed5665e0cad9a11ed2367708
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Nov 6 21:03:20 2020 +0100

    - Changed the Go code generation from inheritance to composition
    - Did a lot of tweaking in the temporal PlcValues
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |   34 +-
 .../language/go/GoLanguageTemplateHelper.java      |   48 +-
 .../resources/templates/go/data-io-template.ftlh   |   15 +-
 .../main/resources/templates/go/enum-template.ftlh |    2 -
 .../resources/templates/go/model-template.ftlh     |  254 +-
 .../templates/go/parser-factory-template.ftlh      |    5 +-
 .../templates/go/xml-parser-factory-template.ftlh  |    5 +-
 .../resources/templates/java/data-io-template.ftlh |   21 +-
 plc4go/cmd/main/drivers/modbus_test.go             |   14 +-
 .../bacnetip/readwrite/{model => }/ParserHelper.go |   25 +-
 .../readwrite/{model => }/XmlParserHelper.go       |   25 +-
 .../plc4go/bacnetip/readwrite/model/APDU.go        |   81 +-
 .../plc4go/bacnetip/readwrite/model/APDUAbort.go   |   71 +-
 .../bacnetip/readwrite/model/APDUComplexAck.go     |  126 +-
 .../readwrite/model/APDUConfirmedRequest.go        |  172 +-
 .../plc4go/bacnetip/readwrite/model/APDUError.go   |  114 +-
 .../plc4go/bacnetip/readwrite/model/APDUReject.go  |   69 +-
 .../bacnetip/readwrite/model/APDUSegmentAck.go     |   75 +-
 .../bacnetip/readwrite/model/APDUSimpleAck.go      |   69 +-
 .../readwrite/model/APDUUnconfirmedRequest.go      |  108 +-
 .../bacnetip/readwrite/model/ApplicationTag.go     |    2 -
 .../bacnetip/readwrite/model/BACnetAddress.go      |   40 +-
 .../readwrite/model/BACnetConfirmedServiceACK.go   |   93 +-
 .../BACnetConfirmedServiceACKAtomicReadFile.go     |   65 +-
 .../BACnetConfirmedServiceACKAtomicWriteFile.go    |   65 +-
 ...tConfirmedServiceACKConfirmedPrivateTransfer.go |   65 +-
 .../model/BACnetConfirmedServiceACKCreateObject.go |   65 +-
 .../BACnetConfirmedServiceACKGetAlarmSummary.go    |   65 +-
 ...ACnetConfirmedServiceACKGetEnrollmentSummary.go |   65 +-
 ...BACnetConfirmedServiceACKGetEventInformation.go |   65 +-
 .../model/BACnetConfirmedServiceACKReadProperty.go |   65 +-
 ...ACnetConfirmedServiceACKReadPropertyMultiple.go |   65 +-
 .../model/BACnetConfirmedServiceACKReadRange.go    |   65 +-
 ...BACnetConfirmedServiceACKRemovedAuthenticate.go |   65 +-
 ...rmedServiceACKRemovedReadPropertyConditional.go |   65 +-
 .../model/BACnetConfirmedServiceACKVTData.go       |   65 +-
 .../model/BACnetConfirmedServiceACKVTOpen.go       |   65 +-
 .../model/BACnetConfirmedServiceRequest.go         |  127 +-
 ...ACnetConfirmedServiceRequestAcknowledgeAlarm.go |   65 +-
 .../BACnetConfirmedServiceRequestAddListElement.go |   65 +-
 .../BACnetConfirmedServiceRequestAtomicReadFile.go |   65 +-
 ...BACnetConfirmedServiceRequestAtomicWriteFile.go |   65 +-
 ...firmedServiceRequestConfirmedCOVNotification.go |   98 +-
 ...rviceRequestConfirmedCOVNotificationMultiple.go |   65 +-
 ...rmedServiceRequestConfirmedEventNotification.go |   65 +-
 ...firmedServiceRequestConfirmedPrivateTransfer.go |   65 +-
 ...tConfirmedServiceRequestConfirmedTextMessage.go |   65 +-
 .../BACnetConfirmedServiceRequestCreateObject.go   |   65 +-
 .../BACnetConfirmedServiceRequestDeleteObject.go   |   65 +-
 ...rmedServiceRequestDeviceCommunicationControl.go |   65 +-
 ...tConfirmedServiceRequestGetEnrollmentSummary.go |   65 +-
 ...etConfirmedServiceRequestGetEventInformation.go |   65 +-
 ...etConfirmedServiceRequestLifeSafetyOperation.go |   65 +-
 .../BACnetConfirmedServiceRequestReadProperty.go   |   74 +-
 ...tConfirmedServiceRequestReadPropertyMultiple.go |   65 +-
 .../BACnetConfirmedServiceRequestReadRange.go      |   65 +-
 ...netConfirmedServiceRequestReinitializeDevice.go |   65 +-
 ...CnetConfirmedServiceRequestRemoveListElement.go |   65 +-
 ...etConfirmedServiceRequestRemovedAuthenticate.go |   65 +-
 ...ServiceRequestRemovedReadPropertyConditional.go |   65 +-
 ...CnetConfirmedServiceRequestRemovedRequestKey.go |   65 +-
 .../BACnetConfirmedServiceRequestSubscribeCOV.go   |   80 +-
 ...tConfirmedServiceRequestSubscribeCOVProperty.go |   65 +-
 ...edServiceRequestSubscribeCOVPropertyMultiple.go |   65 +-
 .../model/BACnetConfirmedServiceRequestVTClose.go  |   65 +-
 .../model/BACnetConfirmedServiceRequestVTData.go   |   65 +-
 .../model/BACnetConfirmedServiceRequestVTOpen.go   |   65 +-
 .../BACnetConfirmedServiceRequestWriteProperty.go  |  196 +-
 ...ConfirmedServiceRequestWritePropertyMultiple.go |   65 +-
 .../plc4go/bacnetip/readwrite/model/BACnetError.go |   93 +-
 .../readwrite/model/BACnetErrorAtomicReadFile.go   |   65 +-
 .../readwrite/model/BACnetErrorAtomicWriteFile.go  |   65 +-
 .../model/BACnetErrorConfirmedPrivateTransfer.go   |   65 +-
 .../readwrite/model/BACnetErrorCreateObject.go     |   65 +-
 .../readwrite/model/BACnetErrorGetAlarmSummary.go  |   65 +-
 .../model/BACnetErrorGetEnrollmentSummary.go       |   65 +-
 .../model/BACnetErrorGetEventInformation.go        |   65 +-
 .../readwrite/model/BACnetErrorReadProperty.go     |   75 +-
 .../model/BACnetErrorReadPropertyMultiple.go       |   65 +-
 .../readwrite/model/BACnetErrorReadRange.go        |   65 +-
 .../model/BACnetErrorRemovedAuthenticate.go        |   65 +-
 .../BACnetErrorRemovedReadPropertyConditional.go   |   65 +-
 .../bacnetip/readwrite/model/BACnetErrorVTData.go  |   65 +-
 .../bacnetip/readwrite/model/BACnetErrorVTOpen.go  |   65 +-
 .../bacnetip/readwrite/model/BACnetNetworkType.go  |    2 -
 .../bacnetip/readwrite/model/BACnetNodeType.go     |    2 -
 .../bacnetip/readwrite/model/BACnetNotifyType.go   |    2 -
 .../bacnetip/readwrite/model/BACnetObjectType.go   |    2 -
 .../bacnetip/readwrite/model/BACnetServiceAck.go   |   93 +-
 .../model/BACnetServiceAckAtomicReadFile.go        |   65 +-
 .../model/BACnetServiceAckAtomicWriteFile.go       |   65 +-
 .../BACnetServiceAckConfirmedPrivateTransfer.go    |   65 +-
 .../model/BACnetServiceAckCreateObject.go          |   65 +-
 .../model/BACnetServiceAckGetAlarmSummary.go       |   65 +-
 .../model/BACnetServiceAckGetEnrollmentSummary.go  |   65 +-
 .../model/BACnetServiceAckGetEventInformation.go   |   65 +-
 .../model/BACnetServiceAckReadProperty.go          |  123 +-
 .../model/BACnetServiceAckReadPropertyMultiple.go  |   65 +-
 .../readwrite/model/BACnetServiceAckReadRange.go   |   65 +-
 .../model/BACnetServiceAckRemovedAuthenticate.go   |   65 +-
 ...CnetServiceAckRemovedReadPropertyConditional.go |   65 +-
 .../readwrite/model/BACnetServiceAckVTData.go      |   65 +-
 .../readwrite/model/BACnetServiceAckVTOpen.go      |   65 +-
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |   97 +-
 .../model/BACnetTagApplicationBitString.go         |   77 +-
 .../readwrite/model/BACnetTagApplicationBoolean.go |   73 +-
 .../model/BACnetTagApplicationCharacterString.go   |   73 +-
 .../readwrite/model/BACnetTagApplicationDate.go    |   73 +-
 .../readwrite/model/BACnetTagApplicationDouble.go  |   75 +-
 .../model/BACnetTagApplicationEnumerated.go        |   75 +-
 .../readwrite/model/BACnetTagApplicationNull.go    |   73 +-
 .../model/BACnetTagApplicationObjectIdentifier.go  |   73 +-
 .../model/BACnetTagApplicationOctetString.go       |   73 +-
 .../readwrite/model/BACnetTagApplicationReal.go    |   75 +-
 .../model/BACnetTagApplicationSignedInteger.go     |   75 +-
 .../readwrite/model/BACnetTagApplicationTime.go    |   73 +-
 .../model/BACnetTagApplicationUnsignedInteger.go   |   75 +-
 .../bacnetip/readwrite/model/BACnetTagContext.go   |   75 +-
 .../readwrite/model/BACnetTagWithContent.go        |   88 +-
 .../model/BACnetUnconfirmedServiceRequest.go       |   89 +-
 .../model/BACnetUnconfirmedServiceRequestIAm.go    |   80 +-
 .../model/BACnetUnconfirmedServiceRequestIHave.go  |   65 +-
 ...UnconfirmedServiceRequestTimeSynchronization.go |   65 +-
 ...onfirmedServiceRequestUTCTimeSynchronization.go |   65 +-
 ...rmedServiceRequestUnconfirmedCOVNotification.go |   65 +-
 ...iceRequestUnconfirmedCOVNotificationMultiple.go |   65 +-
 ...edServiceRequestUnconfirmedEventNotification.go |   65 +-
 ...rmedServiceRequestUnconfirmedPrivateTransfer.go |   71 +-
 ...onfirmedServiceRequestUnconfirmedTextMessage.go |   65 +-
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |   73 +-
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |   75 +-
 .../BACnetUnconfirmedServiceRequestWriteGroup.go   |   65 +-
 .../plc4go/bacnetip/readwrite/model/BVLC.go        |   91 +-
 .../model/BVLCDeleteForeignDeviceTableEntry.go     |   65 +-
 .../model/BVLCDistributeBroadcastToNetwork.go      |   65 +-
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  |   93 +-
 .../readwrite/model/BVLCOriginalBroadcastNPDU.go   |   88 +-
 .../readwrite/model/BVLCOriginalUnicastNPDU.go     |   88 +-
 .../model/BVLCReadBroadcastDistributionTable.go    |   65 +-
 .../model/BVLCReadBroadcastDistributionTableAck.go |   65 +-
 .../readwrite/model/BVLCReadForeignDeviceTable.go  |   65 +-
 .../model/BVLCReadForeignDeviceTableAck.go         |   65 +-
 .../readwrite/model/BVLCRegisterForeignDevice.go   |   65 +-
 .../plc4go/bacnetip/readwrite/model/BVLCResult.go  |   65 +-
 .../bacnetip/readwrite/model/BVLCSecureBVLL.go     |   65 +-
 .../model/BVLCWideBroadcastDistributionTable.go    |   65 +-
 .../plc4go/bacnetip/readwrite/model/NLM.go         |   71 +-
 .../readwrite/model/NLMIAmRouterToNetwork.go       |   69 +-
 .../readwrite/model/NLMWhoIsRouterToNetwork.go     |   69 +-
 .../plc4go/bacnetip/readwrite/model/NPDU.go        |  122 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpDriver.go  |   68 +-
 plc4go/internal/plc4go/knxnetip/KnxNetIpField.go   |   93 +
 .../plc4go/knxnetip/KnxNetIpFieldHandler.go        |   28 +-
 .../plc4go/knxnetip/KnxNetIpMessageCodec.go        |  158 +
 .../knxnetip/readwrite/{model => }/ParserHelper.go |   65 +-
 .../readwrite/{model => }/XmlParserHelper.go       |   97 +-
 .../plc4go/knxnetip/readwrite/model/APCI.go        |    2 -
 .../plc4go/knxnetip/readwrite/model/CEMI.go        |   87 +-
 .../readwrite/model/CEMIAdditionalInformation.go   |   69 +-
 .../CEMIAdditionalInformationBusmonitorInfo.go     |   77 +-
 .../CEMIAdditionalInformationRelativeTimestamp.go  |   88 +-
 .../knxnetip/readwrite/model/CEMIBusmonInd.go      |  115 +-
 .../plc4go/knxnetip/readwrite/model/CEMIDataCon.go |  109 +-
 .../knxnetip/readwrite/model/CEMIDataFrame.go      |   74 +-
 .../plc4go/knxnetip/readwrite/model/CEMIDataInd.go |  109 +-
 .../plc4go/knxnetip/readwrite/model/CEMIDataReq.go |  109 +-
 .../plc4go/knxnetip/readwrite/model/CEMIFrame.go   |   91 +-
 .../knxnetip/readwrite/model/CEMIFrameAck.go       |   77 +-
 .../knxnetip/readwrite/model/CEMIFrameData.go      |  132 +-
 .../knxnetip/readwrite/model/CEMIFrameDataExt.go   |  134 +-
 .../readwrite/model/CEMIFramePollingData.go        |   77 +-
 .../readwrite/model/CEMIFramePollingDataExt.go     |   77 +-
 .../knxnetip/readwrite/model/CEMIMPropReadCon.go   |   77 +-
 .../knxnetip/readwrite/model/CEMIMPropReadReq.go   |   75 +-
 .../knxnetip/readwrite/model/CEMIPollDataCon.go    |   65 +-
 .../knxnetip/readwrite/model/CEMIPollDataReq.go    |   65 +-
 .../knxnetip/readwrite/model/CEMIPriority.go       |    2 -
 .../plc4go/knxnetip/readwrite/model/CEMIRawCon.go  |   65 +-
 .../plc4go/knxnetip/readwrite/model/CEMIRawInd.go  |   65 +-
 .../plc4go/knxnetip/readwrite/model/CEMIRawReq.go  |   65 +-
 .../knxnetip/readwrite/model/ConnectionRequest.go  |  132 +-
 .../model/ConnectionRequestInformation.go          |   69 +-
 ...ConnectionRequestInformationDeviceManagement.go |   65 +-
 ...ConnectionRequestInformationTunnelConnection.go |   71 +-
 .../knxnetip/readwrite/model/ConnectionResponse.go |  120 +-
 .../readwrite/model/ConnectionResponseDataBlock.go |   69 +-
 .../ConnectionResponseDataBlockDeviceManagement.go |   65 +-
 .../ConnectionResponseDataBlockTunnelConnection.go |   88 +-
 .../readwrite/model/ConnectionStateRequest.go      |   90 +-
 .../readwrite/model/ConnectionStateResponse.go     |   73 +-
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      |  142 +-
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |   66 +-
 .../knxnetip/readwrite/model/DescriptionRequest.go |   88 +-
 .../readwrite/model/DescriptionResponse.go         |  110 +-
 .../readwrite/model/DeviceConfigurationAck.go      |   88 +-
 .../model/DeviceConfigurationAckDataBlock.go       |   43 +-
 .../readwrite/model/DeviceConfigurationRequest.go  |  128 +-
 .../model/DeviceConfigurationRequestDataBlock.go   |   39 +-
 .../knxnetip/readwrite/model/DeviceStatus.go       |   39 +-
 .../knxnetip/readwrite/model/DisconnectRequest.go  |   90 +-
 .../knxnetip/readwrite/model/DisconnectResponse.go |   73 +-
 .../readwrite/model/HPAIControlEndpoint.go         |   64 +-
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   |   64 +-
 .../readwrite/model/HPAIDiscoveryEndpoint.go       |   64 +-
 .../knxnetip/readwrite/model/HostProtocolCode.go   |    2 -
 .../plc4go/knxnetip/readwrite/model/IPAddress.go   |   40 +-
 .../plc4go/knxnetip/readwrite/model/KNXAddress.go  |   39 +-
 .../knxnetip/readwrite/model/KNXGroupAddress.go    |   69 +-
 .../readwrite/model/KNXGroupAddress2Level.go       |   69 +-
 .../readwrite/model/KNXGroupAddress3Level.go       |   71 +-
 .../readwrite/model/KNXGroupAddressFreeLevel.go    |   67 +-
 .../knxnetip/readwrite/model/KNXNetIPMessage.go    |   97 +-
 .../knxnetip/readwrite/model/KnxDatapoint.go       | 4946 +++++++++++++++++---
 .../knxnetip/readwrite/model/KnxDatapoint2.go      | 4820 -------------------
 .../{KnxDatapointTypes.go => KnxDatapointType.go}  | 1458 +++---
 .../plc4go/knxnetip/readwrite/model/KnxLayer.go    |    2 -
 .../knxnetip/readwrite/model/KnxNetIpCore.go       |   67 +-
 .../readwrite/model/KnxNetIpDeviceManagement.go    |   67 +-
 .../knxnetip/readwrite/model/KnxNetIpTunneling.go  |   67 +-
 .../knxnetip/readwrite/model/KnxNetObjectServer.go |   67 +-
 .../model/KnxNetRemoteConfigurationAndDiagnosis.go |   67 +-
 .../readwrite/model/KnxNetRemoteLogging.go         |   67 +-
 .../knxnetip/readwrite/model/KnxStaticHelper.go    |    4 +
 .../plc4go/knxnetip/readwrite/model/MACAddress.go  |   40 +-
 .../model/ProjectInstallationIdentifier.go         |   39 +-
 .../knxnetip/readwrite/model/RelativeTimestamp.go  |   39 +-
 .../knxnetip/readwrite/model/RoutingIndication.go  |   65 +-
 .../knxnetip/readwrite/model/SearchRequest.go      |   88 +-
 .../knxnetip/readwrite/model/SearchResponse.go     |  132 +-
 .../plc4go/knxnetip/readwrite/model/ServiceId.go   |   77 +-
 .../plc4go/knxnetip/readwrite/model/Status.go      |    2 -
 .../plc4go/knxnetip/readwrite/model/TPCI.go        |    2 -
 .../knxnetip/readwrite/model/TunnelingRequest.go   |  128 +-
 .../readwrite/model/TunnelingRequestDataBlock.go   |   39 +-
 .../knxnetip/readwrite/model/TunnelingResponse.go  |   88 +-
 .../readwrite/model/TunnelingResponseDataBlock.go  |   43 +-
 .../knxnetip/readwrite/model/UnknownMessage.go     |   68 +-
 plc4go/internal/plc4go/modbus/ModbusConnection.go  |   22 +-
 plc4go/internal/plc4go/modbus/ModbusDriver.go      |    2 +-
 plc4go/internal/plc4go/modbus/ModbusReader.go      |   36 +-
 plc4go/internal/plc4go/modbus/ModbusWriter.go      |   28 +-
 .../modbus/readwrite/{model => }/ParserHelper.go   |   17 +-
 .../readwrite/{model => }/XmlParserHelper.go       |   17 +-
 .../plc4go/modbus/readwrite/model/DataItem.go      |    8 +-
 .../modbus/readwrite/model/ModbusConstants.go      |   39 +-
 .../modbus/readwrite/model/ModbusDataTypeSizes.go  |    2 -
 .../modbus/readwrite/model/ModbusErrorCode.go      |    2 -
 .../plc4go/modbus/readwrite/model/ModbusPDU.go     |  153 +-
 .../readwrite/model/ModbusPDUDiagnosticRequest.go  |   73 +-
 .../readwrite/model/ModbusPDUDiagnosticResponse.go |   73 +-
 .../modbus/readwrite/model/ModbusPDUError.go       |   75 +-
 .../model/ModbusPDUGetComEventCounterRequest.go    |   69 +-
 .../model/ModbusPDUGetComEventCounterResponse.go   |   73 +-
 .../model/ModbusPDUGetComEventLogRequest.go        |   69 +-
 .../model/ModbusPDUGetComEventLogResponse.go       |   78 +-
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |   75 +-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |   75 +-
 .../readwrite/model/ModbusPDUReadCoilsRequest.go   |   73 +-
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  |   72 +-
 .../ModbusPDUReadDeviceIdentificationRequest.go    |   69 +-
 .../ModbusPDUReadDeviceIdentificationResponse.go   |   69 +-
 .../model/ModbusPDUReadDiscreteInputsRequest.go    |   73 +-
 .../model/ModbusPDUReadDiscreteInputsResponse.go   |   72 +-
 .../model/ModbusPDUReadExceptionStatusRequest.go   |   69 +-
 .../model/ModbusPDUReadExceptionStatusResponse.go  |   71 +-
 .../model/ModbusPDUReadFifoQueueRequest.go         |   71 +-
 .../model/ModbusPDUReadFifoQueueResponse.go        |   72 +-
 .../model/ModbusPDUReadFileRecordRequest.go        |   87 +-
 .../model/ModbusPDUReadFileRecordRequestItem.go    |   39 +-
 .../model/ModbusPDUReadFileRecordResponse.go       |   87 +-
 .../model/ModbusPDUReadFileRecordResponseItem.go   |   39 +-
 .../model/ModbusPDUReadHoldingRegistersRequest.go  |   73 +-
 .../model/ModbusPDUReadHoldingRegistersResponse.go |   72 +-
 .../model/ModbusPDUReadInputRegistersRequest.go    |   73 +-
 .../model/ModbusPDUReadInputRegistersResponse.go   |   72 +-
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |   80 +-
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |   72 +-
 .../model/ModbusPDUReportServerIdRequest.go        |   69 +-
 .../model/ModbusPDUReportServerIdResponse.go       |   72 +-
 .../model/ModbusPDUWriteFileRecordRequest.go       |   87 +-
 .../model/ModbusPDUWriteFileRecordRequestItem.go   |   39 +-
 .../model/ModbusPDUWriteFileRecordResponse.go      |   87 +-
 .../model/ModbusPDUWriteFileRecordResponseItem.go  |   39 +-
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    |   76 +-
 .../model/ModbusPDUWriteMultipleCoilsResponse.go   |   73 +-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |   76 +-
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |   73 +-
 .../model/ModbusPDUWriteSingleCoilRequest.go       |   73 +-
 .../model/ModbusPDUWriteSingleCoilResponse.go      |   73 +-
 .../model/ModbusPDUWriteSingleRegisterRequest.go   |   73 +-
 .../model/ModbusPDUWriteSingleRegisterResponse.go  |   73 +-
 .../modbus/readwrite/model/ModbusSerialADU.go      |  134 +-
 .../plc4go/modbus/readwrite/model/ModbusTcpADU.go  |  134 +-
 .../plc4go/model/values/IEC61131ValueHandler.go    |    4 +-
 .../s7/readwrite/{model => }/ParserHelper.go       |   29 +-
 .../s7/readwrite/{model => }/XmlParserHelper.go    |   29 +-
 .../plc4go/s7/readwrite/model/COTPPacket.go        |  134 +-
 .../readwrite/model/COTPPacketConnectionRequest.go |   79 +-
 .../model/COTPPacketConnectionResponse.go          |   79 +-
 .../plc4go/s7/readwrite/model/COTPPacketData.go    |   73 +-
 .../readwrite/model/COTPPacketDisconnectRequest.go |   79 +-
 .../model/COTPPacketDisconnectResponse.go          |   73 +-
 .../s7/readwrite/model/COTPPacketTpduError.go      |   73 +-
 .../plc4go/s7/readwrite/model/COTPParameter.go     |   75 +-
 .../s7/readwrite/model/COTPParameterCalledTsap.go  |   67 +-
 .../s7/readwrite/model/COTPParameterCallingTsap.go |   67 +-
 .../s7/readwrite/model/COTPParameterChecksum.go    |   67 +-
 ...COTPParameterDisconnectAdditionalInformation.go |   68 +-
 .../s7/readwrite/model/COTPParameterTpduSize.go    |   71 +-
 .../plc4go/s7/readwrite/model/COTPProtocolClass.go |    2 -
 .../plc4go/s7/readwrite/model/COTPTpduSize.go      |    2 -
 .../internal/plc4go/s7/readwrite/model/DataItem.go |  110 +-
 .../s7/readwrite/model/DataTransportErrorCode.go   |    2 -
 .../plc4go/s7/readwrite/model/DataTransportSize.go |    2 -
 .../plc4go/s7/readwrite/model/DeviceGroup.go       |    2 -
 .../plc4go/s7/readwrite/model/MemoryArea.go        |    2 -
 .../plc4go/s7/readwrite/model/S7Address.go         |   67 +-
 .../plc4go/s7/readwrite/model/S7AddressAny.go      |   85 +-
 .../plc4go/s7/readwrite/model/S7Message.go         |  150 +-
 .../plc4go/s7/readwrite/model/S7MessageRequest.go  |   71 +-
 .../plc4go/s7/readwrite/model/S7MessageResponse.go |   75 +-
 .../s7/readwrite/model/S7MessageResponseData.go    |   75 +-
 .../plc4go/s7/readwrite/model/S7MessageUserData.go |   71 +-
 .../plc4go/s7/readwrite/model/S7Parameter.go       |   81 +-
 .../readwrite/model/S7ParameterReadVarRequest.go   |   86 +-
 .../readwrite/model/S7ParameterReadVarResponse.go  |   69 +-
 .../model/S7ParameterSetupCommunication.go         |   73 +-
 .../s7/readwrite/model/S7ParameterUserData.go      |   86 +-
 .../s7/readwrite/model/S7ParameterUserDataItem.go  |   67 +-
 .../model/S7ParameterUserDataItemCPUFunctions.go   |   89 +-
 .../readwrite/model/S7ParameterWriteVarRequest.go  |   86 +-
 .../readwrite/model/S7ParameterWriteVarResponse.go |   69 +-
 .../plc4go/s7/readwrite/model/S7Payload.go         |   83 +-
 .../s7/readwrite/model/S7PayloadReadVarResponse.go |   85 +-
 .../plc4go/s7/readwrite/model/S7PayloadUserData.go |   88 +-
 .../s7/readwrite/model/S7PayloadUserDataItem.go    |   96 +-
 ...PayloadUserDataItemCpuFunctionReadSzlRequest.go |   73 +-
 ...ayloadUserDataItemCpuFunctionReadSzlResponse.go |   90 +-
 .../s7/readwrite/model/S7PayloadWriteVarRequest.go |   85 +-
 .../readwrite/model/S7PayloadWriteVarResponse.go   |   84 +-
 .../plc4go/s7/readwrite/model/S7StaticHelper.go    |   15 +-
 .../s7/readwrite/model/S7VarPayloadDataItem.go     |   50 +-
 .../s7/readwrite/model/S7VarPayloadStatusItem.go   |   43 +-
 .../readwrite/model/S7VarRequestParameterItem.go   |   67 +-
 .../model/S7VarRequestParameterItemAddress.go      |   86 +-
 .../plc4go/s7/readwrite/model/SzlDataTreeItem.go   |   40 +-
 plc4go/internal/plc4go/s7/readwrite/model/SzlId.go |   47 +-
 .../s7/readwrite/model/SzlModuleTypeClass.go       |    2 -
 .../plc4go/s7/readwrite/model/SzlSublist.go        |    2 -
 .../plc4go/s7/readwrite/model/TPKTPacket.go        |   68 +-
 .../plc4go/s7/readwrite/model/TransportSize.go     |    2 -
 plc4go/internal/plc4go/spi/Message.go              |    3 +
 .../internal/plc4go/testutils/DriverTestRunner.go  |   36 +-
 .../plc4go/testutils/ParserSerializerTestRunner.go |   22 +-
 plc4go/internal/plc4go/utils/ParserHelper.go       |   27 -
 .../org/apache/plc4x/java/api/value/PlcValue.java  |    5 +
 .../plc4x/java/knxnetip/ets5/Ets5Parser.java       |   14 +-
 .../java/knxnetip/ets5/model/GroupAddress.java     |    7 +-
 .../knxnetip/protocol/KnxNetIpProtocolLogic.java   |   10 +-
 .../java/spi/values/IEC61131ValueHandler.java      |   17 +-
 .../java/spi/values/{PlcDate.java => PlcDATE.java} |   12 +-
 .../{PlcDateTime.java => PlcDATE_AND_TIME.java}    |   12 +-
 .../org/apache/plc4x/java/spi/values/PlcNull.java  |   11 +
 .../org/apache/plc4x/java/spi/values/PlcTIME.java  |   80 +
 .../values/{PlcTime.java => PlcTIME_OF_DAY.java}   |   13 +-
 .../plc4x/java/spi/values/PlcValueAdapter.java     |   13 +
 .../resources/protocols/knxnetip/knxnetip.mspec    |  141 +-
 .../s7/src/main/resources/protocols/s7/s7.mspec    |   19 +-
 sandbox/plc4c/generated-sources/s7/src/data_item.c |   30 +-
 .../enrich/knxnetip/ets5/Ets5DataEnrichment.java   |    2 +-
 370 files changed, 17897 insertions(+), 17367 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 0ce48c9..0e488e2 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
@@ -298,24 +298,42 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
 
     public boolean hasFieldOfType(String fieldTypeName) {
         if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
-        return ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field -> field.getTypeName().equals(fieldTypeName));
-    }
+           return ((ComplexTypeDefinition) getThisTypeDefinition()).getFields().stream().anyMatch(field -> field.getTypeName().equals(fieldTypeName));
+        }
         return false;
     }
 
+    public boolean hasFieldsWithNames(List<Field> fields, String... names) {
+        for (String name : names) {
+            boolean foundName = false;
+            for (Field field : fields) {
+                if(field instanceof NamedField) {
+                    if(name.equals(((NamedField) field).getName())) {
+                        foundName = true;
+                        break;
+                    }
+                }
+            }
+            if(!foundName) {
+                return false;
+            }
+        }
+        return true;
+    }
+
     public Field getFieldForNameFromCurrentOrParent(String fieldName) {
         if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
-        return ((ComplexTypeDefinition) getThisTypeDefinition()).getAllPropertyFields()
-            .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
-    }
+            return ((ComplexTypeDefinition) getThisTypeDefinition()).getAllPropertyFields()
+                .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
+        }
         return null;
     }
 
     public Field getFieldForNameFromCurrent(String fieldName) {
         if(getThisTypeDefinition() instanceof ComplexTypeDefinition) {
-        return ((ComplexTypeDefinition) getThisTypeDefinition()).getPropertyFields()
-            .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
-    }
+            return ((ComplexTypeDefinition) getThisTypeDefinition()).getPropertyFields()
+                .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
+        }
         return null;
     }
 
diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index 1640fce..ab87bba 100644
--- a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -259,6 +259,10 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         }
     }
 
+    public boolean needsPointerAccess(PropertyField field) {
+        return !(field instanceof EnumField) && ("optional".equals(field.getTypeName()) || isComplexTypeReference(field.getType()));
+    }
+
     public String getReadBufferReadMethodCall(SimpleTypeReference simpleTypeReference, String valueString) {
         switch (simpleTypeReference.getBaseType()) {
             case BIT: {
@@ -477,7 +481,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             }
         } else if (term instanceof TernaryTerm) {
             TernaryTerm tt = (TernaryTerm) term;
-            if("if".equals(tt.getOperation())) {
+            if ("if".equals(tt.getOperation())) {
                 Term a = tt.getA();
                 Term b = tt.getB();
                 Term c = tt.getC();
@@ -511,6 +515,13 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 ((vl.getChild().getChild() != null) ?
                     "." + toVariableExpression(typeReference, vl.getChild().getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
         }
+        // If we are accessing optional fields of simple type, we need to use pointer-access.
+        else if (!serialize && (getFieldForNameFromCurrent(vl.getName()) instanceof OptionalField) &&
+            (((OptionalField) getFieldForNameFromCurrent(vl.getName())).getType() instanceof SimpleTypeReference)) {
+            return "(*" + vl.getName() + ")" +
+                ((vl.getChild() != null) ?
+                    "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, serialize, suppressPointerAccess) : "");
+        }
         // CAST expressions are special as we need to add a ".class" to the second parameter in Java.
         else if ("CAST".equals(vl.getName())) {
             if ((vl.getArgs() == null) || (vl.getArgs().size() != 2)) {
@@ -662,7 +673,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                     String childProperty = vl.getChild().getName();
                     final Optional<Field> matchingDiscriminatorField = complexTypeDefinition.getFields().stream().filter(field -> (field instanceof DiscriminatorField) && ((DiscriminatorField) field).getName().equals(childProperty)).findFirst();
                     if(matchingDiscriminatorField.isPresent()) {
-                        return "CastI" + getLanguageTypeNameForTypeReference(complexTypeReference) + "(" + vl.getName() + ")." + StringUtils.capitalize(childProperty) + "()";
+                        return "Cast" + getLanguageTypeNameForTypeReference(complexTypeReference) + "(" + vl.getName() + ")." + StringUtils.capitalize(childProperty) + "()";
                     }
                 }
             }
@@ -672,12 +683,6 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             return vl.getName() + ((vl.getChild() != null) ?
                 "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
         }
-        // If the current term is an optional type, we need to add pointer access
-        // (Except if we're doing a nil/not-nil check)
-        if((getFieldForNameFromCurrent(vl.getName()) instanceof OptionalField) && !suppressPointerAccess) {
-            return "(*" + (serialize ? "m." + StringUtils.capitalize(vl.getName()) : vl.getName()) + ")" + ((vl.getChild() != null) ?
-                "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
-        }
         return (serialize ? "m." + StringUtils.capitalize(vl.getName()) : vl.getName()) + ((vl.getChild() != null) ?
             "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
     }
@@ -793,16 +798,8 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             imports.add("\"math\"");
         }
 
-        imports.add("\"plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi\"");
         imports.add("\"plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils\"");
 
-        // "Fields with complex type": "reflect"
-        if(complexTypeDefinition.getFields().stream().anyMatch(field ->
-            !(field instanceof EnumField) &&
-            ((field instanceof TypedField) && ((TypedField) field).getType() instanceof ComplexTypeReference))) {
-            imports.add("\"reflect\"");
-        }
-
         // For Constant field: "strconv"
         if(complexTypeDefinition.getFields().stream().anyMatch(field ->
             (field instanceof ConstField))/* || complexTypeDefinition.getAllPropertyFields().stream().anyMatch(
@@ -813,6 +810,25 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         return imports;
     }
 
+    public List<String> getRequiredImportsForDataIo() {
+        DataIoTypeDefinition dataIo = (DataIoTypeDefinition) getThisTypeDefinition();
+
+        List<String> imports = new ArrayList<>();
+
+        imports.add("\"errors\"");
+        imports.add("\"plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/model/values\"");
+        imports.add("\"plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils\"");
+        imports.add("api \"plc4x.apache.org/plc4go-modbus-driver/v0/pkg/plc4go/values\"");
+
+        if(dataIo.getSwitchField().getCases().stream().anyMatch(typeCase ->
+            (typeCase.getName().equals("TIME_OF_DAY") && hasFieldsWithNames(typeCase.getFields(), "hour", "minutes", "seconds")) ||
+                (typeCase.getName().equals("DATE") && hasFieldsWithNames(typeCase.getFields(), "year", "month", "day")) ||
+                (typeCase.getName().equals("DATE_AND_TIME") && hasFieldsWithNames(typeCase.getFields(), "year", "month", "day", "hour", "minutes", "seconds")))) {
+            imports.add("\"time\"");
+        }
+        return imports;
+    }
+
     public String getVariableName(Field field) {
         if(!(field instanceof NamedField)) {
             return "_";
diff --git a/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh
index 525d1f2..6db6ffc 100644
--- a/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/data-io-template.ftlh
@@ -63,10 +63,11 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/m
 package model
 
 import (
-    "errors"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/model/values"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
-    api "plc4x.apache.org/plc4go-modbus-driver/v0/pkg/plc4go/values"
+    <#if helper.getRequiredImportsForDataIo()?has_content>
+        <#list helper.getRequiredImportsForDataIo() as import>
+            ${import}
+        </#list>
+    </#if>
 )
 
 func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (api.PlcValue, error) {
@@ -134,15 +135,21 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
         <#if valueDefined>
             <#switch case.name>
                 <#case "TIME_OF_DAY">
+                    <#if helper.hasFieldsWithNames(case.fields, "hour", "minutes", "seconds")>
             value := time.Date(0,0,0, int(hour), int(minutes), int(seconds), 0, nil)
+                    </#if>
             return values.NewPlcTIME_OF_DAY(value), nil
                     <#break>
                 <#case "DATE">
+                    <#if helper.hasFieldsWithNames(case.fields, "year", "month", "day")>
             value := time.Date(int(year), time.Month(month), int(day), 0, 0, 0, 0, nil)
+                    </#if>
             return values.NewPlcDATE(value), nil
                     <#break>
                 <#case "DATE_AND_TIME">
+                    <#if helper.hasFieldsWithNames(case.fields, "year", "month", "day", "hour", "minutes", "seconds")>
             value := time.Date(int(year), time.Month(month), int(day), int(hour), int(minutes), int(seconds), 0, nil)
+                    </#if>
             return values.NewPlcDATE_AND_TIME(value), nil
                     <#break>
                 <#case "Struct">
diff --git a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
index 0538214..c01deab 100644
--- a/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/enum-template.ftlh
@@ -48,14 +48,12 @@ ${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/m
 package model
 
 import (
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 type ${type.name} <#if type.type?has_content>${helper.getLanguageTypeNameForTypeReference(type.type)}<#else>string</#if>
 
 type I${type.name} interface {
-    spi.Message
 <#if type.constantNames?has_content>
     <#list type.constantNames as constantName>
     ${constantName?cap_first}() ${helper.getLanguageTypeNameForTypeReference(type.getConstantType(constantName))}
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 e20ef9b..b6d81b8 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
@@ -81,24 +81,28 @@ const ${type.name}_${field.name?upper_case} ${helper.getLanguageTypeNameForField
 type ${type.name} struct {
 <#-- Prpoerty fields are fields that require a property in the pojo -->
 <#if type.propertyFields?has_content>
-<#list type.propertyFields as field>
-    ${field.name?cap_first} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}
-</#list>
+    <#list type.propertyFields as field>
+    ${field.name?cap_first} <#if field.loopType??>[]</#if><#if helper.needsPointerAccess(field)>*</#if>${helper.getLanguageTypeNameForField(field)}
+    </#list>
+</#if>
+<#if helper.isDiscriminatedParentTypeDefinition()>
+    Child I${type.name}Child
 </#if>
 <#--
     This is GO's version of inheritance
     (Makes all properties of the following type available in this tpye)
 -->
-<#if type.parentType??>    ${type.parentType.name}</#if>
+<#if type.parentType??>
+    Parent *${type.parentType.name}
+</#if>
+    I${type.name}
+<#if helper.isDiscriminatedParentTypeDefinition()>
+    I${type.name}Parent
+</#if>
 }
 
 // The corresponding interface
 type I${type.name} interface {
-<#if helper.isDiscriminatedChildTypeDefinition()>
-    I${type.parentType.name}
-<#else>
-    spi.Message
-</#if>
 <#if helper.isDiscriminatedParentTypeDefinition()>
     <#list helper.getDiscriminatorTypes() as discriminatorName, discriminatorType>
     <#-- If the discriminator name matches that of another field, suppress the methods generation -->
@@ -107,17 +111,20 @@ type I${type.name} interface {
         </#if>
     </#list>
 </#if>
-    Serialize(io utils.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>) error
+    LengthInBytes() uint16
+    LengthInBits() uint16
+    Serialize(io utils.WriteBuffer) error
 }
-
 <#if helper.isDiscriminatedChildTypeDefinition()>
     <#assign discriminatedChildType = type>
-    <#-- @ftlvariable name="discriminatedChildType" type="org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition" -->
+
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
+///////////////////////////////////////////////////////////
     <#list helper.getDiscriminatorValues(discriminatedChildType) as discriminatorName, discriminatorValue>
         <#-- If the discriminator name matches that of another field, suppress the methods generation -->
         <#if !helper.isNonDiscriminatorField(discriminatorName)>
-func (m ${type.name}) ${discriminatorName?cap_first}() ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])} {
+func (m *${type.name}) ${discriminatorName?cap_first}() ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])} {
     return <#if discriminatorValue??>${discriminatorValue}<#else>${helper.getNullValueForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])}</#if>
 }
 
@@ -125,58 +132,71 @@ func (m ${type.name}) ${discriminatorName?cap_first}() ${helper.getLanguageTypeN
     </#list>
 </#if>
 <#if helper.isDiscriminatedParentTypeDefinition()>
-type ${type.name}Initializer interface {
-    initialize(<#list type.getAllPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) spi.Message
+
+type I${type.name}Parent interface {
+    SerializeParent(io utils.WriteBuffer, child I${type.name}, serializeChildFunction func() error<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) error
 }
 
-    <#list helper.getDiscriminatorTypes() as discriminatorName, discriminatorType>
-    <#-- If the discriminator name matches that of another field, suppress the methods generation -->
+type I${type.name}Child interface {
+    Serialize(io utils.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>) error
+    InitializeParent(parent *${type.name}<#if type.getPropertyFields()?has_content>, <#list type.getPropertyFields() as field>${field.name} <#if field.loopType??>[]</#if><#if helper.needsPointerAccess(field)>*</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list></#if>)
+    I${type.name}
+}
+    <#--list helper.getDiscriminatorTypes() as discriminatorName, discriminatorType>
+    <#- If the discriminator name matches that of another field, suppress the methods generation ->
         <#if !helper.isNonDiscriminatorField(discriminatorName)>
 func ${type.name}${discriminatorName?cap_first}(m I${type.name}) ${helper.getLanguageTypeNameForTypeReference(helper.getDiscriminatorTypes()[discriminatorName])} {
     return m.${discriminatorName?cap_first}()
 }
-
         </#if>
-    </#list>
-<#else>
-<#if type.parentType??>func (m ${type.name}) initialize(<#list type.parentType.getAllPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) spi.Message {
+    </#list-->
+<#elseif type.parentType??>
+
+func (m *${type.name}) InitializeParent(parent *${type.parentType.name}<#if type.parentType.getAllPropertyFields()?has_content>, <#list type.parentPropertyFields as parentField>${parentField.name} <#if parentField.loopType??>[]</#if><#if helper.needsPointerAccess(parentField)>*</#if>${helper.getLanguageTypeNameForField(parentField)}<#sep>, </#sep></#list></#if>) {
     <#list type.parentType.getAllPropertyFields() as field>
-    m.${field.name?cap_first} = ${field.name}
+    m.Parent.${field.name?cap_first} = ${field.name}
     </#list>
-    return m
 }
 </#if>
 
-func New${type.name}(<#list type.getPropertyFields() as field>${field.name} <#if field.typeName == "optional">*</#if><#if field.loopType??>[]</#if><#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list>) <#if type.parentType??>${type.parentType.name}Initializer<#else>spi.Message</#if> {
+func New${type.name}(<#list type.getPropertyFields() as field>${field.name} <#if field.loopType??>[]</#if><#if helper.needsPointerAccess(field)>*</#if>${helper.getLanguageTypeNameForField(field)}<#sep>, </#sep></#list><#if type.parentType?has_content><#if type.getPropertyFields()?has_content>, </#if><#list type.parentPropertyFields as parentField>${parentField.name} <#if parentField.loopType??>[]</#if><#if helper.needsPointerAccess(parentField)>*</#if>${helper.getLanguageTypeNameForField [...]
+<#if type.parentType?has_content>
+    child := &${type.name}{
+    <#list type.getPropertyFields() as field>
+        ${field.name?cap_first}: ${field.name},
+    </#list>
+        Parent: New${type.parentType.name}(<#list type.parentPropertyFields as parentField>${parentField.name}<#sep>, </#list>),
+    }
+    child.Parent.Child = child
+    return child.Parent
+<#else>
     return &${type.name}{<#list type.getPropertyFields() as field>${field.name?cap_first}: ${field.name}<#sep>, </#sep></#list>}
-}
 </#if>
-
-func CastI${type.name}(structType interface{}) I${type.name} {
-    castFunc := func(typ interface{}) I${type.name} {
-        if i${type.name}, ok := typ.(I${type.name}); ok {
-            return i${type.name}
-        }
-        return nil
-    }
-    return castFunc(structType)
 }
 
 func Cast${type.name}(structType interface{}) ${type.name} {
     castFunc := func(typ interface{}) ${type.name} {
-        if s${type.name}, ok := typ.(${type.name}); ok {
-            return s${type.name}
+        if casted, ok := typ.(${type.name}); ok {
+            return casted
+        }
+        if casted, ok := typ.(*${type.name}); ok {
+            return *casted
         }
-        if s${type.name}, ok := typ.(*${type.name}); ok {
-            return *s${type.name}
+    <#if type.parentType?has_content>
+        if casted, ok := typ.(${type.parentType.name}); ok {
+            return Cast${type.name}(casted.Child)
         }
+        if casted, ok := typ.(*${type.parentType.name}); ok {
+            return Cast${type.name}(casted.Child)
+        }
+    </#if>
         return ${type.name}{}
     }
     return castFunc(structType)
 }
 
-func (m ${type.name}) LengthInBits() uint16 {
-    var lengthInBits uint16 = <#if type.parentType??>m.${type.parentType.name}.LengthInBits()<#else>0</#if>
+func (m *${type.name}) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
     <#list type.fields as field>
         <#switch field.typeName>
             <#case "array">
@@ -286,6 +306,7 @@ func (m ${type.name}) LengthInBits() uint16 {
                 <#assign switchField = field>
 
     // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
                 <#break>
             <#case "virtual">
                 <#assign virtualField = field>
@@ -298,11 +319,11 @@ func (m ${type.name}) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m ${type.name}) LengthInBytes() uint16 {
+func (m *${type.name}) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (<#if type.parentType??>${type.parentType.name}Initializer<#else>spi.Message</#if>, error) {
+func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name} <#if helper.isComplexTypeReference(parserArgument.type)>*</#if>${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) (*<#if type.parentType?has_content>${type.parentType.name}<#else>${type.name}</#if>, error) {
     <#if helper.requiresStartPosAndCurPos()>
     var startPos = io.GetPos()
     var curPos uint16
@@ -320,56 +341,30 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
             <#-- If this is a count array, we can directly initialize an array with the given size -->
                 <#if helper.isCountArrayField(field)>
     // Count array
-    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>I</#if>${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
+    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
     for curItem := uint16(0); curItem < uint16(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}); curItem++ {
-<#if (!helper.isSimpleTypeReference(arrayField.type)) && helper.requiresVariable(arrayField, "lastItem")>            lastItem := curItem == uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} - 1)</#if>
-                    <#if helper.isSimpleTypeReference(arrayField.type)>
-                        <#assign simpleTypeReference = arrayField.type>
-        _item, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
-        if _err != nil {
-            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
-        }
-        ${arrayField.name}[curItem] = _item
-                    <#else>
-        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
+                    <#if (!helper.isSimpleTypeReference(arrayField.type)) && helper.requiresVariable(arrayField, "lastItem")>
+        lastItem := curItem == uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} - 1)
+                    </#if>
+        _item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list>< [...]
         if _err != nil {
             return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
         }
-        var _item I${helper.getLanguageTypeNameForField(field)}
-        _item, _ok := _message.(I${arrayField.type.name})
-        if !_ok {
-            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
-        }
         ${arrayField.name}[curItem] = _item
-                    </#if>
     }
                 <#-- In all other cases do we have to work with a list, that is later converted to an array -->
                 <#elseif helper.isLengthArrayField(field)>
                 <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
     // Length array
-    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>I</#if>${helper.getLanguageTypeNameForField(field)}, 0)
+    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
     _${arrayField.name}Length := ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}
     _${arrayField.name}EndPos := io.GetPos() + uint16(_${arrayField.name}Length)
     for ;io.GetPos() < _${arrayField.name}EndPos; {
-                    <#if helper.isSimpleTypeReference(arrayField.type)>
-                        <#assign simpleTypeReference = arrayField.type>
-        _item, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
-        if _err != nil {
-            return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
-        }
-        ${arrayField.name} = append(${arrayField.name}, _item)
-                    <#else>
-        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
+        _item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list>< [...]
         if _err != nil {
             return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
         }
-        var _item I${helper.getLanguageTypeNameForField(field)}
-        _item, _ok := _message.(I${arrayField.type.name})
-        if !_ok {
-            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
-        }
         ${arrayField.name} = append(${arrayField.name}, _item)
-                    </#if>
                     <#-- After parsing, update the current position, but only if it's needed -->
                     <#if arrayField.loopExpression.contains("curPos")>
         curPos = io.GetPos() - startPos
@@ -378,27 +373,13 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
                     <#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
                 <#elseif helper.isTerminatedArrayField(field)>
     // Terminated array
-    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>I</#if>${helper.getLanguageTypeNameForField(field)}, 0)
+    ${arrayField.name} := make([]<#if helper.isComplexTypeReference(arrayField.type)>*</#if>${helper.getLanguageTypeNameForField(field)}, 0)
     for ;!bool(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}); {
-                    <#if helper.isSimpleTypeReference(arrayField.type)>
-                        <#assign simpleTypeReference = arrayField.type>
-        _item, _err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+        _item, _err := <#if helper.isSimpleTypeReference(arrayField.type)>${helper.getReadBufferReadMethodCall(arrayField.type)}<#else>${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list>< [...]
         if _err != nil {
             return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
         }
         ${arrayField.name} = append(${arrayField.name}, _item)
-                    <#else>
-        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
-        if _err != nil {
-
-        }
-        var _item I${helper.getLanguageTypeNameForField(field)}
-        _item, _ok := _message.(I${arrayField.type.name})
-        if !_ok {
-            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to ${arrayField.type.name}")
-        }
-        ${arrayField.name} = append(${arrayField.name}, _item)
-                    </#if>
 
                     <#-- After parsing, update the current position, but only if it's needed -->
                     <#if arrayField.loopExpression.contains("curPos")>
@@ -546,7 +527,7 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
                 <#if optionalField.conditionExpression.contains("curPos")>
     curPos = io.GetPos() - startPos
                 </#if>
-    var ${optionalField.name} *<#if helper.isComplexTypeReference(optionalField.type)>I</#if>${helper.getLanguageTypeNameForField(field)} = nil
+    var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
     if ${helper.toBooleanParseExpression(optionalField.conditionExpression, type.parserArguments)} {
             <#if helper.isSimpleTypeReference(optionalField.type)>
         _val, _err := ${helper.getReadBufferReadMethodCall(optionalField.type)}
@@ -560,12 +541,7 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
         if _err != nil {
             return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
         }
-        var _item I${helper.getLanguageTypeNameForField(field)}
-        _item, _ok := _message.(I${helper.getLanguageTypeNameForField(field)})
-        if !_ok {
-            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to I${helper.getLanguageTypeNameForField(field)}")
-        }
-        ${optionalField.name} = &_item
+        ${optionalField.name} = _message
             </#if>
     }
                 <#break>
@@ -607,36 +583,22 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
                 <#assign simpleField = field>
 
     // Simple Field (${simpleField.name})
-                <#if helper.isSimpleTypeReference(simpleField.type)>
-                    <#assign simpleTypeReference = simpleField.type>
-    ${simpleField.name}, _${simpleField.name}Err := ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
+    ${simpleField.name}, _${simpleField.name}Err := <#if helper.isSimpleTypeReference(simpleField.type)>${helper.getReadBufferReadMethodCall(simpleField.type)}<#else>${simpleField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(simpleField.type, parserArgument?index), parserArgument, type.parserAr [...]
     if _${simpleField.name}Err != nil {
         return nil, errors.New("Error parsing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
     }
-                <#else>
-                    <#assign complexTypeReference = simpleField.type>
-    _${simpleField.name}Message, _err := ${complexTypeReference.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(simpleField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
-    if _err != nil {
-        return nil, errors.New("Error parsing simple field '${simpleField.name}'. " + _err.Error())
-    }
-    var ${simpleField.name} I${helper.getLanguageTypeNameForField(field)}
-    ${simpleField.name}, _${simpleField.name}Ok := _${simpleField.name}Message.(I${helper.getLanguageTypeNameForField(field)})
-    if !_${simpleField.name}Ok {
-        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_${simpleField.name}Message).Name() + " to I${helper.getLanguageTypeNameForField(field)}")
-    }
-                </#if>
                 <#break>
 
             <#case "switch">
                 <#assign switchField = field>
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    var initializer ${type.name}Initializer
+    var _parent *${type.name}
     var typeSwitchError error
     switch {
                 <#list switchField.cases as case>
     <#if case.discriminatorValues?has_content>case <#list case.discriminatorValues as discriminatorValue>${helper.toParseExpression(null, switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)} == ${discriminatorValue}<#sep> && </#sep></#list></#if>:
-        initializer, typeSwitchError = ${case.name}Parse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${parserArgument.name}<#sep>, </#sep></#list></#if>)
+        _parent, typeSwitchError = ${case.name}Parse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${parserArgument.name}<#sep>, </#sep></#list></#if>)
                 </#list>
     }
     if typeSwitchError != nil {
@@ -652,29 +614,44 @@ func ${type.name}Parse(io *utils.ReadBuffer<#if type.parserArguments?has_content
     if _${virtualField.name}Err != nil {
         return nil, errors.New("Error parsing '${virtualField.name}' field " + _${virtualField.name}Err.Error())
     }
-
                 <#break>
         </#switch>
     </#list>
 
-    // Create the instance
     <#if helper.isDiscriminatedParentTypeDefinition()>
-    return initializer.initialize(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>), nil
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent<#if type.propertyFields?has_content>, <#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list></#if>)
+    return _parent, nil
+    <#elseif type.parentType?has_content>
+    // Create a partially initialized instance
+    _child := &${type.name}{
+        <#list type.propertyFields as field>
+        ${field.name?cap_first}: ${field.name},
+        </#list>
+        Parent: &${type.parentType.name}{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
     <#else>
+    // Create the instance
     return New${type.name}(<#list type.propertyFields as field>${field.name}<#sep>, </#sep></#list>), nil
     </#if>
 }
 
 <#if helper.isDiscriminatedParentTypeDefinition()>
-func ${type.name}Serialize(io utils.WriteBuffer, m ${type.name}, i I${type.name}, childSerialize func() error<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) error {
+func (m *${type.name}) Serialize(io utils.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>) error {
+    return m.Child.Serialize(io<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
+}
+
+func (m *${type.name}) SerializeParent(io utils.WriteBuffer, child I${type.name}, serializeChildFunction func() error<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) error {
 <#else>
-func (m ${type.name}) Serialize(io utils.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>) error {
+func (m *${type.name}) Serialize(io utils.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>) error {
 </#if>
     <#assign arraySizeInBytesHelpers=helper.requiresHelperFunctions("ARRAY_SIZE_IN_BYTES")>
     <#if arraySizeInBytesHelpers?has_content>
         <#list arraySizeInBytesHelpers?keys as key>
             <#assign typeName=arraySizeInBytesHelpers[key]>
-    ${key}ArraySizeInBytes := func(items []I${typeName}) uint32 {
+    ${key}ArraySizeInBytes := func(items []*${typeName}) uint32 {
         var sizeInBytes uint32 = 0
         for _, v := range items {
             sizeInBytes += uint32(v.LengthInBytes())
@@ -749,7 +726,7 @@ func (m ${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerArg
                 <#assign simpleTypeReference = discriminatorField.type>
 
     // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
-    ${discriminatorField.name} := ${helper.getLanguageTypeNameForField(field)}(i.${discriminatorField.name?cap_first}())
+    ${discriminatorField.name} := ${helper.getLanguageTypeNameForField(field)}(child.${discriminatorField.name?cap_first}())
     _${discriminatorField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
     if _${discriminatorField.name}Err != nil {
         return errors.New("Error serializing '${discriminatorField.name}' field " + _${discriminatorField.name}Err.Error())
@@ -796,7 +773,7 @@ func (m ${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerArg
                 <#assign optionalField = field>
 
     // 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
+    var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
     if m.${optionalField.name?cap_first} != nil {
                 <#if helper.isSimpleTypeReference(optionalField.type)>
                     <#assign simpleTypeReference = optionalField.type>
@@ -805,7 +782,7 @@ func (m ${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerArg
                 <#else>
                     <#assign complexTypeReference = optionalField.type>
         ${optionalField.name} = m.${optionalField.name?cap_first}
-        _${optionalField.name}Err := CastI${helper.getLanguageTypeNameForField(field)}(*${optionalField.name}).Serialize(io)
+        _${optionalField.name}Err := ${optionalField.name}.Serialize(io)
                 </#if>
         if _${optionalField.name}Err != nil {
             return errors.New("Error serializing '${optionalField.name}' field " + _${optionalField.name}Err.Error())
@@ -850,8 +827,7 @@ func (m ${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerArg
     _${simpleField.name}Err := ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
-    ${simpleField.name} := CastI${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name?cap_first})
-    _${simpleField.name}Err := ${simpleField.name}.Serialize(io)
+    _${simpleField.name}Err := m.${simpleField.name?cap_first}.Serialize(io)
                 </#if>
     if _${simpleField.name}Err != nil {
         return errors.New("Error serializing '${simpleField.name}' field " + _${simpleField.name}Err.Error())
@@ -861,7 +837,7 @@ func (m ${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerArg
                 <#assign switchField = field>
 
     // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-    _typeSwitchErr := childSerialize()
+    _typeSwitchErr := serializeChildFunction()
     if _typeSwitchErr != nil {
         return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
     }
@@ -874,7 +850,7 @@ func (m ${type.name}) Serialize(io utils.WriteBuffer<#if helper.getSerializerArg
     <#if helper.isDiscriminatedChildTypeDefinition()>
         return nil
     }
-    return ${type.parentType.name}Serialize(io, m.${type.parentType.name}, CastI${type.parentType.name}(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
     <#else>
     return nil
     </#if>
@@ -910,19 +886,19 @@ func (m *${type.name}) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
                 m.${field.name?cap_first} = utils.ByteToInt8(_decoded[0:_len])
             <#elseif helper.isComplexTypeReference(field.type) && helper.isDiscriminatedParentTypeDefinition(helper.getTypeDefinitionForTypeReference(field.type))>
                 <#if helper.isArrayField(field)>
-                var _values []<#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForTypeReference(field.type)}
+                var _values []<#if helper.needsPointerAccess(field)>*</#if>${helper.getLanguageTypeNameForTypeReference(field.type)}
                 </#if>
                 switch tok.Attr[0].Value {
                 <#list helper.getSubTypeDefinitions(helper.getTypeDefinitionForTypeReference(field.type)) as subtype>
                     case "org.apache.plc4x.java.${protocolName}.${outputFlavor?replace("-","")}.${subtype.name}":
-                        var dt *${subtype.name}
+                        var dt *${helper.getLanguageTypeNameForField(field)}
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                     <#if helper.isArrayField(field)>
                         _values = append(_values, dt)
                     <#else>
-                        <#if helper.isOptionalField(field)>*</#if>m.${field.name?cap_first} = dt
+                        m.${field.name?cap_first} = dt
                     </#if>
                 </#list>
                     }
@@ -930,27 +906,23 @@ func (m *${type.name}) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
                     m.${field.name?cap_first} = _values
                 </#if>
             <#elseif helper.isArrayField(field)>
-                var data []<#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}
+                var data []<#if helper.isComplexTypeReference(field.type)>*</#if>${helper.getLanguageTypeNameForField(field)}
                 if err := d.DecodeElement(&data, &tok); err != nil {
                     return err
                 }
                 m.${field.name?cap_first} = data
-            <#elseif helper.isOptionalField(field)>
-                var data *<#if helper.isComplexTypeReference(field.type)>I</#if>${helper.getLanguageTypeNameForField(field)}
-                if err := d.DecodeElement(&data, &tok); err != nil {
+            <#elseif helper.needsPointerAccess(field)>
+                var data *${helper.getLanguageTypeNameForField(field)}
+                if err := d.DecodeElement(data, &tok); err != nil {
                     return err
                 }
                 m.${field.name?cap_first} = data
             <#else>
-                var data <#if helper.isComplexTypeReference(field.type)>*</#if>${helper.getLanguageTypeNameForField(field)}
+                var data ${helper.getLanguageTypeNameForField(field)}
                 if err := d.DecodeElement(&data, &tok); err != nil {
                     return err
                 }
-                <#if helper.isComplexTypeReference(field.type) && !helper.isEnumField(field)>
-                m.${field.name?cap_first} = CastI${helper.getLanguageTypeNameForField(field)}(data)
-                <#else>
                 m.${field.name?cap_first} = data
-                </#if>
             </#if>
         </#list>
     </#if>
@@ -959,7 +931,7 @@ func (m *${type.name}) UnmarshalXML(d *xml.Decoder, start xml.StartElement) erro
     }
 }
 
-func (m ${type.name}) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *${type.name}) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.${protocolName}.${outputFlavor?replace("-","")}.${type.name}"},
         }}); err != nil {
diff --git a/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh
index cc848bf..c32c2c8 100644
--- a/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/parser-factory-template.ftlh
@@ -41,7 +41,7 @@
 <#-- @ftlvariable name="virtualField" type="org.apache.plc4x.plugins.codegenerator.types.fields.VirtualField" -->
 <#-- @ftlvariable name="simpleTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference" -->
 <#-- @ftlvariable name="complexTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference" -->
-${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/model/ParserHelper.go
+${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/ParserHelper.go
 //
 // Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
@@ -64,6 +64,7 @@ package model
 
 import (
     "errors"
+    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/${protocolName}/${outputFlavor?replace("-","")}/model"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
@@ -87,7 +88,7 @@ func (m ${protocolName?cap_first}ParserHelper) Parse(typeName string, arguments
             </#if>
         </#list>
     </#if>
-        return ${typeDefinition.name}Parse(io<#if typeDefinition.parserArguments?has_content>, <#list typeDefinition.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#list></#if>)
+        return model.${typeDefinition.name}Parse(io<#if typeDefinition.parserArguments?has_content>, <#list typeDefinition.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#list></#if>)
 </#list>
     }
     return nil, errors.New("Unsupported type " + typeName)
diff --git a/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh
index cd3ef7e..5291804 100644
--- a/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh
+++ b/build-utils/language-go/src/main/resources/templates/go/xml-parser-factory-template.ftlh
@@ -41,7 +41,7 @@
 <#-- @ftlvariable name="virtualField" type="org.apache.plc4x.plugins.codegenerator.types.fields.VirtualField" -->
 <#-- @ftlvariable name="simpleTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference" -->
 <#-- @ftlvariable name="complexTypeReference" type="org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference" -->
-${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/model/XmlParserHelper.go
+${helper.fileName(protocolName, languageName, outputFlavor)?replace(".", "/")}/XmlParserHelper.go
 //
 // Licensed to the Apache Software Foundation (ASF) under one
 // or more contributor license agreements.  See the NOTICE file
@@ -65,6 +65,7 @@ package model
 import (
     "encoding/xml"
     "errors"
+    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/${protocolName}/${outputFlavor?replace("-","")}/model"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
 )
 
@@ -75,7 +76,7 @@ func (m ${protocolName?cap_first}XmlParserHelper) Parse(typeName string, xmlStri
     switch typeName {
 <#list helper.getComplexTypeRootDefinitions() as typeDefinition>
     case "${typeDefinition.name}":
-        var obj ${helper.getLanguageTypeNameForTypeReference(typeDefinition.typeReference)}
+        var obj *model.${helper.getLanguageTypeNameForTypeReference(typeDefinition.typeReference)}
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
diff --git a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
index edd72ac..2a123a8 100644
--- a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
@@ -232,13 +232,13 @@ public class ${type.name}IO {
             _map.put("${field.name}", new PlcSTRING(${field.name}));
                                 <#break>
                             <#case "LocalTime">
-            _map.put("${field.name}", new PlcTime(${field.name}));
+            _map.put("${field.name}", new PlcTIME_OF_DAY(${field.name}));
                                 <#break>
                             <#case "LocalDate">
-            _map.put("${field.name}", new PlcTime(${field.name}));
+            _map.put("${field.name}", new PlcDATE(${field.name}));
                                 <#break>
                             <#case "LocalDateTime">
-            _map.put("${field.name}", new PlcTime(${field.name}));
+            _map.put("${field.name}", new PlcDATE_AND_TIME(${field.name}));
                                 <#break>
                         </#switch>
                     </#if>
@@ -248,14 +248,17 @@ public class ${type.name}IO {
 
             <#if valueDefined>
                 <#switch case.name>
-                    <#case "Time">
-            return new PlcTime(value);
+                    <#case "TIME">
+            return new PlcTIME(value);
                     <#break>
-                    <#case "Date">
-            return new PlcDate(value);
+                    <#case "DATE">
+            return new PlcDATE(value);
                     <#break>
-                    <#case "DateTime">
-            return new PlcDateTime(value);
+                    <#case "TIME_OF_DAY">
+            return new PlcTIME_OF_DAY(value);
+                    <#break>
+                    <#case "DATE_AND_TIME">
+            return new PlcDATE_AND_TIME(value);
                     <#break>
                     <#case "Struct">
             return new PlcStruct(_map);
diff --git a/plc4go/cmd/main/drivers/modbus_test.go b/plc4go/cmd/main/drivers/modbus_test.go
index 0e13563..fa3a75a 100644
--- a/plc4go/cmd/main/drivers/modbus_test.go
+++ b/plc4go/cmd/main/drivers/modbus_test.go
@@ -65,7 +65,7 @@ func test(t *testing.T, rawMessage string, response bool) {
 		xml.Unmarshal(serialized, &deserializedAdu)
 
 		wb := utils.NewWriteBuffer()
-		val := model.CastIModbusTcpADU(deserializedAdu)
+		val := model.CastModbusTcpADU(deserializedAdu)
 		val.Serialize(*wb)
 		serializedMessage := hex.EncodeToString(wb.GetBytes())
 		if strings.ToUpper(serializedMessage) != strings.ToUpper(rawMessage) {
@@ -78,15 +78,9 @@ func test(t *testing.T, rawMessage string, response bool) {
 // Test that actually sends a read-request to a remote Modbus Slave
 //
 func Connection(t *testing.T) {
-	pdu := model.ModbusPDUReadInputRegistersRequest{
-		StartingAddress: 1,
-		Quantity:        1,
-	}
-	adu := model.ModbusTcpADU{
-		TransactionIdentifier: 0,
-		UnitIdentifier:        255,
-		Pdu:                   &pdu,
-	}
+
+	pdu := model.NewModbusPDUReadInputRegistersRequest(1, 1)
+    adu := model.NewModbusTcpADU( 0,255, pdu)
 
 	wb := utils.NewWriteBuffer()
 	adu.Serialize(*wb)
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/ParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
similarity index 76%
rename from plc4go/internal/plc4go/bacnetip/readwrite/model/ParserHelper.go
rename to plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
index 930ba37..0eab689 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/ParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/ParserHelper.go
@@ -20,6 +20,7 @@ package model
 
 import (
     "errors"
+    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/bacnetip/readwrite/model"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
@@ -34,45 +35,45 @@ func (m BacnetipParserHelper) Parse(typeName string, arguments []string, io *uti
         if err != nil {
             return nil, err
         }
-        return APDUParse(io, apduLength)
+        return model.APDUParse(io, apduLength)
     case "BACnetTag":
-        return BACnetTagParse(io)
+        return model.BACnetTagParse(io)
     case "BACnetTagWithContent":
-        return BACnetTagWithContentParse(io)
+        return model.BACnetTagWithContentParse(io)
     case "BACnetError":
-        return BACnetErrorParse(io)
+        return model.BACnetErrorParse(io)
     case "NLM":
         apduLength, err := utils.StrToUint16(arguments[0])
         if err != nil {
             return nil, err
         }
-        return NLMParse(io, apduLength)
+        return model.NLMParse(io, apduLength)
     case "BACnetConfirmedServiceRequest":
         len, err := utils.StrToUint16(arguments[0])
         if err != nil {
             return nil, err
         }
-        return BACnetConfirmedServiceRequestParse(io, len)
+        return model.BACnetConfirmedServiceRequestParse(io, len)
     case "BACnetAddress":
-        return BACnetAddressParse(io)
+        return model.BACnetAddressParse(io)
     case "BACnetConfirmedServiceACK":
-        return BACnetConfirmedServiceACKParse(io)
+        return model.BACnetConfirmedServiceACKParse(io)
     case "BACnetUnconfirmedServiceRequest":
         len, err := utils.StrToUint16(arguments[0])
         if err != nil {
             return nil, err
         }
-        return BACnetUnconfirmedServiceRequestParse(io, len)
+        return model.BACnetUnconfirmedServiceRequestParse(io, len)
     case "BACnetServiceAck":
-        return BACnetServiceAckParse(io)
+        return model.BACnetServiceAckParse(io)
     case "BVLC":
-        return BVLCParse(io)
+        return model.BVLCParse(io)
     case "NPDU":
         npduLength, err := utils.StrToUint16(arguments[0])
         if err != nil {
             return nil, err
         }
-        return NPDUParse(io, npduLength)
+        return model.NPDUParse(io, npduLength)
     }
     return nil, errors.New("Unsupported type " + typeName)
 }
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/XmlParserHelper.go b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
similarity index 87%
rename from plc4go/internal/plc4go/bacnetip/readwrite/model/XmlParserHelper.go
rename to plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
index 135dc59..56e2355 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/XmlParserHelper.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/XmlParserHelper.go
@@ -21,6 +21,7 @@ package model
 import (
     "encoding/xml"
     "errors"
+    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/bacnetip/readwrite/model"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
 )
 
@@ -30,84 +31,84 @@ type BacnetipXmlParserHelper struct {
 func (m BacnetipXmlParserHelper) Parse(typeName string, xmlString string) (spi.Message, error) {
     switch typeName {
     case "APDU":
-        var obj APDU
+        var obj *model.APDU
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetTag":
-        var obj BACnetTag
+        var obj *model.BACnetTag
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetTagWithContent":
-        var obj BACnetTagWithContent
+        var obj *model.BACnetTagWithContent
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetError":
-        var obj BACnetError
+        var obj *model.BACnetError
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "NLM":
-        var obj NLM
+        var obj *model.NLM
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetConfirmedServiceRequest":
-        var obj BACnetConfirmedServiceRequest
+        var obj *model.BACnetConfirmedServiceRequest
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetAddress":
-        var obj BACnetAddress
+        var obj *model.BACnetAddress
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetConfirmedServiceACK":
-        var obj BACnetConfirmedServiceACK
+        var obj *model.BACnetConfirmedServiceACK
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetUnconfirmedServiceRequest":
-        var obj BACnetUnconfirmedServiceRequest
+        var obj *model.BACnetUnconfirmedServiceRequest
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BACnetServiceAck":
-        var obj BACnetServiceAck
+        var obj *model.BACnetServiceAck
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "BVLC":
-        var obj BVLC
+        var obj *model.BVLC
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
         }
         return obj, nil
     case "NPDU":
-        var obj NPDU
+        var obj *model.NPDU
         err := xml.Unmarshal([]byte(xmlString), &obj)
         if err != nil {
             return nil, errors.New("error unmarshalling xml: " + err.Error())
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
index 923b459..a0574b1 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
@@ -22,70 +22,68 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type APDU struct {
-
+    Child IAPDUChild
+    IAPDU
+    IAPDUParent
 }
 
 // The corresponding interface
 type IAPDU interface {
-    spi.Message
     ApduType() uint8
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
-type APDUInitializer interface {
-    initialize() spi.Message
+type IAPDUParent interface {
+    SerializeParent(io utils.WriteBuffer, child IAPDU, serializeChildFunction func() error) error
 }
 
-func APDUApduType(m IAPDU) uint8 {
-    return m.ApduType()
+type IAPDUChild interface {
+    Serialize(io utils.WriteBuffer) error
+    InitializeParent(parent *APDU)
+    IAPDU
 }
 
-
-func CastIAPDU(structType interface{}) IAPDU {
-    castFunc := func(typ interface{}) IAPDU {
-        if iAPDU, ok := typ.(IAPDU); ok {
-            return iAPDU
-        }
-        return nil
-    }
-    return castFunc(structType)
+func NewAPDU() *APDU {
+    return &APDU{}
 }
 
 func CastAPDU(structType interface{}) APDU {
     castFunc := func(typ interface{}) APDU {
-        if sAPDU, ok := typ.(APDU); ok {
-            return sAPDU
+        if casted, ok := typ.(APDU); ok {
+            return casted
         }
-        if sAPDU, ok := typ.(*APDU); ok {
-            return *sAPDU
+        if casted, ok := typ.(*APDU); ok {
+            return *casted
         }
         return APDU{}
     }
     return castFunc(structType)
 }
 
-func (m APDU) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+func (m *APDU) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Discriminator Field (apduType)
     lengthInBits += 4
 
     // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
 
     return lengthInBits
 }
 
-func (m APDU) LengthInBytes() uint16 {
+func (m *APDU) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUParse(io *utils.ReadBuffer, apduLength uint16) (spi.Message, error) {
+func APDUParse(io *utils.ReadBuffer, apduLength uint16) (*APDU, error) {
 
     // Discriminator Field (apduType) (Used as input to a switch field)
     apduType, _apduTypeErr := io.ReadUint8(4)
@@ -94,45 +92,50 @@ func APDUParse(io *utils.ReadBuffer, apduLength uint16) (spi.Message, error) {
     }
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    var initializer APDUInitializer
+    var _parent *APDU
     var typeSwitchError error
     switch {
     case apduType == 0x0:
-        initializer, typeSwitchError = APDUConfirmedRequestParse(io, apduLength)
+        _parent, typeSwitchError = APDUConfirmedRequestParse(io, apduLength)
     case apduType == 0x1:
-        initializer, typeSwitchError = APDUUnconfirmedRequestParse(io, apduLength)
+        _parent, typeSwitchError = APDUUnconfirmedRequestParse(io, apduLength)
     case apduType == 0x2:
-        initializer, typeSwitchError = APDUSimpleAckParse(io)
+        _parent, typeSwitchError = APDUSimpleAckParse(io)
     case apduType == 0x3:
-        initializer, typeSwitchError = APDUComplexAckParse(io)
+        _parent, typeSwitchError = APDUComplexAckParse(io)
     case apduType == 0x4:
-        initializer, typeSwitchError = APDUSegmentAckParse(io)
+        _parent, typeSwitchError = APDUSegmentAckParse(io)
     case apduType == 0x5:
-        initializer, typeSwitchError = APDUErrorParse(io)
+        _parent, typeSwitchError = APDUErrorParse(io)
     case apduType == 0x6:
-        initializer, typeSwitchError = APDURejectParse(io)
+        _parent, typeSwitchError = APDURejectParse(io)
     case apduType == 0x7:
-        initializer, typeSwitchError = APDUAbortParse(io)
+        _parent, typeSwitchError = APDUAbortParse(io)
     }
     if typeSwitchError != nil {
         return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
     }
 
-    // Create the instance
-    return initializer.initialize(), nil
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent)
+    return _parent, nil
+}
+
+func (m *APDU) Serialize(io utils.WriteBuffer) error {
+    return m.Child.Serialize(io)
 }
 
-func APDUSerialize(io utils.WriteBuffer, m APDU, i IAPDU, childSerialize func() error) error {
+func (m *APDU) SerializeParent(io utils.WriteBuffer, child IAPDU, serializeChildFunction func() error) error {
 
     // Discriminator Field (apduType) (Used as input to a switch field)
-    apduType := uint8(i.ApduType())
+    apduType := uint8(child.ApduType())
     _apduTypeErr := io.WriteUint8(4, (apduType))
     if _apduTypeErr != nil {
         return errors.New("Error serializing 'apduType' field " + _apduTypeErr.Error())
     }
 
     // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-    _typeSwitchErr := childSerialize()
+    _typeSwitchErr := serializeChildFunction()
     if _typeSwitchErr != nil {
         return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
     }
@@ -158,7 +161,7 @@ func (m *APDU) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     }
 }
 
-func (m APDU) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDU) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDU"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
index d884070..57f9379 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
@@ -23,7 +23,6 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
@@ -32,53 +31,60 @@ type APDUAbort struct {
     Server bool
     OriginalInvokeId uint8
     AbortReason uint8
-    APDU
+    Parent *APDU
+    IAPDUAbort
 }
 
 // The corresponding interface
 type IAPDUAbort interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUAbort) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUAbort) ApduType() uint8 {
     return 0x7
 }
 
-func (m APDUAbort) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUAbort(server bool, originalInvokeId uint8, abortReason uint8) APDUInitializer {
-    return &APDUAbort{Server: server, OriginalInvokeId: originalInvokeId, AbortReason: abortReason}
+func (m *APDUAbort) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUAbort(structType interface{}) IAPDUAbort {
-    castFunc := func(typ interface{}) IAPDUAbort {
-        if iAPDUAbort, ok := typ.(IAPDUAbort); ok {
-            return iAPDUAbort
-        }
-        return nil
+func NewAPDUAbort(server bool, originalInvokeId uint8, abortReason uint8, ) *APDU {
+    child := &APDUAbort{
+        Server: server,
+        OriginalInvokeId: originalInvokeId,
+        AbortReason: abortReason,
+        Parent: NewAPDU(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUAbort(structType interface{}) APDUAbort {
     castFunc := func(typ interface{}) APDUAbort {
-        if sAPDUAbort, ok := typ.(APDUAbort); ok {
-            return sAPDUAbort
+        if casted, ok := typ.(APDUAbort); ok {
+            return casted
         }
-        if sAPDUAbort, ok := typ.(*APDUAbort); ok {
-            return *sAPDUAbort
+        if casted, ok := typ.(*APDUAbort); ok {
+            return *casted
+        }
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUAbort(casted.Child)
+        }
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUAbort(casted.Child)
         }
         return APDUAbort{}
     }
     return castFunc(structType)
 }
 
-func (m APDUAbort) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUAbort) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Reserved Field (reserved)
     lengthInBits += 3
@@ -95,11 +101,11 @@ func (m APDUAbort) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUAbort) LengthInBytes() uint16 {
+func (m *APDUAbort) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUAbortParse(io *utils.ReadBuffer) (APDUInitializer, error) {
+func APDUAbortParse(io *utils.ReadBuffer) (*APDU, error) {
 
     // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
     {
@@ -133,11 +139,18 @@ func APDUAbortParse(io *utils.ReadBuffer) (APDUInitializer, error) {
         return nil, errors.New("Error parsing 'abortReason' field " + _abortReasonErr.Error())
     }
 
-    // Create the instance
-    return NewAPDUAbort(server, originalInvokeId, abortReason), nil
+    // Create a partially initialized instance
+    _child := &APDUAbort{
+        Server: server,
+        OriginalInvokeId: originalInvokeId,
+        AbortReason: abortReason,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUAbort) Serialize(io utils.WriteBuffer) error {
+func (m *APDUAbort) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Reserved Field (reserved)
@@ -171,7 +184,7 @@ func (m APDUAbort) Serialize(io utils.WriteBuffer) error {
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUAbort) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -210,7 +223,7 @@ func (m *APDUAbort) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     }
 }
 
-func (m APDUAbort) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUAbort) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUAbort"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
index c4bc080..c7862a5 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
@@ -23,9 +23,7 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
-    "reflect"
 )
 
 // The data-structure of this message
@@ -35,54 +33,64 @@ type APDUComplexAck struct {
     OriginalInvokeId uint8
     SequenceNumber *uint8
     ProposedWindowSize *uint8
-    ServiceAck IBACnetServiceAck
-    APDU
+    ServiceAck *BACnetServiceAck
+    Parent *APDU
+    IAPDUComplexAck
 }
 
 // The corresponding interface
 type IAPDUComplexAck interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUComplexAck) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUComplexAck) ApduType() uint8 {
     return 0x3
 }
 
-func (m APDUComplexAck) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUComplexAck(segmentedMessage bool, moreFollows bool, originalInvokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceAck IBACnetServiceAck) APDUInitializer {
-    return &APDUComplexAck{SegmentedMessage: segmentedMessage, MoreFollows: moreFollows, OriginalInvokeId: originalInvokeId, SequenceNumber: sequenceNumber, ProposedWindowSize: proposedWindowSize, ServiceAck: serviceAck}
+func (m *APDUComplexAck) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUComplexAck(structType interface{}) IAPDUComplexAck {
-    castFunc := func(typ interface{}) IAPDUComplexAck {
-        if iAPDUComplexAck, ok := typ.(IAPDUComplexAck); ok {
-            return iAPDUComplexAck
-        }
-        return nil
+func NewAPDUComplexAck(segmentedMessage bool, moreFollows bool, originalInvokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceAck *BACnetServiceAck, ) *APDU {
+    child := &APDUComplexAck{
+        SegmentedMessage: segmentedMessage,
+        MoreFollows: moreFollows,
+        OriginalInvokeId: originalInvokeId,
+        SequenceNumber: sequenceNumber,
+        ProposedWindowSize: proposedWindowSize,
+        ServiceAck: serviceAck,
+        Parent: NewAPDU(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUComplexAck(structType interface{}) APDUComplexAck {
     castFunc := func(typ interface{}) APDUComplexAck {
-        if sAPDUComplexAck, ok := typ.(APDUComplexAck); ok {
-            return sAPDUComplexAck
+        if casted, ok := typ.(APDUComplexAck); ok {
+            return casted
+        }
+        if casted, ok := typ.(*APDUComplexAck); ok {
+            return *casted
+        }
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUComplexAck(casted.Child)
         }
-        if sAPDUComplexAck, ok := typ.(*APDUComplexAck); ok {
-            return *sAPDUComplexAck
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUComplexAck(casted.Child)
         }
         return APDUComplexAck{}
     }
     return castFunc(structType)
 }
 
-func (m APDUComplexAck) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUComplexAck) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Simple field (segmentedMessage)
     lengthInBits += 1
@@ -112,11 +120,11 @@ func (m APDUComplexAck) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUComplexAck) LengthInBytes() uint16 {
+func (m *APDUComplexAck) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUComplexAckParse(io *utils.ReadBuffer) (APDUInitializer, error) {
+func APDUComplexAckParse(io *utils.ReadBuffer) (*APDU, error) {
 
     // Simple Field (segmentedMessage)
     segmentedMessage, _segmentedMessageErr := io.ReadBit()
@@ -173,21 +181,26 @@ func APDUComplexAckParse(io *utils.ReadBuffer) (APDUInitializer, error) {
     }
 
     // Simple Field (serviceAck)
-    _serviceAckMessage, _err := BACnetServiceAckParse(io)
-    if _err != nil {
-        return nil, errors.New("Error parsing simple field 'serviceAck'. " + _err.Error())
-    }
-    var serviceAck IBACnetServiceAck
-    serviceAck, _serviceAckOk := _serviceAckMessage.(IBACnetServiceAck)
-    if !_serviceAckOk {
-        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceAckMessage).Name() + " to IBACnetServiceAck")
+    serviceAck, _serviceAckErr := BACnetServiceAckParse(io)
+    if _serviceAckErr != nil {
+        return nil, errors.New("Error parsing 'serviceAck' field " + _serviceAckErr.Error())
     }
 
-    // Create the instance
-    return NewAPDUComplexAck(segmentedMessage, moreFollows, originalInvokeId, sequenceNumber, proposedWindowSize, serviceAck), nil
+    // Create a partially initialized instance
+    _child := &APDUComplexAck{
+        SegmentedMessage: segmentedMessage,
+        MoreFollows: moreFollows,
+        OriginalInvokeId: originalInvokeId,
+        SequenceNumber: sequenceNumber,
+        ProposedWindowSize: proposedWindowSize,
+        ServiceAck: serviceAck,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUComplexAck) Serialize(io utils.WriteBuffer) error {
+func (m *APDUComplexAck) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Simple Field (segmentedMessage)
@@ -240,15 +253,14 @@ func (m APDUComplexAck) Serialize(io utils.WriteBuffer) error {
     }
 
     // Simple Field (serviceAck)
-    serviceAck := CastIBACnetServiceAck(m.ServiceAck)
-    _serviceAckErr := serviceAck.Serialize(io)
+    _serviceAckErr := m.ServiceAck.Serialize(io)
     if _serviceAckErr != nil {
         return errors.New("Error serializing 'serviceAck' field " + _serviceAckErr.Error())
     }
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUComplexAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -284,98 +296,98 @@ func (m *APDUComplexAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) er
                 m.OriginalInvokeId = data
             case "sequenceNumber":
                 var data *uint8
-                if err := d.DecodeElement(&data, &tok); err != nil {
+                if err := d.DecodeElement(data, &tok); err != nil {
                     return err
                 }
                 m.SequenceNumber = data
             case "proposedWindowSize":
                 var data *uint8
-                if err := d.DecodeElement(&data, &tok); err != nil {
+                if err := d.DecodeElement(data, &tok); err != nil {
                     return err
                 }
                 m.ProposedWindowSize = data
             case "serviceAck":
                 switch tok.Attr[0].Value {
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckGetAlarmSummary":
-                        var dt *BACnetServiceAckGetAlarmSummary
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckGetEnrollmentSummary":
-                        var dt *BACnetServiceAckGetEnrollmentSummary
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckGetEventInformation":
-                        var dt *BACnetServiceAckGetEventInformation
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckAtomicReadFile":
-                        var dt *BACnetServiceAckAtomicReadFile
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckAtomicWriteFile":
-                        var dt *BACnetServiceAckAtomicWriteFile
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckCreateObject":
-                        var dt *BACnetServiceAckCreateObject
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckReadProperty":
-                        var dt *BACnetServiceAckReadProperty
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckReadPropertyMultiple":
-                        var dt *BACnetServiceAckReadPropertyMultiple
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckReadRange":
-                        var dt *BACnetServiceAckReadRange
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckConfirmedPrivateTransfer":
-                        var dt *BACnetServiceAckConfirmedPrivateTransfer
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckVTOpen":
-                        var dt *BACnetServiceAckVTOpen
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckVTData":
-                        var dt *BACnetServiceAckVTData
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckRemovedAuthenticate":
-                        var dt *BACnetServiceAckRemovedAuthenticate
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceAck = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetServiceAckRemovedReadPropertyConditional":
-                        var dt *BACnetServiceAckRemovedReadPropertyConditional
+                        var dt *BACnetServiceAck
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
@@ -386,7 +398,7 @@ func (m *APDUComplexAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) er
     }
 }
 
-func (m APDUComplexAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUComplexAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUComplexAck"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
index 33c4055..a0cc48b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -23,9 +23,7 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
-    "reflect"
 )
 
 // The data-structure of this message
@@ -38,54 +36,67 @@ type APDUConfirmedRequest struct {
     InvokeId uint8
     SequenceNumber *uint8
     ProposedWindowSize *uint8
-    ServiceRequest IBACnetConfirmedServiceRequest
-    APDU
+    ServiceRequest *BACnetConfirmedServiceRequest
+    Parent *APDU
+    IAPDUConfirmedRequest
 }
 
 // The corresponding interface
 type IAPDUConfirmedRequest interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUConfirmedRequest) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUConfirmedRequest) ApduType() uint8 {
     return 0x0
 }
 
-func (m APDUConfirmedRequest) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedResponseAccepted bool, maxSegmentsAccepted uint8, maxApduLengthAccepted uint8, invokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceRequest IBACnetConfirmedServiceRequest) APDUInitializer {
-    return &APDUConfirmedRequest{SegmentedMessage: segmentedMessage, MoreFollows: moreFollows, SegmentedResponseAccepted: segmentedResponseAccepted, MaxSegmentsAccepted: maxSegmentsAccepted, MaxApduLengthAccepted: maxApduLengthAccepted, InvokeId: invokeId, SequenceNumber: sequenceNumber, ProposedWindowSize: proposedWindowSize, ServiceRequest: serviceRequest}
+func (m *APDUConfirmedRequest) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUConfirmedRequest(structType interface{}) IAPDUConfirmedRequest {
-    castFunc := func(typ interface{}) IAPDUConfirmedRequest {
-        if iAPDUConfirmedRequest, ok := typ.(IAPDUConfirmedRequest); ok {
-            return iAPDUConfirmedRequest
-        }
-        return nil
-    }
-    return castFunc(structType)
+func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedResponseAccepted bool, maxSegmentsAccepted uint8, maxApduLengthAccepted uint8, invokeId uint8, sequenceNumber *uint8, proposedWindowSize *uint8, serviceRequest *BACnetConfirmedServiceRequest, ) *APDU {
+    child := &APDUConfirmedRequest{
+        SegmentedMessage: segmentedMessage,
+        MoreFollows: moreFollows,
+        SegmentedResponseAccepted: segmentedResponseAccepted,
+        MaxSegmentsAccepted: maxSegmentsAccepted,
+        MaxApduLengthAccepted: maxApduLengthAccepted,
+        InvokeId: invokeId,
+        SequenceNumber: sequenceNumber,
+        ProposedWindowSize: proposedWindowSize,
+        ServiceRequest: serviceRequest,
+        Parent: NewAPDU(),
+    }
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUConfirmedRequest(structType interface{}) APDUConfirmedRequest {
     castFunc := func(typ interface{}) APDUConfirmedRequest {
-        if sAPDUConfirmedRequest, ok := typ.(APDUConfirmedRequest); ok {
-            return sAPDUConfirmedRequest
+        if casted, ok := typ.(APDUConfirmedRequest); ok {
+            return casted
+        }
+        if casted, ok := typ.(*APDUConfirmedRequest); ok {
+            return *casted
+        }
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUConfirmedRequest(casted.Child)
         }
-        if sAPDUConfirmedRequest, ok := typ.(*APDUConfirmedRequest); ok {
-            return *sAPDUConfirmedRequest
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUConfirmedRequest(casted.Child)
         }
         return APDUConfirmedRequest{}
     }
     return castFunc(structType)
 }
 
-func (m APDUConfirmedRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUConfirmedRequest) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Simple field (segmentedMessage)
     lengthInBits += 1
@@ -124,11 +135,11 @@ func (m APDUConfirmedRequest) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUConfirmedRequest) LengthInBytes() uint16 {
+func (m *APDUConfirmedRequest) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUConfirmedRequestParse(io *utils.ReadBuffer, apduLength uint16) (APDUInitializer, error) {
+func APDUConfirmedRequestParse(io *utils.ReadBuffer, apduLength uint16) (*APDU, error) {
 
     // Simple Field (segmentedMessage)
     segmentedMessage, _segmentedMessageErr := io.ReadBit()
@@ -203,21 +214,29 @@ func APDUConfirmedRequestParse(io *utils.ReadBuffer, apduLength uint16) (APDUIni
     }
 
     // Simple Field (serviceRequest)
-    _serviceRequestMessage, _err := BACnetConfirmedServiceRequestParse(io, uint16(apduLength) - uint16(uint16(uint16(uint16(3)) + uint16(uint16(utils.InlineIf(segmentedMessage, uint16(uint16(2)), uint16(uint16(0))))))))
-    if _err != nil {
-        return nil, errors.New("Error parsing simple field 'serviceRequest'. " + _err.Error())
-    }
-    var serviceRequest IBACnetConfirmedServiceRequest
-    serviceRequest, _serviceRequestOk := _serviceRequestMessage.(IBACnetConfirmedServiceRequest)
-    if !_serviceRequestOk {
-        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceRequestMessage).Name() + " to IBACnetConfirmedServiceRequest")
-    }
-
-    // Create the instance
-    return NewAPDUConfirmedRequest(segmentedMessage, moreFollows, segmentedResponseAccepted, maxSegmentsAccepted, maxApduLengthAccepted, invokeId, sequenceNumber, proposedWindowSize, serviceRequest), nil
+    serviceRequest, _serviceRequestErr := BACnetConfirmedServiceRequestParse(io, uint16(apduLength) - uint16(uint16(uint16(uint16(3)) + uint16(uint16(utils.InlineIf(segmentedMessage, uint16(uint16(2)), uint16(uint16(0))))))))
+    if _serviceRequestErr != nil {
+        return nil, errors.New("Error parsing 'serviceRequest' field " + _serviceRequestErr.Error())
+    }
+
+    // Create a partially initialized instance
+    _child := &APDUConfirmedRequest{
+        SegmentedMessage: segmentedMessage,
+        MoreFollows: moreFollows,
+        SegmentedResponseAccepted: segmentedResponseAccepted,
+        MaxSegmentsAccepted: maxSegmentsAccepted,
+        MaxApduLengthAccepted: maxApduLengthAccepted,
+        InvokeId: invokeId,
+        SequenceNumber: sequenceNumber,
+        ProposedWindowSize: proposedWindowSize,
+        ServiceRequest: serviceRequest,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUConfirmedRequest) Serialize(io utils.WriteBuffer) error {
+func (m *APDUConfirmedRequest) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Simple Field (segmentedMessage)
@@ -291,15 +310,14 @@ func (m APDUConfirmedRequest) Serialize(io utils.WriteBuffer) error {
     }
 
     // Simple Field (serviceRequest)
-    serviceRequest := CastIBACnetConfirmedServiceRequest(m.ServiceRequest)
-    _serviceRequestErr := serviceRequest.Serialize(io)
+    _serviceRequestErr := m.ServiceRequest.Serialize(io)
     if _serviceRequestErr != nil {
         return errors.New("Error serializing 'serviceRequest' field " + _serviceRequestErr.Error())
     }
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUConfirmedRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -353,200 +371,200 @@ func (m *APDUConfirmedRequest) UnmarshalXML(d *xml.Decoder, start xml.StartEleme
                 m.InvokeId = data
             case "sequenceNumber":
                 var data *uint8
-                if err := d.DecodeElement(&data, &tok); err != nil {
+                if err := d.DecodeElement(data, &tok); err != nil {
                     return err
                 }
                 m.SequenceNumber = data
             case "proposedWindowSize":
                 var data *uint8
-                if err := d.DecodeElement(&data, &tok); err != nil {
+                if err := d.DecodeElement(data, &tok); err != nil {
                     return err
                 }
                 m.ProposedWindowSize = data
             case "serviceRequest":
                 switch tok.Attr[0].Value {
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAcknowledgeAlarm":
-                        var dt *BACnetConfirmedServiceRequestAcknowledgeAlarm
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedCOVNotification":
-                        var dt *BACnetConfirmedServiceRequestConfirmedCOVNotification
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedEventNotification":
-                        var dt *BACnetConfirmedServiceRequestConfirmedEventNotification
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestGetEnrollmentSummary":
-                        var dt *BACnetConfirmedServiceRequestGetEnrollmentSummary
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestSubscribeCOV":
-                        var dt *BACnetConfirmedServiceRequestSubscribeCOV
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAtomicReadFile":
-                        var dt *BACnetConfirmedServiceRequestAtomicReadFile
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAtomicWriteFile":
-                        var dt *BACnetConfirmedServiceRequestAtomicWriteFile
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAddListElement":
-                        var dt *BACnetConfirmedServiceRequestAddListElement
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemoveListElement":
-                        var dt *BACnetConfirmedServiceRequestRemoveListElement
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestCreateObject":
-                        var dt *BACnetConfirmedServiceRequestCreateObject
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestDeleteObject":
-                        var dt *BACnetConfirmedServiceRequestDeleteObject
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReadProperty":
-                        var dt *BACnetConfirmedServiceRequestReadProperty
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReadPropertyMultiple":
-                        var dt *BACnetConfirmedServiceRequestReadPropertyMultiple
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestWriteProperty":
-                        var dt *BACnetConfirmedServiceRequestWriteProperty
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestWritePropertyMultiple":
-                        var dt *BACnetConfirmedServiceRequestWritePropertyMultiple
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestDeviceCommunicationControl":
-                        var dt *BACnetConfirmedServiceRequestDeviceCommunicationControl
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedPrivateTransfer":
-                        var dt *BACnetConfirmedServiceRequestConfirmedPrivateTransfer
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedTextMessage":
-                        var dt *BACnetConfirmedServiceRequestConfirmedTextMessage
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReinitializeDevice":
-                        var dt *BACnetConfirmedServiceRequestReinitializeDevice
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestVTOpen":
-                        var dt *BACnetConfirmedServiceRequestVTOpen
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestVTClose":
-                        var dt *BACnetConfirmedServiceRequestVTClose
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestVTData":
-                        var dt *BACnetConfirmedServiceRequestVTData
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemovedAuthenticate":
-                        var dt *BACnetConfirmedServiceRequestRemovedAuthenticate
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemovedRequestKey":
-                        var dt *BACnetConfirmedServiceRequestRemovedRequestKey
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemovedReadPropertyConditional":
-                        var dt *BACnetConfirmedServiceRequestRemovedReadPropertyConditional
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReadRange":
-                        var dt *BACnetConfirmedServiceRequestReadRange
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestLifeSafetyOperation":
-                        var dt *BACnetConfirmedServiceRequestLifeSafetyOperation
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestSubscribeCOVProperty":
-                        var dt *BACnetConfirmedServiceRequestSubscribeCOVProperty
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestGetEventInformation":
-                        var dt *BACnetConfirmedServiceRequestGetEventInformation
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple":
-                        var dt *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple":
-                        var dt *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple
+                        var dt *BACnetConfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
@@ -557,7 +575,7 @@ func (m *APDUConfirmedRequest) UnmarshalXML(d *xml.Decoder, start xml.StartEleme
     }
 }
 
-func (m APDUConfirmedRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUConfirmedRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUConfirmedRequest"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
index 0d44b83..54e6210 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
@@ -23,62 +23,66 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
-    "reflect"
 )
 
 // The data-structure of this message
 type APDUError struct {
     OriginalInvokeId uint8
-    Error IBACnetError
-    APDU
+    Error *BACnetError
+    Parent *APDU
+    IAPDUError
 }
 
 // The corresponding interface
 type IAPDUError interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUError) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUError) ApduType() uint8 {
     return 0x5
 }
 
-func (m APDUError) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUError(originalInvokeId uint8, error IBACnetError) APDUInitializer {
-    return &APDUError{OriginalInvokeId: originalInvokeId, Error: error}
+func (m *APDUError) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUError(structType interface{}) IAPDUError {
-    castFunc := func(typ interface{}) IAPDUError {
-        if iAPDUError, ok := typ.(IAPDUError); ok {
-            return iAPDUError
-        }
-        return nil
+func NewAPDUError(originalInvokeId uint8, error *BACnetError, ) *APDU {
+    child := &APDUError{
+        OriginalInvokeId: originalInvokeId,
+        Error: error,
+        Parent: NewAPDU(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUError(structType interface{}) APDUError {
     castFunc := func(typ interface{}) APDUError {
-        if sAPDUError, ok := typ.(APDUError); ok {
-            return sAPDUError
+        if casted, ok := typ.(APDUError); ok {
+            return casted
+        }
+        if casted, ok := typ.(*APDUError); ok {
+            return *casted
         }
-        if sAPDUError, ok := typ.(*APDUError); ok {
-            return *sAPDUError
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUError(casted.Child)
+        }
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUError(casted.Child)
         }
         return APDUError{}
     }
     return castFunc(structType)
 }
 
-func (m APDUError) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUError) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Reserved Field (reserved)
     lengthInBits += 4
@@ -92,11 +96,11 @@ func (m APDUError) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUError) LengthInBytes() uint16 {
+func (m *APDUError) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUErrorParse(io *utils.ReadBuffer) (APDUInitializer, error) {
+func APDUErrorParse(io *utils.ReadBuffer) (*APDU, error) {
 
     // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
     {
@@ -119,21 +123,22 @@ func APDUErrorParse(io *utils.ReadBuffer) (APDUInitializer, error) {
     }
 
     // Simple Field (error)
-    _errorMessage, _err := BACnetErrorParse(io)
-    if _err != nil {
-        return nil, errors.New("Error parsing simple field 'error'. " + _err.Error())
-    }
-    var error IBACnetError
-    error, _errorOk := _errorMessage.(IBACnetError)
-    if !_errorOk {
-        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_errorMessage).Name() + " to IBACnetError")
+    error, _errorErr := BACnetErrorParse(io)
+    if _errorErr != nil {
+        return nil, errors.New("Error parsing 'error' field " + _errorErr.Error())
     }
 
-    // Create the instance
-    return NewAPDUError(originalInvokeId, error), nil
+    // Create a partially initialized instance
+    _child := &APDUError{
+        OriginalInvokeId: originalInvokeId,
+        Error: error,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUError) Serialize(io utils.WriteBuffer) error {
+func (m *APDUError) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Reserved Field (reserved)
@@ -152,15 +157,14 @@ func (m APDUError) Serialize(io utils.WriteBuffer) error {
     }
 
     // Simple Field (error)
-    error := CastIBACnetError(m.Error)
-    _errorErr := error.Serialize(io)
+    _errorErr := m.Error.Serialize(io)
     if _errorErr != nil {
         return errors.New("Error serializing 'error' field " + _errorErr.Error())
     }
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -185,85 +189,85 @@ func (m *APDUError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
             case "error":
                 switch tok.Attr[0].Value {
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorGetAlarmSummary":
-                        var dt *BACnetErrorGetAlarmSummary
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorGetEnrollmentSummary":
-                        var dt *BACnetErrorGetEnrollmentSummary
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorGetEventInformation":
-                        var dt *BACnetErrorGetEventInformation
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorAtomicReadFile":
-                        var dt *BACnetErrorAtomicReadFile
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorAtomicWriteFile":
-                        var dt *BACnetErrorAtomicWriteFile
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorCreateObject":
-                        var dt *BACnetErrorCreateObject
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorReadProperty":
-                        var dt *BACnetErrorReadProperty
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorReadPropertyMultiple":
-                        var dt *BACnetErrorReadPropertyMultiple
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorReadRange":
-                        var dt *BACnetErrorReadRange
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorConfirmedPrivateTransfer":
-                        var dt *BACnetErrorConfirmedPrivateTransfer
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorVTOpen":
-                        var dt *BACnetErrorVTOpen
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorVTData":
-                        var dt *BACnetErrorVTData
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorRemovedAuthenticate":
-                        var dt *BACnetErrorRemovedAuthenticate
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Error = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetErrorRemovedReadPropertyConditional":
-                        var dt *BACnetErrorRemovedReadPropertyConditional
+                        var dt *BACnetError
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
@@ -274,7 +278,7 @@ func (m *APDUError) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
     }
 }
 
-func (m APDUError) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUError) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUError"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
index f2f099c..f211553 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
@@ -23,7 +23,6 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
@@ -31,53 +30,59 @@ import (
 type APDUReject struct {
     OriginalInvokeId uint8
     RejectReason uint8
-    APDU
+    Parent *APDU
+    IAPDUReject
 }
 
 // The corresponding interface
 type IAPDUReject interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUReject) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUReject) ApduType() uint8 {
     return 0x6
 }
 
-func (m APDUReject) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUReject(originalInvokeId uint8, rejectReason uint8) APDUInitializer {
-    return &APDUReject{OriginalInvokeId: originalInvokeId, RejectReason: rejectReason}
+func (m *APDUReject) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUReject(structType interface{}) IAPDUReject {
-    castFunc := func(typ interface{}) IAPDUReject {
-        if iAPDUReject, ok := typ.(IAPDUReject); ok {
-            return iAPDUReject
-        }
-        return nil
+func NewAPDUReject(originalInvokeId uint8, rejectReason uint8, ) *APDU {
+    child := &APDUReject{
+        OriginalInvokeId: originalInvokeId,
+        RejectReason: rejectReason,
+        Parent: NewAPDU(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUReject(structType interface{}) APDUReject {
     castFunc := func(typ interface{}) APDUReject {
-        if sAPDUReject, ok := typ.(APDUReject); ok {
-            return sAPDUReject
+        if casted, ok := typ.(APDUReject); ok {
+            return casted
         }
-        if sAPDUReject, ok := typ.(*APDUReject); ok {
-            return *sAPDUReject
+        if casted, ok := typ.(*APDUReject); ok {
+            return *casted
+        }
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUReject(casted.Child)
+        }
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUReject(casted.Child)
         }
         return APDUReject{}
     }
     return castFunc(structType)
 }
 
-func (m APDUReject) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUReject) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Reserved Field (reserved)
     lengthInBits += 4
@@ -91,11 +96,11 @@ func (m APDUReject) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUReject) LengthInBytes() uint16 {
+func (m *APDUReject) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDURejectParse(io *utils.ReadBuffer) (APDUInitializer, error) {
+func APDURejectParse(io *utils.ReadBuffer) (*APDU, error) {
 
     // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
     {
@@ -123,11 +128,17 @@ func APDURejectParse(io *utils.ReadBuffer) (APDUInitializer, error) {
         return nil, errors.New("Error parsing 'rejectReason' field " + _rejectReasonErr.Error())
     }
 
-    // Create the instance
-    return NewAPDUReject(originalInvokeId, rejectReason), nil
+    // Create a partially initialized instance
+    _child := &APDUReject{
+        OriginalInvokeId: originalInvokeId,
+        RejectReason: rejectReason,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUReject) Serialize(io utils.WriteBuffer) error {
+func (m *APDUReject) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Reserved Field (reserved)
@@ -154,7 +165,7 @@ func (m APDUReject) Serialize(io utils.WriteBuffer) error {
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUReject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -187,7 +198,7 @@ func (m *APDUReject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error
     }
 }
 
-func (m APDUReject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUReject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUReject"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
index 7fd0c91..9ffe272 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
@@ -23,7 +23,6 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
@@ -34,53 +33,62 @@ type APDUSegmentAck struct {
     OriginalInvokeId uint8
     SequenceNumber uint8
     ProposedWindowSize uint8
-    APDU
+    Parent *APDU
+    IAPDUSegmentAck
 }
 
 // The corresponding interface
 type IAPDUSegmentAck interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUSegmentAck) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUSegmentAck) ApduType() uint8 {
     return 0x4
 }
 
-func (m APDUSegmentAck) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUSegmentAck(negativeAck bool, server bool, originalInvokeId uint8, sequenceNumber uint8, proposedWindowSize uint8) APDUInitializer {
-    return &APDUSegmentAck{NegativeAck: negativeAck, Server: server, OriginalInvokeId: originalInvokeId, SequenceNumber: sequenceNumber, ProposedWindowSize: proposedWindowSize}
+func (m *APDUSegmentAck) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUSegmentAck(structType interface{}) IAPDUSegmentAck {
-    castFunc := func(typ interface{}) IAPDUSegmentAck {
-        if iAPDUSegmentAck, ok := typ.(IAPDUSegmentAck); ok {
-            return iAPDUSegmentAck
-        }
-        return nil
+func NewAPDUSegmentAck(negativeAck bool, server bool, originalInvokeId uint8, sequenceNumber uint8, proposedWindowSize uint8, ) *APDU {
+    child := &APDUSegmentAck{
+        NegativeAck: negativeAck,
+        Server: server,
+        OriginalInvokeId: originalInvokeId,
+        SequenceNumber: sequenceNumber,
+        ProposedWindowSize: proposedWindowSize,
+        Parent: NewAPDU(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUSegmentAck(structType interface{}) APDUSegmentAck {
     castFunc := func(typ interface{}) APDUSegmentAck {
-        if sAPDUSegmentAck, ok := typ.(APDUSegmentAck); ok {
-            return sAPDUSegmentAck
+        if casted, ok := typ.(APDUSegmentAck); ok {
+            return casted
         }
-        if sAPDUSegmentAck, ok := typ.(*APDUSegmentAck); ok {
-            return *sAPDUSegmentAck
+        if casted, ok := typ.(*APDUSegmentAck); ok {
+            return *casted
+        }
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUSegmentAck(casted.Child)
+        }
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUSegmentAck(casted.Child)
         }
         return APDUSegmentAck{}
     }
     return castFunc(structType)
 }
 
-func (m APDUSegmentAck) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUSegmentAck) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Reserved Field (reserved)
     lengthInBits += 2
@@ -103,11 +111,11 @@ func (m APDUSegmentAck) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUSegmentAck) LengthInBytes() uint16 {
+func (m *APDUSegmentAck) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUSegmentAckParse(io *utils.ReadBuffer) (APDUInitializer, error) {
+func APDUSegmentAckParse(io *utils.ReadBuffer) (*APDU, error) {
 
     // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
     {
@@ -153,11 +161,20 @@ func APDUSegmentAckParse(io *utils.ReadBuffer) (APDUInitializer, error) {
         return nil, errors.New("Error parsing 'proposedWindowSize' field " + _proposedWindowSizeErr.Error())
     }
 
-    // Create the instance
-    return NewAPDUSegmentAck(negativeAck, server, originalInvokeId, sequenceNumber, proposedWindowSize), nil
+    // Create a partially initialized instance
+    _child := &APDUSegmentAck{
+        NegativeAck: negativeAck,
+        Server: server,
+        OriginalInvokeId: originalInvokeId,
+        SequenceNumber: sequenceNumber,
+        ProposedWindowSize: proposedWindowSize,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUSegmentAck) Serialize(io utils.WriteBuffer) error {
+func (m *APDUSegmentAck) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Reserved Field (reserved)
@@ -205,7 +222,7 @@ func (m APDUSegmentAck) Serialize(io utils.WriteBuffer) error {
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUSegmentAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -256,7 +273,7 @@ func (m *APDUSegmentAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) er
     }
 }
 
-func (m APDUSegmentAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUSegmentAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUSegmentAck"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
index f6b4d2f..450c589 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
@@ -23,7 +23,6 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
@@ -31,53 +30,59 @@ import (
 type APDUSimpleAck struct {
     OriginalInvokeId uint8
     ServiceChoice uint8
-    APDU
+    Parent *APDU
+    IAPDUSimpleAck
 }
 
 // The corresponding interface
 type IAPDUSimpleAck interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUSimpleAck) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUSimpleAck) ApduType() uint8 {
     return 0x2
 }
 
-func (m APDUSimpleAck) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUSimpleAck(originalInvokeId uint8, serviceChoice uint8) APDUInitializer {
-    return &APDUSimpleAck{OriginalInvokeId: originalInvokeId, ServiceChoice: serviceChoice}
+func (m *APDUSimpleAck) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUSimpleAck(structType interface{}) IAPDUSimpleAck {
-    castFunc := func(typ interface{}) IAPDUSimpleAck {
-        if iAPDUSimpleAck, ok := typ.(IAPDUSimpleAck); ok {
-            return iAPDUSimpleAck
-        }
-        return nil
+func NewAPDUSimpleAck(originalInvokeId uint8, serviceChoice uint8, ) *APDU {
+    child := &APDUSimpleAck{
+        OriginalInvokeId: originalInvokeId,
+        ServiceChoice: serviceChoice,
+        Parent: NewAPDU(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUSimpleAck(structType interface{}) APDUSimpleAck {
     castFunc := func(typ interface{}) APDUSimpleAck {
-        if sAPDUSimpleAck, ok := typ.(APDUSimpleAck); ok {
-            return sAPDUSimpleAck
+        if casted, ok := typ.(APDUSimpleAck); ok {
+            return casted
         }
-        if sAPDUSimpleAck, ok := typ.(*APDUSimpleAck); ok {
-            return *sAPDUSimpleAck
+        if casted, ok := typ.(*APDUSimpleAck); ok {
+            return *casted
+        }
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUSimpleAck(casted.Child)
+        }
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUSimpleAck(casted.Child)
         }
         return APDUSimpleAck{}
     }
     return castFunc(structType)
 }
 
-func (m APDUSimpleAck) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUSimpleAck) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Reserved Field (reserved)
     lengthInBits += 4
@@ -91,11 +96,11 @@ func (m APDUSimpleAck) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUSimpleAck) LengthInBytes() uint16 {
+func (m *APDUSimpleAck) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUSimpleAckParse(io *utils.ReadBuffer) (APDUInitializer, error) {
+func APDUSimpleAckParse(io *utils.ReadBuffer) (*APDU, error) {
 
     // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
     {
@@ -123,11 +128,17 @@ func APDUSimpleAckParse(io *utils.ReadBuffer) (APDUInitializer, error) {
         return nil, errors.New("Error parsing 'serviceChoice' field " + _serviceChoiceErr.Error())
     }
 
-    // Create the instance
-    return NewAPDUSimpleAck(originalInvokeId, serviceChoice), nil
+    // Create a partially initialized instance
+    _child := &APDUSimpleAck{
+        OriginalInvokeId: originalInvokeId,
+        ServiceChoice: serviceChoice,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUSimpleAck) Serialize(io utils.WriteBuffer) error {
+func (m *APDUSimpleAck) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Reserved Field (reserved)
@@ -154,7 +165,7 @@ func (m APDUSimpleAck) Serialize(io utils.WriteBuffer) error {
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUSimpleAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -187,7 +198,7 @@ func (m *APDUSimpleAck) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m APDUSimpleAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUSimpleAck) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUSimpleAck"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
index fa0afdf..602f652 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
@@ -23,61 +23,64 @@ import (
     "errors"
     "io"
     log "github.com/sirupsen/logrus"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
-    "reflect"
 )
 
 // The data-structure of this message
 type APDUUnconfirmedRequest struct {
-    ServiceRequest IBACnetUnconfirmedServiceRequest
-    APDU
+    ServiceRequest *BACnetUnconfirmedServiceRequest
+    Parent *APDU
+    IAPDUUnconfirmedRequest
 }
 
 // The corresponding interface
 type IAPDUUnconfirmedRequest interface {
-    IAPDU
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m APDUUnconfirmedRequest) ApduType() uint8 {
+///////////////////////////////////////////////////////////
+func (m *APDUUnconfirmedRequest) ApduType() uint8 {
     return 0x1
 }
 
-func (m APDUUnconfirmedRequest) initialize() spi.Message {
-    return m
-}
 
-func NewAPDUUnconfirmedRequest(serviceRequest IBACnetUnconfirmedServiceRequest) APDUInitializer {
-    return &APDUUnconfirmedRequest{ServiceRequest: serviceRequest}
+func (m *APDUUnconfirmedRequest) InitializeParent(parent *APDU) {
 }
 
-func CastIAPDUUnconfirmedRequest(structType interface{}) IAPDUUnconfirmedRequest {
-    castFunc := func(typ interface{}) IAPDUUnconfirmedRequest {
-        if iAPDUUnconfirmedRequest, ok := typ.(IAPDUUnconfirmedRequest); ok {
-            return iAPDUUnconfirmedRequest
-        }
-        return nil
+func NewAPDUUnconfirmedRequest(serviceRequest *BACnetUnconfirmedServiceRequest, ) *APDU {
+    child := &APDUUnconfirmedRequest{
+        ServiceRequest: serviceRequest,
+        Parent: NewAPDU(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastAPDUUnconfirmedRequest(structType interface{}) APDUUnconfirmedRequest {
     castFunc := func(typ interface{}) APDUUnconfirmedRequest {
-        if sAPDUUnconfirmedRequest, ok := typ.(APDUUnconfirmedRequest); ok {
-            return sAPDUUnconfirmedRequest
+        if casted, ok := typ.(APDUUnconfirmedRequest); ok {
+            return casted
+        }
+        if casted, ok := typ.(*APDUUnconfirmedRequest); ok {
+            return *casted
         }
-        if sAPDUUnconfirmedRequest, ok := typ.(*APDUUnconfirmedRequest); ok {
-            return *sAPDUUnconfirmedRequest
+        if casted, ok := typ.(APDU); ok {
+            return CastAPDUUnconfirmedRequest(casted.Child)
+        }
+        if casted, ok := typ.(*APDU); ok {
+            return CastAPDUUnconfirmedRequest(casted.Child)
         }
         return APDUUnconfirmedRequest{}
     }
     return castFunc(structType)
 }
 
-func (m APDUUnconfirmedRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.APDU.LengthInBits()
+func (m *APDUUnconfirmedRequest) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Reserved Field (reserved)
     lengthInBits += 4
@@ -88,11 +91,11 @@ func (m APDUUnconfirmedRequest) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m APDUUnconfirmedRequest) LengthInBytes() uint16 {
+func (m *APDUUnconfirmedRequest) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func APDUUnconfirmedRequestParse(io *utils.ReadBuffer, apduLength uint16) (APDUInitializer, error) {
+func APDUUnconfirmedRequestParse(io *utils.ReadBuffer, apduLength uint16) (*APDU, error) {
 
     // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
     {
@@ -109,21 +112,21 @@ func APDUUnconfirmedRequestParse(io *utils.ReadBuffer, apduLength uint16) (APDUI
     }
 
     // Simple Field (serviceRequest)
-    _serviceRequestMessage, _err := BACnetUnconfirmedServiceRequestParse(io, uint16(apduLength) - uint16(uint16(1)))
-    if _err != nil {
-        return nil, errors.New("Error parsing simple field 'serviceRequest'. " + _err.Error())
-    }
-    var serviceRequest IBACnetUnconfirmedServiceRequest
-    serviceRequest, _serviceRequestOk := _serviceRequestMessage.(IBACnetUnconfirmedServiceRequest)
-    if !_serviceRequestOk {
-        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_serviceRequestMessage).Name() + " to IBACnetUnconfirmedServiceRequest")
+    serviceRequest, _serviceRequestErr := BACnetUnconfirmedServiceRequestParse(io, uint16(apduLength) - uint16(uint16(1)))
+    if _serviceRequestErr != nil {
+        return nil, errors.New("Error parsing 'serviceRequest' field " + _serviceRequestErr.Error())
     }
 
-    // Create the instance
-    return NewAPDUUnconfirmedRequest(serviceRequest), nil
+    // Create a partially initialized instance
+    _child := &APDUUnconfirmedRequest{
+        ServiceRequest: serviceRequest,
+        Parent: &APDU{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m APDUUnconfirmedRequest) Serialize(io utils.WriteBuffer) error {
+func (m *APDUUnconfirmedRequest) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Reserved Field (reserved)
@@ -135,15 +138,14 @@ func (m APDUUnconfirmedRequest) Serialize(io utils.WriteBuffer) error {
     }
 
     // Simple Field (serviceRequest)
-    serviceRequest := CastIBACnetUnconfirmedServiceRequest(m.ServiceRequest)
-    _serviceRequestErr := serviceRequest.Serialize(io)
+    _serviceRequestErr := m.ServiceRequest.Serialize(io)
     if _serviceRequestErr != nil {
         return errors.New("Error serializing 'serviceRequest' field " + _serviceRequestErr.Error())
     }
 
         return nil
     }
-    return APDUSerialize(io, m.APDU, CastIAPDU(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *APDUUnconfirmedRequest) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -162,73 +164,73 @@ func (m *APDUUnconfirmedRequest) UnmarshalXML(d *xml.Decoder, start xml.StartEle
             case "serviceRequest":
                 switch tok.Attr[0].Value {
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestIAm":
-                        var dt *BACnetUnconfirmedServiceRequestIAm
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestIHave":
-                        var dt *BACnetUnconfirmedServiceRequestIHave
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification":
-                        var dt *BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestUnconfirmedEventNotification":
-                        var dt *BACnetUnconfirmedServiceRequestUnconfirmedEventNotification
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer":
-                        var dt *BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestUnconfirmedTextMessage":
-                        var dt *BACnetUnconfirmedServiceRequestUnconfirmedTextMessage
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestTimeSynchronization":
-                        var dt *BACnetUnconfirmedServiceRequestTimeSynchronization
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestWhoHas":
-                        var dt *BACnetUnconfirmedServiceRequestWhoHas
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestWhoIs":
-                        var dt *BACnetUnconfirmedServiceRequestWhoIs
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestUTCTimeSynchronization":
-                        var dt *BACnetUnconfirmedServiceRequestUTCTimeSynchronization
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestWriteGroup":
-                        var dt *BACnetUnconfirmedServiceRequestWriteGroup
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.ServiceRequest = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple":
-                        var dt *BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple
+                        var dt *BACnetUnconfirmedServiceRequest
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
@@ -239,7 +241,7 @@ func (m *APDUUnconfirmedRequest) UnmarshalXML(d *xml.Decoder, start xml.StartEle
     }
 }
 
-func (m APDUUnconfirmedRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *APDUUnconfirmedRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.APDUUnconfirmedRequest"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
index 077d1a0..89adbe5 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
@@ -19,14 +19,12 @@
 package model
 
 import (
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 type ApplicationTag int8
 
 type IApplicationTag interface {
-    spi.Message
     Serialize(io utils.WriteBuffer) error
 }
 
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
index 8efa2b7..0ad0d38 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
@@ -22,7 +22,6 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
@@ -30,45 +29,35 @@ import (
 type BACnetAddress struct {
     Address []uint8
     Port uint16
-
+    IBACnetAddress
 }
 
 // The corresponding interface
 type IBACnetAddress interface {
-    spi.Message
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
-
-func NewBACnetAddress(address []uint8, port uint16) spi.Message {
+func NewBACnetAddress(address []uint8, port uint16) *BACnetAddress {
     return &BACnetAddress{Address: address, Port: port}
 }
 
-func CastIBACnetAddress(structType interface{}) IBACnetAddress {
-    castFunc := func(typ interface{}) IBACnetAddress {
-        if iBACnetAddress, ok := typ.(IBACnetAddress); ok {
-            return iBACnetAddress
-        }
-        return nil
-    }
-    return castFunc(structType)
-}
-
 func CastBACnetAddress(structType interface{}) BACnetAddress {
     castFunc := func(typ interface{}) BACnetAddress {
-        if sBACnetAddress, ok := typ.(BACnetAddress); ok {
-            return sBACnetAddress
+        if casted, ok := typ.(BACnetAddress); ok {
+            return casted
         }
-        if sBACnetAddress, ok := typ.(*BACnetAddress); ok {
-            return *sBACnetAddress
+        if casted, ok := typ.(*BACnetAddress); ok {
+            return *casted
         }
         return BACnetAddress{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetAddress) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+func (m *BACnetAddress) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Array field
     if len(m.Address) > 0 {
@@ -81,17 +70,16 @@ func (m BACnetAddress) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m BACnetAddress) LengthInBytes() uint16 {
+func (m *BACnetAddress) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetAddressParse(io *utils.ReadBuffer) (spi.Message, error) {
+func BACnetAddressParse(io *utils.ReadBuffer) (*BACnetAddress, error) {
 
     // Array field (address)
     // Count array
     address := make([]uint8, uint16(4))
     for curItem := uint16(0); curItem < uint16(uint16(4)); curItem++ {
-
         _item, _err := io.ReadUint8(8)
         if _err != nil {
             return nil, errors.New("Error parsing 'address' field " + _err.Error())
@@ -109,7 +97,7 @@ func BACnetAddressParse(io *utils.ReadBuffer) (spi.Message, error) {
     return NewBACnetAddress(address, port), nil
 }
 
-func (m BACnetAddress) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetAddress) Serialize(io utils.WriteBuffer) error {
 
     // Array Field (address)
     if m.Address != nil {
@@ -161,7 +149,7 @@ func (m *BACnetAddress) UnmarshalXML(d *xml.Decoder, start xml.StartElement) err
     }
 }
 
-func (m BACnetAddress) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetAddress) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetAddress"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
index 751569e..07afa36 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
@@ -22,70 +22,68 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACK struct {
-
+    Child IBACnetConfirmedServiceACKChild
+    IBACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKParent
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACK interface {
-    spi.Message
     ServiceChoice() uint8
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
-type BACnetConfirmedServiceACKInitializer interface {
-    initialize() spi.Message
+type IBACnetConfirmedServiceACKParent interface {
+    SerializeParent(io utils.WriteBuffer, child IBACnetConfirmedServiceACK, serializeChildFunction func() error) error
 }
 
-func BACnetConfirmedServiceACKServiceChoice(m IBACnetConfirmedServiceACK) uint8 {
-    return m.ServiceChoice()
+type IBACnetConfirmedServiceACKChild interface {
+    Serialize(io utils.WriteBuffer) error
+    InitializeParent(parent *BACnetConfirmedServiceACK)
+    IBACnetConfirmedServiceACK
 }
 
-
-func CastIBACnetConfirmedServiceACK(structType interface{}) IBACnetConfirmedServiceACK {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACK {
-        if iBACnetConfirmedServiceACK, ok := typ.(IBACnetConfirmedServiceACK); ok {
-            return iBACnetConfirmedServiceACK
-        }
-        return nil
-    }
-    return castFunc(structType)
+func NewBACnetConfirmedServiceACK() *BACnetConfirmedServiceACK {
+    return &BACnetConfirmedServiceACK{}
 }
 
 func CastBACnetConfirmedServiceACK(structType interface{}) BACnetConfirmedServiceACK {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACK {
-        if sBACnetConfirmedServiceACK, ok := typ.(BACnetConfirmedServiceACK); ok {
-            return sBACnetConfirmedServiceACK
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACK, ok := typ.(*BACnetConfirmedServiceACK); ok {
-            return *sBACnetConfirmedServiceACK
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return *casted
         }
         return BACnetConfirmedServiceACK{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACK) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+func (m *BACnetConfirmedServiceACK) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Discriminator Field (serviceChoice)
     lengthInBits += 8
 
     // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACK) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACK) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKParse(io *utils.ReadBuffer) (spi.Message, error) {
+func BACnetConfirmedServiceACKParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
     // Discriminator Field (serviceChoice) (Used as input to a switch field)
     serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
@@ -94,57 +92,62 @@ func BACnetConfirmedServiceACKParse(io *utils.ReadBuffer) (spi.Message, error) {
     }
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    var initializer BACnetConfirmedServiceACKInitializer
+    var _parent *BACnetConfirmedServiceACK
     var typeSwitchError error
     switch {
     case serviceChoice == 0x03:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKGetAlarmSummaryParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKGetAlarmSummaryParse(io)
     case serviceChoice == 0x04:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKGetEnrollmentSummaryParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKGetEnrollmentSummaryParse(io)
     case serviceChoice == 0x1D:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKGetEventInformationParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKGetEventInformationParse(io)
     case serviceChoice == 0x06:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKAtomicReadFileParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKAtomicReadFileParse(io)
     case serviceChoice == 0x07:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKAtomicWriteFileParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKAtomicWriteFileParse(io)
     case serviceChoice == 0x0A:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKCreateObjectParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKCreateObjectParse(io)
     case serviceChoice == 0x0C:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKReadPropertyParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKReadPropertyParse(io)
     case serviceChoice == 0x0E:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKReadPropertyMultipleParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKReadPropertyMultipleParse(io)
     case serviceChoice == 0x1A:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKReadRangeParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKReadRangeParse(io)
     case serviceChoice == 0x12:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKConfirmedPrivateTransferParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKConfirmedPrivateTransferParse(io)
     case serviceChoice == 0x15:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKVTOpenParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKVTOpenParse(io)
     case serviceChoice == 0x17:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKVTDataParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKVTDataParse(io)
     case serviceChoice == 0x18:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKRemovedAuthenticateParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKRemovedAuthenticateParse(io)
     case serviceChoice == 0x0D:
-        initializer, typeSwitchError = BACnetConfirmedServiceACKRemovedReadPropertyConditionalParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceACKRemovedReadPropertyConditionalParse(io)
     }
     if typeSwitchError != nil {
         return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
     }
 
-    // Create the instance
-    return initializer.initialize(), nil
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent)
+    return _parent, nil
+}
+
+func (m *BACnetConfirmedServiceACK) Serialize(io utils.WriteBuffer) error {
+    return m.Child.Serialize(io)
 }
 
-func BACnetConfirmedServiceACKSerialize(io utils.WriteBuffer, m BACnetConfirmedServiceACK, i IBACnetConfirmedServiceACK, childSerialize func() error) error {
+func (m *BACnetConfirmedServiceACK) SerializeParent(io utils.WriteBuffer, child IBACnetConfirmedServiceACK, serializeChildFunction func() error) error {
 
     // Discriminator Field (serviceChoice) (Used as input to a switch field)
-    serviceChoice := uint8(i.ServiceChoice())
+    serviceChoice := uint8(child.ServiceChoice())
     _serviceChoiceErr := io.WriteUint8(8, (serviceChoice))
     if _serviceChoiceErr != nil {
         return errors.New("Error serializing 'serviceChoice' field " + _serviceChoiceErr.Error())
     }
 
     // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-    _typeSwitchErr := childSerialize()
+    _typeSwitchErr := serializeChildFunction()
     if _typeSwitchErr != nil {
         return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
     }
@@ -170,7 +173,7 @@ func (m *BACnetConfirmedServiceACK) UnmarshalXML(d *xml.Decoder, start xml.Start
     }
 }
 
-func (m BACnetConfirmedServiceACK) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACK) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACK"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
index 07c5d1a..cf8e52f 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKAtomicReadFile struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKAtomicReadFile
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKAtomicReadFile interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKAtomicReadFile) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKAtomicReadFile) ServiceChoice() uint8 {
     return 0x06
 }
 
-func (m BACnetConfirmedServiceACKAtomicReadFile) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKAtomicReadFile() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKAtomicReadFile{}
+func (m *BACnetConfirmedServiceACKAtomicReadFile) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKAtomicReadFile(structType interface{}) IBACnetConfirmedServiceACKAtomicReadFile {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKAtomicReadFile {
-        if iBACnetConfirmedServiceACKAtomicReadFile, ok := typ.(IBACnetConfirmedServiceACKAtomicReadFile); ok {
-            return iBACnetConfirmedServiceACKAtomicReadFile
-        }
-        return nil
+func NewBACnetConfirmedServiceACKAtomicReadFile() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKAtomicReadFile{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKAtomicReadFile(structType interface{}) BACnetConfirmedServiceACKAtomicReadFile {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKAtomicReadFile {
-        if sBACnetConfirmedServiceACKAtomicReadFile, ok := typ.(BACnetConfirmedServiceACKAtomicReadFile); ok {
-            return sBACnetConfirmedServiceACKAtomicReadFile
+        if casted, ok := typ.(BACnetConfirmedServiceACKAtomicReadFile); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKAtomicReadFile, ok := typ.(*BACnetConfirmedServiceACKAtomicReadFile); ok {
-            return *sBACnetConfirmedServiceACKAtomicReadFile
+        if casted, ok := typ.(*BACnetConfirmedServiceACKAtomicReadFile); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKAtomicReadFile(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKAtomicReadFile(casted.Child)
         }
         return BACnetConfirmedServiceACKAtomicReadFile{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKAtomicReadFile) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKAtomicReadFile) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKAtomicReadFile) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKAtomicReadFile) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKAtomicReadFileParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKAtomicReadFileParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKAtomicReadFile(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKAtomicReadFile{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKAtomicReadFile) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKAtomicReadFile) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKAtomicReadFile) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKAtomicReadFile) UnmarshalXML(d *xml.Decoder, s
     }
 }
 
-func (m BACnetConfirmedServiceACKAtomicReadFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKAtomicReadFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKAtomicReadFile"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
index 63d9a14..5ca9427 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKAtomicWriteFile struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKAtomicWriteFile
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKAtomicWriteFile interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKAtomicWriteFile) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKAtomicWriteFile) ServiceChoice() uint8 {
     return 0x07
 }
 
-func (m BACnetConfirmedServiceACKAtomicWriteFile) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKAtomicWriteFile() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKAtomicWriteFile{}
+func (m *BACnetConfirmedServiceACKAtomicWriteFile) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKAtomicWriteFile(structType interface{}) IBACnetConfirmedServiceACKAtomicWriteFile {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKAtomicWriteFile {
-        if iBACnetConfirmedServiceACKAtomicWriteFile, ok := typ.(IBACnetConfirmedServiceACKAtomicWriteFile); ok {
-            return iBACnetConfirmedServiceACKAtomicWriteFile
-        }
-        return nil
+func NewBACnetConfirmedServiceACKAtomicWriteFile() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKAtomicWriteFile{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKAtomicWriteFile(structType interface{}) BACnetConfirmedServiceACKAtomicWriteFile {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKAtomicWriteFile {
-        if sBACnetConfirmedServiceACKAtomicWriteFile, ok := typ.(BACnetConfirmedServiceACKAtomicWriteFile); ok {
-            return sBACnetConfirmedServiceACKAtomicWriteFile
+        if casted, ok := typ.(BACnetConfirmedServiceACKAtomicWriteFile); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKAtomicWriteFile, ok := typ.(*BACnetConfirmedServiceACKAtomicWriteFile); ok {
-            return *sBACnetConfirmedServiceACKAtomicWriteFile
+        if casted, ok := typ.(*BACnetConfirmedServiceACKAtomicWriteFile); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKAtomicWriteFile(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKAtomicWriteFile(casted.Child)
         }
         return BACnetConfirmedServiceACKAtomicWriteFile{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKAtomicWriteFile) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKAtomicWriteFile) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKAtomicWriteFile) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKAtomicWriteFile) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKAtomicWriteFileParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKAtomicWriteFileParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKAtomicWriteFile(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKAtomicWriteFile{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKAtomicWriteFile) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKAtomicWriteFile) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKAtomicWriteFile) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKAtomicWriteFile) UnmarshalXML(d *xml.Decoder,
     }
 }
 
-func (m BACnetConfirmedServiceACKAtomicWriteFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKAtomicWriteFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKAtomicWriteFile"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
index 48af791..68e9331 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKConfirmedPrivateTransfer struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKConfirmedPrivateTransfer
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKConfirmedPrivateTransfer interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) ServiceChoice() uint8 {
     return 0x12
 }
 
-func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKConfirmedPrivateTransfer() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKConfirmedPrivateTransfer{}
+func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKConfirmedPrivateTransfer(structType interface{}) IBACnetConfirmedServiceACKConfirmedPrivateTransfer {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKConfirmedPrivateTransfer {
-        if iBACnetConfirmedServiceACKConfirmedPrivateTransfer, ok := typ.(IBACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
-            return iBACnetConfirmedServiceACKConfirmedPrivateTransfer
-        }
-        return nil
+func NewBACnetConfirmedServiceACKConfirmedPrivateTransfer() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKConfirmedPrivateTransfer{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKConfirmedPrivateTransfer(structType interface{}) BACnetConfirmedServiceACKConfirmedPrivateTransfer {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKConfirmedPrivateTransfer {
-        if sBACnetConfirmedServiceACKConfirmedPrivateTransfer, ok := typ.(BACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
-            return sBACnetConfirmedServiceACKConfirmedPrivateTransfer
+        if casted, ok := typ.(BACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKConfirmedPrivateTransfer, ok := typ.(*BACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
-            return *sBACnetConfirmedServiceACKConfirmedPrivateTransfer
+        if casted, ok := typ.(*BACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKConfirmedPrivateTransfer(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKConfirmedPrivateTransfer(casted.Child)
         }
         return BACnetConfirmedServiceACKConfirmedPrivateTransfer{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKConfirmedPrivateTransferParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKConfirmedPrivateTransferParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKConfirmedPrivateTransfer(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKConfirmedPrivateTransfer{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) UnmarshalXML(d *xml.
     }
 }
 
-func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKConfirmedPrivateTransfer) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKConfirmedPrivateTransfer"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
index 08a5967..9bd058c 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKCreateObject struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKCreateObject
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKCreateObject interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKCreateObject) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKCreateObject) ServiceChoice() uint8 {
     return 0x0A
 }
 
-func (m BACnetConfirmedServiceACKCreateObject) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKCreateObject() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKCreateObject{}
+func (m *BACnetConfirmedServiceACKCreateObject) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKCreateObject(structType interface{}) IBACnetConfirmedServiceACKCreateObject {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKCreateObject {
-        if iBACnetConfirmedServiceACKCreateObject, ok := typ.(IBACnetConfirmedServiceACKCreateObject); ok {
-            return iBACnetConfirmedServiceACKCreateObject
-        }
-        return nil
+func NewBACnetConfirmedServiceACKCreateObject() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKCreateObject{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKCreateObject(structType interface{}) BACnetConfirmedServiceACKCreateObject {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKCreateObject {
-        if sBACnetConfirmedServiceACKCreateObject, ok := typ.(BACnetConfirmedServiceACKCreateObject); ok {
-            return sBACnetConfirmedServiceACKCreateObject
+        if casted, ok := typ.(BACnetConfirmedServiceACKCreateObject); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKCreateObject, ok := typ.(*BACnetConfirmedServiceACKCreateObject); ok {
-            return *sBACnetConfirmedServiceACKCreateObject
+        if casted, ok := typ.(*BACnetConfirmedServiceACKCreateObject); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKCreateObject(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKCreateObject(casted.Child)
         }
         return BACnetConfirmedServiceACKCreateObject{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKCreateObject) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKCreateObject) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKCreateObject) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKCreateObject) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKCreateObjectParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKCreateObjectParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKCreateObject(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKCreateObject{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKCreateObject) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKCreateObject) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKCreateObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKCreateObject) UnmarshalXML(d *xml.Decoder, sta
     }
 }
 
-func (m BACnetConfirmedServiceACKCreateObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKCreateObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKCreateObject"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
index 603d21d..18d7837 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKGetAlarmSummary struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKGetAlarmSummary
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKGetAlarmSummary interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKGetAlarmSummary) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKGetAlarmSummary) ServiceChoice() uint8 {
     return 0x03
 }
 
-func (m BACnetConfirmedServiceACKGetAlarmSummary) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKGetAlarmSummary() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKGetAlarmSummary{}
+func (m *BACnetConfirmedServiceACKGetAlarmSummary) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKGetAlarmSummary(structType interface{}) IBACnetConfirmedServiceACKGetAlarmSummary {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKGetAlarmSummary {
-        if iBACnetConfirmedServiceACKGetAlarmSummary, ok := typ.(IBACnetConfirmedServiceACKGetAlarmSummary); ok {
-            return iBACnetConfirmedServiceACKGetAlarmSummary
-        }
-        return nil
+func NewBACnetConfirmedServiceACKGetAlarmSummary() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKGetAlarmSummary{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKGetAlarmSummary(structType interface{}) BACnetConfirmedServiceACKGetAlarmSummary {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKGetAlarmSummary {
-        if sBACnetConfirmedServiceACKGetAlarmSummary, ok := typ.(BACnetConfirmedServiceACKGetAlarmSummary); ok {
-            return sBACnetConfirmedServiceACKGetAlarmSummary
+        if casted, ok := typ.(BACnetConfirmedServiceACKGetAlarmSummary); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKGetAlarmSummary, ok := typ.(*BACnetConfirmedServiceACKGetAlarmSummary); ok {
-            return *sBACnetConfirmedServiceACKGetAlarmSummary
+        if casted, ok := typ.(*BACnetConfirmedServiceACKGetAlarmSummary); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKGetAlarmSummary(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKGetAlarmSummary(casted.Child)
         }
         return BACnetConfirmedServiceACKGetAlarmSummary{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKGetAlarmSummary) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKGetAlarmSummary) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKGetAlarmSummary) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKGetAlarmSummary) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKGetAlarmSummaryParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKGetAlarmSummaryParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKGetAlarmSummary(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKGetAlarmSummary{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKGetAlarmSummary) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKGetAlarmSummary) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKGetAlarmSummary) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKGetAlarmSummary) UnmarshalXML(d *xml.Decoder,
     }
 }
 
-func (m BACnetConfirmedServiceACKGetAlarmSummary) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKGetAlarmSummary) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKGetAlarmSummary"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
index 0d37a9b..0681b2b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKGetEnrollmentSummary struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKGetEnrollmentSummary
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKGetEnrollmentSummary interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKGetEnrollmentSummary) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) ServiceChoice() uint8 {
     return 0x04
 }
 
-func (m BACnetConfirmedServiceACKGetEnrollmentSummary) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKGetEnrollmentSummary() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKGetEnrollmentSummary{}
+func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKGetEnrollmentSummary(structType interface{}) IBACnetConfirmedServiceACKGetEnrollmentSummary {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKGetEnrollmentSummary {
-        if iBACnetConfirmedServiceACKGetEnrollmentSummary, ok := typ.(IBACnetConfirmedServiceACKGetEnrollmentSummary); ok {
-            return iBACnetConfirmedServiceACKGetEnrollmentSummary
-        }
-        return nil
+func NewBACnetConfirmedServiceACKGetEnrollmentSummary() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKGetEnrollmentSummary{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKGetEnrollmentSummary(structType interface{}) BACnetConfirmedServiceACKGetEnrollmentSummary {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKGetEnrollmentSummary {
-        if sBACnetConfirmedServiceACKGetEnrollmentSummary, ok := typ.(BACnetConfirmedServiceACKGetEnrollmentSummary); ok {
-            return sBACnetConfirmedServiceACKGetEnrollmentSummary
+        if casted, ok := typ.(BACnetConfirmedServiceACKGetEnrollmentSummary); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKGetEnrollmentSummary, ok := typ.(*BACnetConfirmedServiceACKGetEnrollmentSummary); ok {
-            return *sBACnetConfirmedServiceACKGetEnrollmentSummary
+        if casted, ok := typ.(*BACnetConfirmedServiceACKGetEnrollmentSummary); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKGetEnrollmentSummary(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKGetEnrollmentSummary(casted.Child)
         }
         return BACnetConfirmedServiceACKGetEnrollmentSummary{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKGetEnrollmentSummary) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKGetEnrollmentSummary) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKGetEnrollmentSummaryParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKGetEnrollmentSummaryParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKGetEnrollmentSummary(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKGetEnrollmentSummary{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKGetEnrollmentSummary) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) UnmarshalXML(d *xml.Deco
     }
 }
 
-func (m BACnetConfirmedServiceACKGetEnrollmentSummary) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKGetEnrollmentSummary) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKGetEnrollmentSummary"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
index 809562c..a42b420 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKGetEventInformation struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKGetEventInformation
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKGetEventInformation interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKGetEventInformation) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKGetEventInformation) ServiceChoice() uint8 {
     return 0x1D
 }
 
-func (m BACnetConfirmedServiceACKGetEventInformation) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKGetEventInformation() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKGetEventInformation{}
+func (m *BACnetConfirmedServiceACKGetEventInformation) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKGetEventInformation(structType interface{}) IBACnetConfirmedServiceACKGetEventInformation {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKGetEventInformation {
-        if iBACnetConfirmedServiceACKGetEventInformation, ok := typ.(IBACnetConfirmedServiceACKGetEventInformation); ok {
-            return iBACnetConfirmedServiceACKGetEventInformation
-        }
-        return nil
+func NewBACnetConfirmedServiceACKGetEventInformation() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKGetEventInformation{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKGetEventInformation(structType interface{}) BACnetConfirmedServiceACKGetEventInformation {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKGetEventInformation {
-        if sBACnetConfirmedServiceACKGetEventInformation, ok := typ.(BACnetConfirmedServiceACKGetEventInformation); ok {
-            return sBACnetConfirmedServiceACKGetEventInformation
+        if casted, ok := typ.(BACnetConfirmedServiceACKGetEventInformation); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKGetEventInformation, ok := typ.(*BACnetConfirmedServiceACKGetEventInformation); ok {
-            return *sBACnetConfirmedServiceACKGetEventInformation
+        if casted, ok := typ.(*BACnetConfirmedServiceACKGetEventInformation); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKGetEventInformation(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKGetEventInformation(casted.Child)
         }
         return BACnetConfirmedServiceACKGetEventInformation{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKGetEventInformation) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKGetEventInformation) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKGetEventInformation) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKGetEventInformation) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKGetEventInformationParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKGetEventInformationParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKGetEventInformation(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKGetEventInformation{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKGetEventInformation) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKGetEventInformation) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKGetEventInformation) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKGetEventInformation) UnmarshalXML(d *xml.Decod
     }
 }
 
-func (m BACnetConfirmedServiceACKGetEventInformation) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKGetEventInformation) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKGetEventInformation"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
index a050211..cee38a6 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKReadProperty struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKReadProperty
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKReadProperty interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKReadProperty) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKReadProperty) ServiceChoice() uint8 {
     return 0x0C
 }
 
-func (m BACnetConfirmedServiceACKReadProperty) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKReadProperty() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKReadProperty{}
+func (m *BACnetConfirmedServiceACKReadProperty) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKReadProperty(structType interface{}) IBACnetConfirmedServiceACKReadProperty {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKReadProperty {
-        if iBACnetConfirmedServiceACKReadProperty, ok := typ.(IBACnetConfirmedServiceACKReadProperty); ok {
-            return iBACnetConfirmedServiceACKReadProperty
-        }
-        return nil
+func NewBACnetConfirmedServiceACKReadProperty() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKReadProperty{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKReadProperty(structType interface{}) BACnetConfirmedServiceACKReadProperty {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKReadProperty {
-        if sBACnetConfirmedServiceACKReadProperty, ok := typ.(BACnetConfirmedServiceACKReadProperty); ok {
-            return sBACnetConfirmedServiceACKReadProperty
+        if casted, ok := typ.(BACnetConfirmedServiceACKReadProperty); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKReadProperty, ok := typ.(*BACnetConfirmedServiceACKReadProperty); ok {
-            return *sBACnetConfirmedServiceACKReadProperty
+        if casted, ok := typ.(*BACnetConfirmedServiceACKReadProperty); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKReadProperty(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKReadProperty(casted.Child)
         }
         return BACnetConfirmedServiceACKReadProperty{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKReadProperty) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKReadProperty) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKReadProperty) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKReadProperty) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKReadPropertyParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKReadPropertyParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKReadProperty(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKReadProperty{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKReadProperty) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKReadProperty) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKReadProperty) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKReadProperty) UnmarshalXML(d *xml.Decoder, sta
     }
 }
 
-func (m BACnetConfirmedServiceACKReadProperty) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKReadProperty) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKReadProperty"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
index 173f302..49852e6 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKReadPropertyMultiple struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKReadPropertyMultiple
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKReadPropertyMultiple interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKReadPropertyMultiple) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKReadPropertyMultiple) ServiceChoice() uint8 {
     return 0x0E
 }
 
-func (m BACnetConfirmedServiceACKReadPropertyMultiple) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKReadPropertyMultiple() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKReadPropertyMultiple{}
+func (m *BACnetConfirmedServiceACKReadPropertyMultiple) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKReadPropertyMultiple(structType interface{}) IBACnetConfirmedServiceACKReadPropertyMultiple {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKReadPropertyMultiple {
-        if iBACnetConfirmedServiceACKReadPropertyMultiple, ok := typ.(IBACnetConfirmedServiceACKReadPropertyMultiple); ok {
-            return iBACnetConfirmedServiceACKReadPropertyMultiple
-        }
-        return nil
+func NewBACnetConfirmedServiceACKReadPropertyMultiple() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKReadPropertyMultiple{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKReadPropertyMultiple(structType interface{}) BACnetConfirmedServiceACKReadPropertyMultiple {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKReadPropertyMultiple {
-        if sBACnetConfirmedServiceACKReadPropertyMultiple, ok := typ.(BACnetConfirmedServiceACKReadPropertyMultiple); ok {
-            return sBACnetConfirmedServiceACKReadPropertyMultiple
+        if casted, ok := typ.(BACnetConfirmedServiceACKReadPropertyMultiple); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKReadPropertyMultiple, ok := typ.(*BACnetConfirmedServiceACKReadPropertyMultiple); ok {
-            return *sBACnetConfirmedServiceACKReadPropertyMultiple
+        if casted, ok := typ.(*BACnetConfirmedServiceACKReadPropertyMultiple); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKReadPropertyMultiple(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKReadPropertyMultiple(casted.Child)
         }
         return BACnetConfirmedServiceACKReadPropertyMultiple{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKReadPropertyMultiple) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKReadPropertyMultiple) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKReadPropertyMultiple) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKReadPropertyMultiple) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKReadPropertyMultipleParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKReadPropertyMultipleParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKReadPropertyMultiple(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKReadPropertyMultiple{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKReadPropertyMultiple) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKReadPropertyMultiple) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKReadPropertyMultiple) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKReadPropertyMultiple) UnmarshalXML(d *xml.Deco
     }
 }
 
-func (m BACnetConfirmedServiceACKReadPropertyMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKReadPropertyMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKReadPropertyMultiple"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
index 1b6c8a0..c2adb77 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKReadRange struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKReadRange
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKReadRange interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKReadRange) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKReadRange) ServiceChoice() uint8 {
     return 0x1A
 }
 
-func (m BACnetConfirmedServiceACKReadRange) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKReadRange() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKReadRange{}
+func (m *BACnetConfirmedServiceACKReadRange) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKReadRange(structType interface{}) IBACnetConfirmedServiceACKReadRange {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKReadRange {
-        if iBACnetConfirmedServiceACKReadRange, ok := typ.(IBACnetConfirmedServiceACKReadRange); ok {
-            return iBACnetConfirmedServiceACKReadRange
-        }
-        return nil
+func NewBACnetConfirmedServiceACKReadRange() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKReadRange{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKReadRange(structType interface{}) BACnetConfirmedServiceACKReadRange {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKReadRange {
-        if sBACnetConfirmedServiceACKReadRange, ok := typ.(BACnetConfirmedServiceACKReadRange); ok {
-            return sBACnetConfirmedServiceACKReadRange
+        if casted, ok := typ.(BACnetConfirmedServiceACKReadRange); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKReadRange, ok := typ.(*BACnetConfirmedServiceACKReadRange); ok {
-            return *sBACnetConfirmedServiceACKReadRange
+        if casted, ok := typ.(*BACnetConfirmedServiceACKReadRange); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKReadRange(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKReadRange(casted.Child)
         }
         return BACnetConfirmedServiceACKReadRange{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKReadRange) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKReadRange) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKReadRange) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKReadRange) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKReadRangeParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKReadRangeParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKReadRange(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKReadRange{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKReadRange) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKReadRange) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKReadRange) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKReadRange) UnmarshalXML(d *xml.Decoder, start
     }
 }
 
-func (m BACnetConfirmedServiceACKReadRange) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKReadRange) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKReadRange"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
index 7399cbb..91873d9 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKRemovedAuthenticate struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKRemovedAuthenticate
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKRemovedAuthenticate interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKRemovedAuthenticate) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKRemovedAuthenticate) ServiceChoice() uint8 {
     return 0x18
 }
 
-func (m BACnetConfirmedServiceACKRemovedAuthenticate) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKRemovedAuthenticate() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKRemovedAuthenticate{}
+func (m *BACnetConfirmedServiceACKRemovedAuthenticate) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKRemovedAuthenticate(structType interface{}) IBACnetConfirmedServiceACKRemovedAuthenticate {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKRemovedAuthenticate {
-        if iBACnetConfirmedServiceACKRemovedAuthenticate, ok := typ.(IBACnetConfirmedServiceACKRemovedAuthenticate); ok {
-            return iBACnetConfirmedServiceACKRemovedAuthenticate
-        }
-        return nil
+func NewBACnetConfirmedServiceACKRemovedAuthenticate() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKRemovedAuthenticate{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKRemovedAuthenticate(structType interface{}) BACnetConfirmedServiceACKRemovedAuthenticate {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKRemovedAuthenticate {
-        if sBACnetConfirmedServiceACKRemovedAuthenticate, ok := typ.(BACnetConfirmedServiceACKRemovedAuthenticate); ok {
-            return sBACnetConfirmedServiceACKRemovedAuthenticate
+        if casted, ok := typ.(BACnetConfirmedServiceACKRemovedAuthenticate); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKRemovedAuthenticate, ok := typ.(*BACnetConfirmedServiceACKRemovedAuthenticate); ok {
-            return *sBACnetConfirmedServiceACKRemovedAuthenticate
+        if casted, ok := typ.(*BACnetConfirmedServiceACKRemovedAuthenticate); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKRemovedAuthenticate(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKRemovedAuthenticate(casted.Child)
         }
         return BACnetConfirmedServiceACKRemovedAuthenticate{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKRemovedAuthenticate) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKRemovedAuthenticate) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKRemovedAuthenticate) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKRemovedAuthenticate) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKRemovedAuthenticateParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKRemovedAuthenticateParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKRemovedAuthenticate(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKRemovedAuthenticate{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKRemovedAuthenticate) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKRemovedAuthenticate) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKRemovedAuthenticate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKRemovedAuthenticate) UnmarshalXML(d *xml.Decod
     }
 }
 
-func (m BACnetConfirmedServiceACKRemovedAuthenticate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKRemovedAuthenticate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKRemovedAuthenticate"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
index 32491f4..6a66f9b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKRemovedReadPropertyConditional struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKRemovedReadPropertyConditional
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKRemovedReadPropertyConditional interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) ServiceChoice() uint8 {
     return 0x0D
 }
 
-func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKRemovedReadPropertyConditional() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKRemovedReadPropertyConditional{}
+func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKRemovedReadPropertyConditional(structType interface{}) IBACnetConfirmedServiceACKRemovedReadPropertyConditional {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKRemovedReadPropertyConditional {
-        if iBACnetConfirmedServiceACKRemovedReadPropertyConditional, ok := typ.(IBACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
-            return iBACnetConfirmedServiceACKRemovedReadPropertyConditional
-        }
-        return nil
+func NewBACnetConfirmedServiceACKRemovedReadPropertyConditional() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKRemovedReadPropertyConditional{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKRemovedReadPropertyConditional(structType interface{}) BACnetConfirmedServiceACKRemovedReadPropertyConditional {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKRemovedReadPropertyConditional {
-        if sBACnetConfirmedServiceACKRemovedReadPropertyConditional, ok := typ.(BACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
-            return sBACnetConfirmedServiceACKRemovedReadPropertyConditional
+        if casted, ok := typ.(BACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKRemovedReadPropertyConditional, ok := typ.(*BACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
-            return *sBACnetConfirmedServiceACKRemovedReadPropertyConditional
+        if casted, ok := typ.(*BACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKRemovedReadPropertyConditional(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKRemovedReadPropertyConditional(casted.Child)
         }
         return BACnetConfirmedServiceACKRemovedReadPropertyConditional{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKRemovedReadPropertyConditionalParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKRemovedReadPropertyConditionalParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKRemovedReadPropertyConditional(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKRemovedReadPropertyConditional{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) UnmarshalXML(d
     }
 }
 
-func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKRemovedReadPropertyConditional) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKRemovedReadPropertyConditional"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
index 6a52ded..0ac50c9 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKVTData struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKVTData
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKVTData interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKVTData) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKVTData) ServiceChoice() uint8 {
     return 0x17
 }
 
-func (m BACnetConfirmedServiceACKVTData) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKVTData() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKVTData{}
+func (m *BACnetConfirmedServiceACKVTData) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKVTData(structType interface{}) IBACnetConfirmedServiceACKVTData {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKVTData {
-        if iBACnetConfirmedServiceACKVTData, ok := typ.(IBACnetConfirmedServiceACKVTData); ok {
-            return iBACnetConfirmedServiceACKVTData
-        }
-        return nil
+func NewBACnetConfirmedServiceACKVTData() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKVTData{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKVTData(structType interface{}) BACnetConfirmedServiceACKVTData {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKVTData {
-        if sBACnetConfirmedServiceACKVTData, ok := typ.(BACnetConfirmedServiceACKVTData); ok {
-            return sBACnetConfirmedServiceACKVTData
+        if casted, ok := typ.(BACnetConfirmedServiceACKVTData); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKVTData, ok := typ.(*BACnetConfirmedServiceACKVTData); ok {
-            return *sBACnetConfirmedServiceACKVTData
+        if casted, ok := typ.(*BACnetConfirmedServiceACKVTData); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKVTData(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKVTData(casted.Child)
         }
         return BACnetConfirmedServiceACKVTData{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKVTData) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKVTData) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKVTData) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKVTData) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKVTDataParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKVTDataParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKVTData(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKVTData{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKVTData) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKVTData) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKVTData) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKVTData) UnmarshalXML(d *xml.Decoder, start xml
     }
 }
 
-func (m BACnetConfirmedServiceACKVTData) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKVTData) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKVTData"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
index a930081..06b9f83 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceACKVTOpen struct {
-    BACnetConfirmedServiceACK
+    Parent *BACnetConfirmedServiceACK
+    IBACnetConfirmedServiceACKVTOpen
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceACKVTOpen interface {
-    IBACnetConfirmedServiceACK
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceACKVTOpen) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceACKVTOpen) ServiceChoice() uint8 {
     return 0x15
 }
 
-func (m BACnetConfirmedServiceACKVTOpen) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceACKVTOpen() BACnetConfirmedServiceACKInitializer {
-    return &BACnetConfirmedServiceACKVTOpen{}
+func (m *BACnetConfirmedServiceACKVTOpen) InitializeParent(parent *BACnetConfirmedServiceACK) {
 }
 
-func CastIBACnetConfirmedServiceACKVTOpen(structType interface{}) IBACnetConfirmedServiceACKVTOpen {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceACKVTOpen {
-        if iBACnetConfirmedServiceACKVTOpen, ok := typ.(IBACnetConfirmedServiceACKVTOpen); ok {
-            return iBACnetConfirmedServiceACKVTOpen
-        }
-        return nil
+func NewBACnetConfirmedServiceACKVTOpen() *BACnetConfirmedServiceACK {
+    child := &BACnetConfirmedServiceACKVTOpen{
+        Parent: NewBACnetConfirmedServiceACK(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceACKVTOpen(structType interface{}) BACnetConfirmedServiceACKVTOpen {
     castFunc := func(typ interface{}) BACnetConfirmedServiceACKVTOpen {
-        if sBACnetConfirmedServiceACKVTOpen, ok := typ.(BACnetConfirmedServiceACKVTOpen); ok {
-            return sBACnetConfirmedServiceACKVTOpen
+        if casted, ok := typ.(BACnetConfirmedServiceACKVTOpen); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceACKVTOpen, ok := typ.(*BACnetConfirmedServiceACKVTOpen); ok {
-            return *sBACnetConfirmedServiceACKVTOpen
+        if casted, ok := typ.(*BACnetConfirmedServiceACKVTOpen); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKVTOpen(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceACK); ok {
+            return CastBACnetConfirmedServiceACKVTOpen(casted.Child)
         }
         return BACnetConfirmedServiceACKVTOpen{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceACKVTOpen) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
+func (m *BACnetConfirmedServiceACKVTOpen) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceACKVTOpen) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceACKVTOpen) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceACKVTOpenParse(io *utils.ReadBuffer) (BACnetConfirmedServiceACKInitializer, error) {
+func BACnetConfirmedServiceACKVTOpenParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceACK, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceACKVTOpen(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceACKVTOpen{
+        Parent: &BACnetConfirmedServiceACK{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceACKVTOpen) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceACKVTOpen) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceACKSerialize(io, m.BACnetConfirmedServiceACK, CastIBACnetConfirmedServiceACK(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceACKVTOpen) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceACKVTOpen) UnmarshalXML(d *xml.Decoder, start xml
     }
 }
 
-func (m BACnetConfirmedServiceACKVTOpen) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceACKVTOpen) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceACKVTOpen"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
index e43b1cf..615a287 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
@@ -22,70 +22,68 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequest struct {
-
+    Child IBACnetConfirmedServiceRequestChild
+    IBACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestParent
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequest interface {
-    spi.Message
     ServiceChoice() uint8
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
-type BACnetConfirmedServiceRequestInitializer interface {
-    initialize() spi.Message
+type IBACnetConfirmedServiceRequestParent interface {
+    SerializeParent(io utils.WriteBuffer, child IBACnetConfirmedServiceRequest, serializeChildFunction func() error) error
 }
 
-func BACnetConfirmedServiceRequestServiceChoice(m IBACnetConfirmedServiceRequest) uint8 {
-    return m.ServiceChoice()
+type IBACnetConfirmedServiceRequestChild interface {
+    Serialize(io utils.WriteBuffer) error
+    InitializeParent(parent *BACnetConfirmedServiceRequest)
+    IBACnetConfirmedServiceRequest
 }
 
-
-func CastIBACnetConfirmedServiceRequest(structType interface{}) IBACnetConfirmedServiceRequest {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequest {
-        if iBACnetConfirmedServiceRequest, ok := typ.(IBACnetConfirmedServiceRequest); ok {
-            return iBACnetConfirmedServiceRequest
-        }
-        return nil
-    }
-    return castFunc(structType)
+func NewBACnetConfirmedServiceRequest() *BACnetConfirmedServiceRequest {
+    return &BACnetConfirmedServiceRequest{}
 }
 
 func CastBACnetConfirmedServiceRequest(structType interface{}) BACnetConfirmedServiceRequest {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequest {
-        if sBACnetConfirmedServiceRequest, ok := typ.(BACnetConfirmedServiceRequest); ok {
-            return sBACnetConfirmedServiceRequest
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequest, ok := typ.(*BACnetConfirmedServiceRequest); ok {
-            return *sBACnetConfirmedServiceRequest
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return *casted
         }
         return BACnetConfirmedServiceRequest{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequest) LengthInBits() uint16 {
-    var lengthInBits uint16 = 0
+func (m *BACnetConfirmedServiceRequest) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Discriminator Field (serviceChoice)
     lengthInBits += 8
 
     // Length of sub-type elements will be added by sub-type...
+    lengthInBits += m.Child.LengthInBits()
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequest) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequest) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestParse(io *utils.ReadBuffer, len uint16) (spi.Message, error) {
+func BACnetConfirmedServiceRequestParse(io *utils.ReadBuffer, len uint16) (*BACnetConfirmedServiceRequest, error) {
 
     // Discriminator Field (serviceChoice) (Used as input to a switch field)
     serviceChoice, _serviceChoiceErr := io.ReadUint8(8)
@@ -94,91 +92,96 @@ func BACnetConfirmedServiceRequestParse(io *utils.ReadBuffer, len uint16) (spi.M
     }
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    var initializer BACnetConfirmedServiceRequestInitializer
+    var _parent *BACnetConfirmedServiceRequest
     var typeSwitchError error
     switch {
     case serviceChoice == 0x00:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestAcknowledgeAlarmParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestAcknowledgeAlarmParse(io)
     case serviceChoice == 0x01:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io, len)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io, len)
     case serviceChoice == 0x02:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestConfirmedEventNotificationParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestConfirmedEventNotificationParse(io)
     case serviceChoice == 0x04:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestGetEnrollmentSummaryParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestGetEnrollmentSummaryParse(io)
     case serviceChoice == 0x05:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestSubscribeCOVParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestSubscribeCOVParse(io)
     case serviceChoice == 0x06:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestAtomicReadFileParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestAtomicReadFileParse(io)
     case serviceChoice == 0x07:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestAtomicWriteFileParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestAtomicWriteFileParse(io)
     case serviceChoice == 0x08:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestAddListElementParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestAddListElementParse(io)
     case serviceChoice == 0x09:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestRemoveListElementParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestRemoveListElementParse(io)
     case serviceChoice == 0x0A:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestCreateObjectParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestCreateObjectParse(io)
     case serviceChoice == 0x0B:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestDeleteObjectParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestDeleteObjectParse(io)
     case serviceChoice == 0x0C:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestReadPropertyParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestReadPropertyParse(io)
     case serviceChoice == 0x0E:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestReadPropertyMultipleParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestReadPropertyMultipleParse(io)
     case serviceChoice == 0x0F:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestWritePropertyParse(io, len)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestWritePropertyParse(io, len)
     case serviceChoice == 0x10:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestWritePropertyMultipleParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestWritePropertyMultipleParse(io)
     case serviceChoice == 0x11:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestDeviceCommunicationControlParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestDeviceCommunicationControlParse(io)
     case serviceChoice == 0x12:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(io)
     case serviceChoice == 0x13:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestConfirmedTextMessageParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestConfirmedTextMessageParse(io)
     case serviceChoice == 0x14:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestReinitializeDeviceParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestReinitializeDeviceParse(io)
     case serviceChoice == 0x15:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestVTOpenParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestVTOpenParse(io)
     case serviceChoice == 0x16:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestVTCloseParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestVTCloseParse(io)
     case serviceChoice == 0x17:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestVTDataParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestVTDataParse(io)
     case serviceChoice == 0x18:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestRemovedAuthenticateParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestRemovedAuthenticateParse(io)
     case serviceChoice == 0x19:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestRemovedRequestKeyParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestRemovedRequestKeyParse(io)
     case serviceChoice == 0x0D:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestRemovedReadPropertyConditionalParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestRemovedReadPropertyConditionalParse(io)
     case serviceChoice == 0x1A:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestReadRangeParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestReadRangeParse(io)
     case serviceChoice == 0x1B:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestLifeSafetyOperationParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestLifeSafetyOperationParse(io)
     case serviceChoice == 0x1C:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestSubscribeCOVPropertyParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestSubscribeCOVPropertyParse(io)
     case serviceChoice == 0x1D:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestGetEventInformationParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestGetEventInformationParse(io)
     case serviceChoice == 0x1E:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestSubscribeCOVPropertyMultipleParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestSubscribeCOVPropertyMultipleParse(io)
     case serviceChoice == 0x1F:
-        initializer, typeSwitchError = BACnetConfirmedServiceRequestConfirmedCOVNotificationMultipleParse(io)
+        _parent, typeSwitchError = BACnetConfirmedServiceRequestConfirmedCOVNotificationMultipleParse(io)
     }
     if typeSwitchError != nil {
         return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
     }
 
-    // Create the instance
-    return initializer.initialize(), nil
+    // Finish initializing
+    _parent.Child.InitializeParent(_parent)
+    return _parent, nil
+}
+
+func (m *BACnetConfirmedServiceRequest) Serialize(io utils.WriteBuffer) error {
+    return m.Child.Serialize(io)
 }
 
-func BACnetConfirmedServiceRequestSerialize(io utils.WriteBuffer, m BACnetConfirmedServiceRequest, i IBACnetConfirmedServiceRequest, childSerialize func() error) error {
+func (m *BACnetConfirmedServiceRequest) SerializeParent(io utils.WriteBuffer, child IBACnetConfirmedServiceRequest, serializeChildFunction func() error) error {
 
     // Discriminator Field (serviceChoice) (Used as input to a switch field)
-    serviceChoice := uint8(i.ServiceChoice())
+    serviceChoice := uint8(child.ServiceChoice())
     _serviceChoiceErr := io.WriteUint8(8, (serviceChoice))
     if _serviceChoiceErr != nil {
         return errors.New("Error serializing 'serviceChoice' field " + _serviceChoiceErr.Error())
     }
 
     // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-    _typeSwitchErr := childSerialize()
+    _typeSwitchErr := serializeChildFunction()
     if _typeSwitchErr != nil {
         return errors.New("Error serializing sub-type field " + _typeSwitchErr.Error())
     }
@@ -204,7 +207,7 @@ func (m *BACnetConfirmedServiceRequest) UnmarshalXML(d *xml.Decoder, start xml.S
     }
 }
 
-func (m BACnetConfirmedServiceRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequest) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequest"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
index 54cdf13..153d415 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestAcknowledgeAlarm struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestAcknowledgeAlarm
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestAcknowledgeAlarm interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) ServiceChoice() uint8 {
     return 0x00
 }
 
-func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestAcknowledgeAlarm() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestAcknowledgeAlarm{}
+func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestAcknowledgeAlarm(structType interface{}) IBACnetConfirmedServiceRequestAcknowledgeAlarm {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAcknowledgeAlarm {
-        if iBACnetConfirmedServiceRequestAcknowledgeAlarm, ok := typ.(IBACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
-            return iBACnetConfirmedServiceRequestAcknowledgeAlarm
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestAcknowledgeAlarm() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestAcknowledgeAlarm{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestAcknowledgeAlarm(structType interface{}) BACnetConfirmedServiceRequestAcknowledgeAlarm {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAcknowledgeAlarm {
-        if sBACnetConfirmedServiceRequestAcknowledgeAlarm, ok := typ.(BACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
-            return sBACnetConfirmedServiceRequestAcknowledgeAlarm
+        if casted, ok := typ.(BACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestAcknowledgeAlarm, ok := typ.(*BACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
-            return *sBACnetConfirmedServiceRequestAcknowledgeAlarm
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAcknowledgeAlarm(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAcknowledgeAlarm(casted.Child)
         }
         return BACnetConfirmedServiceRequestAcknowledgeAlarm{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestAcknowledgeAlarmParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestAcknowledgeAlarmParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestAcknowledgeAlarm(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestAcknowledgeAlarm{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) UnmarshalXML(d *xml.Deco
     }
 }
 
-func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestAcknowledgeAlarm) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAcknowledgeAlarm"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
index 6a79dc1..d6a8051 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestAddListElement struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestAddListElement
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestAddListElement interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestAddListElement) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestAddListElement) ServiceChoice() uint8 {
     return 0x08
 }
 
-func (m BACnetConfirmedServiceRequestAddListElement) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestAddListElement() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestAddListElement{}
+func (m *BACnetConfirmedServiceRequestAddListElement) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestAddListElement(structType interface{}) IBACnetConfirmedServiceRequestAddListElement {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAddListElement {
-        if iBACnetConfirmedServiceRequestAddListElement, ok := typ.(IBACnetConfirmedServiceRequestAddListElement); ok {
-            return iBACnetConfirmedServiceRequestAddListElement
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestAddListElement() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestAddListElement{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestAddListElement(structType interface{}) BACnetConfirmedServiceRequestAddListElement {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAddListElement {
-        if sBACnetConfirmedServiceRequestAddListElement, ok := typ.(BACnetConfirmedServiceRequestAddListElement); ok {
-            return sBACnetConfirmedServiceRequestAddListElement
+        if casted, ok := typ.(BACnetConfirmedServiceRequestAddListElement); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestAddListElement, ok := typ.(*BACnetConfirmedServiceRequestAddListElement); ok {
-            return *sBACnetConfirmedServiceRequestAddListElement
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestAddListElement); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAddListElement(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAddListElement(casted.Child)
         }
         return BACnetConfirmedServiceRequestAddListElement{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestAddListElement) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestAddListElement) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestAddListElement) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestAddListElement) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestAddListElementParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestAddListElementParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestAddListElement(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestAddListElement{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestAddListElement) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestAddListElement) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestAddListElement) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestAddListElement) UnmarshalXML(d *xml.Decode
     }
 }
 
-func (m BACnetConfirmedServiceRequestAddListElement) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestAddListElement) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAddListElement"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
index 899deb7..dc43626 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestAtomicReadFile struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestAtomicReadFile
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestAtomicReadFile interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestAtomicReadFile) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestAtomicReadFile) ServiceChoice() uint8 {
     return 0x06
 }
 
-func (m BACnetConfirmedServiceRequestAtomicReadFile) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestAtomicReadFile() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestAtomicReadFile{}
+func (m *BACnetConfirmedServiceRequestAtomicReadFile) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestAtomicReadFile(structType interface{}) IBACnetConfirmedServiceRequestAtomicReadFile {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAtomicReadFile {
-        if iBACnetConfirmedServiceRequestAtomicReadFile, ok := typ.(IBACnetConfirmedServiceRequestAtomicReadFile); ok {
-            return iBACnetConfirmedServiceRequestAtomicReadFile
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestAtomicReadFile() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestAtomicReadFile{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestAtomicReadFile(structType interface{}) BACnetConfirmedServiceRequestAtomicReadFile {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAtomicReadFile {
-        if sBACnetConfirmedServiceRequestAtomicReadFile, ok := typ.(BACnetConfirmedServiceRequestAtomicReadFile); ok {
-            return sBACnetConfirmedServiceRequestAtomicReadFile
+        if casted, ok := typ.(BACnetConfirmedServiceRequestAtomicReadFile); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestAtomicReadFile, ok := typ.(*BACnetConfirmedServiceRequestAtomicReadFile); ok {
-            return *sBACnetConfirmedServiceRequestAtomicReadFile
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestAtomicReadFile); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAtomicReadFile(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAtomicReadFile(casted.Child)
         }
         return BACnetConfirmedServiceRequestAtomicReadFile{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestAtomicReadFile) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestAtomicReadFile) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestAtomicReadFile) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestAtomicReadFile) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestAtomicReadFileParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestAtomicReadFileParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestAtomicReadFile(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestAtomicReadFile{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestAtomicReadFile) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestAtomicReadFile) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestAtomicReadFile) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestAtomicReadFile) UnmarshalXML(d *xml.Decode
     }
 }
 
-func (m BACnetConfirmedServiceRequestAtomicReadFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestAtomicReadFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAtomicReadFile"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
index 56397de..f28f4d2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestAtomicWriteFile struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestAtomicWriteFile
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestAtomicWriteFile interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestAtomicWriteFile) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestAtomicWriteFile) ServiceChoice() uint8 {
     return 0x07
 }
 
-func (m BACnetConfirmedServiceRequestAtomicWriteFile) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestAtomicWriteFile() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestAtomicWriteFile{}
+func (m *BACnetConfirmedServiceRequestAtomicWriteFile) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestAtomicWriteFile(structType interface{}) IBACnetConfirmedServiceRequestAtomicWriteFile {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAtomicWriteFile {
-        if iBACnetConfirmedServiceRequestAtomicWriteFile, ok := typ.(IBACnetConfirmedServiceRequestAtomicWriteFile); ok {
-            return iBACnetConfirmedServiceRequestAtomicWriteFile
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestAtomicWriteFile() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestAtomicWriteFile{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestAtomicWriteFile(structType interface{}) BACnetConfirmedServiceRequestAtomicWriteFile {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAtomicWriteFile {
-        if sBACnetConfirmedServiceRequestAtomicWriteFile, ok := typ.(BACnetConfirmedServiceRequestAtomicWriteFile); ok {
-            return sBACnetConfirmedServiceRequestAtomicWriteFile
+        if casted, ok := typ.(BACnetConfirmedServiceRequestAtomicWriteFile); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestAtomicWriteFile, ok := typ.(*BACnetConfirmedServiceRequestAtomicWriteFile); ok {
-            return *sBACnetConfirmedServiceRequestAtomicWriteFile
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestAtomicWriteFile); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAtomicWriteFile(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestAtomicWriteFile(casted.Child)
         }
         return BACnetConfirmedServiceRequestAtomicWriteFile{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestAtomicWriteFile) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestAtomicWriteFile) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestAtomicWriteFile) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestAtomicWriteFile) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestAtomicWriteFileParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestAtomicWriteFileParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestAtomicWriteFile(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestAtomicWriteFile{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestAtomicWriteFile) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestAtomicWriteFile) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestAtomicWriteFile) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestAtomicWriteFile) UnmarshalXML(d *xml.Decod
     }
 }
 
-func (m BACnetConfirmedServiceRequestAtomicWriteFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestAtomicWriteFile) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestAtomicWriteFile"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
index ae854c4..a64f827 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
@@ -23,9 +23,7 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
-    "reflect"
     "strconv"
 )
 
@@ -46,54 +44,66 @@ type BACnetConfirmedServiceRequestConfirmedCOVNotification struct {
     IssueConfirmedNotificationsInstanceNumber uint32
     LifetimeLength uint8
     LifetimeSeconds []int8
-    Notifications []IBACnetTagWithContent
-    BACnetConfirmedServiceRequest
+    Notifications []*BACnetTagWithContent
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestConfirmedCOVNotification
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestConfirmedCOVNotification interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) ServiceChoice() uint8 {
     return 0x01
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestConfirmedCOVNotification(subscriberProcessIdentifier uint8, monitoredObjectType uint16, monitoredObjectInstanceNumber uint32, issueConfirmedNotificationsType uint16, issueConfirmedNotificationsInstanceNumber uint32, lifetimeLength uint8, lifetimeSeconds []int8, notifications []IBACnetTagWithContent) BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestConfirmedCOVNotification{SubscriberProcessIdentifier: subscriberProcessIdentifier, MonitoredObjectType: monitoredObjectType, MonitoredObjectInstanceNumber: monitoredObjectInstanceNumber, IssueConfirmedNotificationsType: issueConfirmedNotificationsType, IssueConfirmedNotificationsInstanceNumber: issueConfirmedNotificationsInstanceNumber, LifetimeLength: lifetimeLength, LifetimeSeconds: lifetimeSeconds, Notifications: notifications}
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestConfirmedCOVNotification(structType interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotification {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotification {
-        if iBACnetConfirmedServiceRequestConfirmedCOVNotification, ok := typ.(IBACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
-            return iBACnetConfirmedServiceRequestConfirmedCOVNotification
-        }
-        return nil
-    }
-    return castFunc(structType)
+func NewBACnetConfirmedServiceRequestConfirmedCOVNotification(subscriberProcessIdentifier uint8, monitoredObjectType uint16, monitoredObjectInstanceNumber uint32, issueConfirmedNotificationsType uint16, issueConfirmedNotificationsInstanceNumber uint32, lifetimeLength uint8, lifetimeSeconds []int8, notifications []*BACnetTagWithContent, ) *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestConfirmedCOVNotification{
+        SubscriberProcessIdentifier: subscriberProcessIdentifier,
+        MonitoredObjectType: monitoredObjectType,
+        MonitoredObjectInstanceNumber: monitoredObjectInstanceNumber,
+        IssueConfirmedNotificationsType: issueConfirmedNotificationsType,
+        IssueConfirmedNotificationsInstanceNumber: issueConfirmedNotificationsInstanceNumber,
+        LifetimeLength: lifetimeLength,
+        LifetimeSeconds: lifetimeSeconds,
+        Notifications: notifications,
+        Parent: NewBACnetConfirmedServiceRequest(),
+    }
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestConfirmedCOVNotification(structType interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotification {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotification {
-        if sBACnetConfirmedServiceRequestConfirmedCOVNotification, ok := typ.(BACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
-            return sBACnetConfirmedServiceRequestConfirmedCOVNotification
+        if casted, ok := typ.(BACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestConfirmedCOVNotification, ok := typ.(*BACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
-            return *sBACnetConfirmedServiceRequestConfirmedCOVNotification
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedCOVNotification(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedCOVNotification(casted.Child)
         }
         return BACnetConfirmedServiceRequestConfirmedCOVNotification{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Const Field (subscriberProcessIdentifierHeader)
     lengthInBits += 8
@@ -146,11 +156,11 @@ func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) LengthInBits() ui
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io *utils.ReadBuffer, len uint16) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io *utils.ReadBuffer, len uint16) (*BACnetConfirmedServiceRequest, error) {
 
     // Const Field (subscriberProcessIdentifierHeader)
     subscriberProcessIdentifierHeader, _subscriberProcessIdentifierHeaderErr := io.ReadUint8(8)
@@ -228,7 +238,6 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io *utils.ReadBu
     // Count array
     lifetimeSeconds := make([]int8, lifetimeLength)
     for curItem := uint16(0); curItem < uint16(lifetimeLength); curItem++ {
-
         _item, _err := io.ReadInt8(8)
         if _err != nil {
             return nil, errors.New("Error parsing 'lifetimeSeconds' field " + _err.Error())
@@ -247,19 +256,14 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io *utils.ReadBu
 
     // Array field (notifications)
     // Length array
-    notifications := make([]IBACnetTagWithContent, 0)
+    notifications := make([]*BACnetTagWithContent, 0)
     _notificationsLength := uint16(len) - uint16(uint16(18))
     _notificationsEndPos := io.GetPos() + uint16(_notificationsLength)
     for ;io.GetPos() < _notificationsEndPos; {
-        _message, _err := BACnetTagWithContentParse(io)
+        _item, _err := BACnetTagWithContentParse(io)
         if _err != nil {
             return nil, errors.New("Error parsing 'notifications' field " + _err.Error())
         }
-        var _item IBACnetTagWithContent
-        _item, _ok := _message.(IBACnetTagWithContent)
-        if !_ok {
-            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to BACnetTagWithContent")
-        }
         notifications = append(notifications, _item)
     }
 
@@ -272,11 +276,23 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io *utils.ReadBu
         return nil, errors.New("Expected constant value " + strconv.Itoa(int(BACnetConfirmedServiceRequestConfirmedCOVNotification_LISTOFVALUESCLOSINGTAG)) + " but got " + strconv.Itoa(int(listOfValuesClosingTag)))
     }
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestConfirmedCOVNotification(subscriberProcessIdentifier, monitoredObjectType, monitoredObjectInstanceNumber, issueConfirmedNotificationsType, issueConfirmedNotificationsInstanceNumber, lifetimeLength, lifetimeSeconds, notifications), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestConfirmedCOVNotification{
+        SubscriberProcessIdentifier: subscriberProcessIdentifier,
+        MonitoredObjectType: monitoredObjectType,
+        MonitoredObjectInstanceNumber: monitoredObjectInstanceNumber,
+        IssueConfirmedNotificationsType: issueConfirmedNotificationsType,
+        IssueConfirmedNotificationsInstanceNumber: issueConfirmedNotificationsInstanceNumber,
+        LifetimeLength: lifetimeLength,
+        LifetimeSeconds: lifetimeSeconds,
+        Notifications: notifications,
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Const Field (subscriberProcessIdentifierHeader)
@@ -379,7 +395,7 @@ func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) Serialize(io util
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -443,7 +459,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) UnmarshalXML(d *
                 }
                 m.LifetimeSeconds = utils.ByteToInt8(_decoded[0:_len])
             case "notifications":
-                var data []IBACnetTagWithContent
+                var data []*BACnetTagWithContent
                 if err := d.DecodeElement(&data, &tok); err != nil {
                     return err
                 }
@@ -453,7 +469,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) UnmarshalXML(d *
     }
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotification) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedCOVNotification"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
index 9be3f30..049dee8 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) ServiceChoice() uint8 {
     return 0x1F
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple{}
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple(structType interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
-        if iBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple, ok := typ.(IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
-            return iBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple(structType interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
-        if sBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple, ok := typ.(BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
-            return sBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple
+        if casted, ok := typ.(BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple, ok := typ.(*BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
-            return *sBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple(casted.Child)
         }
         return BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestConfirmedCOVNotificationMultipleParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestConfirmedCOVNotificationMultipleParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) Unmarsha
     }
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
index cfab58d..1dbbbc8 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestConfirmedEventNotification struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestConfirmedEventNotification
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestConfirmedEventNotification interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestConfirmedEventNotification) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) ServiceChoice() uint8 {
     return 0x02
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedEventNotification) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestConfirmedEventNotification() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestConfirmedEventNotification{}
+func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestConfirmedEventNotification(structType interface{}) IBACnetConfirmedServiceRequestConfirmedEventNotification {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedEventNotification {
-        if iBACnetConfirmedServiceRequestConfirmedEventNotification, ok := typ.(IBACnetConfirmedServiceRequestConfirmedEventNotification); ok {
-            return iBACnetConfirmedServiceRequestConfirmedEventNotification
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestConfirmedEventNotification() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestConfirmedEventNotification{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestConfirmedEventNotification(structType interface{}) BACnetConfirmedServiceRequestConfirmedEventNotification {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedEventNotification {
-        if sBACnetConfirmedServiceRequestConfirmedEventNotification, ok := typ.(BACnetConfirmedServiceRequestConfirmedEventNotification); ok {
-            return sBACnetConfirmedServiceRequestConfirmedEventNotification
+        if casted, ok := typ.(BACnetConfirmedServiceRequestConfirmedEventNotification); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestConfirmedEventNotification, ok := typ.(*BACnetConfirmedServiceRequestConfirmedEventNotification); ok {
-            return *sBACnetConfirmedServiceRequestConfirmedEventNotification
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestConfirmedEventNotification); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedEventNotification(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedEventNotification(casted.Child)
         }
         return BACnetConfirmedServiceRequestConfirmedEventNotification{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedEventNotification) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedEventNotification) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestConfirmedEventNotificationParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestConfirmedEventNotificationParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestConfirmedEventNotification(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestConfirmedEventNotification{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedEventNotification) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) UnmarshalXML(d
     }
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedEventNotification) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestConfirmedEventNotification) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedEventNotification"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
index e66580f..e368ce3 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestConfirmedPrivateTransfer struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestConfirmedPrivateTransfer
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestConfirmedPrivateTransfer interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) ServiceChoice() uint8 {
     return 0x12
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{}
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestConfirmedPrivateTransfer(structType interface{}) IBACnetConfirmedServiceRequestConfirmedPrivateTransfer {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedPrivateTransfer {
-        if iBACnetConfirmedServiceRequestConfirmedPrivateTransfer, ok := typ.(IBACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
-            return iBACnetConfirmedServiceRequestConfirmedPrivateTransfer
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestConfirmedPrivateTransfer(structType interface{}) BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
-        if sBACnetConfirmedServiceRequestConfirmedPrivateTransfer, ok := typ.(BACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
-            return sBACnetConfirmedServiceRequestConfirmedPrivateTransfer
+        if casted, ok := typ.(BACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestConfirmedPrivateTransfer, ok := typ.(*BACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
-            return *sBACnetConfirmedServiceRequestConfirmedPrivateTransfer
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedPrivateTransfer(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedPrivateTransfer(casted.Child)
         }
         return BACnetConfirmedServiceRequestConfirmedPrivateTransfer{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) UnmarshalXML(d *
     }
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestConfirmedPrivateTransfer) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedPrivateTransfer"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
index 985b8f2..c91c3cd 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestConfirmedTextMessage struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestConfirmedTextMessage
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestConfirmedTextMessage interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestConfirmedTextMessage) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) ServiceChoice() uint8 {
     return 0x13
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedTextMessage) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestConfirmedTextMessage() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestConfirmedTextMessage{}
+func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestConfirmedTextMessage(structType interface{}) IBACnetConfirmedServiceRequestConfirmedTextMessage {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedTextMessage {
-        if iBACnetConfirmedServiceRequestConfirmedTextMessage, ok := typ.(IBACnetConfirmedServiceRequestConfirmedTextMessage); ok {
-            return iBACnetConfirmedServiceRequestConfirmedTextMessage
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestConfirmedTextMessage() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestConfirmedTextMessage{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestConfirmedTextMessage(structType interface{}) BACnetConfirmedServiceRequestConfirmedTextMessage {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedTextMessage {
-        if sBACnetConfirmedServiceRequestConfirmedTextMessage, ok := typ.(BACnetConfirmedServiceRequestConfirmedTextMessage); ok {
-            return sBACnetConfirmedServiceRequestConfirmedTextMessage
+        if casted, ok := typ.(BACnetConfirmedServiceRequestConfirmedTextMessage); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestConfirmedTextMessage, ok := typ.(*BACnetConfirmedServiceRequestConfirmedTextMessage); ok {
-            return *sBACnetConfirmedServiceRequestConfirmedTextMessage
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestConfirmedTextMessage); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedTextMessage(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestConfirmedTextMessage(casted.Child)
         }
         return BACnetConfirmedServiceRequestConfirmedTextMessage{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedTextMessage) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedTextMessage) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestConfirmedTextMessageParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestConfirmedTextMessageParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestConfirmedTextMessage(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestConfirmedTextMessage{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedTextMessage) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) UnmarshalXML(d *xml.
     }
 }
 
-func (m BACnetConfirmedServiceRequestConfirmedTextMessage) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestConfirmedTextMessage) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestConfirmedTextMessage"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
index 4c7f099..43cd7a2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestCreateObject struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestCreateObject
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestCreateObject interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestCreateObject) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestCreateObject) ServiceChoice() uint8 {
     return 0x0A
 }
 
-func (m BACnetConfirmedServiceRequestCreateObject) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestCreateObject() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestCreateObject{}
+func (m *BACnetConfirmedServiceRequestCreateObject) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestCreateObject(structType interface{}) IBACnetConfirmedServiceRequestCreateObject {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestCreateObject {
-        if iBACnetConfirmedServiceRequestCreateObject, ok := typ.(IBACnetConfirmedServiceRequestCreateObject); ok {
-            return iBACnetConfirmedServiceRequestCreateObject
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestCreateObject() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestCreateObject{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestCreateObject(structType interface{}) BACnetConfirmedServiceRequestCreateObject {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestCreateObject {
-        if sBACnetConfirmedServiceRequestCreateObject, ok := typ.(BACnetConfirmedServiceRequestCreateObject); ok {
-            return sBACnetConfirmedServiceRequestCreateObject
+        if casted, ok := typ.(BACnetConfirmedServiceRequestCreateObject); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestCreateObject, ok := typ.(*BACnetConfirmedServiceRequestCreateObject); ok {
-            return *sBACnetConfirmedServiceRequestCreateObject
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestCreateObject); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestCreateObject(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestCreateObject(casted.Child)
         }
         return BACnetConfirmedServiceRequestCreateObject{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestCreateObject) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestCreateObject) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestCreateObject) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestCreateObject) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestCreateObjectParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestCreateObjectParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestCreateObject(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestCreateObject{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestCreateObject) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestCreateObject) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestCreateObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestCreateObject) UnmarshalXML(d *xml.Decoder,
     }
 }
 
-func (m BACnetConfirmedServiceRequestCreateObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestCreateObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestCreateObject"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
index dd204c6..ca41f4c 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestDeleteObject struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestDeleteObject
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestDeleteObject interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestDeleteObject) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestDeleteObject) ServiceChoice() uint8 {
     return 0x0B
 }
 
-func (m BACnetConfirmedServiceRequestDeleteObject) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestDeleteObject() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestDeleteObject{}
+func (m *BACnetConfirmedServiceRequestDeleteObject) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestDeleteObject(structType interface{}) IBACnetConfirmedServiceRequestDeleteObject {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestDeleteObject {
-        if iBACnetConfirmedServiceRequestDeleteObject, ok := typ.(IBACnetConfirmedServiceRequestDeleteObject); ok {
-            return iBACnetConfirmedServiceRequestDeleteObject
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestDeleteObject() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestDeleteObject{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestDeleteObject(structType interface{}) BACnetConfirmedServiceRequestDeleteObject {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestDeleteObject {
-        if sBACnetConfirmedServiceRequestDeleteObject, ok := typ.(BACnetConfirmedServiceRequestDeleteObject); ok {
-            return sBACnetConfirmedServiceRequestDeleteObject
+        if casted, ok := typ.(BACnetConfirmedServiceRequestDeleteObject); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestDeleteObject, ok := typ.(*BACnetConfirmedServiceRequestDeleteObject); ok {
-            return *sBACnetConfirmedServiceRequestDeleteObject
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestDeleteObject); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestDeleteObject(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestDeleteObject(casted.Child)
         }
         return BACnetConfirmedServiceRequestDeleteObject{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestDeleteObject) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestDeleteObject) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestDeleteObject) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestDeleteObject) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestDeleteObjectParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestDeleteObjectParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestDeleteObject(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestDeleteObject{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestDeleteObject) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestDeleteObject) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestDeleteObject) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestDeleteObject) UnmarshalXML(d *xml.Decoder,
     }
 }
 
-func (m BACnetConfirmedServiceRequestDeleteObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestDeleteObject) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestDeleteObject"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
index 0790d72..b9bac8d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestDeviceCommunicationControl struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestDeviceCommunicationControl
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestDeviceCommunicationControl interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) ServiceChoice() uint8 {
     return 0x11
 }
 
-func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestDeviceCommunicationControl() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestDeviceCommunicationControl{}
+func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestDeviceCommunicationControl(structType interface{}) IBACnetConfirmedServiceRequestDeviceCommunicationControl {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestDeviceCommunicationControl {
-        if iBACnetConfirmedServiceRequestDeviceCommunicationControl, ok := typ.(IBACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
-            return iBACnetConfirmedServiceRequestDeviceCommunicationControl
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestDeviceCommunicationControl() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestDeviceCommunicationControl{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestDeviceCommunicationControl(structType interface{}) BACnetConfirmedServiceRequestDeviceCommunicationControl {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestDeviceCommunicationControl {
-        if sBACnetConfirmedServiceRequestDeviceCommunicationControl, ok := typ.(BACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
-            return sBACnetConfirmedServiceRequestDeviceCommunicationControl
+        if casted, ok := typ.(BACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestDeviceCommunicationControl, ok := typ.(*BACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
-            return *sBACnetConfirmedServiceRequestDeviceCommunicationControl
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestDeviceCommunicationControl(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestDeviceCommunicationControl(casted.Child)
         }
         return BACnetConfirmedServiceRequestDeviceCommunicationControl{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestDeviceCommunicationControlParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestDeviceCommunicationControlParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestDeviceCommunicationControl(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestDeviceCommunicationControl{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) UnmarshalXML(d
     }
 }
 
-func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestDeviceCommunicationControl) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestDeviceCommunicationControl"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
index 3180442..7e41313 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestGetEnrollmentSummary struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestGetEnrollmentSummary
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestGetEnrollmentSummary interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) ServiceChoice() uint8 {
     return 0x04
 }
 
-func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestGetEnrollmentSummary() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestGetEnrollmentSummary{}
+func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestGetEnrollmentSummary(structType interface{}) IBACnetConfirmedServiceRequestGetEnrollmentSummary {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestGetEnrollmentSummary {
-        if iBACnetConfirmedServiceRequestGetEnrollmentSummary, ok := typ.(IBACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
-            return iBACnetConfirmedServiceRequestGetEnrollmentSummary
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestGetEnrollmentSummary() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestGetEnrollmentSummary{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestGetEnrollmentSummary(structType interface{}) BACnetConfirmedServiceRequestGetEnrollmentSummary {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestGetEnrollmentSummary {
-        if sBACnetConfirmedServiceRequestGetEnrollmentSummary, ok := typ.(BACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
-            return sBACnetConfirmedServiceRequestGetEnrollmentSummary
+        if casted, ok := typ.(BACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestGetEnrollmentSummary, ok := typ.(*BACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
-            return *sBACnetConfirmedServiceRequestGetEnrollmentSummary
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestGetEnrollmentSummary(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestGetEnrollmentSummary(casted.Child)
         }
         return BACnetConfirmedServiceRequestGetEnrollmentSummary{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestGetEnrollmentSummaryParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestGetEnrollmentSummaryParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestGetEnrollmentSummary(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestGetEnrollmentSummary{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) UnmarshalXML(d *xml.
     }
 }
 
-func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestGetEnrollmentSummary) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestGetEnrollmentSummary"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
index 3cea7ab..eb6f15a 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestGetEventInformation struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestGetEventInformation
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestGetEventInformation interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestGetEventInformation) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestGetEventInformation) ServiceChoice() uint8 {
     return 0x1D
 }
 
-func (m BACnetConfirmedServiceRequestGetEventInformation) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestGetEventInformation() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestGetEventInformation{}
+func (m *BACnetConfirmedServiceRequestGetEventInformation) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestGetEventInformation(structType interface{}) IBACnetConfirmedServiceRequestGetEventInformation {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestGetEventInformation {
-        if iBACnetConfirmedServiceRequestGetEventInformation, ok := typ.(IBACnetConfirmedServiceRequestGetEventInformation); ok {
-            return iBACnetConfirmedServiceRequestGetEventInformation
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestGetEventInformation() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestGetEventInformation{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestGetEventInformation(structType interface{}) BACnetConfirmedServiceRequestGetEventInformation {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestGetEventInformation {
-        if sBACnetConfirmedServiceRequestGetEventInformation, ok := typ.(BACnetConfirmedServiceRequestGetEventInformation); ok {
-            return sBACnetConfirmedServiceRequestGetEventInformation
+        if casted, ok := typ.(BACnetConfirmedServiceRequestGetEventInformation); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestGetEventInformation, ok := typ.(*BACnetConfirmedServiceRequestGetEventInformation); ok {
-            return *sBACnetConfirmedServiceRequestGetEventInformation
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestGetEventInformation); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestGetEventInformation(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestGetEventInformation(casted.Child)
         }
         return BACnetConfirmedServiceRequestGetEventInformation{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestGetEventInformation) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestGetEventInformation) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestGetEventInformation) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestGetEventInformation) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestGetEventInformationParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestGetEventInformationParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestGetEventInformation(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestGetEventInformation{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestGetEventInformation) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestGetEventInformation) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestGetEventInformation) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestGetEventInformation) UnmarshalXML(d *xml.D
     }
 }
 
-func (m BACnetConfirmedServiceRequestGetEventInformation) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestGetEventInformation) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestGetEventInformation"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
index 0263921..9c2f07d 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestLifeSafetyOperation struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestLifeSafetyOperation
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestLifeSafetyOperation interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestLifeSafetyOperation) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) ServiceChoice() uint8 {
     return 0x1B
 }
 
-func (m BACnetConfirmedServiceRequestLifeSafetyOperation) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestLifeSafetyOperation() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestLifeSafetyOperation{}
+func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestLifeSafetyOperation(structType interface{}) IBACnetConfirmedServiceRequestLifeSafetyOperation {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestLifeSafetyOperation {
-        if iBACnetConfirmedServiceRequestLifeSafetyOperation, ok := typ.(IBACnetConfirmedServiceRequestLifeSafetyOperation); ok {
-            return iBACnetConfirmedServiceRequestLifeSafetyOperation
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestLifeSafetyOperation() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestLifeSafetyOperation{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestLifeSafetyOperation(structType interface{}) BACnetConfirmedServiceRequestLifeSafetyOperation {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestLifeSafetyOperation {
-        if sBACnetConfirmedServiceRequestLifeSafetyOperation, ok := typ.(BACnetConfirmedServiceRequestLifeSafetyOperation); ok {
-            return sBACnetConfirmedServiceRequestLifeSafetyOperation
+        if casted, ok := typ.(BACnetConfirmedServiceRequestLifeSafetyOperation); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestLifeSafetyOperation, ok := typ.(*BACnetConfirmedServiceRequestLifeSafetyOperation); ok {
-            return *sBACnetConfirmedServiceRequestLifeSafetyOperation
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestLifeSafetyOperation); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestLifeSafetyOperation(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestLifeSafetyOperation(casted.Child)
         }
         return BACnetConfirmedServiceRequestLifeSafetyOperation{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestLifeSafetyOperation) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestLifeSafetyOperation) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestLifeSafetyOperationParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestLifeSafetyOperationParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestLifeSafetyOperation(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestLifeSafetyOperation{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestLifeSafetyOperation) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) UnmarshalXML(d *xml.D
     }
 }
 
-func (m BACnetConfirmedServiceRequestLifeSafetyOperation) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestLifeSafetyOperation) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestLifeSafetyOperation"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
index 4cdb3d3..693c5b7 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
@@ -23,7 +23,6 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
     "strconv"
 )
@@ -38,53 +37,61 @@ type BACnetConfirmedServiceRequestReadProperty struct {
     ObjectInstanceNumber uint32
     PropertyIdentifierLength uint8
     PropertyIdentifier []int8
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestReadProperty
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestReadProperty interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestReadProperty) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestReadProperty) ServiceChoice() uint8 {
     return 0x0C
 }
 
-func (m BACnetConfirmedServiceRequestReadProperty) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestReadProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8) BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestReadProperty{ObjectType: objectType, ObjectInstanceNumber: objectInstanceNumber, PropertyIdentifierLength: propertyIdentifierLength, PropertyIdentifier: propertyIdentifier}
+func (m *BACnetConfirmedServiceRequestReadProperty) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestReadProperty(structType interface{}) IBACnetConfirmedServiceRequestReadProperty {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReadProperty {
-        if iBACnetConfirmedServiceRequestReadProperty, ok := typ.(IBACnetConfirmedServiceRequestReadProperty); ok {
-            return iBACnetConfirmedServiceRequestReadProperty
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestReadProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8, ) *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestReadProperty{
+        ObjectType: objectType,
+        ObjectInstanceNumber: objectInstanceNumber,
+        PropertyIdentifierLength: propertyIdentifierLength,
+        PropertyIdentifier: propertyIdentifier,
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestReadProperty(structType interface{}) BACnetConfirmedServiceRequestReadProperty {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReadProperty {
-        if sBACnetConfirmedServiceRequestReadProperty, ok := typ.(BACnetConfirmedServiceRequestReadProperty); ok {
-            return sBACnetConfirmedServiceRequestReadProperty
+        if casted, ok := typ.(BACnetConfirmedServiceRequestReadProperty); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestReadProperty, ok := typ.(*BACnetConfirmedServiceRequestReadProperty); ok {
-            return *sBACnetConfirmedServiceRequestReadProperty
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestReadProperty); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReadProperty(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReadProperty(casted.Child)
         }
         return BACnetConfirmedServiceRequestReadProperty{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestReadProperty) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestReadProperty) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Const Field (objectIdentifierHeader)
     lengthInBits += 8
@@ -109,11 +116,11 @@ func (m BACnetConfirmedServiceRequestReadProperty) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestReadProperty) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestReadProperty) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestReadPropertyParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestReadPropertyParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
     // Const Field (objectIdentifierHeader)
     objectIdentifierHeader, _objectIdentifierHeaderErr := io.ReadUint8(8)
@@ -155,7 +162,6 @@ func BACnetConfirmedServiceRequestReadPropertyParse(io *utils.ReadBuffer) (BACne
     // Count array
     propertyIdentifier := make([]int8, propertyIdentifierLength)
     for curItem := uint16(0); curItem < uint16(propertyIdentifierLength); curItem++ {
-
         _item, _err := io.ReadInt8(8)
         if _err != nil {
             return nil, errors.New("Error parsing 'propertyIdentifier' field " + _err.Error())
@@ -163,11 +169,19 @@ func BACnetConfirmedServiceRequestReadPropertyParse(io *utils.ReadBuffer) (BACne
         propertyIdentifier[curItem] = _item
     }
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestReadProperty(objectType, objectInstanceNumber, propertyIdentifierLength, propertyIdentifier), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestReadProperty{
+        ObjectType: objectType,
+        ObjectInstanceNumber: objectInstanceNumber,
+        PropertyIdentifierLength: propertyIdentifierLength,
+        PropertyIdentifier: propertyIdentifier,
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestReadProperty) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestReadProperty) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Const Field (objectIdentifierHeader)
@@ -215,7 +229,7 @@ func (m BACnetConfirmedServiceRequestReadProperty) Serialize(io utils.WriteBuffe
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestReadProperty) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -265,7 +279,7 @@ func (m *BACnetConfirmedServiceRequestReadProperty) UnmarshalXML(d *xml.Decoder,
     }
 }
 
-func (m BACnetConfirmedServiceRequestReadProperty) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestReadProperty) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReadProperty"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
index 297f7de..12c0233 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestReadPropertyMultiple struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestReadPropertyMultiple
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestReadPropertyMultiple interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestReadPropertyMultiple) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) ServiceChoice() uint8 {
     return 0x0E
 }
 
-func (m BACnetConfirmedServiceRequestReadPropertyMultiple) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestReadPropertyMultiple() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestReadPropertyMultiple{}
+func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestReadPropertyMultiple(structType interface{}) IBACnetConfirmedServiceRequestReadPropertyMultiple {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReadPropertyMultiple {
-        if iBACnetConfirmedServiceRequestReadPropertyMultiple, ok := typ.(IBACnetConfirmedServiceRequestReadPropertyMultiple); ok {
-            return iBACnetConfirmedServiceRequestReadPropertyMultiple
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestReadPropertyMultiple() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestReadPropertyMultiple{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestReadPropertyMultiple(structType interface{}) BACnetConfirmedServiceRequestReadPropertyMultiple {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReadPropertyMultiple {
-        if sBACnetConfirmedServiceRequestReadPropertyMultiple, ok := typ.(BACnetConfirmedServiceRequestReadPropertyMultiple); ok {
-            return sBACnetConfirmedServiceRequestReadPropertyMultiple
+        if casted, ok := typ.(BACnetConfirmedServiceRequestReadPropertyMultiple); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestReadPropertyMultiple, ok := typ.(*BACnetConfirmedServiceRequestReadPropertyMultiple); ok {
-            return *sBACnetConfirmedServiceRequestReadPropertyMultiple
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestReadPropertyMultiple); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReadPropertyMultiple(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReadPropertyMultiple(casted.Child)
         }
         return BACnetConfirmedServiceRequestReadPropertyMultiple{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestReadPropertyMultiple) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestReadPropertyMultiple) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestReadPropertyMultipleParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestReadPropertyMultipleParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestReadPropertyMultiple(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestReadPropertyMultiple{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestReadPropertyMultiple) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) UnmarshalXML(d *xml.
     }
 }
 
-func (m BACnetConfirmedServiceRequestReadPropertyMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestReadPropertyMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReadPropertyMultiple"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
index 769476b..f3e2d9c 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestReadRange struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestReadRange
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestReadRange interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestReadRange) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestReadRange) ServiceChoice() uint8 {
     return 0x1A
 }
 
-func (m BACnetConfirmedServiceRequestReadRange) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestReadRange() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestReadRange{}
+func (m *BACnetConfirmedServiceRequestReadRange) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestReadRange(structType interface{}) IBACnetConfirmedServiceRequestReadRange {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReadRange {
-        if iBACnetConfirmedServiceRequestReadRange, ok := typ.(IBACnetConfirmedServiceRequestReadRange); ok {
-            return iBACnetConfirmedServiceRequestReadRange
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestReadRange() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestReadRange{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestReadRange(structType interface{}) BACnetConfirmedServiceRequestReadRange {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReadRange {
-        if sBACnetConfirmedServiceRequestReadRange, ok := typ.(BACnetConfirmedServiceRequestReadRange); ok {
-            return sBACnetConfirmedServiceRequestReadRange
+        if casted, ok := typ.(BACnetConfirmedServiceRequestReadRange); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestReadRange, ok := typ.(*BACnetConfirmedServiceRequestReadRange); ok {
-            return *sBACnetConfirmedServiceRequestReadRange
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestReadRange); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReadRange(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReadRange(casted.Child)
         }
         return BACnetConfirmedServiceRequestReadRange{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestReadRange) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestReadRange) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestReadRange) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestReadRange) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestReadRangeParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestReadRangeParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestReadRange(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestReadRange{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestReadRange) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestReadRange) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestReadRange) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestReadRange) UnmarshalXML(d *xml.Decoder, st
     }
 }
 
-func (m BACnetConfirmedServiceRequestReadRange) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestReadRange) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReadRange"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
index 8f651fe..7f308e2 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestReinitializeDevice struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestReinitializeDevice
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestReinitializeDevice interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestReinitializeDevice) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestReinitializeDevice) ServiceChoice() uint8 {
     return 0x14
 }
 
-func (m BACnetConfirmedServiceRequestReinitializeDevice) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestReinitializeDevice() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestReinitializeDevice{}
+func (m *BACnetConfirmedServiceRequestReinitializeDevice) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestReinitializeDevice(structType interface{}) IBACnetConfirmedServiceRequestReinitializeDevice {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReinitializeDevice {
-        if iBACnetConfirmedServiceRequestReinitializeDevice, ok := typ.(IBACnetConfirmedServiceRequestReinitializeDevice); ok {
-            return iBACnetConfirmedServiceRequestReinitializeDevice
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestReinitializeDevice() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestReinitializeDevice{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestReinitializeDevice(structType interface{}) BACnetConfirmedServiceRequestReinitializeDevice {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReinitializeDevice {
-        if sBACnetConfirmedServiceRequestReinitializeDevice, ok := typ.(BACnetConfirmedServiceRequestReinitializeDevice); ok {
-            return sBACnetConfirmedServiceRequestReinitializeDevice
+        if casted, ok := typ.(BACnetConfirmedServiceRequestReinitializeDevice); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestReinitializeDevice, ok := typ.(*BACnetConfirmedServiceRequestReinitializeDevice); ok {
-            return *sBACnetConfirmedServiceRequestReinitializeDevice
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestReinitializeDevice); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReinitializeDevice(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestReinitializeDevice(casted.Child)
         }
         return BACnetConfirmedServiceRequestReinitializeDevice{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestReinitializeDevice) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestReinitializeDevice) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestReinitializeDevice) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestReinitializeDevice) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestReinitializeDeviceParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestReinitializeDeviceParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestReinitializeDevice(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestReinitializeDevice{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestReinitializeDevice) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestReinitializeDevice) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestReinitializeDevice) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestReinitializeDevice) UnmarshalXML(d *xml.De
     }
 }
 
-func (m BACnetConfirmedServiceRequestReinitializeDevice) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestReinitializeDevice) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestReinitializeDevice"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
index ab7e182..43d2822 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestRemoveListElement struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestRemoveListElement
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestRemoveListElement interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestRemoveListElement) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestRemoveListElement) ServiceChoice() uint8 {
     return 0x09
 }
 
-func (m BACnetConfirmedServiceRequestRemoveListElement) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestRemoveListElement() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestRemoveListElement{}
+func (m *BACnetConfirmedServiceRequestRemoveListElement) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestRemoveListElement(structType interface{}) IBACnetConfirmedServiceRequestRemoveListElement {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemoveListElement {
-        if iBACnetConfirmedServiceRequestRemoveListElement, ok := typ.(IBACnetConfirmedServiceRequestRemoveListElement); ok {
-            return iBACnetConfirmedServiceRequestRemoveListElement
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestRemoveListElement() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestRemoveListElement{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestRemoveListElement(structType interface{}) BACnetConfirmedServiceRequestRemoveListElement {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemoveListElement {
-        if sBACnetConfirmedServiceRequestRemoveListElement, ok := typ.(BACnetConfirmedServiceRequestRemoveListElement); ok {
-            return sBACnetConfirmedServiceRequestRemoveListElement
+        if casted, ok := typ.(BACnetConfirmedServiceRequestRemoveListElement); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestRemoveListElement, ok := typ.(*BACnetConfirmedServiceRequestRemoveListElement); ok {
-            return *sBACnetConfirmedServiceRequestRemoveListElement
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestRemoveListElement); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemoveListElement(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemoveListElement(casted.Child)
         }
         return BACnetConfirmedServiceRequestRemoveListElement{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestRemoveListElement) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestRemoveListElement) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestRemoveListElement) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestRemoveListElement) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestRemoveListElementParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestRemoveListElementParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestRemoveListElement(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestRemoveListElement{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestRemoveListElement) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestRemoveListElement) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestRemoveListElement) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestRemoveListElement) UnmarshalXML(d *xml.Dec
     }
 }
 
-func (m BACnetConfirmedServiceRequestRemoveListElement) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestRemoveListElement) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemoveListElement"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
index 99675df..ee5ff9b 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestRemovedAuthenticate struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestRemovedAuthenticate
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestRemovedAuthenticate interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestRemovedAuthenticate) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) ServiceChoice() uint8 {
     return 0x18
 }
 
-func (m BACnetConfirmedServiceRequestRemovedAuthenticate) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestRemovedAuthenticate() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestRemovedAuthenticate{}
+func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestRemovedAuthenticate(structType interface{}) IBACnetConfirmedServiceRequestRemovedAuthenticate {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemovedAuthenticate {
-        if iBACnetConfirmedServiceRequestRemovedAuthenticate, ok := typ.(IBACnetConfirmedServiceRequestRemovedAuthenticate); ok {
-            return iBACnetConfirmedServiceRequestRemovedAuthenticate
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestRemovedAuthenticate() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestRemovedAuthenticate{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestRemovedAuthenticate(structType interface{}) BACnetConfirmedServiceRequestRemovedAuthenticate {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemovedAuthenticate {
-        if sBACnetConfirmedServiceRequestRemovedAuthenticate, ok := typ.(BACnetConfirmedServiceRequestRemovedAuthenticate); ok {
-            return sBACnetConfirmedServiceRequestRemovedAuthenticate
+        if casted, ok := typ.(BACnetConfirmedServiceRequestRemovedAuthenticate); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestRemovedAuthenticate, ok := typ.(*BACnetConfirmedServiceRequestRemovedAuthenticate); ok {
-            return *sBACnetConfirmedServiceRequestRemovedAuthenticate
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestRemovedAuthenticate); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemovedAuthenticate(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemovedAuthenticate(casted.Child)
         }
         return BACnetConfirmedServiceRequestRemovedAuthenticate{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestRemovedAuthenticate) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestRemovedAuthenticate) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestRemovedAuthenticateParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestRemovedAuthenticateParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestRemovedAuthenticate(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestRemovedAuthenticate{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestRemovedAuthenticate) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) UnmarshalXML(d *xml.D
     }
 }
 
-func (m BACnetConfirmedServiceRequestRemovedAuthenticate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestRemovedAuthenticate) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemovedAuthenticate"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
index a06de7e..67ca727 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestRemovedReadPropertyConditional struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestRemovedReadPropertyConditional
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestRemovedReadPropertyConditional interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) ServiceChoice() uint8 {
     return 0x0D
 }
 
-func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestRemovedReadPropertyConditional() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestRemovedReadPropertyConditional{}
+func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestRemovedReadPropertyConditional(structType interface{}) IBACnetConfirmedServiceRequestRemovedReadPropertyConditional {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemovedReadPropertyConditional {
-        if iBACnetConfirmedServiceRequestRemovedReadPropertyConditional, ok := typ.(IBACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
-            return iBACnetConfirmedServiceRequestRemovedReadPropertyConditional
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestRemovedReadPropertyConditional() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestRemovedReadPropertyConditional{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestRemovedReadPropertyConditional(structType interface{}) BACnetConfirmedServiceRequestRemovedReadPropertyConditional {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemovedReadPropertyConditional {
-        if sBACnetConfirmedServiceRequestRemovedReadPropertyConditional, ok := typ.(BACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
-            return sBACnetConfirmedServiceRequestRemovedReadPropertyConditional
+        if casted, ok := typ.(BACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestRemovedReadPropertyConditional, ok := typ.(*BACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
-            return *sBACnetConfirmedServiceRequestRemovedReadPropertyConditional
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemovedReadPropertyConditional(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemovedReadPropertyConditional(casted.Child)
         }
         return BACnetConfirmedServiceRequestRemovedReadPropertyConditional{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestRemovedReadPropertyConditionalParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestRemovedReadPropertyConditionalParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestRemovedReadPropertyConditional(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestRemovedReadPropertyConditional{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) UnmarshalX
     }
 }
 
-func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestRemovedReadPropertyConditional) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemovedReadPropertyConditional"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
index f328ed2..2c1a057 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestRemovedRequestKey struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestRemovedRequestKey
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestRemovedRequestKey interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestRemovedRequestKey) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestRemovedRequestKey) ServiceChoice() uint8 {
     return 0x19
 }
 
-func (m BACnetConfirmedServiceRequestRemovedRequestKey) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestRemovedRequestKey() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestRemovedRequestKey{}
+func (m *BACnetConfirmedServiceRequestRemovedRequestKey) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestRemovedRequestKey(structType interface{}) IBACnetConfirmedServiceRequestRemovedRequestKey {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemovedRequestKey {
-        if iBACnetConfirmedServiceRequestRemovedRequestKey, ok := typ.(IBACnetConfirmedServiceRequestRemovedRequestKey); ok {
-            return iBACnetConfirmedServiceRequestRemovedRequestKey
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestRemovedRequestKey() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestRemovedRequestKey{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestRemovedRequestKey(structType interface{}) BACnetConfirmedServiceRequestRemovedRequestKey {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemovedRequestKey {
-        if sBACnetConfirmedServiceRequestRemovedRequestKey, ok := typ.(BACnetConfirmedServiceRequestRemovedRequestKey); ok {
-            return sBACnetConfirmedServiceRequestRemovedRequestKey
+        if casted, ok := typ.(BACnetConfirmedServiceRequestRemovedRequestKey); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestRemovedRequestKey, ok := typ.(*BACnetConfirmedServiceRequestRemovedRequestKey); ok {
-            return *sBACnetConfirmedServiceRequestRemovedRequestKey
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestRemovedRequestKey); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemovedRequestKey(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestRemovedRequestKey(casted.Child)
         }
         return BACnetConfirmedServiceRequestRemovedRequestKey{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestRemovedRequestKey) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestRemovedRequestKey) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestRemovedRequestKey) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestRemovedRequestKey) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestRemovedRequestKeyParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestRemovedRequestKeyParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestRemovedRequestKey(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestRemovedRequestKey{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestRemovedRequestKey) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestRemovedRequestKey) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestRemovedRequestKey) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestRemovedRequestKey) UnmarshalXML(d *xml.Dec
     }
 }
 
-func (m BACnetConfirmedServiceRequestRemovedRequestKey) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestRemovedRequestKey) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestRemovedRequestKey"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
index c216254..1c41a28 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
@@ -23,7 +23,6 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
     "strconv"
 )
@@ -43,53 +42,63 @@ type BACnetConfirmedServiceRequestSubscribeCOV struct {
     IssueConfirmedNotifications bool
     LifetimeLength uint8
     LifetimeSeconds []int8
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestSubscribeCOV
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestSubscribeCOV interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestSubscribeCOV) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestSubscribeCOV) ServiceChoice() uint8 {
     return 0x05
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOV) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestSubscribeCOV(subscriberProcessIdentifier uint8, monitoredObjectType uint16, monitoredObjectInstanceNumber uint32, issueConfirmedNotifications bool, lifetimeLength uint8, lifetimeSeconds []int8) BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestSubscribeCOV{SubscriberProcessIdentifier: subscriberProcessIdentifier, MonitoredObjectType: monitoredObjectType, MonitoredObjectInstanceNumber: monitoredObjectInstanceNumber, IssueConfirmedNotifications: issueConfirmedNotifications, LifetimeLength: lifetimeLength, LifetimeSeconds: lifetimeSeconds}
+func (m *BACnetConfirmedServiceRequestSubscribeCOV) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestSubscribeCOV(structType interface{}) IBACnetConfirmedServiceRequestSubscribeCOV {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestSubscribeCOV {
-        if iBACnetConfirmedServiceRequestSubscribeCOV, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOV); ok {
-            return iBACnetConfirmedServiceRequestSubscribeCOV
-        }
-        return nil
-    }
-    return castFunc(structType)
+func NewBACnetConfirmedServiceRequestSubscribeCOV(subscriberProcessIdentifier uint8, monitoredObjectType uint16, monitoredObjectInstanceNumber uint32, issueConfirmedNotifications bool, lifetimeLength uint8, lifetimeSeconds []int8, ) *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestSubscribeCOV{
+        SubscriberProcessIdentifier: subscriberProcessIdentifier,
+        MonitoredObjectType: monitoredObjectType,
+        MonitoredObjectInstanceNumber: monitoredObjectInstanceNumber,
+        IssueConfirmedNotifications: issueConfirmedNotifications,
+        LifetimeLength: lifetimeLength,
+        LifetimeSeconds: lifetimeSeconds,
+        Parent: NewBACnetConfirmedServiceRequest(),
+    }
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestSubscribeCOV(structType interface{}) BACnetConfirmedServiceRequestSubscribeCOV {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestSubscribeCOV {
-        if sBACnetConfirmedServiceRequestSubscribeCOV, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOV); ok {
-            return sBACnetConfirmedServiceRequestSubscribeCOV
+        if casted, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOV); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestSubscribeCOV, ok := typ.(*BACnetConfirmedServiceRequestSubscribeCOV); ok {
-            return *sBACnetConfirmedServiceRequestSubscribeCOV
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestSubscribeCOV); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestSubscribeCOV(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestSubscribeCOV(casted.Child)
         }
         return BACnetConfirmedServiceRequestSubscribeCOV{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOV) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestSubscribeCOV) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Const Field (subscriberProcessIdentifierHeader)
     lengthInBits += 8
@@ -129,11 +138,11 @@ func (m BACnetConfirmedServiceRequestSubscribeCOV) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOV) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestSubscribeCOV) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestSubscribeCOVParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestSubscribeCOVParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
     // Const Field (subscriberProcessIdentifierHeader)
     subscriberProcessIdentifierHeader, _subscriberProcessIdentifierHeaderErr := io.ReadUint8(8)
@@ -214,7 +223,6 @@ func BACnetConfirmedServiceRequestSubscribeCOVParse(io *utils.ReadBuffer) (BACne
     // Count array
     lifetimeSeconds := make([]int8, lifetimeLength)
     for curItem := uint16(0); curItem < uint16(lifetimeLength); curItem++ {
-
         _item, _err := io.ReadInt8(8)
         if _err != nil {
             return nil, errors.New("Error parsing 'lifetimeSeconds' field " + _err.Error())
@@ -222,11 +230,21 @@ func BACnetConfirmedServiceRequestSubscribeCOVParse(io *utils.ReadBuffer) (BACne
         lifetimeSeconds[curItem] = _item
     }
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestSubscribeCOV(subscriberProcessIdentifier, monitoredObjectType, monitoredObjectInstanceNumber, issueConfirmedNotifications, lifetimeLength, lifetimeSeconds), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestSubscribeCOV{
+        SubscriberProcessIdentifier: subscriberProcessIdentifier,
+        MonitoredObjectType: monitoredObjectType,
+        MonitoredObjectInstanceNumber: monitoredObjectInstanceNumber,
+        IssueConfirmedNotifications: issueConfirmedNotifications,
+        LifetimeLength: lifetimeLength,
+        LifetimeSeconds: lifetimeSeconds,
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOV) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestSubscribeCOV) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Const Field (subscriberProcessIdentifierHeader)
@@ -306,7 +324,7 @@ func (m BACnetConfirmedServiceRequestSubscribeCOV) Serialize(io utils.WriteBuffe
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestSubscribeCOV) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -368,7 +386,7 @@ func (m *BACnetConfirmedServiceRequestSubscribeCOV) UnmarshalXML(d *xml.Decoder,
     }
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOV) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestSubscribeCOV) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestSubscribeCOV"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
index 9fa3b21..6e588dd 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestSubscribeCOVProperty struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestSubscribeCOVProperty
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestSubscribeCOVProperty interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) ServiceChoice() uint8 {
     return 0x1C
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestSubscribeCOVProperty() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestSubscribeCOVProperty{}
+func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestSubscribeCOVProperty(structType interface{}) IBACnetConfirmedServiceRequestSubscribeCOVProperty {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestSubscribeCOVProperty {
-        if iBACnetConfirmedServiceRequestSubscribeCOVProperty, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
-            return iBACnetConfirmedServiceRequestSubscribeCOVProperty
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestSubscribeCOVProperty() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestSubscribeCOVProperty{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestSubscribeCOVProperty(structType interface{}) BACnetConfirmedServiceRequestSubscribeCOVProperty {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestSubscribeCOVProperty {
-        if sBACnetConfirmedServiceRequestSubscribeCOVProperty, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
-            return sBACnetConfirmedServiceRequestSubscribeCOVProperty
+        if casted, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestSubscribeCOVProperty, ok := typ.(*BACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
-            return *sBACnetConfirmedServiceRequestSubscribeCOVProperty
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestSubscribeCOVProperty(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestSubscribeCOVProperty(casted.Child)
         }
         return BACnetConfirmedServiceRequestSubscribeCOVProperty{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestSubscribeCOVPropertyParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestSubscribeCOVPropertyParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestSubscribeCOVProperty(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestSubscribeCOVProperty{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) UnmarshalXML(d *xml.
     }
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestSubscribeCOVProperty) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestSubscribeCOVProperty"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
index e51609b..92abee5 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) ServiceChoice() uint8 {
     return 0x1E
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple{}
+func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple(structType interface{}) IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
-        if iBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
-            return iBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple(structType interface{}) BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
-        if sBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
-            return sBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple
+        if casted, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple, ok := typ.(*BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
-            return *sBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple(casted.Child)
         }
         return BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestSubscribeCOVPropertyMultipleParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestSubscribeCOVPropertyMultipleParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) UnmarshalXML
     }
 }
 
-func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
index 314ec12..6064dba 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestVTClose struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestVTClose
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestVTClose interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestVTClose) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestVTClose) ServiceChoice() uint8 {
     return 0x16
 }
 
-func (m BACnetConfirmedServiceRequestVTClose) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestVTClose() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestVTClose{}
+func (m *BACnetConfirmedServiceRequestVTClose) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestVTClose(structType interface{}) IBACnetConfirmedServiceRequestVTClose {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestVTClose {
-        if iBACnetConfirmedServiceRequestVTClose, ok := typ.(IBACnetConfirmedServiceRequestVTClose); ok {
-            return iBACnetConfirmedServiceRequestVTClose
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestVTClose() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestVTClose{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestVTClose(structType interface{}) BACnetConfirmedServiceRequestVTClose {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestVTClose {
-        if sBACnetConfirmedServiceRequestVTClose, ok := typ.(BACnetConfirmedServiceRequestVTClose); ok {
-            return sBACnetConfirmedServiceRequestVTClose
+        if casted, ok := typ.(BACnetConfirmedServiceRequestVTClose); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestVTClose, ok := typ.(*BACnetConfirmedServiceRequestVTClose); ok {
-            return *sBACnetConfirmedServiceRequestVTClose
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestVTClose); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestVTClose(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestVTClose(casted.Child)
         }
         return BACnetConfirmedServiceRequestVTClose{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestVTClose) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestVTClose) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestVTClose) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestVTClose) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestVTCloseParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestVTCloseParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestVTClose(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestVTClose{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestVTClose) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestVTClose) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestVTClose) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestVTClose) UnmarshalXML(d *xml.Decoder, star
     }
 }
 
-func (m BACnetConfirmedServiceRequestVTClose) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestVTClose) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestVTClose"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
index 1124886..20fb783 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestVTData struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestVTData
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestVTData interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestVTData) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestVTData) ServiceChoice() uint8 {
     return 0x17
 }
 
-func (m BACnetConfirmedServiceRequestVTData) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestVTData() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestVTData{}
+func (m *BACnetConfirmedServiceRequestVTData) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestVTData(structType interface{}) IBACnetConfirmedServiceRequestVTData {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestVTData {
-        if iBACnetConfirmedServiceRequestVTData, ok := typ.(IBACnetConfirmedServiceRequestVTData); ok {
-            return iBACnetConfirmedServiceRequestVTData
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestVTData() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestVTData{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestVTData(structType interface{}) BACnetConfirmedServiceRequestVTData {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestVTData {
-        if sBACnetConfirmedServiceRequestVTData, ok := typ.(BACnetConfirmedServiceRequestVTData); ok {
-            return sBACnetConfirmedServiceRequestVTData
+        if casted, ok := typ.(BACnetConfirmedServiceRequestVTData); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestVTData, ok := typ.(*BACnetConfirmedServiceRequestVTData); ok {
-            return *sBACnetConfirmedServiceRequestVTData
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestVTData); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestVTData(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestVTData(casted.Child)
         }
         return BACnetConfirmedServiceRequestVTData{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestVTData) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestVTData) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestVTData) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestVTData) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestVTDataParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestVTDataParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestVTData(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestVTData{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestVTData) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestVTData) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestVTData) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestVTData) UnmarshalXML(d *xml.Decoder, start
     }
 }
 
-func (m BACnetConfirmedServiceRequestVTData) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestVTData) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestVTData"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
index b22736d..b1afb19 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
@@ -21,79 +21,86 @@ package model
 import (
     "encoding/xml"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
 )
 
 // The data-structure of this message
 type BACnetConfirmedServiceRequestVTOpen struct {
-    BACnetConfirmedServiceRequest
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestVTOpen
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestVTOpen interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestVTOpen) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestVTOpen) ServiceChoice() uint8 {
     return 0x15
 }
 
-func (m BACnetConfirmedServiceRequestVTOpen) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestVTOpen() BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestVTOpen{}
+func (m *BACnetConfirmedServiceRequestVTOpen) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestVTOpen(structType interface{}) IBACnetConfirmedServiceRequestVTOpen {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestVTOpen {
-        if iBACnetConfirmedServiceRequestVTOpen, ok := typ.(IBACnetConfirmedServiceRequestVTOpen); ok {
-            return iBACnetConfirmedServiceRequestVTOpen
-        }
-        return nil
+func NewBACnetConfirmedServiceRequestVTOpen() *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestVTOpen{
+        Parent: NewBACnetConfirmedServiceRequest(),
     }
-    return castFunc(structType)
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestVTOpen(structType interface{}) BACnetConfirmedServiceRequestVTOpen {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestVTOpen {
-        if sBACnetConfirmedServiceRequestVTOpen, ok := typ.(BACnetConfirmedServiceRequestVTOpen); ok {
-            return sBACnetConfirmedServiceRequestVTOpen
+        if casted, ok := typ.(BACnetConfirmedServiceRequestVTOpen); ok {
+            return casted
         }
-        if sBACnetConfirmedServiceRequestVTOpen, ok := typ.(*BACnetConfirmedServiceRequestVTOpen); ok {
-            return *sBACnetConfirmedServiceRequestVTOpen
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestVTOpen); ok {
+            return *casted
+        }
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestVTOpen(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestVTOpen(casted.Child)
         }
         return BACnetConfirmedServiceRequestVTOpen{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestVTOpen) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestVTOpen) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestVTOpen) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestVTOpen) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestVTOpenParse(io *utils.ReadBuffer) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestVTOpenParse(io *utils.ReadBuffer) (*BACnetConfirmedServiceRequest, error) {
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestVTOpen(), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestVTOpen{
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestVTOpen) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestVTOpen) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestVTOpen) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -114,7 +121,7 @@ func (m *BACnetConfirmedServiceRequestVTOpen) UnmarshalXML(d *xml.Decoder, start
     }
 }
 
-func (m BACnetConfirmedServiceRequestVTOpen) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
+func (m *BACnetConfirmedServiceRequestVTOpen) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
     if err := e.EncodeToken(xml.StartElement{Name: start.Name, Attr: []xml.Attr{
             {Name: xml.Name{Local: "className"}, Value: "org.apache.plc4x.java.bacnetip.readwrite.BACnetConfirmedServiceRequestVTOpen"},
         }}); err != nil {
diff --git a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
index e4331c3..7fe04df 100644
--- a/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
+++ b/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
@@ -23,9 +23,7 @@ import (
     "encoding/xml"
     "errors"
     "io"
-    "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/spi"
     "plc4x.apache.org/plc4go-modbus-driver/v0/internal/plc4go/utils"
-    "reflect"
     "strconv"
 )
 
@@ -41,55 +39,65 @@ type BACnetConfirmedServiceRequestWriteProperty struct {
     ObjectInstanceNumber uint32
     PropertyIdentifierLength uint8
     PropertyIdentifier []int8
-    Value IBACnetTag
-    Priority *IBACnetTag
-    BACnetConfirmedServiceRequest
+    Value *BACnetTag
+    Priority *BACnetTag
+    Parent *BACnetConfirmedServiceRequest
+    IBACnetConfirmedServiceRequestWriteProperty
 }
 
 // The corresponding interface
 type IBACnetConfirmedServiceRequestWriteProperty interface {
-    IBACnetConfirmedServiceRequest
+    LengthInBytes() uint16
+    LengthInBits() uint16
     Serialize(io utils.WriteBuffer) error
 }
 
+///////////////////////////////////////////////////////////
 // Accessors for discriminator values.
-func (m BACnetConfirmedServiceRequestWriteProperty) ServiceChoice() uint8 {
+///////////////////////////////////////////////////////////
+func (m *BACnetConfirmedServiceRequestWriteProperty) ServiceChoice() uint8 {
     return 0x0F
 }
 
-func (m BACnetConfirmedServiceRequestWriteProperty) initialize() spi.Message {
-    return m
-}
 
-func NewBACnetConfirmedServiceRequestWriteProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8, value IBACnetTag, priority *IBACnetTag) BACnetConfirmedServiceRequestInitializer {
-    return &BACnetConfirmedServiceRequestWriteProperty{ObjectType: objectType, ObjectInstanceNumber: objectInstanceNumber, PropertyIdentifierLength: propertyIdentifierLength, PropertyIdentifier: propertyIdentifier, Value: value, Priority: priority}
+func (m *BACnetConfirmedServiceRequestWriteProperty) InitializeParent(parent *BACnetConfirmedServiceRequest) {
 }
 
-func CastIBACnetConfirmedServiceRequestWriteProperty(structType interface{}) IBACnetConfirmedServiceRequestWriteProperty {
-    castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestWriteProperty {
-        if iBACnetConfirmedServiceRequestWriteProperty, ok := typ.(IBACnetConfirmedServiceRequestWriteProperty); ok {
-            return iBACnetConfirmedServiceRequestWriteProperty
-        }
-        return nil
-    }
-    return castFunc(structType)
+func NewBACnetConfirmedServiceRequestWriteProperty(objectType uint16, objectInstanceNumber uint32, propertyIdentifierLength uint8, propertyIdentifier []int8, value *BACnetTag, priority *BACnetTag, ) *BACnetConfirmedServiceRequest {
+    child := &BACnetConfirmedServiceRequestWriteProperty{
+        ObjectType: objectType,
+        ObjectInstanceNumber: objectInstanceNumber,
+        PropertyIdentifierLength: propertyIdentifierLength,
+        PropertyIdentifier: propertyIdentifier,
+        Value: value,
+        Priority: priority,
+        Parent: NewBACnetConfirmedServiceRequest(),
+    }
+    child.Parent.Child = child
+    return child.Parent
 }
 
 func CastBACnetConfirmedServiceRequestWriteProperty(structType interface{}) BACnetConfirmedServiceRequestWriteProperty {
     castFunc := func(typ interface{}) BACnetConfirmedServiceRequestWriteProperty {
-        if sBACnetConfirmedServiceRequestWriteProperty, ok := typ.(BACnetConfirmedServiceRequestWriteProperty); ok {
-            return sBACnetConfirmedServiceRequestWriteProperty
+        if casted, ok := typ.(BACnetConfirmedServiceRequestWriteProperty); ok {
+            return casted
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequestWriteProperty); ok {
+            return *casted
         }
-        if sBACnetConfirmedServiceRequestWriteProperty, ok := typ.(*BACnetConfirmedServiceRequestWriteProperty); ok {
-            return *sBACnetConfirmedServiceRequestWriteProperty
+        if casted, ok := typ.(BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestWriteProperty(casted.Child)
+        }
+        if casted, ok := typ.(*BACnetConfirmedServiceRequest); ok {
+            return CastBACnetConfirmedServiceRequestWriteProperty(casted.Child)
         }
         return BACnetConfirmedServiceRequestWriteProperty{}
     }
     return castFunc(structType)
 }
 
-func (m BACnetConfirmedServiceRequestWriteProperty) LengthInBits() uint16 {
-    var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
+func (m *BACnetConfirmedServiceRequestWriteProperty) LengthInBits() uint16 {
+    lengthInBits := uint16(0)
 
     // Const Field (objectIdentifierHeader)
     lengthInBits += 8
@@ -128,11 +136,11 @@ func (m BACnetConfirmedServiceRequestWriteProperty) LengthInBits() uint16 {
     return lengthInBits
 }
 
-func (m BACnetConfirmedServiceRequestWriteProperty) LengthInBytes() uint16 {
+func (m *BACnetConfirmedServiceRequestWriteProperty) LengthInBytes() uint16 {
     return m.LengthInBits() / 8
 }
 
-func BACnetConfirmedServiceRequestWritePropertyParse(io *utils.ReadBuffer, len uint16) (BACnetConfirmedServiceRequestInitializer, error) {
+func BACnetConfirmedServiceRequestWritePropertyParse(io *utils.ReadBuffer, len uint16) (*BACnetConfirmedServiceRequest, error) {
     var startPos = io.GetPos()
     var curPos uint16
 
@@ -176,7 +184,6 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io *utils.ReadBuffer, len u
     // Count array
     propertyIdentifier := make([]int8, propertyIdentifierLength)
     for curItem := uint16(0); curItem < uint16(propertyIdentifierLength); curItem++ {
-
         _item, _err := io.ReadInt8(8)
         if _err != nil {
             return nil, errors.New("Error parsing 'propertyIdentifier' field " + _err.Error())
@@ -194,14 +201,9 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io *utils.ReadBuffer, len u
     }
 
     // Simple Field (value)
-    _valueMessage, _err := BACnetTagParse(io)
-    if _err != nil {
-        return nil, errors.New("Error parsing simple field 'value'. " + _err.Error())
-    }
-    var value IBACnetTag
-    value, _valueOk := _valueMessage.(IBACnetTag)
-    if !_valueOk {
-        return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_valueMessage).Name() + " to IBACnetTag")
+    value, _valueErr := BACnetTagParse(io)
+    if _valueErr != nil {
+        return nil, errors.New("Error parsing 'value' field " + _valueErr.Error())
     }
 
     // Const Field (closingTag)
@@ -215,25 +217,30 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io *utils.ReadBuffer, len u
 
     // Optional Field (priority) (Can be skipped, if a given expression evaluates to false)
     curPos = io.GetPos() - startPos
-    var priority *IBACnetTag = nil
+    var priority *BACnetTag = nil
     if bool((curPos) < (((len) - ((1))))) {
         _message, _err := BACnetTagParse(io)
         if _err != nil {
             return nil, errors.New("Error parsing 'priority' field " + _err.Error())
         }
-        var _item IBACnetTag
-        _item, _ok := _message.(IBACnetTag)
-        if !_ok {
-            return nil, errors.New("Couldn't cast message of type " + reflect.TypeOf(_item).Name() + " to IBACnetTag")
-        }
-        priority = &_item
+        priority = _message
     }
 
-    // Create the instance
-    return NewBACnetConfirmedServiceRequestWriteProperty(objectType, objectInstanceNumber, propertyIdentifierLength, propertyIdentifier, value, priority), nil
+    // Create a partially initialized instance
+    _child := &BACnetConfirmedServiceRequestWriteProperty{
+        ObjectType: objectType,
+        ObjectInstanceNumber: objectInstanceNumber,
+        PropertyIdentifierLength: propertyIdentifierLength,
+        PropertyIdentifier: propertyIdentifier,
+        Value: value,
+        Priority: priority,
+        Parent: &BACnetConfirmedServiceRequest{},
+    }
+    _child.Parent.Child = _child
+    return _child.Parent, nil
 }
 
-func (m BACnetConfirmedServiceRequestWriteProperty) Serialize(io utils.WriteBuffer) error {
+func (m *BACnetConfirmedServiceRequestWriteProperty) Serialize(io utils.WriteBuffer) error {
     ser := func() error {
 
     // Const Field (objectIdentifierHeader)
@@ -286,8 +293,7 @@ func (m BACnetConfirmedServiceRequestWriteProperty) Serialize(io utils.WriteBuff
     }
 
     // Simple Field (value)
-    value := CastIBACnetTag(m.Value)
-    _valueErr := value.Serialize(io)
+    _valueErr := m.Value.Serialize(io)
     if _valueErr != nil {
         return errors.New("Error serializing 'value' field " + _valueErr.Error())
     }
@@ -299,10 +305,10 @@ func (m BACnetConfirmedServiceRequestWriteProperty) Serialize(io utils.WriteBuff
     }
 
     // Optional Field (priority) (Can be skipped, if the value is null)
-    var priority *IBACnetTag = nil
+    var priority *BACnetTag = nil
     if m.Priority != nil {
         priority = m.Priority
-        _priorityErr := CastIBACnetTag(*priority).Serialize(io)
+        _priorityErr := priority.Serialize(io)
         if _priorityErr != nil {
             return errors.New("Error serializing 'priority' field " + _priorityErr.Error())
         }
@@ -310,7 +316,7 @@ func (m BACnetConfirmedServiceRequestWriteProperty) Serialize(io utils.WriteBuff
 
         return nil
     }
-    return BACnetConfirmedServiceRequestSerialize(io, m.BACnetConfirmedServiceRequest, CastIBACnetConfirmedServiceRequest(m), ser)
+    return m.Parent.SerializeParent(io, m, ser)
 }
 
 func (m *BACnetConfirmedServiceRequestWriteProperty) UnmarshalXML(d *xml.Decoder, start xml.StartElement) error {
@@ -358,85 +364,85 @@ func (m *BACnetConfirmedServiceRequestWriteProperty) UnmarshalXML(d *xml.Decoder
             case "value":
                 switch tok.Attr[0].Value {
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationNull":
-                        var dt *BACnetTagApplicationNull
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationBoolean":
-                        var dt *BACnetTagApplicationBoolean
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationUnsignedInteger":
-                        var dt *BACnetTagApplicationUnsignedInteger
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationSignedInteger":
-                        var dt *BACnetTagApplicationSignedInteger
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationReal":
-                        var dt *BACnetTagApplicationReal
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationDouble":
-                        var dt *BACnetTagApplicationDouble
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationOctetString":
-                        var dt *BACnetTagApplicationOctetString
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationCharacterString":
-                        var dt *BACnetTagApplicationCharacterString
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationBitString":
-                        var dt *BACnetTagApplicationBitString
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationEnumerated":
-                        var dt *BACnetTagApplicationEnumerated
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationDate":
-                        var dt *BACnetTagApplicationDate
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationTime":
-                        var dt *BACnetTagApplicationTime
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationObjectIdentifier":
-                        var dt *BACnetTagApplicationObjectIdentifier
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
                         m.Value = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagContext":
-                        var dt *BACnetTagContext
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
@@ -445,96 +451,96 @@ func (m *BACnetConfirmedServiceRequestWriteProperty) UnmarshalXML(d *xml.Decoder
             case "priority":
                 switch tok.Attr[0].Value {
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationNull":
-                        var dt *BACnetTagApplicationNull
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
-                        *m.Priority = dt
+                        m.Priority = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationBoolean":
-                        var dt *BACnetTagApplicationBoolean
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
-                        *m.Priority = dt
+                        m.Priority = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationUnsignedInteger":
-                        var dt *BACnetTagApplicationUnsignedInteger
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
-                        *m.Priority = dt
+                        m.Priority = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationSignedInteger":
-                        var dt *BACnetTagApplicationSignedInteger
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
-                        *m.Priority = dt
+                        m.Priority = dt
                     case "org.apache.plc4x.java.bacnetip.readwrite.BACnetTagApplicationReal":
-                        var dt *BACnetTagApplicationReal
+                        var dt *BACnetTag
                         if err := d.DecodeElement(&dt, &tok); err != nil {
                             return err
                         }
-                        *m.Priority = dt
... 53046 lines suppressed ...