You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/10/12 14:50:16 UTC

[plc4x] branch feature/plc4go updated: - Big refactoring ot the expression generation to enable more drivers to be generated

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 6a45b12  - Big refactoring ot the expression generation to enable more drivers to be generated
6a45b12 is described below

commit 6a45b1268e71a1e0812ff8014aa2d9711a69b03b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Mon Oct 12 16:50:07 2020 +0200

    - Big refactoring ot the expression generation to enable more drivers to be generated
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |  10 +
 .../language/go/GoLanguageTemplateHelper.java      | 351 ++++++++++-----------
 .../go/hack/DefaultBooleanTypeReference.java       |  35 ++
 .../go/hack/DefaultFloatTypeReference.java         |  41 +++
 .../go/hack/DefaultIntegerTypeReference.java       |  41 +++
 .../resources/templates/go/data-io-template.ftlh   |  26 +-
 .../main/resources/templates/go/enum-template.ftlh |  12 +-
 .../resources/templates/go/model-template.ftlh     | 178 ++++++-----
 .../references/DefaultBooleanTypeReference.java    |  29 ++
 .../mspec/parser/MessageFormatListener.java        |   3 +
 pom.xml                                            |   2 +-
 sandbox/plc4go/cmd/main/drivers/bacnetip.go        |   4 +-
 sandbox/plc4go/cmd/main/drivers/s7.go              |   8 +-
 sandbox/plc4go/cmd/main/main.go                    |   2 +-
 .../plc4go/bacnetip/readwrite/model/APDU.go        |  36 ++-
 .../plc4go/bacnetip/readwrite/model/APDUAbort.go   |  47 ++-
 .../bacnetip/readwrite/model/APDUComplexAck.go     |  89 +++---
 .../readwrite/model/APDUConfirmedRequest.go        | 115 ++++---
 .../plc4go/bacnetip/readwrite/model/APDUError.go   |  41 ++-
 .../plc4go/bacnetip/readwrite/model/APDUReject.go  |  41 ++-
 .../bacnetip/readwrite/model/APDUSegmentAck.go     |  59 ++--
 .../bacnetip/readwrite/model/APDUSimpleAck.go      |  41 ++-
 .../readwrite/model/APDUUnconfirmedRequest.go      |  37 ++-
 .../bacnetip/readwrite/model/ApplicationTag.go     |  10 +
 .../bacnetip/readwrite/model/BACnetAddress.go      |  47 ++-
 .../readwrite/model/BACnetConfirmedServiceACK.go   |  36 ++-
 .../BACnetConfirmedServiceACKAtomicReadFile.go     |  26 +-
 .../BACnetConfirmedServiceACKAtomicWriteFile.go    |  26 +-
 ...tConfirmedServiceACKConfirmedPrivateTransfer.go |  26 +-
 .../model/BACnetConfirmedServiceACKCreateObject.go |  26 +-
 .../BACnetConfirmedServiceACKGetAlarmSummary.go    |  26 +-
 ...ACnetConfirmedServiceACKGetEnrollmentSummary.go |  26 +-
 ...BACnetConfirmedServiceACKGetEventInformation.go |  26 +-
 .../model/BACnetConfirmedServiceACKReadProperty.go |  26 +-
 ...ACnetConfirmedServiceACKReadPropertyMultiple.go |  26 +-
 .../model/BACnetConfirmedServiceACKReadRange.go    |  26 +-
 ...BACnetConfirmedServiceACKRemovedAuthenticate.go |  26 +-
 ...rmedServiceACKRemovedReadPropertyConditional.go |  26 +-
 .../model/BACnetConfirmedServiceACKVTData.go       |  26 +-
 .../model/BACnetConfirmedServiceACKVTOpen.go       |  26 +-
 .../model/BACnetConfirmedServiceRequest.go         |  36 ++-
 ...ACnetConfirmedServiceRequestAcknowledgeAlarm.go |  26 +-
 .../BACnetConfirmedServiceRequestAddListElement.go |  26 +-
 .../BACnetConfirmedServiceRequestAtomicReadFile.go |  26 +-
 ...BACnetConfirmedServiceRequestAtomicWriteFile.go |  26 +-
 ...firmedServiceRequestConfirmedCOVNotification.go | 111 ++++---
 ...rviceRequestConfirmedCOVNotificationMultiple.go |  26 +-
 ...rmedServiceRequestConfirmedEventNotification.go |  26 +-
 ...firmedServiceRequestConfirmedPrivateTransfer.go |  26 +-
 ...tConfirmedServiceRequestConfirmedTextMessage.go |  26 +-
 .../BACnetConfirmedServiceRequestCreateObject.go   |  26 +-
 .../BACnetConfirmedServiceRequestDeleteObject.go   |  26 +-
 ...rmedServiceRequestDeviceCommunicationControl.go |  26 +-
 ...tConfirmedServiceRequestGetEnrollmentSummary.go |  26 +-
 ...etConfirmedServiceRequestGetEventInformation.go |  26 +-
 ...etConfirmedServiceRequestLifeSafetyOperation.go |  26 +-
 .../BACnetConfirmedServiceRequestReadProperty.go   |  59 ++--
 ...tConfirmedServiceRequestReadPropertyMultiple.go |  26 +-
 .../BACnetConfirmedServiceRequestReadRange.go      |  26 +-
 ...netConfirmedServiceRequestReinitializeDevice.go |  26 +-
 ...CnetConfirmedServiceRequestRemoveListElement.go |  26 +-
 ...etConfirmedServiceRequestRemovedAuthenticate.go |  26 +-
 ...ServiceRequestRemovedReadPropertyConditional.go |  26 +-
 ...CnetConfirmedServiceRequestRemovedRequestKey.go |  26 +-
 .../BACnetConfirmedServiceRequestSubscribeCOV.go   |  83 +++--
 ...tConfirmedServiceRequestSubscribeCOVProperty.go |  26 +-
 ...edServiceRequestSubscribeCOVPropertyMultiple.go |  26 +-
 .../model/BACnetConfirmedServiceRequestVTClose.go  |  26 +-
 .../model/BACnetConfirmedServiceRequestVTData.go   |  26 +-
 .../model/BACnetConfirmedServiceRequestVTOpen.go   |  26 +-
 .../BACnetConfirmedServiceRequestWriteProperty.go  | 107 ++++---
 ...ConfirmedServiceRequestWritePropertyMultiple.go |  26 +-
 .../plc4go/bacnetip/readwrite/model/BACnetError.go |  36 ++-
 .../readwrite/model/BACnetErrorAtomicReadFile.go   |  26 +-
 .../readwrite/model/BACnetErrorAtomicWriteFile.go  |  26 +-
 .../model/BACnetErrorConfirmedPrivateTransfer.go   |  26 +-
 .../readwrite/model/BACnetErrorCreateObject.go     |  26 +-
 .../readwrite/model/BACnetErrorGetAlarmSummary.go  |  26 +-
 .../model/BACnetErrorGetEnrollmentSummary.go       |  26 +-
 .../model/BACnetErrorGetEventInformation.go        |  26 +-
 .../readwrite/model/BACnetErrorReadProperty.go     |  77 +++--
 .../model/BACnetErrorReadPropertyMultiple.go       |  26 +-
 .../readwrite/model/BACnetErrorReadRange.go        |  26 +-
 .../model/BACnetErrorRemovedAuthenticate.go        |  26 +-
 .../BACnetErrorRemovedReadPropertyConditional.go   |  26 +-
 .../bacnetip/readwrite/model/BACnetErrorVTData.go  |  26 +-
 .../bacnetip/readwrite/model/BACnetErrorVTOpen.go  |  26 +-
 .../bacnetip/readwrite/model/BACnetNetworkType.go  |  10 +
 .../bacnetip/readwrite/model/BACnetNodeType.go     |  10 +
 .../bacnetip/readwrite/model/BACnetNotifyType.go   |  10 +
 .../bacnetip/readwrite/model/BACnetObjectType.go   |  10 +
 .../bacnetip/readwrite/model/BACnetServiceAck.go   |  36 ++-
 .../model/BACnetServiceAckAtomicReadFile.go        |  26 +-
 .../model/BACnetServiceAckAtomicWriteFile.go       |  26 +-
 .../BACnetServiceAckConfirmedPrivateTransfer.go    |  26 +-
 .../model/BACnetServiceAckCreateObject.go          |  26 +-
 .../model/BACnetServiceAckGetAlarmSummary.go       |  26 +-
 .../model/BACnetServiceAckGetEnrollmentSummary.go  |  26 +-
 .../model/BACnetServiceAckGetEventInformation.go   |  26 +-
 .../model/BACnetServiceAckReadProperty.go          |  77 +++--
 .../model/BACnetServiceAckReadPropertyMultiple.go  |  26 +-
 .../readwrite/model/BACnetServiceAckReadRange.go   |  26 +-
 .../model/BACnetServiceAckRemovedAuthenticate.go   |  26 +-
 ...CnetServiceAckRemovedReadPropertyConditional.go |  26 +-
 .../readwrite/model/BACnetServiceAckVTData.go      |  26 +-
 .../readwrite/model/BACnetServiceAckVTOpen.go      |  26 +-
 .../plc4go/bacnetip/readwrite/model/BACnetTag.go   |  98 +++---
 .../model/BACnetTagApplicationBitString.go         |  47 ++-
 .../readwrite/model/BACnetTagApplicationBoolean.go |  26 +-
 .../model/BACnetTagApplicationCharacterString.go   |  26 +-
 .../readwrite/model/BACnetTagApplicationDate.go    |  26 +-
 .../readwrite/model/BACnetTagApplicationDouble.go  |  31 +-
 .../model/BACnetTagApplicationEnumerated.go        |  39 ++-
 .../readwrite/model/BACnetTagApplicationNull.go    |  26 +-
 .../model/BACnetTagApplicationObjectIdentifier.go  |  26 +-
 .../model/BACnetTagApplicationOctetString.go       |  26 +-
 .../readwrite/model/BACnetTagApplicationReal.go    |  31 +-
 .../model/BACnetTagApplicationSignedInteger.go     |  39 ++-
 .../readwrite/model/BACnetTagApplicationTime.go    |  26 +-
 .../model/BACnetTagApplicationUnsignedInteger.go   |  39 ++-
 .../bacnetip/readwrite/model/BACnetTagContext.go   |  39 ++-
 .../readwrite/model/BACnetTagWithContent.go        | 115 ++++---
 .../model/BACnetUnconfirmedServiceRequest.go       |  36 ++-
 .../model/BACnetUnconfirmedServiceRequestIAm.go    |  83 +++--
 .../model/BACnetUnconfirmedServiceRequestIHave.go  |  26 +-
 ...UnconfirmedServiceRequestTimeSynchronization.go |  26 +-
 ...onfirmedServiceRequestUTCTimeSynchronization.go |  26 +-
 ...rmedServiceRequestUnconfirmedCOVNotification.go |  26 +-
 ...iceRequestUnconfirmedCOVNotificationMultiple.go |  26 +-
 ...edServiceRequestUnconfirmedEventNotification.go |  26 +-
 ...rmedServiceRequestUnconfirmedPrivateTransfer.go |  67 ++--
 ...onfirmedServiceRequestUnconfirmedTextMessage.go |  26 +-
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |  73 +++--
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |  77 +++--
 .../BACnetUnconfirmedServiceRequestWriteGroup.go   |  26 +-
 .../plc4go/bacnetip/readwrite/model/BVLC.go        |  46 ++-
 .../model/BVLCDeleteForeignDeviceTableEntry.go     |  26 +-
 .../model/BVLCDistributeBroadcastToNetwork.go      |  26 +-
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  |  57 ++--
 .../readwrite/model/BVLCOriginalBroadcastNPDU.go   |  33 +-
 .../readwrite/model/BVLCOriginalUnicastNPDU.go     |  33 +-
 .../model/BVLCReadBroadcastDistributionTable.go    |  26 +-
 .../model/BVLCReadBroadcastDistributionTableAck.go |  26 +-
 .../readwrite/model/BVLCReadForeignDeviceTable.go  |  26 +-
 .../model/BVLCReadForeignDeviceTableAck.go         |  26 +-
 .../readwrite/model/BVLCRegisterForeignDevice.go   |  26 +-
 .../plc4go/bacnetip/readwrite/model/BVLCResult.go  |  26 +-
 .../bacnetip/readwrite/model/BVLCSecureBVLL.go     |  26 +-
 .../model/BVLCWideBroadcastDistributionTable.go    |  26 +-
 .../plc4go/bacnetip/readwrite/model/NLM.go         |  50 ++-
 .../readwrite/model/NLMIAmRouterToNetwork.go       |  39 ++-
 .../readwrite/model/NLMWhoIsRouterToNetwork.go     |  39 ++-
 .../plc4go/bacnetip/readwrite/model/NPDU.go        | 219 +++++++------
 .../plc4go/knxnetip/readwrite/model/APCI.go        |  10 +
 .../plc4go/knxnetip/readwrite/model/CEMI.go        |  36 ++-
 .../readwrite/model/CEMIAdditionalInformation.go   |  36 ++-
 .../CEMIAdditionalInformationBusmonitorInfo.go     |  65 ++--
 .../CEMIAdditionalInformationRelativeTimestamp.go  |  35 +-
 .../knxnetip/readwrite/model/CEMIBusmonInd.go      |  55 ++--
 .../plc4go/knxnetip/readwrite/model/CEMIDataCon.go |  55 ++--
 .../knxnetip/readwrite/model/CEMIDataFrame.go      | 185 ++++++-----
 .../plc4go/knxnetip/readwrite/model/CEMIDataInd.go |  55 ++--
 .../plc4go/knxnetip/readwrite/model/CEMIDataReq.go |  55 ++--
 .../plc4go/knxnetip/readwrite/model/CEMIFrame.go   |  72 +++--
 .../knxnetip/readwrite/model/CEMIFrameAck.go       |  26 +-
 .../knxnetip/readwrite/model/CEMIFrameData.go      | 129 ++++----
 .../knxnetip/readwrite/model/CEMIFrameDataExt.go   | 137 ++++----
 .../readwrite/model/CEMIFramePollingData.go        |  26 +-
 .../readwrite/model/CEMIFramePollingDataExt.go     |  26 +-
 .../knxnetip/readwrite/model/CEMIMPropReadCon.go   |  61 ++--
 .../knxnetip/readwrite/model/CEMIMPropReadReq.go   |  55 ++--
 .../knxnetip/readwrite/model/CEMIPollDataCon.go    |  26 +-
 .../knxnetip/readwrite/model/CEMIPollDataReq.go    |  26 +-
 .../knxnetip/readwrite/model/CEMIPriority.go       |  10 +
 .../plc4go/knxnetip/readwrite/model/CEMIRawCon.go  |  26 +-
 .../plc4go/knxnetip/readwrite/model/CEMIRawInd.go  |  26 +-
 .../plc4go/knxnetip/readwrite/model/CEMIRawReq.go  |  26 +-
 .../knxnetip/readwrite/model/ConnectionRequest.go  |  43 ++-
 .../model/ConnectionRequestInformation.go          |  42 ++-
 ...ConnectionRequestInformationDeviceManagement.go |  26 +-
 ...ConnectionRequestInformationTunnelConnection.go |  35 +-
 .../knxnetip/readwrite/model/ConnectionResponse.go |  71 +++--
 .../readwrite/model/ConnectionResponseDataBlock.go |  42 ++-
 .../ConnectionResponseDataBlockDeviceManagement.go |  26 +-
 .../ConnectionResponseDataBlockTunnelConnection.go |  31 +-
 .../readwrite/model/ConnectionStateRequest.go      |  41 ++-
 .../readwrite/model/ConnectionStateResponse.go     |  37 ++-
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      | 121 +++----
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |  55 ++--
 .../knxnetip/readwrite/model/DescriptionRequest.go |  31 +-
 .../readwrite/model/DescriptionResponse.go         |  37 ++-
 .../readwrite/model/DeviceConfigurationAck.go      |  31 +-
 .../model/DeviceConfigurationAckDataBlock.go       |  49 ++-
 .../readwrite/model/DeviceConfigurationRequest.go  |  39 ++-
 .../model/DeviceConfigurationRequestDataBlock.go   |  47 ++-
 .../knxnetip/readwrite/model/DeviceStatus.go       |  35 +-
 .../knxnetip/readwrite/model/DisconnectRequest.go  |  41 ++-
 .../knxnetip/readwrite/model/DisconnectResponse.go |  37 ++-
 .../readwrite/model/HPAIControlEndpoint.go         |  49 ++-
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   |  49 ++-
 .../readwrite/model/HPAIDiscoveryEndpoint.go       |  49 ++-
 .../knxnetip/readwrite/model/HostProtocolCode.go   |  10 +
 .../plc4go/knxnetip/readwrite/model/IPAddress.go   |  39 ++-
 .../plc4go/knxnetip/readwrite/model/KNXAddress.go  |  43 ++-
 .../knxnetip/readwrite/model/KNXGroupAddress.go    |  30 +-
 .../readwrite/model/KNXGroupAddress2Level.go       |  37 ++-
 .../readwrite/model/KNXGroupAddress3Level.go       |  43 ++-
 .../readwrite/model/KNXGroupAddressFreeLevel.go    |  31 +-
 .../knxnetip/readwrite/model/KNXNetIPMessage.go    |  52 +--
 .../plc4go/knxnetip/readwrite/model/KnxLayer.go    |  10 +
 .../knxnetip/readwrite/model/KnxNetIpCore.go       |  31 +-
 .../readwrite/model/KnxNetIpDeviceManagement.go    |  31 +-
 .../knxnetip/readwrite/model/KnxNetIpTunneling.go  |  31 +-
 .../knxnetip/readwrite/model/KnxNetObjectServer.go |  31 +-
 .../model/KnxNetRemoteConfigurationAndDiagnosis.go |  31 +-
 .../readwrite/model/KnxNetRemoteLogging.go         |  31 +-
 .../plc4go/knxnetip/readwrite/model/MACAddress.go  |  39 ++-
 .../model/ProjectInstallationIdentifier.go         |  37 ++-
 .../knxnetip/readwrite/model/RelativeTimestamp.go  |  31 +-
 .../knxnetip/readwrite/model/RoutingIndication.go  |  26 +-
 .../knxnetip/readwrite/model/SearchRequest.go      |  31 +-
 .../knxnetip/readwrite/model/SearchResponse.go     |  43 ++-
 .../plc4go/knxnetip/readwrite/model/ServiceId.go   |  36 ++-
 .../plc4go/knxnetip/readwrite/model/Status.go      |  10 +
 .../plc4go/knxnetip/readwrite/model/TPCI.go        |  10 +
 .../knxnetip/readwrite/model/TunnelingRequest.go   |  39 ++-
 .../readwrite/model/TunnelingRequestDataBlock.go   |  47 ++-
 .../knxnetip/readwrite/model/TunnelingResponse.go  |  31 +-
 .../readwrite/model/TunnelingResponseDataBlock.go  |  49 ++-
 .../knxnetip/readwrite/model/UnknownMessage.go     |  39 ++-
 .../modbus/readwrite/model/ModbusConstants.go      |  29 +-
 .../modbus/readwrite/model/ModbusDataType.go       |  10 +
 .../plc4go/modbus/readwrite/model/ModbusPDU.go     |  42 ++-
 .../readwrite/model/ModbusPDUDiagnosticRequest.go  |  37 ++-
 .../modbus/readwrite/model/ModbusPDUError.go       |  31 +-
 .../model/ModbusPDUGetComEventLogRequest.go        |  26 +-
 .../model/ModbusPDUGetComEventLogResponse.go       |  71 +++--
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |  43 ++-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |  43 ++-
 .../readwrite/model/ModbusPDUReadCoilsRequest.go   |  37 ++-
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  |  43 ++-
 .../ModbusPDUReadDeviceIdentificationRequest.go    |  26 +-
 .../ModbusPDUReadDeviceIdentificationResponse.go   |  26 +-
 .../model/ModbusPDUReadDiscreteInputsRequest.go    |  37 ++-
 .../model/ModbusPDUReadDiscreteInputsResponse.go   |  43 ++-
 .../model/ModbusPDUReadExceptionStatusRequest.go   |  26 +-
 .../model/ModbusPDUReadExceptionStatusResponse.go  |  31 +-
 .../model/ModbusPDUReadFifoQueueRequest.go         |  31 +-
 .../model/ModbusPDUReadFifoQueueResponse.go        |  51 +--
 .../model/ModbusPDUReadFileRecordRequest.go        |  47 ++-
 .../model/ModbusPDUReadFileRecordRequestItem.go    |  49 ++-
 .../model/ModbusPDUReadFileRecordResponse.go       |  47 ++-
 .../model/ModbusPDUReadFileRecordResponseItem.go   |  55 ++--
 .../model/ModbusPDUReadHoldingRegistersRequest.go  |  37 ++-
 .../model/ModbusPDUReadHoldingRegistersResponse.go |  43 ++-
 .../model/ModbusPDUReadInputRegistersRequest.go    |  37 ++-
 .../model/ModbusPDUReadInputRegistersResponse.go   |  43 ++-
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |  75 +++--
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |  43 ++-
 .../model/ModbusPDUReportServerIdRequest.go        |  26 +-
 .../model/ModbusPDUReportServerIdResponse.go       |  43 ++-
 .../model/ModbusPDUWriteFileRecordRequest.go       |  47 ++-
 .../model/ModbusPDUWriteFileRecordRequestItem.go   |  71 +++--
 .../model/ModbusPDUWriteFileRecordResponse.go      |  47 ++-
 .../model/ModbusPDUWriteFileRecordResponseItem.go  |  71 +++--
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    |  59 ++--
 .../model/ModbusPDUWriteMultipleCoilsResponse.go   |  37 ++-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |  59 ++--
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |  37 ++-
 .../model/ModbusPDUWriteSingleCoilRequest.go       |  37 ++-
 .../model/ModbusPDUWriteSingleCoilResponse.go      |  37 ++-
 .../model/ModbusPDUWriteSingleRegisterRequest.go   |  37 ++-
 .../model/ModbusPDUWriteSingleRegisterResponse.go  |  37 ++-
 .../modbus/readwrite/model/ModbusSerialADU.go      |  55 ++--
 .../plc4go/modbus/readwrite/model/ModbusTcpADU.go  |  55 ++--
 .../plc4go/s7/readwrite/model/COTPPacket.go        |  78 +++--
 .../readwrite/model/COTPPacketConnectionRequest.go |  43 ++-
 .../model/COTPPacketConnectionResponse.go          |  43 ++-
 .../plc4go/s7/readwrite/model/COTPPacketData.go    |  37 ++-
 .../readwrite/model/COTPPacketDisconnectRequest.go |  43 ++-
 .../model/COTPPacketDisconnectResponse.go          |  37 ++-
 .../s7/readwrite/model/COTPPacketTpduError.go      |  37 ++-
 .../plc4go/s7/readwrite/model/COTPParameter.go     |  42 ++-
 .../s7/readwrite/model/COTPParameterCalledTsap.go  |  31 +-
 .../s7/readwrite/model/COTPParameterCallingTsap.go |  31 +-
 .../s7/readwrite/model/COTPParameterChecksum.go    |  31 +-
 ...COTPParameterDisconnectAdditionalInformation.go |  35 +-
 .../s7/readwrite/model/COTPParameterTpduSize.go    |  31 +-
 .../plc4go/s7/readwrite/model/COTPProtocolClass.go |  10 +
 .../plc4go/s7/readwrite/model/COTPTpduSize.go      |  10 +
 .../s7/readwrite/model/DataTransportErrorCode.go   |  10 +
 .../plc4go/s7/readwrite/model/DataTransportSize.go |  10 +
 .../plc4go/s7/readwrite/model/DeviceGroup.go       |  10 +
 .../plc4go/s7/readwrite/model/MemoryArea.go        |  10 +
 .../plc4go/s7/readwrite/model/S7Address.go         |  36 ++-
 .../plc4go/s7/readwrite/model/S7AddressAny.go      |  65 ++--
 .../plc4go/s7/readwrite/model/S7Message.go         |  92 +++---
 .../plc4go/s7/readwrite/model/S7MessageRequest.go  |  26 +-
 .../plc4go/s7/readwrite/model/S7MessageResponse.go |  37 ++-
 .../s7/readwrite/model/S7MessageResponseData.go    |  37 ++-
 .../plc4go/s7/readwrite/model/S7MessageUserData.go |  26 +-
 .../plc4go/s7/readwrite/model/S7Parameter.go       |  36 ++-
 .../readwrite/model/S7ParameterReadVarRequest.go   |  43 ++-
 .../readwrite/model/S7ParameterReadVarResponse.go  |  31 +-
 .../model/S7ParameterSetupCommunication.go         |  47 ++-
 .../s7/readwrite/model/S7ParameterUserData.go      |  43 ++-
 .../s7/readwrite/model/S7ParameterUserDataItem.go  |  36 ++-
 .../model/S7ParameterUserDataItemCPUFunctions.go   | 119 ++++---
 .../readwrite/model/S7ParameterWriteVarRequest.go  |  43 ++-
 .../readwrite/model/S7ParameterWriteVarResponse.go |  31 +-
 .../plc4go/s7/readwrite/model/S7Payload.go         |  38 ++-
 .../s7/readwrite/model/S7PayloadReadVarResponse.go |  51 +--
 .../plc4go/s7/readwrite/model/S7PayloadUserData.go |  41 ++-
 .../s7/readwrite/model/S7PayloadUserDataItem.go    |  60 ++--
 ...PayloadUserDataItemCpuFunctionReadSzlRequest.go |  26 +-
 ...ayloadUserDataItemCpuFunctionReadSzlResponse.go |  43 ++-
 .../s7/readwrite/model/S7PayloadWriteVarRequest.go |  51 +--
 .../readwrite/model/S7PayloadWriteVarResponse.go   |  39 ++-
 .../s7/readwrite/model/S7VarPayloadDataItem.go     |  87 ++---
 .../s7/readwrite/model/S7VarPayloadStatusItem.go   |  31 +-
 .../readwrite/model/S7VarRequestParameterItem.go   |  36 ++-
 .../model/S7VarRequestParameterItemAddress.go      |  37 ++-
 .../plc4go/s7/readwrite/model/SzlDataTreeItem.go   |  71 +++--
 .../internal/plc4go/s7/readwrite/model/SzlId.go    |  43 ++-
 .../s7/readwrite/model/SzlModuleTypeClass.go       |  10 +
 .../plc4go/s7/readwrite/model/SzlSublist.go        |  10 +
 .../plc4go/s7/readwrite/model/TPKTPacket.go        |  47 ++-
 .../plc4go/s7/readwrite/model/TransportSize.go     |  48 +--
 328 files changed, 8958 insertions(+), 4049 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 80bd00e..1e6e536 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -286,6 +286,16 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
      * Methods related to fields.
      **********************************************************************************/
 
+    public Field getFieldForNameFromCurrentOrParent(String fieldName) {
+        return ((ComplexTypeDefinition) getThisTypeDefinition()).getAllPropertyFields()
+            .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
+    }
+
+    public Field getFieldForNameFromCurrent(String fieldName) {
+        return ((ComplexTypeDefinition) getThisTypeDefinition()).getPropertyFields()
+            .stream().filter(propertyField -> propertyField.getName().equals(fieldName)).findFirst().orElse(null);
+    }
+
     public boolean isAbstractField(Field field) {
         return field instanceof AbstractField;
     }
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 9df5569..258f8df 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
@@ -19,7 +19,11 @@
 
 package org.apache.plc4x.language.go;
 
+import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.math.NumberUtils;
+import org.apache.plc4x.language.go.hack.DefaultBooleanTypeReference;
+import org.apache.plc4x.language.go.hack.DefaultFloatTypeReference;
+import org.apache.plc4x.language.go.hack.DefaultIntegerTypeReference;
 import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.BaseFreemarkerLanguageTemplateHelper;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.*;
 import org.apache.plc4x.plugins.codegenerator.types.enums.EnumValue;
@@ -28,7 +32,6 @@ import org.apache.plc4x.plugins.codegenerator.types.references.*;
 import org.apache.plc4x.plugins.codegenerator.types.terms.*;
 
 import java.util.*;
-import java.util.function.Function;
 
 @SuppressWarnings({"unused", "WeakerAccess"})
 public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelper {
@@ -131,7 +134,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             }
             throw new RuntimeException("Unsupported simple type");
         } else {
-            return ((ComplexTypeReference) typeReference).getName();
+            return (typeReference != null) ? ((ComplexTypeReference) typeReference).getName() : "";
         }
     }
 
@@ -298,14 +301,48 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
     }
 
     public String toParseExpression(TypedField field, Term term, Argument[] parserArguments) {
-        return toExpression(field, term, term1 -> toVariableParseExpression(field, term1, parserArguments));
+        return toTypedParseExpression((field != null) ? field.getType() : null, term, parserArguments);
     }
 
-    public String toSerializationExpression(TypedField field, Term term, Argument[] parserArguments) {
-        return toExpression(field, term, term1 -> toVariableSerializationExpression(field, term1, parserArguments));
+    public String toSerializationExpression(TypedField field, Term term, Argument[] serializerArguments) {
+        return toTypedSerializationExpression((field != null) ? field.getType() : null, term, serializerArguments);
     }
 
-    private String toExpression(TypedField field, Term term, Function<Term, String> variableExpressionGenerator) {
+    public String toBooleanParseExpression(Term term, Argument[] parserArguments) {
+        return toTypedParseExpression(new DefaultBooleanTypeReference(), term, parserArguments);
+    }
+
+    public String toBooleanSerializationExpression(Term term, Argument[] serializerArguments) {
+        return toTypedSerializationExpression(new DefaultBooleanTypeReference(), term, serializerArguments);
+    }
+
+    public String toIntegerParseExpression(int sizeInBits, Term term, Argument[] parserArguments) {
+        return toTypedParseExpression(new DefaultIntegerTypeReference(sizeInBits), term, parserArguments);
+    }
+
+    public String toIntegerSerializationExpression(int sizeInBits, Term term, Argument[] serializerArguments) {
+        return toTypedSerializationExpression(new DefaultIntegerTypeReference(sizeInBits), term, serializerArguments);
+    }
+
+    public String toTypedParseExpression(TypeReference fieldType, Term term, Argument[] parserArguments) {
+        return toExpression(fieldType, term, parserArguments, null, false, false);
+    }
+
+    public String toTypedSerializationExpression(TypeReference fieldType, Term term, Argument[] serializerArguments) {
+        return toExpression(fieldType, term, null, serializerArguments, true, false);
+    }
+
+    String getCastExpressionForTypeReference(TypeReference typeReference) {
+        if(typeReference instanceof SimpleTypeReference) {
+            return getLanguageTypeNameForTypeReference(typeReference);
+        } else if(typeReference != null) {
+            return "Cast" + getLanguageTypeNameForTypeReference(typeReference);
+        } else {
+            return "";
+        }
+    }
+
+    private String toExpression(TypeReference fieldType, Term term, Argument[] parserArguments, Argument[] serializerArguments, boolean serialize, boolean suppressPointerAccess) {
         if(term == null) {
             return "";
         }
@@ -313,21 +350,13 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             if(term instanceof NullLiteral) {
                 return "nil";
             } else if(term instanceof BooleanLiteral) {
-                return Boolean.toString(((BooleanLiteral) term).getValue());
+                return getCastExpressionForTypeReference(fieldType) + "(" + ((BooleanLiteral) term).getValue() + ")";
             } else if(term instanceof NumericLiteral) {
-                return ((NumericLiteral) term).getNumber().toString();
+                return getCastExpressionForTypeReference(fieldType) + "(" + ((NumericLiteral) term).getNumber().toString() + ")";
             } else if(term instanceof StringLiteral) {
                 return "\"" + ((StringLiteral) term).getValue() + "\"";
             } else if(term instanceof VariableLiteral) {
-                VariableLiteral variableLiteral = (VariableLiteral) term;
-                // If this literal references an Enum type, then we have to output it differently.
-                if(getTypeDefinitions().get(variableLiteral.getName()) instanceof EnumTypeDefinition) {
-                    return variableLiteral.getName() + "_" + variableLiteral.getChild().getName() +
-                        ((variableLiteral.getChild().getChild() != null) ?
-                            "." + toVariableExpressionRest(variableLiteral.getChild().getChild()) : "");
-                } else {
-                    return variableExpressionGenerator.apply(term);
-                }
+                return toVariableExpression(fieldType, (VariableLiteral) term, parserArguments, serializerArguments, serialize, suppressPointerAccess);
             } else {
                 throw new RuntimeException("Unsupported Literal type " + term.getClass().getName());
             }
@@ -336,11 +365,11 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             Term a = ut.getA();
             switch(ut.getOperation()) {
                 case "!":
-                    return "!(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "!(" + toExpression(fieldType, a, parserArguments, serializerArguments, serialize, false) + ")";
                 case "-":
-                    return "-(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "-(" + getCastExpressionForTypeReference(fieldType) + "(" + toExpression(fieldType, a, parserArguments, serializerArguments, serialize, false) + "))";
                 case "()":
-                    return "(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return getCastExpressionForTypeReference(fieldType) + "(" + toExpression(fieldType, a, parserArguments, serializerArguments, serialize, false) + ")";
                 default:
                     throw new RuntimeException("Unsupported unary operation type " + ut.getOperation());
             }
@@ -351,9 +380,27 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             String operation = bt.getOperation();
             switch (operation) {
                 case "^":
-                    return "Math.pow((" + toExpression(field, a, variableExpressionGenerator) + "), (" + toExpression(field, b, variableExpressionGenerator) + "))";
+                    return "Math.pow(" +
+                        getCastExpressionForTypeReference(fieldType) + "(" + toExpression(fieldType, a, parserArguments, serializerArguments, serialize, false) + "), " +
+                        getCastExpressionForTypeReference(fieldType) + "(" + toExpression(fieldType, b, parserArguments, serializerArguments, serialize, false) + "))";
+                // If we start casting for comparisons, equals or non equals, really messy things happen.
+                case "==":
+                case "!=":
+                case ">":
+                case "<":
+                case ">=":
+                case "<=":
+                    // For every access of optional elements we need pointer access ...
+                    // Except for doing a nil or not-nil check :-(
+                    // So in case of such a check, we need to suppress the pointer-access.
+                    boolean suppressPointerAccessOverride = (operation.equals("==") || operation.equals("!=")) && ((a instanceof NullLiteral) || (b instanceof NullLiteral));
+                    return "bool((" + toExpression(null, a, parserArguments, serializerArguments, serialize, suppressPointerAccessOverride) + ") " +
+                        operation +
+                        " (" + toExpression(null, b, parserArguments, serializerArguments, serialize, suppressPointerAccessOverride) + "))";
                 default:
-                    return "(" + toExpression(field, a, variableExpressionGenerator) + ") " + operation + " (" + toExpression(field, b, variableExpressionGenerator) + ")";
+                    return getCastExpressionForTypeReference(fieldType) + "(" + toExpression(fieldType, a, parserArguments, serializerArguments, serialize, false) + ") " +
+                        operation + " " +
+                        getCastExpressionForTypeReference(fieldType) +"(" + toExpression(fieldType, b, parserArguments, serializerArguments, serialize, false) + ")";
             }
         } else if (term instanceof TernaryTerm) {
             TernaryTerm tt = (TernaryTerm) term;
@@ -361,7 +408,10 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 Term a = tt.getA();
                 Term b = tt.getB();
                 Term c = tt.getC();
-                return "spi.InlineIf((" +  toExpression(field, a, variableExpressionGenerator) + "), uint16(" + toExpression(field, b, variableExpressionGenerator) + "), uint16(" + toExpression(field, c, variableExpressionGenerator) + "))";
+                // TODO: This is not quite correct with the cast to uint16
+                return "spi.InlineIf(" + toExpression(new DefaultBooleanTypeReference(), a, parserArguments, serializerArguments, serialize, false) + ", " +
+                    "uint16(" + toExpression(fieldType, b, parserArguments, serializerArguments, serialize, false) + "), " +
+                    "uint16(" + toExpression(fieldType, c, parserArguments, serializerArguments, serialize, false) + "))";
             } else {
                 throw new RuntimeException("Unsupported ternary operation type " + tt.getOperation());
             }
@@ -370,19 +420,34 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         }
     }
 
-    private String toVariableParseExpression(TypedField field, Term term, Argument[] parserArguments) {
-        VariableLiteral vl = (VariableLiteral) term;
+    private String toVariableExpression(TypeReference typeReference, VariableLiteral vl, Argument[] parserArguments, Argument[] serializerArguments, boolean serialize, boolean suppressPointerAccess) {
+        if ("lengthInBytes".equals(vl.getName())) {
+            return (serialize ? getCastExpressionForTypeReference(typeReference) + "(m." : "") + "LengthInBytes()" + (serialize ? ")" : "");
+        } else if ("lengthInBits".equals(vl.getName())) {
+            return (serialize ? getCastExpressionForTypeReference(typeReference) + "(m." : "") + "LengthInBits()" + (serialize ? ")" : "");
+        }
+        // If this literal references an Enum type, then we have to output it differently.
+        else if (getTypeDefinitions().get(vl.getName()) instanceof EnumTypeDefinition) {
+            return vl.getName() + "_" + vl.getChild().getName() +
+                ((vl.getChild().getChild() != null) ?
+                    "." + toVariableExpression(typeReference, vl.getChild().getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
+        }
         // CAST expressions are special as we need to add a ".class" to the second parameter in Java.
-        if("CAST".equals(vl.getName())) {
-            if((vl.getArgs() == null) || (vl.getArgs().size() != 2)) {
+        else if ("CAST".equals(vl.getName())) {
+            if ((vl.getArgs() == null) || (vl.getArgs().size() != 2)) {
                 throw new RuntimeException("A CAST expression expects exactly two arguments.");
             }
-            VariableLiteral type = (VariableLiteral) vl.getArgs().get(1);
-            StringBuilder sb = new StringBuilder(type.getName());
-            sb.append("(").append(toVariableParseExpression(field, vl.getArgs().get(0), parserArguments)).append(")");
-            return sb.toString() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
-        }
-        else if("STATIC_CALL".equals(vl.getName())) {
+            VariableLiteral typeLiteral = (VariableLiteral) vl.getArgs().get(1);
+            final TypeDefinition typeDefinition = getTypeDefinitions().get(typeLiteral.getName());
+            TypeReference type = typeDefinition.getTypeReference();
+            StringBuilder sb = new StringBuilder();
+            if (type instanceof ComplexTypeReference) {
+                sb.append("Cast");
+            }
+            sb.append(typeLiteral.getName());
+            sb.append("(").append(toVariableExpression(typeReference, (VariableLiteral) vl.getArgs().get(0), parserArguments, serializerArguments, serialize, suppressPointerAccess)).append(")");
+            return sb.toString() + ((vl.getChild() != null) ? "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
+        } else if ("STATIC_CALL".equals(vl.getName())) {
             StringBuilder sb = new StringBuilder();
             if (!(vl.getArgs().get(0) instanceof StringLiteral)) {
                 throw new RuntimeException("Expecting the first argument of a 'STATIC_CALL' to be a StringLiteral");
@@ -411,27 +476,28 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                         }
                     }
                     if (isParserArg) {
-                        sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
+                        sb.append(va.getName() + ((va.getChild() != null) ?
+                            "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : ""));
                     }
                     // We have to manually evaluate the type information at code-generation time.
                     else if (isTypeArg) {
                         String part = va.getChild().getName();
                         switch (part) {
                             case "name":
-                                sb.append("\"").append(field.getTypeName()).append("\"");
+//                                sb.append("\"").append(field.getTypeName()).append("\"");
                                 break;
                             case "length":
-                                sb.append("\"").append(((SimpleTypeReference) field).getSizeInBits()).append("\"");
+                                sb.append("\"").append(((SimpleTypeReference) typeReference).getSizeInBits()).append("\"");
                                 break;
                             case "encoding":
-                                String encoding = ((StringTypeReference) field.getType()).getEncoding();
+                                String encoding = ((StringTypeReference) typeReference).getEncoding();
                                 // Cut off the single quotes.
                                 encoding = encoding.substring(1, encoding.length() - 1);
                                 sb.append("\"").append(encoding).append("\"");
                                 break;
                         }
                     } else {
-                        sb.append(toVariableParseExpression(field, va, null));
+                        sb.append(toVariableExpression(typeReference, va, parserArguments, serializerArguments, serialize, suppressPointerAccess));
                     }
                 } else if (arg instanceof StringLiteral) {
                     sb.append(((StringLiteral) arg).getValue());
@@ -439,95 +505,16 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             }
             sb.append(")");
             return sb.toString();
-        }
-        else if("COUNT".equals(vl.getName())) {
-            return "uint8(len(" + vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "") + "))";
-        }
-        // All uppercase names are not fields, but utility methods.
-        else if(vl.getName().equals(vl.getName().toUpperCase())) {
-            StringBuilder sb = new StringBuilder(vl.getName());
-            if(vl.getArgs() != null) {
-                sb.append("(");
-                boolean firstArg = true;
-                for(Term arg : vl.getArgs()) {
-                    if(!firstArg) {
-                        sb.append(", ");
-                    }
-                    sb.append(toParseExpression(field, arg, parserArguments));
-                    firstArg = false;
-                }
-                sb.append(")");
-            }
-            if(vl.getIndex() != VariableLiteral.NO_INDEX) {
-                sb.append("[").append(vl.getIndex()).append("]");
-            }
-            return sb.toString() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
-        }
-        return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
-    }
-
-    private String toVariableSerializationExpression(TypedField field, Term term, Argument[] serialzerArguments) {
-        VariableLiteral vl = (VariableLiteral) term;
-        if("STATIC_CALL".equals(vl.getName())) {
-            StringBuilder sb = new StringBuilder();
-            if(!(vl.getArgs().get(0) instanceof StringLiteral)) {
-                throw new RuntimeException("Expecting the first argument of a 'STATIC_CALL' to be a StringLiteral");
-            }
-            String methodName = ((StringLiteral) vl.getArgs().get(0)).getValue();
-            methodName = methodName.substring(1, methodName.length() - 1);
-            sb.append(methodName).append("(");
-            for(int i = 1; i < vl.getArgs().size(); i++) {
-                Term arg = vl.getArgs().get(i);
-                if(i > 1) {
-                    sb.append(", ");
-                }
-                if(arg instanceof VariableLiteral) {
-                    VariableLiteral va = (VariableLiteral) arg;
-                    // "io" and "m" are always available in every parser.
-                    boolean isSerializerArg = "io".equals(va.getName()) || "m".equals(va.getName()) || "element".equals(va.getName());
-                    boolean isTypeArg = "_type".equals(va.getName());
-                    if(!isSerializerArg && !isTypeArg && serialzerArguments != null) {
-                        for (Argument serializerArgument : serialzerArguments) {
-                            if (serializerArgument.getName().equals(va.getName())) {
-                                isSerializerArg = true;
-                                break;
-                            }
-                        }
-                    }
-                    if(isSerializerArg) {
-                        sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
-                    } else if(isTypeArg) {
-                        String part = va.getChild().getName();
-                        switch (part) {
-                            case "name":
-                                sb.append("\"").append(field.getTypeName()).append("\"");
-                                break;
-                            case "length":
-                                sb.append("\"").append(((SimpleTypeReference) field).getSizeInBits()).append("\"");
-                                break;
-                            case "encoding":
-                                String encoding = ((StringTypeReference) field.getType()).getEncoding();
-                                // Cut off the single quotes.
-                                encoding = encoding.substring(1, encoding.length() - 1);
-                                sb.append("\"").append(encoding).append("\"");
-                                break;
-                        }
-                    } else {
-                        sb.append(toVariableSerializationExpression(field, va, null));
-                    }
-                } else if(arg instanceof StringLiteral) {
-                    sb.append(((StringLiteral) arg).getValue());
-                }
-            }
-            sb.append(")");
-            return sb.toString();
-        }
-        else if("COUNT".equals(vl.getName())) {
+        } else if ("COUNT".equals(vl.getName())) {
+            return (typeReference instanceof SimpleTypeReference ? getCastExpressionForTypeReference(typeReference) : "") + "(len(" +
+                toVariableExpression(typeReference, (VariableLiteral) vl.getArgs().get(0), parserArguments, serializerArguments, serialize, suppressPointerAccess) +
+                "))";
+        } else if ("ARRAY_SIZE_IN_BYTES".equals(vl.getName())) {
             VariableLiteral va = (VariableLiteral) vl.getArgs().get(0);
             // "io" and "m" are always available in every parser.
             boolean isSerializerArg = "io".equals(va.getName()) || "m".equals(va.getName()) || "element".equals(va.getName());
-            if(!isSerializerArg && serialzerArguments != null) {
-                for (Argument serializerArgument : serialzerArguments) {
+            if (!isSerializerArg && serializerArguments != null) {
+                for (Argument serializerArgument : serializerArguments) {
                     if (serializerArgument.getName().equals(va.getName())) {
                         isSerializerArg = true;
                         break;
@@ -535,74 +522,74 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 }
             }
             StringBuilder sb = new StringBuilder();
-            if(isSerializerArg) {
-                sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
+            if (isSerializerArg) {
+                sb.append(va.getName()).append(((va.getChild() != null) ? "." + toVariableExpression(typeReference, va.getChild(), parserArguments, serializerArguments, true, suppressPointerAccess) : ""));
             } else {
-                sb.append(toVariableSerializationExpression(field, va, null));
+                sb.append(toVariableExpression(typeReference, va, parserArguments, serializerArguments, true, suppressPointerAccess));
             }
-            return getLanguageTypeNameForField(field) + "(len(" + sb.toString() + "))";
+            return getCastExpressionForTypeReference(typeReference) + "(" + ((VariableLiteral) vl.getArgs().get(0)).getName() + "ArraySizeInBytes(" + sb.toString() + "))";
         }
-        else if("ARRAY_SIZE_IN_BYTES".equals(vl.getName())) {
+        else if("CEIL".equals(vl.getName())) {
             VariableLiteral va = (VariableLiteral) vl.getArgs().get(0);
-            // "io" and "m" are always available in every parser.
-            boolean isSerializerArg = "io".equals(va.getName()) || "m".equals(va.getName()) || "element".equals(va.getName());
-            if(!isSerializerArg && serialzerArguments != null) {
-                for (Argument serializerArgument : serialzerArguments) {
-                    if (serializerArgument.getName().equals(va.getName())) {
-                        isSerializerArg = true;
-                        break;
+            // The Ceil function expects 64 bit floating point values.
+            TypeReference tr = new DefaultFloatTypeReference(64);
+            return "math.Ceil(" + toVariableExpression(tr, va, parserArguments, serializerArguments, true, suppressPointerAccess);
+        }
+        // All uppercase names are not fields, but utility methods.
+        else if (vl.getName().equals(vl.getName().toUpperCase())) {
+            StringBuilder sb = new StringBuilder(vl.getName());
+            if (vl.getArgs() != null) {
+                sb.append("(");
+                boolean firstArg = true;
+                for (Term arg : vl.getArgs()) {
+                    if (!firstArg) {
+                        sb.append(", ");
                     }
+                    sb.append(toExpression(typeReference, arg, parserArguments, serializerArguments, serialize, suppressPointerAccess));
+                    firstArg = false;
                 }
+                sb.append(")");
             }
-            StringBuilder sb = new StringBuilder();
-            if(isSerializerArg) {
-                sb.append(va.getName()).append(((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
-            } else {
-                sb.append(toVariableSerializationExpression(field, va, null));
+            if (vl.getIndex() != VariableLiteral.NO_INDEX) {
+                sb.append("[").append(vl.getIndex()).append("]");
             }
-            return getLanguageTypeNameForField(field) + "(" + ((VariableLiteral) vl.getArgs().get(0)).getName() + "ArraySizeInBytes(" + sb.toString() + "))";
+            return sb.toString() + ((vl.getChild() != null) ?
+                "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
         }
-        // The synthetic checksumRawData is a local field and should not be accessed as bean property.
-        boolean isSerializerArg = "checksumRawData".equals(vl.getName()) || "_value".equals(vl.getName()) || "element".equals(vl.getName());
-        boolean isTypeArg = "_type".equals(vl.getName());
-        if(!isSerializerArg && !isTypeArg && serialzerArguments != null) {
-            for (Argument serializerArgument : serialzerArguments) {
-                if (serializerArgument.getName().equals(vl.getName())) {
-                    isSerializerArg = true;
-                    break;
+        // If the current property references a discriminator value, we have to serialize it differently.
+        else if ((getFieldForNameFromCurrentOrParent(vl.getName()) != null) && (getFieldForNameFromCurrentOrParent(vl.getName()) instanceof DiscriminatorField)) {
+            final DiscriminatorField discriminatorField = (DiscriminatorField) getFieldForNameFromCurrentOrParent(vl.getName());
+            System.out.println(discriminatorField);
+        }
+        // If the current property references a parserArguments property and that is a discriminator property, we also have to serialize it differently..
+        else if ((vl.getChild() != null) && (getTypeReferenceForProperty(((ComplexTypeDefinition) getThisTypeDefinition()), vl.getName()) != null)) {
+            final Optional<TypeReference> typeReferenceForProperty = getTypeReferenceForProperty(((ComplexTypeDefinition) getThisTypeDefinition()), vl.getName());
+            if(typeReferenceForProperty.isPresent() && typeReferenceForProperty.get() instanceof ComplexTypeReference) {
+                final TypeReference complexTypeReference = typeReferenceForProperty.get();
+                TypeDefinition typeDefinition = getTypeDefinitionForTypeReference(complexTypeReference);
+                if(typeDefinition instanceof ComplexTypeDefinition) {
+                    ComplexTypeDefinition complexTypeDefinition = (ComplexTypeDefinition) typeDefinition;
+                    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) + "()";
+                    }
                 }
             }
         }
-        if(isSerializerArg) {
-            return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
-        } else if(isTypeArg) {
-            String part = vl.getChild().getName();
-            switch (part) {
-                case "name":
-                    return"\"" + field.getTypeName() + "\"";
-                case "length":
-                    return"\"" + ((SimpleTypeReference) field).getSizeInBits() + "\"";
-                case "encoding":
-                    String encoding = ((StringTypeReference) field.getType()).getEncoding();
-                    // Cut off the single quotes.
-                    encoding = encoding.substring(1, encoding.length() - 1);
-                    return"\"" + encoding + "\"";
-                default:
-                    return "";
-            }
-        } else {
-            return "m." + toVariableExpressionRest(vl);
+        // If the current term references a serialization argument, handle it differently (don't prefix it with "m.")
+        else if((serializerArguments != null) && Arrays.stream(serializerArguments).anyMatch(argument -> argument.getName().equals(vl.getName()))) {
+            return vl.getName() + ((vl.getChild() != null) ?
+                "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
         }
-    }
-
-    private String toVariableExpressionRest(VariableLiteral vl) {
-        if("lengthInBytes".equals(vl.getName())) {
-            return "LengthInBytes()";
-        } else if("lengthInBits".equals(vl.getName())) {
-            return "LengthInBits()";
+        // If the current term is an optional type, we need to add pointer access
+        // (Except if we're doing a nil/not-nil check)
+        else if((getFieldForNameFromCurrent(vl.getName()) instanceof OptionalField) && !suppressPointerAccess) {
+            return "*" + (serialize ? "m." : "") + vl.getName() + ((vl.getChild() != null) ?
+                "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
         }
-        return vl.getName() + ((vl.isIndexed() ? "[" + vl.getIndex() + "]" : "") +
-            ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : ""));
+        return (serialize ? "m." : "") + vl.getName() + ((vl.getChild() != null) ?
+            "." + toVariableExpression(typeReference, vl.getChild(), parserArguments, serializerArguments, false, suppressPointerAccess) : "");
     }
 
     public String getSizeInBits(ComplexTypeDefinition complexTypeDefinition, Argument[] parserArguments) {
@@ -614,10 +601,10 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 final SimpleTypeReference type = (SimpleTypeReference) arrayField.getType();
                 switch (arrayField.getLoopType()) {
                     case COUNT:
-                        sb.append("(").append(toSerializationExpression(null, arrayField.getLoopExpression(), parserArguments)).append(" * ").append(type.getSizeInBits()).append(") + ");
+                        sb.append("(").append(toTypedSerializationExpression(type, arrayField.getLoopExpression(), parserArguments)).append(" * ").append(type.getSizeInBits()).append(") + ");
                         break;
                     case LENGTH:
-                        sb.append("(").append(toSerializationExpression(null, arrayField.getLoopExpression(), parserArguments)).append(" * 8) + ");
+                        sb.append("(").append(toTypedSerializationExpression(type, arrayField.getLoopExpression(), parserArguments)).append(" * 8) + ");
                         break;
                     case TERMINATED:
                         // No terminated.
@@ -628,7 +615,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
                 final TypeReference type = typedField.getType();
                 if(field instanceof ManualField) {
                     ManualField manualField = (ManualField) field;
-                    sb.append("(").append(toSerializationExpression(null, manualField.getLengthExpression(), parserArguments)).append(") + ");
+                    sb.append("(").append(toSerializationExpression(manualField, manualField.getLengthExpression(), parserArguments)).append(") + ");
                 }
                 else if(type instanceof SimpleTypeReference) {
                     SimpleTypeReference simpleTypeReference = (SimpleTypeReference) type;
@@ -667,7 +654,7 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
         if (typeReference instanceof ComplexTypeReference) {
             // C doesn't like NULL values for enums, so we have to return something else (we'll treat -1 as NULL)
             if ("null".equals(valueString)) {
-                return "-1";
+                return "0";
             }
             String typeName = valueString.substring(0, valueString.indexOf('.'));
             String constantName = valueString.substring(valueString.indexOf('.') + 1);
diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultBooleanTypeReference.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultBooleanTypeReference.java
new file mode 100644
index 0000000..474f62f
--- /dev/null
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultBooleanTypeReference.java
@@ -0,0 +1,35 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.language.go.hack;
+
+import org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
+
+public class DefaultBooleanTypeReference implements SimpleTypeReference {
+
+    @Override
+    public SimpleBaseType getBaseType() {
+        return SimpleBaseType.BIT;
+    }
+
+    @Override
+    public int getSizeInBits() {
+        return 1;
+    }
+
+}
diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultFloatTypeReference.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultFloatTypeReference.java
new file mode 100644
index 0000000..1367abf
--- /dev/null
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultFloatTypeReference.java
@@ -0,0 +1,41 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.language.go.hack;
+
+import org.apache.plc4x.plugins.codegenerator.types.references.IntegerTypeReference;
+
+public class DefaultFloatTypeReference implements IntegerTypeReference {
+
+    private final int sizeInBits;
+
+    public DefaultFloatTypeReference(int sizeInBits) {
+        this.sizeInBits = sizeInBits;
+    }
+
+    @Override
+    public SimpleBaseType getBaseType() {
+        return SimpleBaseType.FLOAT;
+    }
+
+    @Override
+    public int getSizeInBits() {
+        return sizeInBits;
+    }
+
+}
diff --git a/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultIntegerTypeReference.java b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultIntegerTypeReference.java
new file mode 100644
index 0000000..553907a
--- /dev/null
+++ b/build-utils/language-go/src/main/java/org/apache/plc4x/language/go/hack/DefaultIntegerTypeReference.java
@@ -0,0 +1,41 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.language.go.hack;
+
+import org.apache.plc4x.plugins.codegenerator.types.references.IntegerTypeReference;
+
+public class DefaultIntegerTypeReference implements IntegerTypeReference {
+
+    private final int sizeInBits;
+
+    public DefaultIntegerTypeReference(int sizeInBits) {
+        this.sizeInBits = sizeInBits;
+    }
+
+    @Override
+    public SimpleBaseType getBaseType() {
+        return SimpleBaseType.UINT;
+    }
+
+    @Override
+    public int getSizeInBits() {
+        return sizeInBits;
+    }
+
+}
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 7c65394..2d1fece 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
@@ -88,7 +88,7 @@ public class ${type.name}IO {
     private static final Logger LOGGER = LoggerFactory.getLogger(${type.name}IO.class);
 
     public static PlcValue staticParse(ReadBuffer io<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) throws ParseException {
-        <#list type.switchField.cases as case><#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{ // ${case.name}
+        <#list type.switchField.cases as case><#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toTypedParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{ // ${case.name}
             <#assign skipReturn=false>
             <#list case.fields as field>
                 <#switch field.typeName>
@@ -102,15 +102,15 @@ public class ${type.name}IO {
             <#-- If this is a count array, we can directly initialize an array with the given size -->
                         <#if helper.isCountArrayField(field)>
             // Count array
-            if(${helper.toParseExpression(field, field.loopExpression, type.parserArguments)} > Integer.MAX_VALUE) {
-                throw new ParseException("Array count of " + (${helper.toParseExpression(field, field.loopExpression, type.parserArguments)}) + " exceeds the maximum allowed count of " + Integer.MAX_VALUE);
+            if(${helper.toTypedParseExpression(field, field.loopExpression, type.parserArguments)} > Integer.MAX_VALUE) {
+                throw new ParseException("Array count of " + (${helper.toTypedParseExpression(field, field.loopExpression, type.parserArguments)}) + " exceeds the maximum allowed count of " + Integer.MAX_VALUE);
             }
             List<Plc${case.name}> ${field.name};
             {
-                int itemCount = (int) ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)};
+                int itemCount = (int) ${helper.toTypedParseExpression(field, field.loopExpression, type.parserArguments)};
                 ${field.name} = new LinkedList<>();
                 for(int curItem = 0; curItem < itemCount; curItem++) {
-                    ${field.name}.add(new Plc${case.name}((${helper.getNonPrimitiveLanguageTypeNameForField(field)}) <#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)})<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toParseExpression(field, parserArgument, type [...]
+                    ${field.name}.add(new Plc${case.name}((${helper.getNonPrimitiveLanguageTypeNameForField(field)}) <#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)})<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toTypedParseExpression(field, parserArgument, [...]
                 }
             }
             <#-- In all other cases do we have to work with a list, that is later converted to an array -->
@@ -118,11 +118,11 @@ public class ${type.name}IO {
             <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
                             <#if helper.isLengthArrayField(field)>
             // Length array
-            int _${field.name}Length = ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)};
+            int _${field.name}Length = ${helper.toTypedParseExpression(field, field.loopExpression, type.parserArguments)};
             List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
             int ${field.name}EndPos = io.getPos() + _${field.name}Length;
             while(io.getPos() < ${field.name}EndPos) {
-                _${field.name}List.add(<#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>);
+                _${field.name}List.add(<#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toTypedParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>);
                 <#-- After parsing, update the current position, but only if it's needed -->
                                 <#if field.loopExpression.contains("curPos")>
                 curPos = io.getPos() - startPos;
@@ -132,8 +132,8 @@ public class ${type.name}IO {
                             <#elseif helper.isTerminatedArrayField(field)>
             // Terminated array
             List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
-            while(!((boolean) (${helper.toParseExpression(field, field.loopExpression, type.parserArguments)}))) {
-                _${field.name}List.add(<#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>);
+            while(!((boolean) (${helper.toTypedParseExpression(field, field.loopExpression, type.parserArguments)}))) {
+                _${field.name}List.add(<#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toTypedParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>);
 
                 <#-- After parsing, update the current position, but only if it's needed -->
                                 <#if field.loopExpression.contains("curPos")>
@@ -172,7 +172,7 @@ public class ${type.name}IO {
                     <#case "manual">
 
             // Manual Field (${field.name})
-            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.parseExpression, type.parserArguments)});
+            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toTypedParseExpression(field, field.parseExpression, type.parserArguments)});
                         <#-- If a manual field is detected, the value returned by this is instantly treated as the value -->
                         <#switch case.name>
                             <#case "Time">
@@ -209,7 +209,7 @@ public class ${type.name}IO {
                     <#case "simple">
 
             // Simple Field (${field.name})
-            ${helper.getNonPrimitiveLanguageTypeNameForField(field)} ${field.name} = <#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep [...]
+            ${helper.getNonPrimitiveLanguageTypeNameForField(field)} ${field.name} = <#if helper.isSimpleTypeReference(field.type)>${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(field.type, parserArgument?index), true)}) (${helper.toTypedParseExpression(field, parserArgument, type.parserArguments)})<#sep>, < [...]
                     <#break>
                 </#switch>
             </#list>
@@ -258,7 +258,7 @@ public class ${type.name}IO {
     }
 
     public static WriteBuffer staticSerialize(PlcValue _value<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>, boolean littleEndian) throws ParseException {
-        <#list type.switchField.cases as case><#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{ // ${case.name}
+        <#list type.switchField.cases as case><#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toTypedParseExpression(null, type.switchField.discriminatorExpressions[discriminatorValue?index], type.parserArguments)}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{ // ${case.name}
             WriteBuffer io = new WriteBuffer(${helper.getSizeInBits(case, type.parserArguments)} / 8, littleEndian);
 
             <#list case.fields as field>
@@ -276,7 +276,7 @@ public class ${type.name}IO {
                     <#break>
                     <#case "manual">
             // Manual Field (${field.name})
-            ${helper.toSerializationExpression(field, field.serializeExpression, type.parserArguments)};
+            ${helper.toTypedSerializationExpression(field, field.serializeExpression, type.parserArguments)};
                     <#break>
                     <#case "reserved">
             // Reserved Field
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 58a001d..536e5c6 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
@@ -79,7 +79,17 @@ func (e ${type.name}) Get${constantName?cap_first}() ${helper.getLanguageTypeNam
     </#list>
 </#if>
 
-<#if type.type?has_content>
+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}
+        }
+        return 0
+    }
+    return castFunc(structType)
+}
+
+    <#if type.type?has_content>
 func ${type.name}Parse(io spi.ReadBuffer) (${type.name}, error) {
     // TODO: Implement ...
     return 0, nil
diff --git a/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh b/build-utils/language-go/src/main/resources/templates/go/model-template.ftlh
index 535e92a..50be9ec 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
@@ -153,6 +153,26 @@ func New${type.name}(<#list type.getPropertyFields() as field>${field.name} <#if
 }
 </#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}
+        }
+        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>
     <#list type.fields as field>
@@ -237,7 +257,7 @@ func (m ${type.name}) LengthInBits() uint16 {
 
     // Padding Field (padding)
             <#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
-    _timesPadding := uint8(${helper.toParseExpression(paddingField, paddingField.paddingCondition, type.parserArguments)?replace("lastItem", "false")})
+    _timesPadding := uint8(${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)?replace("lastItem", "false")})
     for ;_timesPadding > 0; _timesPadding-- {
         lengthInBits += ${simpleTypeReference.sizeInBits}
     }
@@ -300,14 +320,14 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#if helper.isCountArrayField(field)>
     // Count array
     {
-        ${arrayField.name} := make([]${helper.getLanguageTypeNameForField(field)}, ${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} )
-        for curItem := uint16(0); curItem < uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}); curItem++ {
-<#if (!helper.isSimpleTypeReference(arrayField.type)) && helper.requiresVariable(arrayField, "lastItem")>            lastItem := curItem == uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)}  - 1)</#if>
+        ${arrayField.name} := make([]${helper.getLanguageTypeNameForField(field)}, ${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)})
+        for curItem := uint16(0); curItem < uint16(${helper.toIntegerParseExpression(16, arrayField.loopExpression, type.parserArguments)}); curItem++ {
+<#if (!helper.isSimpleTypeReference(arrayField.type)) && helper.requiresVariable(arrayField, "lastItem")>            lastItem := curItem == uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)} - 1)</#if>
                     <#if helper.isSimpleTypeReference(arrayField.type)>
                         <#assign simpleTypeReference = arrayField.type>
             ${arrayField.name} = append(${arrayField.name}, ${helper.getReadBufferReadMethodCall(simpleTypeReference)})
                     <#else>
-            _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(arrayField.type, parserArgument?index))}(${helper.toParseExpression(arrayField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+            _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
             if _err != nil {
                 return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
             }
@@ -324,14 +344,14 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#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}Length := uint16(${helper.toParseExpression(arrayField, arrayField.loopExpression, type.parserArguments)})
-    _${arrayField.name}EndPos := io.GetPos() + _${arrayField.name}Length
+    _${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>
         ${arrayField.name} = append(${arrayField.name}, ${helper.getReadBufferReadMethodCall(simpleTypeReference)})
                     <#else>
-        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(arrayField.type, parserArgument?index))}(${helper.toParseExpression(arrayField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
         if _err != nil {
             return nil, errors.New("Error parsing '${arrayField.name}' field " + _err.Error())
         }
@@ -355,7 +375,7 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                         <#assign simpleTypeReference = arrayField.type>
         ${arrayField.name} = append(${arrayField.name}, ${helper.getReadBufferReadMethodCall(simpleTypeReference)})
                     <#else>
-        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(simpleField.type, parserArgument?index))}(${helper.toParseExpression(simpleField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+        _message, _err := ${arrayField.type.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument><#if helper.isOptionalField(helper.getFieldForNameFromCurrentOrParent(parserArgument.name))>*</#if>${helper.toTypedParseExpression(helper.getArgumentType(arrayField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
         if _err != nil {
         }
         var _item ${helper.getLanguageTypeNameForField(field)}
@@ -443,7 +463,7 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
                 <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
                     <#if helper.isLengthArrayField(field)>
     // Length array
-    _${manualArrayField.name}Length := ${helper.toParseExpression(manualArrayField, manualArrayField.loopExpression, type.parserArguments)}
+    _${manualArrayField.name}Length := ${helper.toIntegerParseExpression(16, manualArrayField.loopExpression, type.parserArguments)}
     List<${helper.getLanguageTypeNameForField(manualArrayField)}> _${manualArrayField.name}List = new LinkedList<>()
     ${manualArrayField.name}EndPos := io.GetPos() + _${manualArrayField.name}Length
     for ;io.GetPos() < ${manualArrayField.name}EndPos; {
@@ -495,12 +515,12 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     curPos = io.GetPos() - startPos
                 </#if>
     var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
-    if ${helper.toParseExpression(optionalField, optionalField.conditionExpression, type.parserArguments)} {
+    if ${helper.toBooleanParseExpression(optionalField.conditionExpression, type.parserArguments)} {
             <#if helper.isSimpleTypeReference(optionalField.type)>
         _val := ${helper.getReadBufferReadMethodCall(optionalField.type)}
         ${optionalField.name} = &_val
             <#else>
-        _message, _err := ${helper.getLanguageTypeNameForField(field)}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(optionalField.type, parserArgument?index))}(${helper.toParseExpression(optionalField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+        _message, _err := ${helper.getLanguageTypeNameForField(field)}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.toTypedParseExpression(helper.getArgumentType(optionalField.type, parserArgument?index), parserArgument, type.parserArguments)}<#sep>, </#sep></#list></#if>)
         if _err != nil {
             return nil, errors.New("Error parsing '${optionalField.name}' field " + _err.Error())
         }
@@ -550,7 +570,7 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)} = ${helper.getReadBufferReadMethodCall(simpleTypeReference)}
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
-    _${simpleField.name}Message, _err := ${complexTypeReference.name}Parse(io<#if field.params?has_content>, <#list field.params as parserArgument>${helper.getLanguageTypeNameForTypeReference(helper.getArgumentType(simpleField.type, parserArgument?index))}(${helper.toParseExpression(simpleField, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)
+    _${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())
     }
@@ -571,7 +591,7 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     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>${parserArgument.name}<#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>)
                 </#list>
     }
     if typeSwitchError != nil {
@@ -596,7 +616,7 @@ func ${type.name}Parse(io spi.ReadBuffer<#if type.parserArguments?has_content>,
     </#if>
 }
 
-func (m ${type.name}) Serialize(io spi.WriteBuffer) {
+func (m ${type.name}) Serialize(io spi.WriteBuffer<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name} ${helper.getLanguageTypeNameForTypeReference(parserArgument.type)}<#sep>, </#sep></#list></#if>) {
     <#assign arraySizeInBytesHelpers=helper.requiresHelperFunctions("ARRAY_SIZE_IN_BYTES")>
     <#if arraySizeInBytesHelpers?has_content>
         <#list arraySizeInBytesHelpers?keys as key>
@@ -610,157 +630,153 @@ func (m ${type.name}) Serialize(io spi.WriteBuffer) {
     }
         </#list>
     </#if>
-    serializeFunc := func(typ interface{}) {
-        if <#if helper.isDiscriminatedParentTypeDefinition()>i${type.name}<#else>_</#if>, ok :=typ.(I${type.name}); ok {
+    <#if helper.isDiscriminatedParentTypeDefinition()>i${type.name} := CastI${type.name}(m)</#if>
     <#list type.fields as field>
         <#switch field.typeName>
             <#case "array">
                 <#assign arrayField = field>
                 <#assign simpleTypeReference = arrayField.type>
 
-            // Array Field (${arrayField.name})
-            if m.${arrayField.name} != nil {
+    // Array Field (${arrayField.name})
+    if m.${arrayField.name} != nil {
                 <#if helper.isComplexTypeReference(arrayField.type) && (helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true))>
-                itemCount := uint16(len(m.${arrayField.name}))
-                var curItem uint16 = 0
+        itemCount := uint16(len(m.${arrayField.name}))
+        var curItem uint16 = 0
                 </#if>
-                for _, _element := range m.${arrayField.name} {
+        for _, _element := range m.${arrayField.name} {
                 <#if helper.isSimpleTypeReference(arrayField.type)>
                     <#assign simpleTypeReference = arrayField.type>
-                    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_element")}
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "_element")}
                 <#else>
                     <#assign complexTypeReference = arrayField.type>
                     <#if helper.needsVariable(arrayField, "lastItem", true)>
-                    var lastItem bool = curItem == (itemCount - 1)
+            var lastItem bool = curItem == (itemCount - 1)
                     </#if>
-                    _element.Serialize(io<#if helper.getSerializerTerms(field.params)?has_content>, <#list helper.getSerializerTerms(field.params) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
+            _element.Serialize(io<#if helper.getSerializerTerms(field.params)?has_content>, <#list helper.getSerializerTerms(field.params) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>)
                 </#if>
                     <#if helper.needsVariable(arrayField, "curItem", true) || helper.needsVariable(arrayField, "lastItem", true)>
-                    curItem++
+            curItem++
                     </#if>
-                }
-            }
+        }
+    }
                 <#break>
             <#case "checksum">
                 <#assign checksumField = field>
                 <#assign simpleTypeReference = checksumField.type>
 
-            // Checksum Field (checksum) (Calculated)
-            {
-                _checksum := ${helper.getNullValueForTypeReference(checksumField.type)}
-                // Create an array of all the bytes written in this message element so far.
-                checksumRawData []uint8 = io.getBytes(startPos, io.GetPos())
-                _checksum = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
-                ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")}
-            }
+    // Checksum Field (checksum) (Calculated)
+    {
+        _checksum := ${helper.getLanguageTypeNameForField(field)}(${helper.getNullValueForTypeReference(checksumField.type)})
+        // Create an array of all the bytes written in this message element so far.
+        checksumRawData []uint8 = io.getBytes(startPos, io.GetPos())
+        _checksum = ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(checksumField, checksumField.checksumExpression, type.parserArguments)})
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_checksum)")}
+    }
                 <#break>
             <#case "const">
                 <#assign constField = field>
                 <#assign simpleTypeReference = constField.type>
 
-            // Const Field (${constField.name})
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)}
+    // Const Field (${constField.name})
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, constField.referenceValue)}
                 <#break>
             <#case "discriminator">
                 <#assign discriminatorField = field>
                 <#assign simpleTypeReference = discriminatorField.type>
 
-            // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
-            ${discriminatorField.name} := ${type.name}${discriminatorField.name?cap_first}(i${type.name})
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
+    // Discriminator Field (${discriminatorField.name}) (Used as input to a switch field)
+    ${discriminatorField.name} := ${helper.getLanguageTypeNameForField(field)}(${type.name}${discriminatorField.name?cap_first}(i${type.name}))
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + discriminatorField.name + ")")}
                 <#break>
             <#case "enum">
                 <#assign enumField = field>
 
-            // Enum field (${enumField.name})
-            ${enumField.name} := m.${enumField.name}
-            ${enumField.name}.Serialize(io)
+    // Enum field (${enumField.name})
+    ${enumField.name} := ${helper.getLanguageTypeNameForField(field)}(m.${enumField.name})
+    ${enumField.name}.Serialize(io)
                 <#break>
             <#case "implicit">
                 <#assign implicitField = field>
                 <#assign simpleTypeReference = implicitField.type>
 
-            // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-            ${implicitField.name} := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)})
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")}
+    // Implicit Field (${implicitField.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+    ${implicitField.name} := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(implicitField, implicitField.serializeExpression, type.parserArguments)})
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + implicitField.name + ")")}
                 <#break>
             <#case "manualArray">
                 <#assign manualArrayField = field>
 
-            // Manual Array Field (${manualArrayField.name})
-            if m.${manualArrayField.name} != nil {
-                for(${helper.getLanguageTypeNameForField(field)} element : m.${manualArrayField.name}) {
-                    ${helper.toSerializationExpression(manualArrayField, manualArrayField.serializeExpression, type.parserArguments)}
-                }
-            }
+    // Manual Array Field (${manualArrayField.name})
+    if m.${manualArrayField.name} != nil {
+        for(${helper.getLanguageTypeNameForField(field)} element : m.${manualArrayField.name}) {
+            ${helper.toSerializationExpression(manualArrayField, manualArrayField.serializeExpression, type.parserArguments)}
+        }
+    }
                 <#break>
             <#case "manual">
                 <#assign manualField = field>
 
-            // Manual Field (${manualField.name})
-            ${helper.toSerializationExpression(manualField, manualField.serializeExpression, type.parserArguments)}
+    // Manual Field (${manualField.name})
+    ${helper.toSerializationExpression(manualField, manualField.serializeExpression, type.parserArguments)}
                 <#break>
             <#case "optional">
                 <#assign optionalField = field>
 
-            // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
-            var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
-            if m.${optionalField.name} != nil {
-                ${optionalField.name} = m.${optionalField.name}
+    // Optional Field (${optionalField.name}) (Can be skipped, if the value is null)
+    var ${optionalField.name} *${helper.getLanguageTypeNameForField(field)} = nil
+    if m.${optionalField.name} != nil {
+        ${optionalField.name} = m.${optionalField.name}
                 <#if helper.isSimpleTypeReference(optionalField.type)>
                     <#assign simpleTypeReference = optionalField.type>
-                ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "*(" + optionalField.name + ")")}
+        ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "*(" + optionalField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = optionalField.type>
-                ${optionalField.name}.Serialize(io)
+        ${optionalField.name}.Serialize(io)
                 </#if>
-            }
+    }
                 <#break>
             <#case "padding">
                 <#assign paddingField = field>
                 <#assign simpleTypeReference = paddingField.type>
 
-            // Padding Field (padding)
-            {
-                _timesPadding := uint8(${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
-                for ;_timesPadding > 0; _timesPadding-- {
-                    _paddingValue := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(paddingField, paddingField.paddingValue, type.parserArguments)})
-                    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_paddingValue)")}
-                }
-            }
+    // Padding Field (padding)
+    {
+        _timesPadding := uint8(${helper.toSerializationExpression(paddingField, paddingField.paddingCondition, type.parserArguments)})
+        for ;_timesPadding > 0; _timesPadding-- {
+            _paddingValue := ${helper.getLanguageTypeNameForField(field)}(${helper.toSerializationExpression(paddingField, paddingField.paddingValue, type.parserArguments)})
+            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(_paddingValue)")}
+        }
+    }
                 <#break>
             <#case "reserved">
                 <#assign reservedField = field>
                 <#assign simpleTypeReference = reservedField.type>
 
-            // Reserved Field (reserved)
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))}
+    // Reserved Field (reserved)
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, helper.getReservedValue(field))}
                 <#break>
             <#case "simple">
                 <#assign simpleField = field>
 
-            // Simple Field (${simpleField.name})
-            var ${simpleField.name} ${helper.getLanguageTypeNameForField(field)} = m.${simpleField.name}
+    // Simple Field (${simpleField.name})
+    ${simpleField.name} := ${helper.getLanguageTypeNameForField(field)}(m.${simpleField.name})
                 <#if helper.isSimpleTypeReference(simpleField.type)>
                     <#assign simpleTypeReference = simpleField.type>
-            ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
+    ${helper.getWriteBufferWriteMethodCall(simpleTypeReference, "(" + simpleField.name + ")")}
                 <#else>
                     <#assign complexTypeReference = simpleField.type>
-            ${simpleField.name}.Serialize(io)
+    ${simpleField.name}.Serialize(io)
                 </#if>
                 <#break>
             <#case "switch">
                 <#assign switchField = field>
 
-            // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-            i${type.name}.Serialize(io)
+    // Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+    i${type.name}.Serialize(io)
                 <#break>
             <#case "virtual">
                 <#break>
         </#switch>
     </#list>
-        }
-    }
-    serializeFunc(m)
 }
 </#outputformat>
\ No newline at end of file
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultBooleanTypeReference.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultBooleanTypeReference.java
new file mode 100644
index 0000000..845945f
--- /dev/null
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultBooleanTypeReference.java
@@ -0,0 +1,29 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.plugins.codegenerator.language.mspec.model.references;
+
+import org.apache.plc4x.plugins.codegenerator.types.references.BooleanTypeReference;
+
+public class DefaultBooleanTypeReference extends DefaultSimpleTypeReference implements BooleanTypeReference {
+
+    public DefaultBooleanTypeReference() {
+        super(SimpleBaseType.BIT, 1);
+    }
+
+}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 554ce4c..2c58f2c 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -453,6 +453,9 @@ public class MessageFormatListener extends MSpecBaseListener {
             (simpleBaseType == SimpleTypeReference.SimpleBaseType.DATETIME)) {
             return new DefaultTemporalTypeReference(simpleBaseType);
         }
+        else if(simpleBaseType == SimpleTypeReference.SimpleBaseType.BIT) {
+            return new DefaultBooleanTypeReference();
+        }
         // In all other cases (bit) it's just assume it's length it 1.
         else {
             return new DefaultIntegerTypeReference(simpleBaseType, 1);
diff --git a/pom.xml b/pom.xml
index df66a7f..d11ce44 100644
--- a/pom.xml
+++ b/pom.xml
@@ -101,7 +101,7 @@
     <!-- Exclude all generated code -->
     <sonar.exclusions>**/generated-sources</sonar.exclusions>
 
-    <plc4x-code-generation.version>1.3.0</plc4x-code-generation.version>
+    <plc4x-code-generation.version>1.4.0-SNAPSHOT</plc4x-code-generation.version>
 
     <antlr.version>4.8</antlr.version>
     <apiguardian.version>1.1.0</apiguardian.version>
diff --git a/sandbox/plc4go/cmd/main/drivers/bacnetip.go b/sandbox/plc4go/cmd/main/drivers/bacnetip.go
index 3622bda..83a7139 100644
--- a/sandbox/plc4go/cmd/main/drivers/bacnetip.go
+++ b/sandbox/plc4go/cmd/main/drivers/bacnetip.go
@@ -15,7 +15,7 @@
 //
 package drivers
 
-/*import (
+import (
 	"encoding/hex"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/bacnetip/readwrite/model"
 	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
@@ -35,4 +35,4 @@ func BacnetIp() {
 		// Output success ...
 	}
 
-}*/
+}
diff --git a/sandbox/plc4go/cmd/main/drivers/s7.go b/sandbox/plc4go/cmd/main/drivers/s7.go
index 7f1ada5..a3f2691 100644
--- a/sandbox/plc4go/cmd/main/drivers/s7.go
+++ b/sandbox/plc4go/cmd/main/drivers/s7.go
@@ -15,13 +15,7 @@
 //
 package drivers
 
-/*import (
-    "encoding/hex"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/s7/readwrite/model"
-	"plc4x.apache.org/plc4go-modbus-driver/0.8.0/internal/plc4go/spi"
-)
-
-func S7() {
+/*func S7() {
 	request, err := hex.DecodeString("000a00000006010300000004")
 	if err != nil {
 		// Output an error ...
diff --git a/sandbox/plc4go/cmd/main/main.go b/sandbox/plc4go/cmd/main/main.go
index 2ac93e8..c7873f4 100644
--- a/sandbox/plc4go/cmd/main/main.go
+++ b/sandbox/plc4go/cmd/main/main.go
@@ -20,7 +20,7 @@ import (
 )
 
 func main() {
-	//drivers.BacnetIp()
+	drivers.BacnetIp()
 	drivers.KnxNetIp()
 	drivers.Modbus()
 	//drivers.S7()
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
index 9773078..2531d24 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDU.go
@@ -42,6 +42,26 @@ func APDUApduType(m IAPDU) uint8 {
 	return m.ApduType()
 }
 
+func CastIAPDU(structType interface{}) IAPDU {
+	castFunc := func(typ interface{}) IAPDU {
+		if iAPDU, ok := typ.(IAPDU); ok {
+			return iAPDU
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDU(structType interface{}) APDU {
+	castFunc := func(typ interface{}) APDU {
+		if sAPDU, ok := typ.(APDU); ok {
+			return sAPDU
+		}
+		return APDU{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDU) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -92,16 +112,12 @@ func APDUParse(io spi.ReadBuffer, apduLength uint16) (spi.Message, error) {
 }
 
 func (m APDU) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iAPDU, ok := typ.(IAPDU); ok {
+	iAPDU := CastIAPDU(m)
 
-			// Discriminator Field (apduType) (Used as input to a switch field)
-			apduType := APDUApduType(iAPDU)
-			io.WriteUint8(4, (apduType))
+	// Discriminator Field (apduType) (Used as input to a switch field)
+	apduType := uint8(APDUApduType(iAPDU))
+	io.WriteUint8(4, (apduType))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iAPDU.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iAPDU.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
index b2a0695..03168f5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUAbort.go
@@ -50,6 +50,26 @@ func NewAPDUAbort(server bool, originalInvokeId uint8, abortReason uint8) APDUIn
 	return &APDUAbort{server: server, originalInvokeId: originalInvokeId, abortReason: abortReason}
 }
 
+func CastIAPDUAbort(structType interface{}) IAPDUAbort {
+	castFunc := func(typ interface{}) IAPDUAbort {
+		if iAPDUAbort, ok := typ.(IAPDUAbort); ok {
+			return iAPDUAbort
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUAbort(structType interface{}) APDUAbort {
+	castFunc := func(typ interface{}) APDUAbort {
+		if sAPDUAbort, ok := typ.(APDUAbort); ok {
+			return sAPDUAbort
+		}
+		return APDUAbort{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUAbort) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -99,24 +119,19 @@ func APDUAbortParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUAbort) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUAbort); ok {
 
-			// Reserved Field (reserved)
-			io.WriteUint8(3, uint8(0x00))
+	// Reserved Field (reserved)
+	io.WriteUint8(3, uint8(0x00))
 
-			// Simple Field (server)
-			var server bool = m.server
-			io.WriteBit((bool)(server))
+	// Simple Field (server)
+	server := bool(m.server)
+	io.WriteBit((bool)(server))
 
-			// Simple Field (originalInvokeId)
-			var originalInvokeId uint8 = m.originalInvokeId
-			io.WriteUint8(8, (originalInvokeId))
+	// Simple Field (originalInvokeId)
+	originalInvokeId := uint8(m.originalInvokeId)
+	io.WriteUint8(8, (originalInvokeId))
 
-			// Simple Field (abortReason)
-			var abortReason uint8 = m.abortReason
-			io.WriteUint8(8, (abortReason))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (abortReason)
+	abortReason := uint8(m.abortReason)
+	io.WriteUint8(8, (abortReason))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
index 39294fc..d369ea9 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUComplexAck.go
@@ -55,6 +55,26 @@ func NewAPDUComplexAck(segmentedMessage bool, moreFollows bool, originalInvokeId
 	return &APDUComplexAck{segmentedMessage: segmentedMessage, moreFollows: moreFollows, originalInvokeId: originalInvokeId, sequenceNumber: sequenceNumber, proposedWindowSize: proposedWindowSize, serviceAck: serviceAck}
 }
 
+func CastIAPDUComplexAck(structType interface{}) IAPDUComplexAck {
+	castFunc := func(typ interface{}) IAPDUComplexAck {
+		if iAPDUComplexAck, ok := typ.(IAPDUComplexAck); ok {
+			return iAPDUComplexAck
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUComplexAck(structType interface{}) APDUComplexAck {
+	castFunc := func(typ interface{}) APDUComplexAck {
+		if sAPDUComplexAck, ok := typ.(APDUComplexAck); ok {
+			return sAPDUComplexAck
+		}
+		return APDUComplexAck{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUComplexAck) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -142,42 +162,37 @@ func APDUComplexAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUComplexAck) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUComplexAck); ok {
-
-			// Simple Field (segmentedMessage)
-			var segmentedMessage bool = m.segmentedMessage
-			io.WriteBit((bool)(segmentedMessage))
-
-			// Simple Field (moreFollows)
-			var moreFollows bool = m.moreFollows
-			io.WriteBit((bool)(moreFollows))
-
-			// Reserved Field (reserved)
-			io.WriteUint8(2, uint8(0))
-
-			// Simple Field (originalInvokeId)
-			var originalInvokeId uint8 = m.originalInvokeId
-			io.WriteUint8(8, (originalInvokeId))
-
-			// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
-			var sequenceNumber *uint8 = nil
-			if m.sequenceNumber != nil {
-				sequenceNumber = m.sequenceNumber
-				io.WriteUint8(8, *(sequenceNumber))
-			}
-
-			// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
-			var proposedWindowSize *uint8 = nil
-			if m.proposedWindowSize != nil {
-				proposedWindowSize = m.proposedWindowSize
-				io.WriteUint8(8, *(proposedWindowSize))
-			}
-
-			// Simple Field (serviceAck)
-			var serviceAck BACnetServiceAck = m.serviceAck
-			serviceAck.Serialize(io)
-		}
+
+	// Simple Field (segmentedMessage)
+	segmentedMessage := bool(m.segmentedMessage)
+	io.WriteBit((bool)(segmentedMessage))
+
+	// Simple Field (moreFollows)
+	moreFollows := bool(m.moreFollows)
+	io.WriteBit((bool)(moreFollows))
+
+	// Reserved Field (reserved)
+	io.WriteUint8(2, uint8(0))
+
+	// Simple Field (originalInvokeId)
+	originalInvokeId := uint8(m.originalInvokeId)
+	io.WriteUint8(8, (originalInvokeId))
+
+	// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
+	var sequenceNumber *uint8 = nil
+	if m.sequenceNumber != nil {
+		sequenceNumber = m.sequenceNumber
+		io.WriteUint8(8, *(sequenceNumber))
 	}
-	serializeFunc(m)
+
+	// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
+	var proposedWindowSize *uint8 = nil
+	if m.proposedWindowSize != nil {
+		proposedWindowSize = m.proposedWindowSize
+		io.WriteUint8(8, *(proposedWindowSize))
+	}
+
+	// Simple Field (serviceAck)
+	serviceAck := BACnetServiceAck(m.serviceAck)
+	serviceAck.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
index 4dca969..63ade1d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -58,6 +58,26 @@ func NewAPDUConfirmedRequest(segmentedMessage bool, moreFollows bool, segmentedR
 	return &APDUConfirmedRequest{segmentedMessage: segmentedMessage, moreFollows: moreFollows, segmentedResponseAccepted: segmentedResponseAccepted, maxSegmentsAccepted: maxSegmentsAccepted, maxApduLengthAccepted: maxApduLengthAccepted, invokeId: invokeId, sequenceNumber: sequenceNumber, proposedWindowSize: proposedWindowSize, serviceRequest: serviceRequest}
 }
 
+func CastIAPDUConfirmedRequest(structType interface{}) IAPDUConfirmedRequest {
+	castFunc := func(typ interface{}) IAPDUConfirmedRequest {
+		if iAPDUConfirmedRequest, ok := typ.(IAPDUConfirmedRequest); ok {
+			return iAPDUConfirmedRequest
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUConfirmedRequest(structType interface{}) APDUConfirmedRequest {
+	castFunc := func(typ interface{}) APDUConfirmedRequest {
+		if sAPDUConfirmedRequest, ok := typ.(APDUConfirmedRequest); ok {
+			return sAPDUConfirmedRequest
+		}
+		return APDUConfirmedRequest{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUConfirmedRequest) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -148,7 +168,7 @@ func APDUConfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInitia
 	}
 
 	// Simple Field (serviceRequest)
-	_serviceRequestMessage, _err := BACnetConfirmedServiceRequestParse(io, uint16((apduLength)-((3)+(spi.InlineIf((segmentedMessage), uint16(2), uint16(0))))))
+	_serviceRequestMessage, _err := BACnetConfirmedServiceRequestParse(io, uint16(apduLength)-uint16(uint16(uint16(uint16(3))+uint16(uint16(spi.InlineIf(segmentedMessage, uint16(uint16(2)), uint16(uint16(0))))))))
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'serviceRequest'. " + _err.Error())
 	}
@@ -163,54 +183,49 @@ func APDUConfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInitia
 }
 
 func (m APDUConfirmedRequest) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUConfirmedRequest); ok {
-
-			// Simple Field (segmentedMessage)
-			var segmentedMessage bool = m.segmentedMessage
-			io.WriteBit((bool)(segmentedMessage))
-
-			// Simple Field (moreFollows)
-			var moreFollows bool = m.moreFollows
-			io.WriteBit((bool)(moreFollows))
-
-			// Simple Field (segmentedResponseAccepted)
-			var segmentedResponseAccepted bool = m.segmentedResponseAccepted
-			io.WriteBit((bool)(segmentedResponseAccepted))
-
-			// Reserved Field (reserved)
-			io.WriteUint8(2, uint8(0))
-
-			// Simple Field (maxSegmentsAccepted)
-			var maxSegmentsAccepted uint8 = m.maxSegmentsAccepted
-			io.WriteUint8(3, (maxSegmentsAccepted))
-
-			// Simple Field (maxApduLengthAccepted)
-			var maxApduLengthAccepted uint8 = m.maxApduLengthAccepted
-			io.WriteUint8(4, (maxApduLengthAccepted))
-
-			// Simple Field (invokeId)
-			var invokeId uint8 = m.invokeId
-			io.WriteUint8(8, (invokeId))
-
-			// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
-			var sequenceNumber *uint8 = nil
-			if m.sequenceNumber != nil {
-				sequenceNumber = m.sequenceNumber
-				io.WriteUint8(8, *(sequenceNumber))
-			}
-
-			// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
-			var proposedWindowSize *uint8 = nil
-			if m.proposedWindowSize != nil {
-				proposedWindowSize = m.proposedWindowSize
-				io.WriteUint8(8, *(proposedWindowSize))
-			}
-
-			// Simple Field (serviceRequest)
-			var serviceRequest BACnetConfirmedServiceRequest = m.serviceRequest
-			serviceRequest.Serialize(io)
-		}
+
+	// Simple Field (segmentedMessage)
+	segmentedMessage := bool(m.segmentedMessage)
+	io.WriteBit((bool)(segmentedMessage))
+
+	// Simple Field (moreFollows)
+	moreFollows := bool(m.moreFollows)
+	io.WriteBit((bool)(moreFollows))
+
+	// Simple Field (segmentedResponseAccepted)
+	segmentedResponseAccepted := bool(m.segmentedResponseAccepted)
+	io.WriteBit((bool)(segmentedResponseAccepted))
+
+	// Reserved Field (reserved)
+	io.WriteUint8(2, uint8(0))
+
+	// Simple Field (maxSegmentsAccepted)
+	maxSegmentsAccepted := uint8(m.maxSegmentsAccepted)
+	io.WriteUint8(3, (maxSegmentsAccepted))
+
+	// Simple Field (maxApduLengthAccepted)
+	maxApduLengthAccepted := uint8(m.maxApduLengthAccepted)
+	io.WriteUint8(4, (maxApduLengthAccepted))
+
+	// Simple Field (invokeId)
+	invokeId := uint8(m.invokeId)
+	io.WriteUint8(8, (invokeId))
+
+	// Optional Field (sequenceNumber) (Can be skipped, if the value is null)
+	var sequenceNumber *uint8 = nil
+	if m.sequenceNumber != nil {
+		sequenceNumber = m.sequenceNumber
+		io.WriteUint8(8, *(sequenceNumber))
+	}
+
+	// Optional Field (proposedWindowSize) (Can be skipped, if the value is null)
+	var proposedWindowSize *uint8 = nil
+	if m.proposedWindowSize != nil {
+		proposedWindowSize = m.proposedWindowSize
+		io.WriteUint8(8, *(proposedWindowSize))
 	}
-	serializeFunc(m)
+
+	// Simple Field (serviceRequest)
+	serviceRequest := BACnetConfirmedServiceRequest(m.serviceRequest)
+	serviceRequest.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
index f9b8b0d..3364756 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUError.go
@@ -51,6 +51,26 @@ func NewAPDUError(originalInvokeId uint8, error BACnetError) APDUInitializer {
 	return &APDUError{originalInvokeId: originalInvokeId, error: error}
 }
 
+func CastIAPDUError(structType interface{}) IAPDUError {
+	castFunc := func(typ interface{}) IAPDUError {
+		if iAPDUError, ok := typ.(IAPDUError); ok {
+			return iAPDUError
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUError(structType interface{}) APDUError {
+	castFunc := func(typ interface{}) APDUError {
+		if sAPDUError, ok := typ.(APDUError); ok {
+			return sAPDUError
+		}
+		return APDUError{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUError) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -102,20 +122,15 @@ func APDUErrorParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUError) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUError); ok {
 
-			// Reserved Field (reserved)
-			io.WriteUint8(4, uint8(0x00))
+	// Reserved Field (reserved)
+	io.WriteUint8(4, uint8(0x00))
 
-			// Simple Field (originalInvokeId)
-			var originalInvokeId uint8 = m.originalInvokeId
-			io.WriteUint8(8, (originalInvokeId))
+	// Simple Field (originalInvokeId)
+	originalInvokeId := uint8(m.originalInvokeId)
+	io.WriteUint8(8, (originalInvokeId))
 
-			// Simple Field (error)
-			var error BACnetError = m.error
-			error.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (error)
+	error := BACnetError(m.error)
+	error.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
index b74c654..ce31a3e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUReject.go
@@ -49,6 +49,26 @@ func NewAPDUReject(originalInvokeId uint8, rejectReason uint8) APDUInitializer {
 	return &APDUReject{originalInvokeId: originalInvokeId, rejectReason: rejectReason}
 }
 
+func CastIAPDUReject(structType interface{}) IAPDUReject {
+	castFunc := func(typ interface{}) IAPDUReject {
+		if iAPDUReject, ok := typ.(IAPDUReject); ok {
+			return iAPDUReject
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUReject(structType interface{}) APDUReject {
+	castFunc := func(typ interface{}) APDUReject {
+		if sAPDUReject, ok := typ.(APDUReject); ok {
+			return sAPDUReject
+		}
+		return APDUReject{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUReject) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -92,20 +112,15 @@ func APDURejectParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUReject) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUReject); ok {
 
-			// Reserved Field (reserved)
-			io.WriteUint8(4, uint8(0x00))
+	// Reserved Field (reserved)
+	io.WriteUint8(4, uint8(0x00))
 
-			// Simple Field (originalInvokeId)
-			var originalInvokeId uint8 = m.originalInvokeId
-			io.WriteUint8(8, (originalInvokeId))
+	// Simple Field (originalInvokeId)
+	originalInvokeId := uint8(m.originalInvokeId)
+	io.WriteUint8(8, (originalInvokeId))
 
-			// Simple Field (rejectReason)
-			var rejectReason uint8 = m.rejectReason
-			io.WriteUint8(8, (rejectReason))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (rejectReason)
+	rejectReason := uint8(m.rejectReason)
+	io.WriteUint8(8, (rejectReason))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
index 9fc723e..49afbc1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSegmentAck.go
@@ -52,6 +52,26 @@ func NewAPDUSegmentAck(negativeAck bool, server bool, originalInvokeId uint8, se
 	return &APDUSegmentAck{negativeAck: negativeAck, server: server, originalInvokeId: originalInvokeId, sequenceNumber: sequenceNumber, proposedWindowSize: proposedWindowSize}
 }
 
+func CastIAPDUSegmentAck(structType interface{}) IAPDUSegmentAck {
+	castFunc := func(typ interface{}) IAPDUSegmentAck {
+		if iAPDUSegmentAck, ok := typ.(IAPDUSegmentAck); ok {
+			return iAPDUSegmentAck
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUSegmentAck(structType interface{}) APDUSegmentAck {
+	castFunc := func(typ interface{}) APDUSegmentAck {
+		if sAPDUSegmentAck, ok := typ.(APDUSegmentAck); ok {
+			return sAPDUSegmentAck
+		}
+		return APDUSegmentAck{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUSegmentAck) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -113,32 +133,27 @@ func APDUSegmentAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUSegmentAck) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUSegmentAck); ok {
 
-			// Reserved Field (reserved)
-			io.WriteUint8(2, uint8(0x00))
+	// Reserved Field (reserved)
+	io.WriteUint8(2, uint8(0x00))
 
-			// Simple Field (negativeAck)
-			var negativeAck bool = m.negativeAck
-			io.WriteBit((bool)(negativeAck))
+	// Simple Field (negativeAck)
+	negativeAck := bool(m.negativeAck)
+	io.WriteBit((bool)(negativeAck))
 
-			// Simple Field (server)
-			var server bool = m.server
-			io.WriteBit((bool)(server))
+	// Simple Field (server)
+	server := bool(m.server)
+	io.WriteBit((bool)(server))
 
-			// Simple Field (originalInvokeId)
-			var originalInvokeId uint8 = m.originalInvokeId
-			io.WriteUint8(8, (originalInvokeId))
+	// Simple Field (originalInvokeId)
+	originalInvokeId := uint8(m.originalInvokeId)
+	io.WriteUint8(8, (originalInvokeId))
 
-			// Simple Field (sequenceNumber)
-			var sequenceNumber uint8 = m.sequenceNumber
-			io.WriteUint8(8, (sequenceNumber))
+	// Simple Field (sequenceNumber)
+	sequenceNumber := uint8(m.sequenceNumber)
+	io.WriteUint8(8, (sequenceNumber))
 
-			// Simple Field (proposedWindowSize)
-			var proposedWindowSize uint8 = m.proposedWindowSize
-			io.WriteUint8(8, (proposedWindowSize))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (proposedWindowSize)
+	proposedWindowSize := uint8(m.proposedWindowSize)
+	io.WriteUint8(8, (proposedWindowSize))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
index 6d00d8f..68be30a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUSimpleAck.go
@@ -49,6 +49,26 @@ func NewAPDUSimpleAck(originalInvokeId uint8, serviceChoice uint8) APDUInitializ
 	return &APDUSimpleAck{originalInvokeId: originalInvokeId, serviceChoice: serviceChoice}
 }
 
+func CastIAPDUSimpleAck(structType interface{}) IAPDUSimpleAck {
+	castFunc := func(typ interface{}) IAPDUSimpleAck {
+		if iAPDUSimpleAck, ok := typ.(IAPDUSimpleAck); ok {
+			return iAPDUSimpleAck
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUSimpleAck(structType interface{}) APDUSimpleAck {
+	castFunc := func(typ interface{}) APDUSimpleAck {
+		if sAPDUSimpleAck, ok := typ.(APDUSimpleAck); ok {
+			return sAPDUSimpleAck
+		}
+		return APDUSimpleAck{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUSimpleAck) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -92,20 +112,15 @@ func APDUSimpleAckParse(io spi.ReadBuffer) (APDUInitializer, error) {
 }
 
 func (m APDUSimpleAck) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUSimpleAck); ok {
 
-			// Reserved Field (reserved)
-			io.WriteUint8(4, uint8(0))
+	// Reserved Field (reserved)
+	io.WriteUint8(4, uint8(0))
 
-			// Simple Field (originalInvokeId)
-			var originalInvokeId uint8 = m.originalInvokeId
-			io.WriteUint8(8, (originalInvokeId))
+	// Simple Field (originalInvokeId)
+	originalInvokeId := uint8(m.originalInvokeId)
+	io.WriteUint8(8, (originalInvokeId))
 
-			// Simple Field (serviceChoice)
-			var serviceChoice uint8 = m.serviceChoice
-			io.WriteUint8(8, (serviceChoice))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (serviceChoice)
+	serviceChoice := uint8(m.serviceChoice)
+	io.WriteUint8(8, (serviceChoice))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
index 598351e..6f05991 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
@@ -50,6 +50,26 @@ func NewAPDUUnconfirmedRequest(serviceRequest BACnetUnconfirmedServiceRequest) A
 	return &APDUUnconfirmedRequest{serviceRequest: serviceRequest}
 }
 
+func CastIAPDUUnconfirmedRequest(structType interface{}) IAPDUUnconfirmedRequest {
+	castFunc := func(typ interface{}) IAPDUUnconfirmedRequest {
+		if iAPDUUnconfirmedRequest, ok := typ.(IAPDUUnconfirmedRequest); ok {
+			return iAPDUUnconfirmedRequest
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastAPDUUnconfirmedRequest(structType interface{}) APDUUnconfirmedRequest {
+	castFunc := func(typ interface{}) APDUUnconfirmedRequest {
+		if sAPDUUnconfirmedRequest, ok := typ.(APDUUnconfirmedRequest); ok {
+			return sAPDUUnconfirmedRequest
+		}
+		return APDUUnconfirmedRequest{}
+	}
+	return castFunc(structType)
+}
+
 func (m APDUUnconfirmedRequest) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.APDU.LengthInBits()
 
@@ -80,7 +100,7 @@ func APDUUnconfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInit
 	}
 
 	// Simple Field (serviceRequest)
-	_serviceRequestMessage, _err := BACnetUnconfirmedServiceRequestParse(io, uint16((apduLength)-(1)))
+	_serviceRequestMessage, _err := BACnetUnconfirmedServiceRequestParse(io, uint16(apduLength)-uint16(uint16(1)))
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'serviceRequest'. " + _err.Error())
 	}
@@ -95,16 +115,11 @@ func APDUUnconfirmedRequestParse(io spi.ReadBuffer, apduLength uint16) (APDUInit
 }
 
 func (m APDUUnconfirmedRequest) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IAPDUUnconfirmedRequest); ok {
 
-			// Reserved Field (reserved)
-			io.WriteUint8(4, uint8(0))
+	// Reserved Field (reserved)
+	io.WriteUint8(4, uint8(0))
 
-			// Simple Field (serviceRequest)
-			var serviceRequest BACnetUnconfirmedServiceRequest = m.serviceRequest
-			serviceRequest.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (serviceRequest)
+	serviceRequest := BACnetUnconfirmedServiceRequest(m.serviceRequest)
+	serviceRequest.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
index 8d11ead..20460b3 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/ApplicationTag.go
@@ -38,6 +38,16 @@ const (
 	ApplicationTag_BACNET_OBJECT_IDENTIFIER ApplicationTag = 0xC
 )
 
+func CastApplicationTag(structType interface{}) ApplicationTag {
+	castFunc := func(typ interface{}) ApplicationTag {
+		if sApplicationTag, ok := typ.(ApplicationTag); ok {
+			return sApplicationTag
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
 func ApplicationTagParse(io spi.ReadBuffer) (ApplicationTag, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
index 7249127..8b0a5d7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetAddress.go
@@ -38,6 +38,26 @@ func NewBACnetAddress(address []uint8, port uint16) spi.Message {
 	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
+		}
+		return BACnetAddress{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetAddress) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -62,8 +82,8 @@ func BACnetAddressParse(io spi.ReadBuffer) (spi.Message, error) {
 	var address []uint8
 	// Count array
 	{
-		address := make([]uint8, 4)
-		for curItem := uint16(0); curItem < uint16(4); curItem++ {
+		address := make([]uint8, uint16(4))
+		for curItem := uint16(0); curItem < uint16(uint16(4)); curItem++ {
 
 			address = append(address, io.ReadUint8(8))
 		}
@@ -77,20 +97,15 @@ func BACnetAddressParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m BACnetAddress) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetAddress); ok {
-
-			// Array Field (address)
-			if m.address != nil {
-				for _, _element := range m.address {
-					io.WriteUint8(8, _element)
-				}
-			}
-
-			// Simple Field (port)
-			var port uint16 = m.port
-			io.WriteUint16(16, (port))
+
+	// Array Field (address)
+	if m.address != nil {
+		for _, _element := range m.address {
+			io.WriteUint8(8, _element)
 		}
 	}
-	serializeFunc(m)
+
+	// Simple Field (port)
+	port := uint16(m.port)
+	io.WriteUint16(16, (port))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
index 4d28627..2014132 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACK.go
@@ -42,6 +42,26 @@ func BACnetConfirmedServiceACKServiceChoice(m IBACnetConfirmedServiceACK) uint8
 	return m.ServiceChoice()
 }
 
+func CastIBACnetConfirmedServiceACK(structType interface{}) IBACnetConfirmedServiceACK {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACK {
+		if iBACnetConfirmedServiceACK, ok := typ.(IBACnetConfirmedServiceACK); ok {
+			return iBACnetConfirmedServiceACK
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACK(structType interface{}) BACnetConfirmedServiceACK {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACK {
+		if sBACnetConfirmedServiceACK, ok := typ.(BACnetConfirmedServiceACK); ok {
+			return sBACnetConfirmedServiceACK
+		}
+		return BACnetConfirmedServiceACK{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACK) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -104,16 +124,12 @@ func BACnetConfirmedServiceACKParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m BACnetConfirmedServiceACK) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iBACnetConfirmedServiceACK, ok := typ.(IBACnetConfirmedServiceACK); ok {
+	iBACnetConfirmedServiceACK := CastIBACnetConfirmedServiceACK(m)
 
-			// Discriminator Field (serviceChoice) (Used as input to a switch field)
-			serviceChoice := BACnetConfirmedServiceACKServiceChoice(iBACnetConfirmedServiceACK)
-			io.WriteUint8(8, (serviceChoice))
+	// Discriminator Field (serviceChoice) (Used as input to a switch field)
+	serviceChoice := uint8(BACnetConfirmedServiceACKServiceChoice(iBACnetConfirmedServiceACK))
+	io.WriteUint8(8, (serviceChoice))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iBACnetConfirmedServiceACK.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iBACnetConfirmedServiceACK.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
index b604f4a..63ed1b7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicReadFile.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKAtomicReadFile() BACnetConfirmedServiceACKIniti
 	return &BACnetConfirmedServiceACKAtomicReadFile{}
 }
 
+func CastIBACnetConfirmedServiceACKAtomicReadFile(structType interface{}) IBACnetConfirmedServiceACKAtomicReadFile {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKAtomicReadFile {
+		if iBACnetConfirmedServiceACKAtomicReadFile, ok := typ.(IBACnetConfirmedServiceACKAtomicReadFile); ok {
+			return iBACnetConfirmedServiceACKAtomicReadFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKAtomicReadFile(structType interface{}) BACnetConfirmedServiceACKAtomicReadFile {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKAtomicReadFile {
+		if sBACnetConfirmedServiceACKAtomicReadFile, ok := typ.(BACnetConfirmedServiceACKAtomicReadFile); ok {
+			return sBACnetConfirmedServiceACKAtomicReadFile
+		}
+		return BACnetConfirmedServiceACKAtomicReadFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKAtomicReadFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKAtomicReadFileParse(io spi.ReadBuffer) (BACnetConf
 }
 
 func (m BACnetConfirmedServiceACKAtomicReadFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKAtomicReadFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
index ccc2e6c..e8c1993 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKAtomicWriteFile.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKAtomicWriteFile() BACnetConfirmedServiceACKInit
 	return &BACnetConfirmedServiceACKAtomicWriteFile{}
 }
 
+func CastIBACnetConfirmedServiceACKAtomicWriteFile(structType interface{}) IBACnetConfirmedServiceACKAtomicWriteFile {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKAtomicWriteFile {
+		if iBACnetConfirmedServiceACKAtomicWriteFile, ok := typ.(IBACnetConfirmedServiceACKAtomicWriteFile); ok {
+			return iBACnetConfirmedServiceACKAtomicWriteFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKAtomicWriteFile(structType interface{}) BACnetConfirmedServiceACKAtomicWriteFile {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKAtomicWriteFile {
+		if sBACnetConfirmedServiceACKAtomicWriteFile, ok := typ.(BACnetConfirmedServiceACKAtomicWriteFile); ok {
+			return sBACnetConfirmedServiceACKAtomicWriteFile
+		}
+		return BACnetConfirmedServiceACKAtomicWriteFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKAtomicWriteFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKAtomicWriteFileParse(io spi.ReadBuffer) (BACnetCon
 }
 
 func (m BACnetConfirmedServiceACKAtomicWriteFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKAtomicWriteFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
index d3c30a4..b303ab8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKConfirmedPrivateTransfer.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKConfirmedPrivateTransfer() BACnetConfirmedServi
 	return &BACnetConfirmedServiceACKConfirmedPrivateTransfer{}
 }
 
+func CastIBACnetConfirmedServiceACKConfirmedPrivateTransfer(structType interface{}) IBACnetConfirmedServiceACKConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKConfirmedPrivateTransfer {
+		if iBACnetConfirmedServiceACKConfirmedPrivateTransfer, ok := typ.(IBACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
+			return iBACnetConfirmedServiceACKConfirmedPrivateTransfer
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKConfirmedPrivateTransfer(structType interface{}) BACnetConfirmedServiceACKConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKConfirmedPrivateTransfer {
+		if sBACnetConfirmedServiceACKConfirmedPrivateTransfer, ok := typ.(BACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
+			return sBACnetConfirmedServiceACKConfirmedPrivateTransfer
+		}
+		return BACnetConfirmedServiceACKConfirmedPrivateTransfer{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKConfirmedPrivateTransferParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceACKConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKConfirmedPrivateTransfer); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
index e9d53a9..9b05f84 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKCreateObject.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKCreateObject() BACnetConfirmedServiceACKInitial
 	return &BACnetConfirmedServiceACKCreateObject{}
 }
 
+func CastIBACnetConfirmedServiceACKCreateObject(structType interface{}) IBACnetConfirmedServiceACKCreateObject {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKCreateObject {
+		if iBACnetConfirmedServiceACKCreateObject, ok := typ.(IBACnetConfirmedServiceACKCreateObject); ok {
+			return iBACnetConfirmedServiceACKCreateObject
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKCreateObject(structType interface{}) BACnetConfirmedServiceACKCreateObject {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKCreateObject {
+		if sBACnetConfirmedServiceACKCreateObject, ok := typ.(BACnetConfirmedServiceACKCreateObject); ok {
+			return sBACnetConfirmedServiceACKCreateObject
+		}
+		return BACnetConfirmedServiceACKCreateObject{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKCreateObject) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKCreateObjectParse(io spi.ReadBuffer) (BACnetConfir
 }
 
 func (m BACnetConfirmedServiceACKCreateObject) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKCreateObject); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
index 44b39f2..1496478 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetAlarmSummary.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKGetAlarmSummary() BACnetConfirmedServiceACKInit
 	return &BACnetConfirmedServiceACKGetAlarmSummary{}
 }
 
+func CastIBACnetConfirmedServiceACKGetAlarmSummary(structType interface{}) IBACnetConfirmedServiceACKGetAlarmSummary {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKGetAlarmSummary {
+		if iBACnetConfirmedServiceACKGetAlarmSummary, ok := typ.(IBACnetConfirmedServiceACKGetAlarmSummary); ok {
+			return iBACnetConfirmedServiceACKGetAlarmSummary
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKGetAlarmSummary(structType interface{}) BACnetConfirmedServiceACKGetAlarmSummary {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKGetAlarmSummary {
+		if sBACnetConfirmedServiceACKGetAlarmSummary, ok := typ.(BACnetConfirmedServiceACKGetAlarmSummary); ok {
+			return sBACnetConfirmedServiceACKGetAlarmSummary
+		}
+		return BACnetConfirmedServiceACKGetAlarmSummary{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKGetAlarmSummary) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKGetAlarmSummaryParse(io spi.ReadBuffer) (BACnetCon
 }
 
 func (m BACnetConfirmedServiceACKGetAlarmSummary) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKGetAlarmSummary); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
index 47f3ef5..d9d1fa8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEnrollmentSummary.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKGetEnrollmentSummary() BACnetConfirmedServiceAC
 	return &BACnetConfirmedServiceACKGetEnrollmentSummary{}
 }
 
+func CastIBACnetConfirmedServiceACKGetEnrollmentSummary(structType interface{}) IBACnetConfirmedServiceACKGetEnrollmentSummary {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKGetEnrollmentSummary {
+		if iBACnetConfirmedServiceACKGetEnrollmentSummary, ok := typ.(IBACnetConfirmedServiceACKGetEnrollmentSummary); ok {
+			return iBACnetConfirmedServiceACKGetEnrollmentSummary
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKGetEnrollmentSummary(structType interface{}) BACnetConfirmedServiceACKGetEnrollmentSummary {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKGetEnrollmentSummary {
+		if sBACnetConfirmedServiceACKGetEnrollmentSummary, ok := typ.(BACnetConfirmedServiceACKGetEnrollmentSummary); ok {
+			return sBACnetConfirmedServiceACKGetEnrollmentSummary
+		}
+		return BACnetConfirmedServiceACKGetEnrollmentSummary{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKGetEnrollmentSummary) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKGetEnrollmentSummaryParse(io spi.ReadBuffer) (BACn
 }
 
 func (m BACnetConfirmedServiceACKGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKGetEnrollmentSummary); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
index 2cbbf66..0b94cc2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKGetEventInformation.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKGetEventInformation() BACnetConfirmedServiceACK
 	return &BACnetConfirmedServiceACKGetEventInformation{}
 }
 
+func CastIBACnetConfirmedServiceACKGetEventInformation(structType interface{}) IBACnetConfirmedServiceACKGetEventInformation {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKGetEventInformation {
+		if iBACnetConfirmedServiceACKGetEventInformation, ok := typ.(IBACnetConfirmedServiceACKGetEventInformation); ok {
+			return iBACnetConfirmedServiceACKGetEventInformation
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKGetEventInformation(structType interface{}) BACnetConfirmedServiceACKGetEventInformation {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKGetEventInformation {
+		if sBACnetConfirmedServiceACKGetEventInformation, ok := typ.(BACnetConfirmedServiceACKGetEventInformation); ok {
+			return sBACnetConfirmedServiceACKGetEventInformation
+		}
+		return BACnetConfirmedServiceACKGetEventInformation{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKGetEventInformation) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKGetEventInformationParse(io spi.ReadBuffer) (BACne
 }
 
 func (m BACnetConfirmedServiceACKGetEventInformation) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKGetEventInformation); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
index 6640b6d..28a9d27 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadProperty.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKReadProperty() BACnetConfirmedServiceACKInitial
 	return &BACnetConfirmedServiceACKReadProperty{}
 }
 
+func CastIBACnetConfirmedServiceACKReadProperty(structType interface{}) IBACnetConfirmedServiceACKReadProperty {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKReadProperty {
+		if iBACnetConfirmedServiceACKReadProperty, ok := typ.(IBACnetConfirmedServiceACKReadProperty); ok {
+			return iBACnetConfirmedServiceACKReadProperty
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKReadProperty(structType interface{}) BACnetConfirmedServiceACKReadProperty {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKReadProperty {
+		if sBACnetConfirmedServiceACKReadProperty, ok := typ.(BACnetConfirmedServiceACKReadProperty); ok {
+			return sBACnetConfirmedServiceACKReadProperty
+		}
+		return BACnetConfirmedServiceACKReadProperty{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKReadProperty) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKReadPropertyParse(io spi.ReadBuffer) (BACnetConfir
 }
 
 func (m BACnetConfirmedServiceACKReadProperty) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKReadProperty); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
index c3a41ab..79a6be6 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadPropertyMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKReadPropertyMultiple() BACnetConfirmedServiceAC
 	return &BACnetConfirmedServiceACKReadPropertyMultiple{}
 }
 
+func CastIBACnetConfirmedServiceACKReadPropertyMultiple(structType interface{}) IBACnetConfirmedServiceACKReadPropertyMultiple {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKReadPropertyMultiple {
+		if iBACnetConfirmedServiceACKReadPropertyMultiple, ok := typ.(IBACnetConfirmedServiceACKReadPropertyMultiple); ok {
+			return iBACnetConfirmedServiceACKReadPropertyMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKReadPropertyMultiple(structType interface{}) BACnetConfirmedServiceACKReadPropertyMultiple {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKReadPropertyMultiple {
+		if sBACnetConfirmedServiceACKReadPropertyMultiple, ok := typ.(BACnetConfirmedServiceACKReadPropertyMultiple); ok {
+			return sBACnetConfirmedServiceACKReadPropertyMultiple
+		}
+		return BACnetConfirmedServiceACKReadPropertyMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKReadPropertyMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKReadPropertyMultipleParse(io spi.ReadBuffer) (BACn
 }
 
 func (m BACnetConfirmedServiceACKReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKReadPropertyMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
index 445191b..93bdf3a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKReadRange.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKReadRange() BACnetConfirmedServiceACKInitialize
 	return &BACnetConfirmedServiceACKReadRange{}
 }
 
+func CastIBACnetConfirmedServiceACKReadRange(structType interface{}) IBACnetConfirmedServiceACKReadRange {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKReadRange {
+		if iBACnetConfirmedServiceACKReadRange, ok := typ.(IBACnetConfirmedServiceACKReadRange); ok {
+			return iBACnetConfirmedServiceACKReadRange
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKReadRange(structType interface{}) BACnetConfirmedServiceACKReadRange {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKReadRange {
+		if sBACnetConfirmedServiceACKReadRange, ok := typ.(BACnetConfirmedServiceACKReadRange); ok {
+			return sBACnetConfirmedServiceACKReadRange
+		}
+		return BACnetConfirmedServiceACKReadRange{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKReadRange) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKReadRangeParse(io spi.ReadBuffer) (BACnetConfirmed
 }
 
 func (m BACnetConfirmedServiceACKReadRange) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKReadRange); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
index c78ecdc..be7c544 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedAuthenticate.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKRemovedAuthenticate() BACnetConfirmedServiceACK
 	return &BACnetConfirmedServiceACKRemovedAuthenticate{}
 }
 
+func CastIBACnetConfirmedServiceACKRemovedAuthenticate(structType interface{}) IBACnetConfirmedServiceACKRemovedAuthenticate {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKRemovedAuthenticate {
+		if iBACnetConfirmedServiceACKRemovedAuthenticate, ok := typ.(IBACnetConfirmedServiceACKRemovedAuthenticate); ok {
+			return iBACnetConfirmedServiceACKRemovedAuthenticate
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKRemovedAuthenticate(structType interface{}) BACnetConfirmedServiceACKRemovedAuthenticate {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKRemovedAuthenticate {
+		if sBACnetConfirmedServiceACKRemovedAuthenticate, ok := typ.(BACnetConfirmedServiceACKRemovedAuthenticate); ok {
+			return sBACnetConfirmedServiceACKRemovedAuthenticate
+		}
+		return BACnetConfirmedServiceACKRemovedAuthenticate{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKRemovedAuthenticate) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKRemovedAuthenticateParse(io spi.ReadBuffer) (BACne
 }
 
 func (m BACnetConfirmedServiceACKRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKRemovedAuthenticate); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
index b5e021b..d410901 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKRemovedReadPropertyConditional.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKRemovedReadPropertyConditional() BACnetConfirme
 	return &BACnetConfirmedServiceACKRemovedReadPropertyConditional{}
 }
 
+func CastIBACnetConfirmedServiceACKRemovedReadPropertyConditional(structType interface{}) IBACnetConfirmedServiceACKRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKRemovedReadPropertyConditional {
+		if iBACnetConfirmedServiceACKRemovedReadPropertyConditional, ok := typ.(IBACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
+			return iBACnetConfirmedServiceACKRemovedReadPropertyConditional
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKRemovedReadPropertyConditional(structType interface{}) BACnetConfirmedServiceACKRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKRemovedReadPropertyConditional {
+		if sBACnetConfirmedServiceACKRemovedReadPropertyConditional, ok := typ.(BACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
+			return sBACnetConfirmedServiceACKRemovedReadPropertyConditional
+		}
+		return BACnetConfirmedServiceACKRemovedReadPropertyConditional{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKRemovedReadPropertyConditionalParse(io spi.ReadBuf
 }
 
 func (m BACnetConfirmedServiceACKRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKRemovedReadPropertyConditional); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
index 0dca7fd..005ccac 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTData.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKVTData() BACnetConfirmedServiceACKInitializer {
 	return &BACnetConfirmedServiceACKVTData{}
 }
 
+func CastIBACnetConfirmedServiceACKVTData(structType interface{}) IBACnetConfirmedServiceACKVTData {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKVTData {
+		if iBACnetConfirmedServiceACKVTData, ok := typ.(IBACnetConfirmedServiceACKVTData); ok {
+			return iBACnetConfirmedServiceACKVTData
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKVTData(structType interface{}) BACnetConfirmedServiceACKVTData {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKVTData {
+		if sBACnetConfirmedServiceACKVTData, ok := typ.(BACnetConfirmedServiceACKVTData); ok {
+			return sBACnetConfirmedServiceACKVTData
+		}
+		return BACnetConfirmedServiceACKVTData{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKVTData) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKVTDataParse(io spi.ReadBuffer) (BACnetConfirmedSer
 }
 
 func (m BACnetConfirmedServiceACKVTData) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKVTData); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
index 64b4683..9896b0b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceACKVTOpen.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceACKVTOpen() BACnetConfirmedServiceACKInitializer {
 	return &BACnetConfirmedServiceACKVTOpen{}
 }
 
+func CastIBACnetConfirmedServiceACKVTOpen(structType interface{}) IBACnetConfirmedServiceACKVTOpen {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceACKVTOpen {
+		if iBACnetConfirmedServiceACKVTOpen, ok := typ.(IBACnetConfirmedServiceACKVTOpen); ok {
+			return iBACnetConfirmedServiceACKVTOpen
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceACKVTOpen(structType interface{}) BACnetConfirmedServiceACKVTOpen {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceACKVTOpen {
+		if sBACnetConfirmedServiceACKVTOpen, ok := typ.(BACnetConfirmedServiceACKVTOpen); ok {
+			return sBACnetConfirmedServiceACKVTOpen
+		}
+		return BACnetConfirmedServiceACKVTOpen{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceACKVTOpen) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceACK.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceACKVTOpenParse(io spi.ReadBuffer) (BACnetConfirmedSer
 }
 
 func (m BACnetConfirmedServiceACKVTOpen) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceACKVTOpen); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
index ea7e49e..acf3dec 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequest.go
@@ -42,6 +42,26 @@ func BACnetConfirmedServiceRequestServiceChoice(m IBACnetConfirmedServiceRequest
 	return m.ServiceChoice()
 }
 
+func CastIBACnetConfirmedServiceRequest(structType interface{}) IBACnetConfirmedServiceRequest {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequest {
+		if iBACnetConfirmedServiceRequest, ok := typ.(IBACnetConfirmedServiceRequest); ok {
+			return iBACnetConfirmedServiceRequest
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequest(structType interface{}) BACnetConfirmedServiceRequest {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequest {
+		if sBACnetConfirmedServiceRequest, ok := typ.(BACnetConfirmedServiceRequest); ok {
+			return sBACnetConfirmedServiceRequest
+		}
+		return BACnetConfirmedServiceRequest{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequest) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -150,16 +170,12 @@ func BACnetConfirmedServiceRequestParse(io spi.ReadBuffer, len uint16) (spi.Mess
 }
 
 func (m BACnetConfirmedServiceRequest) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iBACnetConfirmedServiceRequest, ok := typ.(IBACnetConfirmedServiceRequest); ok {
+	iBACnetConfirmedServiceRequest := CastIBACnetConfirmedServiceRequest(m)
 
-			// Discriminator Field (serviceChoice) (Used as input to a switch field)
-			serviceChoice := BACnetConfirmedServiceRequestServiceChoice(iBACnetConfirmedServiceRequest)
-			io.WriteUint8(8, (serviceChoice))
+	// Discriminator Field (serviceChoice) (Used as input to a switch field)
+	serviceChoice := uint8(BACnetConfirmedServiceRequestServiceChoice(iBACnetConfirmedServiceRequest))
+	io.WriteUint8(8, (serviceChoice))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iBACnetConfirmedServiceRequest.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iBACnetConfirmedServiceRequest.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
index 2faaed5..4383dc1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAcknowledgeAlarm.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestAcknowledgeAlarm() BACnetConfirmedServiceRe
 	return &BACnetConfirmedServiceRequestAcknowledgeAlarm{}
 }
 
+func CastIBACnetConfirmedServiceRequestAcknowledgeAlarm(structType interface{}) IBACnetConfirmedServiceRequestAcknowledgeAlarm {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAcknowledgeAlarm {
+		if iBACnetConfirmedServiceRequestAcknowledgeAlarm, ok := typ.(IBACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
+			return iBACnetConfirmedServiceRequestAcknowledgeAlarm
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestAcknowledgeAlarm(structType interface{}) BACnetConfirmedServiceRequestAcknowledgeAlarm {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAcknowledgeAlarm {
+		if sBACnetConfirmedServiceRequestAcknowledgeAlarm, ok := typ.(BACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
+			return sBACnetConfirmedServiceRequestAcknowledgeAlarm
+		}
+		return BACnetConfirmedServiceRequestAcknowledgeAlarm{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestAcknowledgeAlarmParse(io spi.ReadBuffer) (BACn
 }
 
 func (m BACnetConfirmedServiceRequestAcknowledgeAlarm) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestAcknowledgeAlarm); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
index 2243e39..ecc2677 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAddListElement.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestAddListElement() BACnetConfirmedServiceRequ
 	return &BACnetConfirmedServiceRequestAddListElement{}
 }
 
+func CastIBACnetConfirmedServiceRequestAddListElement(structType interface{}) IBACnetConfirmedServiceRequestAddListElement {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAddListElement {
+		if iBACnetConfirmedServiceRequestAddListElement, ok := typ.(IBACnetConfirmedServiceRequestAddListElement); ok {
+			return iBACnetConfirmedServiceRequestAddListElement
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestAddListElement(structType interface{}) BACnetConfirmedServiceRequestAddListElement {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAddListElement {
+		if sBACnetConfirmedServiceRequestAddListElement, ok := typ.(BACnetConfirmedServiceRequestAddListElement); ok {
+			return sBACnetConfirmedServiceRequestAddListElement
+		}
+		return BACnetConfirmedServiceRequestAddListElement{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestAddListElement) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestAddListElementParse(io spi.ReadBuffer) (BACnet
 }
 
 func (m BACnetConfirmedServiceRequestAddListElement) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestAddListElement); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
index 1159819..a5651cf 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicReadFile.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestAtomicReadFile() BACnetConfirmedServiceRequ
 	return &BACnetConfirmedServiceRequestAtomicReadFile{}
 }
 
+func CastIBACnetConfirmedServiceRequestAtomicReadFile(structType interface{}) IBACnetConfirmedServiceRequestAtomicReadFile {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAtomicReadFile {
+		if iBACnetConfirmedServiceRequestAtomicReadFile, ok := typ.(IBACnetConfirmedServiceRequestAtomicReadFile); ok {
+			return iBACnetConfirmedServiceRequestAtomicReadFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestAtomicReadFile(structType interface{}) BACnetConfirmedServiceRequestAtomicReadFile {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAtomicReadFile {
+		if sBACnetConfirmedServiceRequestAtomicReadFile, ok := typ.(BACnetConfirmedServiceRequestAtomicReadFile); ok {
+			return sBACnetConfirmedServiceRequestAtomicReadFile
+		}
+		return BACnetConfirmedServiceRequestAtomicReadFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestAtomicReadFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestAtomicReadFileParse(io spi.ReadBuffer) (BACnet
 }
 
 func (m BACnetConfirmedServiceRequestAtomicReadFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestAtomicReadFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
index 2812f4d..640ec8a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestAtomicWriteFile.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestAtomicWriteFile() BACnetConfirmedServiceReq
 	return &BACnetConfirmedServiceRequestAtomicWriteFile{}
 }
 
+func CastIBACnetConfirmedServiceRequestAtomicWriteFile(structType interface{}) IBACnetConfirmedServiceRequestAtomicWriteFile {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestAtomicWriteFile {
+		if iBACnetConfirmedServiceRequestAtomicWriteFile, ok := typ.(IBACnetConfirmedServiceRequestAtomicWriteFile); ok {
+			return iBACnetConfirmedServiceRequestAtomicWriteFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestAtomicWriteFile(structType interface{}) BACnetConfirmedServiceRequestAtomicWriteFile {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestAtomicWriteFile {
+		if sBACnetConfirmedServiceRequestAtomicWriteFile, ok := typ.(BACnetConfirmedServiceRequestAtomicWriteFile); ok {
+			return sBACnetConfirmedServiceRequestAtomicWriteFile
+		}
+		return BACnetConfirmedServiceRequestAtomicWriteFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestAtomicWriteFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestAtomicWriteFileParse(io spi.ReadBuffer) (BACne
 }
 
 func (m BACnetConfirmedServiceRequestAtomicWriteFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestAtomicWriteFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
index 54d4d1f..b1d11dc 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotification.go
@@ -65,6 +65,26 @@ func NewBACnetConfirmedServiceRequestConfirmedCOVNotification(subscriberProcessI
 	return &BACnetConfirmedServiceRequestConfirmedCOVNotification{subscriberProcessIdentifier: subscriberProcessIdentifier, monitoredObjectType: monitoredObjectType, monitoredObjectInstanceNumber: monitoredObjectInstanceNumber, issueConfirmedNotificationsType: issueConfirmedNotificationsType, issueConfirmedNotificationsInstanceNumber: issueConfirmedNotificationsInstanceNumber, lifetimeLength: lifetimeLength, lifetimeSeconds: lifetimeSeconds, notifications: notifications}
 }
 
+func CastIBACnetConfirmedServiceRequestConfirmedCOVNotification(structType interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotification {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotification {
+		if iBACnetConfirmedServiceRequestConfirmedCOVNotification, ok := typ.(IBACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
+			return iBACnetConfirmedServiceRequestConfirmedCOVNotification
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestConfirmedCOVNotification(structType interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotification {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotification {
+		if sBACnetConfirmedServiceRequestConfirmedCOVNotification, ok := typ.(BACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
+			return sBACnetConfirmedServiceRequestConfirmedCOVNotification
+		}
+		return BACnetConfirmedServiceRequestConfirmedCOVNotification{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -187,8 +207,8 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io spi.ReadBuffe
 	// Array field (notifications)
 	var notifications []BACnetTagWithContent
 	// Length array
-	_notificationsLength := uint16((len) - (18))
-	_notificationsEndPos := io.GetPos() + _notificationsLength
+	_notificationsLength := uint16(len) - uint16(uint16(18))
+	_notificationsEndPos := io.GetPos() + uint16(_notificationsLength)
 	for io.GetPos() < _notificationsEndPos {
 		_message, _err := BACnetTagWithContentParse(io)
 		if _err != nil {
@@ -213,65 +233,60 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationParse(io spi.ReadBuffe
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedCOVNotification) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestConfirmedCOVNotification); ok {
-
-			// Const Field (subscriberProcessIdentifierHeader)
-			io.WriteUint8(8, 0x09)
 
-			// Simple Field (subscriberProcessIdentifier)
-			var subscriberProcessIdentifier uint8 = m.subscriberProcessIdentifier
-			io.WriteUint8(8, (subscriberProcessIdentifier))
+	// Const Field (subscriberProcessIdentifierHeader)
+	io.WriteUint8(8, 0x09)
 
-			// Const Field (monitoredObjectIdentifierHeader)
-			io.WriteUint8(8, 0x1C)
+	// Simple Field (subscriberProcessIdentifier)
+	subscriberProcessIdentifier := uint8(m.subscriberProcessIdentifier)
+	io.WriteUint8(8, (subscriberProcessIdentifier))
 
-			// Simple Field (monitoredObjectType)
-			var monitoredObjectType uint16 = m.monitoredObjectType
-			io.WriteUint16(10, (monitoredObjectType))
+	// Const Field (monitoredObjectIdentifierHeader)
+	io.WriteUint8(8, 0x1C)
 
-			// Simple Field (monitoredObjectInstanceNumber)
-			var monitoredObjectInstanceNumber uint32 = m.monitoredObjectInstanceNumber
-			io.WriteUint32(22, (monitoredObjectInstanceNumber))
+	// Simple Field (monitoredObjectType)
+	monitoredObjectType := uint16(m.monitoredObjectType)
+	io.WriteUint16(10, (monitoredObjectType))
 
-			// Const Field (issueConfirmedNotificationsHeader)
-			io.WriteUint8(8, 0x2C)
+	// Simple Field (monitoredObjectInstanceNumber)
+	monitoredObjectInstanceNumber := uint32(m.monitoredObjectInstanceNumber)
+	io.WriteUint32(22, (monitoredObjectInstanceNumber))
 
-			// Simple Field (issueConfirmedNotificationsType)
-			var issueConfirmedNotificationsType uint16 = m.issueConfirmedNotificationsType
-			io.WriteUint16(10, (issueConfirmedNotificationsType))
+	// Const Field (issueConfirmedNotificationsHeader)
+	io.WriteUint8(8, 0x2C)
 
-			// Simple Field (issueConfirmedNotificationsInstanceNumber)
-			var issueConfirmedNotificationsInstanceNumber uint32 = m.issueConfirmedNotificationsInstanceNumber
-			io.WriteUint32(22, (issueConfirmedNotificationsInstanceNumber))
+	// Simple Field (issueConfirmedNotificationsType)
+	issueConfirmedNotificationsType := uint16(m.issueConfirmedNotificationsType)
+	io.WriteUint16(10, (issueConfirmedNotificationsType))
 
-			// Const Field (lifetimeHeader)
-			io.WriteUint8(5, 0x07)
+	// Simple Field (issueConfirmedNotificationsInstanceNumber)
+	issueConfirmedNotificationsInstanceNumber := uint32(m.issueConfirmedNotificationsInstanceNumber)
+	io.WriteUint32(22, (issueConfirmedNotificationsInstanceNumber))
 
-			// Simple Field (lifetimeLength)
-			var lifetimeLength uint8 = m.lifetimeLength
-			io.WriteUint8(3, (lifetimeLength))
+	// Const Field (lifetimeHeader)
+	io.WriteUint8(5, 0x07)
 
-			// Array Field (lifetimeSeconds)
-			if m.lifetimeSeconds != nil {
-				for _, _element := range m.lifetimeSeconds {
-					io.WriteInt8(8, _element)
-				}
-			}
+	// Simple Field (lifetimeLength)
+	lifetimeLength := uint8(m.lifetimeLength)
+	io.WriteUint8(3, (lifetimeLength))
 
-			// Const Field (listOfValuesOpeningTag)
-			io.WriteUint8(8, 0x4E)
+	// Array Field (lifetimeSeconds)
+	if m.lifetimeSeconds != nil {
+		for _, _element := range m.lifetimeSeconds {
+			io.WriteInt8(8, _element)
+		}
+	}
 
-			// Array Field (notifications)
-			if m.notifications != nil {
-				for _, _element := range m.notifications {
-					_element.Serialize(io)
-				}
-			}
+	// Const Field (listOfValuesOpeningTag)
+	io.WriteUint8(8, 0x4E)
 
-			// Const Field (listOfValuesClosingTag)
-			io.WriteUint8(8, 0x4F)
+	// Array Field (notifications)
+	if m.notifications != nil {
+		for _, _element := range m.notifications {
+			_element.Serialize(io)
 		}
 	}
-	serializeFunc(m)
+
+	// Const Field (listOfValuesClosingTag)
+	io.WriteUint8(8, 0x4F)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
index 8e6622a..63c37fb 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple() BACnetCo
 	return &BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple{}
 }
 
+func CastIBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple(structType interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
+		if iBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple, ok := typ.(IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
+			return iBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple(structType interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple {
+		if sBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple, ok := typ.(BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
+			return sBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple
+		}
+		return BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestConfirmedCOVNotificationMultipleParse(io spi.R
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestConfirmedCOVNotificationMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
index ff12f85..a5d1af4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedEventNotification.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestConfirmedEventNotification() BACnetConfirme
 	return &BACnetConfirmedServiceRequestConfirmedEventNotification{}
 }
 
+func CastIBACnetConfirmedServiceRequestConfirmedEventNotification(structType interface{}) IBACnetConfirmedServiceRequestConfirmedEventNotification {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedEventNotification {
+		if iBACnetConfirmedServiceRequestConfirmedEventNotification, ok := typ.(IBACnetConfirmedServiceRequestConfirmedEventNotification); ok {
+			return iBACnetConfirmedServiceRequestConfirmedEventNotification
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestConfirmedEventNotification(structType interface{}) BACnetConfirmedServiceRequestConfirmedEventNotification {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedEventNotification {
+		if sBACnetConfirmedServiceRequestConfirmedEventNotification, ok := typ.(BACnetConfirmedServiceRequestConfirmedEventNotification); ok {
+			return sBACnetConfirmedServiceRequestConfirmedEventNotification
+		}
+		return BACnetConfirmedServiceRequestConfirmedEventNotification{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestConfirmedEventNotification) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestConfirmedEventNotificationParse(io spi.ReadBuf
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedEventNotification) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestConfirmedEventNotification); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
index e9be82b..007d4f3 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedPrivateTransfer.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestConfirmedPrivateTransfer() BACnetConfirmedS
 	return &BACnetConfirmedServiceRequestConfirmedPrivateTransfer{}
 }
 
+func CastIBACnetConfirmedServiceRequestConfirmedPrivateTransfer(structType interface{}) IBACnetConfirmedServiceRequestConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedPrivateTransfer {
+		if iBACnetConfirmedServiceRequestConfirmedPrivateTransfer, ok := typ.(IBACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
+			return iBACnetConfirmedServiceRequestConfirmedPrivateTransfer
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestConfirmedPrivateTransfer(structType interface{}) BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedPrivateTransfer {
+		if sBACnetConfirmedServiceRequestConfirmedPrivateTransfer, ok := typ.(BACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
+			return sBACnetConfirmedServiceRequestConfirmedPrivateTransfer
+		}
+		return BACnetConfirmedServiceRequestConfirmedPrivateTransfer{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestConfirmedPrivateTransferParse(io spi.ReadBuffe
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestConfirmedPrivateTransfer); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
index f9e8a6e..53897a6 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestConfirmedTextMessage.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestConfirmedTextMessage() BACnetConfirmedServi
 	return &BACnetConfirmedServiceRequestConfirmedTextMessage{}
 }
 
+func CastIBACnetConfirmedServiceRequestConfirmedTextMessage(structType interface{}) IBACnetConfirmedServiceRequestConfirmedTextMessage {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestConfirmedTextMessage {
+		if iBACnetConfirmedServiceRequestConfirmedTextMessage, ok := typ.(IBACnetConfirmedServiceRequestConfirmedTextMessage); ok {
+			return iBACnetConfirmedServiceRequestConfirmedTextMessage
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestConfirmedTextMessage(structType interface{}) BACnetConfirmedServiceRequestConfirmedTextMessage {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestConfirmedTextMessage {
+		if sBACnetConfirmedServiceRequestConfirmedTextMessage, ok := typ.(BACnetConfirmedServiceRequestConfirmedTextMessage); ok {
+			return sBACnetConfirmedServiceRequestConfirmedTextMessage
+		}
+		return BACnetConfirmedServiceRequestConfirmedTextMessage{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestConfirmedTextMessage) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestConfirmedTextMessageParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestConfirmedTextMessage) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestConfirmedTextMessage); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
index 6c8dffe..b761613 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestCreateObject.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestCreateObject() BACnetConfirmedServiceReques
 	return &BACnetConfirmedServiceRequestCreateObject{}
 }
 
+func CastIBACnetConfirmedServiceRequestCreateObject(structType interface{}) IBACnetConfirmedServiceRequestCreateObject {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestCreateObject {
+		if iBACnetConfirmedServiceRequestCreateObject, ok := typ.(IBACnetConfirmedServiceRequestCreateObject); ok {
+			return iBACnetConfirmedServiceRequestCreateObject
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestCreateObject(structType interface{}) BACnetConfirmedServiceRequestCreateObject {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestCreateObject {
+		if sBACnetConfirmedServiceRequestCreateObject, ok := typ.(BACnetConfirmedServiceRequestCreateObject); ok {
+			return sBACnetConfirmedServiceRequestCreateObject
+		}
+		return BACnetConfirmedServiceRequestCreateObject{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestCreateObject) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestCreateObjectParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestCreateObject) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestCreateObject); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
index 7a7f91b..368a078 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeleteObject.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestDeleteObject() BACnetConfirmedServiceReques
 	return &BACnetConfirmedServiceRequestDeleteObject{}
 }
 
+func CastIBACnetConfirmedServiceRequestDeleteObject(structType interface{}) IBACnetConfirmedServiceRequestDeleteObject {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestDeleteObject {
+		if iBACnetConfirmedServiceRequestDeleteObject, ok := typ.(IBACnetConfirmedServiceRequestDeleteObject); ok {
+			return iBACnetConfirmedServiceRequestDeleteObject
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestDeleteObject(structType interface{}) BACnetConfirmedServiceRequestDeleteObject {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestDeleteObject {
+		if sBACnetConfirmedServiceRequestDeleteObject, ok := typ.(BACnetConfirmedServiceRequestDeleteObject); ok {
+			return sBACnetConfirmedServiceRequestDeleteObject
+		}
+		return BACnetConfirmedServiceRequestDeleteObject{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestDeleteObject) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestDeleteObjectParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestDeleteObject) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestDeleteObject); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
index 514be4b..2e5f0bc 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestDeviceCommunicationControl.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestDeviceCommunicationControl() BACnetConfirme
 	return &BACnetConfirmedServiceRequestDeviceCommunicationControl{}
 }
 
+func CastIBACnetConfirmedServiceRequestDeviceCommunicationControl(structType interface{}) IBACnetConfirmedServiceRequestDeviceCommunicationControl {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestDeviceCommunicationControl {
+		if iBACnetConfirmedServiceRequestDeviceCommunicationControl, ok := typ.(IBACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
+			return iBACnetConfirmedServiceRequestDeviceCommunicationControl
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestDeviceCommunicationControl(structType interface{}) BACnetConfirmedServiceRequestDeviceCommunicationControl {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestDeviceCommunicationControl {
+		if sBACnetConfirmedServiceRequestDeviceCommunicationControl, ok := typ.(BACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
+			return sBACnetConfirmedServiceRequestDeviceCommunicationControl
+		}
+		return BACnetConfirmedServiceRequestDeviceCommunicationControl{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestDeviceCommunicationControlParse(io spi.ReadBuf
 }
 
 func (m BACnetConfirmedServiceRequestDeviceCommunicationControl) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestDeviceCommunicationControl); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
index 4edd699..c588e2b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEnrollmentSummary.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestGetEnrollmentSummary() BACnetConfirmedServi
 	return &BACnetConfirmedServiceRequestGetEnrollmentSummary{}
 }
 
+func CastIBACnetConfirmedServiceRequestGetEnrollmentSummary(structType interface{}) IBACnetConfirmedServiceRequestGetEnrollmentSummary {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestGetEnrollmentSummary {
+		if iBACnetConfirmedServiceRequestGetEnrollmentSummary, ok := typ.(IBACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
+			return iBACnetConfirmedServiceRequestGetEnrollmentSummary
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestGetEnrollmentSummary(structType interface{}) BACnetConfirmedServiceRequestGetEnrollmentSummary {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestGetEnrollmentSummary {
+		if sBACnetConfirmedServiceRequestGetEnrollmentSummary, ok := typ.(BACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
+			return sBACnetConfirmedServiceRequestGetEnrollmentSummary
+		}
+		return BACnetConfirmedServiceRequestGetEnrollmentSummary{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestGetEnrollmentSummaryParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestGetEnrollmentSummary); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
index 0c94b3c..ba6d8b1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestGetEventInformation.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestGetEventInformation() BACnetConfirmedServic
 	return &BACnetConfirmedServiceRequestGetEventInformation{}
 }
 
+func CastIBACnetConfirmedServiceRequestGetEventInformation(structType interface{}) IBACnetConfirmedServiceRequestGetEventInformation {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestGetEventInformation {
+		if iBACnetConfirmedServiceRequestGetEventInformation, ok := typ.(IBACnetConfirmedServiceRequestGetEventInformation); ok {
+			return iBACnetConfirmedServiceRequestGetEventInformation
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestGetEventInformation(structType interface{}) BACnetConfirmedServiceRequestGetEventInformation {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestGetEventInformation {
+		if sBACnetConfirmedServiceRequestGetEventInformation, ok := typ.(BACnetConfirmedServiceRequestGetEventInformation); ok {
+			return sBACnetConfirmedServiceRequestGetEventInformation
+		}
+		return BACnetConfirmedServiceRequestGetEventInformation{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestGetEventInformation) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestGetEventInformationParse(io spi.ReadBuffer) (B
 }
 
 func (m BACnetConfirmedServiceRequestGetEventInformation) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestGetEventInformation); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
index 7d4694d..7882533 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestLifeSafetyOperation.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestLifeSafetyOperation() BACnetConfirmedServic
 	return &BACnetConfirmedServiceRequestLifeSafetyOperation{}
 }
 
+func CastIBACnetConfirmedServiceRequestLifeSafetyOperation(structType interface{}) IBACnetConfirmedServiceRequestLifeSafetyOperation {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestLifeSafetyOperation {
+		if iBACnetConfirmedServiceRequestLifeSafetyOperation, ok := typ.(IBACnetConfirmedServiceRequestLifeSafetyOperation); ok {
+			return iBACnetConfirmedServiceRequestLifeSafetyOperation
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestLifeSafetyOperation(structType interface{}) BACnetConfirmedServiceRequestLifeSafetyOperation {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestLifeSafetyOperation {
+		if sBACnetConfirmedServiceRequestLifeSafetyOperation, ok := typ.(BACnetConfirmedServiceRequestLifeSafetyOperation); ok {
+			return sBACnetConfirmedServiceRequestLifeSafetyOperation
+		}
+		return BACnetConfirmedServiceRequestLifeSafetyOperation{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestLifeSafetyOperation) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestLifeSafetyOperationParse(io spi.ReadBuffer) (B
 }
 
 func (m BACnetConfirmedServiceRequestLifeSafetyOperation) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestLifeSafetyOperation); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
index 7051978..98ced58 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadProperty.go
@@ -56,6 +56,26 @@ func NewBACnetConfirmedServiceRequestReadProperty(objectType uint16, objectInsta
 	return &BACnetConfirmedServiceRequestReadProperty{objectType: objectType, objectInstanceNumber: objectInstanceNumber, propertyIdentifierLength: propertyIdentifierLength, propertyIdentifier: propertyIdentifier}
 }
 
+func CastIBACnetConfirmedServiceRequestReadProperty(structType interface{}) IBACnetConfirmedServiceRequestReadProperty {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReadProperty {
+		if iBACnetConfirmedServiceRequestReadProperty, ok := typ.(IBACnetConfirmedServiceRequestReadProperty); ok {
+			return iBACnetConfirmedServiceRequestReadProperty
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestReadProperty(structType interface{}) BACnetConfirmedServiceRequestReadProperty {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReadProperty {
+		if sBACnetConfirmedServiceRequestReadProperty, ok := typ.(BACnetConfirmedServiceRequestReadProperty); ok {
+			return sBACnetConfirmedServiceRequestReadProperty
+		}
+		return BACnetConfirmedServiceRequestReadProperty{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestReadProperty) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -125,34 +145,29 @@ func BACnetConfirmedServiceRequestReadPropertyParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestReadProperty) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestReadProperty); ok {
 
-			// Const Field (objectIdentifierHeader)
-			io.WriteUint8(8, 0x0C)
+	// Const Field (objectIdentifierHeader)
+	io.WriteUint8(8, 0x0C)
 
-			// Simple Field (objectType)
-			var objectType uint16 = m.objectType
-			io.WriteUint16(10, (objectType))
+	// Simple Field (objectType)
+	objectType := uint16(m.objectType)
+	io.WriteUint16(10, (objectType))
 
-			// Simple Field (objectInstanceNumber)
-			var objectInstanceNumber uint32 = m.objectInstanceNumber
-			io.WriteUint32(22, (objectInstanceNumber))
+	// Simple Field (objectInstanceNumber)
+	objectInstanceNumber := uint32(m.objectInstanceNumber)
+	io.WriteUint32(22, (objectInstanceNumber))
 
-			// Const Field (propertyIdentifierHeader)
-			io.WriteUint8(5, 0x03)
+	// Const Field (propertyIdentifierHeader)
+	io.WriteUint8(5, 0x03)
 
-			// Simple Field (propertyIdentifierLength)
-			var propertyIdentifierLength uint8 = m.propertyIdentifierLength
-			io.WriteUint8(3, (propertyIdentifierLength))
+	// Simple Field (propertyIdentifierLength)
+	propertyIdentifierLength := uint8(m.propertyIdentifierLength)
+	io.WriteUint8(3, (propertyIdentifierLength))
 
-			// Array Field (propertyIdentifier)
-			if m.propertyIdentifier != nil {
-				for _, _element := range m.propertyIdentifier {
-					io.WriteInt8(8, _element)
-				}
-			}
+	// Array Field (propertyIdentifier)
+	if m.propertyIdentifier != nil {
+		for _, _element := range m.propertyIdentifier {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
index 3f1aaaf..7b06d35 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadPropertyMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestReadPropertyMultiple() BACnetConfirmedServi
 	return &BACnetConfirmedServiceRequestReadPropertyMultiple{}
 }
 
+func CastIBACnetConfirmedServiceRequestReadPropertyMultiple(structType interface{}) IBACnetConfirmedServiceRequestReadPropertyMultiple {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReadPropertyMultiple {
+		if iBACnetConfirmedServiceRequestReadPropertyMultiple, ok := typ.(IBACnetConfirmedServiceRequestReadPropertyMultiple); ok {
+			return iBACnetConfirmedServiceRequestReadPropertyMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestReadPropertyMultiple(structType interface{}) BACnetConfirmedServiceRequestReadPropertyMultiple {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReadPropertyMultiple {
+		if sBACnetConfirmedServiceRequestReadPropertyMultiple, ok := typ.(BACnetConfirmedServiceRequestReadPropertyMultiple); ok {
+			return sBACnetConfirmedServiceRequestReadPropertyMultiple
+		}
+		return BACnetConfirmedServiceRequestReadPropertyMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestReadPropertyMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestReadPropertyMultipleParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestReadPropertyMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
index a1deb56..235c47c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReadRange.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestReadRange() BACnetConfirmedServiceRequestIn
 	return &BACnetConfirmedServiceRequestReadRange{}
 }
 
+func CastIBACnetConfirmedServiceRequestReadRange(structType interface{}) IBACnetConfirmedServiceRequestReadRange {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReadRange {
+		if iBACnetConfirmedServiceRequestReadRange, ok := typ.(IBACnetConfirmedServiceRequestReadRange); ok {
+			return iBACnetConfirmedServiceRequestReadRange
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestReadRange(structType interface{}) BACnetConfirmedServiceRequestReadRange {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReadRange {
+		if sBACnetConfirmedServiceRequestReadRange, ok := typ.(BACnetConfirmedServiceRequestReadRange); ok {
+			return sBACnetConfirmedServiceRequestReadRange
+		}
+		return BACnetConfirmedServiceRequestReadRange{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestReadRange) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestReadRangeParse(io spi.ReadBuffer) (BACnetConfi
 }
 
 func (m BACnetConfirmedServiceRequestReadRange) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestReadRange); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
index e4ceb8d..c676cc2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestReinitializeDevice.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestReinitializeDevice() BACnetConfirmedService
 	return &BACnetConfirmedServiceRequestReinitializeDevice{}
 }
 
+func CastIBACnetConfirmedServiceRequestReinitializeDevice(structType interface{}) IBACnetConfirmedServiceRequestReinitializeDevice {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestReinitializeDevice {
+		if iBACnetConfirmedServiceRequestReinitializeDevice, ok := typ.(IBACnetConfirmedServiceRequestReinitializeDevice); ok {
+			return iBACnetConfirmedServiceRequestReinitializeDevice
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestReinitializeDevice(structType interface{}) BACnetConfirmedServiceRequestReinitializeDevice {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestReinitializeDevice {
+		if sBACnetConfirmedServiceRequestReinitializeDevice, ok := typ.(BACnetConfirmedServiceRequestReinitializeDevice); ok {
+			return sBACnetConfirmedServiceRequestReinitializeDevice
+		}
+		return BACnetConfirmedServiceRequestReinitializeDevice{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestReinitializeDevice) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestReinitializeDeviceParse(io spi.ReadBuffer) (BA
 }
 
 func (m BACnetConfirmedServiceRequestReinitializeDevice) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestReinitializeDevice); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
index d4adccb..be7fbc9 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemoveListElement.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestRemoveListElement() BACnetConfirmedServiceR
 	return &BACnetConfirmedServiceRequestRemoveListElement{}
 }
 
+func CastIBACnetConfirmedServiceRequestRemoveListElement(structType interface{}) IBACnetConfirmedServiceRequestRemoveListElement {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemoveListElement {
+		if iBACnetConfirmedServiceRequestRemoveListElement, ok := typ.(IBACnetConfirmedServiceRequestRemoveListElement); ok {
+			return iBACnetConfirmedServiceRequestRemoveListElement
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestRemoveListElement(structType interface{}) BACnetConfirmedServiceRequestRemoveListElement {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemoveListElement {
+		if sBACnetConfirmedServiceRequestRemoveListElement, ok := typ.(BACnetConfirmedServiceRequestRemoveListElement); ok {
+			return sBACnetConfirmedServiceRequestRemoveListElement
+		}
+		return BACnetConfirmedServiceRequestRemoveListElement{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestRemoveListElement) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestRemoveListElementParse(io spi.ReadBuffer) (BAC
 }
 
 func (m BACnetConfirmedServiceRequestRemoveListElement) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestRemoveListElement); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
index bd6657a..35c217e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedAuthenticate.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestRemovedAuthenticate() BACnetConfirmedServic
 	return &BACnetConfirmedServiceRequestRemovedAuthenticate{}
 }
 
+func CastIBACnetConfirmedServiceRequestRemovedAuthenticate(structType interface{}) IBACnetConfirmedServiceRequestRemovedAuthenticate {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemovedAuthenticate {
+		if iBACnetConfirmedServiceRequestRemovedAuthenticate, ok := typ.(IBACnetConfirmedServiceRequestRemovedAuthenticate); ok {
+			return iBACnetConfirmedServiceRequestRemovedAuthenticate
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestRemovedAuthenticate(structType interface{}) BACnetConfirmedServiceRequestRemovedAuthenticate {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemovedAuthenticate {
+		if sBACnetConfirmedServiceRequestRemovedAuthenticate, ok := typ.(BACnetConfirmedServiceRequestRemovedAuthenticate); ok {
+			return sBACnetConfirmedServiceRequestRemovedAuthenticate
+		}
+		return BACnetConfirmedServiceRequestRemovedAuthenticate{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestRemovedAuthenticate) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestRemovedAuthenticateParse(io spi.ReadBuffer) (B
 }
 
 func (m BACnetConfirmedServiceRequestRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestRemovedAuthenticate); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
index 4ab3c76..e2e3f54 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedReadPropertyConditional.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestRemovedReadPropertyConditional() BACnetConf
 	return &BACnetConfirmedServiceRequestRemovedReadPropertyConditional{}
 }
 
+func CastIBACnetConfirmedServiceRequestRemovedReadPropertyConditional(structType interface{}) IBACnetConfirmedServiceRequestRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemovedReadPropertyConditional {
+		if iBACnetConfirmedServiceRequestRemovedReadPropertyConditional, ok := typ.(IBACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
+			return iBACnetConfirmedServiceRequestRemovedReadPropertyConditional
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestRemovedReadPropertyConditional(structType interface{}) BACnetConfirmedServiceRequestRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemovedReadPropertyConditional {
+		if sBACnetConfirmedServiceRequestRemovedReadPropertyConditional, ok := typ.(BACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
+			return sBACnetConfirmedServiceRequestRemovedReadPropertyConditional
+		}
+		return BACnetConfirmedServiceRequestRemovedReadPropertyConditional{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestRemovedReadPropertyConditionalParse(io spi.Rea
 }
 
 func (m BACnetConfirmedServiceRequestRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestRemovedReadPropertyConditional); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
index 074433e..4372335 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestRemovedRequestKey.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestRemovedRequestKey() BACnetConfirmedServiceR
 	return &BACnetConfirmedServiceRequestRemovedRequestKey{}
 }
 
+func CastIBACnetConfirmedServiceRequestRemovedRequestKey(structType interface{}) IBACnetConfirmedServiceRequestRemovedRequestKey {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestRemovedRequestKey {
+		if iBACnetConfirmedServiceRequestRemovedRequestKey, ok := typ.(IBACnetConfirmedServiceRequestRemovedRequestKey); ok {
+			return iBACnetConfirmedServiceRequestRemovedRequestKey
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestRemovedRequestKey(structType interface{}) BACnetConfirmedServiceRequestRemovedRequestKey {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestRemovedRequestKey {
+		if sBACnetConfirmedServiceRequestRemovedRequestKey, ok := typ.(BACnetConfirmedServiceRequestRemovedRequestKey); ok {
+			return sBACnetConfirmedServiceRequestRemovedRequestKey
+		}
+		return BACnetConfirmedServiceRequestRemovedRequestKey{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestRemovedRequestKey) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestRemovedRequestKeyParse(io spi.ReadBuffer) (BAC
 }
 
 func (m BACnetConfirmedServiceRequestRemovedRequestKey) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestRemovedRequestKey); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
index a9858cf..8432dbb 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOV.go
@@ -61,6 +61,26 @@ func NewBACnetConfirmedServiceRequestSubscribeCOV(subscriberProcessIdentifier ui
 	return &BACnetConfirmedServiceRequestSubscribeCOV{subscriberProcessIdentifier: subscriberProcessIdentifier, monitoredObjectType: monitoredObjectType, monitoredObjectInstanceNumber: monitoredObjectInstanceNumber, issueConfirmedNotifications: issueConfirmedNotifications, lifetimeLength: lifetimeLength, lifetimeSeconds: lifetimeSeconds}
 }
 
+func CastIBACnetConfirmedServiceRequestSubscribeCOV(structType interface{}) IBACnetConfirmedServiceRequestSubscribeCOV {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestSubscribeCOV {
+		if iBACnetConfirmedServiceRequestSubscribeCOV, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOV); ok {
+			return iBACnetConfirmedServiceRequestSubscribeCOV
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestSubscribeCOV(structType interface{}) BACnetConfirmedServiceRequestSubscribeCOV {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestSubscribeCOV {
+		if sBACnetConfirmedServiceRequestSubscribeCOV, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOV); ok {
+			return sBACnetConfirmedServiceRequestSubscribeCOV
+		}
+		return BACnetConfirmedServiceRequestSubscribeCOV{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestSubscribeCOV) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -169,51 +189,46 @@ func BACnetConfirmedServiceRequestSubscribeCOVParse(io spi.ReadBuffer) (BACnetCo
 }
 
 func (m BACnetConfirmedServiceRequestSubscribeCOV) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOV); ok {
 
-			// Const Field (subscriberProcessIdentifierHeader)
-			io.WriteUint8(8, 0x09)
+	// Const Field (subscriberProcessIdentifierHeader)
+	io.WriteUint8(8, 0x09)
 
-			// Simple Field (subscriberProcessIdentifier)
-			var subscriberProcessIdentifier uint8 = m.subscriberProcessIdentifier
-			io.WriteUint8(8, (subscriberProcessIdentifier))
+	// Simple Field (subscriberProcessIdentifier)
+	subscriberProcessIdentifier := uint8(m.subscriberProcessIdentifier)
+	io.WriteUint8(8, (subscriberProcessIdentifier))
 
-			// Const Field (monitoredObjectIdentifierHeader)
-			io.WriteUint8(8, 0x1C)
+	// Const Field (monitoredObjectIdentifierHeader)
+	io.WriteUint8(8, 0x1C)
 
-			// Simple Field (monitoredObjectType)
-			var monitoredObjectType uint16 = m.monitoredObjectType
-			io.WriteUint16(10, (monitoredObjectType))
+	// Simple Field (monitoredObjectType)
+	monitoredObjectType := uint16(m.monitoredObjectType)
+	io.WriteUint16(10, (monitoredObjectType))
 
-			// Simple Field (monitoredObjectInstanceNumber)
-			var monitoredObjectInstanceNumber uint32 = m.monitoredObjectInstanceNumber
-			io.WriteUint32(22, (monitoredObjectInstanceNumber))
+	// Simple Field (monitoredObjectInstanceNumber)
+	monitoredObjectInstanceNumber := uint32(m.monitoredObjectInstanceNumber)
+	io.WriteUint32(22, (monitoredObjectInstanceNumber))
 
-			// Const Field (issueConfirmedNotificationsHeader)
-			io.WriteUint8(8, 0x29)
+	// Const Field (issueConfirmedNotificationsHeader)
+	io.WriteUint8(8, 0x29)
 
-			// Const Field (issueConfirmedNotificationsSkipBits)
-			io.WriteUint8(7, 0x00)
+	// Const Field (issueConfirmedNotificationsSkipBits)
+	io.WriteUint8(7, 0x00)
 
-			// Simple Field (issueConfirmedNotifications)
-			var issueConfirmedNotifications bool = m.issueConfirmedNotifications
-			io.WriteBit((bool)(issueConfirmedNotifications))
+	// Simple Field (issueConfirmedNotifications)
+	issueConfirmedNotifications := bool(m.issueConfirmedNotifications)
+	io.WriteBit((bool)(issueConfirmedNotifications))
 
-			// Const Field (lifetimeHeader)
-			io.WriteUint8(5, 0x07)
+	// Const Field (lifetimeHeader)
+	io.WriteUint8(5, 0x07)
 
-			// Simple Field (lifetimeLength)
-			var lifetimeLength uint8 = m.lifetimeLength
-			io.WriteUint8(3, (lifetimeLength))
+	// Simple Field (lifetimeLength)
+	lifetimeLength := uint8(m.lifetimeLength)
+	io.WriteUint8(3, (lifetimeLength))
 
-			// Array Field (lifetimeSeconds)
-			if m.lifetimeSeconds != nil {
-				for _, _element := range m.lifetimeSeconds {
-					io.WriteInt8(8, _element)
-				}
-			}
+	// Array Field (lifetimeSeconds)
+	if m.lifetimeSeconds != nil {
+		for _, _element := range m.lifetimeSeconds {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
index f2a75e2..a232600 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVProperty.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestSubscribeCOVProperty() BACnetConfirmedServi
 	return &BACnetConfirmedServiceRequestSubscribeCOVProperty{}
 }
 
+func CastIBACnetConfirmedServiceRequestSubscribeCOVProperty(structType interface{}) IBACnetConfirmedServiceRequestSubscribeCOVProperty {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestSubscribeCOVProperty {
+		if iBACnetConfirmedServiceRequestSubscribeCOVProperty, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
+			return iBACnetConfirmedServiceRequestSubscribeCOVProperty
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestSubscribeCOVProperty(structType interface{}) BACnetConfirmedServiceRequestSubscribeCOVProperty {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestSubscribeCOVProperty {
+		if sBACnetConfirmedServiceRequestSubscribeCOVProperty, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
+			return sBACnetConfirmedServiceRequestSubscribeCOVProperty
+		}
+		return BACnetConfirmedServiceRequestSubscribeCOVProperty{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestSubscribeCOVPropertyParse(io spi.ReadBuffer) (
 }
 
 func (m BACnetConfirmedServiceRequestSubscribeCOVProperty) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOVProperty); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
index 1e22e85..729cf30 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple() BACnetConfir
 	return &BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple{}
 }
 
+func CastIBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple(structType interface{}) IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
+		if iBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
+			return iBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple(structType interface{}) BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple {
+		if sBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple, ok := typ.(BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
+			return sBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple
+		}
+		return BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestSubscribeCOVPropertyMultipleParse(io spi.ReadB
 }
 
 func (m BACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestSubscribeCOVPropertyMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
index 8b6c3dc..fd7c4be 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTClose.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestVTClose() BACnetConfirmedServiceRequestInit
 	return &BACnetConfirmedServiceRequestVTClose{}
 }
 
+func CastIBACnetConfirmedServiceRequestVTClose(structType interface{}) IBACnetConfirmedServiceRequestVTClose {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestVTClose {
+		if iBACnetConfirmedServiceRequestVTClose, ok := typ.(IBACnetConfirmedServiceRequestVTClose); ok {
+			return iBACnetConfirmedServiceRequestVTClose
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestVTClose(structType interface{}) BACnetConfirmedServiceRequestVTClose {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestVTClose {
+		if sBACnetConfirmedServiceRequestVTClose, ok := typ.(BACnetConfirmedServiceRequestVTClose); ok {
+			return sBACnetConfirmedServiceRequestVTClose
+		}
+		return BACnetConfirmedServiceRequestVTClose{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestVTClose) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestVTCloseParse(io spi.ReadBuffer) (BACnetConfirm
 }
 
 func (m BACnetConfirmedServiceRequestVTClose) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestVTClose); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
index c9591c7..b28a3e2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTData.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestVTData() BACnetConfirmedServiceRequestIniti
 	return &BACnetConfirmedServiceRequestVTData{}
 }
 
+func CastIBACnetConfirmedServiceRequestVTData(structType interface{}) IBACnetConfirmedServiceRequestVTData {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestVTData {
+		if iBACnetConfirmedServiceRequestVTData, ok := typ.(IBACnetConfirmedServiceRequestVTData); ok {
+			return iBACnetConfirmedServiceRequestVTData
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestVTData(structType interface{}) BACnetConfirmedServiceRequestVTData {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestVTData {
+		if sBACnetConfirmedServiceRequestVTData, ok := typ.(BACnetConfirmedServiceRequestVTData); ok {
+			return sBACnetConfirmedServiceRequestVTData
+		}
+		return BACnetConfirmedServiceRequestVTData{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestVTData) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestVTDataParse(io spi.ReadBuffer) (BACnetConfirme
 }
 
 func (m BACnetConfirmedServiceRequestVTData) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestVTData); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
index c50df56..af59c05 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestVTOpen.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestVTOpen() BACnetConfirmedServiceRequestIniti
 	return &BACnetConfirmedServiceRequestVTOpen{}
 }
 
+func CastIBACnetConfirmedServiceRequestVTOpen(structType interface{}) IBACnetConfirmedServiceRequestVTOpen {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestVTOpen {
+		if iBACnetConfirmedServiceRequestVTOpen, ok := typ.(IBACnetConfirmedServiceRequestVTOpen); ok {
+			return iBACnetConfirmedServiceRequestVTOpen
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestVTOpen(structType interface{}) BACnetConfirmedServiceRequestVTOpen {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestVTOpen {
+		if sBACnetConfirmedServiceRequestVTOpen, ok := typ.(BACnetConfirmedServiceRequestVTOpen); ok {
+			return sBACnetConfirmedServiceRequestVTOpen
+		}
+		return BACnetConfirmedServiceRequestVTOpen{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestVTOpen) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestVTOpenParse(io spi.ReadBuffer) (BACnetConfirme
 }
 
 func (m BACnetConfirmedServiceRequestVTOpen) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestVTOpen); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
index 5e7fa90..59fd7d7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWriteProperty.go
@@ -61,6 +61,26 @@ func NewBACnetConfirmedServiceRequestWriteProperty(objectType uint16, objectInst
 	return &BACnetConfirmedServiceRequestWriteProperty{objectType: objectType, objectInstanceNumber: objectInstanceNumber, propertyIdentifierLength: propertyIdentifierLength, propertyIdentifier: propertyIdentifier, value: value, priority: priority}
 }
 
+func CastIBACnetConfirmedServiceRequestWriteProperty(structType interface{}) IBACnetConfirmedServiceRequestWriteProperty {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestWriteProperty {
+		if iBACnetConfirmedServiceRequestWriteProperty, ok := typ.(IBACnetConfirmedServiceRequestWriteProperty); ok {
+			return iBACnetConfirmedServiceRequestWriteProperty
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestWriteProperty(structType interface{}) BACnetConfirmedServiceRequestWriteProperty {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestWriteProperty {
+		if sBACnetConfirmedServiceRequestWriteProperty, ok := typ.(BACnetConfirmedServiceRequestWriteProperty); ok {
+			return sBACnetConfirmedServiceRequestWriteProperty
+		}
+		return BACnetConfirmedServiceRequestWriteProperty{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestWriteProperty) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -167,7 +187,7 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io spi.ReadBuffer, len uint
 	// Optional Field (priority) (Can be skipped, if a given expression evaluates to false)
 	curPos = io.GetPos() - startPos
 	var priority *BACnetTag = nil
-	if (curPos) < ((len) - (1)) {
+	if bool((curPos) < ((len) - (1))) {
 		_message, _err := BACnetTagParse(io)
 		if _err != nil {
 			return nil, errors.New("Error parsing 'priority' field " + _err.Error())
@@ -185,51 +205,46 @@ func BACnetConfirmedServiceRequestWritePropertyParse(io spi.ReadBuffer, len uint
 }
 
 func (m BACnetConfirmedServiceRequestWriteProperty) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestWriteProperty); ok {
-
-			// Const Field (objectIdentifierHeader)
-			io.WriteUint8(8, 0x0C)
-
-			// Simple Field (objectType)
-			var objectType uint16 = m.objectType
-			io.WriteUint16(10, (objectType))
-
-			// Simple Field (objectInstanceNumber)
-			var objectInstanceNumber uint32 = m.objectInstanceNumber
-			io.WriteUint32(22, (objectInstanceNumber))
-
-			// Const Field (propertyIdentifierHeader)
-			io.WriteUint8(5, 0x03)
-
-			// Simple Field (propertyIdentifierLength)
-			var propertyIdentifierLength uint8 = m.propertyIdentifierLength
-			io.WriteUint8(3, (propertyIdentifierLength))
-
-			// Array Field (propertyIdentifier)
-			if m.propertyIdentifier != nil {
-				for _, _element := range m.propertyIdentifier {
-					io.WriteInt8(8, _element)
-				}
-			}
-
-			// Const Field (openingTag)
-			io.WriteUint8(8, 0x3E)
-
-			// Simple Field (value)
-			var value BACnetTag = m.value
-			value.Serialize(io)
-
-			// Const Field (closingTag)
-			io.WriteUint8(8, 0x3F)
-
-			// Optional Field (priority) (Can be skipped, if the value is null)
-			var priority *BACnetTag = nil
-			if m.priority != nil {
-				priority = m.priority
-				priority.Serialize(io)
-			}
+
+	// Const Field (objectIdentifierHeader)
+	io.WriteUint8(8, 0x0C)
+
+	// Simple Field (objectType)
+	objectType := uint16(m.objectType)
+	io.WriteUint16(10, (objectType))
+
+	// Simple Field (objectInstanceNumber)
+	objectInstanceNumber := uint32(m.objectInstanceNumber)
+	io.WriteUint32(22, (objectInstanceNumber))
+
+	// Const Field (propertyIdentifierHeader)
+	io.WriteUint8(5, 0x03)
+
+	// Simple Field (propertyIdentifierLength)
+	propertyIdentifierLength := uint8(m.propertyIdentifierLength)
+	io.WriteUint8(3, (propertyIdentifierLength))
+
+	// Array Field (propertyIdentifier)
+	if m.propertyIdentifier != nil {
+		for _, _element := range m.propertyIdentifier {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
+
+	// Const Field (openingTag)
+	io.WriteUint8(8, 0x3E)
+
+	// Simple Field (value)
+	value := BACnetTag(m.value)
+	value.Serialize(io)
+
+	// Const Field (closingTag)
+	io.WriteUint8(8, 0x3F)
+
+	// Optional Field (priority) (Can be skipped, if the value is null)
+	var priority *BACnetTag = nil
+	if m.priority != nil {
+		priority = m.priority
+		priority.Serialize(io)
+	}
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go
index df03cdb..cb49f35 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetConfirmedServiceRequestWritePropertyMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetConfirmedServiceRequestWritePropertyMultiple() BACnetConfirmedServ
 	return &BACnetConfirmedServiceRequestWritePropertyMultiple{}
 }
 
+func CastIBACnetConfirmedServiceRequestWritePropertyMultiple(structType interface{}) IBACnetConfirmedServiceRequestWritePropertyMultiple {
+	castFunc := func(typ interface{}) IBACnetConfirmedServiceRequestWritePropertyMultiple {
+		if iBACnetConfirmedServiceRequestWritePropertyMultiple, ok := typ.(IBACnetConfirmedServiceRequestWritePropertyMultiple); ok {
+			return iBACnetConfirmedServiceRequestWritePropertyMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetConfirmedServiceRequestWritePropertyMultiple(structType interface{}) BACnetConfirmedServiceRequestWritePropertyMultiple {
+	castFunc := func(typ interface{}) BACnetConfirmedServiceRequestWritePropertyMultiple {
+		if sBACnetConfirmedServiceRequestWritePropertyMultiple, ok := typ.(BACnetConfirmedServiceRequestWritePropertyMultiple); ok {
+			return sBACnetConfirmedServiceRequestWritePropertyMultiple
+		}
+		return BACnetConfirmedServiceRequestWritePropertyMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetConfirmedServiceRequestWritePropertyMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetConfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetConfirmedServiceRequestWritePropertyMultipleParse(io spi.ReadBuffer)
 }
 
 func (m BACnetConfirmedServiceRequestWritePropertyMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetConfirmedServiceRequestWritePropertyMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
index bb8031e..7bc9dd5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetError.go
@@ -42,6 +42,26 @@ func BACnetErrorServiceChoice(m IBACnetError) uint8 {
 	return m.ServiceChoice()
 }
 
+func CastIBACnetError(structType interface{}) IBACnetError {
+	castFunc := func(typ interface{}) IBACnetError {
+		if iBACnetError, ok := typ.(IBACnetError); ok {
+			return iBACnetError
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetError(structType interface{}) BACnetError {
+	castFunc := func(typ interface{}) BACnetError {
+		if sBACnetError, ok := typ.(BACnetError); ok {
+			return sBACnetError
+		}
+		return BACnetError{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetError) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -104,16 +124,12 @@ func BACnetErrorParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m BACnetError) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iBACnetError, ok := typ.(IBACnetError); ok {
+	iBACnetError := CastIBACnetError(m)
 
-			// Discriminator Field (serviceChoice) (Used as input to a switch field)
-			serviceChoice := BACnetErrorServiceChoice(iBACnetError)
-			io.WriteUint8(8, (serviceChoice))
+	// Discriminator Field (serviceChoice) (Used as input to a switch field)
+	serviceChoice := uint8(BACnetErrorServiceChoice(iBACnetError))
+	io.WriteUint8(8, (serviceChoice))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iBACnetError.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iBACnetError.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go
index 5fb2dba..3cca193 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicReadFile.go
@@ -46,6 +46,26 @@ func NewBACnetErrorAtomicReadFile() BACnetErrorInitializer {
 	return &BACnetErrorAtomicReadFile{}
 }
 
+func CastIBACnetErrorAtomicReadFile(structType interface{}) IBACnetErrorAtomicReadFile {
+	castFunc := func(typ interface{}) IBACnetErrorAtomicReadFile {
+		if iBACnetErrorAtomicReadFile, ok := typ.(IBACnetErrorAtomicReadFile); ok {
+			return iBACnetErrorAtomicReadFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorAtomicReadFile(structType interface{}) BACnetErrorAtomicReadFile {
+	castFunc := func(typ interface{}) BACnetErrorAtomicReadFile {
+		if sBACnetErrorAtomicReadFile, ok := typ.(BACnetErrorAtomicReadFile); ok {
+			return sBACnetErrorAtomicReadFile
+		}
+		return BACnetErrorAtomicReadFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorAtomicReadFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorAtomicReadFileParse(io spi.ReadBuffer) (BACnetErrorInitializer,
 }
 
 func (m BACnetErrorAtomicReadFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorAtomicReadFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go
index 3283416..32e4873 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorAtomicWriteFile.go
@@ -46,6 +46,26 @@ func NewBACnetErrorAtomicWriteFile() BACnetErrorInitializer {
 	return &BACnetErrorAtomicWriteFile{}
 }
 
+func CastIBACnetErrorAtomicWriteFile(structType interface{}) IBACnetErrorAtomicWriteFile {
+	castFunc := func(typ interface{}) IBACnetErrorAtomicWriteFile {
+		if iBACnetErrorAtomicWriteFile, ok := typ.(IBACnetErrorAtomicWriteFile); ok {
+			return iBACnetErrorAtomicWriteFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorAtomicWriteFile(structType interface{}) BACnetErrorAtomicWriteFile {
+	castFunc := func(typ interface{}) BACnetErrorAtomicWriteFile {
+		if sBACnetErrorAtomicWriteFile, ok := typ.(BACnetErrorAtomicWriteFile); ok {
+			return sBACnetErrorAtomicWriteFile
+		}
+		return BACnetErrorAtomicWriteFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorAtomicWriteFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorAtomicWriteFileParse(io spi.ReadBuffer) (BACnetErrorInitializer,
 }
 
 func (m BACnetErrorAtomicWriteFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorAtomicWriteFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go
index 9b7420e..ca7ca10 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorConfirmedPrivateTransfer.go
@@ -46,6 +46,26 @@ func NewBACnetErrorConfirmedPrivateTransfer() BACnetErrorInitializer {
 	return &BACnetErrorConfirmedPrivateTransfer{}
 }
 
+func CastIBACnetErrorConfirmedPrivateTransfer(structType interface{}) IBACnetErrorConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) IBACnetErrorConfirmedPrivateTransfer {
+		if iBACnetErrorConfirmedPrivateTransfer, ok := typ.(IBACnetErrorConfirmedPrivateTransfer); ok {
+			return iBACnetErrorConfirmedPrivateTransfer
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorConfirmedPrivateTransfer(structType interface{}) BACnetErrorConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) BACnetErrorConfirmedPrivateTransfer {
+		if sBACnetErrorConfirmedPrivateTransfer, ok := typ.(BACnetErrorConfirmedPrivateTransfer); ok {
+			return sBACnetErrorConfirmedPrivateTransfer
+		}
+		return BACnetErrorConfirmedPrivateTransfer{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorConfirmedPrivateTransfer) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorConfirmedPrivateTransferParse(io spi.ReadBuffer) (BACnetErrorIni
 }
 
 func (m BACnetErrorConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorConfirmedPrivateTransfer); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go
index 0a84055..c14c5b4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorCreateObject.go
@@ -46,6 +46,26 @@ func NewBACnetErrorCreateObject() BACnetErrorInitializer {
 	return &BACnetErrorCreateObject{}
 }
 
+func CastIBACnetErrorCreateObject(structType interface{}) IBACnetErrorCreateObject {
+	castFunc := func(typ interface{}) IBACnetErrorCreateObject {
+		if iBACnetErrorCreateObject, ok := typ.(IBACnetErrorCreateObject); ok {
+			return iBACnetErrorCreateObject
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorCreateObject(structType interface{}) BACnetErrorCreateObject {
+	castFunc := func(typ interface{}) BACnetErrorCreateObject {
+		if sBACnetErrorCreateObject, ok := typ.(BACnetErrorCreateObject); ok {
+			return sBACnetErrorCreateObject
+		}
+		return BACnetErrorCreateObject{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorCreateObject) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorCreateObjectParse(io spi.ReadBuffer) (BACnetErrorInitializer, er
 }
 
 func (m BACnetErrorCreateObject) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorCreateObject); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go
index efe70e2..97f44aa 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetAlarmSummary.go
@@ -46,6 +46,26 @@ func NewBACnetErrorGetAlarmSummary() BACnetErrorInitializer {
 	return &BACnetErrorGetAlarmSummary{}
 }
 
+func CastIBACnetErrorGetAlarmSummary(structType interface{}) IBACnetErrorGetAlarmSummary {
+	castFunc := func(typ interface{}) IBACnetErrorGetAlarmSummary {
+		if iBACnetErrorGetAlarmSummary, ok := typ.(IBACnetErrorGetAlarmSummary); ok {
+			return iBACnetErrorGetAlarmSummary
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorGetAlarmSummary(structType interface{}) BACnetErrorGetAlarmSummary {
+	castFunc := func(typ interface{}) BACnetErrorGetAlarmSummary {
+		if sBACnetErrorGetAlarmSummary, ok := typ.(BACnetErrorGetAlarmSummary); ok {
+			return sBACnetErrorGetAlarmSummary
+		}
+		return BACnetErrorGetAlarmSummary{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorGetAlarmSummary) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorGetAlarmSummaryParse(io spi.ReadBuffer) (BACnetErrorInitializer,
 }
 
 func (m BACnetErrorGetAlarmSummary) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorGetAlarmSummary); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go
index 5073a34..cdeb293 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEnrollmentSummary.go
@@ -46,6 +46,26 @@ func NewBACnetErrorGetEnrollmentSummary() BACnetErrorInitializer {
 	return &BACnetErrorGetEnrollmentSummary{}
 }
 
+func CastIBACnetErrorGetEnrollmentSummary(structType interface{}) IBACnetErrorGetEnrollmentSummary {
+	castFunc := func(typ interface{}) IBACnetErrorGetEnrollmentSummary {
+		if iBACnetErrorGetEnrollmentSummary, ok := typ.(IBACnetErrorGetEnrollmentSummary); ok {
+			return iBACnetErrorGetEnrollmentSummary
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorGetEnrollmentSummary(structType interface{}) BACnetErrorGetEnrollmentSummary {
+	castFunc := func(typ interface{}) BACnetErrorGetEnrollmentSummary {
+		if sBACnetErrorGetEnrollmentSummary, ok := typ.(BACnetErrorGetEnrollmentSummary); ok {
+			return sBACnetErrorGetEnrollmentSummary
+		}
+		return BACnetErrorGetEnrollmentSummary{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorGetEnrollmentSummary) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorGetEnrollmentSummaryParse(io spi.ReadBuffer) (BACnetErrorInitial
 }
 
 func (m BACnetErrorGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorGetEnrollmentSummary); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go
index a70c863..03255f2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorGetEventInformation.go
@@ -46,6 +46,26 @@ func NewBACnetErrorGetEventInformation() BACnetErrorInitializer {
 	return &BACnetErrorGetEventInformation{}
 }
 
+func CastIBACnetErrorGetEventInformation(structType interface{}) IBACnetErrorGetEventInformation {
+	castFunc := func(typ interface{}) IBACnetErrorGetEventInformation {
+		if iBACnetErrorGetEventInformation, ok := typ.(IBACnetErrorGetEventInformation); ok {
+			return iBACnetErrorGetEventInformation
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorGetEventInformation(structType interface{}) BACnetErrorGetEventInformation {
+	castFunc := func(typ interface{}) BACnetErrorGetEventInformation {
+		if sBACnetErrorGetEventInformation, ok := typ.(BACnetErrorGetEventInformation); ok {
+			return sBACnetErrorGetEventInformation
+		}
+		return BACnetErrorGetEventInformation{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorGetEventInformation) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorGetEventInformationParse(io spi.ReadBuffer) (BACnetErrorInitiali
 }
 
 func (m BACnetErrorGetEventInformation) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorGetEventInformation); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
index 96d9fc0..7e6f0e8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadProperty.go
@@ -56,6 +56,26 @@ func NewBACnetErrorReadProperty(errorClassLength uint8, errorClass []int8, error
 	return &BACnetErrorReadProperty{errorClassLength: errorClassLength, errorClass: errorClass, errorCodeLength: errorCodeLength, errorCode: errorCode}
 }
 
+func CastIBACnetErrorReadProperty(structType interface{}) IBACnetErrorReadProperty {
+	castFunc := func(typ interface{}) IBACnetErrorReadProperty {
+		if iBACnetErrorReadProperty, ok := typ.(IBACnetErrorReadProperty); ok {
+			return iBACnetErrorReadProperty
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorReadProperty(structType interface{}) BACnetErrorReadProperty {
+	castFunc := func(typ interface{}) BACnetErrorReadProperty {
+		if sBACnetErrorReadProperty, ok := typ.(BACnetErrorReadProperty); ok {
+			return sBACnetErrorReadProperty
+		}
+		return BACnetErrorReadProperty{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorReadProperty) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -135,37 +155,32 @@ func BACnetErrorReadPropertyParse(io spi.ReadBuffer) (BACnetErrorInitializer, er
 }
 
 func (m BACnetErrorReadProperty) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorReadProperty); ok {
-
-			// Const Field (errorClassHeader)
-			io.WriteUint8(5, 0x12)
-
-			// Simple Field (errorClassLength)
-			var errorClassLength uint8 = m.errorClassLength
-			io.WriteUint8(3, (errorClassLength))
-
-			// Array Field (errorClass)
-			if m.errorClass != nil {
-				for _, _element := range m.errorClass {
-					io.WriteInt8(8, _element)
-				}
-			}
-
-			// Const Field (errorCodeHeader)
-			io.WriteUint8(5, 0x12)
-
-			// Simple Field (errorCodeLength)
-			var errorCodeLength uint8 = m.errorCodeLength
-			io.WriteUint8(3, (errorCodeLength))
-
-			// Array Field (errorCode)
-			if m.errorCode != nil {
-				for _, _element := range m.errorCode {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Const Field (errorClassHeader)
+	io.WriteUint8(5, 0x12)
+
+	// Simple Field (errorClassLength)
+	errorClassLength := uint8(m.errorClassLength)
+	io.WriteUint8(3, (errorClassLength))
+
+	// Array Field (errorClass)
+	if m.errorClass != nil {
+		for _, _element := range m.errorClass {
+			io.WriteInt8(8, _element)
+		}
+	}
+
+	// Const Field (errorCodeHeader)
+	io.WriteUint8(5, 0x12)
+
+	// Simple Field (errorCodeLength)
+	errorCodeLength := uint8(m.errorCodeLength)
+	io.WriteUint8(3, (errorCodeLength))
+
+	// Array Field (errorCode)
+	if m.errorCode != nil {
+		for _, _element := range m.errorCode {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go
index 96f1ef3..a24496e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadPropertyMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetErrorReadPropertyMultiple() BACnetErrorInitializer {
 	return &BACnetErrorReadPropertyMultiple{}
 }
 
+func CastIBACnetErrorReadPropertyMultiple(structType interface{}) IBACnetErrorReadPropertyMultiple {
+	castFunc := func(typ interface{}) IBACnetErrorReadPropertyMultiple {
+		if iBACnetErrorReadPropertyMultiple, ok := typ.(IBACnetErrorReadPropertyMultiple); ok {
+			return iBACnetErrorReadPropertyMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorReadPropertyMultiple(structType interface{}) BACnetErrorReadPropertyMultiple {
+	castFunc := func(typ interface{}) BACnetErrorReadPropertyMultiple {
+		if sBACnetErrorReadPropertyMultiple, ok := typ.(BACnetErrorReadPropertyMultiple); ok {
+			return sBACnetErrorReadPropertyMultiple
+		}
+		return BACnetErrorReadPropertyMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorReadPropertyMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorReadPropertyMultipleParse(io spi.ReadBuffer) (BACnetErrorInitial
 }
 
 func (m BACnetErrorReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorReadPropertyMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go
index fc7efde..ede7d1f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorReadRange.go
@@ -46,6 +46,26 @@ func NewBACnetErrorReadRange() BACnetErrorInitializer {
 	return &BACnetErrorReadRange{}
 }
 
+func CastIBACnetErrorReadRange(structType interface{}) IBACnetErrorReadRange {
+	castFunc := func(typ interface{}) IBACnetErrorReadRange {
+		if iBACnetErrorReadRange, ok := typ.(IBACnetErrorReadRange); ok {
+			return iBACnetErrorReadRange
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorReadRange(structType interface{}) BACnetErrorReadRange {
+	castFunc := func(typ interface{}) BACnetErrorReadRange {
+		if sBACnetErrorReadRange, ok := typ.(BACnetErrorReadRange); ok {
+			return sBACnetErrorReadRange
+		}
+		return BACnetErrorReadRange{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorReadRange) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorReadRangeParse(io spi.ReadBuffer) (BACnetErrorInitializer, error
 }
 
 func (m BACnetErrorReadRange) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorReadRange); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go
index ee98e85..8b80694 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedAuthenticate.go
@@ -46,6 +46,26 @@ func NewBACnetErrorRemovedAuthenticate() BACnetErrorInitializer {
 	return &BACnetErrorRemovedAuthenticate{}
 }
 
+func CastIBACnetErrorRemovedAuthenticate(structType interface{}) IBACnetErrorRemovedAuthenticate {
+	castFunc := func(typ interface{}) IBACnetErrorRemovedAuthenticate {
+		if iBACnetErrorRemovedAuthenticate, ok := typ.(IBACnetErrorRemovedAuthenticate); ok {
+			return iBACnetErrorRemovedAuthenticate
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorRemovedAuthenticate(structType interface{}) BACnetErrorRemovedAuthenticate {
+	castFunc := func(typ interface{}) BACnetErrorRemovedAuthenticate {
+		if sBACnetErrorRemovedAuthenticate, ok := typ.(BACnetErrorRemovedAuthenticate); ok {
+			return sBACnetErrorRemovedAuthenticate
+		}
+		return BACnetErrorRemovedAuthenticate{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorRemovedAuthenticate) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorRemovedAuthenticateParse(io spi.ReadBuffer) (BACnetErrorInitiali
 }
 
 func (m BACnetErrorRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorRemovedAuthenticate); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go
index fbc57a5..d412743 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorRemovedReadPropertyConditional.go
@@ -46,6 +46,26 @@ func NewBACnetErrorRemovedReadPropertyConditional() BACnetErrorInitializer {
 	return &BACnetErrorRemovedReadPropertyConditional{}
 }
 
+func CastIBACnetErrorRemovedReadPropertyConditional(structType interface{}) IBACnetErrorRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) IBACnetErrorRemovedReadPropertyConditional {
+		if iBACnetErrorRemovedReadPropertyConditional, ok := typ.(IBACnetErrorRemovedReadPropertyConditional); ok {
+			return iBACnetErrorRemovedReadPropertyConditional
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorRemovedReadPropertyConditional(structType interface{}) BACnetErrorRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) BACnetErrorRemovedReadPropertyConditional {
+		if sBACnetErrorRemovedReadPropertyConditional, ok := typ.(BACnetErrorRemovedReadPropertyConditional); ok {
+			return sBACnetErrorRemovedReadPropertyConditional
+		}
+		return BACnetErrorRemovedReadPropertyConditional{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorRemovedReadPropertyConditional) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorRemovedReadPropertyConditionalParse(io spi.ReadBuffer) (BACnetEr
 }
 
 func (m BACnetErrorRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorRemovedReadPropertyConditional); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go
index eba4084..e2ab52d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTData.go
@@ -46,6 +46,26 @@ func NewBACnetErrorVTData() BACnetErrorInitializer {
 	return &BACnetErrorVTData{}
 }
 
+func CastIBACnetErrorVTData(structType interface{}) IBACnetErrorVTData {
+	castFunc := func(typ interface{}) IBACnetErrorVTData {
+		if iBACnetErrorVTData, ok := typ.(IBACnetErrorVTData); ok {
+			return iBACnetErrorVTData
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorVTData(structType interface{}) BACnetErrorVTData {
+	castFunc := func(typ interface{}) BACnetErrorVTData {
+		if sBACnetErrorVTData, ok := typ.(BACnetErrorVTData); ok {
+			return sBACnetErrorVTData
+		}
+		return BACnetErrorVTData{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorVTData) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorVTDataParse(io spi.ReadBuffer) (BACnetErrorInitializer, error) {
 }
 
 func (m BACnetErrorVTData) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorVTData); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go
index 4e3e14d..537dd7d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetErrorVTOpen.go
@@ -46,6 +46,26 @@ func NewBACnetErrorVTOpen() BACnetErrorInitializer {
 	return &BACnetErrorVTOpen{}
 }
 
+func CastIBACnetErrorVTOpen(structType interface{}) IBACnetErrorVTOpen {
+	castFunc := func(typ interface{}) IBACnetErrorVTOpen {
+		if iBACnetErrorVTOpen, ok := typ.(IBACnetErrorVTOpen); ok {
+			return iBACnetErrorVTOpen
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetErrorVTOpen(structType interface{}) BACnetErrorVTOpen {
+	castFunc := func(typ interface{}) BACnetErrorVTOpen {
+		if sBACnetErrorVTOpen, ok := typ.(BACnetErrorVTOpen); ok {
+			return sBACnetErrorVTOpen
+		}
+		return BACnetErrorVTOpen{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetErrorVTOpen) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetError.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetErrorVTOpenParse(io spi.ReadBuffer) (BACnetErrorInitializer, error) {
 }
 
 func (m BACnetErrorVTOpen) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetErrorVTOpen); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
index 659fcc0..9eb834b 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNetworkType.go
@@ -36,6 +36,16 @@ const (
 	BACnetNetworkType_SERIAL             BACnetNetworkType = 0xA
 )
 
+func CastBACnetNetworkType(structType interface{}) BACnetNetworkType {
+	castFunc := func(typ interface{}) BACnetNetworkType {
+		if sBACnetNetworkType, ok := typ.(BACnetNetworkType); ok {
+			return sBACnetNetworkType
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
 func BACnetNetworkTypeParse(io spi.ReadBuffer) (BACnetNetworkType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
index dd528cb..e5313d0 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNodeType.go
@@ -47,6 +47,16 @@ const (
 	BACnetNodeType_ZONE           BACnetNodeType = 0x15
 )
 
+func CastBACnetNodeType(structType interface{}) BACnetNodeType {
+	castFunc := func(typ interface{}) BACnetNodeType {
+		if sBACnetNodeType, ok := typ.(BACnetNodeType); ok {
+			return sBACnetNodeType
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
 func BACnetNodeTypeParse(io spi.ReadBuffer) (BACnetNodeType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
index 5e868e5..738dea4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetNotifyType.go
@@ -28,6 +28,16 @@ const (
 	BACnetNotifyType_ACK_NOTIFICATION BACnetNotifyType = 0x2
 )
 
+func CastBACnetNotifyType(structType interface{}) BACnetNotifyType {
+	castFunc := func(typ interface{}) BACnetNotifyType {
+		if sBACnetNotifyType, ok := typ.(BACnetNotifyType); ok {
+			return sBACnetNotifyType
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
 func BACnetNotifyTypeParse(io spi.ReadBuffer) (BACnetNotifyType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
index 794e628..9b103f5 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetObjectType.go
@@ -84,6 +84,16 @@ const (
 	BACnetObjectType_ESCALATOR              BACnetObjectType = 0x03A
 )
 
+func CastBACnetObjectType(structType interface{}) BACnetObjectType {
+	castFunc := func(typ interface{}) BACnetObjectType {
+		if sBACnetObjectType, ok := typ.(BACnetObjectType); ok {
+			return sBACnetObjectType
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
 func BACnetObjectTypeParse(io spi.ReadBuffer) (BACnetObjectType, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
index d025cb2..3062a3c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAck.go
@@ -42,6 +42,26 @@ func BACnetServiceAckServiceChoice(m IBACnetServiceAck) uint8 {
 	return m.ServiceChoice()
 }
 
+func CastIBACnetServiceAck(structType interface{}) IBACnetServiceAck {
+	castFunc := func(typ interface{}) IBACnetServiceAck {
+		if iBACnetServiceAck, ok := typ.(IBACnetServiceAck); ok {
+			return iBACnetServiceAck
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAck(structType interface{}) BACnetServiceAck {
+	castFunc := func(typ interface{}) BACnetServiceAck {
+		if sBACnetServiceAck, ok := typ.(BACnetServiceAck); ok {
+			return sBACnetServiceAck
+		}
+		return BACnetServiceAck{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAck) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -104,16 +124,12 @@ func BACnetServiceAckParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m BACnetServiceAck) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iBACnetServiceAck, ok := typ.(IBACnetServiceAck); ok {
+	iBACnetServiceAck := CastIBACnetServiceAck(m)
 
-			// Discriminator Field (serviceChoice) (Used as input to a switch field)
-			serviceChoice := BACnetServiceAckServiceChoice(iBACnetServiceAck)
-			io.WriteUint8(8, (serviceChoice))
+	// Discriminator Field (serviceChoice) (Used as input to a switch field)
+	serviceChoice := uint8(BACnetServiceAckServiceChoice(iBACnetServiceAck))
+	io.WriteUint8(8, (serviceChoice))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iBACnetServiceAck.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iBACnetServiceAck.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go
index 2237e58..80759d4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicReadFile.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckAtomicReadFile() BACnetServiceAckInitializer {
 	return &BACnetServiceAckAtomicReadFile{}
 }
 
+func CastIBACnetServiceAckAtomicReadFile(structType interface{}) IBACnetServiceAckAtomicReadFile {
+	castFunc := func(typ interface{}) IBACnetServiceAckAtomicReadFile {
+		if iBACnetServiceAckAtomicReadFile, ok := typ.(IBACnetServiceAckAtomicReadFile); ok {
+			return iBACnetServiceAckAtomicReadFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckAtomicReadFile(structType interface{}) BACnetServiceAckAtomicReadFile {
+	castFunc := func(typ interface{}) BACnetServiceAckAtomicReadFile {
+		if sBACnetServiceAckAtomicReadFile, ok := typ.(BACnetServiceAckAtomicReadFile); ok {
+			return sBACnetServiceAckAtomicReadFile
+		}
+		return BACnetServiceAckAtomicReadFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckAtomicReadFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckAtomicReadFileParse(io spi.ReadBuffer) (BACnetServiceAckIni
 }
 
 func (m BACnetServiceAckAtomicReadFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckAtomicReadFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go
index 6d228b4..ef621d2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckAtomicWriteFile.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckAtomicWriteFile() BACnetServiceAckInitializer {
 	return &BACnetServiceAckAtomicWriteFile{}
 }
 
+func CastIBACnetServiceAckAtomicWriteFile(structType interface{}) IBACnetServiceAckAtomicWriteFile {
+	castFunc := func(typ interface{}) IBACnetServiceAckAtomicWriteFile {
+		if iBACnetServiceAckAtomicWriteFile, ok := typ.(IBACnetServiceAckAtomicWriteFile); ok {
+			return iBACnetServiceAckAtomicWriteFile
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckAtomicWriteFile(structType interface{}) BACnetServiceAckAtomicWriteFile {
+	castFunc := func(typ interface{}) BACnetServiceAckAtomicWriteFile {
+		if sBACnetServiceAckAtomicWriteFile, ok := typ.(BACnetServiceAckAtomicWriteFile); ok {
+			return sBACnetServiceAckAtomicWriteFile
+		}
+		return BACnetServiceAckAtomicWriteFile{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckAtomicWriteFile) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckAtomicWriteFileParse(io spi.ReadBuffer) (BACnetServiceAckIn
 }
 
 func (m BACnetServiceAckAtomicWriteFile) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckAtomicWriteFile); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
index 78a5b04..220cf6c 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckConfirmedPrivateTransfer.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckConfirmedPrivateTransfer() BACnetServiceAckInitializer {
 	return &BACnetServiceAckConfirmedPrivateTransfer{}
 }
 
+func CastIBACnetServiceAckConfirmedPrivateTransfer(structType interface{}) IBACnetServiceAckConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) IBACnetServiceAckConfirmedPrivateTransfer {
+		if iBACnetServiceAckConfirmedPrivateTransfer, ok := typ.(IBACnetServiceAckConfirmedPrivateTransfer); ok {
+			return iBACnetServiceAckConfirmedPrivateTransfer
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckConfirmedPrivateTransfer(structType interface{}) BACnetServiceAckConfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) BACnetServiceAckConfirmedPrivateTransfer {
+		if sBACnetServiceAckConfirmedPrivateTransfer, ok := typ.(BACnetServiceAckConfirmedPrivateTransfer); ok {
+			return sBACnetServiceAckConfirmedPrivateTransfer
+		}
+		return BACnetServiceAckConfirmedPrivateTransfer{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckConfirmedPrivateTransfer) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckConfirmedPrivateTransferParse(io spi.ReadBuffer) (BACnetSer
 }
 
 func (m BACnetServiceAckConfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckConfirmedPrivateTransfer); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
index eb5b0d8..8ae2a81 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckCreateObject.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckCreateObject() BACnetServiceAckInitializer {
 	return &BACnetServiceAckCreateObject{}
 }
 
+func CastIBACnetServiceAckCreateObject(structType interface{}) IBACnetServiceAckCreateObject {
+	castFunc := func(typ interface{}) IBACnetServiceAckCreateObject {
+		if iBACnetServiceAckCreateObject, ok := typ.(IBACnetServiceAckCreateObject); ok {
+			return iBACnetServiceAckCreateObject
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckCreateObject(structType interface{}) BACnetServiceAckCreateObject {
+	castFunc := func(typ interface{}) BACnetServiceAckCreateObject {
+		if sBACnetServiceAckCreateObject, ok := typ.(BACnetServiceAckCreateObject); ok {
+			return sBACnetServiceAckCreateObject
+		}
+		return BACnetServiceAckCreateObject{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckCreateObject) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckCreateObjectParse(io spi.ReadBuffer) (BACnetServiceAckIniti
 }
 
 func (m BACnetServiceAckCreateObject) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckCreateObject); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
index 1b15774..1fda891 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetAlarmSummary.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckGetAlarmSummary() BACnetServiceAckInitializer {
 	return &BACnetServiceAckGetAlarmSummary{}
 }
 
+func CastIBACnetServiceAckGetAlarmSummary(structType interface{}) IBACnetServiceAckGetAlarmSummary {
+	castFunc := func(typ interface{}) IBACnetServiceAckGetAlarmSummary {
+		if iBACnetServiceAckGetAlarmSummary, ok := typ.(IBACnetServiceAckGetAlarmSummary); ok {
+			return iBACnetServiceAckGetAlarmSummary
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckGetAlarmSummary(structType interface{}) BACnetServiceAckGetAlarmSummary {
+	castFunc := func(typ interface{}) BACnetServiceAckGetAlarmSummary {
+		if sBACnetServiceAckGetAlarmSummary, ok := typ.(BACnetServiceAckGetAlarmSummary); ok {
+			return sBACnetServiceAckGetAlarmSummary
+		}
+		return BACnetServiceAckGetAlarmSummary{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckGetAlarmSummary) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckGetAlarmSummaryParse(io spi.ReadBuffer) (BACnetServiceAckIn
 }
 
 func (m BACnetServiceAckGetAlarmSummary) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckGetAlarmSummary); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
index a5e2f96..fb33a0e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEnrollmentSummary.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckGetEnrollmentSummary() BACnetServiceAckInitializer {
 	return &BACnetServiceAckGetEnrollmentSummary{}
 }
 
+func CastIBACnetServiceAckGetEnrollmentSummary(structType interface{}) IBACnetServiceAckGetEnrollmentSummary {
+	castFunc := func(typ interface{}) IBACnetServiceAckGetEnrollmentSummary {
+		if iBACnetServiceAckGetEnrollmentSummary, ok := typ.(IBACnetServiceAckGetEnrollmentSummary); ok {
+			return iBACnetServiceAckGetEnrollmentSummary
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckGetEnrollmentSummary(structType interface{}) BACnetServiceAckGetEnrollmentSummary {
+	castFunc := func(typ interface{}) BACnetServiceAckGetEnrollmentSummary {
+		if sBACnetServiceAckGetEnrollmentSummary, ok := typ.(BACnetServiceAckGetEnrollmentSummary); ok {
+			return sBACnetServiceAckGetEnrollmentSummary
+		}
+		return BACnetServiceAckGetEnrollmentSummary{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckGetEnrollmentSummary) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckGetEnrollmentSummaryParse(io spi.ReadBuffer) (BACnetService
 }
 
 func (m BACnetServiceAckGetEnrollmentSummary) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckGetEnrollmentSummary); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go
index 4045e60..c0bd245 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckGetEventInformation.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckGetEventInformation() BACnetServiceAckInitializer {
 	return &BACnetServiceAckGetEventInformation{}
 }
 
+func CastIBACnetServiceAckGetEventInformation(structType interface{}) IBACnetServiceAckGetEventInformation {
+	castFunc := func(typ interface{}) IBACnetServiceAckGetEventInformation {
+		if iBACnetServiceAckGetEventInformation, ok := typ.(IBACnetServiceAckGetEventInformation); ok {
+			return iBACnetServiceAckGetEventInformation
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckGetEventInformation(structType interface{}) BACnetServiceAckGetEventInformation {
+	castFunc := func(typ interface{}) BACnetServiceAckGetEventInformation {
+		if sBACnetServiceAckGetEventInformation, ok := typ.(BACnetServiceAckGetEventInformation); ok {
+			return sBACnetServiceAckGetEventInformation
+		}
+		return BACnetServiceAckGetEventInformation{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckGetEventInformation) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckGetEventInformationParse(io spi.ReadBuffer) (BACnetServiceA
 }
 
 func (m BACnetServiceAckGetEventInformation) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckGetEventInformation); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
index 665c740..e81d426 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadProperty.go
@@ -60,6 +60,26 @@ func NewBACnetServiceAckReadProperty(objectType uint16, objectInstanceNumber uin
 	return &BACnetServiceAckReadProperty{objectType: objectType, objectInstanceNumber: objectInstanceNumber, propertyIdentifierLength: propertyIdentifierLength, propertyIdentifier: propertyIdentifier, value: value}
 }
 
+func CastIBACnetServiceAckReadProperty(structType interface{}) IBACnetServiceAckReadProperty {
+	castFunc := func(typ interface{}) IBACnetServiceAckReadProperty {
+		if iBACnetServiceAckReadProperty, ok := typ.(IBACnetServiceAckReadProperty); ok {
+			return iBACnetServiceAckReadProperty
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckReadProperty(structType interface{}) BACnetServiceAckReadProperty {
+	castFunc := func(typ interface{}) BACnetServiceAckReadProperty {
+		if sBACnetServiceAckReadProperty, ok := typ.(BACnetServiceAckReadProperty); ok {
+			return sBACnetServiceAckReadProperty
+		}
+		return BACnetServiceAckReadProperty{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckReadProperty) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -161,44 +181,39 @@ func BACnetServiceAckReadPropertyParse(io spi.ReadBuffer) (BACnetServiceAckIniti
 }
 
 func (m BACnetServiceAckReadProperty) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckReadProperty); ok {
 
-			// Const Field (objectIdentifierHeader)
-			io.WriteUint8(8, 0x0C)
+	// Const Field (objectIdentifierHeader)
+	io.WriteUint8(8, 0x0C)
 
-			// Simple Field (objectType)
-			var objectType uint16 = m.objectType
-			io.WriteUint16(10, (objectType))
+	// Simple Field (objectType)
+	objectType := uint16(m.objectType)
+	io.WriteUint16(10, (objectType))
 
-			// Simple Field (objectInstanceNumber)
-			var objectInstanceNumber uint32 = m.objectInstanceNumber
-			io.WriteUint32(22, (objectInstanceNumber))
+	// Simple Field (objectInstanceNumber)
+	objectInstanceNumber := uint32(m.objectInstanceNumber)
+	io.WriteUint32(22, (objectInstanceNumber))
 
-			// Const Field (propertyIdentifierHeader)
-			io.WriteUint8(5, 0x03)
+	// Const Field (propertyIdentifierHeader)
+	io.WriteUint8(5, 0x03)
 
-			// Simple Field (propertyIdentifierLength)
-			var propertyIdentifierLength uint8 = m.propertyIdentifierLength
-			io.WriteUint8(3, (propertyIdentifierLength))
+	// Simple Field (propertyIdentifierLength)
+	propertyIdentifierLength := uint8(m.propertyIdentifierLength)
+	io.WriteUint8(3, (propertyIdentifierLength))
 
-			// Array Field (propertyIdentifier)
-			if m.propertyIdentifier != nil {
-				for _, _element := range m.propertyIdentifier {
-					io.WriteInt8(8, _element)
-				}
-			}
+	// Array Field (propertyIdentifier)
+	if m.propertyIdentifier != nil {
+		for _, _element := range m.propertyIdentifier {
+			io.WriteInt8(8, _element)
+		}
+	}
 
-			// Const Field (openingTag)
-			io.WriteUint8(8, 0x3E)
+	// Const Field (openingTag)
+	io.WriteUint8(8, 0x3E)
 
-			// Simple Field (value)
-			var value BACnetTag = m.value
-			value.Serialize(io)
+	// Simple Field (value)
+	value := BACnetTag(m.value)
+	value.Serialize(io)
 
-			// Const Field (closingTag)
-			io.WriteUint8(8, 0x3F)
-		}
-	}
-	serializeFunc(m)
+	// Const Field (closingTag)
+	io.WriteUint8(8, 0x3F)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go
index 500841e..b58bc86 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadPropertyMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckReadPropertyMultiple() BACnetServiceAckInitializer {
 	return &BACnetServiceAckReadPropertyMultiple{}
 }
 
+func CastIBACnetServiceAckReadPropertyMultiple(structType interface{}) IBACnetServiceAckReadPropertyMultiple {
+	castFunc := func(typ interface{}) IBACnetServiceAckReadPropertyMultiple {
+		if iBACnetServiceAckReadPropertyMultiple, ok := typ.(IBACnetServiceAckReadPropertyMultiple); ok {
+			return iBACnetServiceAckReadPropertyMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckReadPropertyMultiple(structType interface{}) BACnetServiceAckReadPropertyMultiple {
+	castFunc := func(typ interface{}) BACnetServiceAckReadPropertyMultiple {
+		if sBACnetServiceAckReadPropertyMultiple, ok := typ.(BACnetServiceAckReadPropertyMultiple); ok {
+			return sBACnetServiceAckReadPropertyMultiple
+		}
+		return BACnetServiceAckReadPropertyMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckReadPropertyMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckReadPropertyMultipleParse(io spi.ReadBuffer) (BACnetService
 }
 
 func (m BACnetServiceAckReadPropertyMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckReadPropertyMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
index fb90fb9..e8f56dc 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckReadRange.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckReadRange() BACnetServiceAckInitializer {
 	return &BACnetServiceAckReadRange{}
 }
 
+func CastIBACnetServiceAckReadRange(structType interface{}) IBACnetServiceAckReadRange {
+	castFunc := func(typ interface{}) IBACnetServiceAckReadRange {
+		if iBACnetServiceAckReadRange, ok := typ.(IBACnetServiceAckReadRange); ok {
+			return iBACnetServiceAckReadRange
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckReadRange(structType interface{}) BACnetServiceAckReadRange {
+	castFunc := func(typ interface{}) BACnetServiceAckReadRange {
+		if sBACnetServiceAckReadRange, ok := typ.(BACnetServiceAckReadRange); ok {
+			return sBACnetServiceAckReadRange
+		}
+		return BACnetServiceAckReadRange{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckReadRange) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckReadRangeParse(io spi.ReadBuffer) (BACnetServiceAckInitiali
 }
 
 func (m BACnetServiceAckReadRange) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckReadRange); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go
index 6f216ae..5c4aca7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedAuthenticate.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckRemovedAuthenticate() BACnetServiceAckInitializer {
 	return &BACnetServiceAckRemovedAuthenticate{}
 }
 
+func CastIBACnetServiceAckRemovedAuthenticate(structType interface{}) IBACnetServiceAckRemovedAuthenticate {
+	castFunc := func(typ interface{}) IBACnetServiceAckRemovedAuthenticate {
+		if iBACnetServiceAckRemovedAuthenticate, ok := typ.(IBACnetServiceAckRemovedAuthenticate); ok {
+			return iBACnetServiceAckRemovedAuthenticate
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckRemovedAuthenticate(structType interface{}) BACnetServiceAckRemovedAuthenticate {
+	castFunc := func(typ interface{}) BACnetServiceAckRemovedAuthenticate {
+		if sBACnetServiceAckRemovedAuthenticate, ok := typ.(BACnetServiceAckRemovedAuthenticate); ok {
+			return sBACnetServiceAckRemovedAuthenticate
+		}
+		return BACnetServiceAckRemovedAuthenticate{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckRemovedAuthenticate) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckRemovedAuthenticateParse(io spi.ReadBuffer) (BACnetServiceA
 }
 
 func (m BACnetServiceAckRemovedAuthenticate) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckRemovedAuthenticate); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go
index c90fbcd..df02236 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckRemovedReadPropertyConditional.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckRemovedReadPropertyConditional() BACnetServiceAckInitial
 	return &BACnetServiceAckRemovedReadPropertyConditional{}
 }
 
+func CastIBACnetServiceAckRemovedReadPropertyConditional(structType interface{}) IBACnetServiceAckRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) IBACnetServiceAckRemovedReadPropertyConditional {
+		if iBACnetServiceAckRemovedReadPropertyConditional, ok := typ.(IBACnetServiceAckRemovedReadPropertyConditional); ok {
+			return iBACnetServiceAckRemovedReadPropertyConditional
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckRemovedReadPropertyConditional(structType interface{}) BACnetServiceAckRemovedReadPropertyConditional {
+	castFunc := func(typ interface{}) BACnetServiceAckRemovedReadPropertyConditional {
+		if sBACnetServiceAckRemovedReadPropertyConditional, ok := typ.(BACnetServiceAckRemovedReadPropertyConditional); ok {
+			return sBACnetServiceAckRemovedReadPropertyConditional
+		}
+		return BACnetServiceAckRemovedReadPropertyConditional{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckRemovedReadPropertyConditional) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckRemovedReadPropertyConditionalParse(io spi.ReadBuffer) (BAC
 }
 
 func (m BACnetServiceAckRemovedReadPropertyConditional) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckRemovedReadPropertyConditional); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
index 0c3317b..d663304 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTData.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckVTData() BACnetServiceAckInitializer {
 	return &BACnetServiceAckVTData{}
 }
 
+func CastIBACnetServiceAckVTData(structType interface{}) IBACnetServiceAckVTData {
+	castFunc := func(typ interface{}) IBACnetServiceAckVTData {
+		if iBACnetServiceAckVTData, ok := typ.(IBACnetServiceAckVTData); ok {
+			return iBACnetServiceAckVTData
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckVTData(structType interface{}) BACnetServiceAckVTData {
+	castFunc := func(typ interface{}) BACnetServiceAckVTData {
+		if sBACnetServiceAckVTData, ok := typ.(BACnetServiceAckVTData); ok {
+			return sBACnetServiceAckVTData
+		}
+		return BACnetServiceAckVTData{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckVTData) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckVTDataParse(io spi.ReadBuffer) (BACnetServiceAckInitializer
 }
 
 func (m BACnetServiceAckVTData) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckVTData); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
index d15f0d6..891735d 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetServiceAckVTOpen.go
@@ -46,6 +46,26 @@ func NewBACnetServiceAckVTOpen() BACnetServiceAckInitializer {
 	return &BACnetServiceAckVTOpen{}
 }
 
+func CastIBACnetServiceAckVTOpen(structType interface{}) IBACnetServiceAckVTOpen {
+	castFunc := func(typ interface{}) IBACnetServiceAckVTOpen {
+		if iBACnetServiceAckVTOpen, ok := typ.(IBACnetServiceAckVTOpen); ok {
+			return iBACnetServiceAckVTOpen
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetServiceAckVTOpen(structType interface{}) BACnetServiceAckVTOpen {
+	castFunc := func(typ interface{}) BACnetServiceAckVTOpen {
+		if sBACnetServiceAckVTOpen, ok := typ.(BACnetServiceAckVTOpen); ok {
+			return sBACnetServiceAckVTOpen
+		}
+		return BACnetServiceAckVTOpen{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetServiceAckVTOpen) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetServiceAck.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetServiceAckVTOpenParse(io spi.ReadBuffer) (BACnetServiceAckInitializer
 }
 
 func (m BACnetServiceAckVTOpen) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetServiceAckVTOpen); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
index ca4851b..ce9c52f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTag.go
@@ -46,6 +46,26 @@ func BACnetTagContextSpecificTag(m IBACnetTag) uint8 {
 	return m.ContextSpecificTag()
 }
 
+func CastIBACnetTag(structType interface{}) IBACnetTag {
+	castFunc := func(typ interface{}) IBACnetTag {
+		if iBACnetTag, ok := typ.(IBACnetTag); ok {
+			return iBACnetTag
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTag(structType interface{}) BACnetTag {
+	castFunc := func(typ interface{}) BACnetTag {
+		if sBACnetTag, ok := typ.(BACnetTag); ok {
+			return sBACnetTag
+		}
+		return BACnetTag{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTag) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -90,14 +110,14 @@ func BACnetTagParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Optional Field (extTagNumber) (Can be skipped, if a given expression evaluates to false)
 	var extTagNumber *uint8 = nil
-	if (typeOrTagNumber) == (15) {
+	if bool((typeOrTagNumber) == (15)) {
 		_val := io.ReadUint8(8)
 		extTagNumber = &_val
 	}
 
 	// Optional Field (extLength) (Can be skipped, if a given expression evaluates to false)
 	var extLength *uint8 = nil
-	if (lengthValueType) == (5) {
+	if bool((lengthValueType) == (5)) {
 		_val := io.ReadUint8(8)
 		extLength = &_val
 	}
@@ -111,21 +131,21 @@ func BACnetTagParse(io spi.ReadBuffer) (spi.Message, error) {
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x1:
 		initializer, typeSwitchError = BACnetTagApplicationBooleanParse(io)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x2:
-		initializer, typeSwitchError = BACnetTagApplicationUnsignedIntegerParse(io, lengthValueType, extLength)
+		initializer, typeSwitchError = BACnetTagApplicationUnsignedIntegerParse(io, lengthValueType, *extLength)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x3:
-		initializer, typeSwitchError = BACnetTagApplicationSignedIntegerParse(io, lengthValueType, extLength)
+		initializer, typeSwitchError = BACnetTagApplicationSignedIntegerParse(io, lengthValueType, *extLength)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x4:
-		initializer, typeSwitchError = BACnetTagApplicationRealParse(io, lengthValueType, extLength)
+		initializer, typeSwitchError = BACnetTagApplicationRealParse(io, lengthValueType, *extLength)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x5:
-		initializer, typeSwitchError = BACnetTagApplicationDoubleParse(io, lengthValueType, extLength)
+		initializer, typeSwitchError = BACnetTagApplicationDoubleParse(io, lengthValueType, *extLength)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x6:
 		initializer, typeSwitchError = BACnetTagApplicationOctetStringParse(io)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x7:
 		initializer, typeSwitchError = BACnetTagApplicationCharacterStringParse(io)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x8:
-		initializer, typeSwitchError = BACnetTagApplicationBitStringParse(io, lengthValueType, extLength)
+		initializer, typeSwitchError = BACnetTagApplicationBitStringParse(io, lengthValueType, *extLength)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0x9:
-		initializer, typeSwitchError = BACnetTagApplicationEnumeratedParse(io, lengthValueType, extLength)
+		initializer, typeSwitchError = BACnetTagApplicationEnumeratedParse(io, lengthValueType, *extLength)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0xA:
 		initializer, typeSwitchError = BACnetTagApplicationDateParse(io)
 	case contextSpecificTag == 0 && typeOrTagNumber == 0xB:
@@ -133,7 +153,7 @@ func BACnetTagParse(io spi.ReadBuffer) (spi.Message, error) {
 	case contextSpecificTag == 0 && typeOrTagNumber == 0xC:
 		initializer, typeSwitchError = BACnetTagApplicationObjectIdentifierParse(io)
 	case contextSpecificTag == 1:
-		initializer, typeSwitchError = BACnetTagContextParse(io, typeOrTagNumber, extTagNumber, lengthValueType, extLength)
+		initializer, typeSwitchError = BACnetTagContextParse(io, typeOrTagNumber, *extTagNumber, lengthValueType, *extLength)
 	}
 	if typeSwitchError != nil {
 		return nil, errors.New("Error parsing sub-type for type-switch. " + typeSwitchError.Error())
@@ -144,38 +164,34 @@ func BACnetTagParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m BACnetTag) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iBACnetTag, ok := typ.(IBACnetTag); ok {
+	iBACnetTag := CastIBACnetTag(m)
 
-			// Simple Field (typeOrTagNumber)
-			var typeOrTagNumber uint8 = m.typeOrTagNumber
-			io.WriteUint8(4, (typeOrTagNumber))
-
-			// Discriminator Field (contextSpecificTag) (Used as input to a switch field)
-			contextSpecificTag := BACnetTagContextSpecificTag(iBACnetTag)
-			io.WriteUint8(1, (contextSpecificTag))
-
-			// Simple Field (lengthValueType)
-			var lengthValueType uint8 = m.lengthValueType
-			io.WriteUint8(3, (lengthValueType))
-
-			// Optional Field (extTagNumber) (Can be skipped, if the value is null)
-			var extTagNumber *uint8 = nil
-			if m.extTagNumber != nil {
-				extTagNumber = m.extTagNumber
-				io.WriteUint8(8, *(extTagNumber))
-			}
-
-			// Optional Field (extLength) (Can be skipped, if the value is null)
-			var extLength *uint8 = nil
-			if m.extLength != nil {
-				extLength = m.extLength
-				io.WriteUint8(8, *(extLength))
-			}
-
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iBACnetTag.Serialize(io)
-		}
+	// Simple Field (typeOrTagNumber)
+	typeOrTagNumber := uint8(m.typeOrTagNumber)
+	io.WriteUint8(4, (typeOrTagNumber))
+
+	// Discriminator Field (contextSpecificTag) (Used as input to a switch field)
+	contextSpecificTag := uint8(BACnetTagContextSpecificTag(iBACnetTag))
+	io.WriteUint8(1, (contextSpecificTag))
+
+	// Simple Field (lengthValueType)
+	lengthValueType := uint8(m.lengthValueType)
+	io.WriteUint8(3, (lengthValueType))
+
+	// Optional Field (extTagNumber) (Can be skipped, if the value is null)
+	var extTagNumber *uint8 = nil
+	if m.extTagNumber != nil {
+		extTagNumber = m.extTagNumber
+		io.WriteUint8(8, *(extTagNumber))
+	}
+
+	// Optional Field (extLength) (Can be skipped, if the value is null)
+	var extLength *uint8 = nil
+	if m.extLength != nil {
+		extLength = m.extLength
+		io.WriteUint8(8, *(extLength))
 	}
-	serializeFunc(m)
+
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iBACnetTag.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
index 93da747..24c3ca7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBitString.go
@@ -52,6 +52,26 @@ func NewBACnetTagApplicationBitString(unusedBits uint8, data []int8) BACnetTagIn
 	return &BACnetTagApplicationBitString{unusedBits: unusedBits, data: data}
 }
 
+func CastIBACnetTagApplicationBitString(structType interface{}) IBACnetTagApplicationBitString {
+	castFunc := func(typ interface{}) IBACnetTagApplicationBitString {
+		if iBACnetTagApplicationBitString, ok := typ.(IBACnetTagApplicationBitString); ok {
+			return iBACnetTagApplicationBitString
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationBitString(structType interface{}) BACnetTagApplicationBitString {
+	castFunc := func(typ interface{}) BACnetTagApplicationBitString {
+		if sBACnetTagApplicationBitString, ok := typ.(BACnetTagApplicationBitString); ok {
+			return sBACnetTagApplicationBitString
+		}
+		return BACnetTagApplicationBitString{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationBitString) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -78,8 +98,8 @@ func BACnetTagApplicationBitStringParse(io spi.ReadBuffer, lengthValueType uint8
 	// Array field (data)
 	var data []int8
 	// Length array
-	_dataLength := uint16(spi.InlineIf(((lengthValueType) == (5)), uint16(((extLength) - (1))), uint16(((lengthValueType) - (1)))))
-	_dataEndPos := io.GetPos() + _dataLength
+	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(uint16(uint16(extLength)-uint16(uint16(1)))), uint16(uint16(uint16(lengthValueType)-uint16(uint16(1)))))
+	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
 		data = append(data, io.ReadInt8(8))
 	}
@@ -89,20 +109,15 @@ func BACnetTagApplicationBitStringParse(io spi.ReadBuffer, lengthValueType uint8
 }
 
 func (m BACnetTagApplicationBitString) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationBitString); ok {
-
-			// Simple Field (unusedBits)
-			var unusedBits uint8 = m.unusedBits
-			io.WriteUint8(8, (unusedBits))
-
-			// Array Field (data)
-			if m.data != nil {
-				for _, _element := range m.data {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Simple Field (unusedBits)
+	unusedBits := uint8(m.unusedBits)
+	io.WriteUint8(8, (unusedBits))
+
+	// Array Field (data)
+	if m.data != nil {
+		for _, _element := range m.data {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go
index 421deaf..de0eef8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationBoolean.go
@@ -50,6 +50,26 @@ func NewBACnetTagApplicationBoolean() BACnetTagInitializer {
 	return &BACnetTagApplicationBoolean{}
 }
 
+func CastIBACnetTagApplicationBoolean(structType interface{}) IBACnetTagApplicationBoolean {
+	castFunc := func(typ interface{}) IBACnetTagApplicationBoolean {
+		if iBACnetTagApplicationBoolean, ok := typ.(IBACnetTagApplicationBoolean); ok {
+			return iBACnetTagApplicationBoolean
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationBoolean(structType interface{}) BACnetTagApplicationBoolean {
+	castFunc := func(typ interface{}) BACnetTagApplicationBoolean {
+		if sBACnetTagApplicationBoolean, ok := typ.(BACnetTagApplicationBoolean); ok {
+			return sBACnetTagApplicationBoolean
+		}
+		return BACnetTagApplicationBoolean{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationBoolean) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -67,9 +87,5 @@ func BACnetTagApplicationBooleanParse(io spi.ReadBuffer) (BACnetTagInitializer,
 }
 
 func (m BACnetTagApplicationBoolean) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationBoolean); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
index facb6c8..5e8267a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationCharacterString.go
@@ -50,6 +50,26 @@ func NewBACnetTagApplicationCharacterString() BACnetTagInitializer {
 	return &BACnetTagApplicationCharacterString{}
 }
 
+func CastIBACnetTagApplicationCharacterString(structType interface{}) IBACnetTagApplicationCharacterString {
+	castFunc := func(typ interface{}) IBACnetTagApplicationCharacterString {
+		if iBACnetTagApplicationCharacterString, ok := typ.(IBACnetTagApplicationCharacterString); ok {
+			return iBACnetTagApplicationCharacterString
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationCharacterString(structType interface{}) BACnetTagApplicationCharacterString {
+	castFunc := func(typ interface{}) BACnetTagApplicationCharacterString {
+		if sBACnetTagApplicationCharacterString, ok := typ.(BACnetTagApplicationCharacterString); ok {
+			return sBACnetTagApplicationCharacterString
+		}
+		return BACnetTagApplicationCharacterString{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationCharacterString) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -67,9 +87,5 @@ func BACnetTagApplicationCharacterStringParse(io spi.ReadBuffer) (BACnetTagIniti
 }
 
 func (m BACnetTagApplicationCharacterString) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationCharacterString); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go
index c968020..e162473 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDate.go
@@ -50,6 +50,26 @@ func NewBACnetTagApplicationDate() BACnetTagInitializer {
 	return &BACnetTagApplicationDate{}
 }
 
+func CastIBACnetTagApplicationDate(structType interface{}) IBACnetTagApplicationDate {
+	castFunc := func(typ interface{}) IBACnetTagApplicationDate {
+		if iBACnetTagApplicationDate, ok := typ.(IBACnetTagApplicationDate); ok {
+			return iBACnetTagApplicationDate
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationDate(structType interface{}) BACnetTagApplicationDate {
+	castFunc := func(typ interface{}) BACnetTagApplicationDate {
+		if sBACnetTagApplicationDate, ok := typ.(BACnetTagApplicationDate); ok {
+			return sBACnetTagApplicationDate
+		}
+		return BACnetTagApplicationDate{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationDate) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -67,9 +87,5 @@ func BACnetTagApplicationDateParse(io spi.ReadBuffer) (BACnetTagInitializer, err
 }
 
 func (m BACnetTagApplicationDate) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationDate); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
index 699e0af..f987e67 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationDouble.go
@@ -51,6 +51,26 @@ func NewBACnetTagApplicationDouble(value float64) BACnetTagInitializer {
 	return &BACnetTagApplicationDouble{value: value}
 }
 
+func CastIBACnetTagApplicationDouble(structType interface{}) IBACnetTagApplicationDouble {
+	castFunc := func(typ interface{}) IBACnetTagApplicationDouble {
+		if iBACnetTagApplicationDouble, ok := typ.(IBACnetTagApplicationDouble); ok {
+			return iBACnetTagApplicationDouble
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationDouble(structType interface{}) BACnetTagApplicationDouble {
+	castFunc := func(typ interface{}) BACnetTagApplicationDouble {
+		if sBACnetTagApplicationDouble, ok := typ.(BACnetTagApplicationDouble); ok {
+			return sBACnetTagApplicationDouble
+		}
+		return BACnetTagApplicationDouble{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationDouble) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -74,13 +94,8 @@ func BACnetTagApplicationDoubleParse(io spi.ReadBuffer, lengthValueType uint8, e
 }
 
 func (m BACnetTagApplicationDouble) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationDouble); ok {
 
-			// Simple Field (value)
-			var value float64 = m.value
-			io.WriteFloat64(64, (value))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (value)
+	value := float64(m.value)
+	io.WriteFloat64(64, (value))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
index b550ab0..ef4288f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationEnumerated.go
@@ -51,6 +51,26 @@ func NewBACnetTagApplicationEnumerated(data []int8) BACnetTagInitializer {
 	return &BACnetTagApplicationEnumerated{data: data}
 }
 
+func CastIBACnetTagApplicationEnumerated(structType interface{}) IBACnetTagApplicationEnumerated {
+	castFunc := func(typ interface{}) IBACnetTagApplicationEnumerated {
+		if iBACnetTagApplicationEnumerated, ok := typ.(IBACnetTagApplicationEnumerated); ok {
+			return iBACnetTagApplicationEnumerated
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationEnumerated(structType interface{}) BACnetTagApplicationEnumerated {
+	castFunc := func(typ interface{}) BACnetTagApplicationEnumerated {
+		if sBACnetTagApplicationEnumerated, ok := typ.(BACnetTagApplicationEnumerated); ok {
+			return sBACnetTagApplicationEnumerated
+		}
+		return BACnetTagApplicationEnumerated{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationEnumerated) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -71,8 +91,8 @@ func BACnetTagApplicationEnumeratedParse(io spi.ReadBuffer, lengthValueType uint
 	// Array field (data)
 	var data []int8
 	// Length array
-	_dataLength := uint16(spi.InlineIf(((lengthValueType) == (5)), uint16(extLength), uint16(lengthValueType)))
-	_dataEndPos := io.GetPos() + _dataLength
+	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
+	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
 		data = append(data, io.ReadInt8(8))
 	}
@@ -82,16 +102,11 @@ func BACnetTagApplicationEnumeratedParse(io spi.ReadBuffer, lengthValueType uint
 }
 
 func (m BACnetTagApplicationEnumerated) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationEnumerated); ok {
-
-			// Array Field (data)
-			if m.data != nil {
-				for _, _element := range m.data {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Array Field (data)
+	if m.data != nil {
+		for _, _element := range m.data {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go
index 12d3c8e..7517310 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationNull.go
@@ -50,6 +50,26 @@ func NewBACnetTagApplicationNull() BACnetTagInitializer {
 	return &BACnetTagApplicationNull{}
 }
 
+func CastIBACnetTagApplicationNull(structType interface{}) IBACnetTagApplicationNull {
+	castFunc := func(typ interface{}) IBACnetTagApplicationNull {
+		if iBACnetTagApplicationNull, ok := typ.(IBACnetTagApplicationNull); ok {
+			return iBACnetTagApplicationNull
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationNull(structType interface{}) BACnetTagApplicationNull {
+	castFunc := func(typ interface{}) BACnetTagApplicationNull {
+		if sBACnetTagApplicationNull, ok := typ.(BACnetTagApplicationNull); ok {
+			return sBACnetTagApplicationNull
+		}
+		return BACnetTagApplicationNull{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationNull) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -67,9 +87,5 @@ func BACnetTagApplicationNullParse(io spi.ReadBuffer) (BACnetTagInitializer, err
 }
 
 func (m BACnetTagApplicationNull) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationNull); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
index 63374c7..eb43208 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationObjectIdentifier.go
@@ -50,6 +50,26 @@ func NewBACnetTagApplicationObjectIdentifier() BACnetTagInitializer {
 	return &BACnetTagApplicationObjectIdentifier{}
 }
 
+func CastIBACnetTagApplicationObjectIdentifier(structType interface{}) IBACnetTagApplicationObjectIdentifier {
+	castFunc := func(typ interface{}) IBACnetTagApplicationObjectIdentifier {
+		if iBACnetTagApplicationObjectIdentifier, ok := typ.(IBACnetTagApplicationObjectIdentifier); ok {
+			return iBACnetTagApplicationObjectIdentifier
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationObjectIdentifier(structType interface{}) BACnetTagApplicationObjectIdentifier {
+	castFunc := func(typ interface{}) BACnetTagApplicationObjectIdentifier {
+		if sBACnetTagApplicationObjectIdentifier, ok := typ.(BACnetTagApplicationObjectIdentifier); ok {
+			return sBACnetTagApplicationObjectIdentifier
+		}
+		return BACnetTagApplicationObjectIdentifier{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationObjectIdentifier) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -67,9 +87,5 @@ func BACnetTagApplicationObjectIdentifierParse(io spi.ReadBuffer) (BACnetTagInit
 }
 
 func (m BACnetTagApplicationObjectIdentifier) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationObjectIdentifier); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
index ab8507d..1de7c5e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationOctetString.go
@@ -50,6 +50,26 @@ func NewBACnetTagApplicationOctetString() BACnetTagInitializer {
 	return &BACnetTagApplicationOctetString{}
 }
 
+func CastIBACnetTagApplicationOctetString(structType interface{}) IBACnetTagApplicationOctetString {
+	castFunc := func(typ interface{}) IBACnetTagApplicationOctetString {
+		if iBACnetTagApplicationOctetString, ok := typ.(IBACnetTagApplicationOctetString); ok {
+			return iBACnetTagApplicationOctetString
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationOctetString(structType interface{}) BACnetTagApplicationOctetString {
+	castFunc := func(typ interface{}) BACnetTagApplicationOctetString {
+		if sBACnetTagApplicationOctetString, ok := typ.(BACnetTagApplicationOctetString); ok {
+			return sBACnetTagApplicationOctetString
+		}
+		return BACnetTagApplicationOctetString{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationOctetString) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -67,9 +87,5 @@ func BACnetTagApplicationOctetStringParse(io spi.ReadBuffer) (BACnetTagInitializ
 }
 
 func (m BACnetTagApplicationOctetString) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationOctetString); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
index e260d50..6f23f1e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationReal.go
@@ -51,6 +51,26 @@ func NewBACnetTagApplicationReal(value float32) BACnetTagInitializer {
 	return &BACnetTagApplicationReal{value: value}
 }
 
+func CastIBACnetTagApplicationReal(structType interface{}) IBACnetTagApplicationReal {
+	castFunc := func(typ interface{}) IBACnetTagApplicationReal {
+		if iBACnetTagApplicationReal, ok := typ.(IBACnetTagApplicationReal); ok {
+			return iBACnetTagApplicationReal
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationReal(structType interface{}) BACnetTagApplicationReal {
+	castFunc := func(typ interface{}) BACnetTagApplicationReal {
+		if sBACnetTagApplicationReal, ok := typ.(BACnetTagApplicationReal); ok {
+			return sBACnetTagApplicationReal
+		}
+		return BACnetTagApplicationReal{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationReal) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -74,13 +94,8 @@ func BACnetTagApplicationRealParse(io spi.ReadBuffer, lengthValueType uint8, ext
 }
 
 func (m BACnetTagApplicationReal) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationReal); ok {
 
-			// Simple Field (value)
-			var value float32 = m.value
-			io.WriteFloat32(32, (value))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (value)
+	value := float32(m.value)
+	io.WriteFloat32(32, (value))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
index 8ad4ed3..2867a3f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationSignedInteger.go
@@ -51,6 +51,26 @@ func NewBACnetTagApplicationSignedInteger(data []int8) BACnetTagInitializer {
 	return &BACnetTagApplicationSignedInteger{data: data}
 }
 
+func CastIBACnetTagApplicationSignedInteger(structType interface{}) IBACnetTagApplicationSignedInteger {
+	castFunc := func(typ interface{}) IBACnetTagApplicationSignedInteger {
+		if iBACnetTagApplicationSignedInteger, ok := typ.(IBACnetTagApplicationSignedInteger); ok {
+			return iBACnetTagApplicationSignedInteger
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationSignedInteger(structType interface{}) BACnetTagApplicationSignedInteger {
+	castFunc := func(typ interface{}) BACnetTagApplicationSignedInteger {
+		if sBACnetTagApplicationSignedInteger, ok := typ.(BACnetTagApplicationSignedInteger); ok {
+			return sBACnetTagApplicationSignedInteger
+		}
+		return BACnetTagApplicationSignedInteger{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationSignedInteger) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -71,8 +91,8 @@ func BACnetTagApplicationSignedIntegerParse(io spi.ReadBuffer, lengthValueType u
 	// Array field (data)
 	var data []int8
 	// Length array
-	_dataLength := uint16(spi.InlineIf(((lengthValueType) == (5)), uint16(extLength), uint16(lengthValueType)))
-	_dataEndPos := io.GetPos() + _dataLength
+	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
+	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
 		data = append(data, io.ReadInt8(8))
 	}
@@ -82,16 +102,11 @@ func BACnetTagApplicationSignedIntegerParse(io spi.ReadBuffer, lengthValueType u
 }
 
 func (m BACnetTagApplicationSignedInteger) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationSignedInteger); ok {
-
-			// Array Field (data)
-			if m.data != nil {
-				for _, _element := range m.data {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Array Field (data)
+	if m.data != nil {
+		for _, _element := range m.data {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go
index 2843f1a..ef07161 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationTime.go
@@ -50,6 +50,26 @@ func NewBACnetTagApplicationTime() BACnetTagInitializer {
 	return &BACnetTagApplicationTime{}
 }
 
+func CastIBACnetTagApplicationTime(structType interface{}) IBACnetTagApplicationTime {
+	castFunc := func(typ interface{}) IBACnetTagApplicationTime {
+		if iBACnetTagApplicationTime, ok := typ.(IBACnetTagApplicationTime); ok {
+			return iBACnetTagApplicationTime
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationTime(structType interface{}) BACnetTagApplicationTime {
+	castFunc := func(typ interface{}) BACnetTagApplicationTime {
+		if sBACnetTagApplicationTime, ok := typ.(BACnetTagApplicationTime); ok {
+			return sBACnetTagApplicationTime
+		}
+		return BACnetTagApplicationTime{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationTime) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -67,9 +87,5 @@ func BACnetTagApplicationTimeParse(io spi.ReadBuffer) (BACnetTagInitializer, err
 }
 
 func (m BACnetTagApplicationTime) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationTime); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
index 1c2eeca..93d4161 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagApplicationUnsignedInteger.go
@@ -51,6 +51,26 @@ func NewBACnetTagApplicationUnsignedInteger(data []int8) BACnetTagInitializer {
 	return &BACnetTagApplicationUnsignedInteger{data: data}
 }
 
+func CastIBACnetTagApplicationUnsignedInteger(structType interface{}) IBACnetTagApplicationUnsignedInteger {
+	castFunc := func(typ interface{}) IBACnetTagApplicationUnsignedInteger {
+		if iBACnetTagApplicationUnsignedInteger, ok := typ.(IBACnetTagApplicationUnsignedInteger); ok {
+			return iBACnetTagApplicationUnsignedInteger
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagApplicationUnsignedInteger(structType interface{}) BACnetTagApplicationUnsignedInteger {
+	castFunc := func(typ interface{}) BACnetTagApplicationUnsignedInteger {
+		if sBACnetTagApplicationUnsignedInteger, ok := typ.(BACnetTagApplicationUnsignedInteger); ok {
+			return sBACnetTagApplicationUnsignedInteger
+		}
+		return BACnetTagApplicationUnsignedInteger{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagApplicationUnsignedInteger) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -71,8 +91,8 @@ func BACnetTagApplicationUnsignedIntegerParse(io spi.ReadBuffer, lengthValueType
 	// Array field (data)
 	var data []int8
 	// Length array
-	_dataLength := uint16(spi.InlineIf(((lengthValueType) == (5)), uint16(extLength), uint16(lengthValueType)))
-	_dataEndPos := io.GetPos() + _dataLength
+	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
+	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
 		data = append(data, io.ReadInt8(8))
 	}
@@ -82,16 +102,11 @@ func BACnetTagApplicationUnsignedIntegerParse(io spi.ReadBuffer, lengthValueType
 }
 
 func (m BACnetTagApplicationUnsignedInteger) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagApplicationUnsignedInteger); ok {
-
-			// Array Field (data)
-			if m.data != nil {
-				for _, _element := range m.data {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Array Field (data)
+	if m.data != nil {
+		for _, _element := range m.data {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
index 372ecfd..b9d61fc 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagContext.go
@@ -51,6 +51,26 @@ func NewBACnetTagContext(data []int8) BACnetTagInitializer {
 	return &BACnetTagContext{data: data}
 }
 
+func CastIBACnetTagContext(structType interface{}) IBACnetTagContext {
+	castFunc := func(typ interface{}) IBACnetTagContext {
+		if iBACnetTagContext, ok := typ.(IBACnetTagContext); ok {
+			return iBACnetTagContext
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagContext(structType interface{}) BACnetTagContext {
+	castFunc := func(typ interface{}) BACnetTagContext {
+		if sBACnetTagContext, ok := typ.(BACnetTagContext); ok {
+			return sBACnetTagContext
+		}
+		return BACnetTagContext{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagContext) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetTag.LengthInBits()
 
@@ -71,8 +91,8 @@ func BACnetTagContextParse(io spi.ReadBuffer, typeOrTagNumber uint8, extTagNumbe
 	// Array field (data)
 	var data []int8
 	// Length array
-	_dataLength := uint16(spi.InlineIf(((lengthValueType) == (5)), uint16(extLength), uint16(lengthValueType)))
-	_dataEndPos := io.GetPos() + _dataLength
+	_dataLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(extLength), uint16(lengthValueType))
+	_dataEndPos := io.GetPos() + uint16(_dataLength)
 	for io.GetPos() < _dataEndPos {
 		data = append(data, io.ReadInt8(8))
 	}
@@ -82,16 +102,11 @@ func BACnetTagContextParse(io spi.ReadBuffer, typeOrTagNumber uint8, extTagNumbe
 }
 
 func (m BACnetTagContext) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagContext); ok {
-
-			// Array Field (data)
-			if m.data != nil {
-				for _, _element := range m.data {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Array Field (data)
+	if m.data != nil {
+		for _, _element := range m.data {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
index 167feeb..6eb3b61 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetTagWithContent.go
@@ -50,6 +50,26 @@ func NewBACnetTagWithContent(typeOrTagNumber uint8, contextSpecificTag uint8, le
 	return &BACnetTagWithContent{typeOrTagNumber: typeOrTagNumber, contextSpecificTag: contextSpecificTag, lengthValueType: lengthValueType, extTagNumber: extTagNumber, extLength: extLength, propertyIdentifier: propertyIdentifier, value: value}
 }
 
+func CastIBACnetTagWithContent(structType interface{}) IBACnetTagWithContent {
+	castFunc := func(typ interface{}) IBACnetTagWithContent {
+		if iBACnetTagWithContent, ok := typ.(IBACnetTagWithContent); ok {
+			return iBACnetTagWithContent
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetTagWithContent(structType interface{}) BACnetTagWithContent {
+	castFunc := func(typ interface{}) BACnetTagWithContent {
+		if sBACnetTagWithContent, ok := typ.(BACnetTagWithContent); ok {
+			return sBACnetTagWithContent
+		}
+		return BACnetTagWithContent{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetTagWithContent) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -106,14 +126,14 @@ func BACnetTagWithContentParse(io spi.ReadBuffer) (spi.Message, error) {
 
 	// Optional Field (extTagNumber) (Can be skipped, if a given expression evaluates to false)
 	var extTagNumber *uint8 = nil
-	if (typeOrTagNumber) == (15) {
+	if bool((typeOrTagNumber) == (15)) {
 		_val := io.ReadUint8(8)
 		extTagNumber = &_val
 	}
 
 	// Optional Field (extLength) (Can be skipped, if a given expression evaluates to false)
 	var extLength *uint8 = nil
-	if (lengthValueType) == (5) {
+	if bool((lengthValueType) == (5)) {
 		_val := io.ReadUint8(8)
 		extLength = &_val
 	}
@@ -121,8 +141,8 @@ func BACnetTagWithContentParse(io spi.ReadBuffer) (spi.Message, error) {
 	// Array field (propertyIdentifier)
 	var propertyIdentifier []uint8
 	// Length array
-	_propertyIdentifierLength := uint16(spi.InlineIf(((lengthValueType) == (5)), uint16(extLength), uint16(lengthValueType)))
-	_propertyIdentifierEndPos := io.GetPos() + _propertyIdentifierLength
+	_propertyIdentifierLength := spi.InlineIf(bool(bool((lengthValueType) == (5))), uint16(*extLength), uint16(lengthValueType))
+	_propertyIdentifierEndPos := io.GetPos() + uint16(_propertyIdentifierLength)
 	for io.GetPos() < _propertyIdentifierEndPos {
 		propertyIdentifier = append(propertyIdentifier, io.ReadUint8(8))
 	}
@@ -155,52 +175,47 @@ func BACnetTagWithContentParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m BACnetTagWithContent) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetTagWithContent); ok {
-
-			// Simple Field (typeOrTagNumber)
-			var typeOrTagNumber uint8 = m.typeOrTagNumber
-			io.WriteUint8(4, (typeOrTagNumber))
-
-			// Simple Field (contextSpecificTag)
-			var contextSpecificTag uint8 = m.contextSpecificTag
-			io.WriteUint8(1, (contextSpecificTag))
-
-			// Simple Field (lengthValueType)
-			var lengthValueType uint8 = m.lengthValueType
-			io.WriteUint8(3, (lengthValueType))
-
-			// Optional Field (extTagNumber) (Can be skipped, if the value is null)
-			var extTagNumber *uint8 = nil
-			if m.extTagNumber != nil {
-				extTagNumber = m.extTagNumber
-				io.WriteUint8(8, *(extTagNumber))
-			}
-
-			// Optional Field (extLength) (Can be skipped, if the value is null)
-			var extLength *uint8 = nil
-			if m.extLength != nil {
-				extLength = m.extLength
-				io.WriteUint8(8, *(extLength))
-			}
-
-			// Array Field (propertyIdentifier)
-			if m.propertyIdentifier != nil {
-				for _, _element := range m.propertyIdentifier {
-					io.WriteUint8(8, _element)
-				}
-			}
-
-			// Const Field (openTag)
-			io.WriteUint8(8, 0x2e)
-
-			// Simple Field (value)
-			var value BACnetTag = m.value
-			value.Serialize(io)
-
-			// Const Field (closingTag)
-			io.WriteUint8(8, 0x2f)
+
+	// Simple Field (typeOrTagNumber)
+	typeOrTagNumber := uint8(m.typeOrTagNumber)
+	io.WriteUint8(4, (typeOrTagNumber))
+
+	// Simple Field (contextSpecificTag)
+	contextSpecificTag := uint8(m.contextSpecificTag)
+	io.WriteUint8(1, (contextSpecificTag))
+
+	// Simple Field (lengthValueType)
+	lengthValueType := uint8(m.lengthValueType)
+	io.WriteUint8(3, (lengthValueType))
+
+	// Optional Field (extTagNumber) (Can be skipped, if the value is null)
+	var extTagNumber *uint8 = nil
+	if m.extTagNumber != nil {
+		extTagNumber = m.extTagNumber
+		io.WriteUint8(8, *(extTagNumber))
+	}
+
+	// Optional Field (extLength) (Can be skipped, if the value is null)
+	var extLength *uint8 = nil
+	if m.extLength != nil {
+		extLength = m.extLength
+		io.WriteUint8(8, *(extLength))
+	}
+
+	// Array Field (propertyIdentifier)
+	if m.propertyIdentifier != nil {
+		for _, _element := range m.propertyIdentifier {
+			io.WriteUint8(8, _element)
 		}
 	}
-	serializeFunc(m)
+
+	// Const Field (openTag)
+	io.WriteUint8(8, 0x2e)
+
+	// Simple Field (value)
+	value := BACnetTag(m.value)
+	value.Serialize(io)
+
+	// Const Field (closingTag)
+	io.WriteUint8(8, 0x2f)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
index a7a1966..67d59a8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequest.go
@@ -42,6 +42,26 @@ func BACnetUnconfirmedServiceRequestServiceChoice(m IBACnetUnconfirmedServiceReq
 	return m.ServiceChoice()
 }
 
+func CastIBACnetUnconfirmedServiceRequest(structType interface{}) IBACnetUnconfirmedServiceRequest {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequest {
+		if iBACnetUnconfirmedServiceRequest, ok := typ.(IBACnetUnconfirmedServiceRequest); ok {
+			return iBACnetUnconfirmedServiceRequest
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequest(structType interface{}) BACnetUnconfirmedServiceRequest {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequest {
+		if sBACnetUnconfirmedServiceRequest, ok := typ.(BACnetUnconfirmedServiceRequest); ok {
+			return sBACnetUnconfirmedServiceRequest
+		}
+		return BACnetUnconfirmedServiceRequest{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequest) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -100,16 +120,12 @@ func BACnetUnconfirmedServiceRequestParse(io spi.ReadBuffer, len uint16) (spi.Me
 }
 
 func (m BACnetUnconfirmedServiceRequest) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iBACnetUnconfirmedServiceRequest, ok := typ.(IBACnetUnconfirmedServiceRequest); ok {
+	iBACnetUnconfirmedServiceRequest := CastIBACnetUnconfirmedServiceRequest(m)
 
-			// Discriminator Field (serviceChoice) (Used as input to a switch field)
-			serviceChoice := BACnetUnconfirmedServiceRequestServiceChoice(iBACnetUnconfirmedServiceRequest)
-			io.WriteUint8(8, (serviceChoice))
+	// Discriminator Field (serviceChoice) (Used as input to a switch field)
+	serviceChoice := uint8(BACnetUnconfirmedServiceRequestServiceChoice(iBACnetUnconfirmedServiceRequest))
+	io.WriteUint8(8, (serviceChoice))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iBACnetUnconfirmedServiceRequest.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iBACnetUnconfirmedServiceRequest.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
index 10daff0..b737dd1 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIAm.go
@@ -60,6 +60,26 @@ func NewBACnetUnconfirmedServiceRequestIAm(objectType uint16, objectInstanceNumb
 	return &BACnetUnconfirmedServiceRequestIAm{objectType: objectType, objectInstanceNumber: objectInstanceNumber, maximumApduLengthAcceptedLength: maximumApduLengthAcceptedLength, maximumApduLengthAccepted: maximumApduLengthAccepted, segmentationSupported: segmentationSupported, vendorId: vendorId}
 }
 
+func CastIBACnetUnconfirmedServiceRequestIAm(structType interface{}) IBACnetUnconfirmedServiceRequestIAm {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestIAm {
+		if iBACnetUnconfirmedServiceRequestIAm, ok := typ.(IBACnetUnconfirmedServiceRequestIAm); ok {
+			return iBACnetUnconfirmedServiceRequestIAm
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestIAm(structType interface{}) BACnetUnconfirmedServiceRequestIAm {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestIAm {
+		if sBACnetUnconfirmedServiceRequestIAm, ok := typ.(BACnetUnconfirmedServiceRequestIAm); ok {
+			return sBACnetUnconfirmedServiceRequestIAm
+		}
+		return BACnetUnconfirmedServiceRequestIAm{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestIAm) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -159,48 +179,43 @@ func BACnetUnconfirmedServiceRequestIAmParse(io spi.ReadBuffer) (BACnetUnconfirm
 }
 
 func (m BACnetUnconfirmedServiceRequestIAm) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestIAm); ok {
 
-			// Const Field (objectIdentifierHeader)
-			io.WriteUint8(8, 0xC4)
+	// Const Field (objectIdentifierHeader)
+	io.WriteUint8(8, 0xC4)
 
-			// Simple Field (objectType)
-			var objectType uint16 = m.objectType
-			io.WriteUint16(10, (objectType))
+	// Simple Field (objectType)
+	objectType := uint16(m.objectType)
+	io.WriteUint16(10, (objectType))
 
-			// Simple Field (objectInstanceNumber)
-			var objectInstanceNumber uint32 = m.objectInstanceNumber
-			io.WriteUint32(22, (objectInstanceNumber))
+	// Simple Field (objectInstanceNumber)
+	objectInstanceNumber := uint32(m.objectInstanceNumber)
+	io.WriteUint32(22, (objectInstanceNumber))
 
-			// Const Field (maximumApduLengthAcceptedHeader)
-			io.WriteUint8(5, 0x04)
+	// Const Field (maximumApduLengthAcceptedHeader)
+	io.WriteUint8(5, 0x04)
 
-			// Simple Field (maximumApduLengthAcceptedLength)
-			var maximumApduLengthAcceptedLength uint8 = m.maximumApduLengthAcceptedLength
-			io.WriteUint8(3, (maximumApduLengthAcceptedLength))
+	// Simple Field (maximumApduLengthAcceptedLength)
+	maximumApduLengthAcceptedLength := uint8(m.maximumApduLengthAcceptedLength)
+	io.WriteUint8(3, (maximumApduLengthAcceptedLength))
 
-			// Array Field (maximumApduLengthAccepted)
-			if m.maximumApduLengthAccepted != nil {
-				for _, _element := range m.maximumApduLengthAccepted {
-					io.WriteInt8(8, _element)
-				}
-			}
+	// Array Field (maximumApduLengthAccepted)
+	if m.maximumApduLengthAccepted != nil {
+		for _, _element := range m.maximumApduLengthAccepted {
+			io.WriteInt8(8, _element)
+		}
+	}
 
-			// Const Field (segmentationSupportedHeader)
-			io.WriteUint8(8, 0x91)
+	// Const Field (segmentationSupportedHeader)
+	io.WriteUint8(8, 0x91)
 
-			// Simple Field (segmentationSupported)
-			var segmentationSupported uint8 = m.segmentationSupported
-			io.WriteUint8(8, (segmentationSupported))
+	// Simple Field (segmentationSupported)
+	segmentationSupported := uint8(m.segmentationSupported)
+	io.WriteUint8(8, (segmentationSupported))
 
-			// Const Field (vendorIdHeader)
-			io.WriteUint8(8, 0x21)
+	// Const Field (vendorIdHeader)
+	io.WriteUint8(8, 0x21)
 
-			// Simple Field (vendorId)
-			var vendorId uint8 = m.vendorId
-			io.WriteUint8(8, (vendorId))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (vendorId)
+	vendorId := uint8(m.vendorId)
+	io.WriteUint8(8, (vendorId))
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
index 06d0af7..c37825f 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestIHave.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestIHave() BACnetUnconfirmedServiceRequestIn
 	return &BACnetUnconfirmedServiceRequestIHave{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestIHave(structType interface{}) IBACnetUnconfirmedServiceRequestIHave {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestIHave {
+		if iBACnetUnconfirmedServiceRequestIHave, ok := typ.(IBACnetUnconfirmedServiceRequestIHave); ok {
+			return iBACnetUnconfirmedServiceRequestIHave
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestIHave(structType interface{}) BACnetUnconfirmedServiceRequestIHave {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestIHave {
+		if sBACnetUnconfirmedServiceRequestIHave, ok := typ.(BACnetUnconfirmedServiceRequestIHave); ok {
+			return sBACnetUnconfirmedServiceRequestIHave
+		}
+		return BACnetUnconfirmedServiceRequestIHave{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestIHave) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestIHaveParse(io spi.ReadBuffer) (BACnetUnconfi
 }
 
 func (m BACnetUnconfirmedServiceRequestIHave) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestIHave); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go
index b1c9790..894b283 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestTimeSynchronization.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestTimeSynchronization() BACnetUnconfirmedSe
 	return &BACnetUnconfirmedServiceRequestTimeSynchronization{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestTimeSynchronization(structType interface{}) IBACnetUnconfirmedServiceRequestTimeSynchronization {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestTimeSynchronization {
+		if iBACnetUnconfirmedServiceRequestTimeSynchronization, ok := typ.(IBACnetUnconfirmedServiceRequestTimeSynchronization); ok {
+			return iBACnetUnconfirmedServiceRequestTimeSynchronization
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestTimeSynchronization(structType interface{}) BACnetUnconfirmedServiceRequestTimeSynchronization {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestTimeSynchronization {
+		if sBACnetUnconfirmedServiceRequestTimeSynchronization, ok := typ.(BACnetUnconfirmedServiceRequestTimeSynchronization); ok {
+			return sBACnetUnconfirmedServiceRequestTimeSynchronization
+		}
+		return BACnetUnconfirmedServiceRequestTimeSynchronization{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestTimeSynchronization) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestTimeSynchronizationParse(io spi.ReadBuffer)
 }
 
 func (m BACnetUnconfirmedServiceRequestTimeSynchronization) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestTimeSynchronization); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go
index b682daf..9adf4b2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUTCTimeSynchronization.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestUTCTimeSynchronization() BACnetUnconfirme
 	return &BACnetUnconfirmedServiceRequestUTCTimeSynchronization{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestUTCTimeSynchronization(structType interface{}) IBACnetUnconfirmedServiceRequestUTCTimeSynchronization {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestUTCTimeSynchronization {
+		if iBACnetUnconfirmedServiceRequestUTCTimeSynchronization, ok := typ.(IBACnetUnconfirmedServiceRequestUTCTimeSynchronization); ok {
+			return iBACnetUnconfirmedServiceRequestUTCTimeSynchronization
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestUTCTimeSynchronization(structType interface{}) BACnetUnconfirmedServiceRequestUTCTimeSynchronization {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestUTCTimeSynchronization {
+		if sBACnetUnconfirmedServiceRequestUTCTimeSynchronization, ok := typ.(BACnetUnconfirmedServiceRequestUTCTimeSynchronization); ok {
+			return sBACnetUnconfirmedServiceRequestUTCTimeSynchronization
+		}
+		return BACnetUnconfirmedServiceRequestUTCTimeSynchronization{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestUTCTimeSynchronization) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestUTCTimeSynchronizationParse(io spi.ReadBuffe
 }
 
 func (m BACnetUnconfirmedServiceRequestUTCTimeSynchronization) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestUTCTimeSynchronization); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go
index a3f4a65..979a31e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification() BACnetUnconf
 	return &BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification(structType interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification {
+		if iBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification); ok {
+			return iBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification(structType interface{}) BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification {
+		if sBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification, ok := typ.(BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification); ok {
+			return sBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification
+		}
+		return BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationParse(io spi.ReadB
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedCOVNotification) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotification); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
index 625a516..2d7ff00 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple() BACn
 	return &BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple(structType interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple {
+		if iBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple); ok {
+			return iBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple(structType interface{}) BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple {
+		if sBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple, ok := typ.(BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple); ok {
+			return sBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple
+		}
+		return BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultipleParse(io s
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedCOVNotificationMultiple); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go
index 60821f4..70c3931 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedEventNotification.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestUnconfirmedEventNotification() BACnetUnco
 	return &BACnetUnconfirmedServiceRequestUnconfirmedEventNotification{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestUnconfirmedEventNotification(structType interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedEventNotification {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedEventNotification {
+		if iBACnetUnconfirmedServiceRequestUnconfirmedEventNotification, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedEventNotification); ok {
+			return iBACnetUnconfirmedServiceRequestUnconfirmedEventNotification
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestUnconfirmedEventNotification(structType interface{}) BACnetUnconfirmedServiceRequestUnconfirmedEventNotification {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestUnconfirmedEventNotification {
+		if sBACnetUnconfirmedServiceRequestUnconfirmedEventNotification, ok := typ.(BACnetUnconfirmedServiceRequestUnconfirmedEventNotification); ok {
+			return sBACnetUnconfirmedServiceRequestUnconfirmedEventNotification
+		}
+		return BACnetUnconfirmedServiceRequestUnconfirmedEventNotification{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestUnconfirmedEventNotification) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestUnconfirmedEventNotificationParse(io spi.Rea
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedEventNotification) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedEventNotification); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
index d68b624..1744ad2 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer.go
@@ -57,6 +57,26 @@ func NewBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer(vendorId uint8
 	return &BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer{vendorId: vendorId, serviceNumber: serviceNumber, values: values}
 }
 
+func CastIBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer(structType interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer {
+		if iBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer); ok {
+			return iBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer(structType interface{}) BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer {
+		if sBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer, ok := typ.(BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer); ok {
+			return sBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer
+		}
+		return BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -119,8 +139,8 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(io spi.ReadB
 	// Array field (values)
 	var values []int8
 	// Length array
-	_valuesLength := uint16((len) - (8))
-	_valuesEndPos := io.GetPos() + _valuesLength
+	_valuesLength := uint16(len) - uint16(uint16(8))
+	_valuesEndPos := io.GetPos() + uint16(_valuesLength)
 	for io.GetPos() < _valuesEndPos {
 		values = append(values, io.ReadInt8(8))
 	}
@@ -136,36 +156,31 @@ func BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransferParse(io spi.ReadB
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedPrivateTransfer); ok {
 
-			// Const Field (vendorIdHeader)
-			io.WriteUint8(8, 0x09)
-
-			// Simple Field (vendorId)
-			var vendorId uint8 = m.vendorId
-			io.WriteUint8(8, (vendorId))
+	// Const Field (vendorIdHeader)
+	io.WriteUint8(8, 0x09)
 
-			// Const Field (serviceNumberHeader)
-			io.WriteUint8(8, 0x1A)
+	// Simple Field (vendorId)
+	vendorId := uint8(m.vendorId)
+	io.WriteUint8(8, (vendorId))
 
-			// Simple Field (serviceNumber)
-			var serviceNumber uint16 = m.serviceNumber
-			io.WriteUint16(16, (serviceNumber))
+	// Const Field (serviceNumberHeader)
+	io.WriteUint8(8, 0x1A)
 
-			// Const Field (listOfValuesOpeningTag)
-			io.WriteUint8(8, 0x2E)
+	// Simple Field (serviceNumber)
+	serviceNumber := uint16(m.serviceNumber)
+	io.WriteUint16(16, (serviceNumber))
 
-			// Array Field (values)
-			if m.values != nil {
-				for _, _element := range m.values {
-					io.WriteInt8(8, _element)
-				}
-			}
+	// Const Field (listOfValuesOpeningTag)
+	io.WriteUint8(8, 0x2E)
 
-			// Const Field (listOfValuesClosingTag)
-			io.WriteUint8(8, 0x2F)
+	// Array Field (values)
+	if m.values != nil {
+		for _, _element := range m.values {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
+
+	// Const Field (listOfValuesClosingTag)
+	io.WriteUint8(8, 0x2F)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
index eef44de..27cf682 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestUnconfirmedTextMessage.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestUnconfirmedTextMessage() BACnetUnconfirme
 	return &BACnetUnconfirmedServiceRequestUnconfirmedTextMessage{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestUnconfirmedTextMessage(structType interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedTextMessage {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestUnconfirmedTextMessage {
+		if iBACnetUnconfirmedServiceRequestUnconfirmedTextMessage, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedTextMessage); ok {
+			return iBACnetUnconfirmedServiceRequestUnconfirmedTextMessage
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestUnconfirmedTextMessage(structType interface{}) BACnetUnconfirmedServiceRequestUnconfirmedTextMessage {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestUnconfirmedTextMessage {
+		if sBACnetUnconfirmedServiceRequestUnconfirmedTextMessage, ok := typ.(BACnetUnconfirmedServiceRequestUnconfirmedTextMessage); ok {
+			return sBACnetUnconfirmedServiceRequestUnconfirmedTextMessage
+		}
+		return BACnetUnconfirmedServiceRequestUnconfirmedTextMessage{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestUnconfirmedTextMessage) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestUnconfirmedTextMessageParse(io spi.ReadBuffe
 }
 
 func (m BACnetUnconfirmedServiceRequestUnconfirmedTextMessage) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestUnconfirmedTextMessage); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
index 4c5e58a..78beea7 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoHas.go
@@ -57,6 +57,26 @@ func NewBACnetUnconfirmedServiceRequestWhoHas(deviceInstanceLowLimit uint32, dev
 	return &BACnetUnconfirmedServiceRequestWhoHas{deviceInstanceLowLimit: deviceInstanceLowLimit, deviceInstanceHighLimit: deviceInstanceHighLimit, objectNameCharacterSet: objectNameCharacterSet, objectName: objectName}
 }
 
+func CastIBACnetUnconfirmedServiceRequestWhoHas(structType interface{}) IBACnetUnconfirmedServiceRequestWhoHas {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestWhoHas {
+		if iBACnetUnconfirmedServiceRequestWhoHas, ok := typ.(IBACnetUnconfirmedServiceRequestWhoHas); ok {
+			return iBACnetUnconfirmedServiceRequestWhoHas
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestWhoHas(structType interface{}) BACnetUnconfirmedServiceRequestWhoHas {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestWhoHas {
+		if sBACnetUnconfirmedServiceRequestWhoHas, ok := typ.(BACnetUnconfirmedServiceRequestWhoHas); ok {
+			return sBACnetUnconfirmedServiceRequestWhoHas
+		}
+		return BACnetUnconfirmedServiceRequestWhoHas{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestWhoHas) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -128,8 +148,8 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(io spi.ReadBuffer) (BACnetUnconf
 	// Array field (objectName)
 	var objectName []int8
 	// Length array
-	_objectNameLength := uint16((objectNameLength) - (1))
-	_objectNameEndPos := io.GetPos() + _objectNameLength
+	_objectNameLength := uint16(objectNameLength) - uint16(uint16(1))
+	_objectNameEndPos := io.GetPos() + uint16(_objectNameLength)
 	for io.GetPos() < _objectNameEndPos {
 		objectName = append(objectName, io.ReadInt8(8))
 	}
@@ -139,41 +159,36 @@ func BACnetUnconfirmedServiceRequestWhoHasParse(io spi.ReadBuffer) (BACnetUnconf
 }
 
 func (m BACnetUnconfirmedServiceRequestWhoHas) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestWhoHas); ok {
 
-			// Const Field (deviceInstanceLowLimitHeader)
-			io.WriteUint8(8, 0x0B)
+	// Const Field (deviceInstanceLowLimitHeader)
+	io.WriteUint8(8, 0x0B)
 
-			// Simple Field (deviceInstanceLowLimit)
-			var deviceInstanceLowLimit uint32 = m.deviceInstanceLowLimit
-			io.WriteUint32(24, (deviceInstanceLowLimit))
+	// Simple Field (deviceInstanceLowLimit)
+	deviceInstanceLowLimit := uint32(m.deviceInstanceLowLimit)
+	io.WriteUint32(24, (deviceInstanceLowLimit))
 
-			// Const Field (deviceInstanceHighLimitHeader)
-			io.WriteUint8(8, 0x1B)
+	// Const Field (deviceInstanceHighLimitHeader)
+	io.WriteUint8(8, 0x1B)
 
-			// Simple Field (deviceInstanceHighLimit)
-			var deviceInstanceHighLimit uint32 = m.deviceInstanceHighLimit
-			io.WriteUint32(24, (deviceInstanceHighLimit))
+	// Simple Field (deviceInstanceHighLimit)
+	deviceInstanceHighLimit := uint32(m.deviceInstanceHighLimit)
+	io.WriteUint32(24, (deviceInstanceHighLimit))
 
-			// Const Field (objectNameHeader)
-			io.WriteUint8(8, 0x3D)
+	// Const Field (objectNameHeader)
+	io.WriteUint8(8, 0x3D)
 
-			// Implicit Field (objectNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-			objectNameLength := uint8((uint8(len(m.objectName))) + (1))
-			io.WriteUint8(8, (objectNameLength))
+	// Implicit Field (objectNameLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	objectNameLength := uint8(uint8(uint8(len(m.objectName))) + uint8(uint8(1)))
+	io.WriteUint8(8, (objectNameLength))
 
-			// Simple Field (objectNameCharacterSet)
-			var objectNameCharacterSet uint8 = m.objectNameCharacterSet
-			io.WriteUint8(8, (objectNameCharacterSet))
+	// Simple Field (objectNameCharacterSet)
+	objectNameCharacterSet := uint8(m.objectNameCharacterSet)
+	io.WriteUint8(8, (objectNameCharacterSet))
 
-			// Array Field (objectName)
-			if m.objectName != nil {
-				for _, _element := range m.objectName {
-					io.WriteInt8(8, _element)
-				}
-			}
+	// Array Field (objectName)
+	if m.objectName != nil {
+		for _, _element := range m.objectName {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
index 6c984a1..add1d7e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWhoIs.go
@@ -56,6 +56,26 @@ func NewBACnetUnconfirmedServiceRequestWhoIs(deviceInstanceRangeLowLimitLength u
 	return &BACnetUnconfirmedServiceRequestWhoIs{deviceInstanceRangeLowLimitLength: deviceInstanceRangeLowLimitLength, deviceInstanceRangeLowLimit: deviceInstanceRangeLowLimit, deviceInstanceRangeHighLimitLength: deviceInstanceRangeHighLimitLength, deviceInstanceRangeHighLimit: deviceInstanceRangeHighLimit}
 }
 
+func CastIBACnetUnconfirmedServiceRequestWhoIs(structType interface{}) IBACnetUnconfirmedServiceRequestWhoIs {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestWhoIs {
+		if iBACnetUnconfirmedServiceRequestWhoIs, ok := typ.(IBACnetUnconfirmedServiceRequestWhoIs); ok {
+			return iBACnetUnconfirmedServiceRequestWhoIs
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestWhoIs(structType interface{}) BACnetUnconfirmedServiceRequestWhoIs {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestWhoIs {
+		if sBACnetUnconfirmedServiceRequestWhoIs, ok := typ.(BACnetUnconfirmedServiceRequestWhoIs); ok {
+			return sBACnetUnconfirmedServiceRequestWhoIs
+		}
+		return BACnetUnconfirmedServiceRequestWhoIs{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestWhoIs) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -135,37 +155,32 @@ func BACnetUnconfirmedServiceRequestWhoIsParse(io spi.ReadBuffer) (BACnetUnconfi
 }
 
 func (m BACnetUnconfirmedServiceRequestWhoIs) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestWhoIs); ok {
-
-			// Const Field (deviceInstanceRangeLowLimitHeader)
-			io.WriteUint8(5, 0x01)
-
-			// Simple Field (deviceInstanceRangeLowLimitLength)
-			var deviceInstanceRangeLowLimitLength uint8 = m.deviceInstanceRangeLowLimitLength
-			io.WriteUint8(3, (deviceInstanceRangeLowLimitLength))
-
-			// Array Field (deviceInstanceRangeLowLimit)
-			if m.deviceInstanceRangeLowLimit != nil {
-				for _, _element := range m.deviceInstanceRangeLowLimit {
-					io.WriteInt8(8, _element)
-				}
-			}
-
-			// Const Field (deviceInstanceRangeHighLimitHeader)
-			io.WriteUint8(5, 0x03)
-
-			// Simple Field (deviceInstanceRangeHighLimitLength)
-			var deviceInstanceRangeHighLimitLength uint8 = m.deviceInstanceRangeHighLimitLength
-			io.WriteUint8(3, (deviceInstanceRangeHighLimitLength))
-
-			// Array Field (deviceInstanceRangeHighLimit)
-			if m.deviceInstanceRangeHighLimit != nil {
-				for _, _element := range m.deviceInstanceRangeHighLimit {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Const Field (deviceInstanceRangeLowLimitHeader)
+	io.WriteUint8(5, 0x01)
+
+	// Simple Field (deviceInstanceRangeLowLimitLength)
+	deviceInstanceRangeLowLimitLength := uint8(m.deviceInstanceRangeLowLimitLength)
+	io.WriteUint8(3, (deviceInstanceRangeLowLimitLength))
+
+	// Array Field (deviceInstanceRangeLowLimit)
+	if m.deviceInstanceRangeLowLimit != nil {
+		for _, _element := range m.deviceInstanceRangeLowLimit {
+			io.WriteInt8(8, _element)
+		}
+	}
+
+	// Const Field (deviceInstanceRangeHighLimitHeader)
+	io.WriteUint8(5, 0x03)
+
+	// Simple Field (deviceInstanceRangeHighLimitLength)
+	deviceInstanceRangeHighLimitLength := uint8(m.deviceInstanceRangeHighLimitLength)
+	io.WriteUint8(3, (deviceInstanceRangeHighLimitLength))
+
+	// Array Field (deviceInstanceRangeHighLimit)
+	if m.deviceInstanceRangeHighLimit != nil {
+		for _, _element := range m.deviceInstanceRangeHighLimit {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
index 6053121..700f7aa 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BACnetUnconfirmedServiceRequestWriteGroup.go
@@ -46,6 +46,26 @@ func NewBACnetUnconfirmedServiceRequestWriteGroup() BACnetUnconfirmedServiceRequ
 	return &BACnetUnconfirmedServiceRequestWriteGroup{}
 }
 
+func CastIBACnetUnconfirmedServiceRequestWriteGroup(structType interface{}) IBACnetUnconfirmedServiceRequestWriteGroup {
+	castFunc := func(typ interface{}) IBACnetUnconfirmedServiceRequestWriteGroup {
+		if iBACnetUnconfirmedServiceRequestWriteGroup, ok := typ.(IBACnetUnconfirmedServiceRequestWriteGroup); ok {
+			return iBACnetUnconfirmedServiceRequestWriteGroup
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBACnetUnconfirmedServiceRequestWriteGroup(structType interface{}) BACnetUnconfirmedServiceRequestWriteGroup {
+	castFunc := func(typ interface{}) BACnetUnconfirmedServiceRequestWriteGroup {
+		if sBACnetUnconfirmedServiceRequestWriteGroup, ok := typ.(BACnetUnconfirmedServiceRequestWriteGroup); ok {
+			return sBACnetUnconfirmedServiceRequestWriteGroup
+		}
+		return BACnetUnconfirmedServiceRequestWriteGroup{}
+	}
+	return castFunc(structType)
+}
+
 func (m BACnetUnconfirmedServiceRequestWriteGroup) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BACnetUnconfirmedServiceRequest.LengthInBits()
 
@@ -63,9 +83,5 @@ func BACnetUnconfirmedServiceRequestWriteGroupParse(io spi.ReadBuffer) (BACnetUn
 }
 
 func (m BACnetUnconfirmedServiceRequestWriteGroup) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBACnetUnconfirmedServiceRequestWriteGroup); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
index 46dbd5b..6921201 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLC.go
@@ -46,6 +46,26 @@ func BVLCBvlcFunction(m IBVLC) uint8 {
 	return m.BvlcFunction()
 }
 
+func CastIBVLC(structType interface{}) IBVLC {
+	castFunc := func(typ interface{}) IBVLC {
+		if iBVLC, ok := typ.(IBVLC); ok {
+			return iBVLC
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLC(structType interface{}) BVLC {
+	castFunc := func(typ interface{}) BVLC {
+		if sBVLC, ok := typ.(BVLC); ok {
+			return sBVLC
+		}
+		return BVLC{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLC) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -121,23 +141,19 @@ func BVLCParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m BVLC) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iBVLC, ok := typ.(IBVLC); ok {
+	iBVLC := CastIBVLC(m)
 
-			// Const Field (bacnetType)
-			io.WriteUint8(8, 0x81)
+	// Const Field (bacnetType)
+	io.WriteUint8(8, 0x81)
 
-			// Discriminator Field (bvlcFunction) (Used as input to a switch field)
-			bvlcFunction := BVLCBvlcFunction(iBVLC)
-			io.WriteUint8(8, (bvlcFunction))
+	// Discriminator Field (bvlcFunction) (Used as input to a switch field)
+	bvlcFunction := uint8(BVLCBvlcFunction(iBVLC))
+	io.WriteUint8(8, (bvlcFunction))
 
-			// Implicit Field (bvlcLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-			bvlcLength := uint16(m.LengthInBytes())
-			io.WriteUint16(16, (bvlcLength))
+	// Implicit Field (bvlcLength) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
+	bvlcLength := uint16(uint16(m.LengthInBytes()))
+	io.WriteUint16(16, (bvlcLength))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iBVLC.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iBVLC.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go
index bfd7ad9..8f1aeb8 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDeleteForeignDeviceTableEntry.go
@@ -46,6 +46,26 @@ func NewBVLCDeleteForeignDeviceTableEntry() BVLCInitializer {
 	return &BVLCDeleteForeignDeviceTableEntry{}
 }
 
+func CastIBVLCDeleteForeignDeviceTableEntry(structType interface{}) IBVLCDeleteForeignDeviceTableEntry {
+	castFunc := func(typ interface{}) IBVLCDeleteForeignDeviceTableEntry {
+		if iBVLCDeleteForeignDeviceTableEntry, ok := typ.(IBVLCDeleteForeignDeviceTableEntry); ok {
+			return iBVLCDeleteForeignDeviceTableEntry
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCDeleteForeignDeviceTableEntry(structType interface{}) BVLCDeleteForeignDeviceTableEntry {
+	castFunc := func(typ interface{}) BVLCDeleteForeignDeviceTableEntry {
+		if sBVLCDeleteForeignDeviceTableEntry, ok := typ.(BVLCDeleteForeignDeviceTableEntry); ok {
+			return sBVLCDeleteForeignDeviceTableEntry
+		}
+		return BVLCDeleteForeignDeviceTableEntry{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCDeleteForeignDeviceTableEntry) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCDeleteForeignDeviceTableEntryParse(io spi.ReadBuffer) (BVLCInitializer,
 }
 
 func (m BVLCDeleteForeignDeviceTableEntry) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCDeleteForeignDeviceTableEntry); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go
index d920ef8..c8a97d9 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCDistributeBroadcastToNetwork.go
@@ -46,6 +46,26 @@ func NewBVLCDistributeBroadcastToNetwork() BVLCInitializer {
 	return &BVLCDistributeBroadcastToNetwork{}
 }
 
+func CastIBVLCDistributeBroadcastToNetwork(structType interface{}) IBVLCDistributeBroadcastToNetwork {
+	castFunc := func(typ interface{}) IBVLCDistributeBroadcastToNetwork {
+		if iBVLCDistributeBroadcastToNetwork, ok := typ.(IBVLCDistributeBroadcastToNetwork); ok {
+			return iBVLCDistributeBroadcastToNetwork
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCDistributeBroadcastToNetwork(structType interface{}) BVLCDistributeBroadcastToNetwork {
+	castFunc := func(typ interface{}) BVLCDistributeBroadcastToNetwork {
+		if sBVLCDistributeBroadcastToNetwork, ok := typ.(BVLCDistributeBroadcastToNetwork); ok {
+			return sBVLCDistributeBroadcastToNetwork
+		}
+		return BVLCDistributeBroadcastToNetwork{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCDistributeBroadcastToNetwork) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCDistributeBroadcastToNetworkParse(io spi.ReadBuffer) (BVLCInitializer,
 }
 
 func (m BVLCDistributeBroadcastToNetwork) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCDistributeBroadcastToNetwork); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
index 809911e..416b8ec 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCForwardedNPDU.go
@@ -51,6 +51,26 @@ func NewBVLCForwardedNPDU(ip []uint8, port uint16, npdu NPDU) BVLCInitializer {
 	return &BVLCForwardedNPDU{ip: ip, port: port, npdu: npdu}
 }
 
+func CastIBVLCForwardedNPDU(structType interface{}) IBVLCForwardedNPDU {
+	castFunc := func(typ interface{}) IBVLCForwardedNPDU {
+		if iBVLCForwardedNPDU, ok := typ.(IBVLCForwardedNPDU); ok {
+			return iBVLCForwardedNPDU
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCForwardedNPDU(structType interface{}) BVLCForwardedNPDU {
+	castFunc := func(typ interface{}) BVLCForwardedNPDU {
+		if sBVLCForwardedNPDU, ok := typ.(BVLCForwardedNPDU); ok {
+			return sBVLCForwardedNPDU
+		}
+		return BVLCForwardedNPDU{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCForwardedNPDU) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -78,8 +98,8 @@ func BVLCForwardedNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCInitializ
 	var ip []uint8
 	// Count array
 	{
-		ip := make([]uint8, 4)
-		for curItem := uint16(0); curItem < uint16(4); curItem++ {
+		ip := make([]uint8, uint16(4))
+		for curItem := uint16(0); curItem < uint16(uint16(4)); curItem++ {
 
 			ip = append(ip, io.ReadUint8(8))
 		}
@@ -89,7 +109,7 @@ func BVLCForwardedNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCInitializ
 	var port uint16 = io.ReadUint16(16)
 
 	// Simple Field (npdu)
-	_npduMessage, _err := NPDUParse(io, uint16((bvlcLength)-(10)))
+	_npduMessage, _err := NPDUParse(io, uint16(bvlcLength)-uint16(uint16(10)))
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'npdu'. " + _err.Error())
 	}
@@ -104,24 +124,19 @@ func BVLCForwardedNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCInitializ
 }
 
 func (m BVLCForwardedNPDU) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCForwardedNPDU); ok {
-
-			// Array Field (ip)
-			if m.ip != nil {
-				for _, _element := range m.ip {
-					io.WriteUint8(8, _element)
-				}
-			}
-
-			// Simple Field (port)
-			var port uint16 = m.port
-			io.WriteUint16(16, (port))
-
-			// Simple Field (npdu)
-			var npdu NPDU = m.npdu
-			npdu.Serialize(io)
+
+	// Array Field (ip)
+	if m.ip != nil {
+		for _, _element := range m.ip {
+			io.WriteUint8(8, _element)
 		}
 	}
-	serializeFunc(m)
+
+	// Simple Field (port)
+	port := uint16(m.port)
+	io.WriteUint16(16, (port))
+
+	// Simple Field (npdu)
+	npdu := NPDU(m.npdu)
+	npdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
index c4d2a22..5897142 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalBroadcastNPDU.go
@@ -49,6 +49,26 @@ func NewBVLCOriginalBroadcastNPDU(npdu NPDU) BVLCInitializer {
 	return &BVLCOriginalBroadcastNPDU{npdu: npdu}
 }
 
+func CastIBVLCOriginalBroadcastNPDU(structType interface{}) IBVLCOriginalBroadcastNPDU {
+	castFunc := func(typ interface{}) IBVLCOriginalBroadcastNPDU {
+		if iBVLCOriginalBroadcastNPDU, ok := typ.(IBVLCOriginalBroadcastNPDU); ok {
+			return iBVLCOriginalBroadcastNPDU
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCOriginalBroadcastNPDU(structType interface{}) BVLCOriginalBroadcastNPDU {
+	castFunc := func(typ interface{}) BVLCOriginalBroadcastNPDU {
+		if sBVLCOriginalBroadcastNPDU, ok := typ.(BVLCOriginalBroadcastNPDU); ok {
+			return sBVLCOriginalBroadcastNPDU
+		}
+		return BVLCOriginalBroadcastNPDU{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCOriginalBroadcastNPDU) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -65,7 +85,7 @@ func (m BVLCOriginalBroadcastNPDU) LengthInBytes() uint16 {
 func BVLCOriginalBroadcastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCInitializer, error) {
 
 	// Simple Field (npdu)
-	_npduMessage, _err := NPDUParse(io, uint16((bvlcLength)-(4)))
+	_npduMessage, _err := NPDUParse(io, uint16(bvlcLength)-uint16(uint16(4)))
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'npdu'. " + _err.Error())
 	}
@@ -80,13 +100,8 @@ func BVLCOriginalBroadcastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCI
 }
 
 func (m BVLCOriginalBroadcastNPDU) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCOriginalBroadcastNPDU); ok {
 
-			// Simple Field (npdu)
-			var npdu NPDU = m.npdu
-			npdu.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (npdu)
+	npdu := NPDU(m.npdu)
+	npdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
index 3bcfaef..5020c94 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCOriginalUnicastNPDU.go
@@ -49,6 +49,26 @@ func NewBVLCOriginalUnicastNPDU(npdu NPDU) BVLCInitializer {
 	return &BVLCOriginalUnicastNPDU{npdu: npdu}
 }
 
+func CastIBVLCOriginalUnicastNPDU(structType interface{}) IBVLCOriginalUnicastNPDU {
+	castFunc := func(typ interface{}) IBVLCOriginalUnicastNPDU {
+		if iBVLCOriginalUnicastNPDU, ok := typ.(IBVLCOriginalUnicastNPDU); ok {
+			return iBVLCOriginalUnicastNPDU
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCOriginalUnicastNPDU(structType interface{}) BVLCOriginalUnicastNPDU {
+	castFunc := func(typ interface{}) BVLCOriginalUnicastNPDU {
+		if sBVLCOriginalUnicastNPDU, ok := typ.(BVLCOriginalUnicastNPDU); ok {
+			return sBVLCOriginalUnicastNPDU
+		}
+		return BVLCOriginalUnicastNPDU{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCOriginalUnicastNPDU) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -65,7 +85,7 @@ func (m BVLCOriginalUnicastNPDU) LengthInBytes() uint16 {
 func BVLCOriginalUnicastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCInitializer, error) {
 
 	// Simple Field (npdu)
-	_npduMessage, _err := NPDUParse(io, uint16((bvlcLength)-(4)))
+	_npduMessage, _err := NPDUParse(io, uint16(bvlcLength)-uint16(uint16(4)))
 	if _err != nil {
 		return nil, errors.New("Error parsing simple field 'npdu'. " + _err.Error())
 	}
@@ -80,13 +100,8 @@ func BVLCOriginalUnicastNPDUParse(io spi.ReadBuffer, bvlcLength uint16) (BVLCIni
 }
 
 func (m BVLCOriginalUnicastNPDU) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCOriginalUnicastNPDU); ok {
 
-			// Simple Field (npdu)
-			var npdu NPDU = m.npdu
-			npdu.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (npdu)
+	npdu := NPDU(m.npdu)
+	npdu.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go
index e344000..f7cf6a4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTable.go
@@ -46,6 +46,26 @@ func NewBVLCReadBroadcastDistributionTable() BVLCInitializer {
 	return &BVLCReadBroadcastDistributionTable{}
 }
 
+func CastIBVLCReadBroadcastDistributionTable(structType interface{}) IBVLCReadBroadcastDistributionTable {
+	castFunc := func(typ interface{}) IBVLCReadBroadcastDistributionTable {
+		if iBVLCReadBroadcastDistributionTable, ok := typ.(IBVLCReadBroadcastDistributionTable); ok {
+			return iBVLCReadBroadcastDistributionTable
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCReadBroadcastDistributionTable(structType interface{}) BVLCReadBroadcastDistributionTable {
+	castFunc := func(typ interface{}) BVLCReadBroadcastDistributionTable {
+		if sBVLCReadBroadcastDistributionTable, ok := typ.(BVLCReadBroadcastDistributionTable); ok {
+			return sBVLCReadBroadcastDistributionTable
+		}
+		return BVLCReadBroadcastDistributionTable{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCReadBroadcastDistributionTable) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCReadBroadcastDistributionTableParse(io spi.ReadBuffer) (BVLCInitializer
 }
 
 func (m BVLCReadBroadcastDistributionTable) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCReadBroadcastDistributionTable); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go
index 5bbaff8..285fa2a 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadBroadcastDistributionTableAck.go
@@ -46,6 +46,26 @@ func NewBVLCReadBroadcastDistributionTableAck() BVLCInitializer {
 	return &BVLCReadBroadcastDistributionTableAck{}
 }
 
+func CastIBVLCReadBroadcastDistributionTableAck(structType interface{}) IBVLCReadBroadcastDistributionTableAck {
+	castFunc := func(typ interface{}) IBVLCReadBroadcastDistributionTableAck {
+		if iBVLCReadBroadcastDistributionTableAck, ok := typ.(IBVLCReadBroadcastDistributionTableAck); ok {
+			return iBVLCReadBroadcastDistributionTableAck
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCReadBroadcastDistributionTableAck(structType interface{}) BVLCReadBroadcastDistributionTableAck {
+	castFunc := func(typ interface{}) BVLCReadBroadcastDistributionTableAck {
+		if sBVLCReadBroadcastDistributionTableAck, ok := typ.(BVLCReadBroadcastDistributionTableAck); ok {
+			return sBVLCReadBroadcastDistributionTableAck
+		}
+		return BVLCReadBroadcastDistributionTableAck{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCReadBroadcastDistributionTableAck) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCReadBroadcastDistributionTableAckParse(io spi.ReadBuffer) (BVLCInitiali
 }
 
 func (m BVLCReadBroadcastDistributionTableAck) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCReadBroadcastDistributionTableAck); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go
index 029c2a9..58d1389 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTable.go
@@ -46,6 +46,26 @@ func NewBVLCReadForeignDeviceTable() BVLCInitializer {
 	return &BVLCReadForeignDeviceTable{}
 }
 
+func CastIBVLCReadForeignDeviceTable(structType interface{}) IBVLCReadForeignDeviceTable {
+	castFunc := func(typ interface{}) IBVLCReadForeignDeviceTable {
+		if iBVLCReadForeignDeviceTable, ok := typ.(IBVLCReadForeignDeviceTable); ok {
+			return iBVLCReadForeignDeviceTable
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCReadForeignDeviceTable(structType interface{}) BVLCReadForeignDeviceTable {
+	castFunc := func(typ interface{}) BVLCReadForeignDeviceTable {
+		if sBVLCReadForeignDeviceTable, ok := typ.(BVLCReadForeignDeviceTable); ok {
+			return sBVLCReadForeignDeviceTable
+		}
+		return BVLCReadForeignDeviceTable{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCReadForeignDeviceTable) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCReadForeignDeviceTableParse(io spi.ReadBuffer) (BVLCInitializer, error)
 }
 
 func (m BVLCReadForeignDeviceTable) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCReadForeignDeviceTable); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go
index 97b72c4..ccd4b18 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCReadForeignDeviceTableAck.go
@@ -46,6 +46,26 @@ func NewBVLCReadForeignDeviceTableAck() BVLCInitializer {
 	return &BVLCReadForeignDeviceTableAck{}
 }
 
+func CastIBVLCReadForeignDeviceTableAck(structType interface{}) IBVLCReadForeignDeviceTableAck {
+	castFunc := func(typ interface{}) IBVLCReadForeignDeviceTableAck {
+		if iBVLCReadForeignDeviceTableAck, ok := typ.(IBVLCReadForeignDeviceTableAck); ok {
+			return iBVLCReadForeignDeviceTableAck
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCReadForeignDeviceTableAck(structType interface{}) BVLCReadForeignDeviceTableAck {
+	castFunc := func(typ interface{}) BVLCReadForeignDeviceTableAck {
+		if sBVLCReadForeignDeviceTableAck, ok := typ.(BVLCReadForeignDeviceTableAck); ok {
+			return sBVLCReadForeignDeviceTableAck
+		}
+		return BVLCReadForeignDeviceTableAck{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCReadForeignDeviceTableAck) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCReadForeignDeviceTableAckParse(io spi.ReadBuffer) (BVLCInitializer, err
 }
 
 func (m BVLCReadForeignDeviceTableAck) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCReadForeignDeviceTableAck); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go
index 2cbf40c..c5a0f40 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCRegisterForeignDevice.go
@@ -46,6 +46,26 @@ func NewBVLCRegisterForeignDevice() BVLCInitializer {
 	return &BVLCRegisterForeignDevice{}
 }
 
+func CastIBVLCRegisterForeignDevice(structType interface{}) IBVLCRegisterForeignDevice {
+	castFunc := func(typ interface{}) IBVLCRegisterForeignDevice {
+		if iBVLCRegisterForeignDevice, ok := typ.(IBVLCRegisterForeignDevice); ok {
+			return iBVLCRegisterForeignDevice
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCRegisterForeignDevice(structType interface{}) BVLCRegisterForeignDevice {
+	castFunc := func(typ interface{}) BVLCRegisterForeignDevice {
+		if sBVLCRegisterForeignDevice, ok := typ.(BVLCRegisterForeignDevice); ok {
+			return sBVLCRegisterForeignDevice
+		}
+		return BVLCRegisterForeignDevice{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCRegisterForeignDevice) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCRegisterForeignDeviceParse(io spi.ReadBuffer) (BVLCInitializer, error)
 }
 
 func (m BVLCRegisterForeignDevice) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCRegisterForeignDevice); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go
index c59238e..23841a4 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCResult.go
@@ -46,6 +46,26 @@ func NewBVLCResult() BVLCInitializer {
 	return &BVLCResult{}
 }
 
+func CastIBVLCResult(structType interface{}) IBVLCResult {
+	castFunc := func(typ interface{}) IBVLCResult {
+		if iBVLCResult, ok := typ.(IBVLCResult); ok {
+			return iBVLCResult
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCResult(structType interface{}) BVLCResult {
+	castFunc := func(typ interface{}) BVLCResult {
+		if sBVLCResult, ok := typ.(BVLCResult); ok {
+			return sBVLCResult
+		}
+		return BVLCResult{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCResult) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCResultParse(io spi.ReadBuffer) (BVLCInitializer, error) {
 }
 
 func (m BVLCResult) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCResult); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go
index 5c05d81..179f336 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCSecureBVLL.go
@@ -46,6 +46,26 @@ func NewBVLCSecureBVLL() BVLCInitializer {
 	return &BVLCSecureBVLL{}
 }
 
+func CastIBVLCSecureBVLL(structType interface{}) IBVLCSecureBVLL {
+	castFunc := func(typ interface{}) IBVLCSecureBVLL {
+		if iBVLCSecureBVLL, ok := typ.(IBVLCSecureBVLL); ok {
+			return iBVLCSecureBVLL
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCSecureBVLL(structType interface{}) BVLCSecureBVLL {
+	castFunc := func(typ interface{}) BVLCSecureBVLL {
+		if sBVLCSecureBVLL, ok := typ.(BVLCSecureBVLL); ok {
+			return sBVLCSecureBVLL
+		}
+		return BVLCSecureBVLL{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCSecureBVLL) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCSecureBVLLParse(io spi.ReadBuffer) (BVLCInitializer, error) {
 }
 
 func (m BVLCSecureBVLL) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCSecureBVLL); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go
index 49b35e9..69f385e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/BVLCWideBroadcastDistributionTable.go
@@ -46,6 +46,26 @@ func NewBVLCWideBroadcastDistributionTable() BVLCInitializer {
 	return &BVLCWideBroadcastDistributionTable{}
 }
 
+func CastIBVLCWideBroadcastDistributionTable(structType interface{}) IBVLCWideBroadcastDistributionTable {
+	castFunc := func(typ interface{}) IBVLCWideBroadcastDistributionTable {
+		if iBVLCWideBroadcastDistributionTable, ok := typ.(IBVLCWideBroadcastDistributionTable); ok {
+			return iBVLCWideBroadcastDistributionTable
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastBVLCWideBroadcastDistributionTable(structType interface{}) BVLCWideBroadcastDistributionTable {
+	castFunc := func(typ interface{}) BVLCWideBroadcastDistributionTable {
+		if sBVLCWideBroadcastDistributionTable, ok := typ.(BVLCWideBroadcastDistributionTable); ok {
+			return sBVLCWideBroadcastDistributionTable
+		}
+		return BVLCWideBroadcastDistributionTable{}
+	}
+	return castFunc(structType)
+}
+
 func (m BVLCWideBroadcastDistributionTable) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.BVLC.LengthInBits()
 
@@ -63,9 +83,5 @@ func BVLCWideBroadcastDistributionTableParse(io spi.ReadBuffer) (BVLCInitializer
 }
 
 func (m BVLCWideBroadcastDistributionTable) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(IBVLCWideBroadcastDistributionTable); ok {
-		}
-	}
-	serializeFunc(m)
+
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
index c31e1b2..8721b08 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLM.go
@@ -43,6 +43,26 @@ func NLMMessageType(m INLM) uint8 {
 	return m.MessageType()
 }
 
+func CastINLM(structType interface{}) INLM {
+	castFunc := func(typ interface{}) INLM {
+		if iNLM, ok := typ.(INLM); ok {
+			return iNLM
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastNLM(structType interface{}) NLM {
+	castFunc := func(typ interface{}) NLM {
+		if sNLM, ok := typ.(NLM); ok {
+			return sNLM
+		}
+		return NLM{}
+	}
+	return castFunc(structType)
+}
+
 func (m NLM) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -70,7 +90,7 @@ func NLMParse(io spi.ReadBuffer, apduLength uint16) (spi.Message, error) {
 
 	// Optional Field (vendorId) (Can be skipped, if a given expression evaluates to false)
 	var vendorId *uint16 = nil
-	if ((messageType) >= (128)) && ((messageType) <= (255)) {
+	if bool(bool(bool((messageType) >= (128)))) && bool(bool(bool((messageType) <= (255)))) {
 		_val := io.ReadUint16(16)
 		vendorId = &_val
 	}
@@ -93,23 +113,19 @@ func NLMParse(io spi.ReadBuffer, apduLength uint16) (spi.Message, error) {
 }
 
 func (m NLM) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iNLM, ok := typ.(INLM); ok {
+	iNLM := CastINLM(m)
 
-			// Discriminator Field (messageType) (Used as input to a switch field)
-			messageType := NLMMessageType(iNLM)
-			io.WriteUint8(8, (messageType))
-
-			// Optional Field (vendorId) (Can be skipped, if the value is null)
-			var vendorId *uint16 = nil
-			if m.vendorId != nil {
-				vendorId = m.vendorId
-				io.WriteUint16(16, *(vendorId))
-			}
+	// Discriminator Field (messageType) (Used as input to a switch field)
+	messageType := uint8(NLMMessageType(iNLM))
+	io.WriteUint8(8, (messageType))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iNLM.Serialize(io)
-		}
+	// Optional Field (vendorId) (Can be skipped, if the value is null)
+	var vendorId *uint16 = nil
+	if m.vendorId != nil {
+		vendorId = m.vendorId
+		io.WriteUint16(16, *(vendorId))
 	}
-	serializeFunc(m)
+
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iNLM.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
index b6d71c2..139f8ad 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMIAmRouterToNetwork.go
@@ -48,6 +48,26 @@ func NewNLMIAmRouterToNetwork(destinationNetworkAddress []uint16) NLMInitializer
 	return &NLMIAmRouterToNetwork{destinationNetworkAddress: destinationNetworkAddress}
 }
 
+func CastINLMIAmRouterToNetwork(structType interface{}) INLMIAmRouterToNetwork {
+	castFunc := func(typ interface{}) INLMIAmRouterToNetwork {
+		if iNLMIAmRouterToNetwork, ok := typ.(INLMIAmRouterToNetwork); ok {
+			return iNLMIAmRouterToNetwork
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastNLMIAmRouterToNetwork(structType interface{}) NLMIAmRouterToNetwork {
+	castFunc := func(typ interface{}) NLMIAmRouterToNetwork {
+		if sNLMIAmRouterToNetwork, ok := typ.(NLMIAmRouterToNetwork); ok {
+			return sNLMIAmRouterToNetwork
+		}
+		return NLMIAmRouterToNetwork{}
+	}
+	return castFunc(structType)
+}
+
 func (m NLMIAmRouterToNetwork) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.NLM.LengthInBits()
 
@@ -68,8 +88,8 @@ func NLMIAmRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageTyp
 	// Array field (destinationNetworkAddress)
 	var destinationNetworkAddress []uint16
 	// Length array
-	_destinationNetworkAddressLength := uint16((apduLength) - (spi.InlineIf((((messageType) >= (128)) && ((messageType) <= (255))), uint16(3), uint16(1))))
-	_destinationNetworkAddressEndPos := io.GetPos() + _destinationNetworkAddressLength
+	_destinationNetworkAddressLength := uint16(apduLength) - uint16(uint16(spi.InlineIf(bool(bool(bool(bool((messageType) >= (128)))) && bool(bool(bool((messageType) <= (255))))), uint16(uint16(3)), uint16(uint16(1)))))
+	_destinationNetworkAddressEndPos := io.GetPos() + uint16(_destinationNetworkAddressLength)
 	for io.GetPos() < _destinationNetworkAddressEndPos {
 		destinationNetworkAddress = append(destinationNetworkAddress, io.ReadUint16(16))
 	}
@@ -79,16 +99,11 @@ func NLMIAmRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageTyp
 }
 
 func (m NLMIAmRouterToNetwork) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(INLMIAmRouterToNetwork); ok {
-
-			// Array Field (destinationNetworkAddress)
-			if m.destinationNetworkAddress != nil {
-				for _, _element := range m.destinationNetworkAddress {
-					io.WriteUint16(16, _element)
-				}
-			}
+
+	// Array Field (destinationNetworkAddress)
+	if m.destinationNetworkAddress != nil {
+		for _, _element := range m.destinationNetworkAddress {
+			io.WriteUint16(16, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
index 8d1ed07..6b8929e 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NLMWhoIsRouterToNetwork.go
@@ -48,6 +48,26 @@ func NewNLMWhoIsRouterToNetwork(destinationNetworkAddress []uint16) NLMInitializ
 	return &NLMWhoIsRouterToNetwork{destinationNetworkAddress: destinationNetworkAddress}
 }
 
+func CastINLMWhoIsRouterToNetwork(structType interface{}) INLMWhoIsRouterToNetwork {
+	castFunc := func(typ interface{}) INLMWhoIsRouterToNetwork {
+		if iNLMWhoIsRouterToNetwork, ok := typ.(INLMWhoIsRouterToNetwork); ok {
+			return iNLMWhoIsRouterToNetwork
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastNLMWhoIsRouterToNetwork(structType interface{}) NLMWhoIsRouterToNetwork {
+	castFunc := func(typ interface{}) NLMWhoIsRouterToNetwork {
+		if sNLMWhoIsRouterToNetwork, ok := typ.(NLMWhoIsRouterToNetwork); ok {
+			return sNLMWhoIsRouterToNetwork
+		}
+		return NLMWhoIsRouterToNetwork{}
+	}
+	return castFunc(structType)
+}
+
 func (m NLMWhoIsRouterToNetwork) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.NLM.LengthInBits()
 
@@ -68,8 +88,8 @@ func NLMWhoIsRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageT
 	// Array field (destinationNetworkAddress)
 	var destinationNetworkAddress []uint16
 	// Length array
-	_destinationNetworkAddressLength := uint16((apduLength) - (spi.InlineIf((((messageType) >= (128)) && ((messageType) <= (255))), uint16(3), uint16(1))))
-	_destinationNetworkAddressEndPos := io.GetPos() + _destinationNetworkAddressLength
+	_destinationNetworkAddressLength := uint16(apduLength) - uint16(uint16(spi.InlineIf(bool(bool(bool(bool((messageType) >= (128)))) && bool(bool(bool((messageType) <= (255))))), uint16(uint16(3)), uint16(uint16(1)))))
+	_destinationNetworkAddressEndPos := io.GetPos() + uint16(_destinationNetworkAddressLength)
 	for io.GetPos() < _destinationNetworkAddressEndPos {
 		destinationNetworkAddress = append(destinationNetworkAddress, io.ReadUint16(16))
 	}
@@ -79,16 +99,11 @@ func NLMWhoIsRouterToNetworkParse(io spi.ReadBuffer, apduLength uint16, messageT
 }
 
 func (m NLMWhoIsRouterToNetwork) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(INLMWhoIsRouterToNetwork); ok {
-
-			// Array Field (destinationNetworkAddress)
-			if m.destinationNetworkAddress != nil {
-				for _, _element := range m.destinationNetworkAddress {
-					io.WriteUint16(16, _element)
-				}
-			}
+
+	// Array Field (destinationNetworkAddress)
+	if m.destinationNetworkAddress != nil {
+		for _, _element := range m.destinationNetworkAddress {
+			io.WriteUint16(16, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
index 92389ef..fc9b734 100644
--- a/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
+++ b/sandbox/plc4go/internal/plc4go/bacnetip/readwrite/model/NPDU.go
@@ -54,6 +54,26 @@ func NewNPDU(protocolVersionNumber uint8, messageTypeFieldPresent bool, destinat
 	return &NPDU{protocolVersionNumber: protocolVersionNumber, messageTypeFieldPresent: messageTypeFieldPresent, destinationSpecified: destinationSpecified, sourceSpecified: sourceSpecified, expectingReply: expectingReply, networkPriority: networkPriority, destinationNetworkAddress: destinationNetworkAddress, destinationLength: destinationLength, destinationAddress: destinationAddress, sourceNetworkAddress: sourceNetworkAddress, sourceLength: sourceLength, sourceAddress: sourceAddress, hopC [...]
 }
 
+func CastINPDU(structType interface{}) INPDU {
+	castFunc := func(typ interface{}) INPDU {
+		if iNPDU, ok := typ.(INPDU); ok {
+			return iNPDU
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastNPDU(structType interface{}) NPDU {
+	castFunc := func(typ interface{}) NPDU {
+		if sNPDU, ok := typ.(NPDU); ok {
+			return sNPDU
+		}
+		return NPDU{}
+	}
+	return castFunc(structType)
+}
+
 func (m NPDU) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -193,8 +213,8 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	var destinationAddress []uint8
 	// Count array
 	{
-		destinationAddress := make([]uint8, spi.InlineIf((destinationSpecified), uint16(destinationLength), uint16(0)))
-		for curItem := uint16(0); curItem < uint16(spi.InlineIf((destinationSpecified), uint16(destinationLength), uint16(0))); curItem++ {
+		destinationAddress := make([]uint8, spi.InlineIf(destinationSpecified, uint16(*destinationLength), uint16(uint16(0))))
+		for curItem := uint16(0); curItem < uint16(spi.InlineIf(destinationSpecified, uint16(*destinationLength), uint16(uint16(0)))); curItem++ {
 
 			destinationAddress = append(destinationAddress, io.ReadUint8(8))
 		}
@@ -218,8 +238,8 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	var sourceAddress []uint8
 	// Count array
 	{
-		sourceAddress := make([]uint8, spi.InlineIf((sourceSpecified), uint16(sourceLength), uint16(0)))
-		for curItem := uint16(0); curItem < uint16(spi.InlineIf((sourceSpecified), uint16(sourceLength), uint16(0))); curItem++ {
+		sourceAddress := make([]uint8, spi.InlineIf(sourceSpecified, uint16(*sourceLength), uint16(uint16(0))))
+		for curItem := uint16(0); curItem < uint16(spi.InlineIf(sourceSpecified, uint16(*sourceLength), uint16(uint16(0)))); curItem++ {
 
 			sourceAddress = append(sourceAddress, io.ReadUint8(8))
 		}
@@ -235,7 +255,7 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	// Optional Field (nlm) (Can be skipped, if a given expression evaluates to false)
 	var nlm *NLM = nil
 	if messageTypeFieldPresent {
-		_message, _err := NLMParse(io, uint16((npduLength)-((((2)+(spi.InlineIf((sourceSpecified), uint16((3)+(sourceLength)), uint16(0))))+(spi.InlineIf((destinationSpecified), uint16((3)+(destinationLength)), uint16(0))))+(spi.InlineIf(((destinationSpecified) || (sourceSpecified)), uint16(1), uint16(0))))))
+		_message, _err := NLMParse(io, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(spi.InlineIf(sourceSpecified, uint16(uint16(uint16(3))+uint16(*sourceLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(destinationSpecified, uint16(uint16(uint16(3))+uint16(*destinationLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(bool(bool(destinationSpecified) || bool(sourceSpecified)), uint16(uint16(1)), uint16(uint16(0))))))))
 		if _err != nil {
 			return nil, errors.New("Error parsing 'nlm' field " + _err.Error())
 		}
@@ -250,7 +270,7 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 	// Optional Field (apdu) (Can be skipped, if a given expression evaluates to false)
 	var apdu *APDU = nil
 	if !(messageTypeFieldPresent) {
-		_message, _err := APDUParse(io, uint16((npduLength)-((((2)+(spi.InlineIf((sourceSpecified), uint16((3)+(sourceLength)), uint16(0))))+(spi.InlineIf((destinationSpecified), uint16((3)+(destinationLength)), uint16(0))))+(spi.InlineIf(((destinationSpecified) || (sourceSpecified)), uint16(1), uint16(0))))))
+		_message, _err := APDUParse(io, uint16(npduLength)-uint16(uint16(uint16(uint16(uint16(uint16(2))+uint16(uint16(spi.InlineIf(sourceSpecified, uint16(uint16(uint16(3))+uint16(*sourceLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(destinationSpecified, uint16(uint16(uint16(3))+uint16(*destinationLength)), uint16(uint16(0))))))+uint16(uint16(spi.InlineIf(bool(bool(destinationSpecified) || bool(sourceSpecified)), uint16(uint16(1)), uint16(uint16(0))))))))
 		if _err != nil {
 			return nil, errors.New("Error parsing 'apdu' field " + _err.Error())
 		}
@@ -267,102 +287,97 @@ func NPDUParse(io spi.ReadBuffer, npduLength uint16) (spi.Message, error) {
 }
 
 func (m NPDU) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(INPDU); ok {
-
-			// Simple Field (protocolVersionNumber)
-			var protocolVersionNumber uint8 = m.protocolVersionNumber
-			io.WriteUint8(8, (protocolVersionNumber))
-
-			// Simple Field (messageTypeFieldPresent)
-			var messageTypeFieldPresent bool = m.messageTypeFieldPresent
-			io.WriteBit((bool)(messageTypeFieldPresent))
-
-			// Reserved Field (reserved)
-			io.WriteUint8(1, uint8(0))
-
-			// Simple Field (destinationSpecified)
-			var destinationSpecified bool = m.destinationSpecified
-			io.WriteBit((bool)(destinationSpecified))
-
-			// Reserved Field (reserved)
-			io.WriteUint8(1, uint8(0))
-
-			// Simple Field (sourceSpecified)
-			var sourceSpecified bool = m.sourceSpecified
-			io.WriteBit((bool)(sourceSpecified))
-
-			// Simple Field (expectingReply)
-			var expectingReply bool = m.expectingReply
-			io.WriteBit((bool)(expectingReply))
-
-			// Simple Field (networkPriority)
-			var networkPriority uint8 = m.networkPriority
-			io.WriteUint8(2, (networkPriority))
-
-			// Optional Field (destinationNetworkAddress) (Can be skipped, if the value is null)
-			var destinationNetworkAddress *uint16 = nil
-			if m.destinationNetworkAddress != nil {
-				destinationNetworkAddress = m.destinationNetworkAddress
-				io.WriteUint16(16, *(destinationNetworkAddress))
-			}
-
-			// Optional Field (destinationLength) (Can be skipped, if the value is null)
-			var destinationLength *uint8 = nil
-			if m.destinationLength != nil {
-				destinationLength = m.destinationLength
-				io.WriteUint8(8, *(destinationLength))
-			}
-
-			// Array Field (destinationAddress)
-			if m.destinationAddress != nil {
-				for _, _element := range m.destinationAddress {
-					io.WriteUint8(8, _element)
-				}
-			}
-
-			// Optional Field (sourceNetworkAddress) (Can be skipped, if the value is null)
-			var sourceNetworkAddress *uint16 = nil
-			if m.sourceNetworkAddress != nil {
-				sourceNetworkAddress = m.sourceNetworkAddress
-				io.WriteUint16(16, *(sourceNetworkAddress))
-			}
-
-			// Optional Field (sourceLength) (Can be skipped, if the value is null)
-			var sourceLength *uint8 = nil
-			if m.sourceLength != nil {
-				sourceLength = m.sourceLength
-				io.WriteUint8(8, *(sourceLength))
-			}
-
-			// Array Field (sourceAddress)
-			if m.sourceAddress != nil {
-				for _, _element := range m.sourceAddress {
-					io.WriteUint8(8, _element)
-				}
-			}
-
-			// Optional Field (hopCount) (Can be skipped, if the value is null)
-			var hopCount *uint8 = nil
-			if m.hopCount != nil {
-				hopCount = m.hopCount
-				io.WriteUint8(8, *(hopCount))
-			}
-
-			// Optional Field (nlm) (Can be skipped, if the value is null)
-			var nlm *NLM = nil
-			if m.nlm != nil {
-				nlm = m.nlm
-				nlm.Serialize(io)
-			}
-
-			// Optional Field (apdu) (Can be skipped, if the value is null)
-			var apdu *APDU = nil
-			if m.apdu != nil {
-				apdu = m.apdu
-				apdu.Serialize(io)
-			}
+
+	// Simple Field (protocolVersionNumber)
+	protocolVersionNumber := uint8(m.protocolVersionNumber)
+	io.WriteUint8(8, (protocolVersionNumber))
+
+	// Simple Field (messageTypeFieldPresent)
+	messageTypeFieldPresent := bool(m.messageTypeFieldPresent)
+	io.WriteBit((bool)(messageTypeFieldPresent))
+
+	// Reserved Field (reserved)
+	io.WriteUint8(1, uint8(0))
+
+	// Simple Field (destinationSpecified)
+	destinationSpecified := bool(m.destinationSpecified)
+	io.WriteBit((bool)(destinationSpecified))
+
+	// Reserved Field (reserved)
+	io.WriteUint8(1, uint8(0))
+
+	// Simple Field (sourceSpecified)
+	sourceSpecified := bool(m.sourceSpecified)
+	io.WriteBit((bool)(sourceSpecified))
+
+	// Simple Field (expectingReply)
+	expectingReply := bool(m.expectingReply)
+	io.WriteBit((bool)(expectingReply))
+
+	// Simple Field (networkPriority)
+	networkPriority := uint8(m.networkPriority)
+	io.WriteUint8(2, (networkPriority))
+
+	// Optional Field (destinationNetworkAddress) (Can be skipped, if the value is null)
+	var destinationNetworkAddress *uint16 = nil
+	if m.destinationNetworkAddress != nil {
+		destinationNetworkAddress = m.destinationNetworkAddress
+		io.WriteUint16(16, *(destinationNetworkAddress))
+	}
+
+	// Optional Field (destinationLength) (Can be skipped, if the value is null)
+	var destinationLength *uint8 = nil
+	if m.destinationLength != nil {
+		destinationLength = m.destinationLength
+		io.WriteUint8(8, *(destinationLength))
+	}
+
+	// Array Field (destinationAddress)
+	if m.destinationAddress != nil {
+		for _, _element := range m.destinationAddress {
+			io.WriteUint8(8, _element)
+		}
+	}
+
+	// Optional Field (sourceNetworkAddress) (Can be skipped, if the value is null)
+	var sourceNetworkAddress *uint16 = nil
+	if m.sourceNetworkAddress != nil {
+		sourceNetworkAddress = m.sourceNetworkAddress
+		io.WriteUint16(16, *(sourceNetworkAddress))
+	}
+
+	// Optional Field (sourceLength) (Can be skipped, if the value is null)
+	var sourceLength *uint8 = nil
+	if m.sourceLength != nil {
+		sourceLength = m.sourceLength
+		io.WriteUint8(8, *(sourceLength))
+	}
+
+	// Array Field (sourceAddress)
+	if m.sourceAddress != nil {
+		for _, _element := range m.sourceAddress {
+			io.WriteUint8(8, _element)
 		}
 	}
-	serializeFunc(m)
+
+	// Optional Field (hopCount) (Can be skipped, if the value is null)
+	var hopCount *uint8 = nil
+	if m.hopCount != nil {
+		hopCount = m.hopCount
+		io.WriteUint8(8, *(hopCount))
+	}
+
+	// Optional Field (nlm) (Can be skipped, if the value is null)
+	var nlm *NLM = nil
+	if m.nlm != nil {
+		nlm = m.nlm
+		nlm.Serialize(io)
+	}
+
+	// Optional Field (apdu) (Can be skipped, if the value is null)
+	var apdu *APDU = nil
+	if m.apdu != nil {
+		apdu = m.apdu
+		apdu.Serialize(io)
+	}
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
index 5ff2ac0..ecafb4c 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/APCI.go
@@ -41,6 +41,16 @@ const (
 	APCI_OTHER_PDU                       APCI = 0xF
 )
 
+func CastAPCI(structType interface{}) APCI {
+	castFunc := func(typ interface{}) APCI {
+		if sAPCI, ok := typ.(APCI); ok {
+			return sAPCI
+		}
+		return 0
+	}
+	return castFunc(structType)
+}
+
 func APCIParse(io spi.ReadBuffer) (APCI, error) {
 	// TODO: Implement ...
 	return 0, nil
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
index d784717..5df3590 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMI.go
@@ -42,6 +42,26 @@ func CEMIMessageCode(m ICEMI) uint8 {
 	return m.MessageCode()
 }
 
+func CastICEMI(structType interface{}) ICEMI {
+	castFunc := func(typ interface{}) ICEMI {
+		if iCEMI, ok := typ.(ICEMI); ok {
+			return iCEMI
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMI(structType interface{}) CEMI {
+	castFunc := func(typ interface{}) CEMI {
+		if sCEMI, ok := typ.(CEMI); ok {
+			return sCEMI
+		}
+		return CEMI{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMI) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -98,16 +118,12 @@ func CEMIParse(io spi.ReadBuffer, size uint8) (spi.Message, error) {
 }
 
 func (m CEMI) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iCEMI, ok := typ.(ICEMI); ok {
+	iCEMI := CastICEMI(m)
 
-			// Discriminator Field (messageCode) (Used as input to a switch field)
-			messageCode := CEMIMessageCode(iCEMI)
-			io.WriteUint8(8, (messageCode))
+	// Discriminator Field (messageCode) (Used as input to a switch field)
+	messageCode := uint8(CEMIMessageCode(iCEMI))
+	io.WriteUint8(8, (messageCode))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iCEMI.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iCEMI.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
index a2d8c73..c7db009 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformation.go
@@ -42,6 +42,26 @@ func CEMIAdditionalInformationAdditionalInformationType(m ICEMIAdditionalInforma
 	return m.AdditionalInformationType()
 }
 
+func CastICEMIAdditionalInformation(structType interface{}) ICEMIAdditionalInformation {
+	castFunc := func(typ interface{}) ICEMIAdditionalInformation {
+		if iCEMIAdditionalInformation, ok := typ.(ICEMIAdditionalInformation); ok {
+			return iCEMIAdditionalInformation
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIAdditionalInformation(structType interface{}) CEMIAdditionalInformation {
+	castFunc := func(typ interface{}) CEMIAdditionalInformation {
+		if sCEMIAdditionalInformation, ok := typ.(CEMIAdditionalInformation); ok {
+			return sCEMIAdditionalInformation
+		}
+		return CEMIAdditionalInformation{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIAdditionalInformation) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -80,16 +100,12 @@ func CEMIAdditionalInformationParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m CEMIAdditionalInformation) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iCEMIAdditionalInformation, ok := typ.(ICEMIAdditionalInformation); ok {
+	iCEMIAdditionalInformation := CastICEMIAdditionalInformation(m)
 
-			// Discriminator Field (additionalInformationType) (Used as input to a switch field)
-			additionalInformationType := CEMIAdditionalInformationAdditionalInformationType(iCEMIAdditionalInformation)
-			io.WriteUint8(8, (additionalInformationType))
+	// Discriminator Field (additionalInformationType) (Used as input to a switch field)
+	additionalInformationType := uint8(CEMIAdditionalInformationAdditionalInformationType(iCEMIAdditionalInformation))
+	io.WriteUint8(8, (additionalInformationType))
 
-			// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
-			iCEMIAdditionalInformation.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Switch field (Depending on the discriminator values, passes the serialization to a sub-type)
+	iCEMIAdditionalInformation.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
index a707c28..f8cca31 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationBusmonitorInfo.go
@@ -57,6 +57,26 @@ func NewCEMIAdditionalInformationBusmonitorInfo(frameErrorFlag bool, bitErrorFla
 	return &CEMIAdditionalInformationBusmonitorInfo{frameErrorFlag: frameErrorFlag, bitErrorFlag: bitErrorFlag, parityErrorFlag: parityErrorFlag, unknownFlag: unknownFlag, lostFlag: lostFlag, sequenceNumber: sequenceNumber}
 }
 
+func CastICEMIAdditionalInformationBusmonitorInfo(structType interface{}) ICEMIAdditionalInformationBusmonitorInfo {
+	castFunc := func(typ interface{}) ICEMIAdditionalInformationBusmonitorInfo {
+		if iCEMIAdditionalInformationBusmonitorInfo, ok := typ.(ICEMIAdditionalInformationBusmonitorInfo); ok {
+			return iCEMIAdditionalInformationBusmonitorInfo
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIAdditionalInformationBusmonitorInfo(structType interface{}) CEMIAdditionalInformationBusmonitorInfo {
+	castFunc := func(typ interface{}) CEMIAdditionalInformationBusmonitorInfo {
+		if sCEMIAdditionalInformationBusmonitorInfo, ok := typ.(CEMIAdditionalInformationBusmonitorInfo); ok {
+			return sCEMIAdditionalInformationBusmonitorInfo
+		}
+		return CEMIAdditionalInformationBusmonitorInfo{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIAdditionalInformationBusmonitorInfo) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.CEMIAdditionalInformation.LengthInBits()
 
@@ -119,36 +139,31 @@ func CEMIAdditionalInformationBusmonitorInfoParse(io spi.ReadBuffer) (CEMIAdditi
 }
 
 func (m CEMIAdditionalInformationBusmonitorInfo) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(ICEMIAdditionalInformationBusmonitorInfo); ok {
 
-			// Const Field (len)
-			io.WriteUint8(8, 1)
+	// Const Field (len)
+	io.WriteUint8(8, 1)
 
-			// Simple Field (frameErrorFlag)
-			var frameErrorFlag bool = m.frameErrorFlag
-			io.WriteBit((bool)(frameErrorFlag))
+	// Simple Field (frameErrorFlag)
+	frameErrorFlag := bool(m.frameErrorFlag)
+	io.WriteBit((bool)(frameErrorFlag))
 
-			// Simple Field (bitErrorFlag)
-			var bitErrorFlag bool = m.bitErrorFlag
-			io.WriteBit((bool)(bitErrorFlag))
+	// Simple Field (bitErrorFlag)
+	bitErrorFlag := bool(m.bitErrorFlag)
+	io.WriteBit((bool)(bitErrorFlag))
 
-			// Simple Field (parityErrorFlag)
-			var parityErrorFlag bool = m.parityErrorFlag
-			io.WriteBit((bool)(parityErrorFlag))
+	// Simple Field (parityErrorFlag)
+	parityErrorFlag := bool(m.parityErrorFlag)
+	io.WriteBit((bool)(parityErrorFlag))
 
-			// Simple Field (unknownFlag)
-			var unknownFlag bool = m.unknownFlag
-			io.WriteBit((bool)(unknownFlag))
+	// Simple Field (unknownFlag)
+	unknownFlag := bool(m.unknownFlag)
+	io.WriteBit((bool)(unknownFlag))
 
-			// Simple Field (lostFlag)
-			var lostFlag bool = m.lostFlag
-			io.WriteBit((bool)(lostFlag))
+	// Simple Field (lostFlag)
+	lostFlag := bool(m.lostFlag)
+	io.WriteBit((bool)(lostFlag))
 
-			// Simple Field (sequenceNumber)
-			var sequenceNumber uint8 = m.sequenceNumber
-			io.WriteUint8(3, (sequenceNumber))
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (sequenceNumber)
+	sequenceNumber := uint8(m.sequenceNumber)
+	io.WriteUint8(3, (sequenceNumber))
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
index 41b30f8..53582d5 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIAdditionalInformationRelativeTimestamp.go
@@ -53,6 +53,26 @@ func NewCEMIAdditionalInformationRelativeTimestamp(relativeTimestamp RelativeTim
 	return &CEMIAdditionalInformationRelativeTimestamp{relativeTimestamp: relativeTimestamp}
 }
 
+func CastICEMIAdditionalInformationRelativeTimestamp(structType interface{}) ICEMIAdditionalInformationRelativeTimestamp {
+	castFunc := func(typ interface{}) ICEMIAdditionalInformationRelativeTimestamp {
+		if iCEMIAdditionalInformationRelativeTimestamp, ok := typ.(ICEMIAdditionalInformationRelativeTimestamp); ok {
+			return iCEMIAdditionalInformationRelativeTimestamp
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIAdditionalInformationRelativeTimestamp(structType interface{}) CEMIAdditionalInformationRelativeTimestamp {
+	castFunc := func(typ interface{}) CEMIAdditionalInformationRelativeTimestamp {
+		if sCEMIAdditionalInformationRelativeTimestamp, ok := typ.(CEMIAdditionalInformationRelativeTimestamp); ok {
+			return sCEMIAdditionalInformationRelativeTimestamp
+		}
+		return CEMIAdditionalInformationRelativeTimestamp{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIAdditionalInformationRelativeTimestamp) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.CEMIAdditionalInformation.LengthInBits()
 
@@ -93,16 +113,11 @@ func CEMIAdditionalInformationRelativeTimestampParse(io spi.ReadBuffer) (CEMIAdd
 }
 
 func (m CEMIAdditionalInformationRelativeTimestamp) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(ICEMIAdditionalInformationRelativeTimestamp); ok {
 
-			// Const Field (len)
-			io.WriteUint8(8, 2)
+	// Const Field (len)
+	io.WriteUint8(8, 2)
 
-			// Simple Field (relativeTimestamp)
-			var relativeTimestamp RelativeTimestamp = m.relativeTimestamp
-			relativeTimestamp.Serialize(io)
-		}
-	}
-	serializeFunc(m)
+	// Simple Field (relativeTimestamp)
+	relativeTimestamp := RelativeTimestamp(m.relativeTimestamp)
+	relativeTimestamp.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
index 4c3879f..495c8d3 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIBusmonInd.go
@@ -51,6 +51,26 @@ func NewCEMIBusmonInd(additionalInformationLength uint8, additionalInformation [
 	return &CEMIBusmonInd{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiFrame: cemiFrame}
 }
 
+func CastICEMIBusmonInd(structType interface{}) ICEMIBusmonInd {
+	castFunc := func(typ interface{}) ICEMIBusmonInd {
+		if iCEMIBusmonInd, ok := typ.(ICEMIBusmonInd); ok {
+			return iCEMIBusmonInd
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIBusmonInd(structType interface{}) CEMIBusmonInd {
+	castFunc := func(typ interface{}) CEMIBusmonInd {
+		if sCEMIBusmonInd, ok := typ.(CEMIBusmonInd); ok {
+			return sCEMIBusmonInd
+		}
+		return CEMIBusmonInd{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIBusmonInd) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.CEMI.LengthInBits()
 
@@ -82,8 +102,8 @@ func CEMIBusmonIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	// Array field (additionalInformation)
 	var additionalInformation []CEMIAdditionalInformation
 	// Length array
-	_additionalInformationLength := uint16(additionalInformationLength)
-	_additionalInformationEndPos := io.GetPos() + _additionalInformationLength
+	_additionalInformationLength := additionalInformationLength
+	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
 	for io.GetPos() < _additionalInformationEndPos {
 		_message, _err := CEMIAdditionalInformationParse(io)
 		if _err != nil {
@@ -113,24 +133,19 @@ func CEMIBusmonIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIBusmonInd) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(ICEMIBusmonInd); ok {
-
-			// Simple Field (additionalInformationLength)
-			var additionalInformationLength uint8 = m.additionalInformationLength
-			io.WriteUint8(8, (additionalInformationLength))
-
-			// Array Field (additionalInformation)
-			if m.additionalInformation != nil {
-				for _, _element := range m.additionalInformation {
-					_element.Serialize(io)
-				}
-			}
-
-			// Simple Field (cemiFrame)
-			var cemiFrame CEMIFrame = m.cemiFrame
-			cemiFrame.Serialize(io)
+
+	// Simple Field (additionalInformationLength)
+	additionalInformationLength := uint8(m.additionalInformationLength)
+	io.WriteUint8(8, (additionalInformationLength))
+
+	// Array Field (additionalInformation)
+	if m.additionalInformation != nil {
+		for _, _element := range m.additionalInformation {
+			_element.Serialize(io)
 		}
 	}
-	serializeFunc(m)
+
+	// Simple Field (cemiFrame)
+	cemiFrame := CEMIFrame(m.cemiFrame)
+	cemiFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
index 6d01db1..708eda2 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataCon.go
@@ -51,6 +51,26 @@ func NewCEMIDataCon(additionalInformationLength uint8, additionalInformation []C
 	return &CEMIDataCon{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiDataFrame: cemiDataFrame}
 }
 
+func CastICEMIDataCon(structType interface{}) ICEMIDataCon {
+	castFunc := func(typ interface{}) ICEMIDataCon {
+		if iCEMIDataCon, ok := typ.(ICEMIDataCon); ok {
+			return iCEMIDataCon
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIDataCon(structType interface{}) CEMIDataCon {
+	castFunc := func(typ interface{}) CEMIDataCon {
+		if sCEMIDataCon, ok := typ.(CEMIDataCon); ok {
+			return sCEMIDataCon
+		}
+		return CEMIDataCon{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIDataCon) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.CEMI.LengthInBits()
 
@@ -82,8 +102,8 @@ func CEMIDataConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	// Array field (additionalInformation)
 	var additionalInformation []CEMIAdditionalInformation
 	// Length array
-	_additionalInformationLength := uint16(additionalInformationLength)
-	_additionalInformationEndPos := io.GetPos() + _additionalInformationLength
+	_additionalInformationLength := additionalInformationLength
+	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
 	for io.GetPos() < _additionalInformationEndPos {
 		_message, _err := CEMIAdditionalInformationParse(io)
 		if _err != nil {
@@ -113,24 +133,19 @@ func CEMIDataConParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIDataCon) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(ICEMIDataCon); ok {
-
-			// Simple Field (additionalInformationLength)
-			var additionalInformationLength uint8 = m.additionalInformationLength
-			io.WriteUint8(8, (additionalInformationLength))
-
-			// Array Field (additionalInformation)
-			if m.additionalInformation != nil {
-				for _, _element := range m.additionalInformation {
-					_element.Serialize(io)
-				}
-			}
-
-			// Simple Field (cemiDataFrame)
-			var cemiDataFrame CEMIDataFrame = m.cemiDataFrame
-			cemiDataFrame.Serialize(io)
+
+	// Simple Field (additionalInformationLength)
+	additionalInformationLength := uint8(m.additionalInformationLength)
+	io.WriteUint8(8, (additionalInformationLength))
+
+	// Array Field (additionalInformation)
+	if m.additionalInformation != nil {
+		for _, _element := range m.additionalInformation {
+			_element.Serialize(io)
 		}
 	}
-	serializeFunc(m)
+
+	// Simple Field (cemiDataFrame)
+	cemiDataFrame := CEMIDataFrame(m.cemiDataFrame)
+	cemiDataFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
index dd5b255..6c663ff 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataFrame.go
@@ -56,6 +56,26 @@ func NewCEMIDataFrame(standardFrame bool, polling bool, notRepeated bool, notAck
 	return &CEMIDataFrame{standardFrame: standardFrame, polling: polling, notRepeated: notRepeated, notAckFrame: notAckFrame, priority: priority, acknowledgeRequested: acknowledgeRequested, errorFlag: errorFlag, groupDestinationAddress: groupDestinationAddress, hopCount: hopCount, extendedFrameFormat: extendedFrameFormat, sourceAddress: sourceAddress, destinationAddress: destinationAddress, dataLength: dataLength, tcpi: tcpi, counter: counter, apci: apci, dataFirstByte: dataFirstByte, data: data}
 }
 
+func CastICEMIDataFrame(structType interface{}) ICEMIDataFrame {
+	castFunc := func(typ interface{}) ICEMIDataFrame {
+		if iCEMIDataFrame, ok := typ.(ICEMIDataFrame); ok {
+			return iCEMIDataFrame
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIDataFrame(structType interface{}) CEMIDataFrame {
+	castFunc := func(typ interface{}) CEMIDataFrame {
+		if sCEMIDataFrame, ok := typ.(CEMIDataFrame); ok {
+			return sCEMIDataFrame
+		}
+		return CEMIDataFrame{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIDataFrame) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -174,8 +194,8 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 	var destinationAddress []int8
 	// Count array
 	{
-		destinationAddress := make([]int8, 2)
-		for curItem := uint16(0); curItem < uint16(2); curItem++ {
+		destinationAddress := make([]int8, uint16(2))
+		for curItem := uint16(0); curItem < uint16(uint16(2)); curItem++ {
 
 			destinationAddress = append(destinationAddress, io.ReadInt8(8))
 		}
@@ -206,8 +226,8 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 	var data []int8
 	// Count array
 	{
-		data := make([]int8, (dataLength)-(1))
-		for curItem := uint16(0); curItem < uint16((dataLength)-(1)); curItem++ {
+		data := make([]int8, uint16(dataLength)-uint16(uint16(1)))
+		for curItem := uint16(0); curItem < uint16(uint16(dataLength)-uint16(uint16(1))); curItem++ {
 
 			data = append(data, io.ReadInt8(8))
 		}
@@ -218,87 +238,82 @@ func CEMIDataFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m CEMIDataFrame) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(ICEMIDataFrame); ok {
-
-			// Simple Field (standardFrame)
-			var standardFrame bool = m.standardFrame
-			io.WriteBit((bool)(standardFrame))
-
-			// Simple Field (polling)
-			var polling bool = m.polling
-			io.WriteBit((bool)(polling))
-
-			// Simple Field (notRepeated)
-			var notRepeated bool = m.notRepeated
-			io.WriteBit((bool)(notRepeated))
-
-			// Simple Field (notAckFrame)
-			var notAckFrame bool = m.notAckFrame
-			io.WriteBit((bool)(notAckFrame))
-
-			// Enum field (priority)
-			priority := m.priority
-			priority.Serialize(io)
-
-			// Simple Field (acknowledgeRequested)
-			var acknowledgeRequested bool = m.acknowledgeRequested
-			io.WriteBit((bool)(acknowledgeRequested))
-
-			// Simple Field (errorFlag)
-			var errorFlag bool = m.errorFlag
-			io.WriteBit((bool)(errorFlag))
-
-			// Simple Field (groupDestinationAddress)
-			var groupDestinationAddress bool = m.groupDestinationAddress
-			io.WriteBit((bool)(groupDestinationAddress))
-
-			// Simple Field (hopCount)
-			var hopCount uint8 = m.hopCount
-			io.WriteUint8(3, (hopCount))
-
-			// Simple Field (extendedFrameFormat)
-			var extendedFrameFormat uint8 = m.extendedFrameFormat
-			io.WriteUint8(4, (extendedFrameFormat))
-
-			// Simple Field (sourceAddress)
-			var sourceAddress KNXAddress = m.sourceAddress
-			sourceAddress.Serialize(io)
-
-			// Array Field (destinationAddress)
-			if m.destinationAddress != nil {
-				for _, _element := range m.destinationAddress {
-					io.WriteInt8(8, _element)
-				}
-			}
-
-			// Simple Field (dataLength)
-			var dataLength uint8 = m.dataLength
-			io.WriteUint8(8, (dataLength))
-
-			// Enum field (tcpi)
-			tcpi := m.tcpi
-			tcpi.Serialize(io)
-
-			// Simple Field (counter)
-			var counter uint8 = m.counter
-			io.WriteUint8(4, (counter))
-
-			// Enum field (apci)
-			apci := m.apci
-			apci.Serialize(io)
-
-			// Simple Field (dataFirstByte)
-			var dataFirstByte int8 = m.dataFirstByte
-			io.WriteInt8(6, (dataFirstByte))
-
-			// Array Field (data)
-			if m.data != nil {
-				for _, _element := range m.data {
-					io.WriteInt8(8, _element)
-				}
-			}
+
+	// Simple Field (standardFrame)
+	standardFrame := bool(m.standardFrame)
+	io.WriteBit((bool)(standardFrame))
+
+	// Simple Field (polling)
+	polling := bool(m.polling)
+	io.WriteBit((bool)(polling))
+
+	// Simple Field (notRepeated)
+	notRepeated := bool(m.notRepeated)
+	io.WriteBit((bool)(notRepeated))
+
+	// Simple Field (notAckFrame)
+	notAckFrame := bool(m.notAckFrame)
+	io.WriteBit((bool)(notAckFrame))
+
+	// Enum field (priority)
+	priority := CEMIPriority(m.priority)
+	priority.Serialize(io)
+
+	// Simple Field (acknowledgeRequested)
+	acknowledgeRequested := bool(m.acknowledgeRequested)
+	io.WriteBit((bool)(acknowledgeRequested))
+
+	// Simple Field (errorFlag)
+	errorFlag := bool(m.errorFlag)
+	io.WriteBit((bool)(errorFlag))
+
+	// Simple Field (groupDestinationAddress)
+	groupDestinationAddress := bool(m.groupDestinationAddress)
+	io.WriteBit((bool)(groupDestinationAddress))
+
+	// Simple Field (hopCount)
+	hopCount := uint8(m.hopCount)
+	io.WriteUint8(3, (hopCount))
+
+	// Simple Field (extendedFrameFormat)
+	extendedFrameFormat := uint8(m.extendedFrameFormat)
+	io.WriteUint8(4, (extendedFrameFormat))
+
+	// Simple Field (sourceAddress)
+	sourceAddress := KNXAddress(m.sourceAddress)
+	sourceAddress.Serialize(io)
+
+	// Array Field (destinationAddress)
+	if m.destinationAddress != nil {
+		for _, _element := range m.destinationAddress {
+			io.WriteInt8(8, _element)
+		}
+	}
+
+	// Simple Field (dataLength)
+	dataLength := uint8(m.dataLength)
+	io.WriteUint8(8, (dataLength))
+
+	// Enum field (tcpi)
+	tcpi := TPCI(m.tcpi)
+	tcpi.Serialize(io)
+
+	// Simple Field (counter)
+	counter := uint8(m.counter)
+	io.WriteUint8(4, (counter))
+
+	// Enum field (apci)
+	apci := APCI(m.apci)
+	apci.Serialize(io)
+
+	// Simple Field (dataFirstByte)
+	dataFirstByte := int8(m.dataFirstByte)
+	io.WriteInt8(6, (dataFirstByte))
+
+	// Array Field (data)
+	if m.data != nil {
+		for _, _element := range m.data {
+			io.WriteInt8(8, _element)
 		}
 	}
-	serializeFunc(m)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
index b28b26a..bc27264 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataInd.go
@@ -51,6 +51,26 @@ func NewCEMIDataInd(additionalInformationLength uint8, additionalInformation []C
 	return &CEMIDataInd{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiDataFrame: cemiDataFrame}
 }
 
+func CastICEMIDataInd(structType interface{}) ICEMIDataInd {
+	castFunc := func(typ interface{}) ICEMIDataInd {
+		if iCEMIDataInd, ok := typ.(ICEMIDataInd); ok {
+			return iCEMIDataInd
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIDataInd(structType interface{}) CEMIDataInd {
+	castFunc := func(typ interface{}) CEMIDataInd {
+		if sCEMIDataInd, ok := typ.(CEMIDataInd); ok {
+			return sCEMIDataInd
+		}
+		return CEMIDataInd{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIDataInd) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.CEMI.LengthInBits()
 
@@ -82,8 +102,8 @@ func CEMIDataIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	// Array field (additionalInformation)
 	var additionalInformation []CEMIAdditionalInformation
 	// Length array
-	_additionalInformationLength := uint16(additionalInformationLength)
-	_additionalInformationEndPos := io.GetPos() + _additionalInformationLength
+	_additionalInformationLength := additionalInformationLength
+	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
 	for io.GetPos() < _additionalInformationEndPos {
 		_message, _err := CEMIAdditionalInformationParse(io)
 		if _err != nil {
@@ -113,24 +133,19 @@ func CEMIDataIndParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIDataInd) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(ICEMIDataInd); ok {
-
-			// Simple Field (additionalInformationLength)
-			var additionalInformationLength uint8 = m.additionalInformationLength
-			io.WriteUint8(8, (additionalInformationLength))
-
-			// Array Field (additionalInformation)
-			if m.additionalInformation != nil {
-				for _, _element := range m.additionalInformation {
-					_element.Serialize(io)
-				}
-			}
-
-			// Simple Field (cemiDataFrame)
-			var cemiDataFrame CEMIDataFrame = m.cemiDataFrame
-			cemiDataFrame.Serialize(io)
+
+	// Simple Field (additionalInformationLength)
+	additionalInformationLength := uint8(m.additionalInformationLength)
+	io.WriteUint8(8, (additionalInformationLength))
+
+	// Array Field (additionalInformation)
+	if m.additionalInformation != nil {
+		for _, _element := range m.additionalInformation {
+			_element.Serialize(io)
 		}
 	}
-	serializeFunc(m)
+
+	// Simple Field (cemiDataFrame)
+	cemiDataFrame := CEMIDataFrame(m.cemiDataFrame)
+	cemiDataFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
index 7231f66..fb7bc80 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIDataReq.go
@@ -51,6 +51,26 @@ func NewCEMIDataReq(additionalInformationLength uint8, additionalInformation []C
 	return &CEMIDataReq{additionalInformationLength: additionalInformationLength, additionalInformation: additionalInformation, cemiDataFrame: cemiDataFrame}
 }
 
+func CastICEMIDataReq(structType interface{}) ICEMIDataReq {
+	castFunc := func(typ interface{}) ICEMIDataReq {
+		if iCEMIDataReq, ok := typ.(ICEMIDataReq); ok {
+			return iCEMIDataReq
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIDataReq(structType interface{}) CEMIDataReq {
+	castFunc := func(typ interface{}) CEMIDataReq {
+		if sCEMIDataReq, ok := typ.(CEMIDataReq); ok {
+			return sCEMIDataReq
+		}
+		return CEMIDataReq{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIDataReq) LengthInBits() uint16 {
 	var lengthInBits uint16 = m.CEMI.LengthInBits()
 
@@ -82,8 +102,8 @@ func CEMIDataReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 	// Array field (additionalInformation)
 	var additionalInformation []CEMIAdditionalInformation
 	// Length array
-	_additionalInformationLength := uint16(additionalInformationLength)
-	_additionalInformationEndPos := io.GetPos() + _additionalInformationLength
+	_additionalInformationLength := additionalInformationLength
+	_additionalInformationEndPos := io.GetPos() + uint16(_additionalInformationLength)
 	for io.GetPos() < _additionalInformationEndPos {
 		_message, _err := CEMIAdditionalInformationParse(io)
 		if _err != nil {
@@ -113,24 +133,19 @@ func CEMIDataReqParse(io spi.ReadBuffer) (CEMIInitializer, error) {
 }
 
 func (m CEMIDataReq) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if _, ok := typ.(ICEMIDataReq); ok {
-
-			// Simple Field (additionalInformationLength)
-			var additionalInformationLength uint8 = m.additionalInformationLength
-			io.WriteUint8(8, (additionalInformationLength))
-
-			// Array Field (additionalInformation)
-			if m.additionalInformation != nil {
-				for _, _element := range m.additionalInformation {
-					_element.Serialize(io)
-				}
-			}
-
-			// Simple Field (cemiDataFrame)
-			var cemiDataFrame CEMIDataFrame = m.cemiDataFrame
-			cemiDataFrame.Serialize(io)
+
+	// Simple Field (additionalInformationLength)
+	additionalInformationLength := uint8(m.additionalInformationLength)
+	io.WriteUint8(8, (additionalInformationLength))
+
+	// Array Field (additionalInformation)
+	if m.additionalInformation != nil {
+		for _, _element := range m.additionalInformation {
+			_element.Serialize(io)
 		}
 	}
-	serializeFunc(m)
+
+	// Simple Field (cemiDataFrame)
+	cemiDataFrame := CEMIDataFrame(m.cemiDataFrame)
+	cemiDataFrame.Serialize(io)
 }
diff --git a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
index 26dfac6..451e285 100644
--- a/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
+++ b/sandbox/plc4go/internal/plc4go/knxnetip/readwrite/model/CEMIFrame.go
@@ -56,6 +56,26 @@ func CEMIFrameStandardFrame(m ICEMIFrame) bool {
 	return m.StandardFrame()
 }
 
+func CastICEMIFrame(structType interface{}) ICEMIFrame {
+	castFunc := func(typ interface{}) ICEMIFrame {
+		if iCEMIFrame, ok := typ.(ICEMIFrame); ok {
+			return iCEMIFrame
+		}
+		return nil
+	}
+	return castFunc(structType)
+}
+
+func CastCEMIFrame(structType interface{}) CEMIFrame {
+	castFunc := func(typ interface{}) CEMIFrame {
+		if sCEMIFrame, ok := typ.(CEMIFrame); ok {
+			return sCEMIFrame
+		}
+		return CEMIFrame{}
+	}
+	return castFunc(structType)
+}
+
 func (m CEMIFrame) LengthInBits() uint16 {
 	var lengthInBits uint16 = 0
 
@@ -139,40 +159,36 @@ func CEMIFrameParse(io spi.ReadBuffer) (spi.Message, error) {
 }
 
 func (m CEMIFrame) Serialize(io spi.WriteBuffer) {
-	serializeFunc := func(typ interface{}) {
-		if iCEMIFrame, ok := typ.(ICEMIFrame); ok {
+	iCEMIFrame := CastICEMIFrame(m)
 
-			// Discriminator Field (standardFrame) (Used as input to a switch field)
-			standardFrame := CEMIFrameStandardFrame(iCEMIFrame)
-			io.WriteBit((bool)(standardFrame))
+	// Discriminator Field (standardFrame) (Used as input to a switch field)
+	standardFrame := bool(CEMIFrameStandardFrame(iCEMIFrame))
+	io.WriteBit((bool)(standardFrame))
 
-			// Discriminator Field (polling) (Used as input to a switch field)
-			polling := CEMIFramePolling(iCEMIFrame)
-			io.WriteBit((bool)(polling))
+	// Discriminator Field (polling) (Used as input to a switch field)
+	polling := bool(CEMIFramePolling(iCEMIFrame))
... 9885 lines suppressed ...