You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by sr...@apache.org on 2024/09/06 15:24:26 UTC

(plc4x) branch develop updated: feat(plc4go/bacnetip): add base types

This is an automated email from the ASF dual-hosted git repository.

sruehl pushed a commit to branch develop
in repository https://gitbox.apache.org/repos/asf/plc4x.git


The following commit(s) were added to refs/heads/develop by this push:
     new 8e36f757a6 feat(plc4go/bacnetip): add base types
8e36f757a6 is described below

commit 8e36f757a65ac3dc96fc2479d03bea894c3f446d
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Fri Sep 6 17:24:16 2024 +0200

    feat(plc4go/bacnetip): add base types
    
    + complete overhaul of bacgopes structure to avoid struct collisions
---
 .../bacnetip/ApplicationLayerMessageCodec.go       |   24 +-
 .../internal/bacnetip/bacgopes/{ => apdu}/apdu.go  |    8 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_APCI.go      |   45 +-
 .../bacgopes/{ => apdu}/apdu_APCISequence.go       |   12 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_APDU.go      |   37 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_AbortPDU.go  |    2 +-
 .../bacgopes/{ => apdu}/apdu_AbortReason.go        |    4 +-
 .../{ => apdu}/apdu_AcknowledgeAlarmRequest.go     |    2 +-
 .../{ => apdu}/apdu_AddListElementRequest.go       |    2 +-
 .../apdu_AtomicReadFileACKAccessMethodChoice.go    |    2 +-
 ...du_AtomicReadFileACKAccessMethodRecordAccess.go |    2 +-
 ...du_AtomicReadFileACKAccessMethodStreamAccess.go |    2 +-
 .../{ => apdu}/apdu_AtomicReadFileRequest.go       |    2 +-
 ...apdu_AtomicReadFileRequestAccessMethodChoice.go |    2 +-
 ...eadFileRequestAccessMethodChoiceRecordAccess.go |    2 +-
 ...eadFileRequestAccessMethodChoiceStreamAccess.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_AtomicWriteFileACK.go |    2 +-
 .../{ => apdu}/apdu_AtomicWriteFileRequest.go      |    2 +-
 ...pdu_AtomicWriteFileRequestAccessMethodChoice.go |    2 +-
 ...iteFileRequestAccessMethodChoiceRecordAccess.go |    2 +-
 ...iteFileRequestAccessMethodChoiceStreamAccess.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_AuthenticateACK.go    |    2 +-
 .../{ => apdu}/apdu_AuthenticateRequest.go         |    2 +-
 .../{ => apdu}/apdu_COVNotificationParameters.go   |    2 +-
 .../bacgopes/{ => apdu}/apdu_ChangeListError.go    |    2 +-
 .../bacgopes/{ => apdu}/apdu_ComplexAckPDU.go      |    2 +-
 .../bacgopes/{ => apdu}/apdu_ComplexAckSequence.go |    2 +-
 .../apdu_ConfirmedCOVNotificationRequest.go        |    2 +-
 .../apdu_ConfirmedEventNotificationRequest.go      |    2 +-
 .../{ => apdu}/apdu_ConfirmedPrivateTransferACK.go |    2 +-
 .../apdu_ConfirmedPrivateTransferError.go          |    2 +-
 .../apdu_ConfirmedPrivateTransferRequest.go        |    2 +-
 .../{ => apdu}/apdu_ConfirmedRequestPDU.go         |    4 +-
 .../{ => apdu}/apdu_ConfirmedRequestSequence.go    |    2 +-
 .../{ => apdu}/apdu_ConfirmedServiceChoice.go      |    2 +-
 .../{ => apdu}/apdu_ConfirmedTextMessageRequest.go |    2 +-
 ...apdu_ConfirmedTextMessageRequestMessageClass.go |    2 +-
 ...u_ConfirmedTextMessageRequestMessagePriority.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_CreateObjectACK.go    |    2 +-
 .../bacgopes/{ => apdu}/apdu_CreateObjectError.go  |    2 +-
 .../{ => apdu}/apdu_CreateObjectRequest.go         |    2 +-
 .../apdu_CreateObjectRequestObjectSpecifier.go     |    2 +-
 .../{ => apdu}/apdu_DeleteObjectRequest.go         |    2 +-
 .../apdu_DeviceCommunicationControlRequest.go      |    2 +-
 ...viceCommunicationControlRequestEnableDisable.go |    2 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_Error.go     |    2 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_ErrorPDU.go  |    2 +-
 .../bacgopes/{ => apdu}/apdu_ErrorSequence.go      |    2 +-
 .../{ => apdu}/apdu_EventNotificationParameters.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_GetAlarmSummaryACK.go |    2 +-
 .../{ => apdu}/apdu_GetAlarmSummaryAlarmSummary.go |    2 +-
 .../{ => apdu}/apdu_GetAlarmSummaryRequest.go      |    2 +-
 .../{ => apdu}/apdu_GetEnrollmentSummaryACK.go     |    2 +-
 .../apdu_GetEnrollmentSummaryEnrollmentSummary.go  |    2 +-
 .../{ => apdu}/apdu_GetEnrollmentSummaryRequest.go |    2 +-
 ...llmentSummaryRequestAcknowledgmentFilterType.go |    2 +-
 ...EnrollmentSummaryRequestEventStateFilterType.go |    2 +-
 ...etEnrollmentSummaryRequestPriorityFilterType.go |    2 +-
 .../{ => apdu}/apdu_GetEventInformationACK.go      |    2 +-
 .../apdu_GetEventInformationEventSummary.go        |    2 +-
 .../{ => apdu}/apdu_GetEventInformationRequest.go  |    2 +-
 .../bacgopes/{ => apdu}/apdu_GroupChannelValue.go  |    2 +-
 .../bacnetip/bacgopes/apdu/apdu_IAmRequest.go      |   77 +
 .../bacgopes/{ => apdu}/apdu_IHaveRequest.go       |    2 +-
 .../{ => apdu}/apdu_LifeSafetyOperationRequest.go  |    2 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_Range.go     |    2 +-
 .../bacgopes/{ => apdu}/apdu_RangeByPosition.go    |    2 +-
 .../{ => apdu}/apdu_RangeBySequenceNumber.go       |    2 +-
 .../bacgopes/{ => apdu}/apdu_RangeByTime.go        |    2 +-
 .../bacgopes/{ => apdu}/apdu_ReadAccessResult.go   |    2 +-
 .../{ => apdu}/apdu_ReadAccessResultElement.go     |    2 +-
 .../apdu_ReadAccessResultElementChoice.go          |    2 +-
 .../{ => apdu}/apdu_ReadAccessSpecification.go     |    2 +-
 .../bacgopes/{ => apdu}/apdu_ReadPropertyACK.go    |    2 +-
 .../{ => apdu}/apdu_ReadPropertyMultipleACK.go     |    2 +-
 .../{ => apdu}/apdu_ReadPropertyMultipleRequest.go |    2 +-
 .../{ => apdu}/apdu_ReadPropertyRequest.go         |    2 +-
 .../bacgopes/{ => apdu}/apdu_ReadRangeACK.go       |    2 +-
 .../bacgopes/{ => apdu}/apdu_ReadRangeRequest.go   |    2 +-
 .../{ => apdu}/apdu_ReinitializeDeviceRequest.go   |    2 +-
 ...alizeDeviceRequestReinitializedStateOfDevice.go |    2 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_RejectPDU.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_RejectReason.go       |    4 +-
 .../{ => apdu}/apdu_RemoveListElementRequest.go    |    2 +-
 .../bacgopes/{ => apdu}/apdu_RequestKeyRequest.go  |    2 +-
 .../bacgopes/{ => apdu}/apdu_SegmentAckPDU.go      |    2 +-
 .../bacgopes/{ => apdu}/apdu_SimpleAckPDU.go       |    2 +-
 .../{ => apdu}/apdu_SubscribeCOVPropertyRequest.go |    2 +-
 .../{ => apdu}/apdu_SubscribeCOVRequest.go         |    2 +-
 .../{ => apdu}/apdu_TimeSynchronizationRequest.go  |    2 +-
 .../apdu_UTCTimeSynchronizationRequest.go          |    2 +-
 .../apdu_UnconfirmedCOVNotificationRequest.go      |    2 +-
 .../apdu_UnconfirmedEventNotificationRequest.go    |    2 +-
 .../apdu_UnconfirmedPrivateTransferRequest.go      |    2 +-
 .../{ => apdu}/apdu_UnconfirmedRequestPDU.go       |    2 +-
 .../apdu_UnconfirmedRequestPDUAtomicReadFileACK.go |    2 +-
 .../{ => apdu}/apdu_UnconfirmedRequestSequence.go  |   12 +-
 .../{ => apdu}/apdu_UnconfirmedServiceChoice.go    |    2 +-
 .../apdu_UnconfirmedTextMessageRequest.go          |    2 +-
 ...du_UnconfirmedTextMessageRequestMessageClass.go |    2 +-
 ...UnconfirmedTextMessageRequestMessagePriority.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_VTCloseError.go       |    2 +-
 .../bacgopes/{ => apdu}/apdu_VTCloseRequest.go     |    2 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_VTDataACK.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_VTDataRequest.go      |    2 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu_VTOpenACK.go |    2 +-
 .../bacgopes/{ => apdu}/apdu_VTOpenRequest.go      |    2 +-
 .../bacgopes/{ => apdu}/apdu_WhoHasLimits.go       |    2 +-
 .../bacgopes/{ => apdu}/apdu_WhoHasObject.go       |    2 +-
 .../bacgopes/{ => apdu}/apdu_WhoHasRequest.go      |    2 +-
 .../bacgopes/{ => apdu}/apdu_WhoIsRequest.go       |    7 +-
 .../{ => apdu}/apdu_WriteAccessSpecification.go    |    2 +-
 .../bacgopes/{ => apdu}/apdu_WriteGroupRequest.go  |    2 +-
 .../{ => apdu}/apdu_WritePropertyMultipleError.go  |    2 +-
 .../apdu_WritePropertyMultipleRequest.go           |    2 +-
 .../{ => apdu}/apdu_WritePropertyRequest.go        |    2 +-
 .../bacnetip/bacgopes/{ => apdu}/apdu__APDU.go     |    9 +-
 .../internal/bacnetip/bacgopes/apdu_IAmRequest.go  |   24 -
 plc4go/internal/bacnetip/bacgopes/{ => app}/app.go |    2 +-
 .../bacnetip/bacgopes/{ => app}/app_Application.go |   25 +-
 .../{ => app}/app_ApplicationIOController.go       |   24 +-
 .../app_ApplicationIOController_plc4xgen.go        |    2 +-
 .../bacgopes/{ => app}/app_Application_plc4xgen.go |    2 +-
 .../{ => app}/app_BIPForeignApplication.go         |   13 +-
 .../{ => app}/app_BIPNetworkApplication.go         |   26 +-
 .../bacgopes/{ => app}/app_BIPSimpleApplication.go |   13 +-
 .../{ => app}/app_BIPSimpleApplication_plc4xgen.go |    2 +-
 .../bacgopes/{ => appservice}/app_DeviceInfo.go    |    8 +-
 .../{ => appservice}/app_DeviceInfoCache.go        |    4 +-
 .../app_DeviceInfoCache_plc4xgen.go                |    2 +-
 .../{ => appservice}/app_DeviceInfo_plc4xgen.go    |    2 +-
 .../bacgopes/{ => appservice}/appservice.go        |    2 +-
 .../appservice_ApplicationServiceAccessPoint.go    |   35 +-
 ...rvice_ApplicationServiceAccessPoint_plc4xgen.go |    2 +-
 .../{ => appservice}/appservice_ClientSSM.go       |   13 +-
 .../bacgopes/{ => appservice}/appservice_SSM.go    |   12 +-
 .../{ => appservice}/appservice_ServerSSM.go       |    9 +-
 .../appservice_StateMachineAccessPoint.go          |   35 +-
 .../appservice_StateMachineAccessPoint_plc4xgen.go |    2 +-
 .../bacnetip/bacgopes/basetypes/basetypes.go       | 5599 ++++++++++++++++++++
 .../internal/bacnetip/bacgopes/{ => bvll}/bvll.go  |    6 +-
 .../bacnetip/bacgopes/{ => bvll}/bvll_BVLCI.go     |   20 +-
 .../bacgopes/{ => bvll}/bvll_BVLCI_plc4xgen.go     |   14 +-
 .../bacnetip/bacgopes/{ => bvll}/bvll_BVLPDU.go    |   23 +-
 .../bacgopes/{ => bvll}/bvll_BVLPDU_plc4xgen.go    |    4 +-
 .../bvll_DeleteForeignDeviceTableEntry.go          |    7 +-
 .../bvll_DistributeBroadcastToNetwork.go           |    7 +-
 .../bacnetip/bacgopes/{ => bvll}/bvll_FDTEntry.go  |    8 +-
 .../bacgopes/{ => bvll}/bvll_ForwardedNPDU.go      |    9 +-
 .../{ => bvll}/bvll_OriginalBroadcastNPDU.go       |    7 +-
 .../{ => bvll}/bvll_OriginalUnicastNPDU.go         |    7 +-
 .../bvll_ReadBroadcastDistributionTable.go         |    7 +-
 .../bvll_ReadBroadcastDistributionTableAck.go      |    7 +-
 .../{ => bvll}/bvll_ReadForeignDeviceTable.go      |    7 +-
 .../{ => bvll}/bvll_ReadForeignDeviceTableAck.go   |    7 +-
 .../{ => bvll}/bvll_RegisterForeignDevice.go       |    7 +-
 .../bacnetip/bacgopes/{ => bvll}/bvll_Result.go    |    7 +-
 .../bvll_WriteBroadcastDistributionTable.go        |    7 +-
 .../appservice__MultiplexClient_plc4xgen.go        |    2 +-
 .../bacgopes/{ => bvllservice}/bvllservice.go      |    2 +-
 .../{ => bvllservice}/bvllservice_AnnexJCodec.go   |   19 +-
 .../bvllservice_AnnexJCodec_plc4xgen.go            |    2 +-
 .../{ => bvllservice}/bvllservice_BIPBBMD.go       |   50 +-
 .../bvllservice_BIPBBMD_plc4xgen.go                |    5 +-
 .../{ => bvllservice}/bvllservice_BIPForeign.go    |   22 +-
 .../bvllservice_BIPForeign_plc4xgen.go             |    2 +-
 .../{ => bvllservice}/bvllservice_BIPSAP.go        |   17 +-
 .../{ => bvllservice}/bvllservice_BIPSimple.go     |   21 +-
 .../bvllservice_BIPSimple_plc4xgen.go              |    2 +-
 .../bvllservice_UDPMultiplexer.go                  |   31 +-
 .../bvllservice_UDPMultiplexer_plc4xgen.go}        |    8 +-
 .../bvllservice__MultiplexClient.go                |    5 +-
 .../bvllservice__MultiplexServer.go                |    5 +-
 .../bvllservice__MultiplexServer_plc4xgen.go       |    2 +-
 .../{bvllservice.go => capability/capability.go}   |    2 +-
 .../capability_Capability.go}                      |   19 +-
 .../capability_Capability_plc4xgen.go              |    2 +-
 .../capability_Collector.go}                       |   20 +-
 .../capability_Collector_plc4xgen.go               |    2 +-
 .../internal/bacnetip/bacgopes/{ => comm}/comm.go  |    6 +-
 .../{ => comm}/comm_ApplicationServiceElement.go   |   16 +-
 .../bacnetip/bacgopes/{ => comm}/comm_Client.go    |    6 +-
 .../bacnetip/bacgopes/{ => comm}/comm_Server.go    |   12 +-
 .../bacgopes/{ => comm}/comm_ServiceAccessPoint.go |   12 +-
 .../comm_applicationServiceElement_plc4xgen.go}    |    4 +-
 .../bacgopes/{ => comm}/comm_client_plc4xgen.go    |    2 +-
 .../bacgopes/{ => comm}/comm_server_plc4xgen.go    |    2 +-
 .../{ => comm}/comm_serviceAccessPoint_plc4xgen.go |    2 +-
 .../internal/bacnetip/bacgopes/{ => comp}/comp.go  |  180 +-
 .../{ => constructeddata}/constructeddata.go       |   54 +-
 .../bacnetip/bacgopes/constructors/bvll.go         |  125 -
 .../bacnetip/bacgopes/constructors/npdu.go         |  129 -
 .../bacgopes/constructors/primitivedata.go         |  286 -
 .../internal/bacnetip/bacgopes/{ => core}/core.go  |    9 +-
 .../bacnetip/bacgopes/{ => debugging}/debugging.go |    3 +-
 .../bacgopes/debugging_DebugContents_plc4xgen.go   |   68 -
 .../bacnetip/bacgopes/deleteme/deleteme.go         |   65 +
 .../internal/bacnetip/bacgopes/{ => iocb}/iocb.go  |    2 +-
 .../bacnetip/bacgopes/{ => iocb}/iocb_IOCB.go      |   18 +-
 .../bacgopes/{ => iocb}/iocb_IOCB_plc4xgen.go      |    2 +-
 .../bacgopes/{ => iocb}/iocb_IOController.go       |   20 +-
 .../{ => iocb}/iocb_IOController_plc4xgen.go       |    2 +-
 .../bacgopes/{ => iocb}/iocb_IOQController.go      |   56 +-
 .../{ => iocb}/iocb_IOQController_plc4xgen.go      |    8 +-
 .../bacnetip/bacgopes/{ => iocb}/iocb_IOQueue.go   |   40 +-
 .../bacgopes/{ => iocb}/iocb_IOQueue_plc4xgen.go   |    2 +-
 .../bacgopes/{ => iocb}/iocb_SieveQueue.go         |    6 +-
 .../{ => iocb}/iocb_SieveQueue_plc4xgen.go         |    2 +-
 .../{ => local/device}/local_device_LocalDevice.go |    4 +-
 .../local_device_LocalDeviceObject_plc4xgen.go     |    2 +-
 .../bacgopes/{ => netservice}/netservice.go        |    4 +-
 .../{ => netservice}/netservice_NetworkAdapter.go  |   13 +-
 .../netservice_NetworkAdapter_plc4xgen.go          |    2 +-
 .../netservice_NetworkServiceAccessPoint.go        |   91 +-
 ...etservice_NetworkServiceAccessPoint_plc4xgen.go |    2 +-
 .../netservice_NetworkServiceElement.go            |   52 +-
 .../netservice_NetworkServiceElement_plc4xgen.go   |    2 +-
 .../{ => netservice}/netservice_RouterInfoCache.go |    8 +-
 .../netservice_RouterInfoCache_plc4xgen.go         |    2 +-
 .../netservice_RouterInfo_plc4xgen.go              |    2 +-
 .../{ => netservice}/netservice_Router_plc4xgen.go |    2 +-
 .../internal/bacnetip/bacgopes/{ => npdu}/npdu.go  |    6 +-
 .../npdu_DisconnectConnectionToNetwork.go          |    9 +-
 .../npdu_EstablishConnectionToNetwork.go           |    9 +-
 .../bacgopes/{ => npdu}/npdu_IAmRouterToNetwork.go |    9 +-
 .../{ => npdu}/npdu_ICouldBeRouterToNetwork.go     |   11 +-
 .../{ => npdu}/npdu_InitializeRoutingTable.go      |   11 +-
 .../{ => npdu}/npdu_InitializeRoutingTableAck.go   |   11 +-
 .../bacnetip/bacgopes/{ => npdu}/npdu_NPCI.go      |  123 +-
 .../bacnetip/bacgopes/{ => npdu}/npdu_NPDU.go      |   32 +-
 .../bacgopes/{ => npdu}/npdu_NetworkNumberIs.go    |   23 +-
 .../{ => npdu}/npdu_RejectMessageToNetwork.go      |    9 +-
 .../{ => npdu}/npdu_RouterAvailableToNetwork.go    |    9 +-
 .../{ => npdu}/npdu_RouterBusyToNetwork.go         |    9 +-
 .../bacgopes/{ => npdu}/npdu_RoutingTableEntry.go  |   12 +-
 .../{ => npdu}/npdu_WhatIsNetworkNumber.go         |    9 +-
 .../{ => npdu}/npdu_WhoIsRouterToNetwork.go        |    9 +-
 .../bacnetip/bacgopes/{ => object}/object.go       |    2 +-
 .../bacgopes/{ => object}/object_Property.go       |    2 +-
 .../object_ReadWritePropertyServices.go            |    4 +-
 .../object_ReadWritePropertyServices_plc4xgen.go   |    2 +-
 .../bacnetip/bacgopes/{ => pdu}/comm__PCI.go       |   18 +-
 plc4go/internal/bacnetip/bacgopes/{ => pdu}/pdu.go |    6 +-
 .../bacnetip/bacgopes/{ => pdu}/pdu_Address.go     |   21 +-
 .../bacgopes/{ => pdu}/pdu_Address_plc4xgen.go     |    2 +-
 .../bacnetip/bacgopes/{ => pdu}/pdu_PCI.go         |   10 +-
 .../bacnetip/bacgopes/{ => pdu}/pdu_PDU.go         |   10 +-
 .../bacnetip/bacgopes/{ => pdu}/pdu_PDUData.go     |   17 +-
 .../pdu__PDUData_plc4xgen.go}                      |    4 +-
 .../bacgopes/{ => primitivedata}/primitivedata.go  |    2 +-
 .../primitivedata_ApplicationTag.go                |    5 +-
 .../{ => primitivedata}/primitivedata_Atomic.go    |    2 +-
 .../{ => primitivedata}/primitivedata_BitString.go |    4 +-
 .../{ => primitivedata}/primitivedata_Boolean.go   |    4 +-
 .../primitivedata_CharacterString.go               |    5 +-
 .../primitivedata_ClosingTag.go                    |    9 +-
 .../primitivedata_CommonMath.go                    |    2 +-
 .../primitivedata_ContextTag.go                    |    5 +-
 .../{ => primitivedata}/primitivedata_Date.go      |   29 +-
 .../{ => primitivedata}/primitivedata_Double.go    |    4 +-
 .../primitivedata_Enumeration.go                   |    6 +-
 .../{ => primitivedata}/primitivedata_Integer.go   |    4 +-
 .../{ => primitivedata}/primitivedata_Null.go      |    4 +-
 .../primitivedata_ObjectIdentifier.go              |    4 +-
 .../primitivedata_ObjectType.go                    |    8 +-
 .../primitivedata_OctetString.go                   |    5 +-
 .../primitivedata_OpeningTag.go                    |    9 +-
 .../{ => primitivedata}/primitivedata_Real.go      |    4 +-
 .../{ => primitivedata}/primitivedata_Tag.go       |   11 +-
 .../{ => primitivedata}/primitivedata_TagList.go   |    5 +-
 .../{ => primitivedata}/primitivedata_Time.go      |   26 +-
 .../{ => primitivedata}/primitivedata_Unsigned.go  |    4 +-
 .../primitivedata_Unsigned16.go                    |    4 +-
 .../{ => primitivedata}/primitivedata_Unsigned8.go |    4 +-
 .../bacnetip/bacgopes/service/Subscription.go      |    9 +-
 .../bacgopes/service/cov_ActiveCOVSubscription.go  |    4 +-
 .../bacgopes/service/cov_ChangeOfValuesServices.go |    6 +-
 .../{ => service}/service_device_Device.go         |    2 +-
 .../service_device_WhoIsIAmServices.go             |   37 +-
 .../service_device_WhoIsIAmServices_plc4xgen.go}   |    4 +-
 .../internal/bacnetip/bacgopes/{ => task}/task.go  |    2 +-
 .../bacgopes/{ => task}/task_OneShotDeleteTask.go  |    2 +-
 .../{ => task}/task_OneShotDeleteTask_plc4xgen.go  |    2 +-
 .../{ => task}/task_OneShotFunctionTask.go         |    4 +-
 .../task_OneShotFunctionTask_plc4xgen.go           |    2 +-
 .../bacgopes/{ => task}/task_OneShotTask.go        |    2 +-
 .../{ => task}/task_RecurringFunctionTask.go       |    4 +-
 .../bacgopes/{ => task}/task_RecurringTask.go      |    2 +-
 .../bacnetip/bacgopes/{ => task}/task_Task.go      |    2 +-
 .../bacgopes/{ => task}/task_TaskManager.go        |   37 +-
 .../bacgopes/{ => task}/task_Task_plc4xgen.go      |    2 +-
 .../bacgopes/{ => task}/task_taskItem_plc4xgen.go  |    2 +-
 .../bacgopes/{constructors => tests/quick}/apdu.go |   13 +-
 .../internal/bacnetip/bacgopes/tests/quick/bvll.go |  128 +
 .../quick}/constructeddata.go                      |    8 +-
 .../internal/bacnetip/bacgopes/tests/quick/npdu.go |  130 +
 .../bacgopes/{constructors => tests/quick}/pdu.go  |   20 +-
 .../bacnetip/bacgopes/tests/quick/primitivedata.go |  278 +
 .../bacnetip/bacgopes/tests/state_machine.go       |  159 +-
 .../tests/state_machine_ClientStateMachine.go      |   21 +-
 .../tests/state_machine_ServerStateMachine.go      |   11 +-
 .../bacnetip/bacgopes/tests/state_machine_State.go |   46 +-
 .../bacgopes/tests/state_machine_StateMachine.go   |   57 +-
 .../bacgopes/tests/state_machine_TrafficLog.go     |   13 +-
 .../bacgopes/tests/task_TimeoutTask_plc4xgen.go    |   40 +-
 ...PSimpleApplicationLayerStateMachine_plc4xgen.go |  108 +-
 .../tests/test_bvll/FauxMultiplexer_plc4xgen.go    |   36 +-
 .../bacnetip/bacgopes/tests/test_bvll/helpers.go   |  338 +-
 .../bacgopes/tests/test_bvll/test_bbmd_test.go     |   92 +-
 .../bacgopes/tests/test_bvll/test_codec_test.go    |  219 +-
 .../bacgopes/tests/test_bvll/test_foreign_test.go  |  124 +-
 .../bacgopes/tests/test_bvll/test_simple_test.go   |   60 +-
 .../tests/test_comm/test_capability_test.go        |   17 +-
 .../tests/test_constructed_data/helpers.go         |   12 +-
 .../test_constructed_data/test_sequence_test.go    |    3 +-
 .../ApplicationLayerStateMachine_plc4xgen.go       |   90 +-
 .../tests/test_network/ApplicationNode_plc4xgen.go |   72 +-
 .../bacgopes/tests/test_network/helpers.go         |  201 +-
 .../bacgopes/tests/test_network/test_net_1_test.go |   35 +-
 .../bacgopes/tests/test_network/test_net_2_test.go |   38 +-
 .../bacgopes/tests/test_network/test_net_3_test.go |   52 +-
 .../bacnetip/bacgopes/tests/test_npdu/helpers.go   |   33 +-
 .../bacgopes/tests/test_npdu/test_codec_test.go    |  238 +-
 .../bacgopes/tests/test_pdu/test_address_test.go   |  366 +-
 .../tests/test_primitive_data/common_test.go       |   14 +-
 .../test_primitive_data/test_bit_string_test.go    |   63 +-
 .../tests/test_primitive_data/test_boolean_test.go |   49 +-
 .../test_character_string_test.go                  |   55 +-
 .../tests/test_primitive_data/test_date_test.go    |   59 +-
 .../tests/test_primitive_data/test_double_test.go  |   49 +-
 .../test_primitive_data/test_enumerated_test.go    |   64 +-
 .../tests/test_primitive_data/test_integer_test.go |   54 +-
 .../tests/test_primitive_data/test_null_test.go    |   47 +-
 .../test_object_identifier_test.go                 |   85 +-
 .../test_primitive_data/test_object_type_test.go   |   57 +-
 .../test_primitive_data/test_octet_string_test.go  |   47 +-
 .../tests/test_primitive_data/test_real_test.go    |   49 +-
 .../tests/test_primitive_data/test_tag_test.go     |  252 +-
 .../tests/test_primitive_data/test_time_test.go    |   77 +-
 .../test_primitive_data/test_unsigned_test.go      |   59 +-
 .../tests/test_segmentation/test_1_test.go         |  117 +-
 .../ApplicationStateMachine_plc4xgen.go            |   90 +-
 .../tests/test_service/SnifferNode_plc4xgen.go     |   36 +-
 .../test_service/SnifferStateMachine_plc4xgen.go   |   36 +-
 .../bacgopes/tests/test_service/helpers.go         |  153 +-
 .../bacgopes/tests/test_service/test_cov_test.go   |    9 +-
 .../test_client_state_machine_test.go              |   14 +-
 .../test_server_state_machine_test.go              |   14 +-
 .../test_service_access_point_test.go              |   59 +-
 .../test_utilities/test_state_machine_test.go      |  162 +-
 .../tests/test_utilities/test_time_machine_test.go |  144 +-
 .../tests/test_vlan/test_ipnetwork_test.go         |  168 +-
 .../bacgopes/tests/test_vlan/test_network_test.go  |  124 +-
 .../bacnetip/bacgopes/tests/time_machine.go        |   34 +-
 ...ped_classes_TrappedApplicationServiceElement.go |   46 +-
 .../tests/trapped_classes_TrappedClient.go         |   29 +-
 .../trapped_classes_TrappedClient_plc4xgen.go      |   40 +-
 .../tests/trapped_classes_TrappedServer.go         |   29 +-
 .../trapped_classes_TrappedServerStateMachine.go   |    6 +-
 .../trapped_classes_TrappedServer_plc4xgen.go      |   40 +-
 .../trapped_classes_TrappedServiceAccessPoint.go   |   44 +-
 .../bacgopes/tests/trapped_classes_TrappedState.go |   12 +-
 .../tests/trapped_classes_TrappedStateMachine.go   |   21 +-
 .../bacgopes/tests/trapped_classes_Trapper.go      |   42 +-
 plc4go/internal/bacnetip/bacgopes/tests/util.go    |    9 +-
 plc4go/internal/bacnetip/bacgopes/{ => udp}/udp.go |    2 +-
 .../bacnetip/bacgopes/{ => udp}/udp_UDPActor.go    |    8 +-
 .../bacgopes/{ => udp}/udp_UDPActor_plc4xgen.go    |    2 +-
 .../bacnetip/bacgopes/{ => udp}/udp_UDPDirector.go |   48 +-
 .../bacgopes/{ => udp}/udp_UDPDirector_plc4xgen.go |    2 +-
 .../internal/bacnetip/bacgopes/{ => vlan}/vlan.go  |    2 +-
 .../bacnetip/bacgopes/{ => vlan}/vlan_IPNetwork.go |    8 +-
 .../bacnetip/bacgopes/{ => vlan}/vlan_IPNode.go    |    4 +-
 .../bacgopes/{ => vlan}/vlan_IPNode_plc4xgen.go    |    2 +-
 .../bacnetip/bacgopes/{ => vlan}/vlan_IPRouter.go  |    8 +-
 .../bacgopes/{ => vlan}/vlan_IPRouterNode.go       |   15 +-
 .../{ => vlan}/vlan_IPRouterNode_plc4xgen.go       |    2 +-
 .../bacnetip/bacgopes/{ => vlan}/vlan_Network.go   |   10 +-
 .../bacnetip/bacgopes/{ => vlan}/vlan_Node.go      |   22 +-
 .../bacgopes/{ => vlan}/vlan_Node_plc4xgen.go      |    2 +-
 .../bacgopes/{ => vlan}/vlan_TrafficLogger.go      |    4 +-
 381 files changed, 10179 insertions(+), 4308 deletions(-)

diff --git a/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go b/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
index 23cd93b5d6..01c3344a07 100644
--- a/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
+++ b/plc4go/internal/bacnetip/ApplicationLayerMessageCodec.go
@@ -22,6 +22,11 @@ package bacnetip
 import (
 	"context"
 	"fmt"
+	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/app"
+	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/appservice"
+	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/iocb"
+	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/local/device"
+	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 	"net"
 	"net/url"
 	"time"
@@ -29,7 +34,6 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
-	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes"
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi"
 	"github.com/apache/plc4x/plc4go/spi/transports/udp"
@@ -39,9 +43,9 @@ import (
 //
 //go:generate plc4xGenerator -type=ApplicationLayerMessageCodec
 type ApplicationLayerMessageCodec struct {
-	bipSimpleApplication *bacgopes.BIPSimpleApplication
+	bipSimpleApplication *app.BIPSimpleApplication
 	messageCode          *MessageCodec
-	deviceInfoCache      bacgopes.DeviceInfoCache `directSerialize:"true"`
+	deviceInfoCache      appservice.DeviceInfoCache `directSerialize:"true"`
 
 	localAddress  *net.UDPAddr `stringer:"true"`
 	remoteAddress *net.UDPAddr `stringer:"true"`
@@ -62,13 +66,13 @@ func NewApplicationLayerMessageCodec(localLog zerolog.Logger, udpTransport *udp.
 
 		log: localLog,
 	}
-	address, err := bacgopes.NewAddress(localLog, localAddress)
+	address, err := pdu.NewAddress(localLog, localAddress)
 	if err != nil {
 		return nil, errors.Wrap(err, "error creating address")
 	}
 	// TODO: workaround for strange address parsing
-	address.AddrTuple = bacgopes.NewAddressTuple(fmt.Sprintf("%d.%d.%d.%d", address.AddrAddress[0], address.AddrAddress[1], address.AddrAddress[2], address.AddrAddress[3]), *address.AddrPort)
-	application, err := bacgopes.NewBIPSimpleApplication(localLog, &bacgopes.LocalDeviceObject{
+	address.AddrTuple = pdu.NewAddressTuple(fmt.Sprintf("%d.%d.%d.%d", address.AddrAddress[0], address.AddrAddress[1], address.AddrAddress[2], address.AddrAddress[3]), *address.AddrPort)
+	application, err := app.NewBIPSimpleApplication(localLog, &device.LocalDeviceObject{
 		NumberOfAPDURetries: func() *uint { retries := uint(10); return &retries }(),
 	}, *address, &a.deviceInfoCache, nil)
 	if err != nil {
@@ -108,11 +112,11 @@ func (m *ApplicationLayerMessageCodec) IsRunning() bool {
 }
 
 func (m *ApplicationLayerMessageCodec) Send(message spi.Message) error {
-	address, err := bacgopes.NewAddress(m.log, m.remoteAddress)
+	address, err := pdu.NewAddress(m.log, m.remoteAddress)
 	if err != nil {
 		return err
 	}
-	iocb, err := bacgopes.NewIOCB(m.log, bacgopes.NewPDU(message, bacgopes.WithPDUDestination(address)), address)
+	iocb, err := iocb.NewIOCB(m.log, pdu.NewPDU(message, pdu.WithPDUDestination(address)), address)
 	if err != nil {
 		return errors.Wrap(err, "error creating IOCB")
 	}
@@ -142,11 +146,11 @@ func (m *ApplicationLayerMessageCodec) Expect(ctx context.Context, acceptsMessag
 }
 
 func (m *ApplicationLayerMessageCodec) SendRequest(ctx context.Context, message spi.Message, acceptsMessage spi.AcceptsMessage, handleMessage spi.HandleMessage, handleError spi.HandleError, ttl time.Duration) error {
-	address, err := bacgopes.NewAddress(m.log, m.remoteAddress)
+	address, err := pdu.NewAddress(m.log, m.remoteAddress)
 	if err != nil {
 		return err
 	}
-	iocb, err := bacgopes.NewIOCB(m.log, bacgopes.NewPDU(message, bacgopes.WithPDUDestination(address)), address)
+	iocb, err := iocb.NewIOCB(m.log, pdu.NewPDU(message, pdu.WithPDUDestination(address)), address)
 	if err != nil {
 		return errors.Wrap(err, "error creating IOCB")
 	}
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu.go
similarity index 97%
rename from plc4go/internal/bacnetip/bacgopes/apdu.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu.go
index 498b4ac093..a312b96aa5 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu.go
@@ -17,9 +17,13 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
-import readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+import (
+	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+)
 
 var APDUTypes map[readWriteModel.ApduType]func() Decoder
 
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_APCI.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCI.go
similarity index 91%
rename from plc4go/internal/bacnetip/bacgopes/apdu_APCI.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCI.go
index d47dd4ee2c..25263dd06b 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_APCI.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCI.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	"context"
@@ -26,8 +26,13 @@ import (
 
 	"github.com/pkg/errors"
 
-	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/debugging"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/deleteme"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type APCI interface {
@@ -58,8 +63,8 @@ type APCI interface {
 	getApduMaxResp() *uint8
 	setApduService(*uint8)
 	getApduService() *uint8
-	setApduInvokeID(*uint8)
-	getApduInvokeID() *uint8
+	SetApduInvokeID(*uint8)
+	GetApduInvokeID() *uint8
 	setApduAbortRejectReason(*uint8)
 	getApduAbortRejectReason() *uint8
 
@@ -67,8 +72,8 @@ type APCI interface {
 }
 
 type _APCI struct {
-	*_PCI
-	*DebugContents
+	PCI
+	*DebugContents `ignore:"true"`
 
 	apduType              *readWriteModel.ApduType
 	apduSeg               bool   // segmented
@@ -92,7 +97,7 @@ var _ APCI = (*_APCI)(nil)
 
 func NewAPCI(apdu readWriteModel.APDU) APCI {
 	a := &_APCI{}
-	a._PCI = newPCI(apdu, nil, nil, nil, false, readWriteModel.NPDUNetworkPriority_NORMAL_MESSAGE)
+	a.PCI = NewPCI(apdu, nil, nil, nil, false, readWriteModel.NPDUNetworkPriority_NORMAL_MESSAGE)
 	if apdu != nil {
 		apduType := apdu.GetApduType()
 		a.apduType = &apduType
@@ -166,10 +171,10 @@ func (a *_APCI) setApduService(apduService *uint8) {
 func (a *_APCI) getApduService() *uint8 {
 	return a.apduService
 }
-func (a *_APCI) setApduInvokeID(apduInvokeID *uint8) {
+func (a *_APCI) SetApduInvokeID(apduInvokeID *uint8) {
 	a.apduInvokeID = apduInvokeID
 }
-func (a *_APCI) getApduInvokeID() *uint8 {
+func (a *_APCI) GetApduInvokeID() *uint8 {
 	return a.apduInvokeID
 }
 func (a *_APCI) setApduAbortRejectReason(apduAbortRejectReason *uint8) {
@@ -184,7 +189,7 @@ func (a *_APCI) getAPCI() APCI {
 }
 
 func (a *_APCI) Update(apci Arg) error {
-	if err := a._PCI.Update(apci); err != nil {
+	if err := a.PCI.Update(apci); err != nil {
 		return errors.Wrap(err, "error updating _PCI")
 	}
 	switch apci := apci.(type) {
@@ -200,7 +205,7 @@ func (a *_APCI) Update(apci Arg) error {
 		a.apduMaxSegs = apci.getApduMaxSegs()
 		a.apduMaxResp = apci.getApduMaxResp()
 		a.apduService = apci.getApduService()
-		a.apduInvokeID = apci.getApduInvokeID()
+		a.apduInvokeID = apci.GetApduInvokeID()
 		a.apduAbortRejectReason = apci.getApduAbortRejectReason()
 		return nil
 	default:
@@ -307,28 +312,28 @@ func (a *_APCI) Encode(pdu Arg) error {
 }
 
 func (a *_APCI) Decode(pdu Arg) error {
-	if err := a._PCI.Update(pdu); err != nil {
+	if err := a.PCI.Update(pdu); err != nil {
 		return errors.Wrap(err, "error updating pdu")
 	}
-	switch rm := a.rootMessage.(type) {
-	case *messageBridge:
+	switch rm := a.GetRootMessage().(type) {
+	case MessageBridge:
 		data := rm.GetPduData()
 		parse, err := readWriteModel.APDUParse[readWriteModel.APDU](context.Background(), data, uint16(len(data)))
 		if err != nil {
 			return errors.Wrap(err, "error parsing apdu")
 		}
-		a.rootMessage = parse
+		a.SetRootMessage(parse)
 	}
 	readBytes := 0
 
 	// simulate the APCI type decode
 	readBytes++
-	switch rm := a.rootMessage.(type) {
+	switch rm := a.GetRootMessage().(type) {
 	case readWriteModel.APDU:
 		apduType := rm.GetApduType()
 		a.apduType = &apduType
 	}
-	switch rm := a.rootMessage.(type) {
+	switch rm := a.GetRootMessage().(type) {
 	case readWriteModel.APDUConfirmedRequest:
 		a.apduSeg = rm.GetSegmentedMessage()
 		a.apduMor = rm.GetMoreFollows()
@@ -414,7 +419,7 @@ func (a *_APCI) Decode(pdu Arg) error {
 
 func (a *_APCI) deepCopy() *_APCI {
 	return &_APCI{
-		_PCI:                  a._PCI.deepCopy(),
+		PCI:                   a.PCI.DeepCopy().(PCI),
 		apduType:              CopyPtr(a.apduType),
 		apduSeg:               a.apduSeg,
 		apduMor:               a.apduMor,
@@ -432,8 +437,8 @@ func (a *_APCI) deepCopy() *_APCI {
 }
 
 func (a *_APCI) String() string {
-	if globals.ExtendedPDUOutput {
-		return fmt.Sprintf("APCI{%s}", a._PCI) // TODO: add other fields
+	if ExtendedPDUOutput {
+		return fmt.Sprintf("APCI{%s}", a.PCI) // TODO: add other fields
 	} else {
 		sname := fmt.Sprintf("%T", a)
 
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_APCISequence.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCISequence.go
similarity index 86%
rename from plc4go/internal/bacnetip/bacgopes/apdu_APCISequence.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCISequence.go
index 67b9dc9c4c..b2f1c6b838 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_APCISequence.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_APCISequence.go
@@ -17,12 +17,15 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	"github.com/pkg/errors"
 
-	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/constructeddata"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/primitivedata"
 )
 
 // APCISequenceContract provides a set of functions which can be overwritten by a sub struct
@@ -46,7 +49,7 @@ type APCISequence struct {
 	tagList *TagList
 }
 
-func NewAPCISequence(apdu readWriteModel.APDU, opts ...func(*APCISequence)) (*APCISequence, error) {
+func NewAPCISequence(args Args, kwargs KWArgs, opts ...func(*APCISequence)) (*APCISequence, error) {
 	a := &APCISequence{}
 	for _, opt := range opts {
 		opt(a)
@@ -56,9 +59,10 @@ func NewAPCISequence(apdu readWriteModel.APDU, opts ...func(*APCISequence)) (*AP
 	} else {
 		a._contract.(APCISequenceContractRequirement).SetAPCISequence(a)
 	}
+	apdu := Get[APDU](args, 0) // TODO: might break but should be fine as we are a A*
 	a._APCI = NewAPCI(apdu).(*_APCI)
 	var err error
-	a.Sequence, err = NewSequence(NoKWArgs, WithSequenceExtension(a._contract))
+	a.Sequence, err = NewSequence(args, kwargs, WithSequenceExtension(a._contract))
 	if err != nil {
 		return nil, errors.Wrap(err, "error creating sequence")
 	}
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_APDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_APDU.go
similarity index 79%
rename from plc4go/internal/bacnetip/bacgopes/apdu_APDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_APDU.go
index 5ffb362399..00e6043f35 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_APDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_APDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	"context"
@@ -26,9 +26,13 @@ import (
 
 	"github.com/pkg/errors"
 
-	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/debugging"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type APDU interface {
@@ -39,7 +43,7 @@ type APDU interface {
 
 type __APDU struct {
 	*_APCI
-	*_PDUData
+	PDUData
 
 	// post construct function
 	_postConstruct []func()
@@ -54,14 +58,15 @@ func NewAPDU(apdu readWriteModel.APDU, opts ...func(*__APDU)) (APDU, error) {
 		opt(a)
 	}
 	a._APCI = NewAPCI(apdu).(*_APCI)
-	a._PDUData = NewPDUData(NoArgs).(*_PDUData)
+	a.PDUData = NewPDUData(NoArgs)
 	// Do a post construct for a bit more easy initialization
 	for _, f := range a._postConstruct {
 		f()
 	}
 	a._postConstruct = nil
-	if a.rootMessage != nil {
-		a.data, _ = a.rootMessage.Serialize()
+	if a.GetRootMessage() != nil {
+		data, _ := a.GetRootMessage().Serialize()
+		a.SetPduData(data)
 	}
 	return a, nil
 }
@@ -69,7 +74,7 @@ func NewAPDU(apdu readWriteModel.APDU, opts ...func(*__APDU)) (APDU, error) {
 func WithAPDUUserData(userData spi.Message) func(*__APDU) {
 	return func(apdu *__APDU) {
 		apdu._postConstruct = append(apdu._postConstruct, func() {
-			apdu.pduUserData = userData
+			apdu.SetPDUUserData(userData)
 		})
 	}
 }
@@ -80,7 +85,7 @@ func (a *__APDU) Encode(pdu Arg) error {
 	}
 	switch pdu := pdu.(type) {
 	case PDUData:
-		pdu.PutData(a.data...)
+		pdu.PutData(a.GetPduData()...)
 	}
 	return nil
 }
@@ -107,13 +112,13 @@ func (a *__APDU) Decode(pdu Arg) error {
 	}
 	if rootMessage != nil {
 		// Overwrite the root message again so we can use it for matching
-		a.rootMessage = rootMessage
+		a.SetRootMessage(rootMessage)
 	}
 	return nil
 }
 
 func (a *__APDU) GetApduType() readWriteModel.ApduType {
-	switch rm := a.rootMessage.(type) {
+	switch rm := a.GetRootMessage().(type) {
 	case readWriteModel.APDU:
 		return rm.GetApduType()
 	default:
@@ -122,7 +127,7 @@ func (a *__APDU) GetApduType() readWriteModel.ApduType {
 }
 
 func (a *__APDU) GetApduLength() uint16 {
-	switch rm := a.rootMessage.(type) {
+	switch rm := a.GetRootMessage().(type) {
 	case readWriteModel.APDU:
 		return rm.GetApduLength()
 	default:
@@ -134,7 +139,7 @@ func (a *__APDU) IsAPDU() {
 }
 
 func (a *__APDU) deepCopy() *__APDU {
-	return &__APDU{_APCI: a._APCI.deepCopy(), _PDUData: a._PDUData.deepCopy()}
+	return &__APDU{_APCI: a._APCI.deepCopy(), PDUData: a.PDUData.DeepCopy().(PDUData)}
 }
 
 func (a *__APDU) DeepCopy() any {
@@ -142,10 +147,10 @@ func (a *__APDU) DeepCopy() any {
 }
 
 func (a *__APDU) String() string {
-	if globals.ExtendedPDUOutput {
-		return fmt.Sprintf("APDU{%s}", a._PCI)
+	if ExtendedPDUOutput {
+		return fmt.Sprintf("APDU{%s}", a.PCI)
 	} else {
-		pci := "\t" + strings.Join(strings.Split(a._PCI.String(), "\n"), "\n\t")
-		return fmt.Sprintf("<APDU instance at %p>\n%s\n\tpduData = x'%s'", a, pci, Btox(a.data, "."))
+		pci := "\t" + strings.Join(strings.Split(a.PCI.String(), "\n"), "\n\t")
+		return fmt.Sprintf("<APDU instance at %p>\n%s\n\tpduData = x'%s'", a, pci, Btox(a.GetPduData(), "."))
 	}
 }
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AbortPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AbortPDU.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AbortPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AbortPDU.go
index 2a3ea1761a..d81ef0b36c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AbortPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AbortPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AbortPDU struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AbortReason.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AbortReason.go
similarity index 90%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AbortReason.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AbortReason.go
index f8ec216c9a..ed5dfb150d 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AbortReason.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AbortReason.go
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
+
+import . "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/primitivedata"
 
 // TODO: implement it...
 type AbortReason struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AcknowledgeAlarmRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AcknowledgeAlarmRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AcknowledgeAlarmRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AcknowledgeAlarmRequest.go
index 8e641eda1d..27b410d049 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AcknowledgeAlarmRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AcknowledgeAlarmRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AcknowledgeAlarmRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AddListElementRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AddListElementRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AddListElementRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AddListElementRequest.go
index 3db1aef47d..ff49166242 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AddListElementRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AddListElementRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AddListElementRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodChoice.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodChoice.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodChoice.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodChoice.go
index d5a0a960eb..41982234d5 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodChoice.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodChoice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileACKAccessMethodChoice struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodRecordAccess.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodRecordAccess.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodRecordAccess.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodRecordAccess.go
index 00d6363f25..e4a5f49b32 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodRecordAccess.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodRecordAccess.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileACKAccessMethodRecordAccess struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodStreamAccess.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodStreamAccess.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodStreamAccess.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodStreamAccess.go
index 9d6879644c..c01d1b9e4c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileACKAccessMethodStreamAccess.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileACKAccessMethodStreamAccess.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileACKAccessMethodStreamAccess struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequest.go
index 60c8259dd7..33a0875340 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoice.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoice.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoice.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoice.go
index 5fb29bfb48..744923dfc4 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoice.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileRequestAccessMethodChoice struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoiceRecordAccess.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoiceRecordAccess.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoiceRecordAccess.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoiceRecordAccess.go
index 7890c2a7ad..37e4ed2c3e 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoiceRecordAccess.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoiceRecordAccess.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileRequestAccessMethodChoiceRecordAccess struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoiceStreamAccess.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoiceStreamAccess.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoiceStreamAccess.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoiceStreamAccess.go
index 855563e242..33095a3428 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicReadFileRequestAccessMethodChoiceStreamAccess.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicReadFileRequestAccessMethodChoiceStreamAccess.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileRequestAccessMethodChoiceStreamAccess struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileACK.go
index e0b20d4c29..c2782b86a0 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicWriteFileACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequest.go
index a80ee89b9d..e7f7b2ac84 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicWriteFileRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoice.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoice.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoice.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoice.go
index 5f5637a662..b0085c7954 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoice.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicWriteFileRequestAccessMethodChoice struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoiceRecordAccess.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoiceRecordAccess.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoiceRecordAccess.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoiceRecordAccess.go
index 2c9e0155b7..289f42e0c9 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoiceRecordAccess.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoiceRecordAccess.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicWriteFileRequestAccessMethodChoiceRecordAccess struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoiceStreamAccess.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoiceStreamAccess.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoiceStreamAccess.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoiceStreamAccess.go
index 10cd2e850a..5f804d2871 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AtomicWriteFileRequestAccessMethodChoiceStreamAccess.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AtomicWriteFileRequestAccessMethodChoiceStreamAccess.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicWriteFileRequestAccessMethodChoiceStreamAccess struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AuthenticateACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AuthenticateACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AuthenticateACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AuthenticateACK.go
index 782a4f1974..d179f36991 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AuthenticateACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AuthenticateACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AuthenticateACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_AuthenticateRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AuthenticateRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_AuthenticateRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_AuthenticateRequest.go
index 56d32c2c69..c9b4075592 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_AuthenticateRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_AuthenticateRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AuthenticateRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_COVNotificationParameters.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_COVNotificationParameters.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_COVNotificationParameters.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_COVNotificationParameters.go
index 8f62a589d3..c0df9dfc85 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_COVNotificationParameters.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_COVNotificationParameters.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type COVNotificationParameters struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ChangeListError.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ChangeListError.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ChangeListError.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ChangeListError.go
index 642d38d0a1..47e3cd12db 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ChangeListError.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ChangeListError.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ChangeListError struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ComplexAckPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ComplexAckPDU.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ComplexAckPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ComplexAckPDU.go
index 60e92ff1af..df9ee03707 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ComplexAckPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ComplexAckPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ComplexAckSequence.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ComplexAckSequence.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ComplexAckSequence.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ComplexAckSequence.go
index 722c66490d..a59a65180e 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ComplexAckSequence.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ComplexAckSequence.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ComplexAckSequence struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedCOVNotificationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedCOVNotificationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedCOVNotificationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedCOVNotificationRequest.go
index 8601110ff4..f9227ba8b7 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedCOVNotificationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedCOVNotificationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedCOVNotificationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedEventNotificationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedEventNotificationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedEventNotificationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedEventNotificationRequest.go
index b610f2fcb2..76285dfaf2 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedEventNotificationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedEventNotificationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedEventNotificationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferACK.go
index e94bc7cdbc..ebbeafb64a 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedPrivateTransferACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferError.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferError.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferError.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferError.go
index cf4505b6b0..72525c69a7 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferError.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferError.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedPrivateTransferError struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferRequest.go
index 104f2de06d..cd32c467a1 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedPrivateTransferRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedPrivateTransferRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import "fmt"
 
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedRequestPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedRequestPDU.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedRequestPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedRequestPDU.go
index fc46330ea8..eddadf4118 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedRequestPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedRequestPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	"github.com/pkg/errors"
@@ -49,7 +49,7 @@ func NewConfirmedRequestPDU(serviceRequest readWriteModel.BACnetConfirmedService
 		serviceChoice := uint8(serviceRequest.GetServiceChoice())
 		u.apduService = &serviceChoice
 	}
-	u.expectingReply = true
+	u.SetExpectingReply(true)
 	return u, nil
 }
 
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedRequestSequence.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedRequestSequence.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedRequestSequence.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedRequestSequence.go
index 3e62ea68f4..a2bbd59c36 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedRequestSequence.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedRequestSequence.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedRequestSequence struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedServiceChoice.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedServiceChoice.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedServiceChoice.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedServiceChoice.go
index 0e0d710874..39a10fd0d8 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedServiceChoice.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedServiceChoice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedServiceChoice struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequest.go
index aceb39d03c..4ced9e1003 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedTextMessageRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequestMessageClass.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequestMessageClass.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequestMessageClass.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequestMessageClass.go
index 35cafc962f..abeba5fb4f 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequestMessageClass.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequestMessageClass.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedTextMessageRequestMessageClass struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequestMessagePriority.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequestMessagePriority.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequestMessagePriority.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequestMessagePriority.go
index 7d0104d313..9604f82b50 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ConfirmedTextMessageRequestMessagePriority.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ConfirmedTextMessageRequestMessagePriority.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ConfirmedTextMessageRequestMessagePriority struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectACK.go
index 082642e5cb..81735cf780 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type CreateObjectACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectError.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectError.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectError.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectError.go
index 6bdd77a817..99a6028e05 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectError.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectError.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type CreateObjectError struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectRequest.go
index 6386989893..1ffabc74aa 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type CreateObjectRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectRequestObjectSpecifier.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectRequestObjectSpecifier.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectRequestObjectSpecifier.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectRequestObjectSpecifier.go
index 0077c501dd..e19c0fa28c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_CreateObjectRequestObjectSpecifier.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_CreateObjectRequestObjectSpecifier.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type CreateObjectRequestObjectSpecifier struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_DeleteObjectRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeleteObjectRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_DeleteObjectRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeleteObjectRequest.go
index 2790a91e0a..1090a197a3 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_DeleteObjectRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeleteObjectRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type DeleteObjectRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_DeviceCommunicationControlRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeviceCommunicationControlRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_DeviceCommunicationControlRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeviceCommunicationControlRequest.go
index 82e3df8e5b..1c4e884bea 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_DeviceCommunicationControlRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeviceCommunicationControlRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type DeviceCommunicationControlRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_DeviceCommunicationControlRequestEnableDisable.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeviceCommunicationControlRequestEnableDisable.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_DeviceCommunicationControlRequestEnableDisable.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeviceCommunicationControlRequestEnableDisable.go
index 525fea6809..5a340ab0a2 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_DeviceCommunicationControlRequestEnableDisable.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_DeviceCommunicationControlRequestEnableDisable.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type DeviceCommunicationControlRequestEnableDisable struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_Error.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_Error.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_Error.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_Error.go
index 909837bcec..331186e003 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_Error.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_Error.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type Error struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ErrorPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ErrorPDU.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ErrorPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ErrorPDU.go
index 834f9d42c8..a83f15e7c1 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ErrorPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ErrorPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ErrorPDU struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ErrorSequence.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ErrorSequence.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ErrorSequence.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ErrorSequence.go
index 22826e0a76..0521ae9a16 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ErrorSequence.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ErrorSequence.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ErrorSequence struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_EventNotificationParameters.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_EventNotificationParameters.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_EventNotificationParameters.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_EventNotificationParameters.go
index 75ce764793..39a5daaaf2 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_EventNotificationParameters.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_EventNotificationParameters.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type EventNotificationParameters struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryACK.go
index ab02682d33..facd060e9d 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetAlarmSummaryACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryAlarmSummary.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryAlarmSummary.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryAlarmSummary.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryAlarmSummary.go
index 8dae0149ee..842ab2504f 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryAlarmSummary.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryAlarmSummary.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetAlarmSummaryAlarmSummary struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryRequest.go
index 1d70a23bc4..db17b95250 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetAlarmSummaryRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetAlarmSummaryRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetAlarmSummaryRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryACK.go
index 003b7f84e1..b389774566 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEnrollmentSummaryACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryEnrollmentSummary.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryEnrollmentSummary.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryEnrollmentSummary.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryEnrollmentSummary.go
index 35b0c727fe..80f4bf278e 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryEnrollmentSummary.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryEnrollmentSummary.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEnrollmentSummaryEnrollmentSummary struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequest.go
index cb729f915c..98e33a60e7 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEnrollmentSummaryRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestAcknowledgmentFilterType.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestAcknowledgmentFilterType.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestAcknowledgmentFilterType.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestAcknowledgmentFilterType.go
index 9828e1ed13..85455094f2 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestAcknowledgmentFilterType.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestAcknowledgmentFilterType.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEnrollmentSummaryRequestAcknowledgmentFilterType struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestEventStateFilterType.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestEventStateFilterType.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestEventStateFilterType.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestEventStateFilterType.go
index 4b20411413..1e962550db 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestEventStateFilterType.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestEventStateFilterType.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEnrollmentSummaryRequestEventStateFilterType struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestPriorityFilterType.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestPriorityFilterType.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestPriorityFilterType.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestPriorityFilterType.go
index 98da49f33e..d9ef02de38 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEnrollmentSummaryRequestPriorityFilterType.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEnrollmentSummaryRequestPriorityFilterType.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEnrollmentSummaryRequestPriorityFilterType struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationACK.go
index 537516b6fc..ef45c1c117 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEventInformationACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationEventSummary.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationEventSummary.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationEventSummary.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationEventSummary.go
index 2d8173127a..84cbef2f44 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationEventSummary.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationEventSummary.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEventInformationEventSummary struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationRequest.go
index 383c938e40..88ad86c0fc 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GetEventInformationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GetEventInformationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GetEventInformationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_GroupChannelValue.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GroupChannelValue.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_GroupChannelValue.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_GroupChannelValue.go
index 368c9852ad..e5b2d7fb1f 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_GroupChannelValue.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_GroupChannelValue.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type GroupChannelValue struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu/apdu_IAmRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_IAmRequest.go
new file mode 100644
index 0000000000..a776d55793
--- /dev/null
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_IAmRequest.go
@@ -0,0 +1,77 @@
+/*
+ * 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
+ *
+ *   https://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 apdu
+
+import (
+	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/constructeddata"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/primitivedata"
+)
+
+type IAmRequest struct {
+	*UnconfirmedRequestSequence
+
+	serviceChoice    readWriteModel.BACnetUnconfirmedServiceChoice
+	sequenceElements []Element
+}
+
+func NewIAmRequest(args Args, kwargs KWArgs) (*IAmRequest, error) {
+	w := &IAmRequest{
+		serviceChoice: readWriteModel.BACnetUnconfirmedServiceChoice_WHO_IS,
+		sequenceElements: []Element{
+			NewElement("iAmDeviceIdentifier", Vs2E(NewObjectIdentifier)),
+			NewElement("maxAPDULengthAccepted", V2E(NewUnsigned)),
+			//NewElement("segmentationSupported", V2E(NewSegmentation)), // TODO: finish me
+			NewElement("vendorID", V2E(NewUnsigned)),
+		},
+	}
+	panic("finish me") // TODO
+	/*
+		var err error
+		w.UnconfirmedRequestSequence, err = NewUnconfirmedRequestSequence(
+			readWriteModel.NewBACnetUnconfirmedServiceRequestIAm(
+				readWriteModel.CreateBACnetContextTagUnsignedInteger(0, 0),
+				readWriteModel.CreateBACnetContextTagUnsignedInteger(1, 0),
+				0,
+			),
+			kwargs,
+			WithUnconfirmedRequestSequenceExtension(w),
+		)
+		if err != nil {
+			return nil, errors.Wrap(err, "error creating UnconfirmedRequestSequence")
+		}
+	*/
+
+	return w, nil
+}
+
+func (w *IAmRequest) GetServiceChoice() *readWriteModel.BACnetUnconfirmedServiceChoice {
+	return &w.serviceChoice
+}
+
+func (w *IAmRequest) GetSequenceElements() []Element {
+	return w.sequenceElements
+}
+
+func (w *IAmRequest) SetUnconfirmedRequestSequence(u *UnconfirmedRequestSequence) {
+	w.UnconfirmedRequestSequence = u
+}
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_IHaveRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_IHaveRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_IHaveRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_IHaveRequest.go
index 2a9cf9acf1..f41774a7c9 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_IHaveRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_IHaveRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type IHaveRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_LifeSafetyOperationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_LifeSafetyOperationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_LifeSafetyOperationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_LifeSafetyOperationRequest.go
index 34ad9f0872..6d6e32ad25 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_LifeSafetyOperationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_LifeSafetyOperationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type LifeSafetyOperationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_Range.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_Range.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_Range.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_Range.go
index 0501c4f5c7..3dcaa0340c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_Range.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_Range.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type Range struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_RangeByPosition.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeByPosition.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_RangeByPosition.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeByPosition.go
index c4900f08dd..c786fb7378 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_RangeByPosition.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeByPosition.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type RangeByPosition struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_RangeBySequenceNumber.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeBySequenceNumber.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_RangeBySequenceNumber.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeBySequenceNumber.go
index dde568bbb4..e3e9868375 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_RangeBySequenceNumber.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeBySequenceNumber.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type RangeBySequenceNumber struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_RangeByTime.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeByTime.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_RangeByTime.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeByTime.go
index 08be135a2e..7e6b9a07a3 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_RangeByTime.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RangeByTime.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type RangeByTime struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResult.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResult.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResult.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResult.go
index 2e73a01717..f26fff1f11 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResult.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResult.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadAccessResult struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResultElement.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResultElement.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResultElement.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResultElement.go
index 775252a53a..c264861abb 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResultElement.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResultElement.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadAccessResultElement struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResultElementChoice.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResultElementChoice.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResultElementChoice.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResultElementChoice.go
index df8c2fc598..3a7ad1e30e 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessResultElementChoice.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessResultElementChoice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadAccessResultElementChoice struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessSpecification.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessSpecification.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessSpecification.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessSpecification.go
index dee28c8555..384df53ccd 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadAccessSpecification.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadAccessSpecification.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadAccessSpecification struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyACK.go
index 3c6de16a3d..293108b2cf 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadPropertyACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyMultipleACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyMultipleACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyMultipleACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyMultipleACK.go
index c85a585549..f68c8f91ef 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyMultipleACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyMultipleACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadPropertyMultipleACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyMultipleRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyMultipleRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyMultipleRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyMultipleRequest.go
index dcbb170171..c4045a1cbb 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyMultipleRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyMultipleRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadPropertyMultipleRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyRequest.go
index 794a8e4b6c..d659f943ab 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadPropertyRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadPropertyRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadPropertyRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadRangeACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadRangeACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadRangeACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadRangeACK.go
index 99a8c31037..28c17ee89b 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadRangeACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadRangeACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadRangeACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReadRangeRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadRangeRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReadRangeRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadRangeRequest.go
index 593475f75c..6482fe4dd6 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReadRangeRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReadRangeRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReadRangeRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReinitializeDeviceRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReinitializeDeviceRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReinitializeDeviceRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReinitializeDeviceRequest.go
index ed4dd054bb..0dd0ef4245 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReinitializeDeviceRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReinitializeDeviceRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReinitializeDeviceRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_ReinitializeDeviceRequestReinitializedStateOfDevice.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReinitializeDeviceRequestReinitializedStateOfDevice.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_ReinitializeDeviceRequestReinitializedStateOfDevice.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReinitializeDeviceRequestReinitializedStateOfDevice.go
index edf4a5087c..a12f3d8032 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_ReinitializeDeviceRequestReinitializedStateOfDevice.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_ReinitializeDeviceRequestReinitializedStateOfDevice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type ReinitializeDeviceRequestReinitializedStateOfDevice struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_RejectPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RejectPDU.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_RejectPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_RejectPDU.go
index 6b7adfd330..d826b8aa9c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_RejectPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RejectPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type RejectPDU struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_RejectReason.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RejectReason.go
similarity index 90%
rename from plc4go/internal/bacnetip/bacgopes/apdu_RejectReason.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_RejectReason.go
index 5bb22cfbe0..c65d43c54c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_RejectReason.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RejectReason.go
@@ -17,7 +17,9 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
+
+import . "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/primitivedata"
 
 // TODO: implement it...
 type RejectReason struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_RemoveListElementRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RemoveListElementRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_RemoveListElementRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_RemoveListElementRequest.go
index 1c613b3910..50815a531e 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_RemoveListElementRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RemoveListElementRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type RemoveListElementRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_RequestKeyRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RequestKeyRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_RequestKeyRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_RequestKeyRequest.go
index 0aceaa5abf..3a96c2f423 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_RequestKeyRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_RequestKeyRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type RequestKeyRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_SegmentAckPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SegmentAckPDU.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_SegmentAckPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_SegmentAckPDU.go
index 680af8b9be..3c5fac0476 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_SegmentAckPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SegmentAckPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type SegmentAckPDU struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_SimpleAckPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SimpleAckPDU.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/apdu_SimpleAckPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_SimpleAckPDU.go
index 7326393ed5..1e87bdacdc 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_SimpleAckPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SimpleAckPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_SubscribeCOVPropertyRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SubscribeCOVPropertyRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_SubscribeCOVPropertyRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_SubscribeCOVPropertyRequest.go
index 379f09b9ac..50c1877490 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_SubscribeCOVPropertyRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SubscribeCOVPropertyRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type SubscribeCOVPropertyRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_SubscribeCOVRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SubscribeCOVRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_SubscribeCOVRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_SubscribeCOVRequest.go
index a85a28e2ea..de8e12e947 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_SubscribeCOVRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_SubscribeCOVRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type SubscribeCOVRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_TimeSynchronizationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_TimeSynchronizationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_TimeSynchronizationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_TimeSynchronizationRequest.go
index 0236386345..741f500cb9 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_TimeSynchronizationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_TimeSynchronizationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type TimeSynchronizationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UTCTimeSynchronizationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UTCTimeSynchronizationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UTCTimeSynchronizationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UTCTimeSynchronizationRequest.go
index 0cfe270740..68f60c476f 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UTCTimeSynchronizationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UTCTimeSynchronizationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UTCTimeSynchronizationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedCOVNotificationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedCOVNotificationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedCOVNotificationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedCOVNotificationRequest.go
index 87174b7e95..a26c3eee52 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedCOVNotificationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedCOVNotificationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UnconfirmedCOVNotificationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedEventNotificationRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedEventNotificationRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedEventNotificationRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedEventNotificationRequest.go
index e05aa804d8..f2893188b3 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedEventNotificationRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedEventNotificationRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UnconfirmedEventNotificationRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedPrivateTransferRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedPrivateTransferRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedPrivateTransferRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedPrivateTransferRequest.go
index b40058359e..ab6bc48f25 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedPrivateTransferRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedPrivateTransferRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UnconfirmedPrivateTransferRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestPDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestPDU.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestPDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestPDU.go
index 382b7b43de..d6b09aa389 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestPDUAtomicReadFileACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestPDUAtomicReadFileACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestPDUAtomicReadFileACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestPDUAtomicReadFileACK.go
index 75851f369c..3a5e0901f1 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestPDUAtomicReadFileACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestPDUAtomicReadFileACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type AtomicReadFileACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestSequence.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestSequence.go
similarity index 83%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestSequence.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestSequence.go
index 61da101c63..4def3a43f5 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedRequestSequence.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedRequestSequence.go
@@ -17,12 +17,14 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	"github.com/pkg/errors"
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
 )
 
 // UnconfirmedRequestSequenceContract provides a set of functions which can be overwritten by a sub struct
@@ -45,7 +47,7 @@ type UnconfirmedRequestSequence struct {
 	_contract UnconfirmedRequestSequenceContract
 }
 
-func NewUnconfirmedRequestSequence(serviceRequest model.BACnetUnconfirmedServiceRequest, opts ...func(*UnconfirmedRequestSequence)) (*UnconfirmedRequestSequence, error) {
+func NewUnconfirmedRequestSequence(serviceRequest /*TODO: breaks a bit the consistency, maybe we just convert it to args to be flexible*/ model.BACnetUnconfirmedServiceRequest, kwargs KWArgs, opts ...func(*UnconfirmedRequestSequence)) (*UnconfirmedRequestSequence, error) {
 	u := &UnconfirmedRequestSequence{}
 	for _, opt := range opts {
 		opt(u)
@@ -56,7 +58,7 @@ func NewUnconfirmedRequestSequence(serviceRequest model.BACnetUnconfirmedService
 		u._contract.(UnconfirmedRequestSequenceContractRequirement).SetUnconfirmedRequestSequence(u)
 	}
 	var err error
-	u.APCISequence, err = NewAPCISequence(model.NewAPDUUnconfirmedRequest(serviceRequest, 0), WithAPCISequenceExtension(u._contract))
+	u.APCISequence, err = NewAPCISequence(NewArgs(model.NewAPDUUnconfirmedRequest(serviceRequest, 0)), kwargs, WithAPCISequenceExtension(u._contract))
 	if err != nil {
 		return nil, errors.Wrap(err, "error creating _APCISequence")
 	}
@@ -83,6 +85,10 @@ func (*UnconfirmedRequestSequence) GetServiceChoice() *model.BACnetUnconfirmedSe
 	return nil
 }
 
+func (u *UnconfirmedRequestSequence) DeepCopy() any {
+	panic("implement me")
+}
+
 func (u *UnconfirmedRequestSequence) String() string {
 	return u.APCISequence.String()
 }
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedServiceChoice.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedServiceChoice.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedServiceChoice.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedServiceChoice.go
index eed1a37598..e4417d4655 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedServiceChoice.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedServiceChoice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UnconfirmedServiceChoice struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequest.go
index a55caad93a..ca60ac0259 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UnconfirmedTextMessageRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequestMessageClass.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequestMessageClass.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequestMessageClass.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequestMessageClass.go
index d9a4553f58..28b1c228c7 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequestMessageClass.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequestMessageClass.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UnconfirmedTextMessageRequestMessageClass struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequestMessagePriority.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequestMessagePriority.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequestMessagePriority.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequestMessagePriority.go
index ccbc36b584..6d3866adbb 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_UnconfirmedTextMessageRequestMessagePriority.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_UnconfirmedTextMessageRequestMessagePriority.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type UnconfirmedTextMessageRequestMessagePriority struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_VTCloseError.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTCloseError.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_VTCloseError.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTCloseError.go
index 52df32af15..ee7fb1a5b6 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_VTCloseError.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTCloseError.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type VTCloseError struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_VTCloseRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTCloseRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_VTCloseRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTCloseRequest.go
index 291b88db0b..c6598c0b1c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_VTCloseRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTCloseRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type VTCloseRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_VTDataACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTDataACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_VTDataACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTDataACK.go
index 8dec978bf6..01abd193ea 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_VTDataACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTDataACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type VTDataACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_VTDataRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTDataRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_VTDataRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTDataRequest.go
index 307a4e5351..4050d46b54 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_VTDataRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTDataRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type VTDataRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_VTOpenACK.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTOpenACK.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_VTOpenACK.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTOpenACK.go
index 141cbc9649..8a91d84683 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_VTOpenACK.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTOpenACK.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type VTOpenACK struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_VTOpenRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTOpenRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_VTOpenRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTOpenRequest.go
index d07516807d..065026d764 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_VTOpenRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_VTOpenRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type VTOpenRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WhoHasLimits.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasLimits.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WhoHasLimits.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasLimits.go
index 71c35ed1ee..c57408a290 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WhoHasLimits.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasLimits.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WhoHasLimits struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WhoHasObject.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasObject.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WhoHasObject.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasObject.go
index f1fa8142ce..c3950c68de 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WhoHasObject.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasObject.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WhoHasObject struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WhoHasRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WhoHasRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasRequest.go
index 316b35f2a7..5dc478ee5c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WhoHasRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoHasRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WhoHasRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WhoIsRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoIsRequest.go
similarity index 90%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WhoIsRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoIsRequest.go
index 459695705e..39026eae0c 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WhoIsRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WhoIsRequest.go
@@ -17,12 +17,16 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	"github.com/pkg/errors"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/constructeddata"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/primitivedata"
 )
 
 type WhoIsRequest struct {
@@ -47,6 +51,7 @@ func NewWhoIsRequest() (*WhoIsRequest, error) {
 			readWriteModel.CreateBACnetContextTagUnsignedInteger(1, 0),
 			0,
 		),
+		NoKWArgs,
 		WithUnconfirmedRequestSequenceExtension(w),
 	)
 	if err != nil {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WriteAccessSpecification.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WriteAccessSpecification.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WriteAccessSpecification.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WriteAccessSpecification.go
index 9ecb71f70e..74eedfdbc3 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WriteAccessSpecification.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WriteAccessSpecification.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WriteAccessSpecification struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WriteGroupRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WriteGroupRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WriteGroupRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WriteGroupRequest.go
index 45cde0ccb8..db57892467 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WriteGroupRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WriteGroupRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WriteGroupRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyMultipleError.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyMultipleError.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyMultipleError.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyMultipleError.go
index c7b155ee5d..f81a30cc81 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyMultipleError.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyMultipleError.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WritePropertyMultipleError struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyMultipleRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyMultipleRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyMultipleRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyMultipleRequest.go
index 33e4581729..3209faeae2 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyMultipleRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyMultipleRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WritePropertyMultipleRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyRequest.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyRequest.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyRequest.go
index 134fe7be2d..2b083e0147 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu_WritePropertyRequest.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu_WritePropertyRequest.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 // TODO: implement it...
 type WritePropertyRequest struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu__APDU.go b/plc4go/internal/bacnetip/bacgopes/apdu/apdu__APDU.go
similarity index 91%
rename from plc4go/internal/bacnetip/bacgopes/apdu__APDU.go
rename to plc4go/internal/bacnetip/bacgopes/apdu/apdu__APDU.go
index 637a76ff50..aa13fba406 100644
--- a/plc4go/internal/bacnetip/bacgopes/apdu__APDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/apdu/apdu__APDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package apdu
 
 import (
 	"fmt"
@@ -25,8 +25,11 @@ import (
 
 	"github.com/pkg/errors"
 
-	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 // _APDU masks the Encode() and Decode() functions of the APDU
@@ -79,7 +82,7 @@ func (a *___APDU) Decode(pdu Arg) error {
 }
 
 func (a *___APDU) String() string {
-	if globals.ExtendedPDUOutput {
+	if ExtendedPDUOutput {
 		return fmt.Sprintf("_APDU{%s}", a.__APDU)
 	} else {
 		sname := fmt.Sprintf("%T", a)
diff --git a/plc4go/internal/bacnetip/bacgopes/apdu_IAmRequest.go b/plc4go/internal/bacnetip/bacgopes/apdu_IAmRequest.go
deleted file mode 100644
index 2392cf6200..0000000000
--- a/plc4go/internal/bacnetip/bacgopes/apdu_IAmRequest.go
+++ /dev/null
@@ -1,24 +0,0 @@
-/*
- * 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
- *
- *   https://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 bacgopes
-
-// TODO: implement it...
-type IAmRequest struct {
-}
diff --git a/plc4go/internal/bacnetip/bacgopes/app.go b/plc4go/internal/bacnetip/bacgopes/app/app.go
similarity index 97%
rename from plc4go/internal/bacnetip/bacgopes/app.go
rename to plc4go/internal/bacnetip/bacgopes/app/app.go
index b3432951fd..2671d7d88d 100644
--- a/plc4go/internal/bacnetip/bacgopes/app.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app.go
@@ -17,4 +17,4 @@
  * under the License.
  */
 
-package bacgopes
+package app
diff --git a/plc4go/internal/bacnetip/bacgopes/app_Application.go b/plc4go/internal/bacnetip/bacgopes/app/app_Application.go
similarity index 89%
rename from plc4go/internal/bacnetip/bacgopes/app_Application.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_Application.go
index b2d031367f..d782133365 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_Application.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_Application.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package app
 
 import (
 	"fmt"
@@ -26,6 +26,15 @@ import (
 	"github.com/rs/zerolog"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/apdu"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/appservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/capability"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comm"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/core"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/local/device"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ApplicationRequirements interface {
@@ -47,7 +56,8 @@ type Application struct {
 	_startupDisabled bool
 
 	// pass through args
-	argAseID *int `ignore:"true"`
+	argAseID *int                       `ignore:"true"`
+	argAse   *ApplicationServiceElement `ignore:"true"`
 
 	log zerolog.Logger
 }
@@ -66,9 +76,7 @@ func NewApplication(localLog zerolog.Logger, localDevice *LocalDeviceObject, opt
 		Interface("aseID", a.argAseID).
 		Msg("NewApplication")
 	var err error
-	a.ApplicationServiceElementContract, err = NewApplicationServiceElement(localLog, func(element *applicationServiceElement) {
-		element.elementID = a.argAseID
-	})
+	a.ApplicationServiceElementContract, err = NewApplicationServiceElement(localLog, OptionalOptionDual(a.argAseID, a.argAse, WithApplicationServiceElementAseID))
 	if err != nil {
 		return nil, err
 	}
@@ -110,9 +118,10 @@ func NewApplication(localLog zerolog.Logger, localDevice *LocalDeviceObject, opt
 	return a, nil
 }
 
-func WithApplicationAseID(aseID int) func(*Application) {
+func WithApplicationAseID(aseID int, ase ApplicationServiceElement) func(*Application) {
 	return func(a *Application) {
 		a.argAseID = &aseID
+		a.argAse = &ase
 	}
 }
 
@@ -228,7 +237,7 @@ func (a *Application) GetServicesSupported() []string {
 
 func (a *Application) Request(args Args, kwargs KWArgs) error {
 	a.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("Request")
-	apdu := args.Get0PDU()
+	apdu := Get[APDU](args, 0)
 
 	// double-check the input is the right kind of APDU
 	switch apdu.GetRootMessage().(type) {
@@ -241,7 +250,7 @@ func (a *Application) Request(args Args, kwargs KWArgs) error {
 
 func (a *Application) Indication(args Args, kwargs KWArgs) error {
 	a.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("Indication")
-	apdu := args.GetAPDU(0)
+	apdu := Get[APDU](args, 0)
 
 	// get a helper function
 	helperName := fmt.Sprintf("Do_%T", apdu)
diff --git a/plc4go/internal/bacnetip/bacgopes/app_ApplicationIOController.go b/plc4go/internal/bacnetip/bacgopes/app/app_ApplicationIOController.go
similarity index 88%
rename from plc4go/internal/bacnetip/bacgopes/app_ApplicationIOController.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_ApplicationIOController.go
index 00c9ef686a..a8406599d3 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_ApplicationIOController.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_ApplicationIOController.go
@@ -17,13 +17,19 @@
  * under the License.
  */
 
-package bacgopes
+package app
 
 import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/appservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/iocb"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/local/device"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 //go:generate plc4xGenerator -type=ApplicationIOController -prefix=app_
@@ -76,11 +82,11 @@ func WithApplicationIOControllerAseID(aseID *int) func(*ApplicationIOController)
 	}
 }
 
-func (a *ApplicationIOController) ProcessIO(iocb _IOCB) error {
+func (a *ApplicationIOController) ProcessIO(iocb IOCBContract) error {
 	a.log.Debug().Stringer("iocb", iocb).Msg("ProcessIO")
 
 	// get the destination address from the pdu
-	destinationAddress := iocb.getDestination()
+	destinationAddress := iocb.GetDestination()
 	a.log.Debug().Stringer("destinationAddress", destinationAddress).Msg("working with destinationAddress")
 
 	// look up the queue
@@ -111,7 +117,7 @@ func (a *ApplicationIOController) _AppComplete(address *Address, apdu PDU) error
 	a.log.Debug().Stringer("queue", queue).Msg("working with queue")
 
 	// make sure it has an active iocb
-	if queue.activeIOCB == nil {
+	if queue.ActiveIOCB == nil {
 		a.log.Debug().Stringer("address", address).Msg("no active request for")
 		return nil
 	}
@@ -119,12 +125,12 @@ func (a *ApplicationIOController) _AppComplete(address *Address, apdu PDU) error
 	// this request is complete
 	switch apdu.GetRootMessage().(type) {
 	case readWriteModel.APDUSimpleAck, readWriteModel.APDUComplexAck:
-		if err := queue.CompleteIO(queue.activeIOCB, apdu); err != nil {
+		if err := queue.CompleteIO(queue.ActiveIOCB, apdu); err != nil {
 			return err
 		}
 	case readWriteModel.APDUError, readWriteModel.APDUReject, readWriteModel.APDUAbort:
 		// TODO: extract error
-		if err := queue.AbortIO(queue.activeIOCB, errors.Errorf("%s", apdu)); err != nil {
+		if err := queue.AbortIO(queue.ActiveIOCB, errors.Errorf("%s", apdu)); err != nil {
 			return err
 		}
 	default:
@@ -132,7 +138,7 @@ func (a *ApplicationIOController) _AppComplete(address *Address, apdu PDU) error
 	}
 	a.log.Debug().Msg("controller finished")
 	// if the queue is empty and idle, forget about the controller
-	if len(queue.ioQueue.queue) == 0 && queue.activeIOCB == nil {
+	if len(queue.IoQueue.Queue) == 0 && queue.ActiveIOCB == nil {
 		delete(a.queueByAddress, address.String())
 	}
 	return nil
@@ -158,7 +164,7 @@ func (a *ApplicationIOController) _AppRequest(apdu PDU) {
 
 func (a *ApplicationIOController) Request(args Args, kwargs KWArgs) error {
 	a.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("Request")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	// if this is not unconfirmed request, tell the application to use the IOCB interface
 	if _, ok := apdu.(readWriteModel.APDUUnconfirmedRequest); !ok {
@@ -171,7 +177,7 @@ func (a *ApplicationIOController) Request(args Args, kwargs KWArgs) error {
 
 func (a *ApplicationIOController) Confirmation(args Args, kwargs KWArgs) error {
 	a.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("Confirmation")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	// this is an ack, error, reject or abort
 	return a._AppComplete(apdu.GetPDUSource(), apdu)
diff --git a/plc4go/internal/bacnetip/bacgopes/app_ApplicationIOController_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/app/app_ApplicationIOController_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/app_ApplicationIOController_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_ApplicationIOController_plc4xgen.go
index 8d6bbfd5bc..7d70641bb6 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_ApplicationIOController_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_ApplicationIOController_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=ApplicationIOController -prefix=app_"; DO NOT EDIT.
 
-package bacgopes
+package app
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/app_Application_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/app/app_Application_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/app_Application_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_Application_plc4xgen.go
index ee88008195..66bc5097fc 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_Application_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_Application_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=Application -prefix=app_"; DO NOT EDIT.
 
-package bacgopes
+package app
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/app_BIPForeignApplication.go b/plc4go/internal/bacnetip/bacgopes/app/app_BIPForeignApplication.go
similarity index 87%
rename from plc4go/internal/bacnetip/bacgopes/app_BIPForeignApplication.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_BIPForeignApplication.go
index 816e257e50..b1fd84e083 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_BIPForeignApplication.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_BIPForeignApplication.go
@@ -17,11 +17,20 @@
  * under the License.
  */
 
-package bacgopes
+package app
 
 import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/appservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/bvllservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comm"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/local/device"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/netservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/object"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/service"
 )
 
 type BIPForeignApplication struct {
@@ -110,7 +119,7 @@ func NewBIPForeignApplication(localLog zerolog.Logger, localDevice *LocalDeviceO
 	}
 
 	// bind the bottom layers
-	if err := Bind(localLog, b.bip, b.annexj, b.mux.annexJ); err != nil {
+	if err := Bind(localLog, b.bip, b.annexj, b.mux.AnnexJ); err != nil {
 		return nil, errors.Wrap(err, "error binding bottom layers")
 	}
 
diff --git a/plc4go/internal/bacnetip/bacgopes/app_BIPNetworkApplication.go b/plc4go/internal/bacnetip/bacgopes/app/app_BIPNetworkApplication.go
similarity index 76%
rename from plc4go/internal/bacnetip/bacgopes/app_BIPNetworkApplication.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_BIPNetworkApplication.go
index afb5726080..7f281f48af 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_BIPNetworkApplication.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_BIPNetworkApplication.go
@@ -17,11 +17,17 @@
  * under the License.
  */
 
-package bacgopes
+package app
 
 import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/bvllservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comm"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/netservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type BIPNetworkApplication struct {
@@ -33,9 +39,10 @@ type BIPNetworkApplication struct {
 	mux          *UDPMultiplexer
 
 	// passThroughArgs
-	argBBMDAddress *Address `ignore:"true"`
-	argBBMDTTL     *int     `ignore:"true"`
-	argEID         *int     `ignore:"true"`
+	argBBMDAddress **Address                  `ignore:"true"`
+	argBBMDTTL     *int                       `ignore:"true"`
+	argEID         *int                       `ignore:"true"`
+	argASE         *ApplicationServiceElement `ignore:"true"`
 
 	log zerolog.Logger
 }
@@ -48,9 +55,7 @@ func NewBIPNetworkApplication(localLog zerolog.Logger, localAddress Address, opt
 		opt(n)
 	}
 	var err error
-	n.NetworkServiceElement, err = NewNetworkServiceElement(localLog, func(nse *NetworkServiceElement) {
-		nse.argEID = n.argEID
-	})
+	n.NetworkServiceElement, err = NewNetworkServiceElement(localLog, OptionalOptionDual(n.argEID, n.argASE, WithNetworkServiceElementEID))
 	if err != nil {
 		return nil, errors.Wrap(err, "error creating new network service element")
 	}
@@ -76,10 +81,7 @@ func NewBIPNetworkApplication(localLog zerolog.Logger, localAddress Address, opt
 			return nil, errors.Wrap(err, "error creating BIPSimple")
 		}
 	} else {
-		n.bip, err = NewBIPForeign(localLog, func(bf *BIPForeign) {
-			bf.argAddr = n.argBBMDAddress
-			bf.argTTL = n.argBBMDTTL
-		})
+		n.bip, err = NewBIPForeign(localLog, OptionalOption(n.argBBMDAddress, WithBIPForeignAddress), OptionalOption(n.argBBMDTTL, WithBIPForeignTTL))
 		if err != nil {
 			return nil, errors.Wrap(err, "error creating BIPForeign")
 		}
@@ -94,7 +96,7 @@ func NewBIPNetworkApplication(localLog zerolog.Logger, localAddress Address, opt
 	}
 
 	// bind the bottom layers
-	if err := Bind(localLog, n.bip, n.annexj, n.mux.annexJ); err != nil {
+	if err := Bind(localLog, n.bip, n.annexj, n.mux.AnnexJ); err != nil {
 		return nil, errors.Wrap(err, "error binding bottom layers")
 	}
 
diff --git a/plc4go/internal/bacnetip/bacgopes/app_BIPSimpleApplication.go b/plc4go/internal/bacnetip/bacgopes/app/app_BIPSimpleApplication.go
similarity index 88%
rename from plc4go/internal/bacnetip/bacgopes/app_BIPSimpleApplication.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_BIPSimpleApplication.go
index ef1c1d3542..270aed6440 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_BIPSimpleApplication.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_BIPSimpleApplication.go
@@ -17,11 +17,20 @@
  * under the License.
  */
 
-package bacgopes
+package app
 
 import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/appservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/bvllservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comm"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/local/device"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/netservice"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/object"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/service"
 )
 
 //go:generate plc4xGenerator -type=BIPSimpleApplication -prefix=app_
@@ -112,7 +121,7 @@ func NewBIPSimpleApplication(localLog zerolog.Logger, localDevice *LocalDeviceOb
 	}
 
 	// bind the bottom layers
-	if err := Bind(localLog, b.bip, b.annexj, b.mux.annexJ); err != nil {
+	if err := Bind(localLog, b.bip, b.annexj, b.mux.AnnexJ); err != nil {
 		return nil, errors.Wrap(err, "error binding bottom layers")
 	}
 
diff --git a/plc4go/internal/bacnetip/bacgopes/app_BIPSimpleApplication_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/app/app_BIPSimpleApplication_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/app_BIPSimpleApplication_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/app/app_BIPSimpleApplication_plc4xgen.go
index ebd8ef54d8..7e29f4e405 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_BIPSimpleApplication_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/app/app_BIPSimpleApplication_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=BIPSimpleApplication -prefix=app_"; DO NOT EDIT.
 
-package bacgopes
+package app
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfo.go b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfo.go
similarity index 91%
rename from plc4go/internal/bacnetip/bacgopes/app_DeviceInfo.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfo.go
index e66c8913b2..aa84eafb72 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfo.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfo.go
@@ -17,9 +17,13 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
 
-import readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+import (
+	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
+)
 
 //go:generate plc4xGenerator -type=DeviceInfo -prefix=app_
 type DeviceInfo struct {
diff --git a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfoCache.go b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfoCache.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/app_DeviceInfoCache.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfoCache.go
index c135e2bdf7..14203f1f14 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfoCache.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfoCache.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
 
 import (
 	"encoding/binary"
@@ -28,6 +28,8 @@ import (
 	"github.com/rs/zerolog"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 // DeviceInfoCacheKey caches by either Instance, PduSource of both
diff --git a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfoCache_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfoCache_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/app_DeviceInfoCache_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfoCache_plc4xgen.go
index 911576e989..5cc827bcd7 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfoCache_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfoCache_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=DeviceInfoCache -prefix=app_"; DO NOT EDIT.
 
-package bacgopes
+package appservice
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfo_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfo_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/app_DeviceInfo_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfo_plc4xgen.go
index 1478f026ab..e21a02c16d 100644
--- a/plc4go/internal/bacnetip/bacgopes/app_DeviceInfo_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/app_DeviceInfo_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=DeviceInfo -prefix=app_"; DO NOT EDIT.
 
-package bacgopes
+package appservice
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice.go
similarity index 97%
rename from plc4go/internal/bacnetip/bacgopes/appservice.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice.go
index b3432951fd..dd5e44ba8a 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice.go
@@ -17,4 +17,4 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice_ApplicationServiceAccessPoint.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ApplicationServiceAccessPoint.go
similarity index 84%
rename from plc4go/internal/bacnetip/bacgopes/appservice_ApplicationServiceAccessPoint.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice_ApplicationServiceAccessPoint.go
index 65a48a9a72..26ca3b833e 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice_ApplicationServiceAccessPoint.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ApplicationServiceAccessPoint.go
@@ -17,13 +17,18 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
 
 import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/apdu"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comm"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 //go:generate plc4xGenerator -type=ApplicationServiceAccessPoint -prefix=appservice_
@@ -32,8 +37,10 @@ type ApplicationServiceAccessPoint struct {
 	ServiceAccessPointContract
 
 	// pass through args
-	argAseID *int `ignore:"true"`
-	argSapID *int `ignore:"true"`
+	argAseID        *int                       `ignore:"true"`
+	argASEExtension *ApplicationServiceElement `ignore:"true"`
+	argSapID        *int                       `ignore:"true"`
+	argSap          *ServiceAccessPoint        `ignore:"true"`
 
 	log zerolog.Logger
 }
@@ -46,36 +53,34 @@ func NewApplicationServiceAccessPoint(localLog zerolog.Logger, opts ...func(*App
 		opt(a)
 	}
 	var err error
-	a.ApplicationServiceElementContract, err = NewApplicationServiceElement(localLog, func(ase *applicationServiceElement) {
-		ase.elementID = a.argAseID
-	})
+	a.ApplicationServiceElementContract, err = NewApplicationServiceElement(localLog, OptionalOptionDual(a.argAseID, a.argASEExtension, WithApplicationServiceElementAseID))
 	if err != nil {
 		return nil, errors.Wrap(err, "error creating application service element")
 	}
-	a.ServiceAccessPointContract, err = NewServiceAccessPoint(localLog, func(sap *serviceAccessPoint) {
-		sap.serviceID = a.argSapID
-	})
+	a.ServiceAccessPointContract, err = NewServiceAccessPoint(localLog, OptionalOptionDual(a.argSapID, a.argSap, WithServiceAccessPointSapID))
 	if err != nil {
 		return nil, errors.Wrap(err, "error creating service access point")
 	}
 	return a, nil
 }
 
-func WithApplicationServiceAccessPointAseID(aseID int) func(*ApplicationServiceAccessPoint) {
+func WithApplicationServiceAccessPointAseID(aseID int, argASEExtension ApplicationServiceElement) func(*ApplicationServiceAccessPoint) {
 	return func(a *ApplicationServiceAccessPoint) {
 		a.argAseID = &aseID
+		a.argASEExtension = &argASEExtension
 	}
 }
 
-func WithApplicationServiceAccessPointSapID(sapID int) func(*ApplicationServiceAccessPoint) {
+func WithApplicationServiceAccessPointSapID(sapID int, sap ServiceAccessPoint) func(*ApplicationServiceAccessPoint) {
 	return func(a *ApplicationServiceAccessPoint) {
 		a.argSapID = &sapID
+		a.argSap = &sap
 	}
 }
 
 func (a *ApplicationServiceAccessPoint) Indication(args Args, kwargs KWArgs) error {
 	a.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("Indication")
-	apdu := args.GetAPDU(0)
+	apdu := Get[APDU](args, 0)
 
 	switch _apdu := apdu.GetRootMessage().(type) {
 	case readWriteModel.APDUConfirmedRequest:
@@ -156,7 +161,7 @@ func (a *ApplicationServiceAccessPoint) Indication(args Args, kwargs KWArgs) err
 func (a *ApplicationServiceAccessPoint) SapIndication(args Args, kwargs KWArgs) error {
 	a.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("SapIndication")
 
-	apdu := args.Get0APDU()
+	apdu := Get[APDU](args, 0)
 
 	isConfirmed := false
 	var xpdu APDU
@@ -192,8 +197,8 @@ func (a *ApplicationServiceAccessPoint) SapIndication(args Args, kwargs KWArgs)
 
 	// if the upper layers of the application did not assign an invoke ID,
 	// copy the one that was assigned on its way down the stack
-	if isConfirmed && apdu.getApduInvokeID() != nil {
-		apdu.setApduInvokeID(xpdu.getApduInvokeID())
+	if isConfirmed && apdu.GetApduInvokeID() != nil {
+		apdu.SetApduInvokeID(xpdu.GetApduInvokeID())
 	}
 	return err
 }
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice_ApplicationServiceAccessPoint_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ApplicationServiceAccessPoint_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/appservice_ApplicationServiceAccessPoint_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice_ApplicationServiceAccessPoint_plc4xgen.go
index 32f0d460f5..841bc7505d 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice_ApplicationServiceAccessPoint_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ApplicationServiceAccessPoint_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=ApplicationServiceAccessPoint -prefix=appservice_"; DO NOT EDIT.
 
-package bacgopes
+package appservice
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice_ClientSSM.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ClientSSM.go
similarity index 98%
rename from plc4go/internal/bacnetip/bacgopes/appservice_ClientSSM.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice_ClientSSM.go
index 87c9fc0737..7ad460f44c 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice_ClientSSM.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ClientSSM.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
 
 import (
 	"context"
@@ -27,6 +27,9 @@ import (
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi/options"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ClientSSM struct {
@@ -79,7 +82,7 @@ func (c *ClientSSM) setState(newState SSMState, timer *uint) error {
 // Request This function is called by client transaction functions when it wants to send a message to the device
 func (c *ClientSSM) Request(args Args, kwargs KWArgs) error {
 	c.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("request")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	// make sure it has a good source and destination
 	apdu = NewPDU(apdu, WithPDUSource(nil), WithPDUDestination(c.pduAddress))
@@ -93,7 +96,7 @@ func (c *ClientSSM) Request(args Args, kwargs KWArgs) error {
 //	rolling
 func (c *ClientSSM) Indication(args Args, kwargs KWArgs) error {
 	c.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("indication")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 	// make sure we're getting confirmed requests
 	var apduConfirmedRequest readWriteModel.APDUConfirmedRequest
 	if apduCasted, ok := apdu.GetRootMessage().(readWriteModel.APDUConfirmedRequest); !ok {
@@ -198,7 +201,7 @@ func (c *ClientSSM) Indication(args Args, kwargs KWArgs) error {
 func (c *ClientSSM) Response(args Args, kwargs KWArgs) error {
 	c.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("response")
 
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	// make sure it has a good source and destination
 	apdu = NewPDU(apdu, WithPDUSource(c.pduAddress), WithPDUDestination(nil))
@@ -210,7 +213,7 @@ func (c *ClientSSM) Response(args Args, kwargs KWArgs) error {
 // Confirmation This function is called by the device for all upstream messages related to the transaction.
 func (c *ClientSSM) Confirmation(args Args, kwargs KWArgs) error {
 	c.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("confirmation")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	switch c.state {
 	case SSMState_SEGMENTED_REQUEST:
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice_SSM.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_SSM.go
similarity index 96%
rename from plc4go/internal/bacnetip/bacgopes/appservice_SSM.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice_SSM.go
index 4960a64547..8d5e83fb11 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice_SSM.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_SSM.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
 
 import (
 	"time"
@@ -26,6 +26,12 @@ import (
 	"github.com/rs/zerolog"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comm"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/local/device"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/task"
 )
 
 type SSMState uint8
@@ -198,7 +204,7 @@ func (s *SSM) StartTimer(millis uint) {
 
 func (s *SSM) StopTimer() {
 	s.log.Debug().Msg("Stop Timer")
-	if s.isScheduled {
+	if s.GetIsScheduled() {
 		s.log.Debug().Msg("is scheduled")
 		s.SuspendTask()
 	}
@@ -206,7 +212,7 @@ func (s *SSM) StopTimer() {
 
 func (s *SSM) RestartTimer(millis uint) {
 	s.log.Debug().Uint("millis", millis).Msg("restart timer")
-	if s.isScheduled {
+	if s.GetIsScheduled() {
 		s.log.Debug().Msg("is scheduled")
 		s.SuspendTask()
 	}
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice_ServerSSM.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ServerSSM.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/appservice_ServerSSM.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice_ServerSSM.go
index 6ed9b1c6b7..e7514ec99b 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice_ServerSSM.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_ServerSSM.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
 
 import (
 	"context"
@@ -27,6 +27,9 @@ import (
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi/options"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ServerSSM struct {
@@ -91,7 +94,7 @@ func (s *ServerSSM) Request(args Args, kwargs KWArgs) error {
 //	the transaction
 func (s *ServerSSM) Indication(args Args, kwargs KWArgs) error { // TODO: maybe use another name for that
 	s.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("Indication")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 	// make sure we're getting confirmed requests
 
 	switch s.state {
@@ -130,7 +133,7 @@ func (s *ServerSSM) Confirmation(args Args, kwargs KWArgs) error {
 		s.log.Debug().Msg("warning: no expecting a response")
 	}
 
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	switch _apdu := apdu.GetRootMessage().(type) {
 	// abort response
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice_StateMachineAccessPoint.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_StateMachineAccessPoint.go
similarity index 94%
rename from plc4go/internal/bacnetip/bacgopes/appservice_StateMachineAccessPoint.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice_StateMachineAccessPoint.go
index 2a84e584b2..54abacc1c2 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice_StateMachineAccessPoint.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_StateMachineAccessPoint.go
@@ -17,14 +17,19 @@
  * under the License.
  */
 
-package bacgopes
+package appservice
 
 import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
-	"github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comm"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/globals"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/local/device"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 //go:generate plc4xGenerator -type=StateMachineAccessPoint -prefix=appservice_
@@ -48,8 +53,9 @@ type StateMachineAccessPoint struct {
 	applicationTimeout    uint
 
 	// pass through args
-	argSapID *int `ignore:"true"`
-	argCid   *int `ignore:"true"`
+	argSapID *int                `ignore:"true"`
+	argSap   *ServiceAccessPoint `ignore:"true"`
+	argCid   *int                `ignore:"true"`
 
 	log zerolog.Logger
 }
@@ -89,7 +95,7 @@ func NewStateMachineAccessPoint(localLog zerolog.Logger, localDevice *LocalDevic
 	for _, opt := range opts {
 		opt(s)
 	}
-	if globals.LogAppService {
+	if LogAppService {
 		s.log.Debug().
 			Stringer("localDevice", localDevice).
 			Stringer("deviceInfoCache", s.deviceInfoCache).
@@ -99,19 +105,15 @@ func NewStateMachineAccessPoint(localLog zerolog.Logger, localDevice *LocalDevic
 	}
 	// basic initialization
 	var err error
-	s.Client, err = NewClient(s.log, s, func(client *client) {
-		client.clientID = s.argCid
-	})
+	s.Client, err = NewClient(s.log, s, OptionalOption(s.argCid, WithClientCID))
 	if err != nil {
 		return nil, errors.Wrapf(err, "error building client for %d", s.argCid)
 	}
-	s.ServiceAccessPointContract, err = NewServiceAccessPoint(s.log, func(point *serviceAccessPoint) {
-		point.serviceID = s.argSapID
-	})
+	s.ServiceAccessPointContract, err = NewServiceAccessPoint(s.log, OptionalOptionDual(s.argSapID, s.argSap, WithServiceAccessPointSapID))
 	if err != nil {
 		return nil, errors.Wrapf(err, "error building serviceAccessPoint for %d", s.argSapID)
 	}
-	if !globals.LogAppService {
+	if !LogAppService {
 		s.log = zerolog.Nop()
 	}
 	return s, nil
@@ -123,9 +125,10 @@ func WithStateMachineAccessPointDeviceInfoCache(deviceInfoCache *DeviceInfoCache
 	}
 }
 
-func WithStateMachineAccessPointSapID(sapID int) func(*StateMachineAccessPoint) {
+func WithStateMachineAccessPointSapID(sapID int, sap ServiceAccessPoint) func(*StateMachineAccessPoint) {
 	return func(s *StateMachineAccessPoint) {
 		s.argSapID = &sapID
+		s.argSap = &sap
 	}
 }
 
@@ -186,7 +189,7 @@ func (s *StateMachineAccessPoint) GetDefaultMaximumApduLengthAccepted() readWrit
 // Confirmation Packets coming up the stack are APDU's
 func (s *StateMachineAccessPoint) Confirmation(args Args, kwargs KWArgs) error { // TODO: note we need a special method here as we don't contain src in the apdu
 	s.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("Confirmation")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	// check device communication control
 	switch s.dccEnableDisable {
@@ -344,7 +347,7 @@ func (s *StateMachineAccessPoint) Confirmation(args Args, kwargs KWArgs) error {
 // SapIndication This function is called when the application is requesting a new transaction as a client.
 func (s *StateMachineAccessPoint) SapIndication(args Args, kwargs KWArgs) error {
 	s.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("SapIndication")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 
 	pduDestination := apdu.GetPDUDestination()
 
@@ -410,7 +413,7 @@ func (s *StateMachineAccessPoint) SapIndication(args Args, kwargs KWArgs) error
 //	ack, complex ack, error, reject or abort
 func (s *StateMachineAccessPoint) SapConfirmation(args Args, kwargs KWArgs) error {
 	s.log.Debug().Stringer("Args", args).Stringer("KWArgs", kwargs).Msg("SapConfirmation")
-	apdu := args.Get0PDU()
+	apdu := Get[PDU](args, 0)
 	pduDestination := apdu.GetPDUDestination()
 	switch apdu.GetRootMessage().(type) {
 	case readWriteModel.APDUSimpleAck, readWriteModel.APDUComplexAck, readWriteModel.APDUError, readWriteModel.APDUReject:
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice_StateMachineAccessPoint_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_StateMachineAccessPoint_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/appservice_StateMachineAccessPoint_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/appservice/appservice_StateMachineAccessPoint_plc4xgen.go
index 4644157c1b..9876fdf3dd 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice_StateMachineAccessPoint_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/appservice/appservice_StateMachineAccessPoint_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=StateMachineAccessPoint -prefix=appservice_"; DO NOT EDIT.
 
-package bacgopes
+package appservice
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/basetypes/basetypes.go b/plc4go/internal/bacnetip/bacgopes/basetypes/basetypes.go
new file mode 100644
index 0000000000..d02e339372
--- /dev/null
+++ b/plc4go/internal/bacnetip/bacgopes/basetypes/basetypes.go
@@ -0,0 +1,5599 @@
+/*
+ * 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
+ *
+ *   https://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 basetypes
+
+import (
+	"fmt"
+
+	"github.com/pkg/errors"
+
+	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/constructeddata"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/primitivedata"
+)
+
+type vendorRange struct {
+	lower, upper int
+}
+
+//
+//   Bit Strings
+//
+
+type AuditOperationFlags struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewAuditOperationFlags(arg Arg) (*AuditOperationFlags, error) {
+	s := &AuditOperationFlags{
+		vendorRange: vendorRange{32, 63},
+		bitNames: map[string]int{
+			"read":              0,
+			"write":             1,
+			"create":            2,
+			"delete":            3,
+			"lifeSafety":        4,
+			"acknowledgeAlarm":  5,
+			"deviceDisableComm": 6,
+			"deviceEnableComm":  7,
+			"deviceReset":       8,
+			"deviceBackup":      9,
+			"deviceRestore":     10,
+			"subscription":      11,
+			"notification":      12,
+			"auditingFailure":   13,
+			"networkChanges":    14,
+			"general":           15,
+		},
+		bitLen: 16,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type DaysOfWeek struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewDaysOfWeek(arg Arg) (*DaysOfWeek, error) {
+	s := &DaysOfWeek{
+		bitNames: map[string]int{
+			"monday":    0,
+			"tuesday":   1,
+			"wednesday": 2,
+			"thursday":  3,
+			"friday":    4,
+			"saturday":  5,
+			"sunday":    6,
+		},
+		bitLen: 7,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type EventTransitionBits struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewEventTransitionBits(arg Arg) (*EventTransitionBits, error) {
+	s := &EventTransitionBits{
+		bitNames: map[string]int{
+			"toOffnormal": 0,
+			"toFault":     1,
+			"toNormal":    2,
+		},
+		bitLen: 3,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type LimitEnable struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewLimitEnable(arg Arg) (*LimitEnable, error) {
+	s := &LimitEnable{
+		bitNames: map[string]int{
+			"lowLimitEnable":  0,
+			"highLimitEnable": 1,
+		},
+		bitLen: 2,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type LogStatus struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewLogStatus(arg Arg) (*LogStatus, error) {
+	s := &LogStatus{
+		bitNames: map[string]int{
+			"logDisabled":    0,
+			"bufferPurged":   1,
+			"logInterrupted": 2,
+		},
+		bitLen: 3,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type ObjectTypesSupported struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewObjectTypesSupported(arg Arg) (*ObjectTypesSupported, error) {
+	s := &ObjectTypesSupported{
+		bitNames: map[string]int{
+			"analogInput":           0,
+			"analogOutput":          1,
+			"analogValue":           2,
+			"binaryInput":           3,
+			"binaryOutput":          4,
+			"binaryValue":           5,
+			"calendar":              6,
+			"command":               7,
+			"device":                8,
+			"eventEnrollment":       9,
+			"file":                  10,
+			"group":                 11,
+			"loop":                  12,
+			"multiStateInput":       13,
+			"multiStateOutput":      14,
+			"notificationClass":     15,
+			"program":               16,
+			"schedule":              17,
+			"averaging":             18,
+			"multiStateValue":       19,
+			"trendLog":              20,
+			"lifeSafetyPoint":       21,
+			"lifeSafetyZone":        22,
+			"accumulator":           23,
+			"pulseConverter":        24,
+			"eventLog":              25,
+			"globalGroup":           26,
+			"trendLogMultiple":      27,
+			"loadControl":           28,
+			"structuredView":        29,
+			"accessDoor":            30,
+			"accessCredential":      32,
+			"accessPoint":           33,
+			"accessRights":          34,
+			"accessUser":            35,
+			"accessZone":            36,
+			"credentialDataInput":   37,
+			"networkSecurity":       38, // removed revision 22
+			"bitstringValue":        39,
+			"characterstringValue":  40,
+			"datePatternValue":      41,
+			"dateValue":             42,
+			"datetimePatternValue":  43,
+			"datetimeValue":         44,
+			"integerValue":          45,
+			"largeAnalogValue":      46,
+			"octetstringValue":      47,
+			"positiveIntegerValue":  48,
+			"timePatternValue":      49,
+			"timeValue":             50,
+			"notificationForwarder": 51,
+			"alertEnrollment":       52,
+			"channel":               53,
+			"lightingOutput":        54,
+			"binaryLightingOutput":  55,
+			"networkPort":           56,
+			"elevatorGroup":         57,
+			"escalator":             58,
+			"lift":                  59,
+			"staging":               60,
+			"auditLog":              61,
+			"auditReporter":         62,
+		},
+		bitLen: 63,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type PriorityFilter struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewPriorityFilter(arg Arg) (*PriorityFilter, error) {
+	s := &PriorityFilter{
+		bitNames: map[string]int{
+			"manualLifeSafety":          0,
+			"automaticLifeSafety":       1,
+			"priority3":                 2,
+			"priority4":                 3,
+			"criticalEquipmentControls": 4,
+			"minimumOnOff":              5,
+			"priority7":                 6,
+			"manualOperator":            7,
+			"priority9":                 8,
+			"priority10":                9,
+			"priority11":                10,
+			"priority12":                11,
+			"priority13":                12,
+			"priority14":                13,
+			"priority15":                14,
+			"priority16":                15,
+		},
+		bitLen: 16,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type ResultFlags struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewResultFlags(arg Arg) (*ResultFlags, error) {
+	s := &ResultFlags{
+		bitNames: map[string]int{
+			"firstItem": 0,
+			"lastItem":  1,
+			"moreItems": 2,
+		},
+		bitLen: 3,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type ServicesSupported struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewServicesSupported(arg Arg) (*ServicesSupported, error) {
+	s := &ServicesSupported{
+		bitNames: map[string]int{
+			"acknowledgeAlarm":           0,
+			"confirmedCOVNotification":   1,
+			"confirmedEventNotification": 2,
+			"getAlarmSummary":            3,
+			"getEnrollmentSummary":       4,
+			"subscribeCOV":               5,
+			"atomicReadFile":             6,
+			"atomicWriteFile":            7,
+			"addListElement":             8,
+			"removeListElement":          9,
+			"createObject":               10,
+			"deleteObject":               11,
+			"readProperty":               12,
+			// "readPropertyConditional": 13      // removed in version 1 revision 12,
+			"readPropertyMultiple":       14,
+			"writeProperty":              15,
+			"writePropertyMultiple":      16,
+			"deviceCommunicationControl": 17,
+			"confirmedPrivateTransfer":   18,
+			"confirmedTextMessage":       19,
+			"reinitializeDevice":         20,
+			"vtOpen":                     21,
+			"vtClose":                    22,
+			"vtData":                     23,
+			// "authenticate": 24                 // removed in version 1 revision 11,
+			// "requestKey": 25                   // removed in version 1 revision 11,
+			"iAm":                                26,
+			"iHave":                              27,
+			"unconfirmedCOVNotification":         28,
+			"unconfirmedEventNotification":       29,
+			"unconfirmedPrivateTransfer":         30,
+			"unconfirmedTextMessage":             31,
+			"timeSynchronization":                32,
+			"whoHas":                             33,
+			"whoIs":                              34,
+			"readRange":                          35,
+			"utcTimeSynchronization":             36,
+			"lifeSafetyOperation":                37,
+			"subscribeCOVProperty":               38,
+			"getEventInformation":                39,
+			"writeGroup":                         40,
+			"subscribeCOVPropertyMultiple":       41,
+			"confirmedCOVNotificationMultiple":   42,
+			"unconfirmedCOVNotificationMultiple": 43,
+			"confirmedAuditNotification":         44,
+			"auditLogQuery":                      45,
+			"unconfirmedAuditNotification":       46,
+			"whoAmI":                             47,
+			"youAre":                             48,
+		},
+		bitLen: 49,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+type StatusFlags struct {
+	*BitString
+	bitLen      int
+	bitNames    map[string]int
+	vendorRange vendorRange
+}
+
+func NewStatusFlags(arg Arg) (*StatusFlags, error) {
+	s := &StatusFlags{
+		bitNames: map[string]int{
+			"inAlarm":      0,
+			"fault":        1,
+			"overridden":   2,
+			"outOfService": 3,
+		},
+		bitLen: 4,
+	}
+	panic("implement me")
+	return s, nil
+}
+
+//
+//   Enumerations
+//
+
+type AccessAuthenticationFactorDisable struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessAuthenticationFactorDisable(arg Arg) (*AccessAuthenticationFactorDisable, error) {
+	s := &AccessAuthenticationFactorDisable{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"none": 0,
+			"disabled":          1,
+			"disabledLost":      2,
+			"disabledStolen":    3,
+			"disabledDamaged":   4,
+			"disabledDestroyed": 5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessCredentialDisable struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessCredentialDisable(arg Arg) (*AccessCredentialDisable, error) {
+	s := &AccessCredentialDisable{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"none": 0,
+			"disable":        1,
+			"disableManual":  2,
+			"disableLockout": 3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessCredentialDisableReason struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessCredentialDisableReason(arg Arg) (*AccessCredentialDisableReason, error) {
+	s := &AccessCredentialDisableReason{
+		enumerations: map[string]uint64{"disabled": 0,
+			"disabledNeedsProvisioning": 1,
+			"disabledUnassigned":        2,
+			"disabledNotYetActive":      3,
+			"disabledExpired":           4,
+			"disabledLockout":           5,
+			"disabledMaxDays":           6,
+			"disabledMaxUses":           7,
+			"disabledInactivity":        8,
+			"disabledManual":            9,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessEvent struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessEvent(arg Arg) (*AccessEvent, error) {
+	s := &AccessEvent{
+		vendorRange: vendorRange{512, 65535},
+		enumerations: map[string]uint64{"none": 0,
+			"granted":                             1,
+			"muster":                              2,
+			"passbackDetected":                    3,
+			"duress":                              4,
+			"trace":                               5,
+			"lockoutMaxAttempts":                  6,
+			"lockoutOther":                        7,
+			"lockoutRelinquished":                 8,
+			"lockedByHigherPriority":              9,
+			"outOfService":                        10,
+			"outOfServiceRelinquished":            11,
+			"accompanimentBy":                     12,
+			"authenticationFactorRead":            13,
+			"authorizationDelayed":                14,
+			"verificationRequired":                15,
+			"deniedDenyAll":                       128,
+			"deniedUnknownCredential":             129,
+			"deniedAuthenticationUnavailable":     130,
+			"deniedAuthenticationFactorTimeout":   131,
+			"deniedIncorrectAuthenticationFactor": 132,
+			"deniedZoneNoAccessRights":            133,
+			"deniedPointNoAccessRights":           134,
+			"deniedNoAccessRights":                135,
+			"deniedOutOfTimeRange":                136,
+			"deniedThreatLevel":                   137,
+			"deniedPassback":                      138,
+			"deniedUnexpectedLocationUsage":       139,
+			"deniedMaxAttempts":                   140,
+			"deniedLowerOccupancyLimit":           141,
+			"deniedUpperOccupancyLimit":           142,
+			"deniedAuthenticationFactorLost":      143,
+			"deniedAuthenticationFactorStolen":    144,
+			"deniedAuthenticationFactorDamaged":   145,
+			"deniedAuthenticationFactorDestroyed": 146,
+			"deniedAuthenticationFactorDisabled":  147,
+			"deniedAuthenticationFactorError":     148,
+			"deniedCredentialUnassigned":          149,
+			"deniedCredentialNotProvisioned":      150,
+			"deniedCredentialNotYetActive":        151,
+			"deniedCredentialExpired":             152,
+			"deniedCredentialManualDisable":       153,
+			"deniedCredentialLockout":             154,
+			"deniedCredentialMaxDays":             155,
+			"deniedCredentialMaxUses":             156,
+			"deniedCredentialInactivity":          157,
+			"deniedCredentialDisabled":            158,
+			"deniedNoAccompaniment":               159,
+			"deniedIncorrectAccompaniment":        160,
+			"deniedLockout":                       161,
+			"deniedVerificationFailed":            162,
+			"deniedVerificationTimeout":           163,
+			"deniedOther":                         164,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessPassbackMode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessPassbackMode(arg Arg) (*AccessPassbackMode, error) {
+	s := &AccessPassbackMode{
+		enumerations: map[string]uint64{"passbackOff": 0,
+			"hardPassback": 1,
+			"softPassback": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessRuleTimeRangeSpecifier struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessRuleTimeRangeSpecifier(arg Arg) (*AccessRuleTimeRangeSpecifier, error) {
+	s := &AccessRuleTimeRangeSpecifier{
+		enumerations: map[string]uint64{"specified": 0,
+			"always": 1,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessRuleLocationSpecifier struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessRuleLocationSpecifier(arg Arg) (*AccessRuleLocationSpecifier, error) {
+	s := &AccessRuleLocationSpecifier{
+		enumerations: map[string]uint64{"specified": 0,
+			"all": 1,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessUserType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessUserType(arg Arg) (*AccessUserType, error) {
+	s := &AccessUserType{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"asset": 0,
+			"group":  1,
+			"person": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccessZoneOccupancyState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccessZoneOccupancyState(arg Arg) (*AccessZoneOccupancyState, error) {
+	s := &AccessZoneOccupancyState{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"normal": 0,
+			"belowLowerLimit": 1,
+			"atLowerLimit":    2,
+			"atUpperLimit":    3,
+			"aboveUpperLimit": 4,
+			"disabled":        5,
+			"notSupported":    6,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AccumulatorRecordAccumulatorStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAccumulatorRecordAccumulatorStatus(arg Arg) (*AccumulatorRecordAccumulatorStatus, error) {
+	s := &AccumulatorRecordAccumulatorStatus{
+		enumerations: map[string]uint64{"normal": 0,
+			"starting":  1,
+			"recovered": 2,
+			"abnormal":  3,
+			"failed":    4,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type Action struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAction(arg Arg) (*Action, error) {
+	s := &Action{
+		enumerations: map[string]uint64{"direct": 0,
+			"reverse": 1,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AuditLevel struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAuditLevel(arg Arg) (*AuditLevel, error) {
+	s := &AuditLevel{
+		vendorRange: vendorRange{128, 255},
+		enumerations: map[string]uint64{"none": 0,
+			"auditAll":    1,
+			"auditConfig": 2,
+			"default":     3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AuditOperation struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAuditOperation(arg Arg) (*AuditOperation, error) {
+	s := &AuditOperation{
+		vendorRange: vendorRange{32, 63},
+		enumerations: map[string]uint64{"read": 0,
+			"write":             1,
+			"create":            2,
+			"delete":            3,
+			"lifeSafety":        4,
+			"acknowledgeAlarm":  5,
+			"deviceDisableComm": 6,
+			"deviceEnableComm":  7,
+			"deviceReset":       8,
+			"deviceBackup":      9,
+			"deviceRestore":     10,
+			"subscription":      11,
+			"notification":      12,
+			"auditingFailure":   13,
+			"networkChanges":    14,
+			"general":           15,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AuthenticationFactorType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAuthenticationFactorType(arg Arg) (*AuthenticationFactorType, error) {
+	s := &AuthenticationFactorType{
+		enumerations: map[string]uint64{"undefined": 0,
+			"error":              1,
+			"custom":             2,
+			"simpleNumber16":     3,
+			"simpleNumber32":     4,
+			"simpleNumber56":     5,
+			"simpleAlphaNumeric": 6,
+			"abaTrack2":          7,
+			"wiegand26":          8,
+			"wiegand37":          9,
+			"wiegand37facility":  10,
+			"facility16card32":   11,
+			"facility32card32":   12,
+			"fascN":              13,
+			"fascNbcd":           14,
+			"fascNlarge":         15,
+			"fascNlargeBcd":      16,
+			"gsa75":              17,
+			"chuid":              18,
+			"chuidFull":          19,
+			"guid":               20,
+			"cbeffA":             21,
+			"cbeffB":             22,
+			"cbeffC":             23,
+			"userPassword":       24,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AuthenticationStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAuthenticationStatus(arg Arg) (*AuthenticationStatus, error) {
+	s := &AuthenticationStatus{
+		enumerations: map[string]uint64{"notReady": 0,
+			"ready":                          1,
+			"disabled":                       2,
+			"waitingForAuthenticationFactor": 3,
+			"waitingForAccompaniment":        4,
+			"waitingForVerification":         5,
+			"inProgress":                     6,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AuthorizationException struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAuthorizationException(arg Arg) (*AuthorizationException, error) {
+	s := &AuthorizationException{
+		vendorRange: vendorRange{64, 255},
+		enumerations: map[string]uint64{"passback": 0,
+			"occupancyCheck":     1,
+			"accessRights":       2,
+			"lockout":            3,
+			"deny":               4,
+			"verification":       5,
+			"authorizationDelay": 6,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type AuthorizationMode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewAuthorizationMode(arg Arg) (*AuthorizationMode, error) {
+	s := &AuthorizationMode{
+		vendorRange: vendorRange{64, 65536},
+		enumerations: map[string]uint64{"authorize": 0,
+			"grantActive":          1,
+			"denyAll":              2,
+			"verificationRequired": 3,
+			"authorizationDelayed": 4,
+			"none":                 5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type BackupState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewBackupState(arg Arg) (*BackupState, error) {
+	s := &BackupState{
+		enumerations: map[string]uint64{"idle": 0,
+			"preparingForBackup":  1,
+			"preparingForRestore": 2,
+			"performingABackup":   3,
+			"performingARestore":  4,
+			"backupFailure":       5,
+			"restoreFailure":      6,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type BinaryLightingPV struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewBinaryLightingPV(arg Arg) (*BinaryLightingPV, error) {
+	s := &BinaryLightingPV{
+		vendorRange: vendorRange{64, 255},
+		enumerations: map[string]uint64{"off": 0,
+			"on":             1,
+			"warn":           2,
+			"warnOff":        3,
+			"warnRelinquish": 4,
+			"stop":           5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type BinaryPV struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewBinaryPV(arg Arg) (*BinaryPV, error) {
+	s := &BinaryPV{
+		enumerations: map[string]uint64{"inactive": 0,
+			"active": 1,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type DeviceStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewDeviceStatus(arg Arg) (*DeviceStatus, error) {
+	s := &DeviceStatus{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"operational": 0,
+			"operationalReadOnly": 1,
+			"downloadRequired":    2,
+			"downloadInProgress":  3,
+			"nonOperational":      4,
+			"backupInProgress":    5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type DoorAlarmState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewDoorAlarmState(arg Arg) (*DoorAlarmState, error) {
+	s := &DoorAlarmState{
+		vendorRange: vendorRange{256, 65535},
+		enumerations: map[string]uint64{"normal": 0,
+			"alarm":           1,
+			"doorOpenTooLong": 2,
+			"forcedOpen":      3,
+			"tamper":          4,
+			"doorFault":       5,
+			"lockDown":        6,
+			"freeAccess":      7,
+			"egressOpen":      8,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type DoorSecuredStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewDoorSecuredStatus(arg Arg) (*DoorSecuredStatus, error) {
+	s := &DoorSecuredStatus{
+		enumerations: map[string]uint64{"secured": 0,
+			"unsecured": 1,
+			"unknown":   2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type DoorStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewDoorStatus(arg Arg) (*DoorStatus, error) {
+	s := &DoorStatus{
+		enumerations: map[string]uint64{"closed": 0,
+			"opened":  1,
+			"unknown": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type DoorValue struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewDoorValue(arg Arg) (*DoorValue, error) {
+	s := &DoorValue{
+		enumerations: map[string]uint64{"lock": 0,
+			"unlock":              1,
+			"pulseUnlock":         2,
+			"extendedPulseUnlock": 3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type EngineeringUnits struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewEngineeringUnits(arg Arg) (*EngineeringUnits, error) {
+	s := &EngineeringUnits{
+		vendorRange: vendorRange{256, 65535},
+		enumerations: map[string]uint64{
+			//Acceleration
+			"metersPerSecondPerSecond": 166,
+			"squareMeters":             0,
+			"squareCentimeters":        116,
+			"squareFeet":               1,
+			"squareInches":             115,
+			//Currency
+			"currency1":  105,
+			"currency2":  106,
+			"currency3":  107,
+			"currency4":  108,
+			"currency5":  109,
+			"currency6":  110,
+			"currency7":  111,
+			"currency8":  112,
+			"currency9":  113,
+			"currency10": 114,
+			//Electrical
+			"milliamperes":                2,
+			"amperes":                     3,
+			"amperesPerMeter":             167,
+			"amperesPerSquareMeter":       168,
+			"ampereSquareMeters":          169,
+			"decibels":                    199,
+			"decibelsMillivolt":           200,
+			"decibelsVolt":                201,
+			"farads":                      170,
+			"henrys":                      171,
+			"ohms":                        4,
+			"ohmMeters":                   172,
+			"ohmMeterPerSquareMeter":      237,
+			"milliohms":                   145,
+			"kilohms":                     122,
+			"megohms":                     123,
+			"microSiemens":                190,
+			"millisiemens":                202,
+			"siemens":                     173,
+			"siemensPerMeter":             174,
+			"teslas":                      175,
+			"volts":                       5,
+			"millivolts":                  124,
+			"kilovolts":                   6,
+			"megavolts":                   7,
+			"voltAmperes":                 8,
+			"kilovoltAmperes":             9,
+			"megavoltAmperes":             10,
+			"ampereSeconds":               238,
+			"ampereSquareHours":           246,
+			"voltAmpereHours":             239, //VAh
+			"kilovoltAmpereHours":         240, //kVAh
+			"megavoltAmpereHours":         241, //MVAh
+			"voltAmperesReactive":         11,
+			"kilovoltAmperesReactive":     12,
+			"megavoltAmperesReactive":     13,
+			"voltAmpereHoursReactive":     242, //varh
+			"kilovoltAmpereHoursReactive": 243, //kvarh
+			"megavoltAmpereHoursReactive": 244, //Mvarh
+			"voltsPerDegreeKelvin":        176,
+			"voltsPerMeter":               177,
+			"voltsSquareHours":            245,
+			"degreesPhase":                14,
+			"powerFactor":                 15,
+			"webers":                      178,
+			// Energy
+			"joules":                16,
+			"kilojoules":            17,
+			"kilojoulesPerKilogram": 125,
+			"megajoules":            126,
+			"joulesPerHours":        247,
+			"wattHours":             18,
+			"kilowattHours":         19,
+			"megawattHours":         146,
+			"wattHoursReactive":     203,
+			"kilowattHoursReactive": 204,
+			"megawattHoursReactive": 205,
+			"btus":                  20,
+			"kiloBtus":              147,
+			"megaBtus":              148,
+			"therms":                21,
+			"tonHours":              22,
+			// Enthalpy
+			"joulesPerKilogramDryAir":     23,
+			"kilojoulesPerKilogramDryAir": 149,
+			"megajoulesPerKilogramDryAir": 150,
+			"btusPerPoundDryAir":          24,
+			"btusPerPound":                117,
+			"joulesPerDegreeKelvin":       127,
+			// Entropy
+			"kilojoulesPerDegreeKelvin":     151,
+			"megajoulesPerDegreeKelvin":     152,
+			"joulesPerKilogramDegreeKelvin": 128,
+			// Force
+			"newton": 153,
+			// Frequency
+			"cyclesPerHour":                   25,
+			"cyclesPerMinute":                 26,
+			"hertz":                           27,
+			"kilohertz":                       129,
+			"megahertz":                       130,
+			"perHour":                         131,
+			"gramsOfWaterPerKilogramDryAir":   28,
+			"percentRelativeHumidity":         29,
+			"micrometers":                     194,
+			"millimeters":                     30,
+			"centimeters":                     118,
+			"kilometers":                      193,
+			"meters":                          31,
+			"inches":                          32,
+			"feet":                            33,
+			"candelas":                        179,
+			"candelasPerSquareMeter":          180,
+			"wattsPerSquareFoot":              34,
+			"wattsPerSquareMeter":             35,
+			"lumens":                          36,
+			"luxes":                           37,
+			"footCandles":                     38,
+			"milligrams":                      196,
+			"grams":                           195,
+			"kilograms":                       39,
+			"poundsMass":                      40,
+			"tons":                            41,
+			"gramsPerSecond":                  154,
+			"gramsPerMinute":                  155,
+			"kilogramsPerSecond":              42,
+			"kilogramsPerMinute":              43,
+			"kilogramsPerHour":                44,
+			"poundsMassPerSecond":             119,
+			"poundsMassPerMinute":             45,
+			"poundsMassPerHour":               46,
+			"tonsPerHour":                     156,
+			"milliwatts":                      132,
+			"watts":                           47,
+			"kilowatts":                       48,
+			"megawatts":                       49,
+			"btusPerHour":                     50,
+			"kiloBtusPerHour":                 157,
+			"horsepower":                      51,
+			"tonsRefrigeration":               52,
+			"pascals":                         53,
+			"hectopascals":                    133,
+			"kilopascals":                     54,
+			"pascalSeconds":                   253,
+			"millibars":                       134,
+			"bars":                            55,
+			"poundsForcePerSquareInch":        56,
+			"millimetersOfWater":              206,
+			"centimetersOfWater":              57,
+			"inchesOfWater":                   58,
+			"millimetersOfMercury":            59,
+			"centimetersOfMercury":            60,
+			"inchesOfMercury":                 61,
+			"degreesCelsius":                  62,
+			"degreesKelvin":                   63,
+			"degreesKelvinPerHour":            181,
+			"degreesKelvinPerMinute":          182,
+			"degreesFahrenheit":               64,
+			"degreeDaysCelsius":               65,
+			"degreeDaysFahrenheit":            66,
+			"deltaDegreesFahrenheit":          120,
+			"deltaDegreesKelvin":              121,
+			"years":                           67,
+			"months":                          68,
+			"weeks":                           69,
+			"days":                            70,
+			"hours":                           71,
+			"minutes":                         72,
+			"seconds":                         73,
+			"hundredthsSeconds":               158,
+			"milliseconds":                    159,
+			"newtonMeters":                    160,
+			"millimetersPerSecond":            161,
+			"millimetersPerMinute":            162,
+			"metersPerSecond":                 74,
+			"metersPerMinute":                 163,
+			"metersPerHour":                   164,
+			"kilometersPerHour":               75,
+			"feetPerSecond":                   76,
+			"feetPerMinute":                   77,
+			"milesPerHour":                    78,
+			"cubicFeet":                       79,
+			"cubicFeetPerDay":                 248,
+			"cubicMeters":                     80,
+			"cubicMetersPerDay":               249,
+			"imperialGallons":                 81,
+			"milliliters":                     197,
+			"liters":                          82,
+			"usGallons":                       83,
+			"cubicFeetPerSecond":              142,
+			"cubicFeetPerMinute":              84,
+			"cubicFeetPerHour":                191,
+			"cubicMetersPerSecond":            85,
+			"cubicMetersPerMinute":            165,
+			"cubicMetersPerHour":              135,
+			"imperialGallonsPerMinute":        86,
+			"millilitersPerSecond":            198,
+			"litersPerSecond":                 87,
+			"litersPerMinute":                 88,
+			"litersPerHour":                   136,
+			"usGallonsPerMinute":              89,
+			"usGallonsPerHour":                192,
+			"degreesAngular":                  90,
+			"degreesCelsiusPerHour":           91,
+			"degreesCelsiusPerMinute":         92,
+			"degreesFahrenheitPerHour":        93,
+			"degreesFahrenheitPerMinute":      94,
+			"jouleSeconds":                    183,
+			"kilogramsPerCubicMeter":          186,
+			"kilowattHoursPerSquareMeter":     137,
+			"kilowattHoursPerSquareFoot":      138,
+			"megajoulesPerSquareMeter":        139,
+			"megajoulesPerSquareFoot":         140,
+			"noUnits":                         95,
+			"newtonSeconds":                   187,
+			"newtonsPerMeter":                 188,
+			"partsPerMillion":                 96,
+			"partsPerBillion":                 97,
+			"percent":                         98,
+			"percentObscurationPerFoot":       143,
+			"percentObscurationPerMeter":      144,
+			"percentPerSecond":                99,
+			"perMinute":                       100,
+			"perSecond":                       101,
+			"psiPerDegreeFahrenheit":          102,
+			"radians":                         103,
+			"radiansPerSecond":                184,
+			"revolutionsPerMinute":            104,
+			"squareMetersPerNewton":           185,
+			"wattsPerMeterPerDegreeKelvin":    189,
+			"wattsPerSquareMeterDegreeKelvin": 141,
+			"perMille":                        207,
+			"gramsPerGram":                    208,
+			"kilogramsPerKilogram":            209,
+			"gramsPerKilogram":                210,
+			"milligramsPerGram":               211,
+			"milligramsPerKilogram":           212,
+			"gramsPerMilliliter":              213,
+			"gramsPerLiter":                   214,
+			"milligramsPerLiter":              215,
+			"microgramsPerLiter":              216,
+			"gramsPerCubicMeter":              217,
+			"milligramsPerCubicMeter":         218,
+			"microgramsPerCubicMeter":         219,
+			"nanogramsPerCubicMeter":          220,
+			"gramsPerCubicCentimeter":         221,
+			"wattHoursPerCubicMeter":          250,
+			"joulesPerCubicMeter":             251,
+			"becquerels":                      222,
+			"kilobecquerels":                  223,
+			"megabecquerels":                  224,
+			"gray":                            225,
+			"milligray":                       226,
+			"microgray":                       227,
+			"sieverts":                        228,
+			"millisieverts":                   229,
+			"microsieverts":                   230,
+			"microsievertsPerHour":            231,
+			"decibelsA":                       232,
+			"nephelometricTurbidityUnit":      233,
+			"pH":                              234,
+			"gramsPerSquareMeter":             235,
+			"minutesPerDegreeKelvin":          236,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type ErrorClass struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewErrorClass(arg Arg) (*ErrorClass, error) {
+	s := &ErrorClass{
+		enumerations: map[string]uint64{"device": 0,
+			"object":        1,
+			"property":      2,
+			"resources":     3,
+			"security":      4,
+			"services":      5,
+			"vt":            6,
+			"communication": 7,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type ErrorCode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewErrorCode(arg Arg) (*ErrorCode, error) {
+	s := &ErrorCode{
+		enumerations: map[string]uint64{"abortApduTooLong": 123,
+			"abortApplicationExceededReplyTime":  124,
+			"abortBufferOverflow":                51,
+			"abortInsufficientSecurity":          135,
+			"abortInvalidApduInThisState":        52,
+			"abortOther":                         56,
+			"abortOutOfResources":                125,
+			"abortPreemptedByHigherPriorityTask": 53,
+			"abortProprietary":                   55,
+			"abortSecurityError":                 136,
+			"abortSegmentationNotSupported":      54,
+			"abortTsmTimeout":                    126,
+			"abortWindowSizeOutOfRange":          127,
+			"accessDenied":                       85,
+			"addressingError":                    115,
+			"badDestinationAddress":              86,
+			"badDestinationDeviceId":             87,
+			"badSignature":                       88,
+			"badSourceAddress":                   89,
+			"badTimestamp":                       90, //Removed revision 22
+			"busy":                               82,
+			"bvlcFunctionUnknown":                143,
+			"bvlcProprietaryFunctionUnknown":     144,
+			"cannotUseKey":                       91, //Removed revision 22
+			"cannotVerifyMessageId":              92, // Removed revision 22
+			"characterSetNotSupported":           41,
+			"communicationDisabled":              83,
+			"configurationInProgress":            2,
+			"correctKeyRevision":                 93, // Removed revision 22
+			"covSubscriptionFailed":              43,
+			"datatypeNotSupported":               47,
+			"deleteFdtEntryFailed":               120,
+			"deviceBusy":                         3,
+			"destinationDeviceIdRequired":        94, // Removed revision 22
+			"distributeBroadcastFailed":          121,
+			"dnsError":                           192,
+			"dnsNameResolutionFailed":            190,
+			"dnsResolverFailure":                 191,
+			"dnsUnavailable":                     189,
+			"duplicateEntry":                     137,
+			"duplicateMessage":                   95,
+			"duplicateName":                      48,
+			"duplicateObjectId":                  49,
+			"dynamicCreationNotSupported":        4,
+			"encryptionNotConfigured":            96,
+			"encryptionRequired":                 97,
+			"fileAccessDenied":                   5,
+			"fileFull":                           128,
+			"headerEncodingError":                145,
+			"headerNotUnderstood":                146,
+			"httpError":                          165,
+			"httpNoUpgrade":                      153,
+			"httpNotAServer":                     164,
+			"httpResourceNotLocal":               154,
+			"httpProxyAuthenticationFailed":      155,
+			"httpResponseTimeout":                156,
+			"httpResponseSyntaxError":            157,
+			"httpResponseValueError":             158,
+			"httpResponseMissingHeader":          159,
+			"httpTemporaryUnavailable":           163,
+			"httpUnexpectedResponseCode":         152,
+			"httpUpgradeRequired":                161,
+			"httpUpgradeError":                   162,
+			"httpWebsocketHeaderError":           160,
+			"inconsistentConfiguration":          129,
+			"inconsistentObjectType":             130,
+			"inconsistentParameters":             7,
+			"inconsistentSelectionCriterion":     8,
+			"incorrectKey":                       98, // Removed revision 22
+			"internalError":                      131,
+			"invalidArrayIndex":                  42,
+			"invalidConfigurationData":           46,
+			"invalidDataEncoding":                142,
+			"invalidDataType":                    9,
+			"invalidEventState":                  73,
+			"invalidFileAccessMethod":            10,
+			"invalidFileStartPosition":           11,
+			"invalidKeyData":                     99, // Removed revision 22
+			"invalidParameterDataType":           13,
+			"invalidTag":                         57,
+			"invalidTimeStamp":                   14,
+			"invalidValueInThisState":            138,
+			"ipAddressNotReachable":              198,
+			"ipError":                            199,
+			"keyUpdateInProgress":                100, // Removed revision 22
+			"listElementNotFound":                81,
+			"listItemNotNumbered":                140,
+			"listItemNotTimestamped":             141,
+			"logBufferFull":                      75,
+			"loggedValuePurged":                  76,
+			"malformedMessage":                   101,
+			"messageTooLong":                     113,
+			"messageIncomplete":                  147,
+			"missingRequiredParameter":           16,
+			"networkDown":                        58,
+			"noAlarmConfigured":                  74,
+			"noObjectsOfSpecifiedType":           17,
+			"noPropertySpecified":                77,
+			"noSpaceForObject":                   18,
+			"noSpaceToAddListElement":            19,
+			"noSpaceToWriteProperty":             20,
+			"noVtSessionsAvailable":              21,
+			"nodeDuplicateVmac":                  151,
+			"notABacnetScHub":                    148,
+			"notConfigured":                      132,
+			"notConfiguredForTriggeredLogging":   78,
+			"notCovProperty":                     44,
+			"notKeyServer":                       102, // Removed revision 22
+			"notRouterToDnet":                    110,
+			"objectDeletionNotPermitted":         23,
+			"objectIdentifierAlreadyExists":      24,
+			"other":                              0,
+			"operationalProblem":                 25,
+			"optionalFunctionalityNotSupported":  45,
+			"outOfMemory":                        133,
+			"parameterOutOfRange":                80,
+			"passwordFailure":                    26,
+			"payloadExpected":                    149,
+			"propertyIsNotAList":                 22,
+			"propertyIsNotAnArray":               50,
+			"readAccessDenied":                   27,
+			"readBdtFailed":                      117,
+			"readFdtFailed":                      119,
+			"registerForeignDeviceFailed":        118,
+			"rejectBufferOverflow":               59,
+			"rejectInconsistentParameters":       60,
+			"rejectInvalidParameterDataType":     61,
+			"rejectInvalidTag":                   62,
+			"rejectMissingRequiredParameter":     63,
+			"rejectParameterOutOfRange":          64,
+			"rejectTooManyArguments":             65,
+			"rejectUndefinedEnumeration":         66,
+			"rejectUnrecognizedService":          67,
+			"rejectProprietary":                  68,
+			"rejectOther":                        69,
+			"routerBusy":                         111,
+			"securityError":                      114,
+			"securityNotConfigured":              103,
+			"serviceRequestDenied":               29,
+			"sourceSecurityRequired":             104,
+			"success":                            84,
+			"tcpClosedByLocal":                   195,
+			"tcpClosedOther":                     196,
+			"tcpConnectTimeout":                  193,
+			"tcpConnectionRefused":               194,
+			"tcpError":                           197,
+			"timeout":                            30,
+			"tlsClientAuthenticationFailed":      182,
+			"tlsClientCertificateError":          180,
+			"tlsClientCertificateExpired":        184,
+			"tlsClientCertificateRevoked":        186,
+			"tleError":                           188,
+			"tlsServerAuthenticationFailed":      183,
+			"tlsServerCertificateError":          181,
+			"tlsServerCertificateExpired":        185,
+			"tlsServerCertificateRevoked":        187,
+			"tooManyKeys":                        105, // Removed revision 22
+			"unexpectedData":                     150,
+			"unknownAuthenticationType":          106,
+			"unknownDevice":                      70,
+			"unknownFileSize":                    122,
+			"unknownKey":                         107, // Removed revision 22
+			"unknownKeyRevision":                 108, // Removed revision 22
+			"unknownNetworkMessage":              112,
+			"unknownObject":                      31,
+			"unknownProperty":                    32,
+			"unknownSubscription":                79,
+			"umknownRoute":                       71,
+			"unknownSourceMessage":               109, // Removed revision 22
+			"unknownVtClass":                     34,
+			"unknownVtSession":                   35,
+			"unsupportedObjectType":              36,
+			"valueNotInitialized":                72,
+			"valueOutOfRange":                    37,
+			"valueTooLong":                       134,
+			"vtSessionAlreadyClosed":             38,
+			"vtSessionTerminationFailure":        39,
+			"websocket-close-error":              168,
+			"websocket-closed-abnormally":        173,
+			"websocket-closed-by-peer":           169,
+			"websocket-data-against-policy":      175,
+			"websocket-data-inconsistent":        174,
+			"websocket-data-not-accepted":        172,
+			"websocket-endpoint-leaves":          170,
+			"websocket-error":                    179,
+			"websocket-extension-missing":        177,
+			"websocket-frame-too-long":           176,
+			"websocket-protocol-error":           171,
+			"websocket-request-unavailable":      178,
+			"websocket-scheme-not-supported":     166,
+			"websocket-unknown-control-message":  167,
+			"writeAccessDenied":                  40,
+			"writeBdtFailed":                     116,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type EscalatorMode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewEscalatorMode(arg Arg) (*EscalatorMode, error) {
+	s := &EscalatorMode{
+		vendorRange: vendorRange{1024, 65535},
+		enumerations: map[string]uint64{"unknown": 0,
+			"stop":         1,
+			"up":           2,
+			"down":         3,
+			"inspection":   4,
+			"outOfService": 5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type EscalatorOperationDirection struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewEscalatorOperationDirection(arg Arg) (*EscalatorOperationDirection, error) {
+	s := &EscalatorOperationDirection{
+		vendorRange: vendorRange{1024, 65535},
+		enumerations: map[string]uint64{"unknown": 0,
+			"stopped":          1,
+			"upRatedSpeed":     2,
+			"upReducedSpeed":   3,
+			"downRatedSpeed":   4,
+			"downReducedSpeed": 5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type EventState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewEventState(arg Arg) (*EventState, error) {
+	s := &EventState{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"normal": 0,
+			"fault":           1,
+			"offnormal":       2,
+			"highLimit":       3,
+			"lowLimit":        4,
+			"lifeSafetyAlarm": 5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type EventType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewEventType(arg Arg) (*EventType, error) {
+	s := &EventType{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"changeOfBitstring": 0,
+			"changeOfState":  1,
+			"changeOfValue":  2,
+			"commandFailure": 3,
+			"floatingLimit":  4,
+			"outOfRange":     5,
+			// -- context tag 7 is deprecated
+			"changeOfLifeSafety": 8,
+			"extended":           9,
+			"bufferReady":        10,
+			"unsignedRange":      11,
+			// -- enumeration value 12 is reserved for future addenda
+			"accessEvent":             13,
+			"doubleOutOfRange":        14,
+			"signedOutOfRange":        15,
+			"unsignedOutOfRange":      16,
+			"changeOfCharacterstring": 17,
+			"changeOfStatusFlags":     18,
+			"changeOfReliability":     19,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type FaultType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewFaultType(arg Arg) (*FaultType, error) {
+	s := &FaultType{
+		enumerations: map[string]uint64{"none": 0,
+			"faultCharacterstring": 1,
+			"faultExtended":        2,
+			"faultLifeSafety":      3,
+			"faultState":           4,
+			"faultStatusFlags":     5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type FileAccessMethod struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewFileAccessMethod(arg Arg) (*FileAccessMethod, error) {
+	s := &FileAccessMethod{
+		enumerations: map[string]uint64{"recordAccess": 0,
+			"streamAccess": 1,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LiftCarDirection struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLiftCarDirection(arg Arg) (*LiftCarDirection, error) {
+	s := &LiftCarDirection{
+		vendorRange: vendorRange{1024, 65535},
+		enumerations: map[string]uint64{"unknown": 0,
+			"none":      1,
+			"stopped":   2,
+			"up":        3,
+			"down":      4,
+			"upAndDown": 5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LiftCarDoorCommand struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLiftCarDoorCommand(arg Arg) (*LiftCarDoorCommand, error) {
+	s := &LiftCarDoorCommand{
+		enumerations: map[string]uint64{"none": 0,
+			"open":  1,
+			"close": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LiftCarDriveStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLiftCarDriveStatus(arg Arg) (*LiftCarDriveStatus, error) {
+	s := &LiftCarDriveStatus{
+		vendorRange: vendorRange{1024, 65535},
+		enumerations: map[string]uint64{"unknown": 0,
+			"stationary":      1,
+			"braking":         2,
+			"accelerate":      3,
+			"decelerate":      4,
+			"ratedSpeed":      5,
+			"singleFloorJump": 6,
+			"twoFloorJump":    7,
+			"threeFloorJump":  8,
+			"multiFloorJump":  9,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LiftCarMode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLiftCarMode(arg Arg) (*LiftCarMode, error) {
+	s := &LiftCarMode{
+		vendorRange: vendorRange{1024, 65535},
+		enumerations: map[string]uint64{"unknown": 0,
+			"normal":              1,
+			"vip":                 2,
+			"homing":              3,
+			"parking":             4,
+			"attendantControl":    5,
+			"firefighterControl":  6,
+			"emergencyPower":      7,
+			"inspection":          8,
+			"cabinetRecall":       9,
+			"earthquakeOperation": 10,
+			"fireOperation":       11,
+			"outOfService":        12,
+			"occupantEvacuation":  13,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LiftFault struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLiftFault(arg Arg) (*LiftFault, error) {
+	s := &LiftFault{
+		vendorRange: vendorRange{1024, 65535},
+		enumerations: map[string]uint64{"controllerFault": 0,
+			"driveAndMotorFault":           1,
+			"governorAndSafetyGearFault":   2,
+			"liftShaftDeviceFault":         3,
+			"powerSupplyFault":             4,
+			"safetyInterlockFault":         5,
+			"doorClosingFault":             6,
+			"doorOpeningFault":             7,
+			"carStoppedOutsideLandingZone": 8,
+			"callButtonStuck":              9,
+			"startFailure":                 10,
+			"controllerSupplyFault":        11,
+			"sTestFailure":                 12,
+			"runtimeLimitExceeded":         13,
+			"positionLost":                 14,
+			"driveTemperatureExceeded":     15,
+			"loadMeasurementFault":         16,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LiftGroupMode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLiftGroupMode(arg Arg) (*LiftGroupMode, error) {
+	s := &LiftGroupMode{
+		enumerations: map[string]uint64{"unknown": 0,
+			"normal":         1,
+			"downPeak":       2,
+			"twoWay":         3,
+			"fourWay":        4,
+			"emergencyPower": 5,
+			"upPeak":         6,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LifeSafetyMode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLifeSafetyMode(arg Arg) (*LifeSafetyMode, error) {
+	s := &LifeSafetyMode{
+		enumerations: map[string]uint64{"off": 0,
+			"on":                       1,
+			"test":                     2,
+			"manned":                   3,
+			"unmanned":                 4,
+			"armed":                    5,
+			"disarmed":                 6,
+			"prearmed":                 7,
+			"slow":                     8,
+			"fast":                     9,
+			"disconnected":             10,
+			"enabled":                  11,
+			"disabled":                 12,
+			"automaticReleaseDisabled": 13,
+			"default":                  14,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LifeSafetyOperation struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLifeSafetyOperation(arg Arg) (*LifeSafetyOperation, error) {
+	s := &LifeSafetyOperation{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"none": 0,
+			"silence":          1,
+			"silenceAudible":   2,
+			"silenceVisual":    3,
+			"reset":            4,
+			"resetAlarm":       5,
+			"resetFault":       6,
+			"unsilence":        7,
+			"unsilenceAudible": 8,
+			"unsilenceVisual":  9,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LifeSafetyState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLifeSafetyState(arg Arg) (*LifeSafetyState, error) {
+	s := &LifeSafetyState{
+		enumerations: map[string]uint64{"quiet": 0,
+			"preAlarm":        1,
+			"alarm":           2,
+			"fault":           3,
+			"faultPreAlarm":   4,
+			"faultAlarm":      5,
+			"notReady":        6,
+			"active":          7,
+			"tamper":          8,
+			"testAlarm":       9,
+			"testActive":      10,
+			"testFault":       11,
+			"testFaultAlarm":  12,
+			"holdup":          13,
+			"duress":          14,
+			"tamperAlarm":     15,
+			"abnormal":        16,
+			"emergencyPower":  17,
+			"delayed":         18,
+			"blocked":         19,
+			"localAlarm":      20,
+			"generalAlarm":    21,
+			"supervisory":     22,
+			"testSupervisory": 23,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LightingInProgress struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLightingInProgress(arg Arg) (*LightingInProgress, error) {
+	s := &LightingInProgress{
+		enumerations: map[string]uint64{"idle": 0,
+			"fadeActive":    1,
+			"rampActive":    2,
+			"notControlled": 3,
+			"other":         4,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LightingOperation struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLightingOperation(arg Arg) (*LightingOperation, error) {
+	s := &LightingOperation{
+		vendorRange: vendorRange{256, 65535},
+		enumerations: map[string]uint64{"none": 0,
+			"fadeTo":         1,
+			"rampTo":         2,
+			"stepUp":         3,
+			"stepDown":       4,
+			"stepOn":         5,
+			"stepOff":        6,
+			"warn":           7,
+			"warnOff":        8,
+			"warnRelinquish": 9,
+			"stop":           10,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LightingTransition struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLightingTransition(arg Arg) (*LightingTransition, error) {
+	s := &LightingTransition{
+		vendorRange: vendorRange{64, 255},
+		enumerations: map[string]uint64{"none": 0,
+			"fade": 1,
+			"ramp": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LockStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLockStatus(arg Arg) (*LockStatus, error) {
+	s := &LockStatus{
+		enumerations: map[string]uint64{"locked": 0,
+			"unlocked": 1,
+			"fault":    2,
+			"unknown":  3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type LoggingType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewLoggingType(arg Arg) (*LoggingType, error) {
+	s := &LoggingType{
+		vendorRange: vendorRange{64, 255},
+		enumerations: map[string]uint64{"polled": 0,
+			"cov":       1,
+			"triggered": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type Maintenance struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewMaintenance(arg Arg) (*Maintenance, error) {
+	s := &Maintenance{
+		vendorRange: vendorRange{256, 65535},
+		enumerations: map[string]uint64{"none": 0,
+			"periodicTest":           1,
+			"needServiceOperational": 2,
+			"needServiceInoperative": 3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type NodeType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewNodeType(arg Arg) (*NodeType, error) {
+	s := &NodeType{
+		enumerations: map[string]uint64{"unknown": 0,
+			"system":         1,
+			"network":        2,
+			"device":         3,
+			"organizational": 4,
+			"area":           5,
+			"equipment":      6,
+			"point":          7,
+			"collection":     8,
+			"property":       9,
+			"functional":     10,
+			"other":          11,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type NotifyType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewNotifyType(arg Arg) (*NotifyType, error) {
+	s := &NotifyType{
+		enumerations: map[string]uint64{"alarm": 0,
+			"event":           1,
+			"ackNotification": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type Polarity struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewPolarity(arg Arg) (*Polarity, error) {
+	s := &Polarity{
+		enumerations: map[string]uint64{"normal": 0,
+			"reverse": 1,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type ProgramError struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewProgramError(arg Arg) (*ProgramError, error) {
+	s := &ProgramError{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"normal": 0,
+			"loadFailed": 1,
+			"internal":   2,
+			"program":    3,
+			"other":      4,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type ProgramRequest struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewProgramRequest(arg Arg) (*ProgramRequest, error) {
+	s := &ProgramRequest{
+		enumerations: map[string]uint64{"ready": 0,
+			"load":    1,
+			"run":     2,
+			"halt":    3,
+			"restart": 4,
+			"unload":  5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type ProgramState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewProgramState(arg Arg) (*ProgramState, error) {
+	s := &ProgramState{
+		enumerations: map[string]uint64{"idle": 0,
+			"loading":   1,
+			"running":   2,
+			"waiting":   3,
+			"halted":    4,
+			"unloading": 5,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type PropertyIdentifier struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewPropertyIdentifier(arg Arg) (*PropertyIdentifier, error) {
+	s := &PropertyIdentifier{
+		vendorRange: vendorRange{512, 4194303},
+		enumerations: map[string]uint64{"absenteeLimit": 244,
+			"acceptedModes":                    175,
+			"accessAlarmEvents":                245,
+			"accessDoors":                      246,
+			"accessEvent":                      247,
+			"accessEventAuthenticationFactor":  248,
+			"accessEventCredential":            249,
+			"accessEventTag":                   322,
+			"accessEventTime":                  250,
+			"accessTransactionEvents":          251,
+			"accompaniment":                    252,
+			"accompanimentTime":                253,
+			"ackedTransitions":                 0,
+			"ackRequired":                      1,
+			"action":                           2,
+			"actionText":                       3,
+			"activationTime":                   254,
+			"activeAuthenticationPolicy":       255,
+			"activeCovMultipleSubscriptions":   481,
+			"activeCovSubscriptions":           152,
+			"activeText":                       4,
+			"activeVtSessions":                 5,
+			"actualShedLevel":                  212,
+			"adjustValue":                      176,
+			"alarmValue":                       6,
+			"alarmValues":                      7,
+			"alignIntervals":                   193,
+			"all":                              8,
+			"allowGroupDelayInhibit":           365,
+			"allWritesSuccessful":              9,
+			"apduLength":                       399,
+			"apduSegmentTimeout":               10,
+			"apduTimeout":                      11,
+			"applicationSoftwareVersion":       12,
+			"archive":                          13,
+			"assignedAccessRights":             256,
+			"assignedLandingCalls":             447,
+			"attemptedSamples":                 124,
+			"auditableOperations":              501,
+			"auditablePriorityFilter":          500,
+			"auditLevel":                       498,
+			"auditNotificationRecipient":       499,
+			"auditSourceReporter":              497,
+			"authenticationFactors":            257,
+			"authenticationPolicyList":         258,
+			"authenticationPolicyNames":        259,
+			"authenticationStatus":             260,
+			"authorizationExemptions":          364,
+			"authorizationMode":                261,
+			"autoSlaveDiscovery":               169,
+			"averageValue":                     125,
+			"backupAndRestoreState":            338,
+			"backupFailureTimeout":             153,
+			"backupPreparationTime":            339,
+			"bacnetIPGlobalAddress":            407,
+			"bacnetIPMode":                     408,
+			"bacnetIPMulticastAddress":         409,
+			"bacnetIPNATTraversal":             410,
+			"bacnetIPUDPPort":                  412,
+			"bacnetIPv6Mode":                   435,
+			"bacnetIPv6MulticastAddress":       440,
+			"bacnetIPv6UDPPort":                438,
+			"baseDeviceSecurityPolicy":         327,
+			"bbmdAcceptFDRegistrations":        413,
+			"bbmdBroadcastDistributionTable":   414,
+			"bbmdForeignDeviceTable":           415,
+			"belongsTo":                        262,
+			"bias":                             14,
+			"bitMask":                          342,
+			"bitText":                          343,
+			"blinkWarnEnable":                  373,
+			"bufferSize":                       126,
+			"carAssignedDirection":             448,
+			"carDoorCommand":                   449,
+			"carDoorStatus":                    450,
+			"carDoorText":                      451,
+			"carDoorZone":                      452,
+			"carDriveStatus":                   453,
+			"carLoad":                          454,
+			"carLoadUnits":                     455,
+			"carMode":                          456,
+			"carMovingDirection":               457,
+			"carPosition":                      458,
+			"changeOfStateCount":               15,
+			"changeOfStateTime":                16,
+			"changesPending":                   416,
+			"channelNumber":                    366,
+			"clientCovIncrement":               127,
+			"command":                          417,
+			"commandTimeArray":                 430,
+			"configurationFiles":               154,
+			"controlGroups":                    367,
+			"controlledVariableReference":      19,
+			"controlledVariableUnits":          20,
+			"controlledVariableValue":          21,
+			"count":                            177,
+			"countBeforeChange":                178,
+			"countChangeTime":                  179,
+			"covIncrement":                     22,
+			"covPeriod":                        180,
+			"covResubscriptionInterval":        128,
+			"covuPeriod":                       349,
+			"covuRecipients":                   350,
+			"credentialDisable":                263,
+			"credentials":                      265,
+			"credentialsInZone":                266,
+			"credentialStatus":                 264,
+			"currentCommandPriority":           431,
+			"databaseRevision":                 155,
+			"dateList":                         23,
+			"daylightSavingsStatus":            24,
+			"daysRemaining":                    267,
+			"deadband":                         25,
+			"defaultFadeTime":                  374,
+			"defaultPresentValue":              492,
+			"defaultRampRate":                  375,
+			"defaultStepIncrement":             376,
+			"defaultSubordinateRelationship":   490,
+			"defaultTimeout":                   393,
+			"deleteOnForward":                  502,
+			"deployedProfileLocation":          484,
+			"derivativeConstant":               26,
+			"derivativeConstantUnits":          27,
+			"description":                      28,
+			"descriptionOfHalt":                29,
+			"deviceAddressBinding":             30,
+			"deviceType":                       31,
+			"deviceUUID":                       507,
+			"directReading":                    156,
+			"distributionKeyRevision":          328,
+			"doNotHide":                        329,
+			"doorAlarmState":                   226,
+			"doorExtendedPulseTime":            227,
+			"doorMembers":                      228,
+			"doorOpenTooLongTime":              229,
+			"doorPulseTime":                    230,
+			"doorStatus":                       231,
+			"doorUnlockDelayTime":              232,
+			"dutyWindow":                       213,
+			"effectivePeriod":                  32,
+			"egressActive":                     386,
+			"egressTime":                       377,
+			"elapsedActiveTime":                33,
+			"elevatorGroup":                    459,
+			"enable":                           133,
+			"energyMeter":                      460,
+			"energyMeterRef":                   461,
+			"entryPoints":                      268,
+			"errorLimit":                       34,
+			"escalatorMode":                    462,
+			"eventAlgorithmInhibit":            354,
+			"eventAlgorithmInhibitRef":         355,
+			"eventDetectionEnable":             353,
+			"eventEnable":                      35,
+			"eventMessageTexts":                351,
+			"eventMessageTextsConfig":          352,
+			"eventParameters":                  83,
+			"eventState":                       36,
+			"eventTimeStamps":                  130,
+			"eventType":                        37,
+			"exceptionSchedule":                38,
+			"executionDelay":                   368,
+			"exitPoints":                       269,
+			"expectedShedLevel":                214,
+			"expirationTime":                   270,
+			"extendedTimeEnable":               271,
+			"failedAttemptEvents":              272,
+			"failedAttempts":                   273,
+			"failedAttemptsTime":               274,
+			"faultHighLimit":                   388,
+			"faultLowLimit":                    389,
+			"faultParameters":                  358,
+			"faultSignals":                     463,
+			"faultType":                        359,
+			"faultValues":                      39,
+			"fdBBMDAddress":                    418,
+			"fdSubscriptionLifetime":           419,
+			"feedbackValue":                    40,
+			"fileAccessMethod":                 41,
+			"fileSize":                         42,
+			"fileType":                         43,
+			"firmwareRevision":                 44,
+			"floorNumber":                      506,
+			"floorText":                        464,
+			"fullDutyBaseline":                 215,
+			"globalIdentifier":                 323,
+			"groupID":                          465,
+			"groupMemberNames":                 346,
+			"groupMembers":                     345,
+			"groupMode":                        467,
+			"higherDeck":                       468,
+			"highLimit":                        45,
+			"inactiveText":                     46,
+			"initialTimeout":                   394,
+			"inProcess":                        47,
+			"inProgress":                       378,
+			"inputReference":                   181,
+			"installationID":                   469,
+			"instanceOf":                       48,
+			"instantaneousPower":               379,
+			"integralConstant":                 49,
+			"integralConstantUnits":            50,
+			"interfaceValue":                   387,
+			"intervalOffset":                   195,
+			"ipAddress":                        400,
+			"ipDefaultGateway":                 401,
+			"ipDHCPEnable":                     402,
+			"ipDHCPLeaseTime":                  403,
+			"ipDHCPLeaseTimeRemaining":         404,
+			"ipDHCPServer":                     405,
+			"ipDNSServer":                      406,
+			"ipSubnetMask":                     411,
+			"ipv6Address":                      436,
+			"ipv6AutoAddressingEnable":         442,
+			"ipv6DefaultGateway":               439,
+			"ipv6DHCPLeaseTime":                443,
+			"ipv6DHCPLeaseTimeRemaining":       444,
+			"ipv6DHCPServer":                   445,
+			"ipv6DNSServer":                    441,
+			"ipv6PrefixLength":                 437,
+			"ipv6ZoneIndex":                    446,
+			"issueConfirmedNotifications":      51,
+			"isUTC":                            344,
+			"keySets":                          330,
+			"landingCallControl":               471,
+			"landingCalls":                     470,
+			"landingDoorStatus":                472,
+			"lastAccessEvent":                  275,
+			"lastAccessPoint":                  276,
+			"lastCommandTime":                  432,
+			"lastCredentialAdded":              277,
+			"lastCredentialAddedTime":          278,
+			"lastCredentialRemoved":            279,
+			"lastCredentialRemovedTime":        280,
+			"lastKeyServer":                    331,
+			"lastNotifyRecord":                 173,
+			"lastPriority":                     369,
+			"lastRestartReason":                196,
+			"lastRestoreTime":                  157,
+			"lastStateChange":                  395,
+			"lastUseTime":                      281,
+			"lifeSafetyAlarmValues":            166,
+			"lightingCommand":                  380,
+			"lightingCommandDefaultPriority":   381,
+			"limitEnable":                      52,
+			"limitMonitoringInterval":          182,
+			"linkSpeed":                        420,
+			"linkSpeedAutonegotiate":           422,
+			"linkSpeeds":                       421,
+			"listOfGroupMembers":               53,
+			"listOfObjectPropertyReferences":   54,
+			"listOfSessionKeys":                55,
+			"localDate":                        56,
+			"localForwardingOnly":              360,
+			"localTime":                        57,
+			"location":                         58,
+			"lockout":                          282,
+			"lockoutRelinquishTime":            283,
+			"lockStatus":                       233,
+			"logBuffer":                        131,
+			"logDeviceObjectProperty":          132,
+			"loggingObject":                    183,
+			"loggingRecord":                    184,
+			"loggingType":                      197,
+			"logInterval":                      134,
+			"lowDiffLimit":                     390,
+			"lowerDeck":                        473,
+			"lowLimit":                         59,
+			"macAddress":                       423,
+			"machineRoomID":                    474,
+			"maintenanceRequired":              158,
+			"makingCarCall":                    475,
+			"manipulatedVariableReference":     60,
+			"manualSlaveAddressBinding":        170,
+			"maskedAlarmValues":                234,
+			"masterExemption":                  284,
+			"maxActualValue":                   382,
+			"maxApduLengthAccepted":            62,
+			"maxFailedAttempts":                285,
+			"maximumOutput":                    61,
+			"maximumSendDelay":                 503,
+			"maximumValue":                     135,
+			"maximumValueTimestamp":            149,
+			"maxInfoFrames":                    63,
+			"maxMaster":                        64,
+			"maxPresValue":                     65,
+			"maxSegmentsAccepted":              167,
+			"memberOf":                         159,
+			"members":                          286,
+			"memberStatusFlags":                347,
+			"minActualValue":                   383,
+			"minimumOffTime":                   66,
+			"minimumOnTime":                    67,
+			"minimumOutput":                    68,
+			"minimumValue":                     136,
+			"minimumValueTimestamp":            150,
+			"minPresValue":                     69,
+			"mode":                             160,
+			"modelName":                        70,
+			"modificationDate":                 71,
+			"monitoredObjects":                 504,
+			"musterPoint":                      287,
+			"negativeAccessRules":              288,
+			"networkAccessSecurityPolicies":    332,
+			"networkInterfaceName":             424,
+			"networkNumber":                    425,
+			"networkNumberQuality":             426,
+			"networkType":                      427,
+			"nextStoppingFloor":                476,
+			"nodeSubtype":                      207,
+			"nodeType":                         208,
+			"notificationClass":                17,
+			"notificationThreshold":            137,
+			"notifyType":                       72,
+			"numberOfApduRetries":              73,
+			"numberOfAuthenticationPolicies":   289,
+			"numberOfStates":                   74,
+			"objectIdentifier":                 75,
+			"objectList":                       76,
+			"objectName":                       77,
+			"objectPropertyReference":          78,
+			"objectType":                       79,
+			"occupancyCount":                   290,
+			"occupancyCountAdjust":             291,
+			"occupancyCountEnable":             292,
+			"occupancyExemption":               293,
+			"occupancyLowerLimit":              294,
+			"occupancyLowerLimitEnforced":      295,
+			"occupancyState":                   296,
+			"occupancyUpperLimit":              297,
+			"occupancyUpperLimitEnforced":      298,
+			"operationDirection":               477,
+			"operationExpected":                161,
+			"optional":                         80,
+			"outOfService":                     81,
+			"outputUnits":                      82,
+			"packetReorderTime":                333,
+			"passbackExemption":                299,
+			"passbackMode":                     300,
+			"passbackTimeout":                  301,
+			"passengerAlarm":                   478,
+			"polarity":                         84,
+			"portFilter":                       363,
+			"positiveAccessRules":              302,
+			"power":                            384,
+			"powerMode":                        479,
+			"prescale":                         185,
+			"presentStage":                     493,
+			"presentValue":                     85,
+			"priority":                         86,
+			"priorityArray":                    87,
+			"priorityForWriting":               88,
+			"processIdentifier":                89,
+			"processIdentifierFilter":          361,
+			"profileLocation":                  485,
+			"profileName":                      168,
+			"programChange":                    90,
+			"programLocation":                  91,
+			"programState":                     92,
+			"propertyList":                     371,
+			"proportionalConstant":             93,
+			"proportionalConstantUnits":        94,
+			"protocolLevel":                    482,
+			"protocolObjectTypesSupported":     96,
+			"protocolRevision":                 139,
+			"protocolServicesSupported":        97,
+			"protocolVersion":                  98,
+			"pulseRate":                        186,
+			"readOnly":                         99,
+			"reasonForDisable":                 303,
+			"reasonForHalt":                    100,
+			"recipientList":                    102,
+			"recordCount":                      141,
+			"recordsSinceNotification":         140,
+			"referencePort":                    483,
+			"registeredCarCall":                480,
+			"reliability":                      103,
+			"reliabilityEvaluationInhibit":     357,
+			"relinquishDefault":                104,
+			"represents":                       491,
+			"requestedShedLevel":               218,
+			"requestedUpdateInterval":          348,
+			"required":                         105,
+			"resolution":                       106,
+			"restartNotificationRecipients":    202,
+			"restoreCompletionTime":            340,
+			"restorePreparationTime":           341,
+			"routingTable":                     428,
+			"scale":                            187,
+			"scaleFactor":                      188,
+			"scheduleDefault":                  174,
+			"securedStatus":                    235,
+			"securityPDUTimeout":               334,
+			"securityTimeWindow":               335,
+			"segmentationSupported":            107,
+			"sendNow":                          505,
+			"serialNumber":                     372,
+			"setpoint":                         108,
+			"setpointReference":                109,
+			"setting":                          162,
+			"shedDuration":                     219,
+			"shedLevelDescriptions":            220,
+			"shedLevels":                       221,
+			"silenced":                         163,
+			"slaveAddressBinding":              171,
+			"slaveProxyEnable":                 172,
+			"stageNames":                       495,
+			"stages":                           494,
+			"startTime":                        142,
+			"stateChangeValues":                396,
+			"stateDescription":                 222,
+			"stateText":                        110,
+			"statusFlags":                      111,
+			"stopTime":                         143,
+			"stopWhenFull":                     144,
+			"strikeCount":                      391,
+			"structuredObjectList":             209,
+			"subordinateAnnotations":           210,
+			"subordinateList":                  211,
+			"subordinateNodeTypes":             487,
+			"subordinateRelationships":         489,
+			"subordinateTags":                  488,
+			"subscribedRecipients":             362,
+			"supportedFormatClasses":           305,
+			"supportedFormats":                 304,
+			"supportedSecurityAlgorithms":      336,
+			"systemStatus":                     112,
+			"tags":                             486,
+			"targetReferences":                 496,
+			"threatAuthority":                  306,
+			"threatLevel":                      307,
+			"timeDelay":                        113,
+			"timeDelayNormal":                  356,
+			"timeOfActiveTimeReset":            114,
+			"timeOfDeviceRestart":              203,
+			"timeOfStateCountReset":            115,
+			"timeOfStrikeCountReset":           392,
+			"timerRunning":                     397,
+			"timerState":                       398,
+			"timeSynchronizationInterval":      204,
+			"timeSynchronizationRecipients":    116,
+			"totalRecordCount":                 145,
+			"traceFlag":                        308,
+			"trackingValue":                    164,
+			"transactionNotificationClass":     309,
+			"transition":                       385,
+			"trigger":                          205,
+			"units":                            117,
+			"updateInterval":                   118,
+			"updateKeySetTimeout":              337,
+			"updateTime":                       189,
+			"userExternalIdentifier":           310,
+			"userInformationReference":         311,
+			"userName":                         317,
+			"userType":                         318,
+			"usesRemaining":                    319,
+			"utcOffset":                        119,
+			"utcTimeSynchronizationRecipients": 206,
+			"validSamples":                     146,
+			"valueBeforeChange":                190,
+			"valueChangeTime":                  192,
+			"valueSet":                         191,
+			"valueSource":                      433,
+			"valueSourceArray":                 434,
+			"varianceValue":                    151,
+			"vendorIdentifier":                 120,
+			"vendorName":                       121,
+			"verificationTime":                 326,
+			"virtualMACAddressTable":           429,
+			"vtClassesSupported":               122,
+			"weeklySchedule":                   123,
+			"windowInterval":                   147,
+			"windowSamples":                    148,
+			"writeStatus":                      370,
+			"zoneFrom":                         320,
+			"zoneMembers":                      165,
+			"zoneTo":                           321,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type Relationship struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewRelationship(arg Arg) (*Relationship, error) {
+	s := &Relationship{
+		vendorRange: vendorRange{1024, 65535},
+		enumerations: map[string]uint64{"unknown": 0,
+			"default":           1,
+			"contains":          2,
+			"containedBy":       3,
+			"uses":              4,
+			"usedBy":            5,
+			"commands":          6,
+			"commandedBy":       7,
+			"adjusts":           8,
+			"adjustedBy":        9,
+			"ingress":           10,
+			"egress":            11,
+			"suppliesAir":       12,
+			"receivesAir":       13,
+			"suppliesHotAir":    14,
+			"receivesHotAir":    15,
+			"suppliesCoolAir":   16,
+			"receivesCoolAir":   17,
+			"suppliesPower":     18,
+			"receivesPower":     19,
+			"suppliesGas":       20,
+			"receivesGas":       21,
+			"suppliesWater":     22,
+			"receivesWater":     23,
+			"suppliesHotWater":  24,
+			"receivesHotWater":  25,
+			"suppliesCoolWater": 26,
+			"receivesCoolWater": 27,
+			"suppliesSteam":     28,
+			"receivesSteam":     29,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type Reliability struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewReliability(arg Arg) (*Reliability, error) {
+	s := &Reliability{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"noFaultDetected": 0,
+			"noSensor":                      1,
+			"overRange":                     2,
+			"underRange":                    3,
+			"openLoop":                      4,
+			"shortedLoop":                   5,
+			"noOutput":                      6,
+			"unreliableOther":               7,
+			"processError":                  8,
+			"multiStateFault":               9,
+			"configurationError":            10,
+			"communicationFailure":          12,
+			"memberFault":                   13,
+			"monitoredObjectFault":          14,
+			"tripped":                       15,
+			"lampFailure":                   16,
+			"activationFailure":             17,
+			"renewDHCPFailure":              18,
+			"renewFDRegistrationFailure":    19,
+			"restartAutoNegotiationFailure": 20,
+			"restartFailure":                21,
+			"proprietaryCommandFailure":     22,
+			"faultsListed":                  23,
+			"referencedObjectFault":         24,
+			"multiStateOutOfRange":          25,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type RestartReason struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewRestartReason(arg Arg) (*RestartReason, error) {
+	s := &RestartReason{
+		vendorRange: vendorRange{64, 255},
+		enumerations: map[string]uint64{"unknown": 0,
+			"coldstart":          1,
+			"warmstart":          2,
+			"detectedPowerLost":  3,
+			"detectedPoweredOff": 4,
+			"hardwareWatchdog":   5,
+			"softwareWatchdog":   6,
+			"suspended":          7,
+			"activateChanges":    8,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type SecurityLevel struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewSecurityLevel(arg Arg) (*SecurityLevel, error) {
+	s := &SecurityLevel{
+		enumerations: map[string]uint64{"incapable": 0,
+			"plain":             1,
+			"signed":            2,
+			"encrypted":         3,
+			"signedEndToEnd":    4,
+			"encryptedEndToEnd": 4,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type SecurityPolicy struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewSecurityPolicy(arg Arg) (*SecurityPolicy, error) {
+	s := &SecurityPolicy{
+		enumerations: map[string]uint64{"plainNonTrusted": 0,
+			"plainTrusted":     1,
+			"signedTrusted":    2,
+			"encryptedTrusted": 3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type ShedState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewShedState(arg Arg) (*ShedState, error) {
+	s := &ShedState{
+		enumerations: map[string]uint64{"shedInactive": 0,
+			"shedRequestPending": 1,
+			"shedCompliant":      2,
+			"shedNonCompliant":   3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type Segmentation struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewSegmentation(arg Arg) (*Segmentation, error) {
+	s := &Segmentation{
+		enumerations: map[string]uint64{"segmentedBoth": 0,
+			"segmentedTransmit": 1,
+			"segmentedReceive":  2,
+			"noSegmentation":    3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type SilencedState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewSilencedState(arg Arg) (*SilencedState, error) {
+	s := &SilencedState{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"unsilenced": 0,
+			"audibleSilenced": 1,
+			"visibleSilenced": 2,
+			"allSilenced":     3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type TimerState struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewTimerState(arg Arg) (*TimerState, error) {
+	s := &TimerState{
+		enumerations: map[string]uint64{"idle": 0,
+			"running": 1,
+			"expired": 2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type TimerTransition struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewTimerTransition(arg Arg) (*TimerTransition, error) {
+	s := &TimerTransition{
+		enumerations: map[string]uint64{"none": 0,
+			"idleToRunning":    1,
+			"runningToIdle":    2,
+			"runningToRunning": 3,
+			"runningToExpired": 4,
+			"forcedToExpired":  5,
+			"expiredToIdle":    6,
+			"expiredToRunning": 7,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type VTClass struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewVTClass(arg Arg) (*VTClass, error) {
+	s := &VTClass{
+		vendorRange: vendorRange{64, 65535},
+		enumerations: map[string]uint64{"defaultTerminal": 0,
+			"ansiX364": 1,
+			"decVt52":  2,
+			"decVt100": 3,
+			"decVt220": 4,
+			"hp70094":  5,
+			"ibm3130":  6,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type WriteStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewWriteStatus(arg Arg) (*WriteStatus, error) {
+	s := &WriteStatus{
+		enumerations: map[string]uint64{"idle": 0,
+			"inProgress": 1,
+			"successful": 2,
+			"failed":     3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type NetworkType struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewNetworkType(arg Arg) (*NetworkType, error) {
+	s := &NetworkType{
+		enumerations: map[string]uint64{"ethernet": 0,
+			"arcnet":  1,
+			"mstp":    2,
+			"ptp":     3,
+			"lontalk": 4,
+			"ipv4":    5,
+			"zigbee":  6,
+			"virtual": 7,
+			// "non-bacnet":  8  Removed in Version 1, Revision 18,
+			"ipv6":   9,
+			"serial": 10,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type ProtocolLevel struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewProtocolLevel(arg Arg) (*ProtocolLevel, error) {
+	s := &ProtocolLevel{
+		enumerations: map[string]uint64{"physical": 0,
+			"protocol":             1,
+			"bacnetApplication":    2,
+			"nonBacnetApplication": 3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type NetworkNumberQuality struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewNetworkNumberQuality(arg Arg) (*NetworkNumberQuality, error) {
+	s := &NetworkNumberQuality{
+		enumerations: map[string]uint64{"unknown": 0,
+			"learned":           1,
+			"learnedConfigured": 2,
+			"configured":        3,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type NetworkPortCommand struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewNetworkPortCommand(arg Arg) (*NetworkPortCommand, error) {
+	s := &NetworkPortCommand{
+		enumerations: map[string]uint64{"idle": 0,
+			"discardChanges":         1,
+			"renewFdDRegistration":   2,
+			"restartSlaveDiscovery":  3,
+			"renewDHCP":              4,
+			"restartAutonegotiation": 5,
+			"disconnect":             6,
+			"restartPort":            7,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type IPMode struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewIPMode(arg Arg) (*IPMode, error) {
+	s := &IPMode{
+		enumerations: map[string]uint64{"normal": 0,
+			"foreign": 1,
+			"bbmd":    2,
+		},
+	}
+	panic("enumeratedimplementme")
+	return s, nil
+}
+
+type RouterEntryStatus struct {
+	*Enumerated
+	vendorRange  vendorRange
+	enumerations map[string]uint64
+}
+
+func NewRouterEntryStatus(arg Arg) (*RouterEntryStatus, error) {
+	s := &RouterEntryStatus{
+		enumerations: map[string]uint64{"available": 0,
+			"busy":         1,
+			"disconnected": 2,
+		},
+	}
+	panic("implement me enumasdasd")
+	return s, nil
+}
+
+//
+//   Forward Sequences
+//
+
+type HostAddress struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewHostAddress(arg Arg) (*HostAddress, error) {
+	s := &HostAddress{
+		choiceElements: []Element{
+			NewElement("none", V2E(NewNull), WithElementContext(0)),
+			NewElement("ipAddress", V2E(NewOctetString), WithElementContext(1)), //  4 octets for B/IP or 16 octets for B/IPv6
+			NewElement("name", V2E(NewCharacterString), WithElementContext(2)),  //  Internet host name (see RFC 1123)
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type HostNPort struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewHostNPort(arg Arg) (*HostNPort, error) {
+	s := &HostNPort{
+		sequenceElements: []Element{
+			NewElement("host", V2E(NewHostAddress), WithElementContext(0)),
+			NewElement("port", V2E(NewUnsigned16), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type BDTEntry struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewBDTEntry(arg Arg) (*BDTEntry, error) {
+	s := &BDTEntry{
+		sequenceElements: []Element{
+			NewElement("bbmdAddress", V2E(NewHostNPort), WithElementContext(0)),
+			NewElement("broadcastMask", V2E(NewOctetString), WithElementContext(1)), //  shall be present if BACnet/IP, and absent for BACnet/IPv6
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FDTEntry struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewFDTEntry(arg Arg) (*FDTEntry, error) {
+	s := &FDTEntry{
+		sequenceElements: []Element{
+			NewElement("bacnetIPAddress", V2E(NewOctetString), WithElementContext(0)),    //  the 6-octet B/IP or 18-octet B/IPv6 address of the registrant
+			NewElement("timeToLive", V2E(NewUnsigned16), WithElementContext(1)),          //  time to live in seconds at the time of registration
+			NewElement("remainingTimeToLive", V2E(NewUnsigned16), WithElementContext(2)), //  remaining time to live in seconds, incl. grace period
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type VMACEntry struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewVMACEntry(arg Arg) (*VMACEntry, error) {
+	s := &VMACEntry{
+		sequenceElements: []Element{
+			NewElement("virtualMACAddress", V2E(NewOctetString), WithElementContext(0)), //  maximum size 6 octets
+			NewElement("nativeMACAddress", V2E(NewOctetString), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type PropertyReference struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewPropertyReference(arg Arg) (*PropertyReference, error) {
+	s := &PropertyReference{
+		sequenceElements: []Element{
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(0)),
+			NewElement("propertyArrayIndex", V2E(NewUnsigned), WithElementContext(1), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type RouterEntry struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewRouterEntry(arg Arg) (*RouterEntry, error) {
+	s := &RouterEntry{
+		sequenceElements: []Element{
+			NewElement("networkNumber", V2E(NewUnsigned16), WithElementContext(0)),
+			NewElement("macAddress", V2E(NewOctetString), WithElementContext(1)),
+			NewElement("status", V2E(NewRouterEntryStatus), WithElementContext(2)), //  Defined Above
+			NewElement("performanceIndex", V2E(NewUnsigned8), WithElementContext(3), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NameValue struct {
+	*Sequence
+
+	sequenceElements []Element
+	name             string
+	value            any
+}
+
+func NewNameValue(args Args) (*NameValue, error) {
+	s := &NameValue{
+		sequenceElements: []Element{
+			NewElement("name", V2E(NewCharacterString)),
+			NewElement("value", Vs2E(NewAnyAtomic), WithElementOptional(true)),
+		},
+	}
+	// default to no value
+	s.name = GetOptional[string](args, 0, "")
+	s.value = GetOptional[any](args, 1, nil)
+
+	if s.value == nil {
+		return s, nil
+	}
+	switch value := s.value.(type) {
+	case IsAtomic:
+		s.value = value
+	case DateTime:
+		s.value = value
+	case Tag:
+		var err error
+		s.value, err = value.AppToObject()
+		if err != nil {
+			return nil, errors.Wrap(err, "error converting tag")
+		}
+	default:
+		return nil, errors.Errorf("invalid constructor datatype: %T", value)
+	}
+	return s, nil
+}
+
+func (s *NameValue) Encode(arg Arg) error {
+	tagList := arg.(*TagList)
+	// build a tag and encode the name into it
+	tag, err := NewTag(NoArgs)
+	if err != nil {
+		return errors.Wrap(err, "error converting tag")
+	}
+	characterString, err := NewCharacterString(s.name)
+	if err != nil {
+		return errors.Wrap(err, "error creating character string")
+	}
+	if err := characterString.Encode(tag); err != nil {
+		return errors.Wrap(err, "error encoding")
+	}
+	context, err := tag.AppToContext(0)
+	if err != nil {
+		return errors.Wrap(err, "error converting tag")
+	}
+	tagList.Append(context)
+
+	// the value is optional
+	if s.value != nil {
+		if v, ok := s.value.(*DateTime); ok {
+			// has its own encoder
+			if err := v.Encode(tagList); err != nil {
+				return errors.Wrap(err, "error converting tag")
+			}
+		} else if e, ok := s.value.(Encoder); ok {
+			// atomic values encode into a tag
+			tag, err = NewTag(NoArgs)
+			if err != nil {
+				return errors.Wrap(err, "error creating tag")
+			}
+			if err := e.Encode(tag); err != nil {
+				return errors.Wrap(err, "error converting tag")
+			}
+			tagList.Append(tag)
+		}
+	}
+	return nil
+}
+
+func (s *NameValue) Decode(arg Arg) error {
+	tagList := arg.(*TagList)
+
+	// no contents yet
+	s.name = ""
+	s.value = ""
+
+	// look for the context encoded character string
+	tag := tagList.Peek()
+	if tag == nil || (tag.GetTagClass() != readWriteModel.TagClass_CONTEXT_SPECIFIC_TAGS) || (tag.GetTagNumber() != 0) {
+		return MissingRequiredParameter{Message: fmt.Sprintf("%s is a missing required element of %p", s.name, s)}
+	}
+
+	// pop it off and save the value
+	tagList.Pop()
+	tag, err := tag.ContextToApp(uint(readWriteModel.BACnetDataType_CHARACTER_STRING))
+	if err != nil {
+		return errors.Wrap(err, "error converting tag")
+	}
+	characterString, err := NewCharacterString(tag)
+	if err != nil {
+		return errors.Wrap(err, "error converting tag to string")
+	}
+	s.name = characterString.GetValue()
+
+	// look for the optional application encoded value
+	tag = tagList.Peek()
+	if tag != nil && (tag.GetTagClass() == readWriteModel.TagClass_APPLICATION_TAGS) {
+		// if it is a date check the next one for a time
+		if tag.GetTagNumber() == uint(readWriteModel.BACnetDataType_DATE) && (len(tagList.GetTagList()) >= 2) {
+			nextTag := tagList.GetTagList()[1]
+
+			if nextTag.GetTagClass() == readWriteModel.TagClass_APPLICATION_TAGS && (nextTag.GetTagNumber() == uint(readWriteModel.BACnetDataType_TIME)) {
+				s.value, err = NewDateTime(NoArgs)
+				if err != nil {
+					return errors.Wrap(err, "error creating date time")
+				}
+				if err := s.value.(Decoder).Decode(tagList); err != nil {
+					return errors.Wrap(err, "error decoding taglist")
+				}
+			}
+
+			// just a primitive value
+			if s.value == nil {
+				tagList.Pop()
+				s.value, err = tag.AppToObject()
+				if err != nil {
+					return errors.Wrap(err, "error converting tag")
+				}
+			}
+		}
+	}
+	return nil
+}
+
+type NameValueCollection struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNameValueCollection(arg Arg) (*NameValueCollection, error) {
+	s := &NameValueCollection{
+		sequenceElements: []Element{
+			NewElement("members", SequenceOfs(NewNameValue), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type DeviceAddress struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDeviceAddress(arg Arg) (*DeviceAddress, error) {
+	s := &DeviceAddress{
+		sequenceElements: []Element{
+			NewElement("networkNumber", V2E(NewUnsigned)),
+			NewElement("macAddress", V2E(NewOctetString)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type DeviceObjectPropertyReference struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDeviceObjectPropertyReference(arg Arg) (*DeviceObjectPropertyReference, error) {
+	s := &DeviceObjectPropertyReference{
+		sequenceElements: []Element{
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(1)),
+			NewElement("propertyArrayIndex", V2E(NewUnsigned), WithElementContext(2), WithElementOptional(true)),
+			NewElement("deviceIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(3), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type DeviceObjectReference struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDeviceObjectReference(arg Arg) (*DeviceObjectReference, error) {
+	s := &DeviceObjectReference{
+		sequenceElements: []Element{
+			NewElement("deviceIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0), WithElementOptional(true)),
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type DateTime struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDateTime(arg Arg) (*DateTime, error) {
+	s := &DateTime{
+		sequenceElements: []Element{
+			NewElement("date", Vs2E(NewDate)),
+			NewElement("time", Vs2E(NewTime)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type DateRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDateRange(arg Arg) (*DateRange, error) {
+	s := &DateRange{
+		sequenceElements: []Element{
+			NewElement("startDate", Vs2E(NewDate)),
+			NewElement("endDate", Vs2E(NewDate)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ErrorType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewErrorType(arg Arg) (*ErrorType, error) {
+	s := &ErrorType{
+		sequenceElements: []Element{
+			NewElement("errorClass", V2E(NewErrorClass)),
+			NewElement("errorCode", V2E(NewErrorCode)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LandingCallStatusCommand struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewLandingCallStatusCommand(arg Arg) (*LandingCallStatusCommand, error) {
+	s := &LandingCallStatusCommand{
+		choiceElements: []Element{
+			NewElement("direction", V2E(NewLiftCarDirection), WithElementContext(1)),
+			NewElement("destination", V2E(NewUnsigned8), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LandingCallStatus struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewLandingCallStatus(arg Arg) (*LandingCallStatus, error) {
+	s := &LandingCallStatus{
+		sequenceElements: []Element{
+			NewElement("floorNumber", V2E(NewUnsigned8), WithElementContext(0)),
+			NewElement("command", V2E(NewLandingCallStatusCommand)),
+			NewElement("floorText", V2E(NewCharacterString), WithElementContext(3), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LandingDoorStatusLandingDoor struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewLandingDoorStatusLandingDoor(arg Arg) (*LandingDoorStatusLandingDoor, error) {
+	s := &LandingDoorStatusLandingDoor{
+		sequenceElements: []Element{
+			NewElement("floorNumber", V2E(NewUnsigned8), WithElementContext(0)),
+			NewElement("doorStatus", V2E(NewDoorStatus), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LandingDoorStatus struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewLandingDoorStatus(arg Arg) (*LandingDoorStatus, error) {
+	s := &LandingDoorStatus{
+		sequenceElements: []Element{
+			NewElement("landingDoors", SequenceOf(NewLandingDoorStatusLandingDoor), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LiftCarCallList struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewLiftCarCallList(arg Arg) (*LiftCarCallList, error) {
+	s := &LiftCarCallList{
+		sequenceElements: []Element{
+			NewElement("floorNumbers", SequenceOf(NewUnsigned8), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LightingCommand struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewLightingCommand(arg Arg) (*LightingCommand, error) {
+	s := &LightingCommand{
+		sequenceElements: []Element{
+			NewElement("operation", V2E(NewLightingOperation), WithElementContext(0)),
+			NewElement("targetLevel", V2E(NewReal), WithElementContext(1), WithElementOptional(true)),
+			NewElement("rampRate", V2E(NewReal), WithElementContext(2), WithElementOptional(true)),
+			NewElement("stepIncrement", V2E(NewReal), WithElementContext(3), WithElementOptional(true)),
+			NewElement("fadeTime", V2E(NewUnsigned), WithElementContext(4), WithElementOptional(true)),
+			NewElement("priority", V2E(NewUnsigned), WithElementContext(5), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ObjectPropertyReference struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewObjectPropertyReference(arg Arg) (*ObjectPropertyReference, error) {
+	s := &ObjectPropertyReference{
+		sequenceElements: []Element{
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(1)),
+			NewElement("propertyArrayIndex", V2E(NewUnsigned), WithElementContext(2), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type OptionalBinaryPV struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewOptionalBinaryPV(arg Arg) (*OptionalBinaryPV, error) {
+	s := &OptionalBinaryPV{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("binaryPV", V2E(NewBinaryPV)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type OptionalCharacterString struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewOptionalCharacterString(arg Arg) (*OptionalCharacterString, error) {
+	s := &OptionalCharacterString{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("characterstring", V2E(NewCharacterString)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type OptionalPriorityFilter struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewOptionalPriorityFilter(arg Arg) (*OptionalPriorityFilter, error) {
+	s := &OptionalPriorityFilter{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("filter", V2E(NewPriorityFilter)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type OptionalReal struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewOptionalReal(arg Arg) (*OptionalReal, error) {
+	s := &OptionalReal{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("real", V2E(NewReal)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type OptionalUnsigned struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewOptionalUnsigned(arg Arg) (*OptionalUnsigned, error) {
+	s := &OptionalUnsigned{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("unsigned", V2E(NewUnsigned)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ProcessIdSelection struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewProcessIdSelection(arg Arg) (*ProcessIdSelection, error) {
+	s := &ProcessIdSelection{
+		choiceElements: []Element{
+			NewElement("processIdentifier", V2E(NewUnsigned)),
+			NewElement("nullValue", V2E(NewNull)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type PropertyStates struct {
+	*Choice
+	vendorRange    vendorRange
+	choiceElements []Element
+}
+
+func NewPropertyStates(arg Arg) (*PropertyStates, error) {
+	s := &PropertyStates{
+		vendorRange: vendorRange{64, 254},
+		choiceElements: []Element{
+			NewElement("booleanValue", V2E(NewBoolean), WithElementContext(0)),
+			NewElement("binaryValue", V2E(NewBinaryPV), WithElementContext(1)),
+			NewElement("eventType", V2E(NewEventType), WithElementContext(2)),
+			NewElement("polarity", V2E(NewPolarity), WithElementContext(3)),
+			NewElement("programChange", V2E(NewProgramRequest), WithElementContext(4)),
+			NewElement("programState", V2E(NewProgramState), WithElementContext(5)),
+			NewElement("reasonForHalt", V2E(NewProgramError), WithElementContext(6)),
+			NewElement("reliability", V2E(NewReliability), WithElementContext(7)),
+			NewElement("state", V2E(NewEventState), WithElementContext(8)),
+			NewElement("systemStatus", V2E(NewDeviceStatus), WithElementContext(9)),
+			NewElement("units", V2E(NewEngineeringUnits), WithElementContext(10)),
+			NewElement("unsignedValue", V2E(NewUnsigned), WithElementContext(11)),
+			NewElement("lifeSafetyMode", V2E(NewLifeSafetyMode), WithElementContext(12)),
+			NewElement("lifeSafetyState", V2E(NewLifeSafetyState), WithElementContext(13)),
+			NewElement("restartReason", V2E(NewRestartReason), WithElementContext(14)),
+			NewElement("doorAlarmState", V2E(NewDoorAlarmState), WithElementContext(15)),
+			NewElement("action", V2E(NewAction), WithElementContext(16)),
+			NewElement("doorSecuredStatus", V2E(NewDoorSecuredStatus), WithElementContext(17)),
+			NewElement("doorStatus", V2E(NewDoorStatus), WithElementContext(18)),
+			NewElement("doorValue", V2E(NewDoorValue), WithElementContext(19)),
+			NewElement("fileAccessMethod", V2E(NewFileAccessMethod), WithElementContext(20)),
+			NewElement("lockStatus", V2E(NewLockStatus), WithElementContext(21)),
+			NewElement("lifeSafetyOperation", V2E(NewLifeSafetyOperation), WithElementContext(22)),
+			NewElement("maintenance", V2E(NewMaintenance), WithElementContext(23)),
+			NewElement("nodeType", V2E(NewNodeType), WithElementContext(24)),
+			NewElement("notifyType", V2E(NewNotifyType), WithElementContext(25)),
+			NewElement("securityLevel", V2E(NewSecurityLevel), WithElementContext(26)),
+			NewElement("shedState", V2E(NewShedState), WithElementContext(27)),
+			NewElement("silencedState", V2E(NewSilencedState), WithElementContext(28)),
+			NewElement("accessEvent", V2E(NewAccessEvent), WithElementContext(30)),
+			NewElement("zoneOccupancyState", V2E(NewAccessZoneOccupancyState), WithElementContext(31)),
+			NewElement("accessCredentialDisableReason", V2E(NewAccessCredentialDisableReason), WithElementContext(32)),
+			NewElement("accessCredentialDisable", V2E(NewAccessCredentialDisable), WithElementContext(33)),
+			NewElement("authenticationStatus", V2E(NewAuthenticationStatus), WithElementContext(34)),
+			NewElement("backupState", V2E(NewBackupState), WithElementContext(36)),
+			NewElement("writeStatus", V2E(NewWriteStatus), WithElementContext(370)),
+			NewElement("lightingInProgress", V2E(NewLightingInProgress), WithElementContext(38)),
+			NewElement("lightingOperation", V2E(NewLightingOperation), WithElementContext(39)),
+			NewElement("lightingTransition", V2E(NewLightingTransition), WithElementContext(40)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type PropertyValue struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewPropertyValue(arg Arg) (*PropertyValue, error) {
+	s := &PropertyValue{
+		sequenceElements: []Element{
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(0)),
+			NewElement("propertyArrayIndex", V2E(NewUnsigned), WithElementContext(1), WithElementOptional(true)),
+			NewElement("value", Vs2E(NewAny), WithElementContext(2)),
+			NewElement("priority", V2E(NewUnsigned), WithElementContext(3), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type Recipient struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewRecipient(arg Arg) (*Recipient, error) {
+	s := &Recipient{
+		choiceElements: []Element{
+			NewElement("device", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("address", V2E(NewDeviceAddress), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type RecipientProcess struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewRecipientProcess(arg Arg) (*RecipientProcess, error) {
+	s := &RecipientProcess{
+		sequenceElements: []Element{
+			NewElement("recipient", V2E(NewRecipient), WithElementContext(0)),
+			NewElement("processIdentifier", V2E(NewUnsigned), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type TimerStateChangeValue struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewTimerStateChangeValue(arg Arg) (*TimerStateChangeValue, error) {
+	s := &TimerStateChangeValue{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("boolean", V2E(NewBoolean)),
+			NewElement("unsigned", V2E(NewUnsigned)),
+			NewElement("integer", V2E(NewInteger)),
+			NewElement("real", V2E(NewReal)),
+			NewElement("double", V2E(NewDouble)),
+			NewElement("octetstring", V2E(NewOctetString)),
+			NewElement("characterstring", V2E(NewCharacterString)),
+			NewElement("bitstring", Vs2E(NewBitString)),
+			NewElement("enumerated", Vs2E(NewEnumerated)),
+			NewElement("date", Vs2E(NewDate)),
+			NewElement("time", Vs2E(NewTime)),
+			NewElement("objectidentifier", Vs2E(NewObjectIdentifier)),
+			NewElement("noValue", V2E(NewNull), WithElementContext(0)),
+			NewElement("constructedValue", Vs2E(NewAny), WithElementContext(1)),
+			NewElement("datetime", V2E(NewDateTime), WithElementContext(2)),
+			NewElement("lightingCommand", V2E(NewLightingCommand), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type TimeStamp struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewTimeStamp(arg Arg) (*TimeStamp, error) {
+	s := &TimeStamp{
+		choiceElements: []Element{
+			NewElement("time", Vs2E(NewTime), WithElementContext(0)),
+			NewElement("sequenceNumber", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("dateTime", V2E(NewDateTime), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type TimeValue struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewTimeValue(arg Arg) (*TimeValue, error) {
+	s := &TimeValue{
+		sequenceElements: []Element{
+			NewElement("time", Vs2E(NewTime)),
+			NewElement("value", Vs2E(NewAnyAtomic)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type WeekNDay struct {
+	*OctetString
+}
+
+func NewWeekNDay(arg Arg) (*WeekNDay, error) {
+	s := &WeekNDay{}
+	panic("implement me")
+	return s, nil
+}
+
+func (w WeekNDay) String() string {
+	value := w.GetValue()
+	if len(value) != 3 {
+		return "WeekNDay(?): " + w.OctetString.String()
+	} else {
+		return fmt.Sprintf("WeekNDay(%d, %d, %d)", value[0], value[1], value[2])
+	}
+}
+
+//
+//   Sequences
+//
+
+type AccessRule struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAccessRule(arg Arg) (*AccessRule, error) {
+	s := &AccessRule{
+		sequenceElements: []Element{
+			NewElement("timeRangeSpecifier", V2E(NewAccessRuleTimeRangeSpecifier), WithElementContext(0)),
+			NewElement("timeRange", V2E(NewDeviceObjectPropertyReference), WithElementContext(1), WithElementOptional(true)),
+			NewElement("locationSpecifier", V2E(NewAccessRuleLocationSpecifier), WithElementContext(2)),
+			NewElement("location", V2E(NewDeviceObjectReference), WithElementContext(3), WithElementOptional(true)),
+			NewElement("enable", V2E(NewBoolean), WithElementContext(4)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AccessThreatLevel struct {
+	*Unsigned
+}
+
+func NewAccessThreatLevel(arg Arg) (*AccessThreatLevel, error) {
+	s := &AccessThreatLevel{}
+	_low_limit := 0
+	_ = _low_limit
+	_high_limit := 100
+	_ = _high_limit
+	panic("implement me")
+	return s, nil
+}
+
+type AccumulatorRecord struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAccumulatorRecord(arg Arg) (*AccumulatorRecord, error) {
+	s := &AccumulatorRecord{
+		sequenceElements: []Element{
+			NewElement("timestamp", V2E(NewDateTime), WithElementContext(0)),
+			NewElement("presentValue", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("accumulatedValue", V2E(NewUnsigned), WithElementContext(2)),
+			NewElement("accumulatorStatus", V2E(NewAccumulatorRecordAccumulatorStatus), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ActionCommand struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewActionCommand(arg Arg) (*ActionCommand, error) {
+	s := &ActionCommand{
+		sequenceElements: []Element{
+			NewElement("deviceIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0), WithElementOptional(true)),
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(1)),
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(2)),
+			NewElement("propertyArrayIndex", V2E(NewUnsigned), WithElementContext(3), WithElementOptional(true)),
+			NewElement("propertyValue", Vs2E(NewAny), WithElementContext(4)),
+			NewElement("priority", V2E(NewUnsigned), WithElementContext(5), WithElementOptional(true)),
+			NewElement("postDelay", V2E(NewUnsigned), WithElementContext(6), WithElementOptional(true)),
+			NewElement("quiteOnFailure", V2E(NewBoolean), WithElementContext(7)),
+			NewElement("writeSuccessFul", V2E(NewBoolean), WithElementContext(8)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ActionList struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewActionList(arg Arg) (*ActionList, error) {
+	s := &ActionList{
+		sequenceElements: []Element{
+			NewElement("action", SequenceOf(NewActionCommand), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type Address struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAddress(arg Arg) (*Address, error) {
+	s := &Address{
+		sequenceElements: []Element{
+			NewElement("networkNumber", V2E(NewUnsigned16)),
+			NewElement("macAddress", V2E(NewOctetString)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AddressBinding struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAddressBinding(arg Arg) (*AddressBinding, error) {
+	s := &AddressBinding{
+		sequenceElements: []Element{
+			NewElement("deviceObjectIdentifier", Vs2E(NewObjectIdentifier)),
+			NewElement("deviceAddress", V2E(NewDeviceAddress)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AssignedAccessRights struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAssignedAccessRights(arg Arg) (*AssignedAccessRights, error) {
+	s := &AssignedAccessRights{
+		sequenceElements: []Element{
+			NewElement("assignedAccessRights", V2E(NewDeviceObjectReference), WithElementContext(0)),
+			NewElement("enable", V2E(NewBoolean), WithElementContext(1)),
+		},
+	}
+	//serviceChoice: 15,
+	panic("implementchoice")
+	return s, nil
+}
+
+type AssignedLandingCallsLandingCalls struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAssignedLandingCallsLandingCalls(arg Arg) (*AssignedLandingCallsLandingCalls, error) {
+	s := &AssignedLandingCallsLandingCalls{
+		sequenceElements: []Element{
+			NewElement("floorNumber", V2E(NewUnsigned8), WithElementContext(0)),
+			NewElement("direction", V2E(NewLiftCarDirection), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AssignedLandingCalls struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAssignedLandingCalls(arg Arg) (*AssignedLandingCalls, error) {
+	s := &AssignedLandingCalls{
+		sequenceElements: []Element{
+			NewElement("landingCalls", SequenceOf(NewAssignedLandingCallsLandingCalls), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuditNotification struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuditNotification(arg Arg) (*AuditNotification, error) {
+	s := &AuditNotification{
+		sequenceElements: []Element{
+			NewElement("sourceTimestamp", V2E(NewTimeStamp), WithElementContext(0), WithElementOptional(true)),
+			NewElement("targetTimestamp", V2E(NewTimeStamp), WithElementContext(1), WithElementOptional(true)),
+			NewElement("sourceDevice", V2E(NewRecipient), WithElementContext(2)),
+			NewElement("sourceObject", Vs2E(NewObjectIdentifier), WithElementContext(3), WithElementOptional(true)),
+			NewElement("operation", V2E(NewAuditOperation), WithElementContext(4)),
+			NewElement("sourceComment", V2E(NewCharacterString), WithElementContext(5), WithElementOptional(true)),
+			NewElement("targetComment", V2E(NewCharacterString), WithElementContext(6), WithElementOptional(true)),
+			NewElement("invokeID", V2E(NewUnsigned8), WithElementContext(7), WithElementOptional(true)),
+			NewElement("sourceUserID", V2E(NewUnsigned16), WithElementContext(8), WithElementOptional(true)),
+			NewElement("sourceUserRole", V2E(NewUnsigned8), WithElementContext(9), WithElementOptional(true)),
+			NewElement("targetDevice", V2E(NewRecipient), WithElementContext(10)),
+			NewElement("targetObject", Vs2E(NewObjectIdentifier), WithElementContext(11), WithElementOptional(true)),
+			NewElement("targetProperty", V2E(NewPropertyReference), WithElementContext(12), WithElementOptional(true)),
+			NewElement("targetPriority", V2E(NewUnsigned), WithElementContext(13), WithElementOptional(true)), //  1..16
+			NewElement("targetValue", Vs2E(NewAny), WithElementContext(14), WithElementOptional(true)),
+			NewElement("currentValue", Vs2E(NewAny), WithElementContext(15), WithElementOptional(true)),
+			NewElement("result", V2E(NewErrorType), WithElementContext(16), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuditLogRecordLogDatum struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewAuditLogRecordLogDatum(arg Arg) (*AuditLogRecordLogDatum, error) {
+	s := &AuditLogRecordLogDatum{
+		choiceElements: []Element{
+			NewElement("logStatus", V2E(NewLogStatus), WithElementContext(0)),
+			NewElement("auditNotification", V2E(NewAuditNotification), WithElementContext(1)),
+			NewElement("timeChange", V2E(NewReal)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuditLogRecord struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuditLogRecord(arg Arg) (*AuditLogRecord, error) {
+	s := &AuditLogRecord{
+		sequenceElements: []Element{
+			NewElement("timestamp", V2E(NewDateTime), WithElementContext(0)),
+			NewElement("logDatum", V2E(NewAuditLogRecordLogDatum), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuditLogRecordResult struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuditLogRecordResult(arg Arg) (*AuditLogRecordResult, error) {
+	s := &AuditLogRecordResult{
+		sequenceElements: []Element{
+			NewElement("sequenceNumber", V2E(NewUnsigned), WithElementContext(0)), //  Unsigned64
+			NewElement("logRecord", V2E(NewAuditLogRecord), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuditLogQueryParametersByTarget struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuditLogQueryParametersByTarget(arg Arg) (*AuditLogQueryParametersByTarget, error) {
+	s := &AuditLogQueryParametersByTarget{
+		sequenceElements: []Element{
+			NewElement("targetDeviceIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("targetDeviceAddress", V2E(NewAddress), WithElementContext(1), WithElementOptional(true)),
+			NewElement("targetObjectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(2), WithElementOptional(true)),
+			NewElement("targetPropertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(3), WithElementOptional(true)),
+			NewElement("targetArrayIndex", V2E(NewUnsigned), WithElementContext(4), WithElementOptional(true)),
+			NewElement("targetPriority", V2E(NewUnsigned), WithElementContext(5), WithElementOptional(true)),
+			NewElement("operations", V2E(NewAuditOperationFlags), WithElementContext(6), WithElementOptional(true)),
+			NewElement("successfulActionsOnly", V2E(NewBoolean), WithElementContext(7)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuditLogQueryParametersBySource struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuditLogQueryParametersBySource(arg Arg) (*AuditLogQueryParametersBySource, error) {
+	s := &AuditLogQueryParametersBySource{
+		sequenceElements: []Element{
+			NewElement("sourceDeviceIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("sourceDeviceAddress", V2E(NewAddress), WithElementContext(1), WithElementOptional(true)),
+			NewElement("sourceObjectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(2), WithElementOptional(true)),
+			NewElement("operations", V2E(NewAuditOperationFlags), WithElementContext(3), WithElementOptional(true)),
+			NewElement("successfulActionsOnly", V2E(NewBoolean), WithElementContext(4)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuditLogQueryParameters struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewAuditLogQueryParameters(arg Arg) (*AuditLogQueryParameters, error) {
+	s := &AuditLogQueryParameters{
+		choiceElements: []Element{
+			NewElement("byTarget", V2E(NewAuditLogQueryParametersByTarget), WithElementContext(0)),
+			NewElement("bySource", V2E(NewAuditLogQueryParametersBySource), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuthenticationFactor struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuthenticationFactor(arg Arg) (*AuthenticationFactor, error) {
+	s := &AuthenticationFactor{
+		sequenceElements: []Element{
+			NewElement("formatType", V2E(NewAuthenticationFactorType), WithElementContext(0)),
+			NewElement("formatClass", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("value", V2E(NewOctetString), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuthenticationFactorFormat struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuthenticationFactorFormat(arg Arg) (*AuthenticationFactorFormat, error) {
+	s := &AuthenticationFactorFormat{
+		sequenceElements: []Element{
+			NewElement("formatType", V2E(NewAuthenticationFactorType), WithElementContext(0)),
+			NewElement("vendorId", V2E(NewUnsigned), WithElementContext(1), WithElementOptional(true)),
+			NewElement("vendorFormat", V2E(NewUnsigned), WithElementContext(2), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuthenticationPolicyPolicy struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuthenticationPolicyPolicy(arg Arg) (*AuthenticationPolicyPolicy, error) {
+	s := &AuthenticationPolicyPolicy{
+		sequenceElements: []Element{
+			NewElement("credentialDataInput", V2E(NewDeviceObjectReference), WithElementContext(0)),
+			NewElement("index", V2E(NewUnsigned), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type AuthenticationPolicy struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewAuthenticationPolicy(arg Arg) (*AuthenticationPolicy, error) {
+	s := &AuthenticationPolicy{
+		sequenceElements: []Element{
+			NewElement("policy", SequenceOf(NewAuthenticationPolicyPolicy), WithElementContext(0)),
+			NewElement("orderEnforced", V2E(NewBoolean), WithElementContext(1)),
+			NewElement("timeout", V2E(NewUnsigned), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type CalendarEntry struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewCalendarEntry(arg Arg) (*CalendarEntry, error) {
+	s := &CalendarEntry{
+		choiceElements: []Element{
+			NewElement("date", Vs2E(NewDate), WithElementContext(0)),
+			NewElement("dateRange", V2E(NewDateRange), WithElementContext(1)),
+			NewElement("weekNDay", V2E(NewWeekNDay), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ChannelValue struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewChannelValue(arg Arg) (*ChannelValue, error) {
+	s := &ChannelValue{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("real", V2E(NewReal)),
+			NewElement("enumerated", Vs2E(NewEnumerated)),
+			NewElement("unsigned", V2E(NewUnsigned)),
+			NewElement("boolean", V2E(NewBoolean)),
+			NewElement("integer", V2E(NewInteger)),
+			NewElement("double", V2E(NewDouble)),
+			NewElement("time", Vs2E(NewTime)),
+			NewElement("characterString", V2E(NewCharacterString)),
+			NewElement("octetString", V2E(NewOctetString)),
+			NewElement("bitString", Vs2E(NewBitString)),
+			NewElement("date", Vs2E(NewDate)),
+			NewElement("objectidentifier", Vs2E(NewObjectIdentifier)),
+			NewElement("lightingCommand", V2E(NewLightingCommand), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ClientCOV struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewClientCOV(arg Arg) (*ClientCOV, error) {
+	s := &ClientCOV{
+		choiceElements: []Element{
+			NewElement("realIncrement", V2E(NewReal)),
+			NewElement("defaultIncrement", V2E(NewNull)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type COVMultipleSubscriptionListOfCOVReference struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewCOVMultipleSubscriptionListOfCOVReference(arg Arg) (*COVMultipleSubscriptionListOfCOVReference, error) {
+	s := &COVMultipleSubscriptionListOfCOVReference{
+		sequenceElements: []Element{
+			NewElement("monitoredProperty", V2E(NewPropertyReference), WithElementContext(0)),
+			NewElement("covIncrement", V2E(NewReal), WithElementContext(1), WithElementOptional(true)),
+			NewElement("timestamped", V2E(NewBoolean), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type COVMultipleSubscriptionList struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewCOVMultipleSubscriptionList(arg Arg) (*COVMultipleSubscriptionList, error) {
+	s := &COVMultipleSubscriptionList{
+		sequenceElements: []Element{
+			NewElement("monitoredObjectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("listOfCOVReferences", SequenceOf(NewCOVMultipleSubscriptionListOfCOVReference), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type COVMultipleSubscription struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewCOVMultipleSubscription(arg Arg) (*COVMultipleSubscription, error) {
+	s := &COVMultipleSubscription{
+		sequenceElements: []Element{
+			NewElement("recipient", V2E(NewRecipientProcess), WithElementContext(0)),
+			NewElement("issueConfirmedNotifications", V2E(NewBoolean), WithElementContext(1)),
+			NewElement("timeRemaining", V2E(NewUnsigned), WithElementContext(2)),
+			NewElement("maxNotificationDelay", V2E(NewUnsigned), WithElementContext(3)),
+			NewElement("listOfCOVSubscriptionSpecifications", SequenceOf(NewCOVMultipleSubscriptionList), WithElementContext(4)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type COVSubscription struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewCOVSubscription(arg Arg) (*COVSubscription, error) {
+	s := &COVSubscription{
+		sequenceElements: []Element{
+			NewElement("recipient", V2E(NewRecipientProcess), WithElementContext(0)),
+			NewElement("monitoredPropertyReference", V2E(NewObjectPropertyReference), WithElementContext(1)),
+			NewElement("issueConfirmedNotifications", V2E(NewBoolean), WithElementContext(2)),
+			NewElement("timeRemaining", V2E(NewUnsigned), WithElementContext(3)),
+			NewElement("covIncrement", V2E(NewReal), WithElementContext(4), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type CredentialAuthenticationFactor struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewCredentialAuthenticationFactor(arg Arg) (*CredentialAuthenticationFactor, error) {
+	s := &CredentialAuthenticationFactor{
+		sequenceElements: []Element{
+			NewElement("disable", V2E(NewAccessAuthenticationFactorDisable), WithElementContext(0)),
+			NewElement("authenticationFactor", V2E(NewAuthenticationFactor), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type DailySchedule struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDailySchedule(arg Arg) (*DailySchedule, error) {
+	s := &DailySchedule{
+		sequenceElements: []Element{
+			NewElement("daySchedule", SequenceOf(NewTimeValue), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type Destination struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDestination(arg Arg) (*Destination, error) {
+	s := &Destination{
+		sequenceElements: []Element{
+			NewElement("validDays", V2E(NewDaysOfWeek)),
+			NewElement("fromTime", Vs2E(NewTime)),
+			NewElement("toTime", Vs2E(NewTime)),
+			NewElement("recipient", V2E(NewRecipient)),
+			NewElement("processIdentifier", V2E(NewUnsigned)),
+			NewElement("issueConfirmedNotifications", V2E(NewBoolean)),
+			NewElement("transitions", V2E(NewEventTransitionBits)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type DeviceObjectPropertyValue struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewDeviceObjectPropertyValue(arg Arg) (*DeviceObjectPropertyValue, error) {
+	s := &DeviceObjectPropertyValue{
+		sequenceElements: []Element{
+			NewElement("deviceIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(1)),
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(2)),
+			NewElement("arrayIndex", V2E(NewUnsigned), WithElementContext(3), WithElementOptional(true)),
+			NewElement("value", Vs2E(NewAny), WithElementContext(4)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventNotificationSubscription struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventNotificationSubscription(arg Arg) (*EventNotificationSubscription, error) {
+	s := &EventNotificationSubscription{
+		sequenceElements: []Element{
+			NewElement("recipient", V2E(NewRecipient), WithElementContext(0)),
+			NewElement("processIdentifier", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("issueConfirmedNotifications", V2E(NewBoolean), WithElementContext(2)),
+			NewElement("timeRemaining", V2E(NewUnsigned), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterChangeOfBitstring struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterChangeOfBitstring(arg Arg) (*EventParameterChangeOfBitstring, error) {
+	s := &EventParameterChangeOfBitstring{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("bitmask", Vs2E(NewBitString), WithElementContext(1)),
+			NewElement("listOfBitstringValues", SequenceOfs(NewBitString), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterChangeOfState struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterChangeOfState(arg Arg) (*EventParameterChangeOfState, error) {
+	s := &EventParameterChangeOfState{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("listOfValues", SequenceOf(NewPropertyStates), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterChangeOfValueCOVCriteria struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewEventParameterChangeOfValueCOVCriteria(arg Arg) (*EventParameterChangeOfValueCOVCriteria, error) {
+	s := &EventParameterChangeOfValueCOVCriteria{
+		choiceElements: []Element{
+			NewElement("bitmask", Vs2E(NewBitString), WithElementContext(0)),
+			NewElement("referencedPropertyIncrement", V2E(NewReal), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterChangeOfValue struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterChangeOfValue(arg Arg) (*EventParameterChangeOfValue, error) {
+	s := &EventParameterChangeOfValue{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("covCriteria", V2E(NewEventParameterChangeOfValueCOVCriteria), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterCommandFailure struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterCommandFailure(arg Arg) (*EventParameterCommandFailure, error) {
+	s := &EventParameterCommandFailure{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("feedbackPropertyReference", V2E(NewDeviceObjectPropertyReference), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterFloatingLimit struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterFloatingLimit(arg Arg) (*EventParameterFloatingLimit, error) {
+	s := &EventParameterFloatingLimit{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("setpointReference", V2E(NewDeviceObjectPropertyReference), WithElementContext(1)),
+			NewElement("lowDiffLimit", V2E(NewReal), WithElementContext(2)),
+			NewElement("highDiffLimit", V2E(NewReal), WithElementContext(3)),
+			NewElement("deadband", V2E(NewReal), WithElementContext(4)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterOutOfRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterOutOfRange(arg Arg) (*EventParameterOutOfRange, error) {
+	s := &EventParameterOutOfRange{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("lowLimit", V2E(NewReal), WithElementContext(1)),
+			NewElement("highLimit", V2E(NewReal), WithElementContext(2)),
+			NewElement("deadband", V2E(NewReal), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterChangeOfLifeSafety struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterChangeOfLifeSafety(arg Arg) (*EventParameterChangeOfLifeSafety, error) {
+	s := &EventParameterChangeOfLifeSafety{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("listOfLifeSafetyAlarmValues", SequenceOf(NewLifeSafetyState), WithElementContext(1)),
+			NewElement("listOfAlarmValues", SequenceOf(NewLifeSafetyState), WithElementContext(2)),
+			NewElement("modePropertyReference", V2E(NewDeviceObjectPropertyReference), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterExtendedParameters struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewEventParameterExtendedParameters(arg Arg) (*EventParameterExtendedParameters, error) {
+	s := &EventParameterExtendedParameters{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull), WithElementContext(0)),
+			NewElement("real", V2E(NewReal), WithElementContext(1)),
+			NewElement("integer", V2E(NewUnsigned), WithElementContext(2)),
+			NewElement("boolean", V2E(NewBoolean), WithElementContext(3)),
+			NewElement("double", V2E(NewDouble), WithElementContext(4)),
+			NewElement("octet", V2E(NewOctetString), WithElementContext(5)),
+			NewElement("bitstring", Vs2E(NewBitString), WithElementContext(6)),
+			NewElement("enum", Vs2E(NewEnumerated), WithElementContext(7)),
+			NewElement("reference", V2E(NewDeviceObjectPropertyReference), WithElementContext(8)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterExtended struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterExtended(arg Arg) (*EventParameterExtended, error) {
+	s := &EventParameterExtended{
+		sequenceElements: []Element{
+			NewElement("vendorId", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("extendedEventType", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("parameters", SequenceOf(NewEventParameterExtendedParameters), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterBufferReady struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterBufferReady(arg Arg) (*EventParameterBufferReady, error) {
+	s := &EventParameterBufferReady{
+		sequenceElements: []Element{
+			NewElement("notificationThreshold", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("previousNotificationCount", V2E(NewUnsigned), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterUnsignedRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterUnsignedRange(arg Arg) (*EventParameterUnsignedRange, error) {
+	s := &EventParameterUnsignedRange{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("lowLimit", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("highLimit", V2E(NewUnsigned), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterAccessEventAccessEvent struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterAccessEventAccessEvent(arg Arg) (*EventParameterAccessEventAccessEvent, error) {
+	s := &EventParameterAccessEventAccessEvent{
+		sequenceElements: []Element{
+			NewElement("listOfAccessEvents", SequenceOf(NewAccessEvent), WithElementContext(0)),
+			NewElement("accessEventTimeReference", V2E(NewDeviceObjectPropertyReference), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterAccessEvent struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterAccessEvent(arg Arg) (*EventParameterAccessEvent, error) {
+	s := &EventParameterAccessEvent{
+		sequenceElements: []Element{
+			NewElement("accessEvent", SequenceOf(NewEventParameterAccessEventAccessEvent), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterDoubleOutOfRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterDoubleOutOfRange(arg Arg) (*EventParameterDoubleOutOfRange, error) {
+	s := &EventParameterDoubleOutOfRange{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("lowLimit", V2E(NewDouble), WithElementContext(1)),
+			NewElement("highLimit", V2E(NewDouble), WithElementContext(2)),
+			NewElement("deadband", V2E(NewDouble), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterSignedOutOfRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterSignedOutOfRange(arg Arg) (*EventParameterSignedOutOfRange, error) {
+	s := &EventParameterSignedOutOfRange{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("lowLimit", V2E(NewInteger), WithElementContext(1)),
+			NewElement("highLimit", V2E(NewInteger), WithElementContext(2)),
+			NewElement("deadband", V2E(NewUnsigned), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterUnsignedOutOfRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterUnsignedOutOfRange(arg Arg) (*EventParameterUnsignedOutOfRange, error) {
+	s := &EventParameterUnsignedOutOfRange{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("lowLimit", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("highLimit", V2E(NewUnsigned), WithElementContext(2)),
+			NewElement("deadband", V2E(NewUnsigned), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterChangeOfCharacterString struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterChangeOfCharacterString(arg Arg) (*EventParameterChangeOfCharacterString, error) {
+	s := &EventParameterChangeOfCharacterString{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("listOfAlarmValues", SequenceOf(NewCharacterString), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameterChangeOfStatusFlags struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewEventParameterChangeOfStatusFlags(arg Arg) (*EventParameterChangeOfStatusFlags, error) {
+	s := &EventParameterChangeOfStatusFlags{
+		sequenceElements: []Element{
+			NewElement("timeDelay", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("selectedFlags", V2E(NewStatusFlags), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type EventParameter struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewEventParameter(arg Arg) (*EventParameter, error) {
+	s := &EventParameter{
+		choiceElements: []Element{
+			NewElement("changeOfBitstring", V2E(NewEventParameterChangeOfBitstring), WithElementContext(0)),
+			NewElement("changeOfState", V2E(NewEventParameterChangeOfState), WithElementContext(1)),
+			NewElement("changeOfValue", V2E(NewEventParameterChangeOfValue), WithElementContext(2)),
+			NewElement("commandFailure", V2E(NewEventParameterCommandFailure), WithElementContext(3)),
+			NewElement("floatingLimit", V2E(NewEventParameterFloatingLimit), WithElementContext(4)),
+			NewElement("outOfRange", V2E(NewEventParameterOutOfRange), WithElementContext(5)),
+			NewElement("changeOfLifesafety", V2E(NewEventParameterChangeOfLifeSafety), WithElementContext(8)),
+			NewElement("extended", V2E(NewEventParameterExtended), WithElementContext(9)),
+			NewElement("bufferReady", V2E(NewEventParameterBufferReady), WithElementContext(10)),
+			NewElement("unsignedRange", V2E(NewEventParameterUnsignedRange), WithElementContext(11)),
+			NewElement("accessEvent", V2E(NewEventParameterAccessEvent), WithElementContext(13)),
+			NewElement("doubleOutOfRange", V2E(NewEventParameterDoubleOutOfRange), WithElementContext(14)),
+			NewElement("signedOutOfRange", V2E(NewEventParameterSignedOutOfRange), WithElementContext(15)),
+			NewElement("unsignedOutOfRange", V2E(NewEventParameterUnsignedOutOfRange), WithElementContext(16)),
+			NewElement("changeOfCharacterstring", V2E(NewEventParameterChangeOfCharacterString), WithElementContext(17)),
+			NewElement("changeOfStatusflags", V2E(NewEventParameterChangeOfStatusFlags), WithElementContext(18)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FaultParameterCharacterString struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewFaultParameterCharacterString(arg Arg) (*FaultParameterCharacterString, error) {
+	s := &FaultParameterCharacterString{
+		sequenceElements: []Element{
+			NewElement("listOfFaultValues", SequenceOf(NewCharacterString), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FaultParameterExtendedParameters struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewFaultParameterExtendedParameters(arg Arg) (*FaultParameterExtendedParameters, error) {
+	s := &FaultParameterExtendedParameters{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("real", V2E(NewReal)),
+			NewElement("unsigned", V2E(NewUnsigned)),
+			NewElement("boolean", V2E(NewBoolean)),
+			NewElement("integer", V2E(NewInteger)),
+			NewElement("double", V2E(NewDouble)),
+			NewElement("octet", V2E(NewOctetString)),
+			NewElement("characterString", V2E(NewCharacterString)),
+			NewElement("bitstring", Vs2E(NewBitString)),
+			NewElement("enum", Vs2E(NewEnumerated)),
+			NewElement("date", Vs2E(NewDate)),
+			NewElement("time", Vs2E(NewTime)),
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier)),
+			NewElement("reference", V2E(NewDeviceObjectPropertyReference), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FaultParameterExtended struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewFaultParameterExtended(arg Arg) (*FaultParameterExtended, error) {
+	s := &FaultParameterExtended{
+		sequenceElements: []Element{
+			NewElement("vendorId", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("extendedFaultType", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("parameters", SequenceOf(NewFaultParameterExtendedParameters), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FaultParameterLifeSafety struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewFaultParameterLifeSafety(arg Arg) (*FaultParameterLifeSafety, error) {
+	s := &FaultParameterLifeSafety{
+		sequenceElements: []Element{
+			NewElement("listOfFaultValues", SequenceOf(NewLifeSafetyState), WithElementContext(0)),
+			NewElement("modePropertyReference", V2E(NewDeviceObjectPropertyReference), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FaultParameterState struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewFaultParameterState(arg Arg) (*FaultParameterState, error) {
+	s := &FaultParameterState{
+		sequenceElements: []Element{
+			NewElement("listOfFaultValues", SequenceOf(NewPropertyStates), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FaultParameterStatusFlags struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewFaultParameterStatusFlags(arg Arg) (*FaultParameterStatusFlags, error) {
+	s := &FaultParameterStatusFlags{
+		sequenceElements: []Element{
+			NewElement("statusFlagsReference", V2E(NewDeviceObjectPropertyReference), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type FaultParameter struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewFaultParameter(arg Arg) (*FaultParameter, error) {
+	s := &FaultParameter{
+		choiceElements: []Element{
+			NewElement("none", V2E(NewNull), WithElementContext(0)),
+			NewElement("faultCharacterString", V2E(NewFaultParameterCharacterString), WithElementContext(1)),
+			NewElement("faultExtended", V2E(NewFaultParameterExtended), WithElementContext(2)),
+			NewElement("faultLifeSafety", V2E(NewFaultParameterLifeSafety), WithElementContext(3)),
+			NewElement("faultState", V2E(NewFaultParameterState), WithElementContext(4)),
+			NewElement("faultStatusFlags", V2E(NewFaultParameterStatusFlags), WithElementContext(5)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type KeyIdentifier struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewKeyIdentifier(arg Arg) (*KeyIdentifier, error) {
+	s := &KeyIdentifier{
+		sequenceElements: []Element{
+			NewElement("algorithm", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("keyId", V2E(NewUnsigned), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LogDataLogData struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewLogDataLogData(arg Arg) (*LogDataLogData, error) {
+	s := &LogDataLogData{
+		choiceElements: []Element{
+			NewElement("booleanValue", V2E(NewBoolean), WithElementContext(0)),
+			NewElement("realValue", V2E(NewReal), WithElementContext(1)),
+			NewElement("enumValue", Vs2E(NewEnumerated), WithElementContext(2)),
+			NewElement("unsignedValue", V2E(NewUnsigned), WithElementContext(3)),
+			NewElement("signedValue", V2E(NewInteger), WithElementContext(4)),
+			NewElement("bitstringValue", Vs2E(NewBitString), WithElementContext(5)),
+			NewElement("nullValue", V2E(NewNull), WithElementContext(6)),
+			NewElement("failure", V2E(NewErrorType), WithElementContext(7)),
+			NewElement("anyValue", Vs2E(NewAny), WithElementContext(8)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LogData struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewLogData(arg Arg) (*LogData, error) {
+	s := &LogData{
+		choiceElements: []Element{
+			NewElement("logStatus", V2E(NewLogStatus), WithElementContext(0)),
+			NewElement("logData", SequenceOf(NewLogDataLogData), WithElementContext(1)),
+			NewElement("timeChange", V2E(NewReal), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LogMultipleRecord struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewLogMultipleRecord(arg Arg) (*LogMultipleRecord, error) {
+	s := &LogMultipleRecord{
+		sequenceElements: []Element{
+			NewElement("timestamp", V2E(NewDateTime), WithElementContext(0)),
+			NewElement("logData", V2E(NewLogData), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LogRecordLogDatum struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewLogRecordLogDatum(arg Arg) (*LogRecordLogDatum, error) {
+	s := &LogRecordLogDatum{
+		choiceElements: []Element{
+			NewElement("logStatus", V2E(NewLogStatus), WithElementContext(0)),
+			NewElement("booleanValue", V2E(NewBoolean), WithElementContext(1)),
+			NewElement("realValue", V2E(NewReal), WithElementContext(2)),
+			NewElement("enumValue", Vs2E(NewEnumerated), WithElementContext(3)),
+			NewElement("unsignedValue", V2E(NewUnsigned), WithElementContext(4)),
+			NewElement("signedValue", V2E(NewInteger), WithElementContext(5)),
+			NewElement("bitstringValue", Vs2E(NewBitString), WithElementContext(6)),
+			NewElement("nullValue", V2E(NewNull), WithElementContext(7)),
+			NewElement("failure", V2E(NewErrorType), WithElementContext(8)),
+			NewElement("timeChange", V2E(NewReal), WithElementContext(9)),
+			NewElement("anyValue", Vs2E(NewAny), WithElementContext(10)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type LogRecord struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewLogRecord(arg Arg) (*LogRecord, error) {
+	s := &LogRecord{
+		sequenceElements: []Element{
+			NewElement("timestamp", V2E(NewDateTime), WithElementContext(0)),
+			NewElement("logDatum", V2E(NewLogRecordLogDatum), WithElementContext(1)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(2), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NetworkSecurityPolicy struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNetworkSecurityPolicy(arg Arg) (*NetworkSecurityPolicy, error) {
+	s := &NetworkSecurityPolicy{
+		sequenceElements: []Element{
+			NewElement("portId", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("securityLevel", V2E(NewSecurityPolicy), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfBitstring struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersChangeOfBitstring(arg Arg) (*NotificationParametersChangeOfBitstring, error) {
+	s := &NotificationParametersChangeOfBitstring{
+		sequenceElements: []Element{
+			NewElement("referencedBitstring", Vs2E(NewBitString), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfState struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersChangeOfState(arg Arg) (*NotificationParametersChangeOfState, error) {
+	s := &NotificationParametersChangeOfState{
+		sequenceElements: []Element{
+			NewElement("newState", V2E(NewPropertyStates), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfValueNewValue struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewNotificationParametersChangeOfValueNewValue(arg Arg) (*NotificationParametersChangeOfValueNewValue, error) {
+	s := &NotificationParametersChangeOfValueNewValue{
+		choiceElements: []Element{
+			NewElement("changedBits", Vs2E(NewBitString), WithElementContext(0)),
+			NewElement("changedValue", V2E(NewReal), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfValue struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersChangeOfValue(arg Arg) (*NotificationParametersChangeOfValue, error) {
+	s := &NotificationParametersChangeOfValue{
+		sequenceElements: []Element{
+			NewElement("newValue", V2E(NewNotificationParametersChangeOfValueNewValue), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersCommandFailure struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersCommandFailure(arg Arg) (*NotificationParametersCommandFailure, error) {
+	s := &NotificationParametersCommandFailure{
+		sequenceElements: []Element{
+			NewElement("commandValue", Vs2E(NewAny), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("feedbackValue", Vs2E(NewAny), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersFloatingLimit struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersFloatingLimit(arg Arg) (*NotificationParametersFloatingLimit, error) {
+	s := &NotificationParametersFloatingLimit{
+		sequenceElements: []Element{
+			NewElement("referenceValue", V2E(NewReal), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("setpointValue", V2E(NewReal), WithElementContext(2)),
+			NewElement("errorLimit", V2E(NewReal), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersOutOfRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersOutOfRange(arg Arg) (*NotificationParametersOutOfRange, error) {
+	s := &NotificationParametersOutOfRange{
+		sequenceElements: []Element{
+			NewElement("exceedingValue", V2E(NewReal), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("deadband", V2E(NewReal), WithElementContext(2)),
+			NewElement("exceededLimit", V2E(NewReal), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersExtendedParametersType struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewNotificationParametersExtendedParametersType(arg Arg) (*NotificationParametersExtendedParametersType, error) {
+	s := &NotificationParametersExtendedParametersType{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("real", V2E(NewReal)),
+			NewElement("integer", V2E(NewUnsigned)),
+			NewElement("boolean", V2E(NewBoolean)),
+			NewElement("double", V2E(NewDouble)),
+			NewElement("octet", V2E(NewOctetString)),
+			NewElement("bitstring", Vs2E(NewBitString)),
+			NewElement("enum", Vs2E(NewEnumerated)),
+			NewElement("propertyValue", V2E(NewDeviceObjectPropertyValue)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersExtended struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersExtended(arg Arg) (*NotificationParametersExtended, error) {
+	s := &NotificationParametersExtended{
+		sequenceElements: []Element{
+			NewElement("vendorId", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("extendedEventType", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("parameters", V2E(NewNotificationParametersExtendedParametersType), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersBufferReady struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersBufferReady(arg Arg) (*NotificationParametersBufferReady, error) {
+	s := &NotificationParametersBufferReady{
+		sequenceElements: []Element{
+			NewElement("bufferProperty", V2E(NewDeviceObjectPropertyReference), WithElementContext(0)),
+			NewElement("previousNotification", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("currentNotification", V2E(NewUnsigned), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersUnsignedRange struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersUnsignedRange(arg Arg) (*NotificationParametersUnsignedRange, error) {
+	s := &NotificationParametersUnsignedRange{
+		sequenceElements: []Element{
+			NewElement("exceedingValue", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("exceedingLimit", V2E(NewUnsigned), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersComplexEventType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersComplexEventType(arg Arg) (*NotificationParametersComplexEventType, error) {
+	s := &NotificationParametersComplexEventType{
+		sequenceElements: []Element{
+			NewElement("complexEventType", V2E(NewPropertyValue), WithElementContext(0)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfLifeSafety struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersChangeOfLifeSafety(arg Arg) (*NotificationParametersChangeOfLifeSafety, error) {
+	s := &NotificationParametersChangeOfLifeSafety{
+		sequenceElements: []Element{
+			NewElement("newState", V2E(NewLifeSafetyState), WithElementContext(0)),
+			NewElement("newMode", V2E(NewLifeSafetyMode), WithElementContext(1)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(2)),
+			NewElement("operationExpected", V2E(NewLifeSafetyOperation), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersAccessEventType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersAccessEventType(arg Arg) (*NotificationParametersAccessEventType, error) {
+	s := &NotificationParametersAccessEventType{
+		sequenceElements: []Element{
+			NewElement("accessEvent", V2E(NewAccessEvent), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("accessEventTag", V2E(NewUnsigned), WithElementContext(2)),
+			NewElement("accessEventTime", V2E(NewTimeStamp), WithElementContext(3)),
+			NewElement("accessCredential", V2E(NewDeviceObjectReference), WithElementContext(4)),
+			NewElement("authenicationFactor", V2E(NewAuthenticationFactorType), WithElementContext(5), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersDoubleOutOfRangeType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersDoubleOutOfRangeType(arg Arg) (*NotificationParametersDoubleOutOfRangeType, error) {
+	s := &NotificationParametersDoubleOutOfRangeType{
+		sequenceElements: []Element{
+			NewElement("exceedingValue", V2E(NewDouble), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("deadband", V2E(NewDouble), WithElementContext(2)),
+			NewElement("exceededLimit", V2E(NewDouble), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersSignedOutOfRangeType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersSignedOutOfRangeType(arg Arg) (*NotificationParametersSignedOutOfRangeType, error) {
+	s := &NotificationParametersSignedOutOfRangeType{
+		sequenceElements: []Element{
+			NewElement("exceedingValue", V2E(NewInteger), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("deadband", V2E(NewUnsigned), WithElementContext(2)),
+			NewElement("exceededLimit", V2E(NewInteger), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersUnsignedOutOfRangeType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersUnsignedOutOfRangeType(arg Arg) (*NotificationParametersUnsignedOutOfRangeType, error) {
+	s := &NotificationParametersUnsignedOutOfRangeType{
+		sequenceElements: []Element{
+			NewElement("exceedingValue", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("deadband", V2E(NewUnsigned), WithElementContext(2)),
+			NewElement("exceededLimit", V2E(NewUnsigned), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfCharacterStringType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersChangeOfCharacterStringType(arg Arg) (*NotificationParametersChangeOfCharacterStringType, error) {
+	s := &NotificationParametersChangeOfCharacterStringType{
+		sequenceElements: []Element{
+			NewElement("changedValue", V2E(NewCharacterString), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("alarmValue", V2E(NewCharacterString), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfStatusFlagsType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersChangeOfStatusFlagsType(arg Arg) (*NotificationParametersChangeOfStatusFlagsType, error) {
+	s := &NotificationParametersChangeOfStatusFlagsType{
+		sequenceElements: []Element{
+			NewElement("presentValue", V2E(NewCharacterString), WithElementContext(0)),
+			NewElement("referencedFlags", V2E(NewStatusFlags), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParametersChangeOfReliabilityType struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewNotificationParametersChangeOfReliabilityType(arg Arg) (*NotificationParametersChangeOfReliabilityType, error) {
+	s := &NotificationParametersChangeOfReliabilityType{
+		sequenceElements: []Element{
+			NewElement("reliability", V2E(NewReliability), WithElementContext(0)),
+			NewElement("statusFlags", V2E(NewStatusFlags), WithElementContext(1)),
+			NewElement("propertyValues", SequenceOf(NewPropertyValue), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type NotificationParameters struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewNotificationParameters(arg Arg) (*NotificationParameters, error) {
+	s := &NotificationParameters{
+		choiceElements: []Element{
+			NewElement("changeOfBitstring", V2E(NewNotificationParametersChangeOfBitstring), WithElementContext(0)),
+			NewElement("changeOfState", V2E(NewNotificationParametersChangeOfState), WithElementContext(1)),
+			NewElement("changeOfValue", V2E(NewNotificationParametersChangeOfValue), WithElementContext(2)),
+			NewElement("commandFailure", V2E(NewNotificationParametersCommandFailure), WithElementContext(3)),
+			NewElement("floatingLimit", V2E(NewNotificationParametersFloatingLimit), WithElementContext(4)),
+			NewElement("outOfRange", V2E(NewNotificationParametersOutOfRange), WithElementContext(5)),
+			NewElement("complexEventType", V2E(NewNotificationParametersComplexEventType), WithElementContext(6)),
+			NewElement("changeOfLifeSafety", V2E(NewNotificationParametersChangeOfLifeSafety), WithElementContext(8)),
+			NewElement("extended", V2E(NewNotificationParametersExtended), WithElementContext(9)),
+			NewElement("bufferReady", V2E(NewNotificationParametersBufferReady), WithElementContext(10)),
+			NewElement("unsignedRange", V2E(NewNotificationParametersUnsignedRange), WithElementContext(11)),
+			NewElement("accessEvent", V2E(NewNotificationParametersAccessEventType), WithElementContext(13)),
+			NewElement("doubleOutOfRange", V2E(NewNotificationParametersDoubleOutOfRangeType), WithElementContext(14)),
+			NewElement("signedOutOfRange", V2E(NewNotificationParametersSignedOutOfRangeType), WithElementContext(15)),
+			NewElement("unsignedOutOfRange", V2E(NewNotificationParametersUnsignedOutOfRangeType), WithElementContext(16)),
+			NewElement("changeOfCharacterString", V2E(NewNotificationParametersChangeOfCharacterStringType), WithElementContext(17)),
+			NewElement("changeOfStatusFlags", V2E(NewNotificationParametersChangeOfStatusFlagsType), WithElementContext(18)),
+			NewElement("changeOfReliability", V2E(NewNotificationParametersChangeOfReliabilityType), WithElementContext(19)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ObjectPropertyValue struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewObjectPropertyValue(arg Arg) (*ObjectPropertyValue, error) {
+	s := &ObjectPropertyValue{
+		sequenceElements: []Element{
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(1)),
+			NewElement("propertyArrayIndex", V2E(NewUnsigned), WithElementContext(2), WithElementOptional(true)),
+			NewElement("value", Vs2E(NewAny), WithElementContext(3)),
+			NewElement("priority", V2E(NewUnsigned), WithElementContext(4), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ObjectSelector struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewObjectSelector(arg Arg) (*ObjectSelector, error) {
+	s := &ObjectSelector{
+		choiceElements: []Element{
+			NewElement("none", V2E(NewNull)),
+			NewElement("object", Vs2E(NewObjectIdentifier)),
+			NewElement("objectType", Vs2E(NewObjectType)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type PortPermission struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewPortPermission(arg Arg) (*PortPermission, error) {
+	s := &PortPermission{
+		sequenceElements: []Element{
+			NewElement("portId", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("enabled", V2E(NewBoolean), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type Prescale struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewPrescale(arg Arg) (*Prescale, error) {
+	s := &Prescale{
+		sequenceElements: []Element{
+			NewElement("multiplier", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("moduloDivide", V2E(NewUnsigned), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type PriorityValue struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewPriorityValue(arg Arg) (*PriorityValue, error) {
+	s := &PriorityValue{
+		choiceElements: []Element{
+			NewElement("null", V2E(NewNull)),
+			NewElement("real", V2E(NewReal)),
+			NewElement("enumerated", Vs2E(NewEnumerated)),
+			NewElement("unsigned", V2E(NewUnsigned)),
+			NewElement("boolean", V2E(NewBoolean)),
+			NewElement("integer", V2E(NewInteger)),
+			NewElement("double", V2E(NewDouble)),
+			NewElement("time", Vs2E(NewTime)),
+			NewElement("characterString", V2E(NewCharacterString)),
+			NewElement("octetString", V2E(NewOctetString)),
+			NewElement("bitString", Vs2E(NewBitString)),
+			NewElement("date", Vs2E(NewDate)),
+			NewElement("objectidentifier", Vs2E(NewObjectIdentifier)),
+			NewElement("constructedValue", Vs2E(NewAny), WithElementContext(0)),
+			NewElement("datetime", V2E(NewDateTime), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+// TODO: finish me... dunno what is going on here...
+type PriorityArray struct {
+}
+
+func NewPriorityArray(arg Arg) (*PriorityArray, error) {
+	s := &PriorityArray{}
+	ArrayOf(NewPriorityValue, 16, PriorityValue{})
+	panic("implementchoice")
+	return s, nil
+}
+
+type PropertyAccessResultAccessResult struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewPropertyAccessResultAccessResult(arg Arg) (*PropertyAccessResultAccessResult, error) {
+	s := &PropertyAccessResultAccessResult{
+		choiceElements: []Element{
+			NewElement("propertyValue", Vs2E(NewAny), WithElementContext(4)),
+			NewElement("propertyAccessError", V2E(NewErrorType), WithElementContext(5)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type PropertyAccessResult struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewPropertyAccessResult(arg Arg) (*PropertyAccessResult, error) {
+	s := &PropertyAccessResult{
+		sequenceElements: []Element{
+			NewElement("objectIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(0)),
+			NewElement("propertyIdentifier", V2E(NewPropertyIdentifier), WithElementContext(1)),
+			NewElement("propertyArrayIndex", V2E(NewUnsigned), WithElementContext(2), WithElementOptional(true)),
+			NewElement("deviceIdentifier", Vs2E(NewObjectIdentifier), WithElementContext(3), WithElementOptional(true)),
+			NewElement("accessResult", V2E(NewPropertyAccessResultAccessResult)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type Scale struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewScale(arg Arg) (*Scale, error) {
+	s := &Scale{
+		choiceElements: []Element{
+			NewElement("floatScale", V2E(NewReal), WithElementContext(0)),
+			NewElement("integerScale", V2E(NewInteger), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type SecurityKeySet struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewSecurityKeySet(arg Arg) (*SecurityKeySet, error) {
+	s := &SecurityKeySet{
+		sequenceElements: []Element{
+			NewElement("keyRevision", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("activationTime", V2E(NewDateTime), WithElementContext(1)),
+			NewElement("expirationTime", V2E(NewDateTime), WithElementContext(2)),
+			NewElement("keyIds", SequenceOf(NewKeyIdentifier), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ShedLevel struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewShedLevel(arg Arg) (*ShedLevel, error) {
+	s := &ShedLevel{
+		choiceElements: []Element{
+			NewElement("percent", V2E(NewUnsigned), WithElementContext(0)),
+			NewElement("level", V2E(NewUnsigned), WithElementContext(1)),
+			NewElement("amount", V2E(NewReal), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type SetpointReference struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewSetpointReference(arg Arg) (*SetpointReference, error) {
+	s := &SetpointReference{
+		sequenceElements: []Element{
+			NewElement("setpointReference", V2E(NewObjectPropertyReference), WithElementContext(0), WithElementOptional(true)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type SpecialEventPeriod struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewSpecialEventPeriod(arg Arg) (*SpecialEventPeriod, error) {
+	s := &SpecialEventPeriod{
+		choiceElements: []Element{
+			NewElement("calendarEntry", V2E(NewCalendarEntry), WithElementContext(0)),
+			NewElement("calendarReference", Vs2E(NewObjectIdentifier), WithElementContext(1)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type SpecialEvent struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewSpecialEvent(arg Arg) (*SpecialEvent, error) {
+	s := &SpecialEvent{
+		sequenceElements: []Element{
+			NewElement("period", V2E(NewSpecialEventPeriod)),
+			NewElement("listOfTimeValues", SequenceOf(NewTimeValue), WithElementContext(2)),
+			NewElement("eventPriority", V2E(NewUnsigned), WithElementContext(3)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type StageLimitValue struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewStageLimitValue(arg Arg) (*StageLimitValue, error) {
+	s := &StageLimitValue{
+		sequenceElements: []Element{
+			NewElement("limit", V2E(NewReal)),
+			NewElement("values", Vs2E(NewBitString)),
+			NewElement("deadband", V2E(NewReal)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type ValueSource struct {
+	*Choice
+	choiceElements []Element
+}
+
+func NewValueSource(arg Arg) (*ValueSource, error) {
+	s := &ValueSource{
+		choiceElements: []Element{
+			NewElement("none", V2E(NewNull), WithElementContext(0)),
+			NewElement("object", V2E(NewDeviceObjectReference), WithElementContext(1)),
+			NewElement("address", V2E(NewAddress), WithElementContext(2)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
+
+type VTSession struct {
+	*Sequence
+	sequenceElements []Element
+}
+
+func NewVTSession(arg Arg) (*VTSession, error) {
+	s := &VTSession{
+		sequenceElements: []Element{
+			NewElement("localVtSessionID", V2E(NewUnsigned)),
+			NewElement("remoteVtSessionID", V2E(NewUnsigned)),
+			NewElement("remoteVtAddress", V2E(NewDeviceAddress)),
+		},
+	}
+	panic("implementchoice")
+	return s, nil
+}
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll.go
index c9de28a656..82a893b481 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll.go
@@ -17,7 +17,11 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
+
+import (
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+)
 
 // BVLPDUTypes is a dictionary of message type values and structs
 var BVLPDUTypes map[uint8]func() Decoder
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_BVLCI.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLCI.go
similarity index 88%
rename from plc4go/internal/bacnetip/bacgopes/bvll_BVLCI.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLCI.go
index 4bd96b7f7b..55da78ec01 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_BVLCI.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLCI.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -25,6 +25,10 @@ import (
 	"github.com/pkg/errors"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/debugging"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type BVLCIRequirements interface {
@@ -49,10 +53,10 @@ type BVLCI interface {
 
 //go:generate plc4xGenerator -type=_BVLCI -prefix=bvll
 type _BVLCI struct {
-	*_PCI
-	*DebugContents
+	PCI
+	*DebugContents `ignore:"true"`
 
-	requirements BVLCIRequirements
+	requirements BVLCIRequirements `ignore:"true"`
 
 	bvlciType     uint8
 	bvlciFunction uint8
@@ -69,7 +73,7 @@ func NewBVLCI(requirements BVLCIRequirements, bvlc readWriteModel.BVLC) BVLCI {
 		bvlciType:    0x81,
 		requirements: requirements,
 	}
-	b._PCI = newPCI(bvlc, nil, nil, nil, false, readWriteModel.NPDUNetworkPriority_NORMAL_MESSAGE)
+	b.PCI = NewPCI(bvlc, nil, nil, nil, false, readWriteModel.NPDUNetworkPriority_NORMAL_MESSAGE)
 	if bvlc != nil {
 		b.bvlciFunction = bvlc.GetBvlcFunction()
 		b.bvlciLength = bvlc.GetLengthInBytes(context.Background())
@@ -78,7 +82,7 @@ func NewBVLCI(requirements BVLCIRequirements, bvlc readWriteModel.BVLC) BVLCI {
 }
 
 func (b *_BVLCI) Update(bvlci Arg) error {
-	if err := b._PCI.Update(bvlci); err != nil {
+	if err := b.PCI.Update(bvlci); err != nil {
 		return errors.Wrap(err, "Update BVLCI")
 	}
 	switch bvlci := bvlci.(type) {
@@ -114,7 +118,7 @@ func (b *_BVLCI) Encode(pdu Arg) error {
 }
 
 func (b *_BVLCI) Decode(pdu Arg) error {
-	if err := b._PCI.Update(pdu); err != nil {
+	if err := b.PCI.Update(pdu); err != nil {
 		return errors.Wrap(err, "error updating pdu")
 	}
 	readBytes := 0 // TODO: as long as we use the read like this we should be good (not using plc4x to parse that away)
@@ -175,5 +179,5 @@ func (b *_BVLCI) getBVLCI() BVLCI {
 }
 
 func (b *_BVLCI) deepCopy() *_BVLCI {
-	return &_BVLCI{_PCI: b._PCI.deepCopy()}
+	return &_BVLCI{PCI: b.PCI.DeepCopy().(PCI)}
 }
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_BVLCI_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLCI_plc4xgen.go
similarity index 87%
rename from plc4go/internal/bacnetip/bacgopes/bvll_BVLCI_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLCI_plc4xgen.go
index 37629f0857..a48eb97f8e 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_BVLCI_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLCI_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=_BVLCI -prefix=bvll"; DO NOT EDIT.
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -48,19 +48,9 @@ func (d *_BVLCI) SerializeWithWriteBuffer(ctx context.Context, writeBuffer utils
 	if err := writeBuffer.PushContext("_BVLCI"); err != nil {
 		return err
 	}
-	if err := d._PCI.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+	if err := d.PCI.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
 		return err
 	}
-	if err := d.DebugContents.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
-		return err
-	}
-	{
-		_value := fmt.Sprintf("%v", d.requirements)
-
-		if err := writeBuffer.WriteString("requirements", uint32(len(_value)*8), _value); err != nil {
-			return err
-		}
-	}
 	{
 		_value := fmt.Sprintf("%v", d.bvlciType)
 
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_BVLPDU.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLPDU.go
similarity index 84%
rename from plc4go/internal/bacnetip/bacgopes/bvll_BVLPDU.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLPDU.go
index 811d5bc23e..1bc6618a94 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_BVLPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -26,6 +26,9 @@ import (
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type BVLPDU interface {
@@ -37,7 +40,7 @@ type BVLPDU interface {
 //go:generate plc4xGenerator -type=_BVLPDU -prefix=bvll
 type _BVLPDU struct {
 	*_BVLCI
-	*_PDUData
+	PDUData
 }
 
 var _ BVLPDU = (*_BVLPDU)(nil)
@@ -45,10 +48,10 @@ var _ BVLPDU = (*_BVLPDU)(nil)
 func NewBVLPDU(bvlc readWriteModel.BVLC) BVLPDU {
 	b := &_BVLPDU{}
 	b._BVLCI = NewBVLCI(b, bvlc).(*_BVLCI)
-	b._PDUData = NewPDUData(NoArgs).(*_PDUData)
-	if b.rootMessage != nil {
-		b.data, _ = b.rootMessage.Serialize()
-		b.data = b.data[4:]
+	b.PDUData = NewPDUData(NoArgs)
+	if b.GetRootMessage() != nil {
+		data, _ := b.GetRootMessage().Serialize()
+		b.SetPduData(data[4:])
 	}
 	return b
 }
@@ -85,13 +88,13 @@ func (b *_BVLPDU) Decode(pdu Arg) error {
 	}
 	if rootMessage != nil {
 		// Overwrite the root message again so we can use it for matching
-		b.rootMessage = rootMessage
+		b.SetRootMessage(rootMessage)
 	}
 	return nil
 }
 
 func (b *_BVLPDU) GetBvlcFunction() uint8 {
-	switch rm := b.rootMessage.(type) {
+	switch rm := b.GetRootMessage().(type) {
 	case readWriteModel.BVLC:
 		return rm.GetBvlcFunction()
 	default:
@@ -100,7 +103,7 @@ func (b *_BVLPDU) GetBvlcFunction() uint8 {
 }
 
 func (b *_BVLPDU) GetBvlcPayloadLength() uint16 {
-	switch rm := b.rootMessage.(type) {
+	switch rm := b.GetRootMessage().(type) {
 	case readWriteModel.BVLC:
 		return rm.GetBvlcPayloadLength()
 	default:
@@ -112,7 +115,7 @@ func (b *_BVLPDU) IsBVLC() {
 }
 
 func (b *_BVLPDU) deepCopy() *_BVLPDU {
-	return &_BVLPDU{_BVLCI: b._BVLCI.deepCopy(), _PDUData: b._PDUData.deepCopy()}
+	return &_BVLPDU{_BVLCI: b._BVLCI.deepCopy(), PDUData: b.PDUData.DeepCopy().(PDUData)}
 }
 
 func (b *_BVLPDU) DeepCopy() any {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_BVLPDU_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLPDU_plc4xgen.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_BVLPDU_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLPDU_plc4xgen.go
index 5a1b390610..829c8e7a25 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_BVLPDU_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_BVLPDU_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=_BVLPDU -prefix=bvll"; DO NOT EDIT.
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -51,7 +51,7 @@ func (d *_BVLPDU) SerializeWithWriteBuffer(ctx context.Context, writeBuffer util
 	if err := d._BVLCI.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
 		return err
 	}
-	if err := d._PDUData.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
+	if err := d.PDUData.SerializeWithWriteBuffer(ctx, writeBuffer); err != nil {
 		return err
 	}
 	if err := writeBuffer.PopContext("_BVLPDU"); err != nil {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_DeleteForeignDeviceTableEntry.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_DeleteForeignDeviceTableEntry.go
similarity index 94%
rename from plc4go/internal/bacnetip/bacgopes/bvll_DeleteForeignDeviceTableEntry.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_DeleteForeignDeviceTableEntry.go
index 8a963f42d3..0cfcd26b55 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_DeleteForeignDeviceTableEntry.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_DeleteForeignDeviceTableEntry.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"encoding/binary"
@@ -27,6 +27,9 @@ import (
 	"github.com/rs/zerolog"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type DeleteForeignDeviceTableEntry struct {
@@ -97,7 +100,7 @@ func (d *DeleteForeignDeviceTableEntry) Decode(bvlpdu Arg) error {
 		switch rm := bvlpdu.GetRootMessage().(type) {
 		case readWriteModel.BVLCDeleteForeignDeviceTableEntry:
 			d.bvlciAddress = d.buildAddress(rm.GetIp(), rm.GetPort())
-			d.rootMessage = rm
+			d.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_DistributeBroadcastToNetwork.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_DistributeBroadcastToNetwork.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_DistributeBroadcastToNetwork.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_DistributeBroadcastToNetwork.go
index b6be9ab09e..1bca56d414 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_DistributeBroadcastToNetwork.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_DistributeBroadcastToNetwork.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -27,6 +27,9 @@ import (
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type DistributeBroadcastToNetwork struct {
@@ -111,7 +114,7 @@ func (d *DistributeBroadcastToNetwork) Decode(bvlpdu Arg) error {
 	case BVLPDU:
 		switch rm := bvlpdu.GetRootMessage().(type) {
 		case model.BVLCDistributeBroadcastToNetwork:
-			d.rootMessage = rm
+			d.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_FDTEntry.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_FDTEntry.go
similarity index 92%
rename from plc4go/internal/bacnetip/bacgopes/bvll_FDTEntry.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_FDTEntry.go
index c588fd2006..85ce074c4c 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_FDTEntry.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_FDTEntry.go
@@ -17,9 +17,13 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
-import "fmt"
+import (
+	"fmt"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
+)
 
 type FDTEntry struct {
 	FDAddress *Address
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_ForwardedNPDU.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ForwardedNPDU.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_ForwardedNPDU.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_ForwardedNPDU.go
index 498cc9e435..942e0835f4 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_ForwardedNPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ForwardedNPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -29,6 +29,9 @@ import (
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ForwardedNPDU struct {
@@ -72,7 +75,7 @@ func WithForwardedNPDUAddress(addr *Address) func(*ForwardedNPDU) {
 
 func WithForwardedNPDUUserData(userData spi.Message) func(*ForwardedNPDU) {
 	return func(b *ForwardedNPDU) {
-		b.pduUserData = userData
+		b.SetPDUUserData(userData)
 	}
 }
 
@@ -133,7 +136,7 @@ func (f *ForwardedNPDU) Decode(bvlpdu Arg) error {
 				return errors.Wrap(err, "error creating address")
 			}
 			f.bvlciAddress = address
-			f.rootMessage = rm
+			f.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_OriginalBroadcastNPDU.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_OriginalBroadcastNPDU.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_OriginalBroadcastNPDU.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_OriginalBroadcastNPDU.go
index f5cb59ab5c..c9767128d1 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_OriginalBroadcastNPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_OriginalBroadcastNPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -27,6 +27,9 @@ import (
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type OriginalBroadcastNPDU struct {
@@ -110,7 +113,7 @@ func (o *OriginalBroadcastNPDU) Decode(bvlpdu Arg) error {
 	case BVLPDU:
 		switch rm := bvlpdu.GetRootMessage().(type) {
 		case model.BVLCOriginalBroadcastNPDU:
-			o.rootMessage = rm
+			o.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_OriginalUnicastNPDU.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_OriginalUnicastNPDU.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_OriginalUnicastNPDU.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_OriginalUnicastNPDU.go
index 7b573d6cba..5cbcd807f8 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_OriginalUnicastNPDU.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_OriginalUnicastNPDU.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"context"
@@ -27,6 +27,9 @@ import (
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
 	"github.com/apache/plc4x/plc4go/spi"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type OriginalUnicastNPDU struct {
@@ -110,7 +113,7 @@ func (o *OriginalUnicastNPDU) Decode(bvlpdu Arg) error {
 	case BVLPDU:
 		switch rm := bvlpdu.GetRootMessage().(type) {
 		case model.BVLCOriginalUnicastNPDU:
-			o.rootMessage = rm
+			o.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_ReadBroadcastDistributionTable.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadBroadcastDistributionTable.go
similarity index 92%
rename from plc4go/internal/bacnetip/bacgopes/bvll_ReadBroadcastDistributionTable.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadBroadcastDistributionTable.go
index 6ee3775d21..1464d25344 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_ReadBroadcastDistributionTable.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadBroadcastDistributionTable.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"fmt"
@@ -25,6 +25,9 @@ import (
 	"github.com/pkg/errors"
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ReadBroadcastDistributionTable struct {
@@ -60,7 +63,7 @@ func (r *ReadBroadcastDistributionTable) Decode(bvlpdu Arg) error {
 	case BVLPDU:
 		switch rm := bvlpdu.GetRootMessage().(type) {
 		case model.BVLCReadBroadcastDistributionTable:
-			r.rootMessage = rm
+			r.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_ReadBroadcastDistributionTableAck.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadBroadcastDistributionTableAck.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_ReadBroadcastDistributionTableAck.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadBroadcastDistributionTableAck.go
index ddedd90298..48cee24c8c 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_ReadBroadcastDistributionTableAck.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadBroadcastDistributionTableAck.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"encoding/binary"
@@ -27,6 +27,9 @@ import (
 	"github.com/rs/zerolog"
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ReadBroadcastDistributionTableAck struct {
@@ -116,7 +119,7 @@ func (r *ReadBroadcastDistributionTableAck) Decode(bvlpdu Arg) error {
 			switch bvlc := rm.(type) {
 			case model.BVLCReadBroadcastDistributionTableAck:
 				r.bvlciBDT = r.produceBvlciBDT(bvlc.GetTable())
-				r.rootMessage = rm
+				r.SetRootMessage(rm)
 			}
 		}
 	}
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_ReadForeignDeviceTable.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadForeignDeviceTable.go
similarity index 92%
rename from plc4go/internal/bacnetip/bacgopes/bvll_ReadForeignDeviceTable.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadForeignDeviceTable.go
index 783527bef9..22d9e44b6e 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_ReadForeignDeviceTable.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadForeignDeviceTable.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"fmt"
@@ -25,6 +25,9 @@ import (
 	"github.com/pkg/errors"
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ReadForeignDeviceTable struct {
@@ -62,7 +65,7 @@ func (r *ReadForeignDeviceTable) Decode(bvlpdu Arg) error {
 	case BVLCI:
 		switch rm := bvlpdu.GetRootMessage().(type) {
 		case model.BVLCReadForeignDeviceTable:
-			r.rootMessage = rm
+			r.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_ReadForeignDeviceTableAck.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadForeignDeviceTableAck.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_ReadForeignDeviceTableAck.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadForeignDeviceTableAck.go
index 223bba0eee..b420fef03d 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_ReadForeignDeviceTableAck.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_ReadForeignDeviceTableAck.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"encoding/binary"
@@ -27,6 +27,9 @@ import (
 	"github.com/rs/zerolog"
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type ReadForeignDeviceTableAck struct {
@@ -114,7 +117,7 @@ func (r *ReadForeignDeviceTableAck) Decode(bvlpdu Arg) error {
 		switch rm := bvlpdu.GetRootMessage().(type) {
 		case model.BVLCReadForeignDeviceTableAck:
 			r.bvlciFDT = r.produceBvlciFDT(rm.GetTable())
-			r.rootMessage = rm
+			r.SetRootMessage(rm)
 		}
 	}
 	switch bvlpdu := bvlpdu.(type) {
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_RegisterForeignDevice.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_RegisterForeignDevice.go
similarity index 93%
rename from plc4go/internal/bacnetip/bacgopes/bvll_RegisterForeignDevice.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_RegisterForeignDevice.go
index 7e40db7ca8..c1f465ff9d 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_RegisterForeignDevice.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_RegisterForeignDevice.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"fmt"
@@ -25,6 +25,9 @@ import (
 	"github.com/pkg/errors"
 
 	"github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type RegisterForeignDevice struct {
@@ -81,7 +84,7 @@ func (r *RegisterForeignDevice) Decode(bvlpdu Arg) error {
 			switch bvlc := rm.(type) {
 			case model.BVLCRegisterForeignDevice:
 				r.bvlciTimeToLive = bvlc.GetTtl()
-				r.rootMessage = rm
+				r.SetRootMessage(rm)
 			}
 		}
 	}
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_Result.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_Result.go
similarity index 93%
rename from plc4go/internal/bacnetip/bacgopes/bvll_Result.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_Result.go
index 207b8904cb..0437d1543e 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_Result.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_Result.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"fmt"
@@ -25,6 +25,9 @@ import (
 	"github.com/pkg/errors"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type Result struct {
@@ -81,7 +84,7 @@ func (r *Result) Decode(bvlpdu Arg) error {
 			switch bvlc := rm.(type) {
 			case readWriteModel.BVLCResult:
 				r.bvlciResultCode = bvlc.GetCode()
-				r.rootMessage = rm
+				r.SetRootMessage(rm)
 			}
 		}
 	}
diff --git a/plc4go/internal/bacnetip/bacgopes/bvll_WriteBroadcastDistributionTable.go b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_WriteBroadcastDistributionTable.go
similarity index 95%
rename from plc4go/internal/bacnetip/bacgopes/bvll_WriteBroadcastDistributionTable.go
rename to plc4go/internal/bacnetip/bacgopes/bvll/bvll_WriteBroadcastDistributionTable.go
index aad850b489..3dc65a8b19 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvll_WriteBroadcastDistributionTable.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvll/bvll_WriteBroadcastDistributionTable.go
@@ -17,7 +17,7 @@
  * under the License.
  */
 
-package bacgopes
+package bvll
 
 import (
 	"encoding/binary"
@@ -27,6 +27,9 @@ import (
 	"github.com/rs/zerolog"
 
 	readWriteModel "github.com/apache/plc4x/plc4go/protocols/bacnetip/readwrite/model"
+
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/comp"
+	. "github.com/apache/plc4x/plc4go/internal/bacnetip/bacgopes/pdu"
 )
 
 type WriteBroadcastDistributionTable struct {
@@ -116,7 +119,7 @@ func (w *WriteBroadcastDistributionTable) Decode(bvlpdu Arg) error {
 			switch bvlc := rm.(type) {
 			case readWriteModel.BVLCWriteBroadcastDistributionTable:
 				w.bvlciBDT = w.produceBvlciBDT(bvlc.GetTable())
-				w.rootMessage = rm
+				w.SetRootMessage(rm)
 			}
 		}
 	}
diff --git a/plc4go/internal/bacnetip/bacgopes/appservice__MultiplexClient_plc4xgen.go b/plc4go/internal/bacnetip/bacgopes/bvllservice/appservice__MultiplexClient_plc4xgen.go
similarity index 99%
rename from plc4go/internal/bacnetip/bacgopes/appservice__MultiplexClient_plc4xgen.go
rename to plc4go/internal/bacnetip/bacgopes/bvllservice/appservice__MultiplexClient_plc4xgen.go
index 0e5e62a3a4..6c56a576ad 100644
--- a/plc4go/internal/bacnetip/bacgopes/appservice__MultiplexClient_plc4xgen.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvllservice/appservice__MultiplexClient_plc4xgen.go
@@ -19,7 +19,7 @@
 
 // Code generated by "plc4xGenerator -type=_MultiplexClient -prefix=appservice_"; DO NOT EDIT.
 
-package bacgopes
+package bvllservice
 
 import (
 	"context"
diff --git a/plc4go/internal/bacnetip/bacgopes/bvllservice.go b/plc4go/internal/bacnetip/bacgopes/bvllservice/bvllservice.go
similarity index 97%
copy from plc4go/internal/bacnetip/bacgopes/bvllservice.go
copy to plc4go/internal/bacnetip/bacgopes/bvllservice/bvllservice.go
index b3432951fd..a9cc47411c 100644
--- a/plc4go/internal/bacnetip/bacgopes/bvllservice.go
+++ b/plc4go/internal/bacnetip/bacgopes/bvllservice/bvllservice.go
@@ -17,4 +17,4 @@
  * under the License.
  */
 
... 19825 lines suppressed ...