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/08/31 21:24:34 UTC

(plc4x) 21/35: feat(code-gen/go): simple field reader

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

commit 3fd7268516ff3672f1a38ff25000c97084cd5e0f
Author: Sebastian Rühl <sr...@apache.org>
AuthorDate: Sat Aug 31 13:45:42 2024 +0200

    feat(code-gen/go): simple field reader
---
 .../language/go/GoLanguageTemplateHelper.java      |  38 +-
 .../templates/go/complex-type-template.go.ftlh     |  83 ++-
 .../protocols/df1/ParserSerializerTestsuite.xml    |  38 +-
 .../model/CIPEncapsulationConnectionRequest.go     |   6 +
 .../model/CIPEncapsulationConnectionResponse.go    |   6 +
 .../readwrite/model/CIPEncapsulationPacket.go      |  43 +-
 .../readwrite/model/CIPEncapsulationReadRequest.go |  23 +-
 .../model/CIPEncapsulationReadResponse.go          |  23 +-
 .../readwrite/model/DF1CommandRequestMessage.go    |  22 +-
 ...mandResponseMessageProtectedTypedLogicalRead.go |   8 +-
 .../abeth/readwrite/model/DF1RequestCommand.go     |  13 +-
 .../abeth/readwrite/model/DF1RequestMessage.go     |  47 +-
 .../model/DF1RequestProtectedTypedLogicalRead.go   |  48 +-
 .../abeth/readwrite/model/DF1ResponseMessage.go    |  49 +-
 .../ads/discovery/readwrite/model/AdsDiscovery.go  |  60 +--
 .../discovery/readwrite/model/AdsDiscoveryBlock.go |  13 +-
 .../readwrite/model/AdsDiscoveryBlockAmsNetId.go   |  22 +-
 .../model/AdsDiscoveryBlockFingerprint.go          |   8 +-
 .../readwrite/model/AdsDiscoveryBlockHostName.go   |  22 +-
 .../readwrite/model/AdsDiscoveryBlockOsData.go     |   8 +-
 .../readwrite/model/AdsDiscoveryBlockPassword.go   |  22 +-
 .../readwrite/model/AdsDiscoveryBlockRouteName.go  |  22 +-
 .../readwrite/model/AdsDiscoveryBlockStatus.go     |  22 +-
 .../readwrite/model/AdsDiscoveryBlockUserName.go   |  22 +-
 .../readwrite/model/AdsDiscoveryBlockVersion.go    |   8 +-
 .../readwrite/model/AdsDiscoveryConstants.go       |   8 +-
 .../ads/discovery/readwrite/model/AmsNetId.go      |  56 +--
 .../ads/discovery/readwrite/model/AmsString.go     |  19 +-
 .../model/AdsAddDeviceNotificationRequest.go       |  64 +--
 .../model/AdsAddDeviceNotificationResponse.go      |  30 +-
 .../protocols/ads/readwrite/model/AdsConstants.go  |   8 +-
 .../ads/readwrite/model/AdsDataTypeArrayInfo.go    |  25 +-
 .../readwrite/model/AdsDataTypeTableChildEntry.go  | 122 ++---
 .../ads/readwrite/model/AdsDataTypeTableEntry.go   | 122 ++---
 .../model/AdsDeleteDeviceNotificationRequest.go    |  16 +-
 .../model/AdsDeleteDeviceNotificationResponse.go   |  22 +-
 .../model/AdsDeviceNotificationRequest.go          |  22 +-
 .../model/AdsDeviceNotificationResponse.go         |   6 +
 .../ads/readwrite/model/AdsInvalidRequest.go       |   6 +
 .../ads/readwrite/model/AdsInvalidResponse.go      |   6 +
 .../ads/readwrite/model/AdsMultiRequestItem.go     |  11 +
 .../ads/readwrite/model/AdsMultiRequestItemRead.go |  32 +-
 .../model/AdsMultiRequestItemReadWrite.go          |  40 +-
 .../readwrite/model/AdsMultiRequestItemWrite.go    |  32 +-
 .../ads/readwrite/model/AdsNotificationSample.go   |  24 +-
 .../readwrite/model/AdsReadDeviceInfoRequest.go    |   6 +
 .../readwrite/model/AdsReadDeviceInfoResponse.go   |  46 +-
 .../ads/readwrite/model/AdsReadRequest.go          |  32 +-
 .../ads/readwrite/model/AdsReadResponse.go         |  22 +-
 .../ads/readwrite/model/AdsReadStateRequest.go     |   6 +
 .../ads/readwrite/model/AdsReadStateResponse.go    |  38 +-
 .../ads/readwrite/model/AdsReadWriteRequest.go     |  40 +-
 .../ads/readwrite/model/AdsReadWriteResponse.go    |  22 +-
 .../ads/readwrite/model/AdsStampHeader.go          |  22 +-
 .../ads/readwrite/model/AdsSymbolTableEntry.go     | 190 +++----
 .../protocols/ads/readwrite/model/AdsTableSizes.go |  57 +--
 .../ads/readwrite/model/AdsWriteControlRequest.go  |  24 +-
 .../ads/readwrite/model/AdsWriteControlResponse.go |  22 +-
 .../ads/readwrite/model/AdsWriteRequest.go         |  24 +-
 .../ads/readwrite/model/AdsWriteResponse.go        |  22 +-
 plc4go/protocols/ads/readwrite/model/AmsNetId.go   |  56 +--
 plc4go/protocols/ads/readwrite/model/AmsPacket.go  |  77 ++-
 .../readwrite/model/AmsSerialAcknowledgeFrame.go   |  56 +--
 .../ads/readwrite/model/AmsSerialFrame.go          |  70 ++-
 .../ads/readwrite/model/AmsSerialResetFrame.go     |  56 +--
 .../protocols/ads/readwrite/model/AmsTCPPacket.go  |  24 +-
 .../protocols/ads/readwrite/model/ErrorResponse.go |   6 +
 plc4go/protocols/bacnetip/readwrite/model/APDU.go  |  13 +-
 .../bacnetip/readwrite/model/APDUAbort.go          |  38 +-
 .../bacnetip/readwrite/model/APDUComplexAck.go     |  46 +-
 .../readwrite/model/APDUConfirmedRequest.go        |  82 ++-
 .../bacnetip/readwrite/model/APDUError.go          |  44 +-
 .../bacnetip/readwrite/model/APDUReject.go         |  30 +-
 .../bacnetip/readwrite/model/APDUSegmentAck.go     |  48 +-
 .../bacnetip/readwrite/model/APDUSimpleAck.go      |  30 +-
 .../readwrite/model/APDUUnconfirmedRequest.go      |  22 +-
 .../bacnetip/readwrite/model/APDUUnknown.go        |  16 +-
 .../readwrite/model/BACnetAbortReasonTagged.go     |   6 +
 ...ACnetAccessAuthenticationFactorDisableTagged.go |  21 +-
 .../BACnetAccessCredentialDisableReasonTagged.go   |  21 +-
 .../model/BACnetAccessCredentialDisableTagged.go   |  21 +-
 .../readwrite/model/BACnetAccessEventTagged.go     |  21 +-
 .../model/BACnetAccessPassbackModeTagged.go        |  21 +-
 .../bacnetip/readwrite/model/BACnetAccessRule.go   |  64 +--
 .../BACnetAccessRuleLocationSpecifierTagged.go     |  21 +-
 .../BACnetAccessRuleTimeRangeSpecifierTagged.go    |  21 +-
 .../readwrite/model/BACnetAccessThreatLevel.go     |  22 +-
 .../readwrite/model/BACnetAccessUserTypeTagged.go  |  21 +-
 .../model/BACnetAccessZoneOccupancyStateTagged.go  |  21 +-
 .../readwrite/model/BACnetAccumulatorRecord.go     |  64 +--
 ...CnetAccumulatorRecordAccumulatorStatusTagged.go |  21 +-
 .../readwrite/model/BACnetActionCommand.go         | 102 +---
 .../bacnetip/readwrite/model/BACnetActionList.go   |  34 +-
 .../bacnetip/readwrite/model/BACnetActionTagged.go |  21 +-
 .../bacnetip/readwrite/model/BACnetAddress.go      |  36 +-
 .../readwrite/model/BACnetAddressBinding.go        |  36 +-
 .../readwrite/model/BACnetAddressEnclosed.go       |  50 +-
 .../readwrite/model/BACnetApplicationTag.go        |  27 +-
 .../model/BACnetApplicationTagBitString.go         |  22 +-
 .../readwrite/model/BACnetApplicationTagBoolean.go |  22 +-
 .../model/BACnetApplicationTagCharacterString.go   |  22 +-
 .../readwrite/model/BACnetApplicationTagDate.go    |  22 +-
 .../readwrite/model/BACnetApplicationTagDouble.go  |  22 +-
 .../model/BACnetApplicationTagEnumerated.go        |  22 +-
 .../readwrite/model/BACnetApplicationTagNull.go    |   6 +
 .../model/BACnetApplicationTagObjectIdentifier.go  |  22 +-
 .../model/BACnetApplicationTagOctetString.go       |  22 +-
 .../readwrite/model/BACnetApplicationTagReal.go    |  22 +-
 .../model/BACnetApplicationTagSignedInteger.go     |  22 +-
 .../readwrite/model/BACnetApplicationTagTime.go    |  22 +-
 .../model/BACnetApplicationTagUnsignedInteger.go   |  22 +-
 .../readwrite/model/BACnetAssignedAccessRights.go  |  36 +-
 .../readwrite/model/BACnetAssignedLandingCalls.go  |  22 +-
 .../BACnetAssignedLandingCallsLandingCallsList.go  |  34 +-
 ...netAssignedLandingCallsLandingCallsListEntry.go |  36 +-
 .../readwrite/model/BACnetAuthenticationFactor.go  |  50 +-
 .../model/BACnetAuthenticationFactorEnclosed.go    |  50 +-
 .../model/BACnetAuthenticationFactorFormat.go      |  36 +-
 .../model/BACnetAuthenticationFactorTypeTagged.go  |  21 +-
 .../readwrite/model/BACnetAuthenticationPolicy.go  |  50 +-
 .../model/BACnetAuthenticationPolicyList.go        |  34 +-
 .../model/BACnetAuthenticationPolicyListEntry.go   |  36 +-
 .../model/BACnetAuthenticationStatusTagged.go      |  21 +-
 .../model/BACnetAuthorizationExemptionTagged.go    |  21 +-
 .../model/BACnetAuthorizationModeTagged.go         |  21 +-
 .../bacnetip/readwrite/model/BACnetBDTEntry.go     |  28 +-
 .../readwrite/model/BACnetBackupStateTagged.go     |  21 +-
 .../model/BACnetBinaryLightingPVTagged.go          |  21 +-
 .../readwrite/model/BACnetBinaryPVTagged.go        |  21 +-
 .../model/BACnetCOVMultipleSubscription.go         |  78 +--
 ...bscriptionListOfCovSubscriptionSpecification.go |  34 +-
 ...ptionListOfCovSubscriptionSpecificationEntry.go |  36 +-
 ...riptionSpecificationEntryListOfCovReferences.go |  34 +-
 ...onSpecificationEntryListOfCovReferencesEntry.go |  42 +-
 .../readwrite/model/BACnetCOVSubscription.go       |  70 +--
 .../readwrite/model/BACnetCalendarEntry.go         |  11 +
 .../readwrite/model/BACnetCalendarEntryDate.go     |  22 +-
 .../model/BACnetCalendarEntryDateRange.go          |  22 +-
 .../readwrite/model/BACnetCalendarEntryEnclosed.go |  50 +-
 .../readwrite/model/BACnetCalendarEntryWeekNDay.go |  22 +-
 .../bacnetip/readwrite/model/BACnetChannelValue.go |  11 +
 .../readwrite/model/BACnetChannelValueBitString.go |  22 +-
 .../readwrite/model/BACnetChannelValueBoolean.go   |  22 +-
 .../model/BACnetChannelValueCharacterString.go     |  22 +-
 .../readwrite/model/BACnetChannelValueDate.go      |  22 +-
 .../readwrite/model/BACnetChannelValueDouble.go    |  22 +-
 .../model/BACnetChannelValueEnumerated.go          |  22 +-
 .../readwrite/model/BACnetChannelValueInteger.go   |  22 +-
 .../model/BACnetChannelValueLightingCommand.go     |  22 +-
 .../readwrite/model/BACnetChannelValueNull.go      |  22 +-
 .../model/BACnetChannelValueObjectidentifier.go    |  22 +-
 .../model/BACnetChannelValueOctetString.go         |  22 +-
 .../readwrite/model/BACnetChannelValueReal.go      |  22 +-
 .../readwrite/model/BACnetChannelValueTime.go      |  22 +-
 .../readwrite/model/BACnetChannelValueUnsigned.go  |  22 +-
 .../bacnetip/readwrite/model/BACnetClientCOV.go    |  11 +
 .../readwrite/model/BACnetClientCOVNone.go         |  22 +-
 .../readwrite/model/BACnetClientCOVObject.go       |  22 +-
 .../bacnetip/readwrite/model/BACnetClosingTag.go   |  22 +-
 .../model/BACnetConfirmedServiceRequest.go         |  13 +-
 ...ACnetConfirmedServiceRequestAcknowledgeAlarm.go |  92 +---
 .../BACnetConfirmedServiceRequestAddListElement.go |  50 +-
 .../BACnetConfirmedServiceRequestAtomicReadFile.go |  36 +-
 ...tConfirmedServiceRequestAtomicReadFileRecord.go |  36 +-
 ...tConfirmedServiceRequestAtomicReadFileStream.go |  36 +-
 ...edServiceRequestAtomicReadFileStreamOrRecord.go |  41 +-
 ...BACnetConfirmedServiceRequestAtomicWriteFile.go |  64 +--
 .../BACnetConfirmedServiceRequestAuthenticate.go   |   6 +
 ...firmedServiceRequestConfirmedCOVNotification.go |  78 +--
 ...rviceRequestConfirmedCOVNotificationMultiple.go |  70 +--
 ...rmedServiceRequestConfirmedEventNotification.go | 164 ++----
 ...firmedServiceRequestConfirmedPrivateTransfer.go |  42 +-
 ...tConfirmedServiceRequestConfirmedTextMessage.go |  56 +--
 ...rviceRequestConfirmedTextMessageMessageClass.go |  41 +-
 ...estConfirmedTextMessageMessageClassCharacter.go |  22 +-
 ...questConfirmedTextMessageMessageClassNumeric.go |  22 +-
 ...estConfirmedTextMessageMessagePriorityTagged.go |  21 +-
 .../BACnetConfirmedServiceRequestCreateObject.go   |  28 +-
 ...medServiceRequestCreateObjectObjectSpecifier.go |  50 +-
 .../BACnetConfirmedServiceRequestDeleteObject.go   |  22 +-
 ...rmedServiceRequestDeviceCommunicationControl.go |  36 +-
 ...eviceCommunicationControlEnableDisableTagged.go |  21 +-
 ...tConfirmedServiceRequestGetEnrollmentSummary.go |  60 +--
 ...EnrollmentSummaryAcknowledgementFilterTagged.go |  21 +-
 ...stGetEnrollmentSummaryEventStateFilterTagged.go |  21 +-
 ...iceRequestGetEnrollmentSummaryPriorityFilter.go |  64 +--
 ...etConfirmedServiceRequestGetEventInformation.go |  14 +-
 ...etConfirmedServiceRequestLifeSafetyOperation.go |  56 +--
 .../BACnetConfirmedServiceRequestReadProperty.go   |  42 +-
 ...nfirmedServiceRequestReadPropertyConditional.go |   6 +
 ...tConfirmedServiceRequestReadPropertyMultiple.go |   6 +
 .../BACnetConfirmedServiceRequestReadRange.go      |  42 +-
 .../BACnetConfirmedServiceRequestReadRangeRange.go |  41 +-
 ...firmedServiceRequestReadRangeRangeByPosition.go |  36 +-
 ...ServiceRequestReadRangeRangeBySequenceNumber.go |  36 +-
 ...tConfirmedServiceRequestReadRangeRangeByTime.go |  36 +-
 ...netConfirmedServiceRequestReinitializeDevice.go |  28 +-
 ...ializeDeviceReinitializedStateOfDeviceTagged.go |  21 +-
 ...CnetConfirmedServiceRequestRemoveListElement.go |  50 +-
 .../BACnetConfirmedServiceRequestRequestKey.go     |   6 +
 .../BACnetConfirmedServiceRequestSubscribeCOV.go   |  50 +-
 ...tConfirmedServiceRequestSubscribeCOVProperty.go |  72 +--
 ...edServiceRequestSubscribeCOVPropertyMultiple.go |  58 +--
 ...yMultipleListOfCovSubscriptionSpecifications.go |  48 +-
 ...tipleListOfCovSubscriptionSpecificationsList.go |  34 +-
 ...ListOfCovSubscriptionSpecificationsReference.go |  42 +-
 .../model/BACnetConfirmedServiceRequestUnknown.go  |   6 +
 .../model/BACnetConfirmedServiceRequestVTClose.go  |  14 +-
 .../model/BACnetConfirmedServiceRequestVTData.go   |  50 +-
 .../model/BACnetConfirmedServiceRequestVTOpen.go   |  36 +-
 .../BACnetConfirmedServiceRequestWriteProperty.go  |  64 +--
 ...ConfirmedServiceRequestWritePropertyMultiple.go |   6 +
 .../readwrite/model/BACnetConstructedData.go       |  41 +-
 .../model/BACnetConstructedDataAPDULength.go       |  22 +-
 .../BACnetConstructedDataAPDUSegmentTimeout.go     |  22 +-
 .../model/BACnetConstructedDataAPDUTimeout.go      |  22 +-
 .../model/BACnetConstructedDataAbsenteeLimit.go    |  22 +-
 .../model/BACnetConstructedDataAcceptedModes.go    |  14 +-
 .../BACnetConstructedDataAccessAlarmEvents.go      |  14 +-
 .../BACnetConstructedDataAccessCredentialAll.go    |   6 +
 .../BACnetConstructedDataAccessDoorAlarmValues.go  |  14 +-
 .../model/BACnetConstructedDataAccessDoorAll.go    |   6 +
 .../BACnetConstructedDataAccessDoorFaultValues.go  |  14 +-
 .../BACnetConstructedDataAccessDoorPresentValue.go |  22 +-
 ...etConstructedDataAccessDoorRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataAccessDoors.go      |  14 +-
 .../model/BACnetConstructedDataAccessEvent.go      |  22 +-
 ...nstructedDataAccessEventAuthenticationFactor.go |  22 +-
 .../BACnetConstructedDataAccessEventCredential.go  |  22 +-
 .../model/BACnetConstructedDataAccessEventTag.go   |  22 +-
 .../model/BACnetConstructedDataAccessEventTime.go  |  22 +-
 .../model/BACnetConstructedDataAccessPointAll.go   |   6 +
 .../model/BACnetConstructedDataAccessRightsAll.go  |   6 +
 ...BACnetConstructedDataAccessTransactionEvents.go |  14 +-
 .../model/BACnetConstructedDataAccessUserAll.go    |   6 +
 .../BACnetConstructedDataAccessZoneAdjustValue.go  |  22 +-
 .../BACnetConstructedDataAccessZoneAlarmValues.go  |  14 +-
 .../model/BACnetConstructedDataAccessZoneAll.go    |   6 +
 .../model/BACnetConstructedDataAccompaniment.go    |  22 +-
 .../BACnetConstructedDataAccompanimentTime.go      |  22 +-
 .../model/BACnetConstructedDataAccumulatorAll.go   |   6 +
 ...CnetConstructedDataAccumulatorFaultHighLimit.go |  22 +-
 ...ACnetConstructedDataAccumulatorFaultLowLimit.go |  22 +-
 .../BACnetConstructedDataAccumulatorHighLimit.go   |  22 +-
 .../BACnetConstructedDataAccumulatorLowLimit.go    |  22 +-
 ...BACnetConstructedDataAccumulatorMaxPresValue.go |  22 +-
 ...BACnetConstructedDataAccumulatorMinPresValue.go |  22 +-
 .../model/BACnetConstructedDataAckRequired.go      |  22 +-
 .../model/BACnetConstructedDataAckedTransitions.go |  22 +-
 .../readwrite/model/BACnetConstructedDataAction.go |  14 +-
 .../model/BACnetConstructedDataActionText.go       |  22 +-
 .../model/BACnetConstructedDataActivationTime.go   |  22 +-
 ...netConstructedDataActiveAuthenticationPolicy.go |  22 +-
 ...onstructedDataActiveCOVMultipleSubscriptions.go |   6 +
 .../BACnetConstructedDataActiveCOVSubscriptions.go |   6 +
 .../model/BACnetConstructedDataActiveText.go       |  22 +-
 .../model/BACnetConstructedDataActiveVTSessions.go |   6 +
 .../model/BACnetConstructedDataActualShedLevel.go  |  22 +-
 .../model/BACnetConstructedDataAdjustValue.go      |  22 +-
 .../model/BACnetConstructedDataAlarmValue.go       |  22 +-
 .../model/BACnetConstructedDataAlarmValues.go      |  22 +-
 .../BACnetConstructedDataAlertEnrollmentAll.go     |   6 +
 ...etConstructedDataAlertEnrollmentPresentValue.go |  22 +-
 .../model/BACnetConstructedDataAlignIntervals.go   |  22 +-
 .../BACnetConstructedDataAllWritesSuccessful.go    |  22 +-
 .../BACnetConstructedDataAllowGroupDelayInhibit.go |  22 +-
 .../model/BACnetConstructedDataAnalogInputAll.go   |   6 +
 ...CnetConstructedDataAnalogInputFaultHighLimit.go |  22 +-
 ...ACnetConstructedDataAnalogInputFaultLowLimit.go |  22 +-
 ...CnetConstructedDataAnalogInputInterfaceValue.go |  22 +-
 ...BACnetConstructedDataAnalogInputMaxPresValue.go |  22 +-
 ...BACnetConstructedDataAnalogInputPresentValue.go |  22 +-
 .../model/BACnetConstructedDataAnalogOutputAll.go  |   6 +
 ...netConstructedDataAnalogOutputInterfaceValue.go |  22 +-
 ...ACnetConstructedDataAnalogOutputMaxPresValue.go |  22 +-
 ...ACnetConstructedDataAnalogOutputPresentValue.go |  22 +-
 ...ConstructedDataAnalogOutputRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataAnalogValueAll.go   |   6 +
 ...CnetConstructedDataAnalogValueFaultHighLimit.go |  22 +-
 ...ACnetConstructedDataAnalogValueFaultLowLimit.go |  22 +-
 ...BACnetConstructedDataAnalogValueMaxPresValue.go |  22 +-
 ...BACnetConstructedDataAnalogValuePresentValue.go |  22 +-
 ...tConstructedDataAnalogValueRelinquishDefault.go |  22 +-
 ...netConstructedDataApplicationSoftwareVersion.go |  22 +-
 .../model/BACnetConstructedDataArchive.go          |  22 +-
 .../BACnetConstructedDataAssignedAccessRights.go   |  14 +-
 .../BACnetConstructedDataAssignedLandingCalls.go   |  14 +-
 .../model/BACnetConstructedDataAttemptedSamples.go |  22 +-
 .../BACnetConstructedDataAuthenticationFactors.go  |  14 +-
 ...ACnetConstructedDataAuthenticationPolicyList.go |  14 +-
 ...CnetConstructedDataAuthenticationPolicyNames.go |  22 +-
 .../BACnetConstructedDataAuthenticationStatus.go   |  22 +-
 ...BACnetConstructedDataAuthorizationExemptions.go |  14 +-
 .../BACnetConstructedDataAuthorizationMode.go      |  22 +-
 .../BACnetConstructedDataAutoSlaveDiscovery.go     |  22 +-
 .../model/BACnetConstructedDataAverageValue.go     |  22 +-
 .../model/BACnetConstructedDataAveragingAll.go     |   6 +
 .../BACnetConstructedDataBACnetIPGlobalAddress.go  |  22 +-
 .../model/BACnetConstructedDataBACnetIPMode.go     |  22 +-
 ...ACnetConstructedDataBACnetIPMulticastAddress.go |  22 +-
 .../BACnetConstructedDataBACnetIPNATTraversal.go   |  22 +-
 .../model/BACnetConstructedDataBACnetIPUDPPort.go  |  22 +-
 .../model/BACnetConstructedDataBACnetIPv6Mode.go   |  22 +-
 ...netConstructedDataBACnetIPv6MulticastAddress.go |  22 +-
 .../BACnetConstructedDataBACnetIPv6UDPPort.go      |  22 +-
 ...CnetConstructedDataBBMDAcceptFDRegistrations.go |  22 +-
 ...onstructedDataBBMDBroadcastDistributionTable.go |   6 +
 .../BACnetConstructedDataBBMDForeignDeviceTable.go |   6 +
 .../BACnetConstructedDataBackupAndRestoreState.go  |  22 +-
 .../BACnetConstructedDataBackupFailureTimeout.go   |  22 +-
 .../BACnetConstructedDataBackupPreparationTime.go  |  22 +-
 ...ACnetConstructedDataBaseDeviceSecurityPolicy.go |  22 +-
 .../model/BACnetConstructedDataBelongsTo.go        |  22 +-
 .../readwrite/model/BACnetConstructedDataBias.go   |  22 +-
 .../model/BACnetConstructedDataBinaryInputAll.go   |   6 +
 ...CnetConstructedDataBinaryInputInterfaceValue.go |  22 +-
 ...BACnetConstructedDataBinaryInputPresentValue.go |  22 +-
 ...BACnetConstructedDataBinaryLightingOutputAll.go |   6 +
 ...tructedDataBinaryLightingOutputFeedbackValue.go |  22 +-
 ...structedDataBinaryLightingOutputPresentValue.go |  22 +-
 ...tedDataBinaryLightingOutputRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataBinaryOutputAll.go  |   6 +
 ...CnetConstructedDataBinaryOutputFeedbackValue.go |  22 +-
 ...netConstructedDataBinaryOutputInterfaceValue.go |  22 +-
 ...ACnetConstructedDataBinaryOutputPresentValue.go |  22 +-
 ...ConstructedDataBinaryOutputRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataBinaryValueAll.go   |   6 +
 ...BACnetConstructedDataBinaryValuePresentValue.go |  22 +-
 ...tConstructedDataBinaryValueRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataBitMask.go          |  22 +-
 ...CnetConstructedDataBitStringValueAlarmValues.go |  22 +-
 ...netConstructedDataBitStringValuePresentValue.go |  22 +-
 ...nstructedDataBitStringValueRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataBitText.go          |  22 +-
 .../BACnetConstructedDataBitstringValueAll.go      |   6 +
 .../model/BACnetConstructedDataBlinkWarnEnable.go  |  22 +-
 .../model/BACnetConstructedDataBufferSize.go       |  22 +-
 .../model/BACnetConstructedDataCOVIncrement.go     |  22 +-
 .../model/BACnetConstructedDataCOVPeriod.go        |  22 +-
 ...CnetConstructedDataCOVResubscriptionInterval.go |  22 +-
 .../model/BACnetConstructedDataCOVUPeriod.go       |  22 +-
 .../model/BACnetConstructedDataCOVURecipients.go   |   6 +
 .../model/BACnetConstructedDataCalendarAll.go      |   6 +
 .../BACnetConstructedDataCalendarPresentValue.go   |  22 +-
 .../BACnetConstructedDataCarAssignedDirection.go   |  22 +-
 .../model/BACnetConstructedDataCarDoorCommand.go   |  22 +-
 .../model/BACnetConstructedDataCarDoorStatus.go    |  22 +-
 .../model/BACnetConstructedDataCarDoorText.go      |  22 +-
 .../model/BACnetConstructedDataCarDoorZone.go      |  22 +-
 .../model/BACnetConstructedDataCarDriveStatus.go   |  22 +-
 .../model/BACnetConstructedDataCarLoad.go          |  22 +-
 .../model/BACnetConstructedDataCarLoadUnits.go     |  22 +-
 .../model/BACnetConstructedDataCarMode.go          |  22 +-
 .../BACnetConstructedDataCarMovingDirection.go     |  22 +-
 .../model/BACnetConstructedDataCarPosition.go      |  22 +-
 .../BACnetConstructedDataChangeOfStateCount.go     |  22 +-
 .../BACnetConstructedDataChangeOfStateTime.go      |  22 +-
 .../model/BACnetConstructedDataChangesPending.go   |  22 +-
 .../model/BACnetConstructedDataChannelAll.go       |   6 +
 ...tedDataChannelListOfObjectPropertyReferences.go |  14 +-
 .../model/BACnetConstructedDataChannelNumber.go    |  22 +-
 .../BACnetConstructedDataChannelPresentValue.go    |  22 +-
 ...nstructedDataCharacterStringValueAlarmValues.go |  14 +-
 ...nstructedDataCharacterStringValueFaultValues.go |  14 +-
 ...structedDataCharacterStringValuePresentValue.go |  22 +-
 ...tedDataCharacterStringValueRelinquishDefault.go |  22 +-
 ...BACnetConstructedDataCharacterstringValueAll.go |   6 +
 .../BACnetConstructedDataClientCOVIncrement.go     |  22 +-
 .../model/BACnetConstructedDataCommand.go          |  22 +-
 .../model/BACnetConstructedDataCommandAction.go    |  14 +-
 .../model/BACnetConstructedDataCommandAll.go       |   6 +
 .../model/BACnetConstructedDataCommandTimeArray.go |  14 +-
 .../BACnetConstructedDataConfigurationFiles.go     |  22 +-
 .../model/BACnetConstructedDataControlGroups.go    |  22 +-
 ...etConstructedDataControlledVariableReference.go |  22 +-
 ...BACnetConstructedDataControlledVariableUnits.go |  22 +-
 ...BACnetConstructedDataControlledVariableValue.go |  22 +-
 .../readwrite/model/BACnetConstructedDataCount.go  |  22 +-
 .../BACnetConstructedDataCountBeforeChange.go      |  22 +-
 .../model/BACnetConstructedDataCountChangeTime.go  |  22 +-
 .../BACnetConstructedDataCredentialDataInputAll.go |   6 +
 ...nstructedDataCredentialDataInputPresentValue.go |  22 +-
 ...ConstructedDataCredentialDataInputUpdateTime.go |  22 +-
 .../BACnetConstructedDataCredentialDisable.go      |  22 +-
 .../model/BACnetConstructedDataCredentialStatus.go |  22 +-
 .../model/BACnetConstructedDataCredentials.go      |   6 +
 .../BACnetConstructedDataCredentialsInZone.go      |   6 +
 .../BACnetConstructedDataCurrentCommandPriority.go |  22 +-
 .../model/BACnetConstructedDataDatabaseRevision.go |  22 +-
 .../model/BACnetConstructedDataDateList.go         |   6 +
 ...tConstructedDataDatePatternValuePresentValue.go |  22 +-
 ...tructedDataDatePatternValueRelinquishDefault.go |  22 +-
 ...structedDataDateTimePatternValuePresentValue.go |  22 +-
 ...tedDataDateTimePatternValueRelinquishDefault.go |  22 +-
 ...CnetConstructedDataDateTimeValuePresentValue.go |  22 +-
 ...onstructedDataDateTimeValueRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataDateValueAll.go     |   6 +
 .../BACnetConstructedDataDateValuePresentValue.go  |  22 +-
 ...netConstructedDataDateValueRelinquishDefault.go |  22 +-
 .../BACnetConstructedDataDatepatternValueAll.go    |   6 +
 .../model/BACnetConstructedDataDatetimeValueAll.go |   6 +
 ...BACnetConstructedDataDatetimepatternValueAll.go |   6 +
 .../BACnetConstructedDataDaylightSavingsStatus.go  |  22 +-
 .../model/BACnetConstructedDataDaysRemaining.go    |  22 +-
 .../model/BACnetConstructedDataDeadband.go         |  22 +-
 .../model/BACnetConstructedDataDefaultFadeTime.go  |  22 +-
 .../model/BACnetConstructedDataDefaultRampRate.go  |  22 +-
 .../BACnetConstructedDataDefaultStepIncrement.go   |  22 +-
 ...onstructedDataDefaultSubordinateRelationship.go |  22 +-
 .../model/BACnetConstructedDataDefaultTimeout.go   |  22 +-
 ...BACnetConstructedDataDeployedProfileLocation.go |  22 +-
 .../BACnetConstructedDataDerivativeConstant.go     |  22 +-
 ...BACnetConstructedDataDerivativeConstantUnits.go |  22 +-
 .../model/BACnetConstructedDataDescription.go      |  22 +-
 .../BACnetConstructedDataDescriptionOfHalt.go      |  22 +-
 .../BACnetConstructedDataDeviceAddressBinding.go   |   6 +
 .../model/BACnetConstructedDataDeviceAll.go        |   6 +
 .../BACnetConstructedDataDeviceMaxInfoFrames.go    |  22 +-
 .../model/BACnetConstructedDataDeviceMaxMaster.go  |  22 +-
 .../model/BACnetConstructedDataDeviceType.go       |  22 +-
 .../model/BACnetConstructedDataDirectReading.go    |  22 +-
 ...BACnetConstructedDataDistributionKeyRevision.go |  22 +-
 .../model/BACnetConstructedDataDoNotHide.go        |  22 +-
 .../model/BACnetConstructedDataDoorAlarmState.go   |  22 +-
 .../BACnetConstructedDataDoorExtendedPulseTime.go  |  22 +-
 .../model/BACnetConstructedDataDoorMembers.go      |  14 +-
 .../BACnetConstructedDataDoorOpenTooLongTime.go    |  22 +-
 .../model/BACnetConstructedDataDoorPulseTime.go    |  22 +-
 .../model/BACnetConstructedDataDoorStatus.go       |  22 +-
 .../BACnetConstructedDataDoorUnlockDelayTime.go    |  22 +-
 .../model/BACnetConstructedDataDutyWindow.go       |  22 +-
 .../model/BACnetConstructedDataEffectivePeriod.go  |  22 +-
 .../model/BACnetConstructedDataEgressActive.go     |  22 +-
 .../model/BACnetConstructedDataEgressTime.go       |  22 +-
 .../BACnetConstructedDataElapsedActiveTime.go      |  22 +-
 .../model/BACnetConstructedDataElement.go          |  22 +-
 .../model/BACnetConstructedDataElevatorGroup.go    |  22 +-
 .../model/BACnetConstructedDataElevatorGroupAll.go |   6 +
 ...CnetConstructedDataElevatorGroupGroupMembers.go |  22 +-
 .../readwrite/model/BACnetConstructedDataEnable.go |  22 +-
 .../model/BACnetConstructedDataEnergyMeter.go      |  22 +-
 .../model/BACnetConstructedDataEnergyMeterRef.go   |  22 +-
 .../model/BACnetConstructedDataEntryPoints.go      |   6 +
 .../model/BACnetConstructedDataErrorLimit.go       |  22 +-
 .../model/BACnetConstructedDataEscalatorAll.go     |   6 +
 .../BACnetConstructedDataEscalatorFaultSignals.go  |  14 +-
 .../model/BACnetConstructedDataEscalatorMode.go    |  22 +-
 .../BACnetConstructedDataEventAlgorithmInhibit.go  |  22 +-
 ...ACnetConstructedDataEventAlgorithmInhibitRef.go |  22 +-
 .../BACnetConstructedDataEventDetectionEnable.go   |  22 +-
 .../model/BACnetConstructedDataEventEnable.go      |  22 +-
 .../BACnetConstructedDataEventEnrollmentAll.go     |   6 +
 .../model/BACnetConstructedDataEventLogAll.go      |   6 +
 .../BACnetConstructedDataEventLogLogBuffer.go      |   6 +
 .../BACnetConstructedDataEventMessageTexts.go      |  14 +-
 ...BACnetConstructedDataEventMessageTextsConfig.go |  14 +-
 .../model/BACnetConstructedDataEventParameters.go  |  22 +-
 .../model/BACnetConstructedDataEventState.go       |  22 +-
 .../model/BACnetConstructedDataEventTimeStamps.go  |  14 +-
 .../model/BACnetConstructedDataEventType.go        |  22 +-
 .../BACnetConstructedDataExceptionSchedule.go      |  14 +-
 .../model/BACnetConstructedDataExecutionDelay.go   |  22 +-
 .../model/BACnetConstructedDataExitPoints.go       |   6 +
 .../BACnetConstructedDataExpectedShedLevel.go      |  22 +-
 .../model/BACnetConstructedDataExpirationTime.go   |  22 +-
 .../BACnetConstructedDataExtendedTimeEnable.go     |  22 +-
 .../model/BACnetConstructedDataFDBBMDAddress.go    |  22 +-
 .../BACnetConstructedDataFDSubscriptionLifetime.go |  22 +-
 .../BACnetConstructedDataFailedAttemptEvents.go    |  14 +-
 .../model/BACnetConstructedDataFailedAttempts.go   |  22 +-
 .../BACnetConstructedDataFailedAttemptsTime.go     |  22 +-
 .../model/BACnetConstructedDataFaultHighLimit.go   |  22 +-
 .../model/BACnetConstructedDataFaultLowLimit.go    |  22 +-
 .../model/BACnetConstructedDataFaultParameters.go  |  22 +-
 .../model/BACnetConstructedDataFaultSignals.go     |  14 +-
 .../model/BACnetConstructedDataFaultType.go        |  22 +-
 .../model/BACnetConstructedDataFaultValues.go      |  22 +-
 .../model/BACnetConstructedDataFileAccessMethod.go |  22 +-
 .../model/BACnetConstructedDataFileAll.go          |   6 +
 .../model/BACnetConstructedDataFileRecordCount.go  |  22 +-
 .../model/BACnetConstructedDataFileSize.go         |  22 +-
 .../model/BACnetConstructedDataFileType.go         |  22 +-
 .../model/BACnetConstructedDataFirmwareRevision.go |  22 +-
 .../model/BACnetConstructedDataFloorText.go        |  22 +-
 .../model/BACnetConstructedDataFullDutyBaseline.go |  22 +-
 .../model/BACnetConstructedDataGlobalGroupAll.go   |   6 +
 ...BACnetConstructedDataGlobalGroupGroupMembers.go |  14 +-
 ...BACnetConstructedDataGlobalGroupPresentValue.go |  14 +-
 .../model/BACnetConstructedDataGlobalIdentifier.go |  22 +-
 .../model/BACnetConstructedDataGroupAll.go         |   6 +
 .../model/BACnetConstructedDataGroupID.go          |  22 +-
 .../model/BACnetConstructedDataGroupMemberNames.go |  22 +-
 .../model/BACnetConstructedDataGroupMembers.go     |  22 +-
 .../model/BACnetConstructedDataGroupMode.go        |  22 +-
 .../BACnetConstructedDataGroupPresentValue.go      |   6 +
 .../model/BACnetConstructedDataHighLimit.go        |  22 +-
 .../model/BACnetConstructedDataHigherDeck.go       |  22 +-
 .../model/BACnetConstructedDataIPAddress.go        |  22 +-
 .../model/BACnetConstructedDataIPDHCPEnable.go     |  22 +-
 .../model/BACnetConstructedDataIPDHCPLeaseTime.go  |  22 +-
 ...ACnetConstructedDataIPDHCPLeaseTimeRemaining.go |  22 +-
 .../model/BACnetConstructedDataIPDHCPServer.go     |  22 +-
 .../model/BACnetConstructedDataIPDNSServer.go      |  22 +-
 .../model/BACnetConstructedDataIPDefaultGateway.go |  22 +-
 .../model/BACnetConstructedDataIPSubnetMask.go     |  22 +-
 .../model/BACnetConstructedDataIPv6Address.go      |  22 +-
 ...ACnetConstructedDataIPv6AutoAddressingEnable.go |  22 +-
 .../BACnetConstructedDataIPv6DHCPLeaseTime.go      |  22 +-
 ...netConstructedDataIPv6DHCPLeaseTimeRemaining.go |  22 +-
 .../model/BACnetConstructedDataIPv6DHCPServer.go   |  22 +-
 .../model/BACnetConstructedDataIPv6DNSServer.go    |  22 +-
 .../BACnetConstructedDataIPv6DefaultGateway.go     |  22 +-
 .../model/BACnetConstructedDataIPv6PrefixLength.go |  22 +-
 .../model/BACnetConstructedDataIPv6ZoneIndex.go    |  22 +-
 .../model/BACnetConstructedDataInProcess.go        |  22 +-
 .../model/BACnetConstructedDataInProgress.go       |  22 +-
 .../model/BACnetConstructedDataInactiveText.go     |  22 +-
 .../model/BACnetConstructedDataInitialTimeout.go   |  22 +-
 .../model/BACnetConstructedDataInputReference.go   |  22 +-
 .../model/BACnetConstructedDataInstallationID.go   |  22 +-
 .../model/BACnetConstructedDataInstanceOf.go       |  22 +-
 .../BACnetConstructedDataInstantaneousPower.go     |  22 +-
 .../model/BACnetConstructedDataIntegerValueAll.go  |   6 +
 ...ACnetConstructedDataIntegerValueCOVIncrement.go |  22 +-
 .../BACnetConstructedDataIntegerValueDeadband.go   |  22 +-
 ...netConstructedDataIntegerValueFaultHighLimit.go |  22 +-
 ...CnetConstructedDataIntegerValueFaultLowLimit.go |  22 +-
 .../BACnetConstructedDataIntegerValueHighLimit.go  |  22 +-
 .../BACnetConstructedDataIntegerValueLowLimit.go   |  22 +-
 ...ACnetConstructedDataIntegerValueMaxPresValue.go |  22 +-
 ...ACnetConstructedDataIntegerValueMinPresValue.go |  22 +-
 ...ACnetConstructedDataIntegerValuePresentValue.go |  22 +-
 ...ConstructedDataIntegerValueRelinquishDefault.go |  22 +-
 .../BACnetConstructedDataIntegerValueResolution.go |  22 +-
 .../model/BACnetConstructedDataIntegralConstant.go |  22 +-
 .../BACnetConstructedDataIntegralConstantUnits.go  |  22 +-
 .../model/BACnetConstructedDataIntervalOffset.go   |  22 +-
 .../readwrite/model/BACnetConstructedDataIsUTC.go  |  22 +-
 .../model/BACnetConstructedDataKeySets.go          |  14 +-
 .../BACnetConstructedDataLandingCallControl.go     |  22 +-
 .../model/BACnetConstructedDataLandingCalls.go     |   6 +
 .../BACnetConstructedDataLandingDoorStatus.go      |  14 +-
 .../BACnetConstructedDataLargeAnalogValueAll.go    |   6 +
 ...tConstructedDataLargeAnalogValueCOVIncrement.go |  22 +-
 ...ACnetConstructedDataLargeAnalogValueDeadband.go |  22 +-
 ...onstructedDataLargeAnalogValueFaultHighLimit.go |  22 +-
 ...ConstructedDataLargeAnalogValueFaultLowLimit.go |  22 +-
 ...CnetConstructedDataLargeAnalogValueHighLimit.go |  22 +-
 ...ACnetConstructedDataLargeAnalogValueLowLimit.go |  22 +-
 ...tConstructedDataLargeAnalogValueMaxPresValue.go |  22 +-
 ...tConstructedDataLargeAnalogValueMinPresValue.go |  22 +-
 ...tConstructedDataLargeAnalogValuePresentValue.go |  22 +-
 ...tructedDataLargeAnalogValueRelinquishDefault.go |  22 +-
 ...netConstructedDataLargeAnalogValueResolution.go |  22 +-
 .../model/BACnetConstructedDataLastAccessEvent.go  |  22 +-
 .../model/BACnetConstructedDataLastAccessPoint.go  |  22 +-
 .../model/BACnetConstructedDataLastCommandTime.go  |  22 +-
 .../BACnetConstructedDataLastCredentialAdded.go    |  22 +-
 ...BACnetConstructedDataLastCredentialAddedTime.go |  22 +-
 .../BACnetConstructedDataLastCredentialRemoved.go  |  22 +-
 ...CnetConstructedDataLastCredentialRemovedTime.go |  22 +-
 .../model/BACnetConstructedDataLastKeyServer.go    |  22 +-
 .../model/BACnetConstructedDataLastNotifyRecord.go |  22 +-
 .../model/BACnetConstructedDataLastPriority.go     |  22 +-
 .../BACnetConstructedDataLastRestartReason.go      |  22 +-
 .../model/BACnetConstructedDataLastRestoreTime.go  |  22 +-
 .../model/BACnetConstructedDataLastStateChange.go  |  22 +-
 .../model/BACnetConstructedDataLastUseTime.go      |  22 +-
 .../BACnetConstructedDataLifeSafetyAlarmValues.go  |  14 +-
 ...netConstructedDataLifeSafetyPointAlarmValues.go |  14 +-
 .../BACnetConstructedDataLifeSafetyPointAll.go     |   6 +
 ...netConstructedDataLifeSafetyPointFaultValues.go |  14 +-
 ...etConstructedDataLifeSafetyPointPresentValue.go |  22 +-
 ...CnetConstructedDataLifeSafetyZoneAlarmValues.go |  14 +-
 .../BACnetConstructedDataLifeSafetyZoneAll.go      |   6 +
 ...CnetConstructedDataLifeSafetyZoneFaultValues.go |  14 +-
 ...tructedDataLifeSafetyZoneMaintenanceRequired.go |  22 +-
 ...netConstructedDataLifeSafetyZonePresentValue.go |  22 +-
 .../model/BACnetConstructedDataLiftAll.go          |   6 +
 .../model/BACnetConstructedDataLiftFaultSignals.go |  14 +-
 .../model/BACnetConstructedDataLightingCommand.go  |  22 +-
 ...onstructedDataLightingCommandDefaultPriority.go |  22 +-
 .../BACnetConstructedDataLightingOutputAll.go      |   6 +
 ...etConstructedDataLightingOutputFeedbackValue.go |  22 +-
 ...netConstructedDataLightingOutputPresentValue.go |  22 +-
 ...nstructedDataLightingOutputRelinquishDefault.go |  22 +-
 ...etConstructedDataLightingOutputTrackingValue.go |  22 +-
 .../model/BACnetConstructedDataLimitEnable.go      |  22 +-
 ...BACnetConstructedDataLimitMonitoringInterval.go |  22 +-
 .../model/BACnetConstructedDataLinkSpeed.go        |  22 +-
 .../BACnetConstructedDataLinkSpeedAutonegotiate.go |  22 +-
 .../model/BACnetConstructedDataLinkSpeeds.go       |  22 +-
 .../BACnetConstructedDataListOfGroupMembers.go     |   6 +
 ...onstructedDataListOfObjectPropertyReferences.go |   6 +
 .../model/BACnetConstructedDataLoadControlAll.go   |   6 +
 ...BACnetConstructedDataLoadControlPresentValue.go |  22 +-
 .../model/BACnetConstructedDataLocalDate.go        |  22 +-
 .../BACnetConstructedDataLocalForwardingOnly.go    |  22 +-
 .../model/BACnetConstructedDataLocalTime.go        |  22 +-
 .../model/BACnetConstructedDataLocation.go         |  22 +-
 .../model/BACnetConstructedDataLockStatus.go       |  22 +-
 .../model/BACnetConstructedDataLockout.go          |  22 +-
 .../BACnetConstructedDataLockoutRelinquishTime.go  |  22 +-
 .../model/BACnetConstructedDataLogBuffer.go        |  14 +-
 ...BACnetConstructedDataLogDeviceObjectProperty.go |  22 +-
 .../model/BACnetConstructedDataLogInterval.go      |  22 +-
 .../model/BACnetConstructedDataLoggingObject.go    |  22 +-
 .../model/BACnetConstructedDataLoggingRecord.go    |  22 +-
 .../model/BACnetConstructedDataLoggingType.go      |  22 +-
 .../model/BACnetConstructedDataLoopAction.go       |  22 +-
 .../model/BACnetConstructedDataLoopAll.go          |   6 +
 .../model/BACnetConstructedDataLoopPresentValue.go |  22 +-
 .../model/BACnetConstructedDataLowDiffLimit.go     |  22 +-
 .../model/BACnetConstructedDataLowLimit.go         |  22 +-
 .../model/BACnetConstructedDataLowerDeck.go        |  22 +-
 .../model/BACnetConstructedDataMACAddress.go       |  22 +-
 .../model/BACnetConstructedDataMachineRoomID.go    |  22 +-
 .../BACnetConstructedDataMaintenanceRequired.go    |  22 +-
 .../model/BACnetConstructedDataMakingCarCall.go    |  22 +-
 ...tConstructedDataManipulatedVariableReference.go |  22 +-
 ...CnetConstructedDataManualSlaveAddressBinding.go |   6 +
 .../BACnetConstructedDataMaskedAlarmValues.go      |  14 +-
 .../BACnetConstructedDataMaxAPDULengthAccepted.go  |  22 +-
 .../model/BACnetConstructedDataMaxActualValue.go   |  22 +-
 .../BACnetConstructedDataMaxFailedAttempts.go      |  22 +-
 .../model/BACnetConstructedDataMaxInfoFrames.go    |  22 +-
 .../model/BACnetConstructedDataMaxMaster.go        |  22 +-
 .../model/BACnetConstructedDataMaxPresValue.go     |  22 +-
 .../BACnetConstructedDataMaxSegmentsAccepted.go    |  22 +-
 .../model/BACnetConstructedDataMaximumOutput.go    |  22 +-
 .../model/BACnetConstructedDataMaximumValue.go     |  22 +-
 .../BACnetConstructedDataMaximumValueTimestamp.go  |  22 +-
 .../model/BACnetConstructedDataMemberOf.go         |   6 +
 .../BACnetConstructedDataMemberStatusFlags.go      |  22 +-
 .../model/BACnetConstructedDataMembers.go          |   6 +
 .../model/BACnetConstructedDataMinActualValue.go   |  22 +-
 .../model/BACnetConstructedDataMinPresValue.go     |  22 +-
 .../model/BACnetConstructedDataMinimumOffTime.go   |  22 +-
 .../model/BACnetConstructedDataMinimumOnTime.go    |  22 +-
 .../model/BACnetConstructedDataMinimumOutput.go    |  22 +-
 .../model/BACnetConstructedDataMinimumValue.go     |  22 +-
 .../BACnetConstructedDataMinimumValueTimestamp.go  |  22 +-
 .../readwrite/model/BACnetConstructedDataMode.go   |  22 +-
 .../model/BACnetConstructedDataModelName.go        |  22 +-
 .../model/BACnetConstructedDataModificationDate.go |  22 +-
 ...netConstructedDataMultiStateInputAlarmValues.go |  14 +-
 .../BACnetConstructedDataMultiStateInputAll.go     |   6 +
 ...netConstructedDataMultiStateInputFaultValues.go |  14 +-
 ...ConstructedDataMultiStateInputInterfaceValue.go |  22 +-
 .../BACnetConstructedDataMultiStateOutputAll.go    |   6 +
 ...ConstructedDataMultiStateOutputFeedbackValue.go |  22 +-
 ...onstructedDataMultiStateOutputInterfaceValue.go |  22 +-
 ...tructedDataMultiStateOutputRelinquishDefault.go |  22 +-
 ...netConstructedDataMultiStateValueAlarmValues.go |  14 +-
 .../BACnetConstructedDataMultiStateValueAll.go     |   6 +
 ...netConstructedDataMultiStateValueFaultValues.go |  14 +-
 ...structedDataMultiStateValueRelinquishDefault.go |  22 +-
 .../model/BACnetConstructedDataMusterPoint.go      |  22 +-
 .../BACnetConstructedDataNegativeAccessRules.go    |  14 +-
 ...ConstructedDataNetworkAccessSecurityPolicies.go |  14 +-
 .../BACnetConstructedDataNetworkInterfaceName.go   |  22 +-
 .../model/BACnetConstructedDataNetworkNumber.go    |  22 +-
 .../BACnetConstructedDataNetworkNumberQuality.go   |  22 +-
 .../model/BACnetConstructedDataNetworkPortAll.go   |   6 +
 ...ACnetConstructedDataNetworkPortMaxInfoFrames.go |  22 +-
 .../BACnetConstructedDataNetworkPortMaxMaster.go   |  22 +-
 .../BACnetConstructedDataNetworkSecurityAll.go     |   6 +
 .../model/BACnetConstructedDataNetworkType.go      |  22 +-
 .../BACnetConstructedDataNextStoppingFloor.go      |  22 +-
 .../model/BACnetConstructedDataNodeSubtype.go      |  22 +-
 .../model/BACnetConstructedDataNodeType.go         |  22 +-
 .../BACnetConstructedDataNotificationClass.go      |  22 +-
 .../BACnetConstructedDataNotificationClassAll.go   |   6 +
 ...ACnetConstructedDataNotificationForwarderAll.go |   6 +
 .../BACnetConstructedDataNotificationThreshold.go  |  22 +-
 .../model/BACnetConstructedDataNotifyType.go       |  22 +-
 .../BACnetConstructedDataNumberOfAPDURetries.go    |  22 +-
 ...onstructedDataNumberOfAuthenticationPolicies.go |  22 +-
 .../model/BACnetConstructedDataNumberOfStates.go   |  22 +-
 .../model/BACnetConstructedDataObjectIdentifier.go |  22 +-
 .../model/BACnetConstructedDataObjectList.go       |  22 +-
 .../model/BACnetConstructedDataObjectName.go       |  22 +-
 ...BACnetConstructedDataObjectPropertyReference.go |  22 +-
 .../model/BACnetConstructedDataObjectType.go       |  22 +-
 .../model/BACnetConstructedDataOccupancyCount.go   |  22 +-
 .../BACnetConstructedDataOccupancyCountAdjust.go   |  22 +-
 .../BACnetConstructedDataOccupancyCountEnable.go   |  22 +-
 .../BACnetConstructedDataOccupancyLowerLimit.go    |  22 +-
 ...etConstructedDataOccupancyLowerLimitEnforced.go |  22 +-
 .../model/BACnetConstructedDataOccupancyState.go   |  22 +-
 .../BACnetConstructedDataOccupancyUpperLimit.go    |  22 +-
 ...etConstructedDataOccupancyUpperLimitEnforced.go |  22 +-
 ...tConstructedDataOctetStringValuePresentValue.go |  22 +-
 ...tructedDataOctetStringValueRelinquishDefault.go |  22 +-
 .../BACnetConstructedDataOctetstringValueAll.go    |   6 +
 .../BACnetConstructedDataOperationDirection.go     |  22 +-
 .../BACnetConstructedDataOperationExpected.go      |  22 +-
 .../model/BACnetConstructedDataOptional.go         |   6 +
 .../model/BACnetConstructedDataOutOfService.go     |  22 +-
 .../model/BACnetConstructedDataOutputUnits.go      |  22 +-
 .../BACnetConstructedDataPacketReorderTime.go      |  22 +-
 .../model/BACnetConstructedDataPassbackMode.go     |  22 +-
 .../model/BACnetConstructedDataPassbackTimeout.go  |  22 +-
 .../model/BACnetConstructedDataPassengerAlarm.go   |  22 +-
 .../model/BACnetConstructedDataPolarity.go         |  22 +-
 .../model/BACnetConstructedDataPortFilter.go       |  14 +-
 .../BACnetConstructedDataPositiveAccessRules.go    |  14 +-
 ...BACnetConstructedDataPositiveIntegerValueAll.go |   6 +
 ...structedDataPositiveIntegerValueCOVIncrement.go |  22 +-
 ...tConstructedDataPositiveIntegerValueDeadband.go |  22 +-
 ...ructedDataPositiveIntegerValueFaultHighLimit.go |  22 +-
 ...tructedDataPositiveIntegerValueFaultLowLimit.go |  22 +-
 ...ConstructedDataPositiveIntegerValueHighLimit.go |  22 +-
 ...tConstructedDataPositiveIntegerValueLowLimit.go |  22 +-
 ...structedDataPositiveIntegerValueMaxPresValue.go |  22 +-
 ...structedDataPositiveIntegerValueMinPresValue.go |  22 +-
 ...tedDataPositiveIntegerValueRelinquishDefault.go |  22 +-
 ...onstructedDataPositiveIntegerValueResolution.go |  22 +-
 .../readwrite/model/BACnetConstructedDataPower.go  |  22 +-
 .../model/BACnetConstructedDataPowerMode.go        |  22 +-
 .../model/BACnetConstructedDataPrescale.go         |  22 +-
 .../model/BACnetConstructedDataPresentValue.go     |  22 +-
 .../model/BACnetConstructedDataPriority.go         |  22 +-
 .../model/BACnetConstructedDataPriorityArray.go    |  22 +-
 .../BACnetConstructedDataPriorityForWriting.go     |  22 +-
 .../BACnetConstructedDataProcessIdentifier.go      |  22 +-
 ...BACnetConstructedDataProcessIdentifierFilter.go |  22 +-
 .../model/BACnetConstructedDataProfileLocation.go  |  22 +-
 .../model/BACnetConstructedDataProfileName.go      |  22 +-
 .../model/BACnetConstructedDataProgramAll.go       |   6 +
 .../model/BACnetConstructedDataProgramChange.go    |  22 +-
 .../model/BACnetConstructedDataProgramLocation.go  |  22 +-
 .../model/BACnetConstructedDataProgramState.go     |  22 +-
 .../model/BACnetConstructedDataPropertyList.go     |  22 +-
 .../BACnetConstructedDataProportionalConstant.go   |  22 +-
 ...CnetConstructedDataProportionalConstantUnits.go |  22 +-
 .../model/BACnetConstructedDataProtocolLevel.go    |  22 +-
 ...tConstructedDataProtocolObjectTypesSupported.go |  22 +-
 .../model/BACnetConstructedDataProtocolRevision.go |  22 +-
 ...CnetConstructedDataProtocolServicesSupported.go |  22 +-
 .../model/BACnetConstructedDataProtocolVersion.go  |  22 +-
 ...CnetConstructedDataPulseConverterAdjustValue.go |  22 +-
 .../BACnetConstructedDataPulseConverterAll.go      |   6 +
 ...netConstructedDataPulseConverterPresentValue.go |  22 +-
 .../model/BACnetConstructedDataPulseRate.go        |  22 +-
 .../model/BACnetConstructedDataReadOnly.go         |  22 +-
 .../model/BACnetConstructedDataReasonForDisable.go |  14 +-
 .../model/BACnetConstructedDataReasonForHalt.go    |  22 +-
 .../model/BACnetConstructedDataRecipientList.go    |   6 +
 .../model/BACnetConstructedDataRecordCount.go      |  22 +-
 ...ACnetConstructedDataRecordsSinceNotification.go |  22 +-
 .../model/BACnetConstructedDataReferencePort.go    |  22 +-
 .../BACnetConstructedDataRegisteredCarCall.go      |  14 +-
 .../model/BACnetConstructedDataReliability.go      |  22 +-
 ...tConstructedDataReliabilityEvaluationInhibit.go |  22 +-
 .../BACnetConstructedDataRelinquishDefault.go      |  22 +-
 .../model/BACnetConstructedDataRepresents.go       |  22 +-
 .../BACnetConstructedDataRequestedShedLevel.go     |  22 +-
 ...BACnetConstructedDataRequestedUpdateInterval.go |  22 +-
 .../model/BACnetConstructedDataRequired.go         |   6 +
 .../model/BACnetConstructedDataResolution.go       |  22 +-
 ...ConstructedDataRestartNotificationRecipients.go |   6 +
 .../BACnetConstructedDataRestoreCompletionTime.go  |  22 +-
 .../BACnetConstructedDataRestorePreparationTime.go |  22 +-
 .../model/BACnetConstructedDataRoutingTable.go     |   6 +
 .../readwrite/model/BACnetConstructedDataScale.go  |  22 +-
 .../model/BACnetConstructedDataScaleFactor.go      |  22 +-
 .../model/BACnetConstructedDataScheduleAll.go      |   6 +
 .../model/BACnetConstructedDataScheduleDefault.go  |  22 +-
 .../BACnetConstructedDataSchedulePresentValue.go   |  22 +-
 .../model/BACnetConstructedDataSecuredStatus.go    |  22 +-
 .../BACnetConstructedDataSecurityPDUTimeout.go     |  22 +-
 .../BACnetConstructedDataSecurityTimeWindow.go     |  22 +-
 .../BACnetConstructedDataSegmentationSupported.go  |  22 +-
 .../model/BACnetConstructedDataSerialNumber.go     |  22 +-
 .../model/BACnetConstructedDataSetpoint.go         |  22 +-
 .../BACnetConstructedDataSetpointReference.go      |  22 +-
 .../model/BACnetConstructedDataSetting.go          |  22 +-
 .../model/BACnetConstructedDataShedDuration.go     |  22 +-
 .../BACnetConstructedDataShedLevelDescriptions.go  |  22 +-
 .../model/BACnetConstructedDataShedLevels.go       |  22 +-
 .../model/BACnetConstructedDataSilenced.go         |  22 +-
 .../BACnetConstructedDataSlaveAddressBinding.go    |   6 +
 .../model/BACnetConstructedDataSlaveProxyEnable.go |  22 +-
 .../model/BACnetConstructedDataStartTime.go        |  22 +-
 .../BACnetConstructedDataStateChangeValues.go      |  22 +-
 .../model/BACnetConstructedDataStateDescription.go |  22 +-
 .../model/BACnetConstructedDataStateText.go        |  22 +-
 .../model/BACnetConstructedDataStatusFlags.go      |  22 +-
 .../model/BACnetConstructedDataStopTime.go         |  22 +-
 .../model/BACnetConstructedDataStopWhenFull.go     |  22 +-
 .../model/BACnetConstructedDataStrikeCount.go      |  22 +-
 .../BACnetConstructedDataStructuredObjectList.go   |  22 +-
 .../BACnetConstructedDataStructuredViewAll.go      |   6 +
 .../BACnetConstructedDataSubordinateAnnotations.go |  22 +-
 .../model/BACnetConstructedDataSubordinateList.go  |  14 +-
 .../BACnetConstructedDataSubordinateNodeTypes.go   |  22 +-
 ...ACnetConstructedDataSubordinateRelationships.go |  22 +-
 .../model/BACnetConstructedDataSubordinateTags.go  |  22 +-
 .../BACnetConstructedDataSubscribedRecipients.go   |   6 +
 .../BACnetConstructedDataSupportedFormatClasses.go |  22 +-
 .../model/BACnetConstructedDataSupportedFormats.go |  14 +-
 ...etConstructedDataSupportedSecurityAlgorithms.go |  14 +-
 .../model/BACnetConstructedDataSystemStatus.go     |  22 +-
 .../readwrite/model/BACnetConstructedDataTags.go   |  14 +-
 .../model/BACnetConstructedDataThreatAuthority.go  |  22 +-
 .../model/BACnetConstructedDataThreatLevel.go      |  22 +-
 .../model/BACnetConstructedDataTimeDelay.go        |  22 +-
 .../model/BACnetConstructedDataTimeDelayNormal.go  |  22 +-
 .../BACnetConstructedDataTimeOfActiveTimeReset.go  |  22 +-
 .../BACnetConstructedDataTimeOfDeviceRestart.go    |  22 +-
 .../BACnetConstructedDataTimeOfStateCountReset.go  |  22 +-
 .../BACnetConstructedDataTimeOfStrikeCountReset.go |  22 +-
 ...tConstructedDataTimePatternValuePresentValue.go |  22 +-
 ...tructedDataTimePatternValueRelinquishDefault.go |  22 +-
 ...etConstructedDataTimeSynchronizationInterval.go |  22 +-
 ...ConstructedDataTimeSynchronizationRecipients.go |   6 +
 .../model/BACnetConstructedDataTimeValueAll.go     |   6 +
 .../BACnetConstructedDataTimeValuePresentValue.go  |  22 +-
 ...netConstructedDataTimeValueRelinquishDefault.go |  22 +-
 .../BACnetConstructedDataTimepatternValueAll.go    |   6 +
 .../model/BACnetConstructedDataTimerAlarmValues.go |  14 +-
 .../model/BACnetConstructedDataTimerAll.go         |   6 +
 .../BACnetConstructedDataTimerMaxPresValue.go      |  22 +-
 .../BACnetConstructedDataTimerMinPresValue.go      |  22 +-
 .../model/BACnetConstructedDataTimerResolution.go  |  22 +-
 .../model/BACnetConstructedDataTimerRunning.go     |  22 +-
 .../model/BACnetConstructedDataTimerState.go       |  22 +-
 .../model/BACnetConstructedDataTotalRecordCount.go |  22 +-
 .../model/BACnetConstructedDataTraceFlag.go        |  22 +-
 .../model/BACnetConstructedDataTrackingValue.go    |  22 +-
 ...tConstructedDataTransactionNotificationClass.go |  22 +-
 .../model/BACnetConstructedDataTransition.go       |  22 +-
 .../model/BACnetConstructedDataTrendLogAll.go      |   6 +
 .../BACnetConstructedDataTrendLogLogBuffer.go      |   6 +
 ...nstructedDataTrendLogLogDeviceObjectProperty.go |  22 +-
 .../BACnetConstructedDataTrendLogMultipleAll.go    |   6 +
 ...CnetConstructedDataTrendLogMultipleLogBuffer.go |   6 +
 ...dDataTrendLogMultipleLogDeviceObjectProperty.go |  14 +-
 .../model/BACnetConstructedDataTrigger.go          |  22 +-
 .../model/BACnetConstructedDataUTCOffset.go        |  22 +-
 ...structedDataUTCTimeSynchronizationRecipients.go |   6 +
 .../readwrite/model/BACnetConstructedDataUnits.go  |  22 +-
 .../model/BACnetConstructedDataUnspecified.go      |  22 +-
 .../model/BACnetConstructedDataUpdateInterval.go   |  22 +-
 .../BACnetConstructedDataUpdateKeySetTimeout.go    |  22 +-
 .../model/BACnetConstructedDataUpdateTime.go       |  22 +-
 .../BACnetConstructedDataUserExternalIdentifier.go |  22 +-
 ...ACnetConstructedDataUserInformationReference.go |  22 +-
 .../model/BACnetConstructedDataUserName.go         |  22 +-
 .../model/BACnetConstructedDataUserType.go         |  22 +-
 .../model/BACnetConstructedDataUsesRemaining.go    |  22 +-
 .../BACnetConstructedDataVTClassesSupported.go     |  14 +-
 .../model/BACnetConstructedDataValidSamples.go     |  22 +-
 .../BACnetConstructedDataValueBeforeChange.go      |  22 +-
 .../model/BACnetConstructedDataValueChangeTime.go  |  22 +-
 .../model/BACnetConstructedDataValueSet.go         |  22 +-
 .../model/BACnetConstructedDataValueSource.go      |  22 +-
 .../model/BACnetConstructedDataValueSourceArray.go |  14 +-
 .../model/BACnetConstructedDataVarianceValue.go    |  22 +-
 .../model/BACnetConstructedDataVendorIdentifier.go |  22 +-
 .../model/BACnetConstructedDataVendorName.go       |  22 +-
 .../model/BACnetConstructedDataVerificationTime.go |  22 +-
 .../BACnetConstructedDataVirtualMACAddressTable.go |   6 +
 .../model/BACnetConstructedDataWeeklySchedule.go   |  14 +-
 .../model/BACnetConstructedDataWindowInterval.go   |  22 +-
 .../model/BACnetConstructedDataWindowSamples.go    |  22 +-
 .../model/BACnetConstructedDataWriteStatus.go      |  22 +-
 .../model/BACnetConstructedDataZoneFrom.go         |  22 +-
 .../model/BACnetConstructedDataZoneMembers.go      |   6 +
 .../readwrite/model/BACnetConstructedDataZoneTo.go |  22 +-
 .../bacnetip/readwrite/model/BACnetContextTag.go   |  27 +-
 .../readwrite/model/BACnetContextTagBitString.go   |  22 +-
 .../readwrite/model/BACnetContextTagBoolean.go     |  30 +-
 .../model/BACnetContextTagCharacterString.go       |  22 +-
 .../readwrite/model/BACnetContextTagDate.go        |  22 +-
 .../readwrite/model/BACnetContextTagDouble.go      |  22 +-
 .../readwrite/model/BACnetContextTagEnumerated.go  |  22 +-
 .../readwrite/model/BACnetContextTagNull.go        |   6 +
 .../model/BACnetContextTagObjectIdentifier.go      |  22 +-
 .../readwrite/model/BACnetContextTagOctetString.go |  22 +-
 .../readwrite/model/BACnetContextTagReal.go        |  22 +-
 .../model/BACnetContextTagSignedInteger.go         |  22 +-
 .../readwrite/model/BACnetContextTagTime.go        |  22 +-
 .../readwrite/model/BACnetContextTagUnknown.go     |   6 +
 .../model/BACnetContextTagUnsignedInteger.go       |  22 +-
 .../model/BACnetCredentialAuthenticationFactor.go  |  36 +-
 .../readwrite/model/BACnetDailySchedule.go         |  34 +-
 .../bacnetip/readwrite/model/BACnetDateRange.go    |  36 +-
 .../readwrite/model/BACnetDateRangeEnclosed.go     |  50 +-
 .../bacnetip/readwrite/model/BACnetDateTime.go     |  36 +-
 .../readwrite/model/BACnetDateTimeEnclosed.go      |  50 +-
 .../readwrite/model/BACnetDaysOfWeekTagged.go      |  36 +-
 .../bacnetip/readwrite/model/BACnetDestination.go  | 106 ++--
 .../model/BACnetDeviceObjectPropertyReference.go   |  50 +-
 .../BACnetDeviceObjectPropertyReferenceEnclosed.go |  50 +-
 .../readwrite/model/BACnetDeviceObjectReference.go |  28 +-
 .../model/BACnetDeviceObjectReferenceEnclosed.go   |  50 +-
 .../readwrite/model/BACnetDeviceStatusTagged.go    |  21 +-
 .../readwrite/model/BACnetDoorAlarmStateTagged.go  |  21 +-
 .../model/BACnetDoorSecuredStatusTagged.go         |  21 +-
 .../readwrite/model/BACnetDoorStatusTagged.go      |  21 +-
 .../readwrite/model/BACnetDoorValueTagged.go       |  21 +-
 .../model/BACnetEngineeringUnitsTagged.go          |  21 +-
 .../bacnetip/readwrite/model/BACnetError.go        |  11 +
 .../bacnetip/readwrite/model/BACnetErrorGeneral.go |  22 +-
 .../readwrite/model/BACnetEscalatorFaultTagged.go  |  21 +-
 .../readwrite/model/BACnetEscalatorModeTagged.go   |  21 +-
 .../BACnetEscalatorOperationDirectionTagged.go     |  21 +-
 .../readwrite/model/BACnetEventLogRecord.go        |  36 +-
 .../model/BACnetEventLogRecordLogDatum.go          |  41 +-
 .../model/BACnetEventLogRecordLogDatumLogStatus.go |  22 +-
 .../BACnetEventLogRecordLogDatumNotification.go    |  50 +-
 .../BACnetEventLogRecordLogDatumTimeChange.go      |  22 +-
 .../model/BACnetEventNotificationSubscription.go   |  56 +--
 .../readwrite/model/BACnetEventParameter.go        |  11 +
 .../model/BACnetEventParameterAccessEvent.go       |  64 +--
 ...tEventParameterAccessEventListOfAccessEvents.go |  34 +-
 .../model/BACnetEventParameterBufferReady.go       |  64 +--
 .../model/BACnetEventParameterChangeOfBitstring.go |  78 +--
 ...ameterChangeOfBitstringListOfBitstringValues.go |  42 +-
 .../BACnetEventParameterChangeOfCharacterString.go |  64 +--
 ...eterChangeOfCharacterStringListOfAlarmValues.go |  42 +-
 .../BACnetEventParameterChangeOfDiscreteValue.go   |  50 +-
 .../BACnetEventParameterChangeOfLifeSavety.go      |  92 +---
 ...ParameterChangeOfLifeSavetyListOfAlarmValues.go |  42 +-
 ...hangeOfLifeSavetyListOfLifeSavetyAlarmValues.go |  42 +-
 .../model/BACnetEventParameterChangeOfState.go     |  64 +--
 ...ACnetEventParameterChangeOfStateListOfValues.go |  34 +-
 .../BACnetEventParameterChangeOfStatusFlags.go     |  64 +--
 .../model/BACnetEventParameterChangeOfTimer.go     |  78 +--
 .../BACnetEventParameterChangeOfTimerAlarmValue.go |  42 +-
 .../model/BACnetEventParameterChangeOfValue.go     |  64 +--
 ...BACnetEventParameterChangeOfValueCivCriteria.go |  41 +-
 ...ventParameterChangeOfValueCivCriteriaBitmask.go |  22 +-
 ...fValueCivCriteriaReferencedPropertyIncrement.go |  22 +-
 .../model/BACnetEventParameterCommandFailure.go    |  64 +--
 .../model/BACnetEventParameterDoubleOutOfRange.go  |  92 +---
 .../model/BACnetEventParameterExtended.go          |  78 +--
 .../BACnetEventParameterExtendedParameters.go      | 146 +-----
 .../model/BACnetEventParameterFloatingLimit.go     | 106 ++--
 .../readwrite/model/BACnetEventParameterNone.go    |  22 +-
 .../model/BACnetEventParameterOutOfRange.go        |  92 +---
 .../model/BACnetEventParameterSignedOutOfRange.go  |  92 +---
 .../BACnetEventParameterUnsignedOutOfRange.go      |  92 +---
 .../model/BACnetEventParameterUnsignedRange.go     |  78 +--
 .../readwrite/model/BACnetEventPriorities.go       |  78 +--
 .../readwrite/model/BACnetEventStateTagged.go      |  21 +-
 .../readwrite/model/BACnetEventSummariesList.go    |  34 +-
 .../bacnetip/readwrite/model/BACnetEventSummary.go | 106 ++--
 .../readwrite/model/BACnetEventTimestamps.go       |  50 +-
 .../model/BACnetEventTimestampsEnclosed.go         |  50 +-
 .../model/BACnetEventTransitionBitsTagged.go       |  36 +-
 .../readwrite/model/BACnetEventTypeTagged.go       |  21 +-
 .../readwrite/model/BACnetFaultParameter.go        |  11 +
 .../BACnetFaultParameterFaultCharacterString.go    |  50 +-
 ...rameterFaultCharacterStringListOfFaultValues.go |  42 +-
 .../model/BACnetFaultParameterFaultExtended.go     |  78 +--
 .../BACnetFaultParameterFaultExtendedParameters.go |  34 +-
 ...etFaultParameterFaultExtendedParametersEntry.go |  11 +
 ...rameterFaultExtendedParametersEntryBitString.go |  22 +-
 ...ParameterFaultExtendedParametersEntryBoolean.go |  22 +-
 ...rFaultExtendedParametersEntryCharacterString.go |  22 +-
 ...ultParameterFaultExtendedParametersEntryDate.go |  22 +-
 ...tParameterFaultExtendedParametersEntryDouble.go |  22 +-
 ...ameterFaultExtendedParametersEntryEnumerated.go |  22 +-
 ...ParameterFaultExtendedParametersEntryInteger.go |  22 +-
 ...ultParameterFaultExtendedParametersEntryNull.go |  22 +-
 ...FaultExtendedParametersEntryObjectidentifier.go |  22 +-
 ...meterFaultExtendedParametersEntryOctetString.go |  22 +-
 ...ultParameterFaultExtendedParametersEntryReal.go |  22 +-
 ...rameterFaultExtendedParametersEntryReference.go |  22 +-
 ...ultParameterFaultExtendedParametersEntryTime.go |  22 +-
 ...arameterFaultExtendedParametersEntryUnsigned.go |  22 +-
 .../model/BACnetFaultParameterFaultLifeSafety.go   |  64 +--
 ...ultParameterFaultLifeSafetyListOfFaultValues.go |  42 +-
 .../model/BACnetFaultParameterFaultListed.go       |  50 +-
 .../model/BACnetFaultParameterFaultOutOfRange.go   |  64 +--
 ...tFaultParameterFaultOutOfRangeMaxNormalValue.go |  41 +-
 ...ParameterFaultOutOfRangeMaxNormalValueDouble.go |  22 +-
 ...arameterFaultOutOfRangeMaxNormalValueInteger.go |  22 +-
 ...ltParameterFaultOutOfRangeMaxNormalValueReal.go |  22 +-
 ...rameterFaultOutOfRangeMaxNormalValueUnsigned.go |  22 +-
 ...tFaultParameterFaultOutOfRangeMinNormalValue.go |  41 +-
 ...ParameterFaultOutOfRangeMinNormalValueDouble.go |  22 +-
 ...arameterFaultOutOfRangeMinNormalValueInteger.go |  22 +-
 ...ltParameterFaultOutOfRangeMinNormalValueReal.go |  22 +-
 ...rameterFaultOutOfRangeMinNormalValueUnsigned.go |  22 +-
 .../model/BACnetFaultParameterFaultState.go        |  50 +-
 ...netFaultParameterFaultStateListOfFaultValues.go |  34 +-
 .../model/BACnetFaultParameterFaultStatusFlags.go  |  50 +-
 .../readwrite/model/BACnetFaultParameterNone.go    |  22 +-
 .../readwrite/model/BACnetFaultTypeTagged.go       |  21 +-
 .../model/BACnetFileAccessMethodTagged.go          |  21 +-
 .../readwrite/model/BACnetGroupChannelValue.go     |  42 +-
 .../readwrite/model/BACnetGroupChannelValueList.go |  34 +-
 .../bacnetip/readwrite/model/BACnetHostAddress.go  |  11 +
 .../readwrite/model/BACnetHostAddressEnclosed.go   |  50 +-
 .../readwrite/model/BACnetHostAddressIpAddress.go  |  22 +-
 .../readwrite/model/BACnetHostAddressName.go       |  22 +-
 .../readwrite/model/BACnetHostAddressNull.go       |  22 +-
 .../bacnetip/readwrite/model/BACnetHostNPort.go    |  36 +-
 .../readwrite/model/BACnetHostNPortEnclosed.go     |  50 +-
 .../bacnetip/readwrite/model/BACnetIPModeTagged.go |  21 +-
 .../readwrite/model/BACnetKeyIdentifier.go         |  36 +-
 .../readwrite/model/BACnetLandingCallStatus.go     |  42 +-
 .../model/BACnetLandingCallStatusCommand.go        |  11 +
 .../BACnetLandingCallStatusCommandDestination.go   |  22 +-
 .../BACnetLandingCallStatusCommandDirection.go     |  22 +-
 .../readwrite/model/BACnetLandingDoorStatus.go     |  22 +-
 .../BACnetLandingDoorStatusLandingDoorsList.go     |  34 +-
 ...BACnetLandingDoorStatusLandingDoorsListEntry.go |  36 +-
 .../readwrite/model/BACnetLifeSafetyModeTagged.go  |  21 +-
 .../model/BACnetLifeSafetyOperationTagged.go       |  21 +-
 .../readwrite/model/BACnetLifeSafetyStateTagged.go |  21 +-
 .../readwrite/model/BACnetLiftCarCallList.go       |  22 +-
 .../model/BACnetLiftCarCallListFloorList.go        |  42 +-
 .../model/BACnetLiftCarDirectionTagged.go          |  21 +-
 .../model/BACnetLiftCarDoorCommandTagged.go        |  21 +-
 .../model/BACnetLiftCarDriveStatusTagged.go        |  21 +-
 .../readwrite/model/BACnetLiftCarModeTagged.go     |  21 +-
 .../readwrite/model/BACnetLiftFaultTagged.go       |  21 +-
 .../readwrite/model/BACnetLiftGroupModeTagged.go   |  21 +-
 .../readwrite/model/BACnetLightingCommand.go       |  60 +--
 .../model/BACnetLightingCommandEnclosed.go         |  50 +-
 .../model/BACnetLightingInProgressTagged.go        |  21 +-
 .../model/BACnetLightingOperationTagged.go         |  21 +-
 .../model/BACnetLightingTransitionTagged.go        |  21 +-
 .../readwrite/model/BACnetLimitEnableTagged.go     |  36 +-
 .../readwrite/model/BACnetLockStatusTagged.go      |  21 +-
 .../bacnetip/readwrite/model/BACnetLogData.go      |  41 +-
 .../readwrite/model/BACnetLogDataLogData.go        |  34 +-
 .../readwrite/model/BACnetLogDataLogDataEntry.go   |  11 +
 .../model/BACnetLogDataLogDataEntryAnyValue.go     |  14 +-
 .../BACnetLogDataLogDataEntryBitStringValue.go     |  22 +-
 .../model/BACnetLogDataLogDataEntryBooleanValue.go |  22 +-
 .../BACnetLogDataLogDataEntryEnumeratedValue.go    |  22 +-
 .../model/BACnetLogDataLogDataEntryFailure.go      |  22 +-
 .../model/BACnetLogDataLogDataEntryIntegerValue.go |  22 +-
 .../model/BACnetLogDataLogDataEntryNullValue.go    |  22 +-
 .../model/BACnetLogDataLogDataEntryRealValue.go    |  22 +-
 .../BACnetLogDataLogDataEntryUnsignedValue.go      |  22 +-
 .../model/BACnetLogDataLogDataTimeChange.go        |  22 +-
 .../readwrite/model/BACnetLogDataLogStatus.go      |  22 +-
 .../readwrite/model/BACnetLogMultipleRecord.go     |  36 +-
 .../bacnetip/readwrite/model/BACnetLogRecord.go    |  42 +-
 .../readwrite/model/BACnetLogRecordLogDatum.go     |  41 +-
 .../model/BACnetLogRecordLogDatumAnyValue.go       |  14 +-
 .../model/BACnetLogRecordLogDatumBitStringValue.go |  22 +-
 .../model/BACnetLogRecordLogDatumBooleanValue.go   |  22 +-
 .../BACnetLogRecordLogDatumEnumeratedValue.go      |  22 +-
 .../model/BACnetLogRecordLogDatumFailure.go        |  22 +-
 .../model/BACnetLogRecordLogDatumIntegerValue.go   |  22 +-
 .../model/BACnetLogRecordLogDatumLogStatus.go      |  22 +-
 .../model/BACnetLogRecordLogDatumNullValue.go      |  22 +-
 .../model/BACnetLogRecordLogDatumRealValue.go      |  22 +-
 .../model/BACnetLogRecordLogDatumTimeChange.go     |  22 +-
 .../model/BACnetLogRecordLogDatumUnsignedValue.go  |  22 +-
 .../readwrite/model/BACnetLogStatusTagged.go       |  36 +-
 .../readwrite/model/BACnetLoggingTypeTagged.go     |  21 +-
 .../readwrite/model/BACnetMaintenanceTagged.go     |  21 +-
 .../bacnetip/readwrite/model/BACnetNameValue.go    |  28 +-
 .../readwrite/model/BACnetNameValueCollection.go   |  34 +-
 .../model/BACnetNetworkNumberQualityTagged.go      |  21 +-
 .../model/BACnetNetworkPortCommandTagged.go        |  21 +-
 .../readwrite/model/BACnetNetworkSecurityPolicy.go |  36 +-
 .../readwrite/model/BACnetNetworkTypeTagged.go     |  21 +-
 .../readwrite/model/BACnetNodeTypeTagged.go        |  21 +-
 .../model/BACnetNotificationParameters.go          |  41 +-
 .../BACnetNotificationParametersAccessEvent.go     | 112 ++---
 .../BACnetNotificationParametersBufferReady.go     |  78 +--
 ...ACnetNotificationParametersChangeOfBitString.go |  64 +--
 ...otificationParametersChangeOfCharacterString.go |  78 +--
 ...tNotificationParametersChangeOfDiscreteValue.go |  64 +--
 ...ationParametersChangeOfDiscreteValueNewValue.go |  41 +-
 ...rametersChangeOfDiscreteValueNewValueBoolean.go |  22 +-
 ...ChangeOfDiscreteValueNewValueCharacterString.go |  22 +-
 ...ametersChangeOfDiscreteValueNewValueDatetime.go |  22 +-
 ...etersChangeOfDiscreteValueNewValueEnumerated.go |  22 +-
 ...rametersChangeOfDiscreteValueNewValueInteger.go |  22 +-
 ...hangeOfDiscreteValueNewValueObjectidentifier.go |  22 +-
 ...metersChangeOfDiscreteValueNewValueOctetDate.go |  22 +-
 ...tersChangeOfDiscreteValueNewValueOctetString.go |  22 +-
 ...metersChangeOfDiscreteValueNewValueOctetTime.go |  22 +-
 ...ametersChangeOfDiscreteValueNewValueUnsigned.go |  22 +-
 ...CnetNotificationParametersChangeOfLifeSafety.go |  92 +---
 ...netNotificationParametersChangeOfReliability.go |  78 +--
 .../BACnetNotificationParametersChangeOfState.go   |  64 +--
 ...netNotificationParametersChangeOfStatusFlags.go |  64 +--
 .../BACnetNotificationParametersChangeOfTimer.go   | 100 +---
 .../BACnetNotificationParametersChangeOfValue.go   |  64 +--
 ...tNotificationParametersChangeOfValueNewValue.go |  41 +-
 ...onParametersChangeOfValueNewValueChangedBits.go |  22 +-
 ...nParametersChangeOfValueNewValueChangedValue.go |  22 +-
 .../BACnetNotificationParametersCommandFailure.go  |  78 +--
 ...BACnetNotificationParametersComplexEventType.go |  22 +-
 ...BACnetNotificationParametersDoubleOutOfRange.go |  92 +---
 .../model/BACnetNotificationParametersExtended.go  |  78 +--
 ...CnetNotificationParametersExtendedParameters.go | 146 +-----
 .../BACnetNotificationParametersFloatingLimit.go   |  92 +---
 .../BACnetNotificationParametersOutOfRange.go      |  92 +---
 ...BACnetNotificationParametersSignedOutOfRange.go |  92 +---
 ...CnetNotificationParametersUnsignedOutOfRange.go |  92 +---
 .../BACnetNotificationParametersUnsignedRange.go   |  78 +--
 .../readwrite/model/BACnetNotifyTypeTagged.go      |  21 +-
 .../model/BACnetObjectPropertyReference.go         |  42 +-
 .../model/BACnetObjectPropertyReferenceEnclosed.go |  50 +-
 .../readwrite/model/BACnetObjectTypeTagged.go      |  21 +-
 .../model/BACnetObjectTypesSupportedTagged.go      |  36 +-
 .../bacnetip/readwrite/model/BACnetOpeningTag.go   |  22 +-
 .../readwrite/model/BACnetOptionalBinaryPV.go      |  11 +
 .../readwrite/model/BACnetOptionalBinaryPVNull.go  |  22 +-
 .../readwrite/model/BACnetOptionalBinaryPVValue.go |  22 +-
 .../model/BACnetOptionalCharacterString.go         |  11 +
 .../model/BACnetOptionalCharacterStringNull.go     |  22 +-
 .../model/BACnetOptionalCharacterStringValue.go    |  22 +-
 .../bacnetip/readwrite/model/BACnetOptionalREAL.go |  11 +
 .../readwrite/model/BACnetOptionalREALNull.go      |  22 +-
 .../readwrite/model/BACnetOptionalREALValue.go     |  22 +-
 .../readwrite/model/BACnetOptionalUnsigned.go      |  11 +
 .../readwrite/model/BACnetOptionalUnsignedNull.go  |  22 +-
 .../readwrite/model/BACnetOptionalUnsignedValue.go |  22 +-
 .../readwrite/model/BACnetPolarityTagged.go        |  21 +-
 .../readwrite/model/BACnetPortPermission.go        |  28 +-
 .../bacnetip/readwrite/model/BACnetPrescale.go     |  36 +-
 .../readwrite/model/BACnetPriorityArray.go         |  22 +-
 .../readwrite/model/BACnetPriorityValue.go         |  11 +
 .../model/BACnetPriorityValueBitString.go          |  22 +-
 .../readwrite/model/BACnetPriorityValueBoolean.go  |  22 +-
 .../model/BACnetPriorityValueCharacterString.go    |  22 +-
 .../model/BACnetPriorityValueConstructedValue.go   |  22 +-
 .../readwrite/model/BACnetPriorityValueDate.go     |  22 +-
 .../readwrite/model/BACnetPriorityValueDateTime.go |  22 +-
 .../readwrite/model/BACnetPriorityValueDouble.go   |  22 +-
 .../model/BACnetPriorityValueEnumerated.go         |  22 +-
 .../readwrite/model/BACnetPriorityValueInteger.go  |  22 +-
 .../readwrite/model/BACnetPriorityValueNull.go     |  22 +-
 .../model/BACnetPriorityValueObjectidentifier.go   |  22 +-
 .../model/BACnetPriorityValueOctetString.go        |  22 +-
 .../readwrite/model/BACnetPriorityValueReal.go     |  22 +-
 .../readwrite/model/BACnetPriorityValueTime.go     |  22 +-
 .../readwrite/model/BACnetPriorityValueUnsigned.go |  22 +-
 .../readwrite/model/BACnetProcessIdSelection.go    |  11 +
 .../model/BACnetProcessIdSelectionNull.go          |  22 +-
 .../model/BACnetProcessIdSelectionValue.go         |  22 +-
 .../readwrite/model/BACnetProgramErrorTagged.go    |  21 +-
 .../readwrite/model/BACnetProgramRequestTagged.go  |  21 +-
 .../readwrite/model/BACnetProgramStateTagged.go    |  21 +-
 .../readwrite/model/BACnetPropertyAccessResult.go  |  64 +--
 .../BACnetPropertyAccessResultAccessResult.go      |  11 +
 ...yAccessResultAccessResultPropertyAccessError.go |  22 +-
 ...ropertyAccessResultAccessResultPropertyValue.go |  22 +-
 .../model/BACnetPropertyIdentifierTagged.go        |  21 +-
 .../readwrite/model/BACnetPropertyReference.go     |  28 +-
 .../model/BACnetPropertyReferenceEnclosed.go       |  50 +-
 .../model/BACnetPropertyStateActionUnknown.go      |  22 +-
 .../readwrite/model/BACnetPropertyStates.go        |  11 +
 .../BACnetPropertyStatesAccessCredentialDisable.go |  22 +-
 ...tPropertyStatesAccessCredentialDisableReason.go |  22 +-
 .../model/BACnetPropertyStatesAccessEvent.go       |  22 +-
 .../readwrite/model/BACnetPropertyStatesAction.go  |  22 +-
 .../BACnetPropertyStatesAuthenticationStatus.go    |  22 +-
 .../model/BACnetPropertyStatesBackupState.go       |  22 +-
 .../model/BACnetPropertyStatesBacnetIpMode.go      |  22 +-
 .../BACnetPropertyStatesBinaryLightningValue.go    |  22 +-
 .../model/BACnetPropertyStatesBinaryValue.go       |  22 +-
 .../readwrite/model/BACnetPropertyStatesBoolean.go |  22 +-
 .../model/BACnetPropertyStatesDoorAlarmState.go    |  22 +-
 .../model/BACnetPropertyStatesDoorSecuredStatus.go |  22 +-
 .../model/BACnetPropertyStatesDoorStatus.go        |  22 +-
 .../model/BACnetPropertyStatesDoorValue.go         |  22 +-
 .../model/BACnetPropertyStatesEnclosed.go          |  50 +-
 .../model/BACnetPropertyStatesEscalatorFault.go    |  22 +-
 .../model/BACnetPropertyStatesEscalatorMode.go     |  22 +-
 ...netPropertyStatesEscalatorOperationDirection.go |  22 +-
 .../model/BACnetPropertyStatesEventType.go         |  22 +-
 .../model/BACnetPropertyStatesExtendedValue.go     |  22 +-
 .../model/BACnetPropertyStatesFileAccessMethod.go  |  22 +-
 .../model/BACnetPropertyStatesIntegerValue.go      |  22 +-
 .../model/BACnetPropertyStatesLifeSafetyMode.go    |  22 +-
 .../BACnetPropertyStatesLifeSafetyOperations.go    |  22 +-
 .../model/BACnetPropertyStatesLifeSafetyState.go   |  22 +-
 .../model/BACnetPropertyStatesLiftCarDirection.go  |  22 +-
 .../BACnetPropertyStatesLiftCarDoorCommand.go      |  22 +-
 .../BACnetPropertyStatesLiftCarDriveStatus.go      |  22 +-
 .../model/BACnetPropertyStatesLiftCarMode.go       |  22 +-
 .../model/BACnetPropertyStatesLiftFault.go         |  22 +-
 .../model/BACnetPropertyStatesLiftGroupMode.go     |  22 +-
 .../BACnetPropertyStatesLightningInProgress.go     |  22 +-
 .../BACnetPropertyStatesLightningOperation.go      |  22 +-
 .../BACnetPropertyStatesLightningTransition.go     |  22 +-
 .../model/BACnetPropertyStatesLockStatus.go        |  22 +-
 .../model/BACnetPropertyStatesMaintenance.go       |  22 +-
 .../BACnetPropertyStatesNetworkNumberQuality.go    |  22 +-
 .../BACnetPropertyStatesNetworkPortCommand.go      |  22 +-
 .../model/BACnetPropertyStatesNetworkType.go       |  22 +-
 .../model/BACnetPropertyStatesNodeType.go          |  22 +-
 .../model/BACnetPropertyStatesNotifyType.go        |  22 +-
 .../model/BACnetPropertyStatesPolarity.go          |  22 +-
 .../model/BACnetPropertyStatesProgramChange.go     |  22 +-
 .../model/BACnetPropertyStatesProtocolLevel.go     |  22 +-
 .../model/BACnetPropertyStatesReasonForHalt.go     |  22 +-
 .../model/BACnetPropertyStatesReliability.go       |  22 +-
 .../model/BACnetPropertyStatesRestartReason.go     |  22 +-
 .../model/BACnetPropertyStatesSecurityLevel.go     |  22 +-
 .../model/BACnetPropertyStatesShedState.go         |  22 +-
 .../model/BACnetPropertyStatesSilencedState.go     |  22 +-
 .../readwrite/model/BACnetPropertyStatesState.go   |  22 +-
 .../model/BACnetPropertyStatesSystemStatus.go      |  22 +-
 .../model/BACnetPropertyStatesTimerState.go        |  22 +-
 .../model/BACnetPropertyStatesTimerTransition.go   |  22 +-
 .../readwrite/model/BACnetPropertyStatesUnits.go   |  22 +-
 .../model/BACnetPropertyStatesWriteStatus.go       |  22 +-
 .../model/BACnetPropertyStatesZoneOccupanyState.go |  22 +-
 .../readwrite/model/BACnetPropertyValue.go         |  44 +-
 .../readwrite/model/BACnetPropertyValues.go        |  42 +-
 .../model/BACnetPropertyWriteDefinition.go         |  44 +-
 .../readwrite/model/BACnetProtocolLevelTagged.go   |  21 +-
 .../readwrite/model/BACnetReadAccessProperty.go    |  36 +-
 .../model/BACnetReadAccessPropertyReadResult.go    |  22 +-
 .../readwrite/model/BACnetReadAccessResult.go      |  28 +-
 .../model/BACnetReadAccessResultListOfResults.go   |  42 +-
 .../model/BACnetReadAccessSpecification.go         |  48 +-
 .../bacnetip/readwrite/model/BACnetRecipient.go    |  11 +
 .../readwrite/model/BACnetRecipientAddress.go      |  22 +-
 .../readwrite/model/BACnetRecipientDevice.go       |  22 +-
 .../readwrite/model/BACnetRecipientEnclosed.go     |  50 +-
 .../readwrite/model/BACnetRecipientProcess.go      |  28 +-
 .../model/BACnetRecipientProcessEnclosed.go        |  50 +-
 .../readwrite/model/BACnetRejectReasonTagged.go    |   6 +
 .../readwrite/model/BACnetRelationshipTagged.go    |  21 +-
 .../readwrite/model/BACnetReliabilityTagged.go     |  21 +-
 .../readwrite/model/BACnetRestartReasonTagged.go   |  21 +-
 .../readwrite/model/BACnetResultFlagsTagged.go     |  36 +-
 .../bacnetip/readwrite/model/BACnetRouterEntry.go  |  56 +--
 .../model/BACnetRouterEntryStatusTagged.go         |  21 +-
 .../bacnetip/readwrite/model/BACnetScale.go        |  11 +
 .../readwrite/model/BACnetScaleFloatScale.go       |  22 +-
 .../readwrite/model/BACnetScaleIntegerScale.go     |  22 +-
 .../readwrite/model/BACnetSecurityKeySet.go        |  64 +--
 .../readwrite/model/BACnetSecurityKeySetKeyIds.go  |  34 +-
 .../readwrite/model/BACnetSecurityLevelTagged.go   |  21 +-
 .../readwrite/model/BACnetSecurityPolicyTagged.go  |  21 +-
 .../readwrite/model/BACnetSegmentationTagged.go    |  21 +-
 .../bacnetip/readwrite/model/BACnetServiceAck.go   |  13 +-
 .../model/BACnetServiceAckAtomicReadFile.go        |  36 +-
 .../model/BACnetServiceAckAtomicReadFileRecord.go  |  42 +-
 .../model/BACnetServiceAckAtomicReadFileStream.go  |  36 +-
 ...BACnetServiceAckAtomicReadFileStreamOrRecord.go |  41 +-
 .../model/BACnetServiceAckAtomicWriteFile.go       |  22 +-
 .../model/BACnetServiceAckAuthenticate.go          |   6 +
 .../BACnetServiceAckConfirmedPrivateTransfer.go    |  42 +-
 .../model/BACnetServiceAckCreateObject.go          |  22 +-
 .../model/BACnetServiceAckGetAlarmSummary.go       |  50 +-
 .../model/BACnetServiceAckGetEnrollmentSummary.go  |  70 +--
 .../model/BACnetServiceAckGetEventInformation.go   |  36 +-
 .../model/BACnetServiceAckReadProperty.go          |  50 +-
 .../BACnetServiceAckReadPropertyConditional.go     |   6 +
 .../model/BACnetServiceAckReadPropertyMultiple.go  |   6 +
 .../readwrite/model/BACnetServiceAckReadRange.go   |  86 +---
 .../readwrite/model/BACnetServiceAckRequestKey.go  |   6 +
 .../readwrite/model/BACnetServiceAckVTData.go      |  50 +-
 .../readwrite/model/BACnetServiceAckVTOpen.go      |  22 +-
 .../model/BACnetServicesSupportedTagged.go         |  36 +-
 .../readwrite/model/BACnetSetpointReference.go     |  14 +-
 .../bacnetip/readwrite/model/BACnetShedLevel.go    |  11 +
 .../readwrite/model/BACnetShedLevelAmount.go       |  22 +-
 .../readwrite/model/BACnetShedLevelLevel.go        |  22 +-
 .../readwrite/model/BACnetShedLevelPercent.go      |  22 +-
 .../readwrite/model/BACnetShedStateTagged.go       |  21 +-
 .../readwrite/model/BACnetSilencedStateTagged.go   |  21 +-
 .../bacnetip/readwrite/model/BACnetSpecialEvent.go |  50 +-
 .../model/BACnetSpecialEventListOfTimeValues.go    |  34 +-
 .../readwrite/model/BACnetSpecialEventPeriod.go    |  11 +
 .../model/BACnetSpecialEventPeriodCalendarEntry.go |  22 +-
 .../BACnetSpecialEventPeriodCalendarReference.go   |  22 +-
 .../readwrite/model/BACnetStatusFlagsTagged.go     |  36 +-
 .../bacnetip/readwrite/model/BACnetTagHeader.go    |  44 +-
 .../readwrite/model/BACnetTagPayloadBitString.go   |  14 +-
 .../readwrite/model/BACnetTagPayloadBoolean.go     |   6 +
 .../model/BACnetTagPayloadCharacterString.go       |  31 +-
 .../readwrite/model/BACnetTagPayloadDate.go        |  40 +-
 .../readwrite/model/BACnetTagPayloadDouble.go      |  16 +-
 .../readwrite/model/BACnetTagPayloadEnumerated.go  |   6 +
 .../model/BACnetTagPayloadObjectIdentifier.go      |  15 +-
 .../readwrite/model/BACnetTagPayloadOctetString.go |   6 +
 .../readwrite/model/BACnetTagPayloadReal.go        |  16 +-
 .../model/BACnetTagPayloadSignedInteger.go         |  22 +-
 .../readwrite/model/BACnetTagPayloadTime.go        |  40 +-
 .../model/BACnetTagPayloadUnsignedInteger.go       |  22 +-
 .../bacnetip/readwrite/model/BACnetTimeStamp.go    |  11 +
 .../readwrite/model/BACnetTimeStampDateTime.go     |  22 +-
 .../readwrite/model/BACnetTimeStampEnclosed.go     |  50 +-
 .../readwrite/model/BACnetTimeStampSequence.go     |  22 +-
 .../readwrite/model/BACnetTimeStampTime.go         |  22 +-
 .../readwrite/model/BACnetTimeStampsEnclosed.go    |  34 +-
 .../bacnetip/readwrite/model/BACnetTimeValue.go    |  36 +-
 .../readwrite/model/BACnetTimerStateChangeValue.go |  11 +
 .../model/BACnetTimerStateChangeValueBitString.go  |  22 +-
 .../model/BACnetTimerStateChangeValueBoolean.go    |  22 +-
 .../BACnetTimerStateChangeValueCharacterString.go  |  22 +-
 .../BACnetTimerStateChangeValueConstructedValue.go |  22 +-
 .../model/BACnetTimerStateChangeValueDate.go       |  22 +-
 .../model/BACnetTimerStateChangeValueDateTime.go   |  22 +-
 .../model/BACnetTimerStateChangeValueDouble.go     |  22 +-
 .../model/BACnetTimerStateChangeValueEnumerated.go |  22 +-
 .../model/BACnetTimerStateChangeValueInteger.go    |  22 +-
 .../BACnetTimerStateChangeValueLightingCommand.go  |  22 +-
 .../model/BACnetTimerStateChangeValueNoValue.go    |  22 +-
 .../model/BACnetTimerStateChangeValueNull.go       |  22 +-
 .../BACnetTimerStateChangeValueObjectidentifier.go |  22 +-
 .../BACnetTimerStateChangeValueOctetString.go      |  22 +-
 .../model/BACnetTimerStateChangeValueReal.go       |  22 +-
 .../model/BACnetTimerStateChangeValueTime.go       |  22 +-
 .../model/BACnetTimerStateChangeValueUnsigned.go   |  22 +-
 .../readwrite/model/BACnetTimerStateTagged.go      |  21 +-
 .../readwrite/model/BACnetTimerTransitionTagged.go |  21 +-
 .../model/BACnetUnconfirmedServiceChoiceTagged.go  |  21 +-
 .../model/BACnetUnconfirmedServiceRequest.go       |  13 +-
 .../model/BACnetUnconfirmedServiceRequestIAm.go    |  64 +--
 .../model/BACnetUnconfirmedServiceRequestIHave.go  |  50 +-
 ...UnconfirmedServiceRequestTimeSynchronization.go |  36 +-
 ...onfirmedServiceRequestUTCTimeSynchronization.go |  36 +-
 ...rmedServiceRequestUnconfirmedCOVNotification.go |  78 +--
 ...iceRequestUnconfirmedCOVNotificationMultiple.go |  70 +--
 ...edServiceRequestUnconfirmedEventNotification.go | 164 ++----
 ...rmedServiceRequestUnconfirmedPrivateTransfer.go |  42 +-
 ...onfirmedServiceRequestUnconfirmedTextMessage.go |  56 +--
 .../BACnetUnconfirmedServiceRequestUnknown.go      |   6 +
 .../model/BACnetUnconfirmedServiceRequestWhoHas.go |  36 +-
 .../BACnetUnconfirmedServiceRequestWhoHasObject.go |  11 +
 ...onfirmedServiceRequestWhoHasObjectIdentifier.go |  22 +-
 ...netUnconfirmedServiceRequestWhoHasObjectName.go |  22 +-
 .../model/BACnetUnconfirmedServiceRequestWhoIs.go  |  22 +-
 .../BACnetUnconfirmedServiceRequestWriteGroup.go   |  56 +--
 .../bacnetip/readwrite/model/BACnetVMACEntry.go    |  22 +-
 .../readwrite/model/BACnetVTClassTagged.go         |  21 +-
 .../bacnetip/readwrite/model/BACnetVTSession.go    |  50 +-
 .../bacnetip/readwrite/model/BACnetValueSource.go  |  11 +
 .../readwrite/model/BACnetValueSourceAddress.go    |  22 +-
 .../readwrite/model/BACnetValueSourceNone.go       |  22 +-
 .../readwrite/model/BACnetValueSourceObject.go     |  22 +-
 .../readwrite/model/BACnetVendorIdTagged.go        |  21 +-
 .../bacnetip/readwrite/model/BACnetWeekNDay.go     |   6 +
 .../readwrite/model/BACnetWeekNDayTagged.go        |  46 +-
 .../model/BACnetWriteAccessSpecification.go        |  56 +--
 .../readwrite/model/BACnetWriteStatusTagged.go     |  21 +-
 plc4go/protocols/bacnetip/readwrite/model/BVLC.go  |  17 +-
 .../model/BVLCBroadcastDistributionTableEntry.go   |  18 +-
 .../model/BVLCDeleteForeignDeviceTableEntry.go     |  16 +-
 .../model/BVLCDistributeBroadcastToNetwork.go      |  23 +-
 .../readwrite/model/BVLCForeignDeviceTableEntry.go |  32 +-
 .../bacnetip/readwrite/model/BVLCForwardedNPDU.go  |  30 +-
 .../readwrite/model/BVLCOriginalBroadcastNPDU.go   |  23 +-
 .../readwrite/model/BVLCOriginalUnicastNPDU.go     |  23 +-
 .../model/BVLCReadBroadcastDistributionTable.go    |   6 +
 .../model/BVLCReadBroadcastDistributionTableAck.go |   6 +
 .../readwrite/model/BVLCReadForeignDeviceTable.go  |   6 +
 .../model/BVLCReadForeignDeviceTableAck.go         |   6 +
 .../readwrite/model/BVLCRegisterForeignDevice.go   |  17 +-
 .../bacnetip/readwrite/model/BVLCResult.go         |  23 +-
 .../readwrite/model/BVLCResultCodeTagged.go        |  21 +-
 .../bacnetip/readwrite/model/BVLCSecureBVLL.go     |   6 +
 .../model/BVLCWriteBroadcastDistributionTable.go   |   6 +
 .../bacnetip/readwrite/model/BacnetConstants.go    |   8 +-
 .../bacnetip/readwrite/model/ChangeListAddError.go |  36 +-
 .../readwrite/model/ChangeListRemoveError.go       |  36 +-
 .../model/ConfirmedEventNotificationRequest.go     | 164 ++----
 .../model/ConfirmedPrivateTransferError.go         |  56 +--
 .../bacnetip/readwrite/model/CreateObjectError.go  |  36 +-
 plc4go/protocols/bacnetip/readwrite/model/Error.go |  36 +-
 .../bacnetip/readwrite/model/ErrorClassTagged.go   |  21 +-
 .../bacnetip/readwrite/model/ErrorCodeTagged.go    |  21 +-
 .../bacnetip/readwrite/model/ErrorEnclosed.go      |  50 +-
 .../readwrite/model/ListOfCovNotifications.go      |  56 +--
 .../readwrite/model/ListOfCovNotificationsList.go  |  34 +-
 .../readwrite/model/ListOfCovNotificationsValue.go |  50 +-
 plc4go/protocols/bacnetip/readwrite/model/NLM.go   |  13 +-
 .../readwrite/model/NLMChallengeRequest.go         |  32 +-
 .../model/NLMDisconnectConnectionToNetwork.go      |  16 +-
 .../model/NLMEstablishConnectionToNetwork.go       |  24 +-
 .../readwrite/model/NLMIAmRouterToNetwork.go       |   8 +-
 .../readwrite/model/NLMICouldBeRouterToNetwork.go  |  24 +-
 .../readwrite/model/NLMInitializeRoutingTable.go   |  14 +-
 .../model/NLMInitializeRoutingTableAck.go          |  14 +-
 .../model/NLMInitializeRoutingTablePortMapping.go  |  32 +-
 .../bacnetip/readwrite/model/NLMNetworkNumberIs.go |  24 +-
 .../readwrite/model/NLMRejectMessageToNetwork.go   |  30 +-
 .../readwrite/model/NLMRequestKeyUpdate.go         |  64 ++-
 .../readwrite/model/NLMRequestMasterKey.go         |  16 +-
 .../bacnetip/readwrite/model/NLMReserved.go        |   6 +
 .../readwrite/model/NLMRouterAvailableToNetwork.go |   8 +-
 .../readwrite/model/NLMRouterBusyToNetwork.go      |   8 +-
 .../bacnetip/readwrite/model/NLMSecurityPayload.go |  16 +-
 .../readwrite/model/NLMSecurityResponse.go         |  38 +-
 .../bacnetip/readwrite/model/NLMSetMasterKey.go    |  22 +-
 .../readwrite/model/NLMUpdateKeyDistributionKey.go |  30 +-
 .../bacnetip/readwrite/model/NLMUpdateKeyUpdate.go |  32 +-
 .../model/NLMUpdateKeyUpdateControlFlags.go        |  72 ++-
 .../readwrite/model/NLMUpdateKeyUpdateKeyEntry.go  |  24 +-
 .../readwrite/model/NLMVendorProprietaryMessage.go |  22 +-
 .../readwrite/model/NLMWhatIsNetworkNumber.go      |   6 +
 .../readwrite/model/NLMWhoIsRouterToNetwork.go     |   8 +-
 plc4go/protocols/bacnetip/readwrite/model/NPDU.go  |  58 +--
 .../bacnetip/readwrite/model/NPDUControl.go        |  56 +--
 .../readwrite/model/NPDUNetworkPriorityTagged.go   |  21 +-
 .../readwrite/model/SecurityResponseCodeTagged.go  |  21 +-
 .../model/SubscribeCOVPropertyMultipleError.go     |  36 +-
 ...PropertyMultipleErrorFirstFailedSubscription.go |  78 +--
 .../bacnetip/readwrite/model/VTCloseError.go       |  28 +-
 .../VTCloseErrorListOfVTSessionIdentifiers.go      |  42 +-
 .../readwrite/model/WritePropertyMultipleError.go  |  36 +-
 .../cbus/readwrite/model/AccessControlData.go      |  43 +-
 .../model/AccessControlDataAccessPointClosed.go    |   6 +
 .../AccessControlDataAccessPointForcedOpen.go      |   6 +
 .../model/AccessControlDataAccessPointLeftOpen.go  |   6 +
 .../model/AccessControlDataCloseAccessPoint.go     |   6 +
 .../model/AccessControlDataInvalidAccessRequest.go |  22 +-
 .../model/AccessControlDataLockAccessPoint.go      |   6 +
 .../model/AccessControlDataRequestToExit.go        |   6 +
 .../model/AccessControlDataValidAccessRequest.go   |  22 +-
 .../cbus/readwrite/model/AirConditioningData.go    |  27 +-
 .../AirConditioningDataHumidityScheduleEntry.go    |  72 +--
 .../model/AirConditioningDataHvacScheduleEntry.go  |  72 +--
 .../readwrite/model/AirConditioningDataRefresh.go  |  16 +-
 ...irConditioningDataSetHumidityLowerGuardLimit.go |  58 +--
 .../AirConditioningDataSetHumiditySetbackLimit.go  |  58 +--
 ...irConditioningDataSetHumidityUpperGuardLimit.go |  58 +--
 .../AirConditioningDataSetHvacLowerGuardLimit.go   |  58 +--
 .../AirConditioningDataSetHvacSetbackLimit.go      |  58 +--
 .../AirConditioningDataSetHvacUpperGuardLimit.go   |  58 +--
 .../AirConditioningDataSetPlantHumidityLevel.go    |  56 +--
 .../model/AirConditioningDataSetPlantHvacLevel.go  |  56 +--
 .../model/AirConditioningDataSetZoneGroupOff.go    |  16 +-
 .../model/AirConditioningDataSetZoneGroupOn.go     |  16 +-
 .../AirConditioningDataSetZoneHumidityMode.go      |  56 +--
 .../model/AirConditioningDataSetZoneHvacMode.go    |  56 +--
 .../model/AirConditioningDataZoneHumidity.go       |  58 +--
 .../AirConditioningDataZoneHumidityPlantStatus.go  |  72 +--
 .../AirConditioningDataZoneHvacPlantStatus.go      |  72 +--
 .../model/AirConditioningDataZoneTemperature.go    |  58 +--
 plc4go/protocols/cbus/readwrite/model/Alpha.go     |  16 +-
 .../cbus/readwrite/model/ApplicationAddress1.go    |  16 +-
 .../cbus/readwrite/model/ApplicationAddress2.go    |  16 +-
 .../cbus/readwrite/model/BridgeAddress.go          |  16 +-
 plc4go/protocols/cbus/readwrite/model/CALData.go   |  33 +-
 .../cbus/readwrite/model/CALDataAcknowledge.go     |  30 +-
 .../cbus/readwrite/model/CALDataGetStatus.go       |  30 +-
 .../cbus/readwrite/model/CALDataIdentify.go        |  22 +-
 .../cbus/readwrite/model/CALDataIdentifyReply.go   |  36 +-
 .../cbus/readwrite/model/CALDataRecall.go          |  30 +-
 .../protocols/cbus/readwrite/model/CALDataReply.go |  36 +-
 .../protocols/cbus/readwrite/model/CALDataReset.go |   6 +
 .../cbus/readwrite/model/CALDataStatus.go          |  28 +-
 .../cbus/readwrite/model/CALDataStatusExtended.go  |  42 +-
 .../protocols/cbus/readwrite/model/CALDataWrite.go |  44 +-
 plc4go/protocols/cbus/readwrite/model/CALReply.go  |  27 +-
 .../protocols/cbus/readwrite/model/CALReplyLong.go |  20 +-
 .../cbus/readwrite/model/CALReplyShort.go          |   6 +
 .../protocols/cbus/readwrite/model/CBusCommand.go  |  27 +-
 .../readwrite/model/CBusCommandDeviceManagement.go |  28 +-
 .../model/CBusCommandPointToMultiPoint.go          |  22 +-
 .../readwrite/model/CBusCommandPointToPoint.go     |  22 +-
 .../model/CBusCommandPointToPointToMultiPoint.go   |  22 +-
 .../cbus/readwrite/model/CBusConstants.go          |   8 +-
 .../protocols/cbus/readwrite/model/CBusHeader.go   |  52 +-
 .../protocols/cbus/readwrite/model/CBusMessage.go  |  11 +
 .../cbus/readwrite/model/CBusMessageToClient.go    |  22 +-
 .../cbus/readwrite/model/CBusMessageToServer.go    |  22 +-
 .../protocols/cbus/readwrite/model/CBusOptions.go  |  80 ++-
 .../model/CBusPointToMultiPointCommand.go          |  11 +
 .../model/CBusPointToMultiPointCommandNormal.go    |  34 +-
 .../model/CBusPointToMultiPointCommandStatus.go    |  20 +-
 .../readwrite/model/CBusPointToPointCommand.go     |  27 +-
 .../model/CBusPointToPointCommandDirect.go         |  22 +-
 .../model/CBusPointToPointCommandIndirect.go       |  50 +-
 .../model/CBusPointToPointToMultiPointCommand.go   |  41 +-
 .../CBusPointToPointToMultiPointCommandNormal.go   |  36 +-
 .../CBusPointToPointToMultiPointCommandStatus.go   |  20 +-
 plc4go/protocols/cbus/readwrite/model/Checksum.go  |  16 +-
 .../readwrite/model/ClockAndTimekeepingData.go     |  35 +-
 .../model/ClockAndTimekeepingDataRequestRefresh.go |   6 +
 .../model/ClockAndTimekeepingDataUpdateDate.go     |  48 +-
 .../model/ClockAndTimekeepingDataUpdateTime.go     |  40 +-
 .../protocols/cbus/readwrite/model/Confirmation.go |  34 +-
 .../cbus/readwrite/model/CustomManufacturer.go     |  16 +-
 .../protocols/cbus/readwrite/model/CustomTypes.go  |  16 +-
 .../cbus/readwrite/model/EnableControlData.go      |  38 +-
 .../protocols/cbus/readwrite/model/EncodedReply.go |  11 +
 .../cbus/readwrite/model/EncodedReplyCALReply.go   |  22 +-
 .../cbus/readwrite/model/ErrorReportingData.go     |  27 +-
 .../readwrite/model/ErrorReportingDataGeneric.go   |  84 ++--
 .../model/ErrorReportingSystemCategory.go          |  50 +-
 .../model/ErrorReportingSystemCategoryType.go      |  11 +
 ...gSystemCategoryTypeBuildingManagementSystems.go |  22 +-
 ...eportingSystemCategoryTypeClimateControllers.go |  22 +-
 .../ErrorReportingSystemCategoryTypeInputUnits.go  |  22 +-
 .../ErrorReportingSystemCategoryTypeOutputUnits.go |  22 +-
 .../ErrorReportingSystemCategoryTypeReserved.go    |  16 +-
 ...ErrorReportingSystemCategoryTypeSupportUnits.go |  22 +-
 .../cbus/readwrite/model/HVACAuxiliaryLevel.go     |  22 +-
 .../protocols/cbus/readwrite/model/HVACHumidity.go |  16 +-
 .../readwrite/model/HVACHumidityModeAndFlags.go    |  52 +-
 .../readwrite/model/HVACHumidityStatusFlags.go     |  62 +--
 .../cbus/readwrite/model/HVACModeAndFlags.go       |  52 +-
 .../cbus/readwrite/model/HVACRawLevels.go          |  16 +-
 .../cbus/readwrite/model/HVACStartTime.go          |  16 +-
 .../cbus/readwrite/model/HVACStatusFlags.go        |  62 +--
 .../cbus/readwrite/model/HVACTemperature.go        |  16 +-
 .../protocols/cbus/readwrite/model/HVACZoneList.go |  72 ++-
 .../cbus/readwrite/model/IdentifyReplyCommand.go   |  11 +
 .../IdentifyReplyCommandCurrentSenseLevels.go      |   6 +
 .../model/IdentifyReplyCommandDSIStatus.go         | 142 ++----
 .../readwrite/model/IdentifyReplyCommandDelays.go  |  16 +-
 ...dentifyReplyCommandExtendedDiagnosticSummary.go | 176 +++----
 .../model/IdentifyReplyCommandFirmwareVersion.go   |  16 +-
 .../IdentifyReplyCommandGAVPhysicalAddresses.go    |   6 +
 .../model/IdentifyReplyCommandGAVValuesCurrent.go  |   6 +
 .../model/IdentifyReplyCommandGAVValuesStored.go   |   6 +
 .../model/IdentifyReplyCommandLogicalAssignment.go |   6 +
 .../model/IdentifyReplyCommandManufacturer.go      |  16 +-
 .../model/IdentifyReplyCommandMaximumLevels.go     |   6 +
 .../model/IdentifyReplyCommandMinimumLevels.go     |   6 +
 .../IdentifyReplyCommandNetworkTerminalLevels.go   |   6 +
 .../model/IdentifyReplyCommandNetworkVoltage.go    |  22 +-
 .../model/IdentifyReplyCommandOutputUnitSummary.go |  28 +-
 .../readwrite/model/IdentifyReplyCommandSummary.go |  32 +-
 .../model/IdentifyReplyCommandTerminalLevels.go    |   6 +
 .../readwrite/model/IdentifyReplyCommandType.go    |  16 +-
 .../model/IdentifyReplyCommandUnitSummary.go       |  72 ++-
 .../cbus/readwrite/model/InterfaceOptions1.go      |  54 +-
 .../model/InterfaceOptions1PowerUpSettings.go      |  22 +-
 .../cbus/readwrite/model/InterfaceOptions2.go      |  22 +-
 .../cbus/readwrite/model/InterfaceOptions3.go      |  38 +-
 .../cbus/readwrite/model/LevelInformation.go       |  11 +
 .../cbus/readwrite/model/LevelInformationAbsent.go |   8 +-
 .../readwrite/model/LevelInformationCorrupted.go   |  40 +-
 .../cbus/readwrite/model/LevelInformationNormal.go |  36 +-
 .../protocols/cbus/readwrite/model/LightingData.go |  27 +-
 .../cbus/readwrite/model/LightingDataLabel.go      |  30 +-
 .../cbus/readwrite/model/LightingDataOff.go        |  16 +-
 .../cbus/readwrite/model/LightingDataOn.go         |  16 +-
 .../readwrite/model/LightingDataRampToLevel.go     |  24 +-
 .../readwrite/model/LightingDataTerminateRamp.go   |  16 +-
 .../cbus/readwrite/model/LightingLabelOptions.go   |  34 +-
 .../cbus/readwrite/model/LogicAssignment.go        |  54 +-
 .../cbus/readwrite/model/MeasurementData.go        |  27 +-
 .../model/MeasurementDataChannelMeasurementData.go |  62 +--
 .../readwrite/model/MediaTransportControlData.go   |  35 +-
 .../model/MediaTransportControlDataCategoryName.go |  16 +-
 ...ontrolDataEnumerateCategoriesSelectionTracks.go |  24 +-
 .../MediaTransportControlDataEnumerationsSize.go   |  32 +-
 .../model/MediaTransportControlDataFastForward.go  |  16 +-
 ...ediaTransportControlDataNextPreviousCategory.go |  16 +-
 ...diaTransportControlDataNextPreviousSelection.go |  16 +-
 .../MediaTransportControlDataNextPreviousTrack.go  |  16 +-
 .../model/MediaTransportControlDataPauseResume.go  |  16 +-
 .../model/MediaTransportControlDataPlay.go         |   6 +
 .../model/MediaTransportControlDataRepeatOnOff.go  |  16 +-
 .../model/MediaTransportControlDataRewind.go       |  16 +-
 .../MediaTransportControlDataSelectionName.go      |  16 +-
 .../model/MediaTransportControlDataSetCategory.go  |  16 +-
 .../model/MediaTransportControlDataSetSelection.go |  24 +-
 .../model/MediaTransportControlDataSetTrack.go     |  40 +-
 .../model/MediaTransportControlDataShuffleOnOff.go |  16 +-
 .../MediaTransportControlDataSourcePowerControl.go |  16 +-
 .../MediaTransportControlDataStatusRequest.go      |   6 +
 .../model/MediaTransportControlDataStop.go         |   6 +
 .../model/MediaTransportControlDataTotalTracks.go  |  40 +-
 .../model/MediaTransportControlDataTrackName.go    |  16 +-
 .../protocols/cbus/readwrite/model/MeteringData.go |  35 +-
 .../model/MeteringDataDrinkingWaterConsumption.go  |  16 +-
 .../model/MeteringDataElectricityConsumption.go    |  16 +-
 .../readwrite/model/MeteringDataGasConsumption.go  |  16 +-
 .../model/MeteringDataMeasureDrinkingWater.go      |   6 +
 .../model/MeteringDataMeasureElectricity.go        |   6 +
 .../cbus/readwrite/model/MeteringDataMeasureGas.go |   6 +
 .../cbus/readwrite/model/MeteringDataMeasureOil.go |   6 +
 .../model/MeteringDataMeasureOtherWater.go         |   6 +
 .../readwrite/model/MeteringDataOilConsumption.go  |  16 +-
 .../model/MeteringDataOtherWaterConsumption.go     |  16 +-
 .../protocols/cbus/readwrite/model/MonitoredSAL.go |  11 +
 .../model/MonitoredSALLongFormSmartMode.go         |  28 +-
 .../cbus/readwrite/model/MonitoredSALReply.go      |  22 +-
 .../model/MonitoredSALShortFormBasicMode.go        |  32 +-
 .../model/NetworkProtocolControlInformation.go     |  24 +-
 .../protocols/cbus/readwrite/model/NetworkRoute.go |  20 +-
 .../protocols/cbus/readwrite/model/PanicStatus.go  |  16 +-
 .../cbus/readwrite/model/ParameterChange.go        |   6 +
 .../cbus/readwrite/model/ParameterChangeReply.go   |  22 +-
 .../cbus/readwrite/model/ParameterValue.go         |  11 +
 .../model/ParameterValueApplicationAddress1.go     |  22 +-
 .../model/ParameterValueApplicationAddress2.go     |  22 +-
 .../model/ParameterValueBaudRateSelector.go        |  22 +-
 .../model/ParameterValueCustomManufacturer.go      |  22 +-
 .../readwrite/model/ParameterValueCustomTypes.go   |  22 +-
 .../model/ParameterValueInterfaceOptions1.go       |  22 +-
 ...rameterValueInterfaceOptions1PowerUpSettings.go |  22 +-
 .../model/ParameterValueInterfaceOptions2.go       |  22 +-
 .../model/ParameterValueInterfaceOptions3.go       |  22 +-
 .../cbus/readwrite/model/ParameterValueRaw.go      |   6 +
 .../readwrite/model/ParameterValueSerialNumber.go  |  22 +-
 plc4go/protocols/cbus/readwrite/model/PowerUp.go   |   6 +
 .../protocols/cbus/readwrite/model/PowerUpReply.go |  22 +-
 plc4go/protocols/cbus/readwrite/model/Reply.go     |  11 +
 .../cbus/readwrite/model/ReplyEncodedReply.go      |   6 +
 .../protocols/cbus/readwrite/model/ReplyNetwork.go |  36 +-
 .../cbus/readwrite/model/ReplyOrConfirmation.go    |  11 +
 .../model/ReplyOrConfirmationConfirmation.go       |  28 +-
 .../readwrite/model/ReplyOrConfirmationReply.go    |  36 +-
 plc4go/protocols/cbus/readwrite/model/Request.go   |  29 +-
 .../cbus/readwrite/model/RequestCommand.go         |   6 +
 .../cbus/readwrite/model/RequestContext.go         |  16 +-
 .../readwrite/model/RequestDirectCommandAccess.go  |   6 +
 .../protocols/cbus/readwrite/model/RequestEmpty.go |   6 +
 .../protocols/cbus/readwrite/model/RequestNull.go  |   8 +-
 .../cbus/readwrite/model/RequestObsolete.go        |   6 +
 .../protocols/cbus/readwrite/model/RequestReset.go |  10 +-
 .../readwrite/model/RequestSmartConnectShortcut.go |   6 +
 .../cbus/readwrite/model/RequestTermination.go     |   6 +
 .../cbus/readwrite/model/ResponseTermination.go    |   6 +
 plc4go/protocols/cbus/readwrite/model/SALData.go   |  19 +-
 .../cbus/readwrite/model/SALDataAccessControl.go   |  22 +-
 .../cbus/readwrite/model/SALDataAirConditioning.go |  22 +-
 .../cbus/readwrite/model/SALDataAudioAndVideo.go   |  22 +-
 .../readwrite/model/SALDataClockAndTimekeeping.go  |  22 +-
 .../cbus/readwrite/model/SALDataEnableControl.go   |  22 +-
 .../cbus/readwrite/model/SALDataErrorReporting.go  |  22 +-
 .../cbus/readwrite/model/SALDataFreeUsage.go       |   6 +
 .../cbus/readwrite/model/SALDataHeating.go         |  22 +-
 .../cbus/readwrite/model/SALDataHvacActuator.go    |  22 +-
 .../readwrite/model/SALDataIrrigationControl.go    |  22 +-
 .../cbus/readwrite/model/SALDataLighting.go        |  22 +-
 .../cbus/readwrite/model/SALDataMeasurement.go     |  22 +-
 .../cbus/readwrite/model/SALDataMediaTransport.go  |  22 +-
 .../cbus/readwrite/model/SALDataMetering.go        |  22 +-
 .../model/SALDataPoolsSpasPondsFountainsControl.go |  22 +-
 .../cbus/readwrite/model/SALDataReserved.go        |   6 +
 .../readwrite/model/SALDataRoomControlSystem.go    |   6 +
 .../cbus/readwrite/model/SALDataSecurity.go        |  22 +-
 .../model/SALDataTelephonyStatusAndControl.go      |  22 +-
 .../readwrite/model/SALDataTemperatureBroadcast.go |  22 +-
 .../cbus/readwrite/model/SALDataTesting.go         |   6 +
 .../cbus/readwrite/model/SALDataTriggerControl.go  |  22 +-
 .../cbus/readwrite/model/SALDataVentilation.go     |  22 +-
 .../cbus/readwrite/model/SecurityArmCode.go        |  16 +-
 .../protocols/cbus/readwrite/model/SecurityData.go |  35 +-
 .../cbus/readwrite/model/SecurityDataAlarmOff.go   |   6 +
 .../cbus/readwrite/model/SecurityDataAlarmOn.go    |   6 +
 .../model/SecurityDataArmFailedCleared.go          |   6 +
 .../readwrite/model/SecurityDataArmFailedRaised.go |   6 +
 .../model/SecurityDataArmReadyNotReady.go          |  16 +-
 .../cbus/readwrite/model/SecurityDataArmSystem.go  |  16 +-
 .../model/SecurityDataCurrentAlarmType.go          |   6 +
 .../readwrite/model/SecurityDataDisplayMessage.go  |  16 +-
 .../cbus/readwrite/model/SecurityDataDropTamper.go |   6 +
 .../readwrite/model/SecurityDataEmulatedKeypad.go  |  16 +-
 .../model/SecurityDataEntryDelayStarted.go         |   6 +
 .../cbus/readwrite/model/SecurityDataEvent.go      |   6 +
 .../model/SecurityDataExitDelayStarted.go          |   6 +
 .../model/SecurityDataFireAlarmCleared.go          |   6 +
 .../readwrite/model/SecurityDataFireAlarmRaised.go |   6 +
 .../readwrite/model/SecurityDataGasAlarmCleared.go |   6 +
 .../readwrite/model/SecurityDataGasAlarmRaised.go  |   6 +
 .../model/SecurityDataLineCutAlarmCleared.go       |   6 +
 .../model/SecurityDataLineCutAlarmRaised.go        |   6 +
 .../model/SecurityDataLowBatteryCharging.go        |  16 +-
 .../model/SecurityDataLowBatteryCorrected.go       |   6 +
 .../model/SecurityDataLowBatteryDetected.go        |   6 +
 .../readwrite/model/SecurityDataMainsFailure.go    |   6 +
 .../model/SecurityDataMainsRestoredOrApplied.go    |   6 +
 .../cbus/readwrite/model/SecurityDataOff.go        |   6 +
 .../cbus/readwrite/model/SecurityDataOn.go         |   6 +
 .../model/SecurityDataOtherAlarmCleared.go         |   6 +
 .../model/SecurityDataOtherAlarmRaised.go          |   6 +
 .../readwrite/model/SecurityDataPanicActivated.go  |   6 +
 .../readwrite/model/SecurityDataPanicCleared.go    |   6 +
 .../model/SecurityDataPasswordEntryStatus.go       |  16 +-
 .../cbus/readwrite/model/SecurityDataRaiseAlarm.go |   6 +
 .../readwrite/model/SecurityDataRaiseTamper.go     |   6 +
 .../readwrite/model/SecurityDataRequestZoneName.go |  16 +-
 .../readwrite/model/SecurityDataStatus1Request.go  |   6 +
 .../readwrite/model/SecurityDataStatus2Request.go  |   6 +
 .../readwrite/model/SecurityDataStatusReport1.go   |  48 +-
 .../readwrite/model/SecurityDataStatusReport2.go   |   6 +
 .../model/SecurityDataSystemArmedDisarmed.go       |  22 +-
 .../readwrite/model/SecurityDataSystemDisarmed.go  |   6 +
 .../cbus/readwrite/model/SecurityDataTamperOff.go  |   6 +
 .../cbus/readwrite/model/SecurityDataTamperOn.go   |   6 +
 .../readwrite/model/SecurityDataZoneIsolated.go    |  16 +-
 .../cbus/readwrite/model/SecurityDataZoneName.go   |  24 +-
 .../cbus/readwrite/model/SecurityDataZoneOpen.go   |  16 +-
 .../cbus/readwrite/model/SecurityDataZoneSealed.go |  16 +-
 .../cbus/readwrite/model/SecurityDataZoneShort.go  |  16 +-
 .../readwrite/model/SecurityDataZoneUnsealed.go    |  16 +-
 .../cbus/readwrite/model/SerialInterfaceAddress.go |  16 +-
 .../protocols/cbus/readwrite/model/SerialNumber.go |  40 +-
 .../cbus/readwrite/model/ServerErrorReply.go       |   6 +
 .../protocols/cbus/readwrite/model/StatusByte.go   |  64 +--
 .../cbus/readwrite/model/StatusRequest.go          |  11 +
 .../readwrite/model/StatusRequestBinaryState.go    |  20 +-
 .../model/StatusRequestBinaryStateDeprecated.go    |  20 +-
 .../cbus/readwrite/model/StatusRequestLevel.go     |  28 +-
 .../protocols/cbus/readwrite/model/TamperStatus.go |  16 +-
 .../cbus/readwrite/model/TelephonyData.go          |  35 +-
 .../readwrite/model/TelephonyDataClearDiversion.go |   6 +
 .../readwrite/model/TelephonyDataDialInFailure.go  |  22 +-
 .../readwrite/model/TelephonyDataDialOutFailure.go |  22 +-
 .../cbus/readwrite/model/TelephonyDataDivert.go    |  16 +-
 .../TelephonyDataInternetConnectionRequestMade.go  |   6 +
 .../model/TelephonyDataIsolateSecondaryOutlet.go   |  16 +-
 .../readwrite/model/TelephonyDataLineOffHook.go    |  30 +-
 .../readwrite/model/TelephonyDataLineOnHook.go     |   6 +
 .../model/TelephonyDataRecallLastNumber.go         |  24 +-
 .../model/TelephonyDataRecallLastNumberRequest.go  |  16 +-
 .../model/TelephonyDataRejectIncomingCall.go       |   6 +
 .../cbus/readwrite/model/TelephonyDataRinging.go   |  14 +-
 .../readwrite/model/TemperatureBroadcastData.go    |  38 +-
 .../cbus/readwrite/model/TriggerControlData.go     |  35 +-
 .../model/TriggerControlDataIndicatorKill.go       |   6 +
 .../readwrite/model/TriggerControlDataLabel.go     |  30 +-
 .../model/TriggerControlDataTriggerEvent.go        |  16 +-
 .../model/TriggerControlDataTriggerMax.go          |   6 +
 .../model/TriggerControlDataTriggerMin.go          |   6 +
 .../readwrite/model/TriggerControlLabelOptions.go  |  34 +-
 .../protocols/cbus/readwrite/model/UnitAddress.go  |  16 +-
 .../protocols/cbus/readwrite/model/ZoneStatus.go   |  22 +-
 plc4go/protocols/df1/readwrite/model/DF1Command.go |  29 +-
 plc4go/protocols/df1/readwrite/model/DF1Symbol.go  |  15 +-
 .../df1/readwrite/model/DF1SymbolMessageFrame.go   |  42 +-
 .../readwrite/model/DF1SymbolMessageFrameACK.go    |   6 +
 .../readwrite/model/DF1SymbolMessageFrameNAK.go    |   6 +
 .../readwrite/model/DF1UnprotectedReadRequest.go   |  24 +-
 .../readwrite/model/DF1UnprotectedReadResponse.go  |   6 +
 .../readwrite/model/AnsiExtendedSymbolSegment.go   |  18 +-
 .../protocols/eip/readwrite/model/CIPAttributes.go |  14 +-
 plc4go/protocols/eip/readwrite/model/CIPData.go    |  22 +-
 .../eip/readwrite/model/CIPDataConnected.go        |  24 +-
 .../eip/readwrite/model/CipConnectedRequest.go     |  12 +-
 .../eip/readwrite/model/CipConnectedResponse.go    |  24 +-
 .../model/CipConnectionManagerCloseRequest.go      |  98 ++--
 .../model/CipConnectionManagerCloseResponse.go     |  58 +--
 .../readwrite/model/CipConnectionManagerRequest.go | 176 +++----
 .../model/CipConnectionManagerResponse.go          |  68 ++-
 .../protocols/eip/readwrite/model/CipIdentity.go   | 114 ++---
 plc4go/protocols/eip/readwrite/model/CipRRData.go  |  24 +-
 .../eip/readwrite/model/CipReadRequest.go          |  16 +-
 .../eip/readwrite/model/CipReadResponse.go         |  32 +-
 .../eip/readwrite/model/CipSecurityInformation.go  |  10 +-
 plc4go/protocols/eip/readwrite/model/CipService.go |  13 +-
 .../eip/readwrite/model/CipUnconnectedRequest.go   |  72 +--
 .../eip/readwrite/model/CipWriteRequest.go         |  30 +-
 .../eip/readwrite/model/CipWriteResponse.go        |  24 +-
 plc4go/protocols/eip/readwrite/model/ClassID.go    |  24 +-
 .../protocols/eip/readwrite/model/ClassSegment.go  |  40 +-
 .../eip/readwrite/model/CommandSpecificDataItem.go |  13 +-
 .../eip/readwrite/model/ConnectedAddressItem.go    |  16 +-
 .../eip/readwrite/model/ConnectedDataItem.go       |  30 +-
 .../protocols/eip/readwrite/model/DataSegment.go   |  22 +-
 .../eip/readwrite/model/DataSegmentType.go         |  13 +-
 .../eip/readwrite/model/EipConnectionRequest.go    |  10 +-
 .../eip/readwrite/model/EipConnectionResponse.go   |  10 +-
 .../protocols/eip/readwrite/model/EipConstants.go  |  10 +-
 .../eip/readwrite/model/EipDisconnectRequest.go    |   6 +
 .../eip/readwrite/model/EipListIdentityRequest.go  |   6 +
 .../eip/readwrite/model/EipListIdentityResponse.go |   8 +-
 plc4go/protocols/eip/readwrite/model/EipPacket.go  |  39 +-
 .../eip/readwrite/model/GetAttributeAllRequest.go  |  36 +-
 .../eip/readwrite/model/GetAttributeAllResponse.go |  32 +-
 .../eip/readwrite/model/GetAttributeListRequest.go |   6 +
 .../readwrite/model/GetAttributeListResponse.go    |   6 +
 .../readwrite/model/GetAttributeSingleRequest.go   |   6 +
 .../readwrite/model/GetAttributeSingleResponse.go  |   6 +
 plc4go/protocols/eip/readwrite/model/InstanceID.go |  24 +-
 .../eip/readwrite/model/InstanceSegment.go         |  40 +-
 .../eip/readwrite/model/ListServicesRequest.go     |   6 +
 .../eip/readwrite/model/ListServicesResponse.go    |   8 +-
 .../eip/readwrite/model/LogicalSegment.go          |  22 +-
 .../eip/readwrite/model/LogicalSegmentType.go      |  13 +-
 plc4go/protocols/eip/readwrite/model/MemberID.go   |  24 +-
 .../eip/readwrite/model/MultipleServiceRequest.go  |  24 +-
 .../eip/readwrite/model/MultipleServiceResponse.go |  34 +-
 .../readwrite/model/NetworkConnectionParameters.go |  48 +-
 .../eip/readwrite/model/NullAddressItem.go         |   8 +-
 .../eip/readwrite/model/NullCommandRequest.go      |   6 +
 .../eip/readwrite/model/NullCommandResponse.go     |   6 +
 .../readwrite/model/NullEipConnectionResponse.go   |   6 +
 .../readwrite/model/NullListServicesResponse.go    |   6 +
 .../protocols/eip/readwrite/model/PathSegment.go   |  13 +-
 .../protocols/eip/readwrite/model/PortSegment.go   |  22 +-
 .../eip/readwrite/model/PortSegmentExtended.go     |  32 +-
 .../eip/readwrite/model/PortSegmentNormal.go       |  24 +-
 .../eip/readwrite/model/PortSegmentType.go         |  11 +
 .../protocols/eip/readwrite/model/SendUnitData.go  |  18 +-
 plc4go/protocols/eip/readwrite/model/Services.go   |  18 +-
 .../eip/readwrite/model/ServicesResponse.go        |  36 +-
 .../eip/readwrite/model/SetAttributeAllRequest.go  |   6 +
 .../eip/readwrite/model/SetAttributeAllResponse.go |   6 +
 .../eip/readwrite/model/SetAttributeListRequest.go |   6 +
 .../readwrite/model/SetAttributeListResponse.go    |   6 +
 .../readwrite/model/SetAttributeSingleRequest.go   |   6 +
 .../readwrite/model/SetAttributeSingleResponse.go  |   6 +
 .../protocols/eip/readwrite/model/TransportType.go |  32 +-
 plc4go/protocols/eip/readwrite/model/TypeId.go     |  13 +-
 .../eip/readwrite/model/UnConnectedDataItem.go     |  22 +-
 .../firmata/readwrite/model/FirmataCommand.go      |  13 +-
 .../model/FirmataCommandProtocolVersion.go         |  24 +-
 .../model/FirmataCommandSetDigitalPinValue.go      |  24 +-
 .../readwrite/model/FirmataCommandSetPinMode.go    |  30 +-
 .../firmata/readwrite/model/FirmataCommandSysex.go |  22 +-
 .../readwrite/model/FirmataCommandSystemReset.go   |   6 +
 .../firmata/readwrite/model/FirmataMessage.go      |  13 +-
 .../readwrite/model/FirmataMessageAnalogIO.go      |  16 +-
 .../readwrite/model/FirmataMessageCommand.go       |  23 +-
 .../readwrite/model/FirmataMessageDigitalIO.go     |  16 +-
 .../model/FirmataMessageSubscribeAnalogPinValue.go |  24 +-
 .../FirmataMessageSubscribeDigitalPinValue.go      |  24 +-
 .../firmata/readwrite/model/SysexCommand.go        |  13 +-
 .../model/SysexCommandAnalogMappingQueryRequest.go |   6 +
 .../SysexCommandAnalogMappingQueryResponse.go      |  16 +-
 .../model/SysexCommandAnalogMappingResponse.go     |   6 +
 .../readwrite/model/SysexCommandCapabilityQuery.go |   6 +
 .../model/SysexCommandCapabilityResponse.go        |   6 +
 .../readwrite/model/SysexCommandExtendedAnalog.go  |   6 +
 .../readwrite/model/SysexCommandExtendedId.go      |   8 +-
 .../readwrite/model/SysexCommandPinStateQuery.go   |  16 +-
 .../model/SysexCommandPinStateResponse.go          |  32 +-
 .../model/SysexCommandReportFirmwareRequest.go     |   6 +
 .../model/SysexCommandReportFirmwareResponse.go    |  23 +-
 .../model/SysexCommandSamplingInterval.go          |   6 +
 .../readwrite/model/SysexCommandStringData.go      |   6 +
 .../model/SysexCommandSysexNonRealtime.go          |   6 +
 .../readwrite/model/SysexCommandSysexRealtime.go   |   6 +
 plc4go/protocols/knxnetip/readwrite/model/Apdu.go  |  29 +-
 .../knxnetip/readwrite/model/ApduControl.go        |  13 +-
 .../knxnetip/readwrite/model/ApduControlAck.go     |   6 +
 .../knxnetip/readwrite/model/ApduControlConnect.go |   6 +
 .../readwrite/model/ApduControlContainer.go        |  22 +-
 .../readwrite/model/ApduControlDisconnect.go       |   6 +
 .../knxnetip/readwrite/model/ApduControlNack.go    |   6 +
 .../protocols/knxnetip/readwrite/model/ApduData.go |  13 +-
 .../knxnetip/readwrite/model/ApduDataAdcRead.go    |   6 +
 .../readwrite/model/ApduDataAdcResponse.go         |   6 +
 .../knxnetip/readwrite/model/ApduDataContainer.go  |  22 +-
 .../model/ApduDataDeviceDescriptorRead.go          |  16 +-
 .../model/ApduDataDeviceDescriptorResponse.go      |  16 +-
 .../knxnetip/readwrite/model/ApduDataExt.go        |  13 +-
 .../readwrite/model/ApduDataExtAuthorizeRequest.go |  16 +-
 .../model/ApduDataExtAuthorizeResponse.go          |  16 +-
 .../model/ApduDataExtDomainAddressRead.go          |   6 +
 .../model/ApduDataExtDomainAddressResponse.go      |   6 +
 .../model/ApduDataExtDomainAddressSelectiveRead.go |   6 +
 .../ApduDataExtDomainAddressSerialNumberRead.go    |   6 +
 ...ApduDataExtDomainAddressSerialNumberResponse.go |   6 +
 .../ApduDataExtDomainAddressSerialNumberWrite.go   |   6 +
 .../model/ApduDataExtDomainAddressWrite.go         |   6 +
 .../model/ApduDataExtFileStreamInfoReport.go       |   6 +
 .../ApduDataExtGroupPropertyValueInfoReport.go     |   6 +
 .../model/ApduDataExtGroupPropertyValueRead.go     |   6 +
 .../model/ApduDataExtGroupPropertyValueResponse.go |   6 +
 .../model/ApduDataExtGroupPropertyValueWrite.go    |   6 +
 ...ApduDataExtIndividualAddressSerialNumberRead.go |   6 +
 ...DataExtIndividualAddressSerialNumberResponse.go |   6 +
 ...pduDataExtIndividualAddressSerialNumberWrite.go |   6 +
 .../readwrite/model/ApduDataExtKeyResponse.go      |   6 +
 .../readwrite/model/ApduDataExtKeyWrite.go         |   6 +
 .../readwrite/model/ApduDataExtLinkRead.go         |   6 +
 .../readwrite/model/ApduDataExtLinkResponse.go     |   6 +
 .../readwrite/model/ApduDataExtLinkWrite.go        |   6 +
 .../readwrite/model/ApduDataExtMemoryBitWrite.go   |   6 +
 .../model/ApduDataExtNetworkParameterRead.go       |   6 +
 .../model/ApduDataExtNetworkParameterResponse.go   |   6 +
 .../model/ApduDataExtNetworkParameterWrite.go      |   6 +
 .../model/ApduDataExtOpenRoutingTableRequest.go    |   6 +
 .../model/ApduDataExtPropertyDescriptionRead.go    |  32 +-
 .../ApduDataExtPropertyDescriptionResponse.go      |  92 ++--
 .../model/ApduDataExtPropertyValueRead.go          |  40 +-
 .../model/ApduDataExtPropertyValueResponse.go      |  40 +-
 .../model/ApduDataExtPropertyValueWrite.go         |  40 +-
 .../model/ApduDataExtReadRouterMemoryRequest.go    |   6 +
 .../model/ApduDataExtReadRouterMemoryResponse.go   |   6 +
 .../model/ApduDataExtReadRouterStatusRequest.go    |   6 +
 .../model/ApduDataExtReadRouterStatusResponse.go   |   6 +
 .../model/ApduDataExtReadRoutingTableRequest.go    |   6 +
 .../model/ApduDataExtReadRoutingTableResponse.go   |   6 +
 .../model/ApduDataExtWriteRouterMemoryRequest.go   |   6 +
 .../model/ApduDataExtWriteRouterStatusRequest.go   |   6 +
 .../model/ApduDataExtWriteRoutingTableRequest.go   |   6 +
 .../readwrite/model/ApduDataGroupValueRead.go      |   8 +-
 .../readwrite/model/ApduDataGroupValueResponse.go  |  16 +-
 .../readwrite/model/ApduDataGroupValueWrite.go     |  16 +-
 .../model/ApduDataIndividualAddressRead.go         |   6 +
 .../model/ApduDataIndividualAddressResponse.go     |   6 +
 .../model/ApduDataIndividualAddressWrite.go        |   6 +
 .../knxnetip/readwrite/model/ApduDataMemoryRead.go |  24 +-
 .../readwrite/model/ApduDataMemoryResponse.go      |  16 +-
 .../readwrite/model/ApduDataMemoryWrite.go         |   6 +
 .../knxnetip/readwrite/model/ApduDataOther.go      |  22 +-
 .../knxnetip/readwrite/model/ApduDataRestart.go    |   6 +
 .../readwrite/model/ApduDataUserMessage.go         |   6 +
 plc4go/protocols/knxnetip/readwrite/model/CEMI.go  |  13 +-
 .../readwrite/model/CEMIAdditionalInformation.go   |  13 +-
 .../CEMIAdditionalInformationBusmonitorInfo.go     |  56 +--
 .../CEMIAdditionalInformationRelativeTimestamp.go  |  22 +-
 .../knxnetip/readwrite/model/ChannelInformation.go |  24 +-
 .../knxnetip/readwrite/model/ComObjectTable.go     |  11 +
 .../model/ComObjectTableRealisationType1.go        |  22 +-
 .../model/ComObjectTableRealisationType2.go        |  22 +-
 .../model/ComObjectTableRealisationType6.go        |  22 +-
 .../knxnetip/readwrite/model/ConnectionRequest.go  |  51 +-
 .../model/ConnectionRequestInformation.go          |  15 +-
 ...ConnectionRequestInformationDeviceManagement.go |   6 +
 ...ConnectionRequestInformationTunnelConnection.go |  22 +-
 .../knxnetip/readwrite/model/ConnectionResponse.go |  28 +-
 .../readwrite/model/ConnectionResponseDataBlock.go |  15 +-
 .../ConnectionResponseDataBlockDeviceManagement.go |   6 +
 .../ConnectionResponseDataBlockTunnelConnection.go |  22 +-
 .../readwrite/model/ConnectionStateRequest.go      |  30 +-
 .../readwrite/model/ConnectionStateResponse.go     |  31 +-
 .../knxnetip/readwrite/model/DIBDeviceInfo.go      | 100 ++--
 .../knxnetip/readwrite/model/DIBSuppSvcFamilies.go |  16 +-
 .../knxnetip/readwrite/model/DescriptionRequest.go |  23 +-
 .../readwrite/model/DescriptionResponse.go         |  37 +-
 .../readwrite/model/DeviceConfigurationAck.go      |  23 +-
 .../model/DeviceConfigurationAckDataBlock.go       |  38 +-
 .../readwrite/model/DeviceConfigurationRequest.go  |  37 +-
 .../model/DeviceConfigurationRequestDataBlock.go   |  26 +-
 .../readwrite/model/DeviceDescriptorType2.go       | 112 ++---
 .../knxnetip/readwrite/model/DeviceStatus.go       |  16 +-
 .../knxnetip/readwrite/model/DisconnectRequest.go  |  30 +-
 .../knxnetip/readwrite/model/DisconnectResponse.go |  31 +-
 .../model/GroupObjectDescriptorRealisationType1.go |  84 ++--
 .../model/GroupObjectDescriptorRealisationType2.go |  92 ++--
 .../model/GroupObjectDescriptorRealisationType6.go |   6 +
 .../model/GroupObjectDescriptorRealisationType7.go |  92 ++--
 .../model/GroupObjectDescriptorRealisationTypeB.go |  84 ++--
 .../readwrite/model/HPAIControlEndpoint.go         |  44 +-
 .../knxnetip/readwrite/model/HPAIDataEndpoint.go   |  44 +-
 .../readwrite/model/HPAIDiscoveryEndpoint.go       |  44 +-
 .../knxnetip/readwrite/model/IPAddress.go          |   6 +
 .../knxnetip/readwrite/model/KnxAddress.go         |  32 +-
 .../knxnetip/readwrite/model/KnxGroupAddress.go    |  11 +
 .../readwrite/model/KnxGroupAddress2Level.go       |  24 +-
 .../readwrite/model/KnxGroupAddress3Level.go       |  32 +-
 .../readwrite/model/KnxGroupAddressFreeLevel.go    |  16 +-
 .../knxnetip/readwrite/model/KnxNetIpCore.go       |  16 +-
 .../readwrite/model/KnxNetIpDeviceManagement.go    |  16 +-
 .../knxnetip/readwrite/model/KnxNetIpMessage.go    |  19 +-
 .../knxnetip/readwrite/model/KnxNetIpRouting.go    |  16 +-
 .../knxnetip/readwrite/model/KnxNetIpTunneling.go  |  16 +-
 .../knxnetip/readwrite/model/KnxNetObjectServer.go |  16 +-
 .../model/KnxNetRemoteConfigurationAndDiagnosis.go |  16 +-
 .../readwrite/model/KnxNetRemoteLogging.go         |  16 +-
 .../knxnetip/readwrite/model/LBusmonInd.go         |  30 +-
 .../protocols/knxnetip/readwrite/model/LDataCon.go |  28 +-
 .../knxnetip/readwrite/model/LDataExtended.go      |  60 +--
 .../knxnetip/readwrite/model/LDataFrame.go         |  57 +--
 .../knxnetip/readwrite/model/LDataFrameACK.go      |   6 +
 .../protocols/knxnetip/readwrite/model/LDataInd.go |  28 +-
 .../protocols/knxnetip/readwrite/model/LDataReq.go |  28 +-
 .../knxnetip/readwrite/model/LPollData.go          |  30 +-
 .../knxnetip/readwrite/model/LPollDataCon.go       |   6 +
 .../knxnetip/readwrite/model/LPollDataReq.go       |   6 +
 .../protocols/knxnetip/readwrite/model/LRawCon.go  |   6 +
 .../protocols/knxnetip/readwrite/model/LRawInd.go  |   6 +
 .../protocols/knxnetip/readwrite/model/LRawReq.go  |   6 +
 .../knxnetip/readwrite/model/MACAddress.go         |   6 +
 .../readwrite/model/MFuncPropCommandReq.go         |   6 +
 .../knxnetip/readwrite/model/MFuncPropCon.go       |   6 +
 .../readwrite/model/MFuncPropStateReadReq.go       |   6 +
 .../knxnetip/readwrite/model/MPropInfoInd.go       |   6 +
 .../knxnetip/readwrite/model/MPropReadCon.go       |  56 +--
 .../knxnetip/readwrite/model/MPropReadReq.go       |  48 +-
 .../knxnetip/readwrite/model/MPropWriteCon.go      |   6 +
 .../knxnetip/readwrite/model/MPropWriteReq.go      |   6 +
 .../knxnetip/readwrite/model/MResetInd.go          |   6 +
 .../knxnetip/readwrite/model/MResetReq.go          |   6 +
 .../model/ProjectInstallationIdentifier.go         |  24 +-
 .../knxnetip/readwrite/model/RelativeTimestamp.go  |  16 +-
 .../knxnetip/readwrite/model/RoutingIndication.go  |   6 +
 .../knxnetip/readwrite/model/SearchRequest.go      |  23 +-
 .../knxnetip/readwrite/model/SearchResponse.go     |  51 +-
 .../knxnetip/readwrite/model/ServiceId.go          |  13 +-
 .../knxnetip/readwrite/model/TDataConnectedInd.go  |   6 +
 .../knxnetip/readwrite/model/TDataConnectedReq.go  |   6 +
 .../knxnetip/readwrite/model/TDataIndividualInd.go |   6 +
 .../knxnetip/readwrite/model/TDataIndividualReq.go |   6 +
 .../knxnetip/readwrite/model/TunnelingRequest.go   |  37 +-
 .../readwrite/model/TunnelingRequestDataBlock.go   |  26 +-
 .../knxnetip/readwrite/model/TunnelingResponse.go  |  23 +-
 .../readwrite/model/TunnelingResponseDataBlock.go  |  38 +-
 .../knxnetip/readwrite/model/UnknownMessage.go     |   6 +
 .../protocols/modbus/readwrite/model/ModbusADU.go  |  11 +
 .../modbus/readwrite/model/ModbusAsciiADU.go       |  30 +-
 .../modbus/readwrite/model/ModbusConstants.go      |   8 +-
 .../model/ModbusDeviceInformationObject.go         |  16 +-
 .../protocols/modbus/readwrite/model/ModbusPDU.go  |  13 +-
 .../readwrite/model/ModbusPDUDiagnosticRequest.go  |  24 +-
 .../readwrite/model/ModbusPDUDiagnosticResponse.go |  24 +-
 .../modbus/readwrite/model/ModbusPDUError.go       |  22 +-
 .../model/ModbusPDUGetComEventCounterRequest.go    |   6 +
 .../model/ModbusPDUGetComEventCounterResponse.go   |  24 +-
 .../model/ModbusPDUGetComEventLogRequest.go        |   6 +
 .../model/ModbusPDUGetComEventLogResponse.go       |  32 +-
 .../ModbusPDUMaskWriteHoldingRegisterRequest.go    |  32 +-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.go   |  32 +-
 .../readwrite/model/ModbusPDUReadCoilsRequest.go   |  24 +-
 .../readwrite/model/ModbusPDUReadCoilsResponse.go  |   8 +-
 .../ModbusPDUReadDeviceIdentificationRequest.go    |  30 +-
 .../ModbusPDUReadDeviceIdentificationResponse.go   |  68 +--
 .../model/ModbusPDUReadDiscreteInputsRequest.go    |  24 +-
 .../model/ModbusPDUReadDiscreteInputsResponse.go   |   8 +-
 .../model/ModbusPDUReadExceptionStatusRequest.go   |   6 +
 .../model/ModbusPDUReadExceptionStatusResponse.go  |  16 +-
 .../model/ModbusPDUReadFifoQueueRequest.go         |  16 +-
 .../model/ModbusPDUReadFifoQueueResponse.go        |  12 +-
 .../model/ModbusPDUReadFileRecordRequest.go        |   8 +-
 .../model/ModbusPDUReadFileRecordRequestItem.go    |  40 +-
 .../model/ModbusPDUReadFileRecordResponse.go       |   8 +-
 .../model/ModbusPDUReadFileRecordResponseItem.go   |  16 +-
 .../model/ModbusPDUReadHoldingRegistersRequest.go  |  24 +-
 .../model/ModbusPDUReadHoldingRegistersResponse.go |   8 +-
 .../model/ModbusPDUReadInputRegistersRequest.go    |  24 +-
 .../model/ModbusPDUReadInputRegistersResponse.go   |   8 +-
 ...sPDUReadWriteMultipleHoldingRegistersRequest.go |  40 +-
 ...PDUReadWriteMultipleHoldingRegistersResponse.go |   8 +-
 .../model/ModbusPDUReportServerIdRequest.go        |   6 +
 .../model/ModbusPDUReportServerIdResponse.go       |   8 +-
 .../model/ModbusPDUWriteFileRecordRequest.go       |   8 +-
 .../model/ModbusPDUWriteFileRecordRequestItem.go   |  32 +-
 .../model/ModbusPDUWriteFileRecordResponse.go      |   8 +-
 .../model/ModbusPDUWriteFileRecordResponseItem.go  |  32 +-
 .../model/ModbusPDUWriteMultipleCoilsRequest.go    |  24 +-
 .../model/ModbusPDUWriteMultipleCoilsResponse.go   |  24 +-
 ...odbusPDUWriteMultipleHoldingRegistersRequest.go |  24 +-
 ...dbusPDUWriteMultipleHoldingRegistersResponse.go |  24 +-
 .../model/ModbusPDUWriteSingleCoilRequest.go       |  24 +-
 .../model/ModbusPDUWriteSingleCoilResponse.go      |  24 +-
 .../model/ModbusPDUWriteSingleRegisterRequest.go   |  24 +-
 .../model/ModbusPDUWriteSingleRegisterResponse.go  |  24 +-
 .../modbus/readwrite/model/ModbusRtuADU.go         |  30 +-
 .../modbus/readwrite/model/ModbusTcpADU.go         |  40 +-
 .../readwrite/model/ActivateSessionRequest.go      |  86 +---
 .../readwrite/model/ActivateSessionResponse.go     |  50 +-
 .../opcua/readwrite/model/AddNodesItem.go          | 106 ++--
 .../opcua/readwrite/model/AddNodesRequest.go       |  36 +-
 .../opcua/readwrite/model/AddNodesResponse.go      |  44 +-
 .../opcua/readwrite/model/AddNodesResult.go        |  36 +-
 .../opcua/readwrite/model/AddReferencesItem.go     |  86 +---
 .../opcua/readwrite/model/AddReferencesRequest.go  |  36 +-
 .../opcua/readwrite/model/AddReferencesResponse.go |  36 +-
 .../readwrite/model/AdditionalParametersType.go    |  22 +-
 .../readwrite/model/AggregateConfiguration.go      |  50 +-
 .../opcua/readwrite/model/AliasNameDataType.go     |  28 +-
 .../protocols/opcua/readwrite/model/Annotation.go  |  44 +-
 .../opcua/readwrite/model/AnnotationDataType.go    |  50 +-
 .../readwrite/model/AnonymousIdentityToken.go      |   6 +
 .../readwrite/model/ApplicationDescription.go      |  98 +---
 .../model/ApplicationInstanceCertificate.go        |   6 +
 plc4go/protocols/opcua/readwrite/model/Argument.go |  66 +--
 .../opcua/readwrite/model/AudioDataType.go         |   6 +
 .../opcua/readwrite/model/AxisInformation.go       |  72 +--
 .../opcua/readwrite/model/BinaryPayload.go         |   6 +
 .../opcua/readwrite/model/BitFieldDefinition.go    |  52 +-
 .../opcua/readwrite/model/BitFieldMaskDataType.go  |   6 +
 .../opcua/readwrite/model/BrowseDescription.go     |  74 +--
 .../opcua/readwrite/model/BrowseNextRequest.go     |  38 +-
 .../opcua/readwrite/model/BrowseNextResponse.go    |  44 +-
 .../protocols/opcua/readwrite/model/BrowsePath.go  |  36 +-
 .../opcua/readwrite/model/BrowsePathResult.go      |  36 +-
 .../opcua/readwrite/model/BrowsePathTarget.go      |  30 +-
 .../opcua/readwrite/model/BrowseRequest.go         |  58 +--
 .../opcua/readwrite/model/BrowseResponse.go        |  44 +-
 .../opcua/readwrite/model/BrowseResult.go          |  50 +-
 .../protocols/opcua/readwrite/model/BuildInfo.go   |  86 +---
 .../opcua/readwrite/model/ByteStringArray.go       |  16 +-
 .../opcua/readwrite/model/ByteStringNodeId.go      |  30 +-
 .../opcua/readwrite/model/CallMethodRequest.go     |  42 +-
 .../opcua/readwrite/model/CallMethodResult.go      |  44 +-
 .../protocols/opcua/readwrite/model/CallRequest.go |  36 +-
 .../opcua/readwrite/model/CallResponse.go          |  44 +-
 .../opcua/readwrite/model/CancelRequest.go         |  30 +-
 .../opcua/readwrite/model/CancelResponse.go        |  30 +-
 .../opcua/readwrite/model/CartesianCoordinates.go  |   6 +
 .../opcua/readwrite/model/ChannelSecurityToken.go  |  40 +-
 .../readwrite/model/CloseSecureChannelRequest.go   |  22 +-
 .../readwrite/model/CloseSecureChannelResponse.go  |  22 +-
 .../opcua/readwrite/model/CloseSessionRequest.go   |  30 +-
 .../opcua/readwrite/model/CloseSessionResponse.go  |  22 +-
 .../opcua/readwrite/model/ComplexNumberType.go     |  24 +-
 .../model/ConfigurationVersionDataType.go          |  24 +-
 .../readwrite/model/ConnectionTransportDataType.go |   6 +
 .../opcua/readwrite/model/ContentFilter.go         |  22 +-
 .../opcua/readwrite/model/ContentFilterElement.go  |  36 +-
 .../readwrite/model/ContentFilterElementResult.go  |  36 +-
 .../opcua/readwrite/model/ContentFilterResult.go   |  30 +-
 .../opcua/readwrite/model/ContinuationPoint.go     |   6 +
 plc4go/protocols/opcua/readwrite/model/Counter.go  |   6 +
 .../readwrite/model/CreateMonitoredItemsRequest.go |  58 +--
 .../model/CreateMonitoredItemsResponse.go          |  44 +-
 .../opcua/readwrite/model/CreateSessionRequest.go  | 122 ++---
 .../opcua/readwrite/model/CreateSessionResponse.go | 138 ++---
 .../readwrite/model/CreateSubscriptionRequest.go   |  70 ++-
 .../readwrite/model/CreateSubscriptionResponse.go  |  54 +-
 .../opcua/readwrite/model/CurrencyUnitType.go      |  52 +-
 .../readwrite/model/DataChangeNotification.go      |  32 +-
 .../model/DataSetReaderMessageDataType.go          |   6 +
 .../model/DataSetReaderTransportDataType.go        |   6 +
 .../opcua/readwrite/model/DataSetWriterDataType.go | 118 ++---
 .../model/DataSetWriterMessageDataType.go          |   6 +
 .../model/DataSetWriterTransportDataType.go        |   6 +
 .../opcua/readwrite/model/DataTypeDefinition.go    |   6 +
 .../opcua/readwrite/model/DataTypeDescription.go   |  36 +-
 .../opcua/readwrite/model/DataTypeSchemaHeader.go  |  62 +--
 .../protocols/opcua/readwrite/model/DataValue.go   |  64 ++-
 .../protocols/opcua/readwrite/model/DateString.go  |   6 +
 .../opcua/readwrite/model/DecimalString.go         |   6 +
 .../readwrite/model/DeleteMonitoredItemsRequest.go |  38 +-
 .../model/DeleteMonitoredItemsResponse.go          |  36 +-
 .../opcua/readwrite/model/DeleteNodesItem.go       |  30 +-
 .../opcua/readwrite/model/DeleteNodesRequest.go    |  36 +-
 .../opcua/readwrite/model/DeleteNodesResponse.go   |  36 +-
 .../opcua/readwrite/model/DeleteReferencesItem.go  |  68 +--
 .../readwrite/model/DeleteReferencesRequest.go     |  36 +-
 .../readwrite/model/DeleteReferencesResponse.go    |  36 +-
 .../readwrite/model/DeleteSubscriptionsRequest.go  |  30 +-
 .../readwrite/model/DeleteSubscriptionsResponse.go |  36 +-
 .../opcua/readwrite/model/DiagnosticInfo.go        |  70 ++-
 .../readwrite/model/DiscoveryConfiguration.go      |   6 +
 .../readwrite/model/DoubleComplexNumberType.go     |  24 +-
 .../opcua/readwrite/model/DurationString.go        |   6 +
 .../opcua/readwrite/model/EUInformation.go         |  58 +--
 .../opcua/readwrite/model/EccEncryptedSecret.go    |   6 +
 .../opcua/readwrite/model/EncodedTicket.go         |   6 +
 .../opcua/readwrite/model/EndpointConfiguration.go |  80 ++-
 .../opcua/readwrite/model/EndpointDescription.go   | 114 ++---
 .../opcua/readwrite/model/EndpointType.go          |  64 +--
 .../readwrite/model/EndpointUrlListDataType.go     |  14 +-
 .../opcua/readwrite/model/EnumValueType.go         |  44 +-
 .../opcua/readwrite/model/EphemeralKeyType.go      |  36 +-
 .../opcua/readwrite/model/EventFieldList.go        |  22 +-
 .../opcua/readwrite/model/EventNotificationList.go |  24 +-
 .../opcua/readwrite/model/ExpandedNodeId.go        |  38 +-
 .../opcua/readwrite/model/ExtensiblePayload.go     |  22 +-
 .../opcua/readwrite/model/ExtensionHeader.go       |  24 +-
 .../opcua/readwrite/model/ExtensionObject.go       |  34 +-
 .../readwrite/model/ExtensionObjectDefinition.go   |  11 +
 .../readwrite/model/ExtensionObjectEncodingMask.go |  32 +-
 .../opcua/readwrite/model/FieldMetaData.go         | 126 ++---
 .../opcua/readwrite/model/FieldTargetDataType.go   | 100 ++--
 .../opcua/readwrite/model/FilterOperand.go         |   6 +
 .../readwrite/model/FindServersOnNetworkRequest.go |  44 +-
 .../model/FindServersOnNetworkResponse.go          |  44 +-
 .../opcua/readwrite/model/FindServersRequest.go    |  50 +-
 .../opcua/readwrite/model/FindServersResponse.go   |  36 +-
 .../opcua/readwrite/model/FourByteNodeId.go        |  24 +-
 plc4go/protocols/opcua/readwrite/model/Frame.go    |   6 +
 .../opcua/readwrite/model/GenericAttributeValue.go |  30 +-
 .../opcua/readwrite/model/GetEndpointsRequest.go   |  50 +-
 .../opcua/readwrite/model/GetEndpointsResponse.go  |  36 +-
 .../protocols/opcua/readwrite/model/GuidNodeId.go  |  30 +-
 .../protocols/opcua/readwrite/model/GuidValue.go   |  32 +-
 plc4go/protocols/opcua/readwrite/model/Handle.go   |   6 +
 .../protocols/opcua/readwrite/model/HistoryData.go |  14 +-
 .../opcua/readwrite/model/HistoryEvent.go          |  22 +-
 .../opcua/readwrite/model/HistoryEventFieldList.go |  14 +-
 .../opcua/readwrite/model/HistoryReadDetails.go    |   6 +
 .../opcua/readwrite/model/HistoryReadRequest.go    |  74 +--
 .../opcua/readwrite/model/HistoryReadResponse.go   |  44 +-
 .../opcua/readwrite/model/HistoryReadResult.go     |  50 +-
 .../opcua/readwrite/model/HistoryReadValueId.go    |  64 +--
 .../opcua/readwrite/model/HistoryUpdateDetails.go  |   6 +
 .../opcua/readwrite/model/HistoryUpdateRequest.go  |  36 +-
 .../opcua/readwrite/model/HistoryUpdateResponse.go |  44 +-
 .../opcua/readwrite/model/HistoryUpdateResult.go   |  36 +-
 .../readwrite/model/IdentityMappingRuleType.go     |  36 +-
 plc4go/protocols/opcua/readwrite/model/ImageBMP.go |   6 +
 plc4go/protocols/opcua/readwrite/model/ImageGIF.go |   6 +
 plc4go/protocols/opcua/readwrite/model/ImageJPG.go |   6 +
 plc4go/protocols/opcua/readwrite/model/ImagePNG.go |   6 +
 plc4go/protocols/opcua/readwrite/model/Index.go    |   6 +
 .../protocols/opcua/readwrite/model/IntegerId.go   |   6 +
 .../opcua/readwrite/model/IssuedIdentityToken.go   |  36 +-
 .../opcua/readwrite/model/KeyValuePair.go          |  36 +-
 .../readwrite/model/LinearConversionDataType.go    |  40 +-
 plc4go/protocols/opcua/readwrite/model/LocaleId.go |   6 +
 .../opcua/readwrite/model/LocalizedText.go         |  24 +-
 .../protocols/opcua/readwrite/model/MessagePDU.go  |  29 +-
 .../model/ModelChangeStructureDataType.go          |  44 +-
 .../opcua/readwrite/model/ModificationInfo.go      |  44 +-
 .../readwrite/model/ModifyMonitoredItemsRequest.go |  58 +--
 .../model/ModifyMonitoredItemsResponse.go          |  44 +-
 .../readwrite/model/ModifySubscriptionRequest.go   |  70 ++-
 .../readwrite/model/ModifySubscriptionResponse.go  |  46 +-
 .../readwrite/model/MonitoredItemCreateRequest.go  |  50 +-
 .../readwrite/model/MonitoredItemCreateResult.go   |  60 +--
 .../readwrite/model/MonitoredItemModifyRequest.go  |  30 +-
 .../readwrite/model/MonitoredItemModifyResult.go   |  52 +-
 .../readwrite/model/MonitoredItemNotification.go   |  30 +-
 .../opcua/readwrite/model/MonitoringFilter.go      |   6 +
 .../readwrite/model/MonitoringFilterResult.go      |   6 +
 .../opcua/readwrite/model/MonitoringParameters.go  |  54 +-
 .../readwrite/model/NetworkAddressDataType.go      |  22 +-
 .../opcua/readwrite/model/NetworkGroupDataType.go  |  36 +-
 .../opcua/readwrite/model/NodeAttributes.go        |  60 +--
 plc4go/protocols/opcua/readwrite/model/NodeId.go   |  22 +-
 .../opcua/readwrite/model/NodeIdByteString.go      |  30 +-
 .../opcua/readwrite/model/NodeIdFourByte.go        |  24 +-
 .../protocols/opcua/readwrite/model/NodeIdGuid.go  |  16 +-
 .../opcua/readwrite/model/NodeIdNumeric.go         |  24 +-
 .../opcua/readwrite/model/NodeIdString.go          |  30 +-
 .../opcua/readwrite/model/NodeIdTwoByte.go         |  16 +-
 .../opcua/readwrite/model/NodeIdTypeDefinition.go  |  13 +-
 .../opcua/readwrite/model/NodeReference.go         |  52 +-
 .../opcua/readwrite/model/NodeTypeDescription.go   |  46 +-
 .../opcua/readwrite/model/NormalizedString.go      |   6 +
 .../opcua/readwrite/model/NotificationData.go      |   6 +
 .../opcua/readwrite/model/NotificationMessage.go   |  38 +-
 .../opcua/readwrite/model/NullExtension.go         |   6 +
 .../opcua/readwrite/model/NumericNodeId.go         |  24 +-
 .../opcua/readwrite/model/NumericRange.go          |   6 +
 plc4go/protocols/opcua/readwrite/model/OpcuaAPU.go |  23 +-
 .../readwrite/model/OpcuaAcknowledgeResponse.go    |  30 +-
 .../opcua/readwrite/model/OpcuaCloseRequest.go     |  36 +-
 .../opcua/readwrite/model/OpcuaConstants.go        |   8 +-
 .../opcua/readwrite/model/OpcuaHelloRequest.go     |  44 +-
 .../opcua/readwrite/model/OpcuaMessageError.go     |  36 +-
 .../opcua/readwrite/model/OpcuaMessageRequest.go   |  36 +-
 .../opcua/readwrite/model/OpcuaMessageResponse.go  |  36 +-
 .../opcua/readwrite/model/OpcuaOpenRequest.go      |  36 +-
 .../opcua/readwrite/model/OpcuaOpenResponse.go     |  36 +-
 .../opcua/readwrite/model/OpcuaProtocolLimits.go   |  40 +-
 .../protocols/opcua/readwrite/model/OpcuaVector.go |   6 +
 .../opcua/readwrite/model/OpenChannelMessage.go    |  11 +
 .../readwrite/model/OpenChannelMessageRequest.go   |  58 +--
 .../readwrite/model/OpenChannelMessageResponse.go  |  58 +--
 .../readwrite/model/OpenSecureChannelRequest.go    |  80 +--
 .../readwrite/model/OpenSecureChannelResponse.go   |  58 +--
 .../protocols/opcua/readwrite/model/OptionSet.go   |  36 +-
 .../protocols/opcua/readwrite/model/Orientation.go |   6 +
 .../opcua/readwrite/model/ParsingResult.go         |  36 +-
 .../opcua/readwrite/model/PascalByteString.go      |  16 +-
 .../opcua/readwrite/model/PascalString.go          |  16 +-
 plc4go/protocols/opcua/readwrite/model/Payload.go  |  27 +-
 .../opcua/readwrite/model/PortableQualifiedName.go |  36 +-
 .../readwrite/model/PriorityMappingEntryType.go    |  52 +-
 .../readwrite/model/ProgramDiagnostic2DataType.go  | 148 ++----
 .../readwrite/model/ProgramDiagnosticDataType.go   | 132 ++---
 .../readwrite/model/PubSubConfigurationDataType.go |  48 +-
 .../model/PubSubConfigurationRefDataType.go        |  46 +-
 .../readwrite/model/PubSubConnectionDataType.go    | 134 ++---
 .../opcua/readwrite/model/PubSubGroupDataType.go   |  98 ++--
 .../readwrite/model/PubSubKeyPushTargetDataType.go | 110 ++--
 .../opcua/readwrite/model/PublishRequest.go        |  36 +-
 .../opcua/readwrite/model/PublishResponse.go       |  78 ++-
 .../model/PublishedDataSetSourceDataType.go        |   6 +
 .../readwrite/model/PublishedVariableDataType.go   |  88 ++--
 .../protocols/opcua/readwrite/model/QosDataType.go |   6 +
 .../opcua/readwrite/model/QualifiedName.go         |  30 +-
 .../opcua/readwrite/model/QuantityDimension.go     |  72 ++-
 .../opcua/readwrite/model/QueryDataDescription.go  |  44 +-
 .../opcua/readwrite/model/QueryDataSet.go          |  42 +-
 .../opcua/readwrite/model/QueryFirstRequest.go     |  80 +--
 .../opcua/readwrite/model/QueryFirstResponse.go    |  88 +---
 .../opcua/readwrite/model/QueryNextRequest.go      |  44 +-
 .../opcua/readwrite/model/QueryNextResponse.go     |  50 +-
 plc4go/protocols/opcua/readwrite/model/Range.go    |  24 +-
 .../opcua/readwrite/model/RationalNumber.go        |  24 +-
 .../protocols/opcua/readwrite/model/ReadRequest.go |  58 +--
 .../opcua/readwrite/model/ReadResponse.go          |  36 +-
 .../protocols/opcua/readwrite/model/ReadValueId.go |  58 +--
 .../readwrite/model/ReaderGroupMessageDataType.go  |   6 +
 .../model/ReaderGroupTransportDataType.go          |   6 +
 .../readwrite/model/RedundantServerDataType.go     |  44 +-
 .../opcua/readwrite/model/ReferenceDescription.go  | 100 ++--
 .../model/ReferenceDescriptionDataType.go          |  58 +--
 .../readwrite/model/ReferenceListEntryDataType.go  |  44 +-
 .../opcua/readwrite/model/RegisterNodesRequest.go  |  28 +-
 .../opcua/readwrite/model/RegisterNodesResponse.go |  28 +-
 .../readwrite/model/RegisterServer2Request.go      |  50 +-
 .../readwrite/model/RegisterServer2Response.go     |  36 +-
 .../opcua/readwrite/model/RegisterServerRequest.go |  36 +-
 .../readwrite/model/RegisterServerResponse.go      |  22 +-
 .../opcua/readwrite/model/RegisteredServer.go      | 102 ++--
 .../opcua/readwrite/model/RelativePath.go          |  22 +-
 .../opcua/readwrite/model/RelativePathElement.go   |  52 +-
 .../opcua/readwrite/model/RepublishRequest.go      |  38 +-
 .../opcua/readwrite/model/RepublishResponse.go     |  36 +-
 .../opcua/readwrite/model/RequestHeader.go         |  82 ++-
 .../opcua/readwrite/model/ResponseHeader.go        |  72 +--
 .../opcua/readwrite/model/RolePermissionType.go    |  36 +-
 .../opcua/readwrite/model/RsaEncryptedSecret.go    |   6 +
 .../model/SamplingIntervalDiagnosticsDataType.go   |  40 +-
 .../opcua/readwrite/model/SecurityGroupDataType.go | 112 ++---
 .../opcua/readwrite/model/SecurityHeader.go        |  24 +-
 .../model/SemanticChangeStructureDataType.go       |  36 +-
 .../opcua/readwrite/model/SemanticVersionString.go |   6 +
 .../opcua/readwrite/model/SequenceHeader.go        |  24 +-
 .../model/ServerDiagnosticsSummaryDataType.go      | 104 ++--
 .../opcua/readwrite/model/ServerOnNetwork.go       |  50 +-
 .../opcua/readwrite/model/ServerStatusDataType.go  |  74 +--
 .../readwrite/model/ServiceCounterDataType.go      |  24 +-
 .../opcua/readwrite/model/ServiceFault.go          |  22 +-
 .../readwrite/model/SessionAuthenticationToken.go  |   6 +
 .../readwrite/model/SessionDiagnosticsDataType.go  | 554 +++++----------------
 .../model/SessionSecurityDiagnosticsDataType.go    | 126 ++---
 .../model/SessionlessInvokeRequestType.go          |  46 +-
 .../model/SessionlessInvokeResponseType.go         |  30 +-
 .../readwrite/model/SetMonitoringModeRequest.go    |  52 +-
 .../readwrite/model/SetMonitoringModeResponse.go   |  36 +-
 .../readwrite/model/SetPublishingModeRequest.go    |  40 +-
 .../readwrite/model/SetPublishingModeResponse.go   |  36 +-
 .../opcua/readwrite/model/SetTriggeringRequest.go  |  56 +--
 .../opcua/readwrite/model/SetTriggeringResponse.go |  52 +-
 .../opcua/readwrite/model/SignatureData.go         |  36 +-
 .../readwrite/model/SignedSoftwareCertificate.go   |  36 +-
 .../readwrite/model/StatusChangeNotification.go    |  36 +-
 .../protocols/opcua/readwrite/model/StatusCode.go  |  16 +-
 .../opcua/readwrite/model/StatusResult.go          |  36 +-
 .../opcua/readwrite/model/StringNodeId.go          |  30 +-
 .../protocols/opcua/readwrite/model/Structure.go   |   6 +
 .../opcua/readwrite/model/StructureField.go        |  84 ++--
 .../readwrite/model/SubscribedDataSetDataType.go   |   6 +
 .../readwrite/model/SubscriptionAcknowledgement.go |  24 +-
 .../model/SubscriptionDiagnosticsDataType.go       | 262 ++++------
 .../protocols/opcua/readwrite/model/TimeString.go  |   6 +
 .../opcua/readwrite/model/TimeZoneDataType.go      |  24 +-
 .../opcua/readwrite/model/TransactionErrorType.go  |  50 +-
 .../opcua/readwrite/model/TransferResult.go        |  30 +-
 .../model/TransferSubscriptionsRequest.go          |  40 +-
 .../model/TransferSubscriptionsResponse.go         |  44 +-
 .../model/TranslateBrowsePathsToNodeIdsRequest.go  |  36 +-
 .../model/TranslateBrowsePathsToNodeIdsResponse.go |  44 +-
 .../opcua/readwrite/model/TrimmedString.go         |   6 +
 .../opcua/readwrite/model/TrustListDataType.go     |  46 +-
 .../opcua/readwrite/model/TwoByteNodeId.go         |  16 +-
 plc4go/protocols/opcua/readwrite/model/Union.go    |   6 +
 .../readwrite/model/UnregisterNodesRequest.go      |  28 +-
 .../readwrite/model/UnregisterNodesResponse.go     |  22 +-
 .../readwrite/model/UnsignedRationalNumber.go      |  24 +-
 .../protocols/opcua/readwrite/model/UriString.go   |   6 +
 .../opcua/readwrite/model/UserIdentityToken.go     |  36 +-
 .../readwrite/model/UserIdentityTokenDefinition.go |  11 +
 .../readwrite/model/UserManagementDataType.go      |  50 +-
 .../opcua/readwrite/model/UserNameIdentityToken.go |  50 +-
 .../opcua/readwrite/model/UserTokenPolicy.go       |  78 +--
 plc4go/protocols/opcua/readwrite/model/UtcTime.go  |   6 +
 plc4go/protocols/opcua/readwrite/model/Variant.go  |  31 +-
 .../opcua/readwrite/model/VariantBoolean.go        |   8 +-
 .../protocols/opcua/readwrite/model/VariantByte.go |  10 +-
 .../opcua/readwrite/model/VariantByteString.go     |   8 +-
 .../opcua/readwrite/model/VariantDataValue.go      |   8 +-
 .../opcua/readwrite/model/VariantDateTime.go       |  10 +-
 .../opcua/readwrite/model/VariantDiagnosticInfo.go |   8 +-
 .../opcua/readwrite/model/VariantDouble.go         |  10 +-
 .../opcua/readwrite/model/VariantExpandedNodeId.go |   8 +-
 .../readwrite/model/VariantExtensionObject.go      |  16 +-
 .../opcua/readwrite/model/VariantFloat.go          |  10 +-
 .../protocols/opcua/readwrite/model/VariantGuid.go |   8 +-
 .../opcua/readwrite/model/VariantInt16.go          |  10 +-
 .../opcua/readwrite/model/VariantInt32.go          |  10 +-
 .../opcua/readwrite/model/VariantInt64.go          |  10 +-
 .../opcua/readwrite/model/VariantLocalizedText.go  |   8 +-
 .../opcua/readwrite/model/VariantNodeId.go         |   8 +-
 .../protocols/opcua/readwrite/model/VariantNull.go |   6 +
 .../opcua/readwrite/model/VariantQualifiedName.go  |   8 +-
 .../opcua/readwrite/model/VariantSByte.go          |   8 +-
 .../opcua/readwrite/model/VariantStatusCode.go     |   8 +-
 .../opcua/readwrite/model/VariantString.go         |   8 +-
 .../opcua/readwrite/model/VariantUInt16.go         |  10 +-
 .../opcua/readwrite/model/VariantUInt32.go         |  10 +-
 .../opcua/readwrite/model/VariantUInt64.go         |  10 +-
 .../opcua/readwrite/model/VariantVariant.go        |   8 +-
 .../opcua/readwrite/model/VariantXmlElement.go     |   8 +-
 .../protocols/opcua/readwrite/model/VersionTime.go |   6 +
 .../opcua/readwrite/model/ViewDescription.go       |  38 +-
 .../opcua/readwrite/model/WriteRequest.go          |  36 +-
 .../opcua/readwrite/model/WriteResponse.go         |  36 +-
 .../protocols/opcua/readwrite/model/WriteValue.go  |  58 +--
 .../readwrite/model/WriterGroupMessageDataType.go  |   6 +
 .../model/WriterGroupTransportDataType.go          |   6 +
 .../opcua/readwrite/model/X509IdentityToken.go     |  22 +-
 plc4go/protocols/opcua/readwrite/model/XVType.go   |  24 +-
 .../protocols/opcua/readwrite/model/XmlElement.go  |  16 +-
 .../s7/readwrite/model/Alarm8MessageQueryType.go   |  58 +--
 .../model/AlarmMessageAckObjectPushType.go         |  74 +--
 .../s7/readwrite/model/AlarmMessageAckPushType.go  |  36 +-
 .../readwrite/model/AlarmMessageAckResponseType.go |  24 +-
 .../s7/readwrite/model/AlarmMessageAckType.go      |  22 +-
 .../readwrite/model/AlarmMessageObjectAckType.go   |  68 +--
 .../readwrite/model/AlarmMessageObjectPushType.go  | 102 ++--
 .../readwrite/model/AlarmMessageObjectQueryType.go | 116 ++---
 .../s7/readwrite/model/AlarmMessagePushType.go     |  36 +-
 .../s7/readwrite/model/AlarmMessageQueryType.go    |  52 +-
 .../s7/readwrite/model/AssociatedQueryValueType.go |  44 +-
 .../s7/readwrite/model/AssociatedValueType.go      |  36 +-
 plc4go/protocols/s7/readwrite/model/COTPPacket.go  |  23 +-
 .../readwrite/model/COTPPacketConnectionRequest.go |  38 +-
 .../model/COTPPacketConnectionResponse.go          |  38 +-
 .../protocols/s7/readwrite/model/COTPPacketData.go |  24 +-
 .../readwrite/model/COTPPacketDisconnectRequest.go |  38 +-
 .../model/COTPPacketDisconnectResponse.go          |  24 +-
 .../s7/readwrite/model/COTPPacketTpduError.go      |  24 +-
 .../protocols/s7/readwrite/model/COTPParameter.go  |  15 +-
 .../s7/readwrite/model/COTPParameterCalledTsap.go  |  16 +-
 .../s7/readwrite/model/COTPParameterCallingTsap.go |  16 +-
 .../s7/readwrite/model/COTPParameterChecksum.go    |  16 +-
 ...COTPParameterDisconnectAdditionalInformation.go |   6 +
 .../s7/readwrite/model/COTPParameterTpduSize.go    |  22 +-
 .../s7/readwrite/model/CycServiceItemAnyType.go    |  46 +-
 .../s7/readwrite/model/CycServiceItemDbReadType.go |  14 +-
 .../s7/readwrite/model/CycServiceItemType.go       |  29 +-
 plc4go/protocols/s7/readwrite/model/DateAndTime.go |  73 ++-
 plc4go/protocols/s7/readwrite/model/S7Address.go   |  13 +-
 .../protocols/s7/readwrite/model/S7AddressAny.go   |  56 +--
 .../s7/readwrite/model/S7DataAlarmMessage.go       |  15 +-
 plc4go/protocols/s7/readwrite/model/S7Message.go   |  45 +-
 .../s7/readwrite/model/S7MessageObjectRequest.go   |  56 +--
 .../s7/readwrite/model/S7MessageObjectResponse.go  |  36 +-
 .../s7/readwrite/model/S7MessageRequest.go         |   6 +
 .../s7/readwrite/model/S7MessageResponse.go        |  24 +-
 .../s7/readwrite/model/S7MessageResponseData.go    |  24 +-
 .../s7/readwrite/model/S7MessageUserData.go        |   6 +
 plc4go/protocols/s7/readwrite/model/S7Parameter.go |  13 +-
 .../readwrite/model/S7ParameterModeTransition.go   |  50 +-
 .../readwrite/model/S7ParameterReadVarRequest.go   |   8 +-
 .../readwrite/model/S7ParameterReadVarResponse.go  |  16 +-
 .../model/S7ParameterSetupCommunication.go         |  32 +-
 .../s7/readwrite/model/S7ParameterUserData.go      |   8 +-
 .../s7/readwrite/model/S7ParameterUserDataItem.go  |  13 +-
 .../model/S7ParameterUserDataItemCPUFunctions.go   |  54 +-
 .../readwrite/model/S7ParameterWriteVarRequest.go  |   8 +-
 .../readwrite/model/S7ParameterWriteVarResponse.go |  16 +-
 plc4go/protocols/s7/readwrite/model/S7Payload.go   |  11 +
 .../s7/readwrite/model/S7PayloadAlarm8.go          |  22 +-
 .../s7/readwrite/model/S7PayloadAlarmAckInd.go     |  22 +-
 .../s7/readwrite/model/S7PayloadAlarmS.go          |  22 +-
 .../s7/readwrite/model/S7PayloadAlarmSC.go         |  22 +-
 .../s7/readwrite/model/S7PayloadAlarmSQ.go         |  22 +-
 .../readwrite/model/S7PayloadDiagnosticMessage.go  |  70 ++-
 .../s7/readwrite/model/S7PayloadNotify.go          |  22 +-
 .../s7/readwrite/model/S7PayloadNotify8.go         |  22 +-
 .../s7/readwrite/model/S7PayloadReadVarResponse.go |   6 +
 .../s7/readwrite/model/S7PayloadUserData.go        |  14 +-
 .../s7/readwrite/model/S7PayloadUserDataItem.go    |  49 +-
 .../model/S7PayloadUserDataItemClkFRequest.go      |   6 +
 .../model/S7PayloadUserDataItemClkFResponse.go     |  38 +-
 .../model/S7PayloadUserDataItemClkRequest.go       |   6 +
 .../model/S7PayloadUserDataItemClkResponse.go      |  38 +-
 .../model/S7PayloadUserDataItemClkSetRequest.go    |  24 +-
 .../model/S7PayloadUserDataItemClkSetResponse.go   |   6 +
 ...UserDataItemCpuFunctionAlarmAckErrorResponse.go |   6 +
 ...ayloadUserDataItemCpuFunctionAlarmAckRequest.go |  10 +-
 ...yloadUserDataItemCpuFunctionAlarmAckResponse.go |  18 +-
 ...loadUserDataItemCpuFunctionAlarmQueryRequest.go |  60 +--
 ...oadUserDataItemCpuFunctionAlarmQueryResponse.go |   6 +
 ...aItemCpuFunctionMsgSubscriptionAlarmResponse.go |  54 +-
 ...serDataItemCpuFunctionMsgSubscriptionRequest.go |  28 +-
 ...erDataItemCpuFunctionMsgSubscriptionResponse.go |   6 +
 ...ataItemCpuFunctionMsgSubscriptionSysResponse.go |  24 +-
 ...dUserDataItemCpuFunctionReadSzlNoDataRequest.go |   6 +
 ...PayloadUserDataItemCpuFunctionReadSzlRequest.go |  30 +-
 ...ayloadUserDataItemCpuFunctionReadSzlResponse.go |   6 +
 ...adUserDataItemCyclicServicesChangeDrivenPush.go |  14 +-
 ...mCyclicServicesChangeDrivenSubscribeResponse.go |  14 +-
 ...yloadUserDataItemCyclicServicesErrorResponse.go |   6 +
 .../S7PayloadUserDataItemCyclicServicesPush.go     |  14 +-
 ...adUserDataItemCyclicServicesSubscribeRequest.go |  36 +-
 ...dUserDataItemCyclicServicesSubscribeResponse.go |  14 +-
 ...UserDataItemCyclicServicesUnsubscribeRequest.go |  24 +-
 ...serDataItemCyclicServicesUnsubscribeResponse.go |   6 +
 .../s7/readwrite/model/S7PayloadWriteVarRequest.go |   6 +
 .../readwrite/model/S7PayloadWriteVarResponse.go   |   6 +
 .../s7/readwrite/model/S7VarPayloadDataItem.go     |  38 +-
 .../s7/readwrite/model/S7VarPayloadStatusItem.go   |  22 +-
 .../readwrite/model/S7VarRequestParameterItem.go   |  13 +-
 .../model/S7VarRequestParameterItemAddress.go      |  22 +-
 plc4go/protocols/s7/readwrite/model/State.go       |  72 ++-
 plc4go/protocols/s7/readwrite/model/SubItem.go     |  32 +-
 .../s7/readwrite/model/SzlDataTreeItem.go          |  40 +-
 plc4go/protocols/s7/readwrite/model/SzlId.go       |  44 +-
 plc4go/protocols/s7/readwrite/model/TPKTPacket.go  |  26 +-
 .../protocols/simulated/readwrite/model/Dummy.go   |  17 +-
 2483 files changed, 30455 insertions(+), 35972 deletions(-)

diff --git a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
index 6ea47b9266..879a95003e 100644
--- a/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
+++ b/code-generation/language-go/src/main/java/org/apache/plc4x/language/go/GoLanguageTemplateHelper.java
@@ -464,9 +464,11 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             }
             String paramsStringString = paramsString.toString();
             if (StringUtils.isNotBlank(paramsStringString) || typeDefinition.isDiscriminatedChildTypeDefinition()) { // In this case we need to spell the function out
-                return "ReadComplex[" + typeName + "](func(ctx context.Context, buffer utils.ReadBuffer) (" + typeName + ", error) " +
-                    "{v,err:= " + parserCallString + "ParseWithBuffer(ctx,readBuffer" + paramsString + ");" +
-                    "if err!=nil{return nil,err};return v.(" + typeName + "),nil}, readBuffer)";
+                String genericTypeParam = "";
+                if (typeDefinition.isDiscriminatedParentTypeDefinition()) {
+                    genericTypeParam = "["+typeName+"]";
+                }
+                return "ReadComplex[" + typeName + "](" + parserCallString + "ParseWithBufferProducer" + genericTypeParam + "(" + StringUtils.substring(paramsStringString, 2) + "), readBuffer)";
             } else {
                 return "ReadComplex[" + typeName + "](" + parserCallString + "ParseWithBuffer, readBuffer)";
             }
@@ -484,26 +486,26 @@ public class GoLanguageTemplateHelper extends BaseFreemarkerLanguageTemplateHelp
             case BYTE:
                 return "ReadByte(readBuffer, " + sizeInBits + ")";
             case UINT:
-                if (sizeInBits <= 8) return "ReadUnsignedByte(readBuffer, " + sizeInBits + ")";
-                if (sizeInBits <= 16) return "ReadUnsignedShort(readBuffer, " + sizeInBits + ")";
-                if (sizeInBits <= 32) return "ReadUnsignedInt(readBuffer, " + sizeInBits + ")";
-                if (sizeInBits <= 64) return "ReadUnsignedLong(readBuffer, " + sizeInBits + ")";
-                return "ReadUnsignedBigInteger(readBuffer, " + sizeInBits + ")";
+                if (sizeInBits <= 8) return "ReadUnsignedByte(readBuffer, uint8(" + sizeInBits + "))";
+                if (sizeInBits <= 16) return "ReadUnsignedShort(readBuffer, uint8(" + sizeInBits + "))";
+                if (sizeInBits <= 32) return "ReadUnsignedInt(readBuffer, uint8(" + sizeInBits + "))";
+                if (sizeInBits <= 64) return "ReadUnsignedLong(readBuffer, uint8(" + sizeInBits + "))";
+                return "ReadUnsignedBigInteger(readBuffer, uint8(" + sizeInBits + "))";
             case INT:
-                if (sizeInBits <= 8) return "ReadSignedByte(readBuffer, " + sizeInBits + ")";
-                if (sizeInBits <= 16) return "ReadSignedShort(readBuffer, " + sizeInBits + ")";
-                if (sizeInBits <= 32) return "ReadSignedInt(readBuffer, " + sizeInBits + ")";
-                if (sizeInBits <= 64) return "ReadSignedLong(readBuffer, " + sizeInBits + ")";
-                return "ReadSignedBigInteger(readBuffer, " + sizeInBits + ")";
+                if (sizeInBits <= 8) return "ReadSignedByte(readBuffer, uint8(" + sizeInBits + "))";
+                if (sizeInBits <= 16) return "ReadSignedShort(readBuffer, uint8(" + sizeInBits + "))";
+                if (sizeInBits <= 32) return "ReadSignedInt(readBuffer, uint8(" + sizeInBits + "))";
+                if (sizeInBits <= 64) return "ReadSignedLong(readBuffer, uint8(" + sizeInBits + "))";
+                return "ReadSignedBigInteger(readBuffer, uint8(" + sizeInBits + "))";
             case FLOAT:
-                if (sizeInBits <= 32) return "ReadFloat(readBuffer, " + sizeInBits + ")";
-                if (sizeInBits <= 64) return "ReadDouble(readBuffer, " + sizeInBits + ")";
-                return "ReadBigDecimal(readBuffer, " + sizeInBits + ")";
+                if (sizeInBits <= 32) return "ReadFloat(readBuffer, uint8(" + sizeInBits + "))";
+                if (sizeInBits <= 64) return "ReadDouble(readBuffer, uint8(" + sizeInBits + "))";
+                return "ReadBigDecimal(readBuffer, uint8(" + sizeInBits + "))";
             case STRING:
-                return "ReadString(readBuffer, " + sizeInBits + ")";
+                return "ReadString(readBuffer, uint32(" + sizeInBits + "))";
             case VSTRING:
                 VstringTypeReference vstringTypeReference = (VstringTypeReference) simpleTypeReference;
-                return "ReadString(readBuffer, " + toParseExpression(null, INT_TYPE_REFERENCE, vstringTypeReference.getLengthExpression(), null) + ")";
+                return "ReadString(readBuffer, uint32(" + toParseExpression(null, INT_TYPE_REFERENCE, vstringTypeReference.getLengthExpression(), null) + "))";
             case TIME:
                 return "ReadTime(readBuffer)";
             case DATE:
diff --git a/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh b/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
index 5e855233bd..934f0b3670 100644
--- a/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
+++ b/code-generation/language-go/src/main/resources/templates/go/complex-type-template.go.ftlh
@@ -784,6 +784,21 @@ func ${type.name}Parse(ctx context.Context, theBytes []byte<#if hasParserArgumen
 	return ${type.name}ParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes${helper.getEndiannessOptions(true, true, parserArguments)})<#if hasParserArguments>, ${parserArgumentNameList}</#if>)
 }
 
+func ${type.name}ParseWithBufferProducer<#if type.isDiscriminatedParentTypeDefinition()>[T ${type.name}]</#if>(<#if hasParserArguments>${parserArgumentList}</#if>)  func(ctx context.Context, readBuffer utils.ReadBuffer) (<#if type.isDiscriminatedParentTypeDefinition()>T<#else>${type.name}</#if>, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (<#if type.isDiscriminatedParentTypeDefinition()>T<#else>${type.name}</#if>, error){
+<#if type.isDiscriminatedParentTypeDefinition()>
+	buffer, err := ${type.name}ParseWithBuffer(ctx , readBuffer<#if hasParserArguments>, ${parserArgumentNameList}</#if>)
+	if err != nil {
+		var zero T
+		return zero,err
+	}
+	return buffer.(T), err
+<#else>
+	return ${type.name}ParseWithBuffer(ctx , readBuffer<#if hasParserArguments>, ${parserArgumentNameList}</#if>)
+</#if>
+	}
+}
+
 func ${type.name}ParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer<#if hasParserArguments>, ${parserArgumentList}</#if>) (${type.name}, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -959,59 +974,33 @@ func ${type.name}ParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 				<#break>
 			<#case "simple">
 				<#assign simpleField = field.asSimpleField().orElseThrow()>
+				<#assign typedField = field.asTypedField().orElseThrow()>
+				<#assign namedField = field.asNamedField().orElseThrow()>
 
-	// Simple Field (${simpleField.name})
-				<#if !simpleField.type.isSimpleTypeReference()>
-	if pullErr := readBuffer.PullContext("${simpleField.name}"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for ${simpleField.name}")<@emitImport import="github.com/pkg/errors" />
-	}
-				</#if>
-    <#assign simpleFieldLogicalName><#if simpleField.type.isSimpleTypeReference() && !helper.isEnumField(field)>${simpleField.name}<#else>${simpleField.typeName}</#if></#assign>
-	<@compress single_line=true>
-	_${simpleField.name}, _${simpleField.name}Err :=
-	<#if simpleField.type.isSimpleTypeReference()>
-		${helper.getReadBufferReadMethodCall(simpleFieldLogicalName, simpleField.type.asSimpleTypeReference().orElseThrow(), null, simpleField)}
+<@compress single_line=true>
+	${namedField.name},err  :=
+	<#if typedField.type.isEnumTypeReference()>
+		ReadEnumField[${helper.getLanguageTypeNameForField(field)}](
+			ctx,
+			"${namedField.name}",
+			"${helper.getLanguageTypeNameForField(field)}",
+			${helper.getDataReaderCall(typedField.type)}
+			${helper.getFieldOptions(typedField, parserArguments)}
+		)
 	<#else>
-        <#assign nonSimpleTypeReference=simpleField.type.asNonSimpleTypeReference().orElseThrow()>
-        <#assign typeName=nonSimpleTypeReference.name>
-        <#assign typeDefinition=nonSimpleTypeReference.typeDefinition>
-        <#if typeDefinition.isComplexTypeDefinition() && typeDefinition.asComplexTypeDefinition().orElseThrow().isDiscriminatedChildTypeDefinition()>
-        <#-- Usually you don't use child directly unless they are parameterized #-->
-            <#assign typeName=typeDefinition.asComplexTypeDefinition().orElseThrow().parentType.orElseThrow().name>
-            <#assign typeDefinition=typeDefinition.asComplexTypeDefinition().orElseThrow().parentType.orElseThrow()>
-        </#if>
-        <#assign hasRefParams=nonSimpleTypeReference.params.isPresent()>
-        <#assign refParams>
-            <#if hasRefParams>
-				,
-                <#list nonSimpleTypeReference.params.orElseThrow() as parserArgument>
-					<#assign parserTypeRef=helper.getArgumentType(simpleField.type, parserArgument?index)>
-					<#if !parserTypeRef.isComplexTypeReference()>${helper.getLanguageTypeNameForTypeReference(parserTypeRef)}(</#if>
-                    ${helper.toTypedParseExpression(simpleField, parserTypeRef, parserArgument, parserArguments)}
-                    <#if !parserTypeRef.isComplexTypeReference()>)</#if>
-                    <#sep>, </#sep>
-                </#list>
-            </#if>
-        </#assign>
-		${typeName}ParseWithBuffer(ctx, readBuffer${refParams})
+		Read${field.typeName?cap_first}Field<#if typedField.getType().isComplexTypeReference()>[${helper.getLanguageTypeNameForField(field)}]</#if>(
+			ctx,
+			"${namedField.name}",
+			${helper.getDataReaderCall(typedField.type)}
+			${helper.getFieldOptions(typedField, parserArguments)}
+		)
 	</#if>
-    </...@compress>
+</...@compress>
 
-	if _${simpleField.name}Err != nil {
-			<#if helper.isEnumField(field)>
-		return nil, errors.Wrap(_${simpleField.name}Err, "Error parsing '${simpleField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
-			<#else>
-		return nil, errors.Wrap(_${simpleField.name}Err, "Error parsing '${simpleField.name}' field of ${type.name}")<@emitImport import="github.com/pkg/errors" />
-			</#if>
-	}
-	${simpleField.name} := _${simpleField.name}<#if helper.isComplex(field) && !helper.isEnumField(field) && !field.isArrayField()>.(${helper.getLanguageTypeNameForField(field)})</#if>
-				<#if !simpleField.type.isSimpleTypeReference()>
-	if closeErr := readBuffer.CloseContext("${simpleField.name}"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for ${simpleField.name}")<@emitImport import="github.com/pkg/errors" />
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing '${namedField.name}' field"))<@emitImport import="github.com/pkg/errors" />
 	}
-				</#if>
 				<#break>
-
 			<#case "switch">
 				<#assign switchField = field.asSwitchField().orElseThrow()>
 
diff --git a/plc4go/assets/testing/protocols/df1/ParserSerializerTestsuite.xml b/plc4go/assets/testing/protocols/df1/ParserSerializerTestsuite.xml
index efbeed3c05..e48898ce03 100644
--- a/plc4go/assets/testing/protocols/df1/ParserSerializerTestsuite.xml
+++ b/plc4go/assets/testing/protocols/df1/ParserSerializerTestsuite.xml
@@ -1,21 +1,21 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ 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.
+  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.
   -->
 <test:testsuite xmlns:test="https://plc4x.apache.org/schemas/parser-serializer-testsuite.xsd"
                 byteOrder="BIG_ENDIAN">
@@ -49,7 +49,7 @@
           </command>
           <messageEnd dataType="uint" bitLength="8">16</messageEnd>
           <endTransaction dataType="uint" bitLength="8">3</endTransaction>
-          <crc dataType="uint" bitLength="16">28500</crc>
+          <checksum dataType="uint" bitLength="16">28500</checksum>
         </DF1SymbolMessageFrame>
       </DF1Symbol>
     </xml>
@@ -81,7 +81,7 @@
           </command>
           <messageEnd dataType="uint" bitLength="8">16</messageEnd>
           <endTransaction dataType="uint" bitLength="8">3</endTransaction>
-          <crc dataType="uint" bitLength="16">53219</crc>
+          <checksum dataType="uint" bitLength="16">53219</checksum>
         </DF1SymbolMessageFrame>
       </DF1Symbol>
     </xml>
@@ -114,7 +114,7 @@
           </command>
           <messageEnd dataType="uint" bitLength="8">16</messageEnd>
           <endTransaction dataType="uint" bitLength="8">3</endTransaction>
-          <crc dataType="uint" bitLength="16">43402</crc>
+          <checksum dataType="uint" bitLength="16">43402</checksum>
         </DF1SymbolMessageFrame>
       </DF1Symbol>
     </xml>
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go
index 19901599b9..0b8522ffec 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionRequest.go
@@ -115,6 +115,12 @@ func CIPEncapsulationConnectionRequestParse(ctx context.Context, theBytes []byte
 	return CIPEncapsulationConnectionRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian)))
 }
 
+func CIPEncapsulationConnectionRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationConnectionRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationConnectionRequest, error) {
+		return CIPEncapsulationConnectionRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func CIPEncapsulationConnectionRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationConnectionRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go
index 0f25b58a30..d85354bf6f 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationConnectionResponse.go
@@ -115,6 +115,12 @@ func CIPEncapsulationConnectionResponseParse(ctx context.Context, theBytes []byt
 	return CIPEncapsulationConnectionResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian)))
 }
 
+func CIPEncapsulationConnectionResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationConnectionResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationConnectionResponse, error) {
+		return CIPEncapsulationConnectionResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func CIPEncapsulationConnectionResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationConnectionResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
index e17d7ccd2f..e65db00329 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationPacket.go
@@ -172,6 +172,17 @@ func CIPEncapsulationPacketParse(ctx context.Context, theBytes []byte) (CIPEncap
 	return CIPEncapsulationPacketParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian)))
 }
 
+func CIPEncapsulationPacketParseWithBufferProducer[T CIPEncapsulationPacket]() func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := CIPEncapsulationPacketParseWithBuffer(ctx, readBuffer)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func CIPEncapsulationPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationPacket, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -183,44 +194,38 @@ func CIPEncapsulationPacketParseWithBuffer(ctx context.Context, readBuffer utils
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	commandType, err := ReadDiscriminatorField[uint16](ctx, "commandType", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.BigEndian))
+	commandType, err := ReadDiscriminatorField[uint16](ctx, "commandType", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.BigEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commandType' field"))
 	}
 
-	packetLen, err := ReadImplicitField[uint16](ctx, "packetLen", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.BigEndian))
+	packetLen, err := ReadImplicitField[uint16](ctx, "packetLen", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.BigEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'packetLen' field"))
 	}
 	_ = packetLen
 
-	// Simple Field (sessionHandle)
-	_sessionHandle, _sessionHandleErr := /*TODO: migrate me*/ readBuffer.ReadUint32("sessionHandle", 32)
-	if _sessionHandleErr != nil {
-		return nil, errors.Wrap(_sessionHandleErr, "Error parsing 'sessionHandle' field of CIPEncapsulationPacket")
+	sessionHandle, err := ReadSimpleField(ctx, "sessionHandle", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sessionHandle' field"))
 	}
-	sessionHandle := _sessionHandle
 
-	// Simple Field (status)
-	_status, _statusErr := /*TODO: migrate me*/ readBuffer.ReadUint32("status", 32)
-	if _statusErr != nil {
-		return nil, errors.Wrap(_statusErr, "Error parsing 'status' field of CIPEncapsulationPacket")
+	status, err := ReadSimpleField(ctx, "status", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'status' field"))
 	}
-	status := _status
 
-	senderContext, err := ReadCountArrayField[uint8](ctx, "senderContext", ReadUnsignedByte(readBuffer, 8), uint64(int32(8)), codegen.WithByteOrder(binary.BigEndian))
+	senderContext, err := ReadCountArrayField[uint8](ctx, "senderContext", ReadUnsignedByte(readBuffer, uint8(8)), uint64(int32(8)), codegen.WithByteOrder(binary.BigEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'senderContext' field"))
 	}
 
-	// Simple Field (options)
-	_options, _optionsErr := /*TODO: migrate me*/ readBuffer.ReadUint32("options", 32)
-	if _optionsErr != nil {
-		return nil, errors.Wrap(_optionsErr, "Error parsing 'options' field of CIPEncapsulationPacket")
+	options, err := ReadSimpleField(ctx, "options", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'options' field"))
 	}
-	options := _options
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedInt(readBuffer, 32), uint32(0x00000000), codegen.WithByteOrder(binary.BigEndian))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedInt(readBuffer, uint8(32)), uint32(0x00000000), codegen.WithByteOrder(binary.BigEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go
index 0ed460d8e6..5cf7244fa5 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadRequest.go
@@ -27,6 +27,9 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	"github.com/apache/plc4x/plc4go/spi/codegen"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -136,6 +139,12 @@ func CIPEncapsulationReadRequestParse(ctx context.Context, theBytes []byte) (CIP
 	return CIPEncapsulationReadRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian)))
 }
 
+func CIPEncapsulationReadRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationReadRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationReadRequest, error) {
+		return CIPEncapsulationReadRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func CIPEncapsulationReadRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationReadRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -147,17 +156,9 @@ func CIPEncapsulationReadRequestParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (request)
-	if pullErr := readBuffer.PullContext("request"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for request")
-	}
-	_request, _requestErr := DF1RequestMessageParseWithBuffer(ctx, readBuffer)
-	if _requestErr != nil {
-		return nil, errors.Wrap(_requestErr, "Error parsing 'request' field of CIPEncapsulationReadRequest")
-	}
-	request := _request.(DF1RequestMessage)
-	if closeErr := readBuffer.CloseContext("request"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for request")
+	request, err := ReadSimpleField[DF1RequestMessage](ctx, "request", ReadComplex[DF1RequestMessage](DF1RequestMessageParseWithBuffer, readBuffer), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'request' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("CIPEncapsulationReadRequest"); closeErr != nil {
diff --git a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go
index 5415f7d36c..6944b04604 100644
--- a/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go
+++ b/plc4go/protocols/abeth/readwrite/model/CIPEncapsulationReadResponse.go
@@ -27,6 +27,9 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	"github.com/apache/plc4x/plc4go/spi/codegen"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -139,6 +142,12 @@ func CIPEncapsulationReadResponseParse(ctx context.Context, theBytes []byte, pac
 	return CIPEncapsulationReadResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.BigEndian)), packetLen)
 }
 
+func CIPEncapsulationReadResponseParseWithBufferProducer(packetLen uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationReadResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (CIPEncapsulationReadResponse, error) {
+		return CIPEncapsulationReadResponseParseWithBuffer(ctx, readBuffer, packetLen)
+	}
+}
+
 func CIPEncapsulationReadResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, packetLen uint16) (CIPEncapsulationReadResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -150,17 +159,9 @@ func CIPEncapsulationReadResponseParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (response)
-	if pullErr := readBuffer.PullContext("response"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for response")
-	}
-	_response, _responseErr := DF1ResponseMessageParseWithBuffer(ctx, readBuffer, uint16(packetLen))
-	if _responseErr != nil {
-		return nil, errors.Wrap(_responseErr, "Error parsing 'response' field of CIPEncapsulationReadResponse")
-	}
-	response := _response.(DF1ResponseMessage)
-	if closeErr := readBuffer.CloseContext("response"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for response")
+	response, err := ReadSimpleField[DF1ResponseMessage](ctx, "response", ReadComplex[DF1ResponseMessage](DF1ResponseMessageParseWithBufferProducer[DF1ResponseMessage]((uint16)(packetLen)), readBuffer), codegen.WithByteOrder(binary.BigEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'response' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("CIPEncapsulationReadResponse"); closeErr != nil {
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go b/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go
index 3dbae27423..00b6d68823 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1CommandRequestMessage.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -135,6 +137,12 @@ func DF1CommandRequestMessageParse(ctx context.Context, theBytes []byte) (DF1Com
 	return DF1CommandRequestMessageParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func DF1CommandRequestMessageParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (DF1CommandRequestMessage, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (DF1CommandRequestMessage, error) {
+		return DF1CommandRequestMessageParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func DF1CommandRequestMessageParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (DF1CommandRequestMessage, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -146,17 +154,9 @@ func DF1CommandRequestMessageParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (command)
-	if pullErr := readBuffer.PullContext("command"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for command")
-	}
-	_command, _commandErr := DF1RequestCommandParseWithBuffer(ctx, readBuffer)
-	if _commandErr != nil {
-		return nil, errors.Wrap(_commandErr, "Error parsing 'command' field of DF1CommandRequestMessage")
-	}
-	command := _command.(DF1RequestCommand)
-	if closeErr := readBuffer.CloseContext("command"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for command")
+	command, err := ReadSimpleField[DF1RequestCommand](ctx, "command", ReadComplex[DF1RequestCommand](DF1RequestCommandParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'command' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("DF1CommandRequestMessage"); closeErr != nil {
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go b/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go
index 73c6cf0367..8cc2757374 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1CommandResponseMessageProtectedTypedLogicalRead.go
@@ -139,6 +139,12 @@ func DF1CommandResponseMessageProtectedTypedLogicalReadParse(ctx context.Context
 	return DF1CommandResponseMessageProtectedTypedLogicalReadParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), payloadLength)
 }
 
+func DF1CommandResponseMessageProtectedTypedLogicalReadParseWithBufferProducer(payloadLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (DF1CommandResponseMessageProtectedTypedLogicalRead, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (DF1CommandResponseMessageProtectedTypedLogicalRead, error) {
+		return DF1CommandResponseMessageProtectedTypedLogicalReadParseWithBuffer(ctx, readBuffer, payloadLength)
+	}
+}
+
 func DF1CommandResponseMessageProtectedTypedLogicalReadParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, payloadLength uint16) (DF1CommandResponseMessageProtectedTypedLogicalRead, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -150,7 +156,7 @@ func DF1CommandResponseMessageProtectedTypedLogicalReadParseWithBuffer(ctx conte
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	data, err := ReadLengthArrayField[uint8](ctx, "data", ReadUnsignedByte(readBuffer, 8), int(int32(payloadLength)-int32(int32(8))))
+	data, err := ReadLengthArrayField[uint8](ctx, "data", ReadUnsignedByte(readBuffer, uint8(8)), int(int32(payloadLength)-int32(int32(8))))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'data' field"))
 	}
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go b/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go
index e50de155c2..52c6cb8dae 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1RequestCommand.go
@@ -110,6 +110,17 @@ func DF1RequestCommandParse(ctx context.Context, theBytes []byte) (DF1RequestCom
 	return DF1RequestCommandParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func DF1RequestCommandParseWithBufferProducer[T DF1RequestCommand]() func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := DF1RequestCommandParseWithBuffer(ctx, readBuffer)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func DF1RequestCommandParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (DF1RequestCommand, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -121,7 +132,7 @@ func DF1RequestCommandParseWithBuffer(ctx context.Context, readBuffer utils.Read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	functionCode, err := ReadDiscriminatorField[uint8](ctx, "functionCode", ReadUnsignedByte(readBuffer, 8))
+	functionCode, err := ReadDiscriminatorField[uint8](ctx, "functionCode", ReadUnsignedByte(readBuffer, uint8(8)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'functionCode' field"))
 	}
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go b/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go
index 9b03022f5b..a335fa6a1f 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1RequestMessage.go
@@ -165,6 +165,17 @@ func DF1RequestMessageParse(ctx context.Context, theBytes []byte) (DF1RequestMes
 	return DF1RequestMessageParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func DF1RequestMessageParseWithBufferProducer[T DF1RequestMessage]() func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := DF1RequestMessageParseWithBuffer(ctx, readBuffer)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func DF1RequestMessageParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (DF1RequestMessage, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -176,43 +187,35 @@ func DF1RequestMessageParseWithBuffer(ctx context.Context, readBuffer utils.Read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (destinationAddress)
-	_destinationAddress, _destinationAddressErr := /*TODO: migrate me*/ readBuffer.ReadUint8("destinationAddress", 8)
-	if _destinationAddressErr != nil {
-		return nil, errors.Wrap(_destinationAddressErr, "Error parsing 'destinationAddress' field of DF1RequestMessage")
+	destinationAddress, err := ReadSimpleField(ctx, "destinationAddress", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'destinationAddress' field"))
 	}
-	destinationAddress := _destinationAddress
 
-	// Simple Field (sourceAddress)
-	_sourceAddress, _sourceAddressErr := /*TODO: migrate me*/ readBuffer.ReadUint8("sourceAddress", 8)
-	if _sourceAddressErr != nil {
-		return nil, errors.Wrap(_sourceAddressErr, "Error parsing 'sourceAddress' field of DF1RequestMessage")
+	sourceAddress, err := ReadSimpleField(ctx, "sourceAddress", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sourceAddress' field"))
 	}
-	sourceAddress := _sourceAddress
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedShort(readBuffer, 16), uint16(0x0000))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedShort(readBuffer, uint8(16)), uint16(0x0000))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	commandCode, err := ReadDiscriminatorField[uint8](ctx, "commandCode", ReadUnsignedByte(readBuffer, 8))
+	commandCode, err := ReadDiscriminatorField[uint8](ctx, "commandCode", ReadUnsignedByte(readBuffer, uint8(8)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commandCode' field"))
 	}
 
-	// Simple Field (status)
-	_status, _statusErr := /*TODO: migrate me*/ readBuffer.ReadUint8("status", 8)
-	if _statusErr != nil {
-		return nil, errors.Wrap(_statusErr, "Error parsing 'status' field of DF1RequestMessage")
+	status, err := ReadSimpleField(ctx, "status", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'status' field"))
 	}
-	status := _status
 
-	// Simple Field (transactionCounter)
-	_transactionCounter, _transactionCounterErr := /*TODO: migrate me*/ readBuffer.ReadUint16("transactionCounter", 16)
-	if _transactionCounterErr != nil {
-		return nil, errors.Wrap(_transactionCounterErr, "Error parsing 'transactionCounter' field of DF1RequestMessage")
+	transactionCounter, err := ReadSimpleField(ctx, "transactionCounter", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'transactionCounter' field"))
 	}
-	transactionCounter := _transactionCounter
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type DF1RequestMessageChildSerializeRequirement interface {
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go b/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go
index be9a67ce97..7b3e7dc6d1 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1RequestProtectedTypedLogicalRead.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -174,6 +176,12 @@ func DF1RequestProtectedTypedLogicalReadParse(ctx context.Context, theBytes []by
 	return DF1RequestProtectedTypedLogicalReadParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func DF1RequestProtectedTypedLogicalReadParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (DF1RequestProtectedTypedLogicalRead, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (DF1RequestProtectedTypedLogicalRead, error) {
+		return DF1RequestProtectedTypedLogicalReadParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func DF1RequestProtectedTypedLogicalReadParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (DF1RequestProtectedTypedLogicalRead, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -185,40 +193,30 @@ func DF1RequestProtectedTypedLogicalReadParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (byteSize)
-	_byteSize, _byteSizeErr := /*TODO: migrate me*/ readBuffer.ReadUint8("byteSize", 8)
-	if _byteSizeErr != nil {
-		return nil, errors.Wrap(_byteSizeErr, "Error parsing 'byteSize' field of DF1RequestProtectedTypedLogicalRead")
+	byteSize, err := ReadSimpleField(ctx, "byteSize", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'byteSize' field"))
 	}
-	byteSize := _byteSize
 
-	// Simple Field (fileNumber)
-	_fileNumber, _fileNumberErr := /*TODO: migrate me*/ readBuffer.ReadUint8("fileNumber", 8)
-	if _fileNumberErr != nil {
-		return nil, errors.Wrap(_fileNumberErr, "Error parsing 'fileNumber' field of DF1RequestProtectedTypedLogicalRead")
+	fileNumber, err := ReadSimpleField(ctx, "fileNumber", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'fileNumber' field"))
 	}
-	fileNumber := _fileNumber
 
-	// Simple Field (fileType)
-	_fileType, _fileTypeErr := /*TODO: migrate me*/ readBuffer.ReadUint8("fileType", 8)
-	if _fileTypeErr != nil {
-		return nil, errors.Wrap(_fileTypeErr, "Error parsing 'fileType' field of DF1RequestProtectedTypedLogicalRead")
+	fileType, err := ReadSimpleField(ctx, "fileType", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'fileType' field"))
 	}
-	fileType := _fileType
 
-	// Simple Field (elementNumber)
-	_elementNumber, _elementNumberErr := /*TODO: migrate me*/ readBuffer.ReadUint8("elementNumber", 8)
-	if _elementNumberErr != nil {
-		return nil, errors.Wrap(_elementNumberErr, "Error parsing 'elementNumber' field of DF1RequestProtectedTypedLogicalRead")
+	elementNumber, err := ReadSimpleField(ctx, "elementNumber", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'elementNumber' field"))
 	}
-	elementNumber := _elementNumber
 
-	// Simple Field (subElementNumber)
-	_subElementNumber, _subElementNumberErr := /*TODO: migrate me*/ readBuffer.ReadUint8("subElementNumber", 8)
-	if _subElementNumberErr != nil {
-		return nil, errors.Wrap(_subElementNumberErr, "Error parsing 'subElementNumber' field of DF1RequestProtectedTypedLogicalRead")
+	subElementNumber, err := ReadSimpleField(ctx, "subElementNumber", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'subElementNumber' field"))
 	}
-	subElementNumber := _subElementNumber
 
 	if closeErr := readBuffer.CloseContext("DF1RequestProtectedTypedLogicalRead"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for DF1RequestProtectedTypedLogicalRead")
diff --git a/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go b/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go
index f8b3a1cb29..39a9620fad 100644
--- a/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go
+++ b/plc4go/protocols/abeth/readwrite/model/DF1ResponseMessage.go
@@ -172,6 +172,17 @@ func DF1ResponseMessageParse(ctx context.Context, theBytes []byte, payloadLength
 	return DF1ResponseMessageParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), payloadLength)
 }
 
+func DF1ResponseMessageParseWithBufferProducer[T DF1ResponseMessage](payloadLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := DF1ResponseMessageParseWithBuffer(ctx, readBuffer, payloadLength)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func DF1ResponseMessageParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, payloadLength uint16) (DF1ResponseMessage, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -183,48 +194,40 @@ func DF1ResponseMessageParseWithBuffer(ctx context.Context, readBuffer utils.Rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 8), uint8(0x00))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(8)), uint8(0x00))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (destinationAddress)
-	_destinationAddress, _destinationAddressErr := /*TODO: migrate me*/ readBuffer.ReadUint8("destinationAddress", 8)
-	if _destinationAddressErr != nil {
-		return nil, errors.Wrap(_destinationAddressErr, "Error parsing 'destinationAddress' field of DF1ResponseMessage")
+	destinationAddress, err := ReadSimpleField(ctx, "destinationAddress", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'destinationAddress' field"))
 	}
-	destinationAddress := _destinationAddress
 
-	// Simple Field (sourceAddress)
-	_sourceAddress, _sourceAddressErr := /*TODO: migrate me*/ readBuffer.ReadUint8("sourceAddress", 8)
-	if _sourceAddressErr != nil {
-		return nil, errors.Wrap(_sourceAddressErr, "Error parsing 'sourceAddress' field of DF1ResponseMessage")
+	sourceAddress, err := ReadSimpleField(ctx, "sourceAddress", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sourceAddress' field"))
 	}
-	sourceAddress := _sourceAddress
 
-	reservedField1, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 8), uint8(0x00))
+	reservedField1, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(8)), uint8(0x00))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	commandCode, err := ReadDiscriminatorField[uint8](ctx, "commandCode", ReadUnsignedByte(readBuffer, 8))
+	commandCode, err := ReadDiscriminatorField[uint8](ctx, "commandCode", ReadUnsignedByte(readBuffer, uint8(8)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commandCode' field"))
 	}
 
-	// Simple Field (status)
-	_status, _statusErr := /*TODO: migrate me*/ readBuffer.ReadUint8("status", 8)
-	if _statusErr != nil {
-		return nil, errors.Wrap(_statusErr, "Error parsing 'status' field of DF1ResponseMessage")
+	status, err := ReadSimpleField(ctx, "status", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'status' field"))
 	}
-	status := _status
 
-	// Simple Field (transactionCounter)
-	_transactionCounter, _transactionCounterErr := /*TODO: migrate me*/ readBuffer.ReadUint16("transactionCounter", 16)
-	if _transactionCounterErr != nil {
-		return nil, errors.Wrap(_transactionCounterErr, "Error parsing 'transactionCounter' field of DF1ResponseMessage")
+	transactionCounter, err := ReadSimpleField(ctx, "transactionCounter", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'transactionCounter' field"))
 	}
-	transactionCounter := _transactionCounter
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type DF1ResponseMessageChildSerializeRequirement interface {
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go
index e24a2e3700..9411154f8d 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscovery.go
@@ -176,6 +176,12 @@ func AdsDiscoveryParse(ctx context.Context, theBytes []byte) (AdsDiscovery, erro
 	return AdsDiscoveryParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
 }
 
+func AdsDiscoveryParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscovery, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscovery, error) {
+		return AdsDiscoveryParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscovery, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -187,59 +193,33 @@ func AdsDiscoveryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	header, err := ReadConstField[uint32](ctx, "header", ReadUnsignedInt(readBuffer, 32), AdsDiscovery_HEADER, codegen.WithByteOrder(binary.LittleEndian))
+	header, err := ReadConstField[uint32](ctx, "header", ReadUnsignedInt(readBuffer, uint8(32)), AdsDiscovery_HEADER, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 	_ = header
 
-	// Simple Field (requestId)
-	_requestId, _requestIdErr := /*TODO: migrate me*/ readBuffer.ReadUint32("requestId", 32)
-	if _requestIdErr != nil {
-		return nil, errors.Wrap(_requestIdErr, "Error parsing 'requestId' field of AdsDiscovery")
+	requestId, err := ReadSimpleField(ctx, "requestId", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'requestId' field"))
 	}
-	requestId := _requestId
 
-	// Simple Field (operation)
-	if pullErr := readBuffer.PullContext("operation"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for operation")
-	}
-	_operation, _operationErr := OperationParseWithBuffer(ctx, readBuffer)
-	if _operationErr != nil {
-		return nil, errors.Wrap(_operationErr, "Error parsing 'operation' field of AdsDiscovery")
-	}
-	operation := _operation
-	if closeErr := readBuffer.CloseContext("operation"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for operation")
+	operation, err := ReadEnumField[Operation](ctx, "operation", "Operation", ReadEnum(OperationByValue, ReadUnsignedInt(readBuffer, uint8(32))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'operation' field"))
 	}
 
-	// Simple Field (amsNetId)
-	if pullErr := readBuffer.PullContext("amsNetId"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for amsNetId")
-	}
-	_amsNetId, _amsNetIdErr := AmsNetIdParseWithBuffer(ctx, readBuffer)
-	if _amsNetIdErr != nil {
-		return nil, errors.Wrap(_amsNetIdErr, "Error parsing 'amsNetId' field of AdsDiscovery")
-	}
-	amsNetId := _amsNetId.(AmsNetId)
-	if closeErr := readBuffer.CloseContext("amsNetId"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for amsNetId")
+	amsNetId, err := ReadSimpleField[AmsNetId](ctx, "amsNetId", ReadComplex[AmsNetId](AmsNetIdParseWithBuffer, readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'amsNetId' field"))
 	}
 
-	// Simple Field (portNumber)
-	if pullErr := readBuffer.PullContext("portNumber"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for portNumber")
-	}
-	_portNumber, _portNumberErr := AdsPortNumbersParseWithBuffer(ctx, readBuffer)
-	if _portNumberErr != nil {
-		return nil, errors.Wrap(_portNumberErr, "Error parsing 'portNumber' field of AdsDiscovery")
-	}
-	portNumber := _portNumber
-	if closeErr := readBuffer.CloseContext("portNumber"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for portNumber")
+	portNumber, err := ReadEnumField[AdsPortNumbers](ctx, "portNumber", "AdsPortNumbers", ReadEnum(AdsPortNumbersByValue, ReadUnsignedShort(readBuffer, uint8(16))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'portNumber' field"))
 	}
 
-	numBlocks, err := ReadImplicitField[uint32](ctx, "numBlocks", ReadUnsignedInt(readBuffer, 32), codegen.WithByteOrder(binary.LittleEndian))
+	numBlocks, err := ReadImplicitField[uint32](ctx, "numBlocks", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numBlocks' field"))
 	}
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlock.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlock.go
index e03ebd9878..1d9a544d29 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlock.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlock.go
@@ -110,6 +110,17 @@ func AdsDiscoveryBlockParse(ctx context.Context, theBytes []byte) (AdsDiscoveryB
 	return AdsDiscoveryBlockParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockParseWithBufferProducer[T AdsDiscoveryBlock]() func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := AdsDiscoveryBlockParseWithBuffer(ctx, readBuffer)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func AdsDiscoveryBlockParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlock, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -121,7 +132,7 @@ func AdsDiscoveryBlockParseWithBuffer(ctx context.Context, readBuffer utils.Read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	blockType, err := ReadDiscriminatorEnumField[AdsDiscoveryBlockType](ctx, "blockType", "AdsDiscoveryBlockType", ReadEnum(AdsDiscoveryBlockTypeByValue, ReadUnsignedShort(readBuffer, 16)))
+	blockType, err := ReadDiscriminatorEnumField[AdsDiscoveryBlockType](ctx, "blockType", "AdsDiscoveryBlockType", ReadEnum(AdsDiscoveryBlockTypeByValue, ReadUnsignedShort(readBuffer, uint8(16))))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'blockType' field"))
 	}
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockAmsNetId.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockAmsNetId.go
index f0a4d2871c..a221b6057d 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockAmsNetId.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockAmsNetId.go
@@ -151,6 +151,12 @@ func AdsDiscoveryBlockAmsNetIdParse(ctx context.Context, theBytes []byte) (AdsDi
 	return AdsDiscoveryBlockAmsNetIdParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockAmsNetIdParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockAmsNetId, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockAmsNetId, error) {
+		return AdsDiscoveryBlockAmsNetIdParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockAmsNetIdParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockAmsNetId, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -162,23 +168,15 @@ func AdsDiscoveryBlockAmsNetIdParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	amsNetIdLength, err := ReadConstField[uint16](ctx, "amsNetIdLength", ReadUnsignedShort(readBuffer, 16), AdsDiscoveryBlockAmsNetId_AMSNETIDLENGTH)
+	amsNetIdLength, err := ReadConstField[uint16](ctx, "amsNetIdLength", ReadUnsignedShort(readBuffer, uint8(16)), AdsDiscoveryBlockAmsNetId_AMSNETIDLENGTH)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'amsNetIdLength' field"))
 	}
 	_ = amsNetIdLength
 
-	// Simple Field (amsNetId)
-	if pullErr := readBuffer.PullContext("amsNetId"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for amsNetId")
-	}
-	_amsNetId, _amsNetIdErr := AmsNetIdParseWithBuffer(ctx, readBuffer)
-	if _amsNetIdErr != nil {
-		return nil, errors.Wrap(_amsNetIdErr, "Error parsing 'amsNetId' field of AdsDiscoveryBlockAmsNetId")
-	}
-	amsNetId := _amsNetId.(AmsNetId)
-	if closeErr := readBuffer.CloseContext("amsNetId"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for amsNetId")
+	amsNetId, err := ReadSimpleField[AmsNetId](ctx, "amsNetId", ReadComplex[AmsNetId](AmsNetIdParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'amsNetId' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsDiscoveryBlockAmsNetId"); closeErr != nil {
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go
index 9225a99779..ea3bf07b56 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockFingerprint.go
@@ -137,6 +137,12 @@ func AdsDiscoveryBlockFingerprintParse(ctx context.Context, theBytes []byte) (Ad
 	return AdsDiscoveryBlockFingerprintParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockFingerprintParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockFingerprint, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockFingerprint, error) {
+		return AdsDiscoveryBlockFingerprintParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockFingerprintParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockFingerprint, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -148,7 +154,7 @@ func AdsDiscoveryBlockFingerprintParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	dataLen, err := ReadImplicitField[uint16](ctx, "dataLen", ReadUnsignedShort(readBuffer, 16))
+	dataLen, err := ReadImplicitField[uint16](ctx, "dataLen", ReadUnsignedShort(readBuffer, uint8(16)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataLen' field"))
 	}
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockHostName.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockHostName.go
index 568c31717f..fe56971a2d 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockHostName.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockHostName.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -130,6 +132,12 @@ func AdsDiscoveryBlockHostNameParse(ctx context.Context, theBytes []byte) (AdsDi
 	return AdsDiscoveryBlockHostNameParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockHostNameParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockHostName, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockHostName, error) {
+		return AdsDiscoveryBlockHostNameParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockHostNameParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockHostName, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -141,17 +149,9 @@ func AdsDiscoveryBlockHostNameParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (hostName)
-	if pullErr := readBuffer.PullContext("hostName"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for hostName")
-	}
-	_hostName, _hostNameErr := AmsStringParseWithBuffer(ctx, readBuffer)
-	if _hostNameErr != nil {
-		return nil, errors.Wrap(_hostNameErr, "Error parsing 'hostName' field of AdsDiscoveryBlockHostName")
-	}
-	hostName := _hostName.(AmsString)
-	if closeErr := readBuffer.CloseContext("hostName"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for hostName")
+	hostName, err := ReadSimpleField[AmsString](ctx, "hostName", ReadComplex[AmsString](AmsStringParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'hostName' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsDiscoveryBlockHostName"); closeErr != nil {
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go
index bb859cc91d..84b5f9f0c7 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockOsData.go
@@ -137,6 +137,12 @@ func AdsDiscoveryBlockOsDataParse(ctx context.Context, theBytes []byte) (AdsDisc
 	return AdsDiscoveryBlockOsDataParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockOsDataParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockOsData, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockOsData, error) {
+		return AdsDiscoveryBlockOsDataParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockOsDataParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockOsData, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -148,7 +154,7 @@ func AdsDiscoveryBlockOsDataParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	osDataLen, err := ReadImplicitField[uint16](ctx, "osDataLen", ReadUnsignedShort(readBuffer, 16))
+	osDataLen, err := ReadImplicitField[uint16](ctx, "osDataLen", ReadUnsignedShort(readBuffer, uint8(16)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'osDataLen' field"))
 	}
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockPassword.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockPassword.go
index 437976babd..dbe1f86d95 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockPassword.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockPassword.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -130,6 +132,12 @@ func AdsDiscoveryBlockPasswordParse(ctx context.Context, theBytes []byte) (AdsDi
 	return AdsDiscoveryBlockPasswordParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockPasswordParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockPassword, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockPassword, error) {
+		return AdsDiscoveryBlockPasswordParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockPasswordParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockPassword, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -141,17 +149,9 @@ func AdsDiscoveryBlockPasswordParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (password)
-	if pullErr := readBuffer.PullContext("password"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for password")
-	}
-	_password, _passwordErr := AmsStringParseWithBuffer(ctx, readBuffer)
-	if _passwordErr != nil {
-		return nil, errors.Wrap(_passwordErr, "Error parsing 'password' field of AdsDiscoveryBlockPassword")
-	}
-	password := _password.(AmsString)
-	if closeErr := readBuffer.CloseContext("password"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for password")
+	password, err := ReadSimpleField[AmsString](ctx, "password", ReadComplex[AmsString](AmsStringParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'password' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsDiscoveryBlockPassword"); closeErr != nil {
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockRouteName.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockRouteName.go
index b53e59eac0..18fbf9516d 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockRouteName.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockRouteName.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -130,6 +132,12 @@ func AdsDiscoveryBlockRouteNameParse(ctx context.Context, theBytes []byte) (AdsD
 	return AdsDiscoveryBlockRouteNameParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockRouteNameParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockRouteName, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockRouteName, error) {
+		return AdsDiscoveryBlockRouteNameParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockRouteNameParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockRouteName, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -141,17 +149,9 @@ func AdsDiscoveryBlockRouteNameParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (routeName)
-	if pullErr := readBuffer.PullContext("routeName"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for routeName")
-	}
-	_routeName, _routeNameErr := AmsStringParseWithBuffer(ctx, readBuffer)
-	if _routeNameErr != nil {
-		return nil, errors.Wrap(_routeNameErr, "Error parsing 'routeName' field of AdsDiscoveryBlockRouteName")
-	}
-	routeName := _routeName.(AmsString)
-	if closeErr := readBuffer.CloseContext("routeName"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for routeName")
+	routeName, err := ReadSimpleField[AmsString](ctx, "routeName", ReadComplex[AmsString](AmsStringParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'routeName' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsDiscoveryBlockRouteName"); closeErr != nil {
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockStatus.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockStatus.go
index 81f926c4d0..30a0fefd8b 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockStatus.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockStatus.go
@@ -151,6 +151,12 @@ func AdsDiscoveryBlockStatusParse(ctx context.Context, theBytes []byte) (AdsDisc
 	return AdsDiscoveryBlockStatusParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockStatusParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockStatus, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockStatus, error) {
+		return AdsDiscoveryBlockStatusParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockStatusParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockStatus, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -162,23 +168,15 @@ func AdsDiscoveryBlockStatusParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	statusLength, err := ReadConstField[uint16](ctx, "statusLength", ReadUnsignedShort(readBuffer, 16), AdsDiscoveryBlockStatus_STATUSLENGTH)
+	statusLength, err := ReadConstField[uint16](ctx, "statusLength", ReadUnsignedShort(readBuffer, uint8(16)), AdsDiscoveryBlockStatus_STATUSLENGTH)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'statusLength' field"))
 	}
 	_ = statusLength
 
-	// Simple Field (status)
-	if pullErr := readBuffer.PullContext("status"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for status")
-	}
-	_status, _statusErr := StatusParseWithBuffer(ctx, readBuffer)
-	if _statusErr != nil {
-		return nil, errors.Wrap(_statusErr, "Error parsing 'status' field of AdsDiscoveryBlockStatus")
-	}
-	status := _status
-	if closeErr := readBuffer.CloseContext("status"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for status")
+	status, err := ReadEnumField[Status](ctx, "status", "Status", ReadEnum(StatusByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'status' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsDiscoveryBlockStatus"); closeErr != nil {
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockUserName.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockUserName.go
index 4e955c94ff..2d70ec96b3 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockUserName.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockUserName.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -130,6 +132,12 @@ func AdsDiscoveryBlockUserNameParse(ctx context.Context, theBytes []byte) (AdsDi
 	return AdsDiscoveryBlockUserNameParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockUserNameParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockUserName, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockUserName, error) {
+		return AdsDiscoveryBlockUserNameParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockUserNameParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockUserName, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -141,17 +149,9 @@ func AdsDiscoveryBlockUserNameParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (userName)
-	if pullErr := readBuffer.PullContext("userName"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for userName")
-	}
-	_userName, _userNameErr := AmsStringParseWithBuffer(ctx, readBuffer)
-	if _userNameErr != nil {
-		return nil, errors.Wrap(_userNameErr, "Error parsing 'userName' field of AdsDiscoveryBlockUserName")
-	}
-	userName := _userName.(AmsString)
-	if closeErr := readBuffer.CloseContext("userName"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for userName")
+	userName, err := ReadSimpleField[AmsString](ctx, "userName", ReadComplex[AmsString](AmsStringParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'userName' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsDiscoveryBlockUserName"); closeErr != nil {
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go
index 8e7254f54a..653c5f050b 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryBlockVersion.go
@@ -137,6 +137,12 @@ func AdsDiscoveryBlockVersionParse(ctx context.Context, theBytes []byte) (AdsDis
 	return AdsDiscoveryBlockVersionParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryBlockVersionParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockVersion, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockVersion, error) {
+		return AdsDiscoveryBlockVersionParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryBlockVersionParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryBlockVersion, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -148,7 +154,7 @@ func AdsDiscoveryBlockVersionParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	versionDataLen, err := ReadImplicitField[uint16](ctx, "versionDataLen", ReadUnsignedShort(readBuffer, 16))
+	versionDataLen, err := ReadImplicitField[uint16](ctx, "versionDataLen", ReadUnsignedShort(readBuffer, uint8(16)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'versionDataLen' field"))
 	}
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryConstants.go b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryConstants.go
index 6cb371304d..e65f115ae2 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryConstants.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AdsDiscoveryConstants.go
@@ -105,6 +105,12 @@ func AdsDiscoveryConstantsParse(ctx context.Context, theBytes []byte) (AdsDiscov
 	return AdsDiscoveryConstantsParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDiscoveryConstantsParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryConstants, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryConstants, error) {
+		return AdsDiscoveryConstantsParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDiscoveryConstantsParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDiscoveryConstants, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -116,7 +122,7 @@ func AdsDiscoveryConstantsParseWithBuffer(ctx context.Context, readBuffer utils.
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	adsDiscoveryUdpDefaultPort, err := ReadConstField[uint16](ctx, "adsDiscoveryUdpDefaultPort", ReadUnsignedShort(readBuffer, 16), AdsDiscoveryConstants_ADSDISCOVERYUDPDEFAULTPORT)
+	adsDiscoveryUdpDefaultPort, err := ReadConstField[uint16](ctx, "adsDiscoveryUdpDefaultPort", ReadUnsignedShort(readBuffer, uint8(16)), AdsDiscoveryConstants_ADSDISCOVERYUDPDEFAULTPORT)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'adsDiscoveryUdpDefaultPort' field"))
 	}
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AmsNetId.go b/plc4go/protocols/ads/discovery/readwrite/model/AmsNetId.go
index 71ae0204eb..1b28fcb737 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AmsNetId.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AmsNetId.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -153,6 +155,12 @@ func AmsNetIdParse(ctx context.Context, theBytes []byte) (AmsNetId, error) {
 	return AmsNetIdParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AmsNetIdParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsNetId, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsNetId, error) {
+		return AmsNetIdParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AmsNetIdParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsNetId, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -164,47 +172,35 @@ func AmsNetIdParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (octet1)
-	_octet1, _octet1Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet1", 8)
-	if _octet1Err != nil {
-		return nil, errors.Wrap(_octet1Err, "Error parsing 'octet1' field of AmsNetId")
+	octet1, err := ReadSimpleField(ctx, "octet1", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet1' field"))
 	}
-	octet1 := _octet1
 
-	// Simple Field (octet2)
-	_octet2, _octet2Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet2", 8)
-	if _octet2Err != nil {
-		return nil, errors.Wrap(_octet2Err, "Error parsing 'octet2' field of AmsNetId")
+	octet2, err := ReadSimpleField(ctx, "octet2", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet2' field"))
 	}
-	octet2 := _octet2
 
-	// Simple Field (octet3)
-	_octet3, _octet3Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet3", 8)
-	if _octet3Err != nil {
-		return nil, errors.Wrap(_octet3Err, "Error parsing 'octet3' field of AmsNetId")
+	octet3, err := ReadSimpleField(ctx, "octet3", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet3' field"))
 	}
-	octet3 := _octet3
 
-	// Simple Field (octet4)
-	_octet4, _octet4Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet4", 8)
-	if _octet4Err != nil {
-		return nil, errors.Wrap(_octet4Err, "Error parsing 'octet4' field of AmsNetId")
+	octet4, err := ReadSimpleField(ctx, "octet4", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet4' field"))
 	}
-	octet4 := _octet4
 
-	// Simple Field (octet5)
-	_octet5, _octet5Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet5", 8)
-	if _octet5Err != nil {
-		return nil, errors.Wrap(_octet5Err, "Error parsing 'octet5' field of AmsNetId")
+	octet5, err := ReadSimpleField(ctx, "octet5", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet5' field"))
 	}
-	octet5 := _octet5
 
-	// Simple Field (octet6)
-	_octet6, _octet6Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet6", 8)
-	if _octet6Err != nil {
-		return nil, errors.Wrap(_octet6Err, "Error parsing 'octet6' field of AmsNetId")
+	octet6, err := ReadSimpleField(ctx, "octet6", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet6' field"))
 	}
-	octet6 := _octet6
 
 	if closeErr := readBuffer.CloseContext("AmsNetId"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AmsNetId")
diff --git a/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go b/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go
index e92e564ad4..2887cfbfee 100644
--- a/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go
+++ b/plc4go/protocols/ads/discovery/readwrite/model/AmsString.go
@@ -26,6 +26,7 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	"github.com/apache/plc4x/plc4go/spi/codegen"
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
 	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
@@ -113,6 +114,12 @@ func AmsStringParse(ctx context.Context, theBytes []byte) (AmsString, error) {
 	return AmsStringParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AmsStringParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsString, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsString, error) {
+		return AmsStringParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AmsStringParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsString, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -124,20 +131,18 @@ func AmsStringParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer)
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	strLen, err := ReadImplicitField[uint16](ctx, "strLen", ReadUnsignedShort(readBuffer, 16))
+	strLen, err := ReadImplicitField[uint16](ctx, "strLen", ReadUnsignedShort(readBuffer, uint8(16)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'strLen' field"))
 	}
 	_ = strLen
 
-	// Simple Field (text)
-	_text, _textErr := /*TODO: migrate me*/ readBuffer.ReadString("text", uint32((8)*((strLen)-(1))), utils.WithEncoding("UTF-8"))
-	if _textErr != nil {
-		return nil, errors.Wrap(_textErr, "Error parsing 'text' field of AmsString")
+	text, err := ReadSimpleField(ctx, "text", ReadString(readBuffer, uint32(int32(int32(8))*int32((int32(strLen)-int32(int32(1)))))), codegen.WithEncoding("UTF-8"))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'text' field"))
 	}
-	text := _text
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 8), uint8(0x00))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(8)), uint8(0x00))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go
index e593e187bd..a19ef63328 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationRequest.go
@@ -207,6 +207,12 @@ func AdsAddDeviceNotificationRequestParse(ctx context.Context, theBytes []byte)
 	return AdsAddDeviceNotificationRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsAddDeviceNotificationRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsAddDeviceNotificationRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsAddDeviceNotificationRequest, error) {
+		return AdsAddDeviceNotificationRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsAddDeviceNotificationRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsAddDeviceNotificationRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -218,60 +224,42 @@ func AdsAddDeviceNotificationRequestParseWithBuffer(ctx context.Context, readBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexGroup", 32)
-	if _indexGroupErr != nil {
-		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsAddDeviceNotificationRequest")
+	indexGroup, err := ReadSimpleField(ctx, "indexGroup", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexGroup' field"))
 	}
-	indexGroup := _indexGroup
 
-	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexOffset", 32)
-	if _indexOffsetErr != nil {
-		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsAddDeviceNotificationRequest")
+	indexOffset, err := ReadSimpleField(ctx, "indexOffset", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexOffset' field"))
 	}
-	indexOffset := _indexOffset
 
-	// Simple Field (length)
-	_length, _lengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsAddDeviceNotificationRequest")
+	length, err := ReadSimpleField(ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
-	length := _length
 
-	// Simple Field (transmissionMode)
-	if pullErr := readBuffer.PullContext("transmissionMode"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for transmissionMode")
-	}
-	_transmissionMode, _transmissionModeErr := AdsTransModeParseWithBuffer(ctx, readBuffer)
-	if _transmissionModeErr != nil {
-		return nil, errors.Wrap(_transmissionModeErr, "Error parsing 'transmissionMode' field of AdsAddDeviceNotificationRequest")
-	}
-	transmissionMode := _transmissionMode
-	if closeErr := readBuffer.CloseContext("transmissionMode"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for transmissionMode")
+	transmissionMode, err := ReadEnumField[AdsTransMode](ctx, "transmissionMode", "AdsTransMode", ReadEnum(AdsTransModeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'transmissionMode' field"))
 	}
 
-	// Simple Field (maxDelayInMs)
-	_maxDelayInMs, _maxDelayInMsErr := /*TODO: migrate me*/ readBuffer.ReadUint32("maxDelayInMs", 32)
-	if _maxDelayInMsErr != nil {
-		return nil, errors.Wrap(_maxDelayInMsErr, "Error parsing 'maxDelayInMs' field of AdsAddDeviceNotificationRequest")
+	maxDelayInMs, err := ReadSimpleField(ctx, "maxDelayInMs", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'maxDelayInMs' field"))
 	}
-	maxDelayInMs := _maxDelayInMs
 
-	// Simple Field (cycleTimeInMs)
-	_cycleTimeInMs, _cycleTimeInMsErr := /*TODO: migrate me*/ readBuffer.ReadUint32("cycleTimeInMs", 32)
-	if _cycleTimeInMsErr != nil {
-		return nil, errors.Wrap(_cycleTimeInMsErr, "Error parsing 'cycleTimeInMs' field of AdsAddDeviceNotificationRequest")
+	cycleTimeInMs, err := ReadSimpleField(ctx, "cycleTimeInMs", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'cycleTimeInMs' field"))
 	}
-	cycleTimeInMs := _cycleTimeInMs
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedLong(readBuffer, 64), uint64(0x0000))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedLong(readBuffer, uint8(64)), uint64(0x0000))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	reservedField1, err := ReadReservedField(ctx, "reserved", ReadUnsignedLong(readBuffer, 64), uint64(0x0000))
+	reservedField1, err := ReadReservedField(ctx, "reserved", ReadUnsignedLong(readBuffer, uint8(64)), uint64(0x0000))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go
index 387d043e0b..86fead47ef 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsAddDeviceNotificationResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -152,6 +154,12 @@ func AdsAddDeviceNotificationResponseParse(ctx context.Context, theBytes []byte)
 	return AdsAddDeviceNotificationResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsAddDeviceNotificationResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsAddDeviceNotificationResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsAddDeviceNotificationResponse, error) {
+		return AdsAddDeviceNotificationResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsAddDeviceNotificationResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsAddDeviceNotificationResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -163,25 +171,15 @@ func AdsAddDeviceNotificationResponseParseWithBuffer(ctx context.Context, readBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsAddDeviceNotificationResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
-	// Simple Field (notificationHandle)
-	_notificationHandle, _notificationHandleErr := /*TODO: migrate me*/ readBuffer.ReadUint32("notificationHandle", 32)
-	if _notificationHandleErr != nil {
-		return nil, errors.Wrap(_notificationHandleErr, "Error parsing 'notificationHandle' field of AdsAddDeviceNotificationResponse")
+	notificationHandle, err := ReadSimpleField(ctx, "notificationHandle", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'notificationHandle' field"))
 	}
-	notificationHandle := _notificationHandle
 
 	if closeErr := readBuffer.CloseContext("AdsAddDeviceNotificationResponse"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsAddDeviceNotificationResponse")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsConstants.go b/plc4go/protocols/ads/readwrite/model/AdsConstants.go
index 7e75d33ffa..8ce0f7326f 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsConstants.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsConstants.go
@@ -105,6 +105,12 @@ func AdsConstantsParse(ctx context.Context, theBytes []byte) (AdsConstants, erro
 	return AdsConstantsParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsConstantsParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsConstants, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsConstants, error) {
+		return AdsConstantsParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsConstantsParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsConstants, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -116,7 +122,7 @@ func AdsConstantsParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	adsTcpDefaultPort, err := ReadConstField[uint16](ctx, "adsTcpDefaultPort", ReadUnsignedShort(readBuffer, 16), AdsConstants_ADSTCPDEFAULTPORT)
+	adsTcpDefaultPort, err := ReadConstField[uint16](ctx, "adsTcpDefaultPort", ReadUnsignedShort(readBuffer, uint8(16)), AdsConstants_ADSTCPDEFAULTPORT)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'adsTcpDefaultPort' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
index 340a6634f8..18f4200628 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeArrayInfo.go
@@ -27,6 +27,9 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	"github.com/apache/plc4x/plc4go/spi/codegen"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -133,6 +136,12 @@ func AdsDataTypeArrayInfoParse(ctx context.Context, theBytes []byte) (AdsDataTyp
 	return AdsDataTypeArrayInfoParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
 }
 
+func AdsDataTypeArrayInfoParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeArrayInfo, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeArrayInfo, error) {
+		return AdsDataTypeArrayInfoParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDataTypeArrayInfoParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeArrayInfo, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -144,19 +153,15 @@ func AdsDataTypeArrayInfoParseWithBuffer(ctx context.Context, readBuffer utils.R
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (lowerBound)
-	_lowerBound, _lowerBoundErr := /*TODO: migrate me*/ readBuffer.ReadUint32("lowerBound", 32)
-	if _lowerBoundErr != nil {
-		return nil, errors.Wrap(_lowerBoundErr, "Error parsing 'lowerBound' field of AdsDataTypeArrayInfo")
+	lowerBound, err := ReadSimpleField(ctx, "lowerBound", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'lowerBound' field"))
 	}
-	lowerBound := _lowerBound
 
-	// Simple Field (numElements)
-	_numElements, _numElementsErr := /*TODO: migrate me*/ readBuffer.ReadUint32("numElements", 32)
-	if _numElementsErr != nil {
-		return nil, errors.Wrap(_numElementsErr, "Error parsing 'numElements' field of AdsDataTypeArrayInfo")
+	numElements, err := ReadSimpleField(ctx, "numElements", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numElements' field"))
 	}
-	numElements := _numElements
 
 	// Virtual field
 	_upperBound := uint32(lowerBound) + uint32(numElements)
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
index 8bd78b91ef..22e4956163 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableChildEntry.go
@@ -317,6 +317,12 @@ func AdsDataTypeTableChildEntryParse(ctx context.Context, theBytes []byte) (AdsD
 	return AdsDataTypeTableChildEntryParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
 }
 
+func AdsDataTypeTableChildEntryParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeTableChildEntry, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeTableChildEntry, error) {
+		return AdsDataTypeTableChildEntryParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDataTypeTableChildEntryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeTableChildEntry, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -330,128 +336,102 @@ func AdsDataTypeTableChildEntryParseWithBuffer(ctx context.Context, readBuffer u
 	var startPos = positionAware.GetPos()
 	_ = startPos
 
-	// Simple Field (entryLength)
-	_entryLength, _entryLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("entryLength", 32)
-	if _entryLengthErr != nil {
-		return nil, errors.Wrap(_entryLengthErr, "Error parsing 'entryLength' field of AdsDataTypeTableChildEntry")
+	entryLength, err := ReadSimpleField(ctx, "entryLength", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'entryLength' field"))
 	}
-	entryLength := _entryLength
 
-	// Simple Field (version)
-	_version, _versionErr := /*TODO: migrate me*/ readBuffer.ReadUint32("version", 32)
-	if _versionErr != nil {
-		return nil, errors.Wrap(_versionErr, "Error parsing 'version' field of AdsDataTypeTableChildEntry")
+	version, err := ReadSimpleField(ctx, "version", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'version' field"))
 	}
-	version := _version
 
-	// Simple Field (hashValue)
-	_hashValue, _hashValueErr := /*TODO: migrate me*/ readBuffer.ReadUint32("hashValue", 32)
-	if _hashValueErr != nil {
-		return nil, errors.Wrap(_hashValueErr, "Error parsing 'hashValue' field of AdsDataTypeTableChildEntry")
+	hashValue, err := ReadSimpleField(ctx, "hashValue", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'hashValue' field"))
 	}
-	hashValue := _hashValue
 
-	// Simple Field (typeHashValue)
-	_typeHashValue, _typeHashValueErr := /*TODO: migrate me*/ readBuffer.ReadUint32("typeHashValue", 32)
-	if _typeHashValueErr != nil {
-		return nil, errors.Wrap(_typeHashValueErr, "Error parsing 'typeHashValue' field of AdsDataTypeTableChildEntry")
+	typeHashValue, err := ReadSimpleField(ctx, "typeHashValue", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'typeHashValue' field"))
 	}
-	typeHashValue := _typeHashValue
 
-	// Simple Field (size)
-	_size, _sizeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("size", 32)
-	if _sizeErr != nil {
-		return nil, errors.Wrap(_sizeErr, "Error parsing 'size' field of AdsDataTypeTableChildEntry")
+	size, err := ReadSimpleField(ctx, "size", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'size' field"))
 	}
-	size := _size
 
-	// Simple Field (offset)
-	_offset, _offsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("offset", 32)
-	if _offsetErr != nil {
-		return nil, errors.Wrap(_offsetErr, "Error parsing 'offset' field of AdsDataTypeTableChildEntry")
+	offset, err := ReadSimpleField(ctx, "offset", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'offset' field"))
 	}
-	offset := _offset
 
-	// Simple Field (dataType)
-	_dataType, _dataTypeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("dataType", 32)
-	if _dataTypeErr != nil {
-		return nil, errors.Wrap(_dataTypeErr, "Error parsing 'dataType' field of AdsDataTypeTableChildEntry")
+	dataType, err := ReadSimpleField(ctx, "dataType", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataType' field"))
 	}
-	dataType := _dataType
 
-	// Simple Field (flags)
-	_flags, _flagsErr := /*TODO: migrate me*/ readBuffer.ReadUint32("flags", 32)
-	if _flagsErr != nil {
-		return nil, errors.Wrap(_flagsErr, "Error parsing 'flags' field of AdsDataTypeTableChildEntry")
+	flags, err := ReadSimpleField(ctx, "flags", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flags' field"))
 	}
-	flags := _flags
 
-	propertyNameLength, err := ReadImplicitField[uint16](ctx, "propertyNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	propertyNameLength, err := ReadImplicitField[uint16](ctx, "propertyNameLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'propertyNameLength' field"))
 	}
 	_ = propertyNameLength
 
-	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameLength' field"))
 	}
 	_ = dataTypeNameLength
 
-	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentLength' field"))
 	}
 	_ = commentLength
 
-	// Simple Field (arrayDimensions)
-	_arrayDimensions, _arrayDimensionsErr := /*TODO: migrate me*/ readBuffer.ReadUint16("arrayDimensions", 16)
-	if _arrayDimensionsErr != nil {
-		return nil, errors.Wrap(_arrayDimensionsErr, "Error parsing 'arrayDimensions' field of AdsDataTypeTableChildEntry")
+	arrayDimensions, err := ReadSimpleField(ctx, "arrayDimensions", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'arrayDimensions' field"))
 	}
-	arrayDimensions := _arrayDimensions
 
-	// Simple Field (numChildren)
-	_numChildren, _numChildrenErr := /*TODO: migrate me*/ readBuffer.ReadUint16("numChildren", 16)
-	if _numChildrenErr != nil {
-		return nil, errors.Wrap(_numChildrenErr, "Error parsing 'numChildren' field of AdsDataTypeTableChildEntry")
+	numChildren, err := ReadSimpleField(ctx, "numChildren", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numChildren' field"))
 	}
-	numChildren := _numChildren
 
-	// Simple Field (propertyName)
-	_propertyName, _propertyNameErr := /*TODO: migrate me*/ readBuffer.ReadString("propertyName", uint32((propertyNameLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _propertyNameErr != nil {
-		return nil, errors.Wrap(_propertyNameErr, "Error parsing 'propertyName' field of AdsDataTypeTableChildEntry")
+	propertyName, err := ReadSimpleField(ctx, "propertyName", ReadString(readBuffer, uint32(int32(propertyNameLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'propertyName' field"))
 	}
-	propertyName := _propertyName
 
-	propertyNameTerminator, err := ReadConstField[uint8](ctx, "propertyNameTerminator", ReadUnsignedByte(readBuffer, 8), AdsDataTypeTableChildEntry_PROPERTYNAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	propertyNameTerminator, err := ReadConstField[uint8](ctx, "propertyNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsDataTypeTableChildEntry_PROPERTYNAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'propertyNameTerminator' field"))
 	}
 	_ = propertyNameTerminator
 
-	// Simple Field (dataTypeName)
-	_dataTypeName, _dataTypeNameErr := /*TODO: migrate me*/ readBuffer.ReadString("dataTypeName", uint32((dataTypeNameLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _dataTypeNameErr != nil {
-		return nil, errors.Wrap(_dataTypeNameErr, "Error parsing 'dataTypeName' field of AdsDataTypeTableChildEntry")
+	dataTypeName, err := ReadSimpleField(ctx, "dataTypeName", ReadString(readBuffer, uint32(int32(dataTypeNameLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeName' field"))
 	}
-	dataTypeName := _dataTypeName
 
-	dataTypeNameTerminator, err := ReadConstField[uint8](ctx, "dataTypeNameTerminator", ReadUnsignedByte(readBuffer, 8), AdsDataTypeTableChildEntry_DATATYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	dataTypeNameTerminator, err := ReadConstField[uint8](ctx, "dataTypeNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsDataTypeTableChildEntry_DATATYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameTerminator' field"))
 	}
 	_ = dataTypeNameTerminator
 
-	// Simple Field (comment)
-	_comment, _commentErr := /*TODO: migrate me*/ readBuffer.ReadString("comment", uint32((commentLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _commentErr != nil {
-		return nil, errors.Wrap(_commentErr, "Error parsing 'comment' field of AdsDataTypeTableChildEntry")
+	comment, err := ReadSimpleField(ctx, "comment", ReadString(readBuffer, uint32(int32(commentLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'comment' field"))
 	}
-	comment := _comment
 
-	commentTerminator, err := ReadConstField[uint8](ctx, "commentTerminator", ReadUnsignedByte(readBuffer, 8), AdsDataTypeTableChildEntry_COMMENTTERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	commentTerminator, err := ReadConstField[uint8](ctx, "commentTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsDataTypeTableChildEntry_COMMENTTERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentTerminator' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
index d3911ea9f2..692633f6d8 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDataTypeTableEntry.go
@@ -317,6 +317,12 @@ func AdsDataTypeTableEntryParse(ctx context.Context, theBytes []byte) (AdsDataTy
 	return AdsDataTypeTableEntryParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
 }
 
+func AdsDataTypeTableEntryParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeTableEntry, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeTableEntry, error) {
+		return AdsDataTypeTableEntryParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDataTypeTableEntryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDataTypeTableEntry, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -330,128 +336,102 @@ func AdsDataTypeTableEntryParseWithBuffer(ctx context.Context, readBuffer utils.
 	var startPos = positionAware.GetPos()
 	_ = startPos
 
-	// Simple Field (entryLength)
-	_entryLength, _entryLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("entryLength", 32)
-	if _entryLengthErr != nil {
-		return nil, errors.Wrap(_entryLengthErr, "Error parsing 'entryLength' field of AdsDataTypeTableEntry")
+	entryLength, err := ReadSimpleField(ctx, "entryLength", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'entryLength' field"))
 	}
-	entryLength := _entryLength
 
-	// Simple Field (version)
-	_version, _versionErr := /*TODO: migrate me*/ readBuffer.ReadUint32("version", 32)
-	if _versionErr != nil {
-		return nil, errors.Wrap(_versionErr, "Error parsing 'version' field of AdsDataTypeTableEntry")
+	version, err := ReadSimpleField(ctx, "version", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'version' field"))
 	}
-	version := _version
 
-	// Simple Field (hashValue)
-	_hashValue, _hashValueErr := /*TODO: migrate me*/ readBuffer.ReadUint32("hashValue", 32)
-	if _hashValueErr != nil {
-		return nil, errors.Wrap(_hashValueErr, "Error parsing 'hashValue' field of AdsDataTypeTableEntry")
+	hashValue, err := ReadSimpleField(ctx, "hashValue", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'hashValue' field"))
 	}
-	hashValue := _hashValue
 
-	// Simple Field (typeHashValue)
-	_typeHashValue, _typeHashValueErr := /*TODO: migrate me*/ readBuffer.ReadUint32("typeHashValue", 32)
-	if _typeHashValueErr != nil {
-		return nil, errors.Wrap(_typeHashValueErr, "Error parsing 'typeHashValue' field of AdsDataTypeTableEntry")
+	typeHashValue, err := ReadSimpleField(ctx, "typeHashValue", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'typeHashValue' field"))
 	}
-	typeHashValue := _typeHashValue
 
-	// Simple Field (size)
-	_size, _sizeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("size", 32)
-	if _sizeErr != nil {
-		return nil, errors.Wrap(_sizeErr, "Error parsing 'size' field of AdsDataTypeTableEntry")
+	size, err := ReadSimpleField(ctx, "size", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'size' field"))
 	}
-	size := _size
 
-	// Simple Field (offset)
-	_offset, _offsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("offset", 32)
-	if _offsetErr != nil {
-		return nil, errors.Wrap(_offsetErr, "Error parsing 'offset' field of AdsDataTypeTableEntry")
+	offset, err := ReadSimpleField(ctx, "offset", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'offset' field"))
 	}
-	offset := _offset
 
-	// Simple Field (dataType)
-	_dataType, _dataTypeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("dataType", 32)
-	if _dataTypeErr != nil {
-		return nil, errors.Wrap(_dataTypeErr, "Error parsing 'dataType' field of AdsDataTypeTableEntry")
+	dataType, err := ReadSimpleField(ctx, "dataType", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataType' field"))
 	}
-	dataType := _dataType
 
-	// Simple Field (flags)
-	_flags, _flagsErr := /*TODO: migrate me*/ readBuffer.ReadUint32("flags", 32)
-	if _flagsErr != nil {
-		return nil, errors.Wrap(_flagsErr, "Error parsing 'flags' field of AdsDataTypeTableEntry")
+	flags, err := ReadSimpleField(ctx, "flags", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flags' field"))
 	}
-	flags := _flags
 
-	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameLength' field"))
 	}
 	_ = dataTypeNameLength
 
-	simpleTypeNameLength, err := ReadImplicitField[uint16](ctx, "simpleTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	simpleTypeNameLength, err := ReadImplicitField[uint16](ctx, "simpleTypeNameLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'simpleTypeNameLength' field"))
 	}
 	_ = simpleTypeNameLength
 
-	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentLength' field"))
 	}
 	_ = commentLength
 
-	// Simple Field (arrayDimensions)
-	_arrayDimensions, _arrayDimensionsErr := /*TODO: migrate me*/ readBuffer.ReadUint16("arrayDimensions", 16)
-	if _arrayDimensionsErr != nil {
-		return nil, errors.Wrap(_arrayDimensionsErr, "Error parsing 'arrayDimensions' field of AdsDataTypeTableEntry")
+	arrayDimensions, err := ReadSimpleField(ctx, "arrayDimensions", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'arrayDimensions' field"))
 	}
-	arrayDimensions := _arrayDimensions
 
-	// Simple Field (numChildren)
-	_numChildren, _numChildrenErr := /*TODO: migrate me*/ readBuffer.ReadUint16("numChildren", 16)
-	if _numChildrenErr != nil {
-		return nil, errors.Wrap(_numChildrenErr, "Error parsing 'numChildren' field of AdsDataTypeTableEntry")
+	numChildren, err := ReadSimpleField(ctx, "numChildren", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'numChildren' field"))
 	}
-	numChildren := _numChildren
 
-	// Simple Field (dataTypeName)
-	_dataTypeName, _dataTypeNameErr := /*TODO: migrate me*/ readBuffer.ReadString("dataTypeName", uint32((dataTypeNameLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _dataTypeNameErr != nil {
-		return nil, errors.Wrap(_dataTypeNameErr, "Error parsing 'dataTypeName' field of AdsDataTypeTableEntry")
+	dataTypeName, err := ReadSimpleField(ctx, "dataTypeName", ReadString(readBuffer, uint32(int32(dataTypeNameLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeName' field"))
 	}
-	dataTypeName := _dataTypeName
 
-	dataTypeNameTerminator, err := ReadConstField[uint8](ctx, "dataTypeNameTerminator", ReadUnsignedByte(readBuffer, 8), AdsDataTypeTableEntry_DATATYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	dataTypeNameTerminator, err := ReadConstField[uint8](ctx, "dataTypeNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsDataTypeTableEntry_DATATYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameTerminator' field"))
 	}
 	_ = dataTypeNameTerminator
 
-	// Simple Field (simpleTypeName)
-	_simpleTypeName, _simpleTypeNameErr := /*TODO: migrate me*/ readBuffer.ReadString("simpleTypeName", uint32((simpleTypeNameLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _simpleTypeNameErr != nil {
-		return nil, errors.Wrap(_simpleTypeNameErr, "Error parsing 'simpleTypeName' field of AdsDataTypeTableEntry")
+	simpleTypeName, err := ReadSimpleField(ctx, "simpleTypeName", ReadString(readBuffer, uint32(int32(simpleTypeNameLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'simpleTypeName' field"))
 	}
-	simpleTypeName := _simpleTypeName
 
-	simpleTypeNameTerminator, err := ReadConstField[uint8](ctx, "simpleTypeNameTerminator", ReadUnsignedByte(readBuffer, 8), AdsDataTypeTableEntry_SIMPLETYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	simpleTypeNameTerminator, err := ReadConstField[uint8](ctx, "simpleTypeNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsDataTypeTableEntry_SIMPLETYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'simpleTypeNameTerminator' field"))
 	}
 	_ = simpleTypeNameTerminator
 
-	// Simple Field (comment)
-	_comment, _commentErr := /*TODO: migrate me*/ readBuffer.ReadString("comment", uint32((commentLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _commentErr != nil {
-		return nil, errors.Wrap(_commentErr, "Error parsing 'comment' field of AdsDataTypeTableEntry")
+	comment, err := ReadSimpleField(ctx, "comment", ReadString(readBuffer, uint32(int32(commentLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'comment' field"))
 	}
-	comment := _comment
 
-	commentTerminator, err := ReadConstField[uint8](ctx, "commentTerminator", ReadUnsignedByte(readBuffer, 8), AdsDataTypeTableEntry_COMMENTTERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	commentTerminator, err := ReadConstField[uint8](ctx, "commentTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsDataTypeTableEntry_COMMENTTERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentTerminator' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go
index 6d66783ee7..2173cb7056 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -141,6 +143,12 @@ func AdsDeleteDeviceNotificationRequestParse(ctx context.Context, theBytes []byt
 	return AdsDeleteDeviceNotificationRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDeleteDeviceNotificationRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeleteDeviceNotificationRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeleteDeviceNotificationRequest, error) {
+		return AdsDeleteDeviceNotificationRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDeleteDeviceNotificationRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeleteDeviceNotificationRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -152,12 +160,10 @@ func AdsDeleteDeviceNotificationRequestParseWithBuffer(ctx context.Context, read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (notificationHandle)
-	_notificationHandle, _notificationHandleErr := /*TODO: migrate me*/ readBuffer.ReadUint32("notificationHandle", 32)
-	if _notificationHandleErr != nil {
-		return nil, errors.Wrap(_notificationHandleErr, "Error parsing 'notificationHandle' field of AdsDeleteDeviceNotificationRequest")
+	notificationHandle, err := ReadSimpleField(ctx, "notificationHandle", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'notificationHandle' field"))
 	}
-	notificationHandle := _notificationHandle
 
 	if closeErr := readBuffer.CloseContext("AdsDeleteDeviceNotificationRequest"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsDeleteDeviceNotificationRequest")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go
index cf14016c7a..8e35723974 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeleteDeviceNotificationResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -141,6 +143,12 @@ func AdsDeleteDeviceNotificationResponseParse(ctx context.Context, theBytes []by
 	return AdsDeleteDeviceNotificationResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDeleteDeviceNotificationResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeleteDeviceNotificationResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeleteDeviceNotificationResponse, error) {
+		return AdsDeleteDeviceNotificationResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDeleteDeviceNotificationResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeleteDeviceNotificationResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -152,17 +160,9 @@ func AdsDeleteDeviceNotificationResponseParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsDeleteDeviceNotificationResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsDeleteDeviceNotificationResponse"); closeErr != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go
index 5d8230679c..5ed2d95144 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationRequest.go
@@ -172,6 +172,12 @@ func AdsDeviceNotificationRequestParse(ctx context.Context, theBytes []byte) (Ad
 	return AdsDeviceNotificationRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDeviceNotificationRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeviceNotificationRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeviceNotificationRequest, error) {
+		return AdsDeviceNotificationRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDeviceNotificationRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeviceNotificationRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -183,19 +189,15 @@ func AdsDeviceNotificationRequestParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (length)
-	_length, _lengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsDeviceNotificationRequest")
+	length, err := ReadSimpleField(ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
-	length := _length
 
-	// Simple Field (stamps)
-	_stamps, _stampsErr := /*TODO: migrate me*/ readBuffer.ReadUint32("stamps", 32)
-	if _stampsErr != nil {
-		return nil, errors.Wrap(_stampsErr, "Error parsing 'stamps' field of AdsDeviceNotificationRequest")
+	stamps, err := ReadSimpleField(ctx, "stamps", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'stamps' field"))
 	}
-	stamps := _stamps
 
 	adsStampHeaders, err := ReadCountArrayField[AdsStampHeader](ctx, "adsStampHeaders", ReadComplex[AdsStampHeader](AdsStampHeaderParseWithBuffer, readBuffer), uint64(stamps))
 	if err != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go
index 2794b31eb4..1f0e1aaed0 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsDeviceNotificationResponse.go
@@ -120,6 +120,12 @@ func AdsDeviceNotificationResponseParse(ctx context.Context, theBytes []byte) (A
 	return AdsDeviceNotificationResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsDeviceNotificationResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeviceNotificationResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeviceNotificationResponse, error) {
+		return AdsDeviceNotificationResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsDeviceNotificationResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsDeviceNotificationResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go b/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go
index 1b47f7611d..ca9bfc3e9e 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsInvalidRequest.go
@@ -120,6 +120,12 @@ func AdsInvalidRequestParse(ctx context.Context, theBytes []byte) (AdsInvalidReq
 	return AdsInvalidRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsInvalidRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsInvalidRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsInvalidRequest, error) {
+		return AdsInvalidRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsInvalidRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsInvalidRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go b/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go
index 79b5dd9306..81df2031d6 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsInvalidResponse.go
@@ -120,6 +120,12 @@ func AdsInvalidResponseParse(ctx context.Context, theBytes []byte) (AdsInvalidRe
 	return AdsInvalidResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsInvalidResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsInvalidResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsInvalidResponse, error) {
+		return AdsInvalidResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsInvalidResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsInvalidResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go
index a3d8a0594d..87732f3092 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItem.go
@@ -106,6 +106,17 @@ func AdsMultiRequestItemParse(ctx context.Context, theBytes []byte, indexGroup u
 	return AdsMultiRequestItemParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), indexGroup)
 }
 
+func AdsMultiRequestItemParseWithBufferProducer[T AdsMultiRequestItem](indexGroup uint32) func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := AdsMultiRequestItemParseWithBuffer(ctx, readBuffer, indexGroup)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func AdsMultiRequestItemParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, indexGroup uint32) (AdsMultiRequestItem, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go
index a3218baeed..d62cd2c691 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemRead.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -152,6 +154,12 @@ func AdsMultiRequestItemReadParse(ctx context.Context, theBytes []byte, indexGro
 	return AdsMultiRequestItemReadParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), indexGroup)
 }
 
+func AdsMultiRequestItemReadParseWithBufferProducer(indexGroup uint32) func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsMultiRequestItemRead, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsMultiRequestItemRead, error) {
+		return AdsMultiRequestItemReadParseWithBuffer(ctx, readBuffer, indexGroup)
+	}
+}
+
 func AdsMultiRequestItemReadParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, indexGroup uint32) (AdsMultiRequestItemRead, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -163,26 +171,20 @@ func AdsMultiRequestItemReadParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (itemIndexGroup)
-	_itemIndexGroup, _itemIndexGroupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemIndexGroup", 32)
-	if _itemIndexGroupErr != nil {
-		return nil, errors.Wrap(_itemIndexGroupErr, "Error parsing 'itemIndexGroup' field of AdsMultiRequestItemRead")
+	itemIndexGroup, err := ReadSimpleField(ctx, "itemIndexGroup", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemIndexGroup' field"))
 	}
-	itemIndexGroup := _itemIndexGroup
 
-	// Simple Field (itemIndexOffset)
-	_itemIndexOffset, _itemIndexOffsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemIndexOffset", 32)
-	if _itemIndexOffsetErr != nil {
-		return nil, errors.Wrap(_itemIndexOffsetErr, "Error parsing 'itemIndexOffset' field of AdsMultiRequestItemRead")
+	itemIndexOffset, err := ReadSimpleField(ctx, "itemIndexOffset", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemIndexOffset' field"))
 	}
-	itemIndexOffset := _itemIndexOffset
 
-	// Simple Field (itemReadLength)
-	_itemReadLength, _itemReadLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemReadLength", 32)
-	if _itemReadLengthErr != nil {
-		return nil, errors.Wrap(_itemReadLengthErr, "Error parsing 'itemReadLength' field of AdsMultiRequestItemRead")
+	itemReadLength, err := ReadSimpleField(ctx, "itemReadLength", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemReadLength' field"))
 	}
-	itemReadLength := _itemReadLength
 
 	if closeErr := readBuffer.CloseContext("AdsMultiRequestItemRead"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsMultiRequestItemRead")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemReadWrite.go b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemReadWrite.go
index d96a5dfb19..80d5eec604 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemReadWrite.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemReadWrite.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -163,6 +165,12 @@ func AdsMultiRequestItemReadWriteParse(ctx context.Context, theBytes []byte, ind
 	return AdsMultiRequestItemReadWriteParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), indexGroup)
 }
 
+func AdsMultiRequestItemReadWriteParseWithBufferProducer(indexGroup uint32) func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsMultiRequestItemReadWrite, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsMultiRequestItemReadWrite, error) {
+		return AdsMultiRequestItemReadWriteParseWithBuffer(ctx, readBuffer, indexGroup)
+	}
+}
+
 func AdsMultiRequestItemReadWriteParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, indexGroup uint32) (AdsMultiRequestItemReadWrite, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -174,33 +182,25 @@ func AdsMultiRequestItemReadWriteParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (itemIndexGroup)
-	_itemIndexGroup, _itemIndexGroupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemIndexGroup", 32)
-	if _itemIndexGroupErr != nil {
-		return nil, errors.Wrap(_itemIndexGroupErr, "Error parsing 'itemIndexGroup' field of AdsMultiRequestItemReadWrite")
+	itemIndexGroup, err := ReadSimpleField(ctx, "itemIndexGroup", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemIndexGroup' field"))
 	}
-	itemIndexGroup := _itemIndexGroup
 
-	// Simple Field (itemIndexOffset)
-	_itemIndexOffset, _itemIndexOffsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemIndexOffset", 32)
-	if _itemIndexOffsetErr != nil {
-		return nil, errors.Wrap(_itemIndexOffsetErr, "Error parsing 'itemIndexOffset' field of AdsMultiRequestItemReadWrite")
+	itemIndexOffset, err := ReadSimpleField(ctx, "itemIndexOffset", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemIndexOffset' field"))
 	}
-	itemIndexOffset := _itemIndexOffset
 
-	// Simple Field (itemReadLength)
-	_itemReadLength, _itemReadLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemReadLength", 32)
-	if _itemReadLengthErr != nil {
-		return nil, errors.Wrap(_itemReadLengthErr, "Error parsing 'itemReadLength' field of AdsMultiRequestItemReadWrite")
+	itemReadLength, err := ReadSimpleField(ctx, "itemReadLength", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemReadLength' field"))
 	}
-	itemReadLength := _itemReadLength
 
-	// Simple Field (itemWriteLength)
-	_itemWriteLength, _itemWriteLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemWriteLength", 32)
-	if _itemWriteLengthErr != nil {
-		return nil, errors.Wrap(_itemWriteLengthErr, "Error parsing 'itemWriteLength' field of AdsMultiRequestItemReadWrite")
+	itemWriteLength, err := ReadSimpleField(ctx, "itemWriteLength", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemWriteLength' field"))
 	}
-	itemWriteLength := _itemWriteLength
 
 	if closeErr := readBuffer.CloseContext("AdsMultiRequestItemReadWrite"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsMultiRequestItemReadWrite")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go
index d1f251e75e..a2ef968909 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsMultiRequestItemWrite.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -152,6 +154,12 @@ func AdsMultiRequestItemWriteParse(ctx context.Context, theBytes []byte, indexGr
 	return AdsMultiRequestItemWriteParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), indexGroup)
 }
 
+func AdsMultiRequestItemWriteParseWithBufferProducer(indexGroup uint32) func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsMultiRequestItemWrite, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsMultiRequestItemWrite, error) {
+		return AdsMultiRequestItemWriteParseWithBuffer(ctx, readBuffer, indexGroup)
+	}
+}
+
 func AdsMultiRequestItemWriteParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, indexGroup uint32) (AdsMultiRequestItemWrite, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -163,26 +171,20 @@ func AdsMultiRequestItemWriteParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (itemIndexGroup)
-	_itemIndexGroup, _itemIndexGroupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemIndexGroup", 32)
-	if _itemIndexGroupErr != nil {
-		return nil, errors.Wrap(_itemIndexGroupErr, "Error parsing 'itemIndexGroup' field of AdsMultiRequestItemWrite")
+	itemIndexGroup, err := ReadSimpleField(ctx, "itemIndexGroup", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemIndexGroup' field"))
 	}
-	itemIndexGroup := _itemIndexGroup
 
-	// Simple Field (itemIndexOffset)
-	_itemIndexOffset, _itemIndexOffsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemIndexOffset", 32)
-	if _itemIndexOffsetErr != nil {
-		return nil, errors.Wrap(_itemIndexOffsetErr, "Error parsing 'itemIndexOffset' field of AdsMultiRequestItemWrite")
+	itemIndexOffset, err := ReadSimpleField(ctx, "itemIndexOffset", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemIndexOffset' field"))
 	}
-	itemIndexOffset := _itemIndexOffset
 
-	// Simple Field (itemWriteLength)
-	_itemWriteLength, _itemWriteLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("itemWriteLength", 32)
-	if _itemWriteLengthErr != nil {
-		return nil, errors.Wrap(_itemWriteLengthErr, "Error parsing 'itemWriteLength' field of AdsMultiRequestItemWrite")
+	itemWriteLength, err := ReadSimpleField(ctx, "itemWriteLength", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'itemWriteLength' field"))
 	}
-	itemWriteLength := _itemWriteLength
 
 	if closeErr := readBuffer.CloseContext("AdsMultiRequestItemWrite"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsMultiRequestItemWrite")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go b/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go
index 31b9835dbe..25f1da96a4 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsNotificationSample.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -125,6 +127,12 @@ func AdsNotificationSampleParse(ctx context.Context, theBytes []byte) (AdsNotifi
 	return AdsNotificationSampleParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsNotificationSampleParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsNotificationSample, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsNotificationSample, error) {
+		return AdsNotificationSampleParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsNotificationSampleParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsNotificationSample, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -136,19 +144,15 @@ func AdsNotificationSampleParseWithBuffer(ctx context.Context, readBuffer utils.
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (notificationHandle)
-	_notificationHandle, _notificationHandleErr := /*TODO: migrate me*/ readBuffer.ReadUint32("notificationHandle", 32)
-	if _notificationHandleErr != nil {
-		return nil, errors.Wrap(_notificationHandleErr, "Error parsing 'notificationHandle' field of AdsNotificationSample")
+	notificationHandle, err := ReadSimpleField(ctx, "notificationHandle", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'notificationHandle' field"))
 	}
-	notificationHandle := _notificationHandle
 
-	// Simple Field (sampleSize)
-	_sampleSize, _sampleSizeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("sampleSize", 32)
-	if _sampleSizeErr != nil {
-		return nil, errors.Wrap(_sampleSizeErr, "Error parsing 'sampleSize' field of AdsNotificationSample")
+	sampleSize, err := ReadSimpleField(ctx, "sampleSize", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sampleSize' field"))
 	}
-	sampleSize := _sampleSize
 
 	data, err := readBuffer.ReadByteArray("data", int(sampleSize))
 	if err != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go
index c37c8a02a3..3580f56768 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoRequest.go
@@ -120,6 +120,12 @@ func AdsReadDeviceInfoRequestParse(ctx context.Context, theBytes []byte) (AdsRea
 	return AdsReadDeviceInfoRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadDeviceInfoRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadDeviceInfoRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadDeviceInfoRequest, error) {
+		return AdsReadDeviceInfoRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadDeviceInfoRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadDeviceInfoRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go
index aeeeb4ab07..c5e53d252c 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadDeviceInfoResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -187,6 +189,12 @@ func AdsReadDeviceInfoResponseParse(ctx context.Context, theBytes []byte) (AdsRe
 	return AdsReadDeviceInfoResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadDeviceInfoResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadDeviceInfoResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadDeviceInfoResponse, error) {
+		return AdsReadDeviceInfoResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadDeviceInfoResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadDeviceInfoResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -198,39 +206,25 @@ func AdsReadDeviceInfoResponseParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadDeviceInfoResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
-	// Simple Field (majorVersion)
-	_majorVersion, _majorVersionErr := /*TODO: migrate me*/ readBuffer.ReadUint8("majorVersion", 8)
-	if _majorVersionErr != nil {
-		return nil, errors.Wrap(_majorVersionErr, "Error parsing 'majorVersion' field of AdsReadDeviceInfoResponse")
+	majorVersion, err := ReadSimpleField(ctx, "majorVersion", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'majorVersion' field"))
 	}
-	majorVersion := _majorVersion
 
-	// Simple Field (minorVersion)
-	_minorVersion, _minorVersionErr := /*TODO: migrate me*/ readBuffer.ReadUint8("minorVersion", 8)
-	if _minorVersionErr != nil {
-		return nil, errors.Wrap(_minorVersionErr, "Error parsing 'minorVersion' field of AdsReadDeviceInfoResponse")
+	minorVersion, err := ReadSimpleField(ctx, "minorVersion", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'minorVersion' field"))
 	}
-	minorVersion := _minorVersion
 
-	// Simple Field (version)
-	_version, _versionErr := /*TODO: migrate me*/ readBuffer.ReadUint16("version", 16)
-	if _versionErr != nil {
-		return nil, errors.Wrap(_versionErr, "Error parsing 'version' field of AdsReadDeviceInfoResponse")
+	version, err := ReadSimpleField(ctx, "version", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'version' field"))
 	}
-	version := _version
 
 	device, err := readBuffer.ReadByteArray("device", int(int32(16)))
 	if err != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go
index 4a4ce06cab..e4c788d566 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadRequest.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -163,6 +165,12 @@ func AdsReadRequestParse(ctx context.Context, theBytes []byte) (AdsReadRequest,
 	return AdsReadRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadRequest, error) {
+		return AdsReadRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -174,26 +182,20 @@ func AdsReadRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexGroup", 32)
-	if _indexGroupErr != nil {
-		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsReadRequest")
+	indexGroup, err := ReadSimpleField(ctx, "indexGroup", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexGroup' field"))
 	}
-	indexGroup := _indexGroup
 
-	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexOffset", 32)
-	if _indexOffsetErr != nil {
-		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsReadRequest")
+	indexOffset, err := ReadSimpleField(ctx, "indexOffset", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexOffset' field"))
 	}
-	indexOffset := _indexOffset
 
-	// Simple Field (length)
-	_length, _lengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("length", 32)
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AdsReadRequest")
+	length, err := ReadSimpleField(ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
-	length := _length
 
 	if closeErr := readBuffer.CloseContext("AdsReadRequest"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsReadRequest")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
index b785a64ede..b0bf72888d 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadResponse.go
@@ -159,6 +159,12 @@ func AdsReadResponseParse(ctx context.Context, theBytes []byte) (AdsReadResponse
 	return AdsReadResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadResponse, error) {
+		return AdsReadResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -170,20 +176,12 @@ func AdsReadResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
-	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go
index 153dc87525..e2c5daa983 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadStateRequest.go
@@ -120,6 +120,12 @@ func AdsReadStateRequestParse(ctx context.Context, theBytes []byte) (AdsReadStat
 	return AdsReadStateRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadStateRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadStateRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadStateRequest, error) {
+		return AdsReadStateRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadStateRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadStateRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go
index c89045479e..6050feed93 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadStateResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -163,6 +165,12 @@ func AdsReadStateResponseParse(ctx context.Context, theBytes []byte) (AdsReadSta
 	return AdsReadStateResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadStateResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadStateResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadStateResponse, error) {
+		return AdsReadStateResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadStateResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadStateResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -174,32 +182,20 @@ func AdsReadStateResponseParseWithBuffer(ctx context.Context, readBuffer utils.R
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadStateResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
-	// Simple Field (adsState)
-	_adsState, _adsStateErr := /*TODO: migrate me*/ readBuffer.ReadUint16("adsState", 16)
-	if _adsStateErr != nil {
-		return nil, errors.Wrap(_adsStateErr, "Error parsing 'adsState' field of AdsReadStateResponse")
+	adsState, err := ReadSimpleField(ctx, "adsState", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'adsState' field"))
 	}
-	adsState := _adsState
 
-	// Simple Field (deviceState)
-	_deviceState, _deviceStateErr := /*TODO: migrate me*/ readBuffer.ReadUint16("deviceState", 16)
-	if _deviceStateErr != nil {
-		return nil, errors.Wrap(_deviceStateErr, "Error parsing 'deviceState' field of AdsReadStateResponse")
+	deviceState, err := ReadSimpleField(ctx, "deviceState", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'deviceState' field"))
 	}
-	deviceState := _deviceState
 
 	if closeErr := readBuffer.CloseContext("AdsReadStateResponse"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsReadStateResponse")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go b/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
index 082688b282..af831ebd7e 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadWriteRequest.go
@@ -199,6 +199,12 @@ func AdsReadWriteRequestParse(ctx context.Context, theBytes []byte) (AdsReadWrit
 	return AdsReadWriteRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadWriteRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadWriteRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadWriteRequest, error) {
+		return AdsReadWriteRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadWriteRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadWriteRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -210,40 +216,28 @@ func AdsReadWriteRequestParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexGroup", 32)
-	if _indexGroupErr != nil {
-		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsReadWriteRequest")
+	indexGroup, err := ReadSimpleField(ctx, "indexGroup", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexGroup' field"))
 	}
-	indexGroup := _indexGroup
 
-	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexOffset", 32)
-	if _indexOffsetErr != nil {
-		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsReadWriteRequest")
+	indexOffset, err := ReadSimpleField(ctx, "indexOffset", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexOffset' field"))
 	}
-	indexOffset := _indexOffset
 
-	// Simple Field (readLength)
-	_readLength, _readLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("readLength", 32)
-	if _readLengthErr != nil {
-		return nil, errors.Wrap(_readLengthErr, "Error parsing 'readLength' field of AdsReadWriteRequest")
+	readLength, err := ReadSimpleField(ctx, "readLength", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'readLength' field"))
 	}
-	readLength := _readLength
 
-	writeLength, err := ReadImplicitField[uint32](ctx, "writeLength", ReadUnsignedInt(readBuffer, 32))
+	writeLength, err := ReadImplicitField[uint32](ctx, "writeLength", ReadUnsignedInt(readBuffer, uint8(32)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'writeLength' field"))
 	}
 	_ = writeLength
 
-	items, err := ReadCountArrayField[AdsMultiRequestItem](ctx, "items", ReadComplex[AdsMultiRequestItem](func(ctx context.Context, buffer utils.ReadBuffer) (AdsMultiRequestItem, error) {
-		v, err := AdsMultiRequestItemParseWithBuffer(ctx, readBuffer, (uint32)(indexGroup))
-		if err != nil {
-			return nil, err
-		}
-		return v.(AdsMultiRequestItem), nil
-	}, readBuffer), uint64(utils.InlineIf((bool(bool((bool((indexGroup) == (61568)))) || bool((bool((indexGroup) == (61569))))) || bool((bool((indexGroup) == (61570))))), func() any { return int32(indexOffset) }, func() any { return int32(int32(0)) }).(int32)))
+	items, err := ReadCountArrayField[AdsMultiRequestItem](ctx, "items", ReadComplex[AdsMultiRequestItem](AdsMultiRequestItemParseWithBufferProducer[AdsMultiRequestItem]((uint32)(indexGroup)), readBuffer), uint64(utils.InlineIf((bool(bool((bool((indexGroup) == (61568)))) || bool((bool((indexGroup) == (61569))))) || bool((bool((indexGroup) == (61570))))), func() any { return int32(indexOffset) }, func() any { return int32(int32(0)) }).(int32)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'items' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go b/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
index e259fa2194..40c8c3e41b 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsReadWriteResponse.go
@@ -159,6 +159,12 @@ func AdsReadWriteResponseParse(ctx context.Context, theBytes []byte) (AdsReadWri
 	return AdsReadWriteResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsReadWriteResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadWriteResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadWriteResponse, error) {
+		return AdsReadWriteResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsReadWriteResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsReadWriteResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -170,20 +176,12 @@ func AdsReadWriteResponseParseWithBuffer(ctx context.Context, readBuffer utils.R
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsReadWriteResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
-	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go b/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go
index 5cc29b4dc1..453a3163c4 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsStampHeader.go
@@ -132,6 +132,12 @@ func AdsStampHeaderParse(ctx context.Context, theBytes []byte) (AdsStampHeader,
 	return AdsStampHeaderParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsStampHeaderParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsStampHeader, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsStampHeader, error) {
+		return AdsStampHeaderParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsStampHeaderParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsStampHeader, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -143,19 +149,15 @@ func AdsStampHeaderParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (timestamp)
-	_timestamp, _timestampErr := /*TODO: migrate me*/ readBuffer.ReadUint64("timestamp", 64)
-	if _timestampErr != nil {
-		return nil, errors.Wrap(_timestampErr, "Error parsing 'timestamp' field of AdsStampHeader")
+	timestamp, err := ReadSimpleField(ctx, "timestamp", ReadUnsignedLong(readBuffer, uint8(64)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'timestamp' field"))
 	}
-	timestamp := _timestamp
 
-	// Simple Field (samples)
-	_samples, _samplesErr := /*TODO: migrate me*/ readBuffer.ReadUint32("samples", 32)
-	if _samplesErr != nil {
-		return nil, errors.Wrap(_samplesErr, "Error parsing 'samples' field of AdsStampHeader")
+	samples, err := ReadSimpleField(ctx, "samples", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'samples' field"))
 	}
-	samples := _samples
 
 	adsNotificationSamples, err := ReadCountArrayField[AdsNotificationSample](ctx, "adsNotificationSamples", ReadComplex[AdsNotificationSample](AdsNotificationSampleParseWithBuffer, readBuffer), uint64(samples))
 	if err != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
index 913720f36f..4672a236e2 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsSymbolTableEntry.go
@@ -372,6 +372,12 @@ func AdsSymbolTableEntryParse(ctx context.Context, theBytes []byte) (AdsSymbolTa
 	return AdsSymbolTableEntryParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
 }
 
+func AdsSymbolTableEntryParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsSymbolTableEntry, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsSymbolTableEntry, error) {
+		return AdsSymbolTableEntryParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsSymbolTableEntryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsSymbolTableEntry, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -385,194 +391,152 @@ func AdsSymbolTableEntryParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	var startPos = positionAware.GetPos()
 	_ = startPos
 
-	// Simple Field (entryLength)
-	_entryLength, _entryLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("entryLength", 32)
-	if _entryLengthErr != nil {
-		return nil, errors.Wrap(_entryLengthErr, "Error parsing 'entryLength' field of AdsSymbolTableEntry")
+	entryLength, err := ReadSimpleField(ctx, "entryLength", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'entryLength' field"))
 	}
-	entryLength := _entryLength
 
-	// Simple Field (group)
-	_group, _groupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("group", 32)
-	if _groupErr != nil {
-		return nil, errors.Wrap(_groupErr, "Error parsing 'group' field of AdsSymbolTableEntry")
+	group, err := ReadSimpleField(ctx, "group", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'group' field"))
 	}
-	group := _group
 
-	// Simple Field (offset)
-	_offset, _offsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("offset", 32)
-	if _offsetErr != nil {
-		return nil, errors.Wrap(_offsetErr, "Error parsing 'offset' field of AdsSymbolTableEntry")
+	offset, err := ReadSimpleField(ctx, "offset", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'offset' field"))
 	}
-	offset := _offset
 
-	// Simple Field (size)
-	_size, _sizeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("size", 32)
-	if _sizeErr != nil {
-		return nil, errors.Wrap(_sizeErr, "Error parsing 'size' field of AdsSymbolTableEntry")
+	size, err := ReadSimpleField(ctx, "size", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'size' field"))
 	}
-	size := _size
 
-	// Simple Field (dataType)
-	_dataType, _dataTypeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("dataType", 32)
-	if _dataTypeErr != nil {
-		return nil, errors.Wrap(_dataTypeErr, "Error parsing 'dataType' field of AdsSymbolTableEntry")
+	dataType, err := ReadSimpleField(ctx, "dataType", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataType' field"))
 	}
-	dataType := _dataType
 
-	// Simple Field (flagMethodDeref)
-	_flagMethodDeref, _flagMethodDerefErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagMethodDeref")
-	if _flagMethodDerefErr != nil {
-		return nil, errors.Wrap(_flagMethodDerefErr, "Error parsing 'flagMethodDeref' field of AdsSymbolTableEntry")
+	flagMethodDeref, err := ReadSimpleField(ctx, "flagMethodDeref", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagMethodDeref' field"))
 	}
-	flagMethodDeref := _flagMethodDeref
 
-	// Simple Field (flagItfMethodAccess)
-	_flagItfMethodAccess, _flagItfMethodAccessErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagItfMethodAccess")
-	if _flagItfMethodAccessErr != nil {
-		return nil, errors.Wrap(_flagItfMethodAccessErr, "Error parsing 'flagItfMethodAccess' field of AdsSymbolTableEntry")
+	flagItfMethodAccess, err := ReadSimpleField(ctx, "flagItfMethodAccess", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagItfMethodAccess' field"))
 	}
-	flagItfMethodAccess := _flagItfMethodAccess
 
-	// Simple Field (flagReadOnly)
-	_flagReadOnly, _flagReadOnlyErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagReadOnly")
-	if _flagReadOnlyErr != nil {
-		return nil, errors.Wrap(_flagReadOnlyErr, "Error parsing 'flagReadOnly' field of AdsSymbolTableEntry")
+	flagReadOnly, err := ReadSimpleField(ctx, "flagReadOnly", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagReadOnly' field"))
 	}
-	flagReadOnly := _flagReadOnly
 
-	// Simple Field (flagTComInterfacePointer)
-	_flagTComInterfacePointer, _flagTComInterfacePointerErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagTComInterfacePointer")
-	if _flagTComInterfacePointerErr != nil {
-		return nil, errors.Wrap(_flagTComInterfacePointerErr, "Error parsing 'flagTComInterfacePointer' field of AdsSymbolTableEntry")
+	flagTComInterfacePointer, err := ReadSimpleField(ctx, "flagTComInterfacePointer", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagTComInterfacePointer' field"))
 	}
-	flagTComInterfacePointer := _flagTComInterfacePointer
 
-	// Simple Field (flagTypeGuid)
-	_flagTypeGuid, _flagTypeGuidErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagTypeGuid")
-	if _flagTypeGuidErr != nil {
-		return nil, errors.Wrap(_flagTypeGuidErr, "Error parsing 'flagTypeGuid' field of AdsSymbolTableEntry")
+	flagTypeGuid, err := ReadSimpleField(ctx, "flagTypeGuid", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagTypeGuid' field"))
 	}
-	flagTypeGuid := _flagTypeGuid
 
-	// Simple Field (flagReferenceTo)
-	_flagReferenceTo, _flagReferenceToErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagReferenceTo")
-	if _flagReferenceToErr != nil {
-		return nil, errors.Wrap(_flagReferenceToErr, "Error parsing 'flagReferenceTo' field of AdsSymbolTableEntry")
+	flagReferenceTo, err := ReadSimpleField(ctx, "flagReferenceTo", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagReferenceTo' field"))
 	}
-	flagReferenceTo := _flagReferenceTo
 
-	// Simple Field (flagBitValue)
-	_flagBitValue, _flagBitValueErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagBitValue")
-	if _flagBitValueErr != nil {
-		return nil, errors.Wrap(_flagBitValueErr, "Error parsing 'flagBitValue' field of AdsSymbolTableEntry")
+	flagBitValue, err := ReadSimpleField(ctx, "flagBitValue", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagBitValue' field"))
 	}
-	flagBitValue := _flagBitValue
 
-	// Simple Field (flagPersistent)
-	_flagPersistent, _flagPersistentErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagPersistent")
-	if _flagPersistentErr != nil {
-		return nil, errors.Wrap(_flagPersistentErr, "Error parsing 'flagPersistent' field of AdsSymbolTableEntry")
+	flagPersistent, err := ReadSimpleField(ctx, "flagPersistent", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagPersistent' field"))
 	}
-	flagPersistent := _flagPersistent
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 3), uint8(0x00), codegen.WithByteOrder(binary.LittleEndian))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(3)), uint8(0x00), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (flagExtendedFlags)
-	_flagExtendedFlags, _flagExtendedFlagsErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagExtendedFlags")
-	if _flagExtendedFlagsErr != nil {
-		return nil, errors.Wrap(_flagExtendedFlagsErr, "Error parsing 'flagExtendedFlags' field of AdsSymbolTableEntry")
+	flagExtendedFlags, err := ReadSimpleField(ctx, "flagExtendedFlags", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagExtendedFlags' field"))
 	}
-	flagExtendedFlags := _flagExtendedFlags
 
-	// Simple Field (flagInitOnReset)
-	_flagInitOnReset, _flagInitOnResetErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagInitOnReset")
-	if _flagInitOnResetErr != nil {
-		return nil, errors.Wrap(_flagInitOnResetErr, "Error parsing 'flagInitOnReset' field of AdsSymbolTableEntry")
+	flagInitOnReset, err := ReadSimpleField(ctx, "flagInitOnReset", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagInitOnReset' field"))
 	}
-	flagInitOnReset := _flagInitOnReset
 
-	// Simple Field (flagStatic)
-	_flagStatic, _flagStaticErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagStatic")
-	if _flagStaticErr != nil {
-		return nil, errors.Wrap(_flagStaticErr, "Error parsing 'flagStatic' field of AdsSymbolTableEntry")
+	flagStatic, err := ReadSimpleField(ctx, "flagStatic", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagStatic' field"))
 	}
-	flagStatic := _flagStatic
 
-	// Simple Field (flagAttributes)
-	_flagAttributes, _flagAttributesErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagAttributes")
-	if _flagAttributesErr != nil {
-		return nil, errors.Wrap(_flagAttributesErr, "Error parsing 'flagAttributes' field of AdsSymbolTableEntry")
+	flagAttributes, err := ReadSimpleField(ctx, "flagAttributes", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagAttributes' field"))
 	}
-	flagAttributes := _flagAttributes
 
-	// Simple Field (flagContextMask)
-	_flagContextMask, _flagContextMaskErr := /*TODO: migrate me*/ readBuffer.ReadBit("flagContextMask")
-	if _flagContextMaskErr != nil {
-		return nil, errors.Wrap(_flagContextMaskErr, "Error parsing 'flagContextMask' field of AdsSymbolTableEntry")
+	flagContextMask, err := ReadSimpleField(ctx, "flagContextMask", ReadBoolean(readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'flagContextMask' field"))
 	}
-	flagContextMask := _flagContextMask
 
-	reservedField1, err := ReadReservedField(ctx, "reserved", ReadUnsignedShort(readBuffer, 16), uint16(0x0000), codegen.WithByteOrder(binary.LittleEndian))
+	reservedField1, err := ReadReservedField(ctx, "reserved", ReadUnsignedShort(readBuffer, uint8(16)), uint16(0x0000), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	nameLength, err := ReadImplicitField[uint16](ctx, "nameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	nameLength, err := ReadImplicitField[uint16](ctx, "nameLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'nameLength' field"))
 	}
 	_ = nameLength
 
-	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	dataTypeNameLength, err := ReadImplicitField[uint16](ctx, "dataTypeNameLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameLength' field"))
 	}
 	_ = dataTypeNameLength
 
-	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, 16), codegen.WithByteOrder(binary.LittleEndian))
+	commentLength, err := ReadImplicitField[uint16](ctx, "commentLength", ReadUnsignedShort(readBuffer, uint8(16)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentLength' field"))
 	}
 	_ = commentLength
 
-	// Simple Field (name)
-	_name, _nameErr := /*TODO: migrate me*/ readBuffer.ReadString("name", uint32((nameLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _nameErr != nil {
-		return nil, errors.Wrap(_nameErr, "Error parsing 'name' field of AdsSymbolTableEntry")
+	name, err := ReadSimpleField(ctx, "name", ReadString(readBuffer, uint32(int32(nameLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'name' field"))
 	}
-	name := _name
 
-	nameTerminator, err := ReadConstField[uint8](ctx, "nameTerminator", ReadUnsignedByte(readBuffer, 8), AdsSymbolTableEntry_NAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	nameTerminator, err := ReadConstField[uint8](ctx, "nameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsSymbolTableEntry_NAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'nameTerminator' field"))
 	}
 	_ = nameTerminator
 
-	// Simple Field (dataTypeName)
-	_dataTypeName, _dataTypeNameErr := /*TODO: migrate me*/ readBuffer.ReadString("dataTypeName", uint32((dataTypeNameLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _dataTypeNameErr != nil {
-		return nil, errors.Wrap(_dataTypeNameErr, "Error parsing 'dataTypeName' field of AdsSymbolTableEntry")
+	dataTypeName, err := ReadSimpleField(ctx, "dataTypeName", ReadString(readBuffer, uint32(int32(dataTypeNameLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeName' field"))
 	}
-	dataTypeName := _dataTypeName
 
-	dataTypeNameTerminator, err := ReadConstField[uint8](ctx, "dataTypeNameTerminator", ReadUnsignedByte(readBuffer, 8), AdsSymbolTableEntry_DATATYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	dataTypeNameTerminator, err := ReadConstField[uint8](ctx, "dataTypeNameTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsSymbolTableEntry_DATATYPENAMETERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeNameTerminator' field"))
 	}
 	_ = dataTypeNameTerminator
 
-	// Simple Field (comment)
-	_comment, _commentErr := /*TODO: migrate me*/ readBuffer.ReadString("comment", uint32((commentLength)*(8)), utils.WithEncoding("UTF-8"))
-	if _commentErr != nil {
-		return nil, errors.Wrap(_commentErr, "Error parsing 'comment' field of AdsSymbolTableEntry")
+	comment, err := ReadSimpleField(ctx, "comment", ReadString(readBuffer, uint32(int32(commentLength)*int32(int32(8)))), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'comment' field"))
 	}
-	comment := _comment
 
-	commentTerminator, err := ReadConstField[uint8](ctx, "commentTerminator", ReadUnsignedByte(readBuffer, 8), AdsSymbolTableEntry_COMMENTTERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
+	commentTerminator, err := ReadConstField[uint8](ctx, "commentTerminator", ReadUnsignedByte(readBuffer, uint8(8)), AdsSymbolTableEntry_COMMENTTERMINATOR, codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commentTerminator' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go b/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
index 65b9f4abde..3ecbb41806 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsTableSizes.go
@@ -27,6 +27,9 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	"github.com/apache/plc4x/plc4go/spi/codegen"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -154,6 +157,12 @@ func AdsTableSizesParse(ctx context.Context, theBytes []byte) (AdsTableSizes, er
 	return AdsTableSizesParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
 }
 
+func AdsTableSizesParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsTableSizes, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsTableSizes, error) {
+		return AdsTableSizesParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsTableSizesParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsTableSizes, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -165,47 +174,35 @@ func AdsTableSizesParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (symbolCount)
-	_symbolCount, _symbolCountErr := /*TODO: migrate me*/ readBuffer.ReadUint32("symbolCount", 32)
-	if _symbolCountErr != nil {
-		return nil, errors.Wrap(_symbolCountErr, "Error parsing 'symbolCount' field of AdsTableSizes")
+	symbolCount, err := ReadSimpleField(ctx, "symbolCount", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'symbolCount' field"))
 	}
-	symbolCount := _symbolCount
 
-	// Simple Field (symbolLength)
-	_symbolLength, _symbolLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("symbolLength", 32)
-	if _symbolLengthErr != nil {
-		return nil, errors.Wrap(_symbolLengthErr, "Error parsing 'symbolLength' field of AdsTableSizes")
+	symbolLength, err := ReadSimpleField(ctx, "symbolLength", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'symbolLength' field"))
 	}
-	symbolLength := _symbolLength
 
-	// Simple Field (dataTypeCount)
-	_dataTypeCount, _dataTypeCountErr := /*TODO: migrate me*/ readBuffer.ReadUint32("dataTypeCount", 32)
-	if _dataTypeCountErr != nil {
-		return nil, errors.Wrap(_dataTypeCountErr, "Error parsing 'dataTypeCount' field of AdsTableSizes")
+	dataTypeCount, err := ReadSimpleField(ctx, "dataTypeCount", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeCount' field"))
 	}
-	dataTypeCount := _dataTypeCount
 
-	// Simple Field (dataTypeLength)
-	_dataTypeLength, _dataTypeLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("dataTypeLength", 32)
-	if _dataTypeLengthErr != nil {
-		return nil, errors.Wrap(_dataTypeLengthErr, "Error parsing 'dataTypeLength' field of AdsTableSizes")
+	dataTypeLength, err := ReadSimpleField(ctx, "dataTypeLength", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'dataTypeLength' field"))
 	}
-	dataTypeLength := _dataTypeLength
 
-	// Simple Field (extraCount)
-	_extraCount, _extraCountErr := /*TODO: migrate me*/ readBuffer.ReadUint32("extraCount", 32)
-	if _extraCountErr != nil {
-		return nil, errors.Wrap(_extraCountErr, "Error parsing 'extraCount' field of AdsTableSizes")
+	extraCount, err := ReadSimpleField(ctx, "extraCount", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'extraCount' field"))
 	}
-	extraCount := _extraCount
 
-	// Simple Field (extraLength)
-	_extraLength, _extraLengthErr := /*TODO: migrate me*/ readBuffer.ReadUint32("extraLength", 32)
-	if _extraLengthErr != nil {
-		return nil, errors.Wrap(_extraLengthErr, "Error parsing 'extraLength' field of AdsTableSizes")
+	extraLength, err := ReadSimpleField(ctx, "extraLength", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'extraLength' field"))
 	}
-	extraLength := _extraLength
 
 	if closeErr := readBuffer.CloseContext("AdsTableSizes"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AdsTableSizes")
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go b/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
index 79563a4be2..1e0a960833 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteControlRequest.go
@@ -170,6 +170,12 @@ func AdsWriteControlRequestParse(ctx context.Context, theBytes []byte) (AdsWrite
 	return AdsWriteControlRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsWriteControlRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteControlRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteControlRequest, error) {
+		return AdsWriteControlRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsWriteControlRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteControlRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -181,21 +187,17 @@ func AdsWriteControlRequestParseWithBuffer(ctx context.Context, readBuffer utils
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (adsState)
-	_adsState, _adsStateErr := /*TODO: migrate me*/ readBuffer.ReadUint16("adsState", 16)
-	if _adsStateErr != nil {
-		return nil, errors.Wrap(_adsStateErr, "Error parsing 'adsState' field of AdsWriteControlRequest")
+	adsState, err := ReadSimpleField(ctx, "adsState", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'adsState' field"))
 	}
-	adsState := _adsState
 
-	// Simple Field (deviceState)
-	_deviceState, _deviceStateErr := /*TODO: migrate me*/ readBuffer.ReadUint16("deviceState", 16)
-	if _deviceStateErr != nil {
-		return nil, errors.Wrap(_deviceStateErr, "Error parsing 'deviceState' field of AdsWriteControlRequest")
+	deviceState, err := ReadSimpleField(ctx, "deviceState", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'deviceState' field"))
 	}
-	deviceState := _deviceState
 
-	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go b/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go
index cfcaeac656..d9502dcce3 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteControlResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -141,6 +143,12 @@ func AdsWriteControlResponseParse(ctx context.Context, theBytes []byte) (AdsWrit
 	return AdsWriteControlResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsWriteControlResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteControlResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteControlResponse, error) {
+		return AdsWriteControlResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsWriteControlResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteControlResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -152,17 +160,9 @@ func AdsWriteControlResponseParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsWriteControlResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsWriteControlResponse"); closeErr != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go b/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
index 9088093f9f..8843f644c7 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteRequest.go
@@ -170,6 +170,12 @@ func AdsWriteRequestParse(ctx context.Context, theBytes []byte) (AdsWriteRequest
 	return AdsWriteRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsWriteRequestParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteRequest, error) {
+		return AdsWriteRequestParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsWriteRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -181,21 +187,17 @@ func AdsWriteRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (indexGroup)
-	_indexGroup, _indexGroupErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexGroup", 32)
-	if _indexGroupErr != nil {
-		return nil, errors.Wrap(_indexGroupErr, "Error parsing 'indexGroup' field of AdsWriteRequest")
+	indexGroup, err := ReadSimpleField(ctx, "indexGroup", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexGroup' field"))
 	}
-	indexGroup := _indexGroup
 
-	// Simple Field (indexOffset)
-	_indexOffset, _indexOffsetErr := /*TODO: migrate me*/ readBuffer.ReadUint32("indexOffset", 32)
-	if _indexOffsetErr != nil {
-		return nil, errors.Wrap(_indexOffsetErr, "Error parsing 'indexOffset' field of AdsWriteRequest")
+	indexOffset, err := ReadSimpleField(ctx, "indexOffset", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'indexOffset' field"))
 	}
-	indexOffset := _indexOffset
 
-	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
diff --git a/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go b/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go
index d3675224e5..27f088e595 100644
--- a/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/AdsWriteResponse.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -141,6 +143,12 @@ func AdsWriteResponseParse(ctx context.Context, theBytes []byte) (AdsWriteRespon
 	return AdsWriteResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AdsWriteResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteResponse, error) {
+		return AdsWriteResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AdsWriteResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AdsWriteResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -152,17 +160,9 @@ func AdsWriteResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (result)
-	if pullErr := readBuffer.PullContext("result"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for result")
-	}
-	_result, _resultErr := ReturnCodeParseWithBuffer(ctx, readBuffer)
-	if _resultErr != nil {
-		return nil, errors.Wrap(_resultErr, "Error parsing 'result' field of AdsWriteResponse")
-	}
-	result := _result
-	if closeErr := readBuffer.CloseContext("result"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for result")
+	result, err := ReadEnumField[ReturnCode](ctx, "result", "ReturnCode", ReadEnum(ReturnCodeByValue, ReadUnsignedInt(readBuffer, uint8(32))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'result' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AdsWriteResponse"); closeErr != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/AmsNetId.go b/plc4go/protocols/ads/readwrite/model/AmsNetId.go
index 71ae0204eb..1b28fcb737 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsNetId.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsNetId.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -153,6 +155,12 @@ func AmsNetIdParse(ctx context.Context, theBytes []byte) (AmsNetId, error) {
 	return AmsNetIdParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AmsNetIdParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsNetId, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsNetId, error) {
+		return AmsNetIdParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AmsNetIdParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsNetId, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -164,47 +172,35 @@ func AmsNetIdParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (octet1)
-	_octet1, _octet1Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet1", 8)
-	if _octet1Err != nil {
-		return nil, errors.Wrap(_octet1Err, "Error parsing 'octet1' field of AmsNetId")
+	octet1, err := ReadSimpleField(ctx, "octet1", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet1' field"))
 	}
-	octet1 := _octet1
 
-	// Simple Field (octet2)
-	_octet2, _octet2Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet2", 8)
-	if _octet2Err != nil {
-		return nil, errors.Wrap(_octet2Err, "Error parsing 'octet2' field of AmsNetId")
+	octet2, err := ReadSimpleField(ctx, "octet2", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet2' field"))
 	}
-	octet2 := _octet2
 
-	// Simple Field (octet3)
-	_octet3, _octet3Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet3", 8)
-	if _octet3Err != nil {
-		return nil, errors.Wrap(_octet3Err, "Error parsing 'octet3' field of AmsNetId")
+	octet3, err := ReadSimpleField(ctx, "octet3", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet3' field"))
 	}
-	octet3 := _octet3
 
-	// Simple Field (octet4)
-	_octet4, _octet4Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet4", 8)
-	if _octet4Err != nil {
-		return nil, errors.Wrap(_octet4Err, "Error parsing 'octet4' field of AmsNetId")
+	octet4, err := ReadSimpleField(ctx, "octet4", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet4' field"))
 	}
-	octet4 := _octet4
 
-	// Simple Field (octet5)
-	_octet5, _octet5Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet5", 8)
-	if _octet5Err != nil {
-		return nil, errors.Wrap(_octet5Err, "Error parsing 'octet5' field of AmsNetId")
+	octet5, err := ReadSimpleField(ctx, "octet5", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet5' field"))
 	}
-	octet5 := _octet5
 
-	// Simple Field (octet6)
-	_octet6, _octet6Err := /*TODO: migrate me*/ readBuffer.ReadUint8("octet6", 8)
-	if _octet6Err != nil {
-		return nil, errors.Wrap(_octet6Err, "Error parsing 'octet6' field of AmsNetId")
+	octet6, err := ReadSimpleField(ctx, "octet6", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'octet6' field"))
 	}
-	octet6 := _octet6
 
 	if closeErr := readBuffer.CloseContext("AmsNetId"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AmsNetId")
diff --git a/plc4go/protocols/ads/readwrite/model/AmsPacket.go b/plc4go/protocols/ads/readwrite/model/AmsPacket.go
index 2195f1818c..f9ab3926f7 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsPacket.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsPacket.go
@@ -269,6 +269,17 @@ func AmsPacketParse(ctx context.Context, theBytes []byte) (AmsPacket, error) {
 	return AmsPacketParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AmsPacketParseWithBufferProducer[T AmsPacket]() func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := AmsPacketParseWithBuffer(ctx, readBuffer)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func AmsPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsPacket, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -280,47 +291,27 @@ func AmsPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer)
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (targetAmsNetId)
-	if pullErr := readBuffer.PullContext("targetAmsNetId"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for targetAmsNetId")
-	}
-	_targetAmsNetId, _targetAmsNetIdErr := AmsNetIdParseWithBuffer(ctx, readBuffer)
-	if _targetAmsNetIdErr != nil {
-		return nil, errors.Wrap(_targetAmsNetIdErr, "Error parsing 'targetAmsNetId' field of AmsPacket")
-	}
-	targetAmsNetId := _targetAmsNetId.(AmsNetId)
-	if closeErr := readBuffer.CloseContext("targetAmsNetId"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for targetAmsNetId")
+	targetAmsNetId, err := ReadSimpleField[AmsNetId](ctx, "targetAmsNetId", ReadComplex[AmsNetId](AmsNetIdParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'targetAmsNetId' field"))
 	}
 
-	// Simple Field (targetAmsPort)
-	_targetAmsPort, _targetAmsPortErr := /*TODO: migrate me*/ readBuffer.ReadUint16("targetAmsPort", 16)
-	if _targetAmsPortErr != nil {
-		return nil, errors.Wrap(_targetAmsPortErr, "Error parsing 'targetAmsPort' field of AmsPacket")
+	targetAmsPort, err := ReadSimpleField(ctx, "targetAmsPort", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'targetAmsPort' field"))
 	}
-	targetAmsPort := _targetAmsPort
 
-	// Simple Field (sourceAmsNetId)
-	if pullErr := readBuffer.PullContext("sourceAmsNetId"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for sourceAmsNetId")
-	}
-	_sourceAmsNetId, _sourceAmsNetIdErr := AmsNetIdParseWithBuffer(ctx, readBuffer)
-	if _sourceAmsNetIdErr != nil {
-		return nil, errors.Wrap(_sourceAmsNetIdErr, "Error parsing 'sourceAmsNetId' field of AmsPacket")
-	}
-	sourceAmsNetId := _sourceAmsNetId.(AmsNetId)
-	if closeErr := readBuffer.CloseContext("sourceAmsNetId"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for sourceAmsNetId")
+	sourceAmsNetId, err := ReadSimpleField[AmsNetId](ctx, "sourceAmsNetId", ReadComplex[AmsNetId](AmsNetIdParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sourceAmsNetId' field"))
 	}
 
-	// Simple Field (sourceAmsPort)
-	_sourceAmsPort, _sourceAmsPortErr := /*TODO: migrate me*/ readBuffer.ReadUint16("sourceAmsPort", 16)
-	if _sourceAmsPortErr != nil {
-		return nil, errors.Wrap(_sourceAmsPortErr, "Error parsing 'sourceAmsPort' field of AmsPacket")
+	sourceAmsPort, err := ReadSimpleField(ctx, "sourceAmsPort", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sourceAmsPort' field"))
 	}
-	sourceAmsPort := _sourceAmsPort
 
-	commandId, err := ReadDiscriminatorEnumField[CommandId](ctx, "commandId", "CommandId", ReadEnum(CommandIdByValue, ReadUnsignedShort(readBuffer, 16)))
+	commandId, err := ReadDiscriminatorEnumField[CommandId](ctx, "commandId", "CommandId", ReadEnum(CommandIdByValue, ReadUnsignedShort(readBuffer, uint8(16))))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'commandId' field"))
 	}
@@ -378,30 +369,26 @@ func AmsPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer)
 	}
 	_ = broadcast
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadSignedByte(readBuffer, 7), int8(0x0))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadSignedByte(readBuffer, uint8(7)), int8(0x0))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32))
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 	_ = length
 
-	// Simple Field (errorCode)
-	_errorCode, _errorCodeErr := /*TODO: migrate me*/ readBuffer.ReadUint32("errorCode", 32)
-	if _errorCodeErr != nil {
-		return nil, errors.Wrap(_errorCodeErr, "Error parsing 'errorCode' field of AmsPacket")
+	errorCode, err := ReadSimpleField(ctx, "errorCode", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'errorCode' field"))
 	}
-	errorCode := _errorCode
 
-	// Simple Field (invokeId)
-	_invokeId, _invokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint32("invokeId", 32)
-	if _invokeIdErr != nil {
-		return nil, errors.Wrap(_invokeIdErr, "Error parsing 'invokeId' field of AmsPacket")
+	invokeId, err := ReadSimpleField(ctx, "invokeId", ReadUnsignedInt(readBuffer, uint8(32)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'invokeId' field"))
 	}
-	invokeId := _invokeId
 
 	// Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
 	type AmsPacketChildSerializeRequirement interface {
diff --git a/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go b/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go
index 7c867c16b4..1b499c5569 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsSerialAcknowledgeFrame.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -153,6 +155,12 @@ func AmsSerialAcknowledgeFrameParse(ctx context.Context, theBytes []byte) (AmsSe
 	return AmsSerialAcknowledgeFrameParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AmsSerialAcknowledgeFrameParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialAcknowledgeFrame, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialAcknowledgeFrame, error) {
+		return AmsSerialAcknowledgeFrameParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AmsSerialAcknowledgeFrameParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialAcknowledgeFrame, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -164,47 +172,35 @@ func AmsSerialAcknowledgeFrameParseWithBuffer(ctx context.Context, readBuffer ut
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (magicCookie)
-	_magicCookie, _magicCookieErr := /*TODO: migrate me*/ readBuffer.ReadUint16("magicCookie", 16)
-	if _magicCookieErr != nil {
-		return nil, errors.Wrap(_magicCookieErr, "Error parsing 'magicCookie' field of AmsSerialAcknowledgeFrame")
+	magicCookie, err := ReadSimpleField(ctx, "magicCookie", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'magicCookie' field"))
 	}
-	magicCookie := _magicCookie
 
-	// Simple Field (transmitterAddress)
-	_transmitterAddress, _transmitterAddressErr := /*TODO: migrate me*/ readBuffer.ReadInt8("transmitterAddress", 8)
-	if _transmitterAddressErr != nil {
-		return nil, errors.Wrap(_transmitterAddressErr, "Error parsing 'transmitterAddress' field of AmsSerialAcknowledgeFrame")
+	transmitterAddress, err := ReadSimpleField(ctx, "transmitterAddress", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'transmitterAddress' field"))
 	}
-	transmitterAddress := _transmitterAddress
 
-	// Simple Field (receiverAddress)
-	_receiverAddress, _receiverAddressErr := /*TODO: migrate me*/ readBuffer.ReadInt8("receiverAddress", 8)
-	if _receiverAddressErr != nil {
-		return nil, errors.Wrap(_receiverAddressErr, "Error parsing 'receiverAddress' field of AmsSerialAcknowledgeFrame")
+	receiverAddress, err := ReadSimpleField(ctx, "receiverAddress", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'receiverAddress' field"))
 	}
-	receiverAddress := _receiverAddress
 
-	// Simple Field (fragmentNumber)
-	_fragmentNumber, _fragmentNumberErr := /*TODO: migrate me*/ readBuffer.ReadInt8("fragmentNumber", 8)
-	if _fragmentNumberErr != nil {
-		return nil, errors.Wrap(_fragmentNumberErr, "Error parsing 'fragmentNumber' field of AmsSerialAcknowledgeFrame")
+	fragmentNumber, err := ReadSimpleField(ctx, "fragmentNumber", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'fragmentNumber' field"))
 	}
-	fragmentNumber := _fragmentNumber
 
-	// Simple Field (length)
-	_length, _lengthErr := /*TODO: migrate me*/ readBuffer.ReadInt8("length", 8)
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AmsSerialAcknowledgeFrame")
+	length, err := ReadSimpleField(ctx, "length", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
-	length := _length
 
-	// Simple Field (crc)
-	_crc, _crcErr := /*TODO: migrate me*/ readBuffer.ReadUint16("crc", 16)
-	if _crcErr != nil {
-		return nil, errors.Wrap(_crcErr, "Error parsing 'crc' field of AmsSerialAcknowledgeFrame")
+	crc, err := ReadSimpleField(ctx, "crc", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'crc' field"))
 	}
-	crc := _crc
 
 	if closeErr := readBuffer.CloseContext("AmsSerialAcknowledgeFrame"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AmsSerialAcknowledgeFrame")
diff --git a/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go b/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go
index 9d1fc16298..50a793b3b3 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsSerialFrame.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -163,6 +165,12 @@ func AmsSerialFrameParse(ctx context.Context, theBytes []byte) (AmsSerialFrame,
 	return AmsSerialFrameParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AmsSerialFrameParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialFrame, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialFrame, error) {
+		return AmsSerialFrameParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AmsSerialFrameParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialFrame, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -174,60 +182,40 @@ func AmsSerialFrameParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (magicCookie)
-	_magicCookie, _magicCookieErr := /*TODO: migrate me*/ readBuffer.ReadUint16("magicCookie", 16)
-	if _magicCookieErr != nil {
-		return nil, errors.Wrap(_magicCookieErr, "Error parsing 'magicCookie' field of AmsSerialFrame")
+	magicCookie, err := ReadSimpleField(ctx, "magicCookie", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'magicCookie' field"))
 	}
-	magicCookie := _magicCookie
 
-	// Simple Field (transmitterAddress)
-	_transmitterAddress, _transmitterAddressErr := /*TODO: migrate me*/ readBuffer.ReadInt8("transmitterAddress", 8)
-	if _transmitterAddressErr != nil {
-		return nil, errors.Wrap(_transmitterAddressErr, "Error parsing 'transmitterAddress' field of AmsSerialFrame")
+	transmitterAddress, err := ReadSimpleField(ctx, "transmitterAddress", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'transmitterAddress' field"))
 	}
-	transmitterAddress := _transmitterAddress
 
-	// Simple Field (receiverAddress)
-	_receiverAddress, _receiverAddressErr := /*TODO: migrate me*/ readBuffer.ReadInt8("receiverAddress", 8)
-	if _receiverAddressErr != nil {
-		return nil, errors.Wrap(_receiverAddressErr, "Error parsing 'receiverAddress' field of AmsSerialFrame")
+	receiverAddress, err := ReadSimpleField(ctx, "receiverAddress", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'receiverAddress' field"))
 	}
-	receiverAddress := _receiverAddress
 
-	// Simple Field (fragmentNumber)
-	_fragmentNumber, _fragmentNumberErr := /*TODO: migrate me*/ readBuffer.ReadInt8("fragmentNumber", 8)
-	if _fragmentNumberErr != nil {
-		return nil, errors.Wrap(_fragmentNumberErr, "Error parsing 'fragmentNumber' field of AmsSerialFrame")
+	fragmentNumber, err := ReadSimpleField(ctx, "fragmentNumber", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'fragmentNumber' field"))
 	}
-	fragmentNumber := _fragmentNumber
 
-	// Simple Field (length)
-	_length, _lengthErr := /*TODO: migrate me*/ readBuffer.ReadInt8("length", 8)
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AmsSerialFrame")
+	length, err := ReadSimpleField(ctx, "length", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
-	length := _length
 
-	// Simple Field (userdata)
-	if pullErr := readBuffer.PullContext("userdata"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for userdata")
-	}
-	_userdata, _userdataErr := AmsPacketParseWithBuffer(ctx, readBuffer)
-	if _userdataErr != nil {
-		return nil, errors.Wrap(_userdataErr, "Error parsing 'userdata' field of AmsSerialFrame")
-	}
-	userdata := _userdata.(AmsPacket)
-	if closeErr := readBuffer.CloseContext("userdata"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for userdata")
+	userdata, err := ReadSimpleField[AmsPacket](ctx, "userdata", ReadComplex[AmsPacket](AmsPacketParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'userdata' field"))
 	}
 
-	// Simple Field (crc)
-	_crc, _crcErr := /*TODO: migrate me*/ readBuffer.ReadUint16("crc", 16)
-	if _crcErr != nil {
-		return nil, errors.Wrap(_crcErr, "Error parsing 'crc' field of AmsSerialFrame")
+	crc, err := ReadSimpleField(ctx, "crc", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'crc' field"))
 	}
-	crc := _crc
 
 	if closeErr := readBuffer.CloseContext("AmsSerialFrame"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AmsSerialFrame")
diff --git a/plc4go/protocols/ads/readwrite/model/AmsSerialResetFrame.go b/plc4go/protocols/ads/readwrite/model/AmsSerialResetFrame.go
index 6f66042d0e..09b37bb567 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsSerialResetFrame.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsSerialResetFrame.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -153,6 +155,12 @@ func AmsSerialResetFrameParse(ctx context.Context, theBytes []byte) (AmsSerialRe
 	return AmsSerialResetFrameParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func AmsSerialResetFrameParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialResetFrame, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialResetFrame, error) {
+		return AmsSerialResetFrameParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AmsSerialResetFrameParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsSerialResetFrame, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -164,47 +172,35 @@ func AmsSerialResetFrameParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (magicCookie)
-	_magicCookie, _magicCookieErr := /*TODO: migrate me*/ readBuffer.ReadUint16("magicCookie", 16)
-	if _magicCookieErr != nil {
-		return nil, errors.Wrap(_magicCookieErr, "Error parsing 'magicCookie' field of AmsSerialResetFrame")
+	magicCookie, err := ReadSimpleField(ctx, "magicCookie", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'magicCookie' field"))
 	}
-	magicCookie := _magicCookie
 
-	// Simple Field (transmitterAddress)
-	_transmitterAddress, _transmitterAddressErr := /*TODO: migrate me*/ readBuffer.ReadInt8("transmitterAddress", 8)
-	if _transmitterAddressErr != nil {
-		return nil, errors.Wrap(_transmitterAddressErr, "Error parsing 'transmitterAddress' field of AmsSerialResetFrame")
+	transmitterAddress, err := ReadSimpleField(ctx, "transmitterAddress", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'transmitterAddress' field"))
 	}
-	transmitterAddress := _transmitterAddress
 
-	// Simple Field (receiverAddress)
-	_receiverAddress, _receiverAddressErr := /*TODO: migrate me*/ readBuffer.ReadInt8("receiverAddress", 8)
-	if _receiverAddressErr != nil {
-		return nil, errors.Wrap(_receiverAddressErr, "Error parsing 'receiverAddress' field of AmsSerialResetFrame")
+	receiverAddress, err := ReadSimpleField(ctx, "receiverAddress", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'receiverAddress' field"))
 	}
-	receiverAddress := _receiverAddress
 
-	// Simple Field (fragmentNumber)
-	_fragmentNumber, _fragmentNumberErr := /*TODO: migrate me*/ readBuffer.ReadInt8("fragmentNumber", 8)
-	if _fragmentNumberErr != nil {
-		return nil, errors.Wrap(_fragmentNumberErr, "Error parsing 'fragmentNumber' field of AmsSerialResetFrame")
+	fragmentNumber, err := ReadSimpleField(ctx, "fragmentNumber", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'fragmentNumber' field"))
 	}
-	fragmentNumber := _fragmentNumber
 
-	// Simple Field (length)
-	_length, _lengthErr := /*TODO: migrate me*/ readBuffer.ReadInt8("length", 8)
-	if _lengthErr != nil {
-		return nil, errors.Wrap(_lengthErr, "Error parsing 'length' field of AmsSerialResetFrame")
+	length, err := ReadSimpleField(ctx, "length", ReadSignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
-	length := _length
 
-	// Simple Field (crc)
-	_crc, _crcErr := /*TODO: migrate me*/ readBuffer.ReadUint16("crc", 16)
-	if _crcErr != nil {
-		return nil, errors.Wrap(_crcErr, "Error parsing 'crc' field of AmsSerialResetFrame")
+	crc, err := ReadSimpleField(ctx, "crc", ReadUnsignedShort(readBuffer, uint8(16)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'crc' field"))
 	}
-	crc := _crc
 
 	if closeErr := readBuffer.CloseContext("AmsSerialResetFrame"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for AmsSerialResetFrame")
diff --git a/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go b/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go
index 7dd9e87142..3a6697074f 100644
--- a/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go
+++ b/plc4go/protocols/ads/readwrite/model/AmsTCPPacket.go
@@ -115,6 +115,12 @@ func AmsTCPPacketParse(ctx context.Context, theBytes []byte) (AmsTCPPacket, erro
 	return AmsTCPPacketParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes, utils.WithByteOrderForReadBufferByteBased(binary.LittleEndian)))
 }
 
+func AmsTCPPacketParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsTCPPacket, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (AmsTCPPacket, error) {
+		return AmsTCPPacketParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func AmsTCPPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (AmsTCPPacket, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -126,28 +132,20 @@ func AmsTCPPacketParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffe
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedShort(readBuffer, 16), uint16(0x0000), codegen.WithByteOrder(binary.LittleEndian))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedShort(readBuffer, uint8(16)), uint16(0x0000), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, 32), codegen.WithByteOrder(binary.LittleEndian))
+	length, err := ReadImplicitField[uint32](ctx, "length", ReadUnsignedInt(readBuffer, uint8(32)), codegen.WithByteOrder(binary.LittleEndian))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'length' field"))
 	}
 	_ = length
 
-	// Simple Field (userdata)
-	if pullErr := readBuffer.PullContext("userdata"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for userdata")
-	}
-	_userdata, _userdataErr := AmsPacketParseWithBuffer(ctx, readBuffer)
-	if _userdataErr != nil {
-		return nil, errors.Wrap(_userdataErr, "Error parsing 'userdata' field of AmsTCPPacket")
-	}
-	userdata := _userdata.(AmsPacket)
-	if closeErr := readBuffer.CloseContext("userdata"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for userdata")
+	userdata, err := ReadSimpleField[AmsPacket](ctx, "userdata", ReadComplex[AmsPacket](AmsPacketParseWithBuffer, readBuffer), codegen.WithByteOrder(binary.LittleEndian))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'userdata' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("AmsTCPPacket"); closeErr != nil {
diff --git a/plc4go/protocols/ads/readwrite/model/ErrorResponse.go b/plc4go/protocols/ads/readwrite/model/ErrorResponse.go
index ca45da454f..8d80f8f052 100644
--- a/plc4go/protocols/ads/readwrite/model/ErrorResponse.go
+++ b/plc4go/protocols/ads/readwrite/model/ErrorResponse.go
@@ -120,6 +120,12 @@ func ErrorResponseParse(ctx context.Context, theBytes []byte) (ErrorResponse, er
 	return ErrorResponseParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func ErrorResponseParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (ErrorResponse, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (ErrorResponse, error) {
+		return ErrorResponseParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func ErrorResponseParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (ErrorResponse, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDU.go b/plc4go/protocols/bacnetip/readwrite/model/APDU.go
index cadd58ccbb..243ed61ae0 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDU.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDU.go
@@ -113,6 +113,17 @@ func APDUParse(ctx context.Context, theBytes []byte, apduLength uint16) (APDU, e
 	return APDUParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUParseWithBufferProducer[T APDU](apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := APDUParseWithBuffer(ctx, readBuffer, apduLength)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func APDUParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDU, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -124,7 +135,7 @@ func APDUParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduL
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	apduType, err := ReadDiscriminatorEnumField[ApduType](ctx, "apduType", "ApduType", ReadEnum(ApduTypeByValue, ReadUnsignedByte(readBuffer, 4)))
+	apduType, err := ReadDiscriminatorEnumField[ApduType](ctx, "apduType", "ApduType", ReadEnum(ApduTypeByValue, ReadUnsignedByte(readBuffer, uint8(4))))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'apduType' field"))
 	}
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUAbort.go b/plc4go/protocols/bacnetip/readwrite/model/APDUAbort.go
index a2da51c66d..298652f280 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUAbort.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUAbort.go
@@ -159,6 +159,12 @@ func APDUAbortParse(ctx context.Context, theBytes []byte, apduLength uint16) (AP
 	return APDUAbortParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUAbortParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUAbort, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUAbort, error) {
+		return APDUAbortParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUAbortParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUAbort, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -170,36 +176,24 @@ func APDUAbortParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer,
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 3), uint8(0x00))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(3)), uint8(0x00))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (server)
-	_server, _serverErr := /*TODO: migrate me*/ readBuffer.ReadBit("server")
-	if _serverErr != nil {
-		return nil, errors.Wrap(_serverErr, "Error parsing 'server' field of APDUAbort")
+	server, err := ReadSimpleField(ctx, "server", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'server' field"))
 	}
-	server := _server
 
-	// Simple Field (originalInvokeId)
-	_originalInvokeId, _originalInvokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint8("originalInvokeId", 8)
-	if _originalInvokeIdErr != nil {
-		return nil, errors.Wrap(_originalInvokeIdErr, "Error parsing 'originalInvokeId' field of APDUAbort")
+	originalInvokeId, err := ReadSimpleField(ctx, "originalInvokeId", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'originalInvokeId' field"))
 	}
-	originalInvokeId := _originalInvokeId
 
-	// Simple Field (abortReason)
-	if pullErr := readBuffer.PullContext("abortReason"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for abortReason")
-	}
-	_abortReason, _abortReasonErr := BACnetAbortReasonTaggedParseWithBuffer(ctx, readBuffer, uint32(uint32(1)))
-	if _abortReasonErr != nil {
-		return nil, errors.Wrap(_abortReasonErr, "Error parsing 'abortReason' field of APDUAbort")
-	}
-	abortReason := _abortReason.(BACnetAbortReasonTagged)
-	if closeErr := readBuffer.CloseContext("abortReason"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for abortReason")
+	abortReason, err := ReadSimpleField[BACnetAbortReasonTagged](ctx, "abortReason", ReadComplex[BACnetAbortReasonTagged](BACnetAbortReasonTaggedParseWithBufferProducer((uint32)(uint32(1))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'abortReason' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("APDUAbort"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUComplexAck.go b/plc4go/protocols/bacnetip/readwrite/model/APDUComplexAck.go
index 4debb3b945..ef906a2b27 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUComplexAck.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUComplexAck.go
@@ -269,6 +269,12 @@ func APDUComplexAckParse(ctx context.Context, theBytes []byte, apduLength uint16
 	return APDUComplexAckParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUComplexAckParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUComplexAck, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUComplexAck, error) {
+		return APDUComplexAckParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUComplexAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUComplexAck, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -280,38 +286,32 @@ func APDUComplexAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (segmentedMessage)
-	_segmentedMessage, _segmentedMessageErr := /*TODO: migrate me*/ readBuffer.ReadBit("segmentedMessage")
-	if _segmentedMessageErr != nil {
-		return nil, errors.Wrap(_segmentedMessageErr, "Error parsing 'segmentedMessage' field of APDUComplexAck")
+	segmentedMessage, err := ReadSimpleField(ctx, "segmentedMessage", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'segmentedMessage' field"))
 	}
-	segmentedMessage := _segmentedMessage
 
-	// Simple Field (moreFollows)
-	_moreFollows, _moreFollowsErr := /*TODO: migrate me*/ readBuffer.ReadBit("moreFollows")
-	if _moreFollowsErr != nil {
-		return nil, errors.Wrap(_moreFollowsErr, "Error parsing 'moreFollows' field of APDUComplexAck")
+	moreFollows, err := ReadSimpleField(ctx, "moreFollows", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'moreFollows' field"))
 	}
-	moreFollows := _moreFollows
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 2), uint8(0))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(2)), uint8(0))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (originalInvokeId)
-	_originalInvokeId, _originalInvokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint8("originalInvokeId", 8)
-	if _originalInvokeIdErr != nil {
-		return nil, errors.Wrap(_originalInvokeIdErr, "Error parsing 'originalInvokeId' field of APDUComplexAck")
+	originalInvokeId, err := ReadSimpleField(ctx, "originalInvokeId", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'originalInvokeId' field"))
 	}
-	originalInvokeId := _originalInvokeId
 
-	sequenceNumber, err := ReadOptionalField[uint8](ctx, "sequenceNumber", ReadUnsignedByte(readBuffer, 8), segmentedMessage)
+	sequenceNumber, err := ReadOptionalField[uint8](ctx, "sequenceNumber", ReadUnsignedByte(readBuffer, uint8(8)), segmentedMessage)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sequenceNumber' field"))
 	}
 
-	proposedWindowSize, err := ReadOptionalField[uint8](ctx, "proposedWindowSize", ReadUnsignedByte(readBuffer, 8), segmentedMessage)
+	proposedWindowSize, err := ReadOptionalField[uint8](ctx, "proposedWindowSize", ReadUnsignedByte(readBuffer, uint8(8)), segmentedMessage)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'proposedWindowSize' field"))
 	}
@@ -321,13 +321,7 @@ func APDUComplexAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	apduHeaderReduction := uint16(_apduHeaderReduction)
 	_ = apduHeaderReduction
 
-	_serviceAck, err := ReadOptionalField[BACnetServiceAck](ctx, "serviceAck", ReadComplex[BACnetServiceAck](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetServiceAck, error) {
-		v, err := BACnetServiceAckParseWithBuffer(ctx, readBuffer, (uint32)(uint32(apduLength)-uint32(apduHeaderReduction)))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetServiceAck), nil
-	}, readBuffer), !(segmentedMessage))
+	_serviceAck, err := ReadOptionalField[BACnetServiceAck](ctx, "serviceAck", ReadComplex[BACnetServiceAck](BACnetServiceAckParseWithBufferProducer[BACnetServiceAck]((uint32)(uint32(apduLength)-uint32(apduHeaderReduction))), readBuffer), !(segmentedMessage))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'serviceAck' field"))
 	}
@@ -341,7 +335,7 @@ func APDUComplexAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 		return nil, errors.WithStack(utils.ParseValidationError{Message: "service ack should be set"})
 	}
 
-	segmentServiceChoice, err := ReadOptionalField[BACnetConfirmedServiceChoice](ctx, "segmentServiceChoice", ReadEnum(BACnetConfirmedServiceChoiceByValue, ReadUnsignedByte(readBuffer, 8)), bool(segmentedMessage) && bool(bool((*sequenceNumber) != (0))))
+	segmentServiceChoice, err := ReadOptionalField[BACnetConfirmedServiceChoice](ctx, "segmentServiceChoice", ReadEnum(BACnetConfirmedServiceChoiceByValue, ReadUnsignedByte(readBuffer, uint8(8))), bool(segmentedMessage) && bool(bool((*sequenceNumber) != (0))))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'segmentServiceChoice' field"))
 	}
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUConfirmedRequest.go b/plc4go/protocols/bacnetip/readwrite/model/APDUConfirmedRequest.go
index 98ef835dad..bad4fbcd0d 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUConfirmedRequest.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUConfirmedRequest.go
@@ -302,6 +302,12 @@ func APDUConfirmedRequestParse(ctx context.Context, theBytes []byte, apduLength
 	return APDUConfirmedRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUConfirmedRequestParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUConfirmedRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUConfirmedRequest, error) {
+		return APDUConfirmedRequestParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUConfirmedRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUConfirmedRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -313,71 +319,47 @@ func APDUConfirmedRequestParseWithBuffer(ctx context.Context, readBuffer utils.R
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (segmentedMessage)
-	_segmentedMessage, _segmentedMessageErr := /*TODO: migrate me*/ readBuffer.ReadBit("segmentedMessage")
-	if _segmentedMessageErr != nil {
-		return nil, errors.Wrap(_segmentedMessageErr, "Error parsing 'segmentedMessage' field of APDUConfirmedRequest")
+	segmentedMessage, err := ReadSimpleField(ctx, "segmentedMessage", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'segmentedMessage' field"))
 	}
-	segmentedMessage := _segmentedMessage
 
-	// Simple Field (moreFollows)
-	_moreFollows, _moreFollowsErr := /*TODO: migrate me*/ readBuffer.ReadBit("moreFollows")
-	if _moreFollowsErr != nil {
-		return nil, errors.Wrap(_moreFollowsErr, "Error parsing 'moreFollows' field of APDUConfirmedRequest")
+	moreFollows, err := ReadSimpleField(ctx, "moreFollows", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'moreFollows' field"))
 	}
-	moreFollows := _moreFollows
 
-	// Simple Field (segmentedResponseAccepted)
-	_segmentedResponseAccepted, _segmentedResponseAcceptedErr := /*TODO: migrate me*/ readBuffer.ReadBit("segmentedResponseAccepted")
-	if _segmentedResponseAcceptedErr != nil {
-		return nil, errors.Wrap(_segmentedResponseAcceptedErr, "Error parsing 'segmentedResponseAccepted' field of APDUConfirmedRequest")
+	segmentedResponseAccepted, err := ReadSimpleField(ctx, "segmentedResponseAccepted", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'segmentedResponseAccepted' field"))
 	}
-	segmentedResponseAccepted := _segmentedResponseAccepted
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 2), uint8(0))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(2)), uint8(0))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (maxSegmentsAccepted)
-	if pullErr := readBuffer.PullContext("maxSegmentsAccepted"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for maxSegmentsAccepted")
-	}
-	_maxSegmentsAccepted, _maxSegmentsAcceptedErr := MaxSegmentsAcceptedParseWithBuffer(ctx, readBuffer)
-	if _maxSegmentsAcceptedErr != nil {
-		return nil, errors.Wrap(_maxSegmentsAcceptedErr, "Error parsing 'maxSegmentsAccepted' field of APDUConfirmedRequest")
-	}
-	maxSegmentsAccepted := _maxSegmentsAccepted
-	if closeErr := readBuffer.CloseContext("maxSegmentsAccepted"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for maxSegmentsAccepted")
+	maxSegmentsAccepted, err := ReadEnumField[MaxSegmentsAccepted](ctx, "maxSegmentsAccepted", "MaxSegmentsAccepted", ReadEnum(MaxSegmentsAcceptedByValue, ReadUnsignedByte(readBuffer, uint8(3))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'maxSegmentsAccepted' field"))
 	}
 
-	// Simple Field (maxApduLengthAccepted)
-	if pullErr := readBuffer.PullContext("maxApduLengthAccepted"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for maxApduLengthAccepted")
-	}
-	_maxApduLengthAccepted, _maxApduLengthAcceptedErr := MaxApduLengthAcceptedParseWithBuffer(ctx, readBuffer)
-	if _maxApduLengthAcceptedErr != nil {
-		return nil, errors.Wrap(_maxApduLengthAcceptedErr, "Error parsing 'maxApduLengthAccepted' field of APDUConfirmedRequest")
-	}
-	maxApduLengthAccepted := _maxApduLengthAccepted
-	if closeErr := readBuffer.CloseContext("maxApduLengthAccepted"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for maxApduLengthAccepted")
+	maxApduLengthAccepted, err := ReadEnumField[MaxApduLengthAccepted](ctx, "maxApduLengthAccepted", "MaxApduLengthAccepted", ReadEnum(MaxApduLengthAcceptedByValue, ReadUnsignedByte(readBuffer, uint8(4))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'maxApduLengthAccepted' field"))
 	}
 
-	// Simple Field (invokeId)
-	_invokeId, _invokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint8("invokeId", 8)
-	if _invokeIdErr != nil {
-		return nil, errors.Wrap(_invokeIdErr, "Error parsing 'invokeId' field of APDUConfirmedRequest")
+	invokeId, err := ReadSimpleField(ctx, "invokeId", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'invokeId' field"))
 	}
-	invokeId := _invokeId
 
-	sequenceNumber, err := ReadOptionalField[uint8](ctx, "sequenceNumber", ReadUnsignedByte(readBuffer, 8), segmentedMessage)
+	sequenceNumber, err := ReadOptionalField[uint8](ctx, "sequenceNumber", ReadUnsignedByte(readBuffer, uint8(8)), segmentedMessage)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sequenceNumber' field"))
 	}
 
-	proposedWindowSize, err := ReadOptionalField[uint8](ctx, "proposedWindowSize", ReadUnsignedByte(readBuffer, 8), segmentedMessage)
+	proposedWindowSize, err := ReadOptionalField[uint8](ctx, "proposedWindowSize", ReadUnsignedByte(readBuffer, uint8(8)), segmentedMessage)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'proposedWindowSize' field"))
 	}
@@ -387,13 +369,7 @@ func APDUConfirmedRequestParseWithBuffer(ctx context.Context, readBuffer utils.R
 	apduHeaderReduction := uint16(_apduHeaderReduction)
 	_ = apduHeaderReduction
 
-	_serviceRequest, err := ReadOptionalField[BACnetConfirmedServiceRequest](ctx, "serviceRequest", ReadComplex[BACnetConfirmedServiceRequest](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetConfirmedServiceRequest, error) {
-		v, err := BACnetConfirmedServiceRequestParseWithBuffer(ctx, readBuffer, (uint32)(uint32(apduLength)-uint32(apduHeaderReduction)))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetConfirmedServiceRequest), nil
-	}, readBuffer), !(segmentedMessage))
+	_serviceRequest, err := ReadOptionalField[BACnetConfirmedServiceRequest](ctx, "serviceRequest", ReadComplex[BACnetConfirmedServiceRequest](BACnetConfirmedServiceRequestParseWithBufferProducer[BACnetConfirmedServiceRequest]((uint32)(uint32(apduLength)-uint32(apduHeaderReduction))), readBuffer), !(segmentedMessage))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'serviceRequest' field"))
 	}
@@ -407,7 +383,7 @@ func APDUConfirmedRequestParseWithBuffer(ctx context.Context, readBuffer utils.R
 		return nil, errors.WithStack(utils.ParseValidationError{Message: "service request should be set"})
 	}
 
-	segmentServiceChoice, err := ReadOptionalField[BACnetConfirmedServiceChoice](ctx, "segmentServiceChoice", ReadEnum(BACnetConfirmedServiceChoiceByValue, ReadUnsignedByte(readBuffer, 8)), bool(segmentedMessage) && bool(bool((*sequenceNumber) != (0))))
+	segmentServiceChoice, err := ReadOptionalField[BACnetConfirmedServiceChoice](ctx, "segmentServiceChoice", ReadEnum(BACnetConfirmedServiceChoiceByValue, ReadUnsignedByte(readBuffer, uint8(8))), bool(segmentedMessage) && bool(bool((*sequenceNumber) != (0))))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'segmentServiceChoice' field"))
 	}
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUError.go b/plc4go/protocols/bacnetip/readwrite/model/APDUError.go
index d98a6c90d6..981829ab0b 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUError.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUError.go
@@ -159,6 +159,12 @@ func APDUErrorParse(ctx context.Context, theBytes []byte, apduLength uint16) (AP
 	return APDUErrorParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUErrorParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUError, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUError, error) {
+		return APDUErrorParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUErrorParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUError, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -170,42 +176,24 @@ func APDUErrorParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer,
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 4), uint8(0x00))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(4)), uint8(0x00))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (originalInvokeId)
-	_originalInvokeId, _originalInvokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint8("originalInvokeId", 8)
-	if _originalInvokeIdErr != nil {
-		return nil, errors.Wrap(_originalInvokeIdErr, "Error parsing 'originalInvokeId' field of APDUError")
+	originalInvokeId, err := ReadSimpleField(ctx, "originalInvokeId", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'originalInvokeId' field"))
 	}
-	originalInvokeId := _originalInvokeId
 
-	// Simple Field (errorChoice)
-	if pullErr := readBuffer.PullContext("errorChoice"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for errorChoice")
-	}
-	_errorChoice, _errorChoiceErr := BACnetConfirmedServiceChoiceParseWithBuffer(ctx, readBuffer)
-	if _errorChoiceErr != nil {
-		return nil, errors.Wrap(_errorChoiceErr, "Error parsing 'errorChoice' field of APDUError")
-	}
-	errorChoice := _errorChoice
-	if closeErr := readBuffer.CloseContext("errorChoice"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for errorChoice")
+	errorChoice, err := ReadEnumField[BACnetConfirmedServiceChoice](ctx, "errorChoice", "BACnetConfirmedServiceChoice", ReadEnum(BACnetConfirmedServiceChoiceByValue, ReadUnsignedByte(readBuffer, uint8(8))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'errorChoice' field"))
 	}
 
-	// Simple Field (error)
-	if pullErr := readBuffer.PullContext("error"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for error")
-	}
-	_error, _errorErr := BACnetErrorParseWithBuffer(ctx, readBuffer, BACnetConfirmedServiceChoice(errorChoice))
-	if _errorErr != nil {
-		return nil, errors.Wrap(_errorErr, "Error parsing 'error' field of APDUError")
-	}
-	error := _error.(BACnetError)
-	if closeErr := readBuffer.CloseContext("error"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for error")
+	error, err := ReadSimpleField[BACnetError](ctx, "error", ReadComplex[BACnetError](BACnetErrorParseWithBufferProducer[BACnetError]((BACnetConfirmedServiceChoice)(errorChoice)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'error' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("APDUError"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUReject.go b/plc4go/protocols/bacnetip/readwrite/model/APDUReject.go
index dd795a1772..f8346a138a 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUReject.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUReject.go
@@ -148,6 +148,12 @@ func APDURejectParse(ctx context.Context, theBytes []byte, apduLength uint16) (A
 	return APDURejectParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDURejectParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUReject, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUReject, error) {
+		return APDURejectParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDURejectParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUReject, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -159,29 +165,19 @@ func APDURejectParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer,
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 4), uint8(0x00))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(4)), uint8(0x00))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (originalInvokeId)
-	_originalInvokeId, _originalInvokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint8("originalInvokeId", 8)
-	if _originalInvokeIdErr != nil {
-		return nil, errors.Wrap(_originalInvokeIdErr, "Error parsing 'originalInvokeId' field of APDUReject")
+	originalInvokeId, err := ReadSimpleField(ctx, "originalInvokeId", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'originalInvokeId' field"))
 	}
-	originalInvokeId := _originalInvokeId
 
-	// Simple Field (rejectReason)
-	if pullErr := readBuffer.PullContext("rejectReason"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for rejectReason")
-	}
-	_rejectReason, _rejectReasonErr := BACnetRejectReasonTaggedParseWithBuffer(ctx, readBuffer, uint32(uint32(1)))
-	if _rejectReasonErr != nil {
-		return nil, errors.Wrap(_rejectReasonErr, "Error parsing 'rejectReason' field of APDUReject")
-	}
-	rejectReason := _rejectReason.(BACnetRejectReasonTagged)
-	if closeErr := readBuffer.CloseContext("rejectReason"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for rejectReason")
+	rejectReason, err := ReadSimpleField[BACnetRejectReasonTagged](ctx, "rejectReason", ReadComplex[BACnetRejectReasonTagged](BACnetRejectReasonTaggedParseWithBufferProducer((uint32)(uint32(1))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'rejectReason' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("APDUReject"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUSegmentAck.go b/plc4go/protocols/bacnetip/readwrite/model/APDUSegmentAck.go
index 5c4d51c71c..160a74374e 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUSegmentAck.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUSegmentAck.go
@@ -181,6 +181,12 @@ func APDUSegmentAckParse(ctx context.Context, theBytes []byte, apduLength uint16
 	return APDUSegmentAckParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUSegmentAckParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUSegmentAck, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUSegmentAck, error) {
+		return APDUSegmentAckParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUSegmentAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUSegmentAck, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -192,45 +198,35 @@ func APDUSegmentAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 2), uint8(0x00))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(2)), uint8(0x00))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (negativeAck)
-	_negativeAck, _negativeAckErr := /*TODO: migrate me*/ readBuffer.ReadBit("negativeAck")
-	if _negativeAckErr != nil {
-		return nil, errors.Wrap(_negativeAckErr, "Error parsing 'negativeAck' field of APDUSegmentAck")
+	negativeAck, err := ReadSimpleField(ctx, "negativeAck", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'negativeAck' field"))
 	}
-	negativeAck := _negativeAck
 
-	// Simple Field (server)
-	_server, _serverErr := /*TODO: migrate me*/ readBuffer.ReadBit("server")
-	if _serverErr != nil {
-		return nil, errors.Wrap(_serverErr, "Error parsing 'server' field of APDUSegmentAck")
+	server, err := ReadSimpleField(ctx, "server", ReadBoolean(readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'server' field"))
 	}
-	server := _server
 
-	// Simple Field (originalInvokeId)
-	_originalInvokeId, _originalInvokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint8("originalInvokeId", 8)
-	if _originalInvokeIdErr != nil {
-		return nil, errors.Wrap(_originalInvokeIdErr, "Error parsing 'originalInvokeId' field of APDUSegmentAck")
+	originalInvokeId, err := ReadSimpleField(ctx, "originalInvokeId", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'originalInvokeId' field"))
 	}
-	originalInvokeId := _originalInvokeId
 
-	// Simple Field (sequenceNumber)
-	_sequenceNumber, _sequenceNumberErr := /*TODO: migrate me*/ readBuffer.ReadUint8("sequenceNumber", 8)
-	if _sequenceNumberErr != nil {
-		return nil, errors.Wrap(_sequenceNumberErr, "Error parsing 'sequenceNumber' field of APDUSegmentAck")
+	sequenceNumber, err := ReadSimpleField(ctx, "sequenceNumber", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'sequenceNumber' field"))
 	}
-	sequenceNumber := _sequenceNumber
 
-	// Simple Field (actualWindowSize)
-	_actualWindowSize, _actualWindowSizeErr := /*TODO: migrate me*/ readBuffer.ReadUint8("actualWindowSize", 8)
-	if _actualWindowSizeErr != nil {
-		return nil, errors.Wrap(_actualWindowSizeErr, "Error parsing 'actualWindowSize' field of APDUSegmentAck")
+	actualWindowSize, err := ReadSimpleField(ctx, "actualWindowSize", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'actualWindowSize' field"))
 	}
-	actualWindowSize := _actualWindowSize
 
 	if closeErr := readBuffer.CloseContext("APDUSegmentAck"); closeErr != nil {
 		return nil, errors.Wrap(closeErr, "Error closing for APDUSegmentAck")
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUSimpleAck.go b/plc4go/protocols/bacnetip/readwrite/model/APDUSimpleAck.go
index 0901cf7363..ccf89e5353 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUSimpleAck.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUSimpleAck.go
@@ -148,6 +148,12 @@ func APDUSimpleAckParse(ctx context.Context, theBytes []byte, apduLength uint16)
 	return APDUSimpleAckParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUSimpleAckParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUSimpleAck, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUSimpleAck, error) {
+		return APDUSimpleAckParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUSimpleAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUSimpleAck, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -159,29 +165,19 @@ func APDUSimpleAckParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 4), uint8(0))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(4)), uint8(0))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (originalInvokeId)
-	_originalInvokeId, _originalInvokeIdErr := /*TODO: migrate me*/ readBuffer.ReadUint8("originalInvokeId", 8)
-	if _originalInvokeIdErr != nil {
-		return nil, errors.Wrap(_originalInvokeIdErr, "Error parsing 'originalInvokeId' field of APDUSimpleAck")
+	originalInvokeId, err := ReadSimpleField(ctx, "originalInvokeId", ReadUnsignedByte(readBuffer, uint8(8)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'originalInvokeId' field"))
 	}
-	originalInvokeId := _originalInvokeId
 
-	// Simple Field (serviceChoice)
-	if pullErr := readBuffer.PullContext("serviceChoice"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for serviceChoice")
-	}
-	_serviceChoice, _serviceChoiceErr := BACnetConfirmedServiceChoiceParseWithBuffer(ctx, readBuffer)
-	if _serviceChoiceErr != nil {
-		return nil, errors.Wrap(_serviceChoiceErr, "Error parsing 'serviceChoice' field of APDUSimpleAck")
-	}
-	serviceChoice := _serviceChoice
-	if closeErr := readBuffer.CloseContext("serviceChoice"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for serviceChoice")
+	serviceChoice, err := ReadEnumField[BACnetConfirmedServiceChoice](ctx, "serviceChoice", "BACnetConfirmedServiceChoice", ReadEnum(BACnetConfirmedServiceChoiceByValue, ReadUnsignedByte(readBuffer, uint8(8))))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'serviceChoice' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("APDUSimpleAck"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUUnconfirmedRequest.go b/plc4go/protocols/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
index 6758fa2832..bdacbab676 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUUnconfirmedRequest.go
@@ -137,6 +137,12 @@ func APDUUnconfirmedRequestParse(ctx context.Context, theBytes []byte, apduLengt
 	return APDUUnconfirmedRequestParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUUnconfirmedRequestParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUUnconfirmedRequest, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUUnconfirmedRequest, error) {
+		return APDUUnconfirmedRequestParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUUnconfirmedRequestParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUUnconfirmedRequest, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -148,22 +154,14 @@ func APDUUnconfirmedRequestParseWithBuffer(ctx context.Context, readBuffer utils
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, 4), uint8(0))
+	reservedField0, err := ReadReservedField(ctx, "reserved", ReadUnsignedByte(readBuffer, uint8(4)), uint8(0))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing reserved field"))
 	}
 
-	// Simple Field (serviceRequest)
-	if pullErr := readBuffer.PullContext("serviceRequest"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for serviceRequest")
-	}
-	_serviceRequest, _serviceRequestErr := BACnetUnconfirmedServiceRequestParseWithBuffer(ctx, readBuffer, uint16(uint16(apduLength)-uint16(uint16(1))))
-	if _serviceRequestErr != nil {
-		return nil, errors.Wrap(_serviceRequestErr, "Error parsing 'serviceRequest' field of APDUUnconfirmedRequest")
-	}
-	serviceRequest := _serviceRequest.(BACnetUnconfirmedServiceRequest)
-	if closeErr := readBuffer.CloseContext("serviceRequest"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for serviceRequest")
+	serviceRequest, err := ReadSimpleField[BACnetUnconfirmedServiceRequest](ctx, "serviceRequest", ReadComplex[BACnetUnconfirmedServiceRequest](BACnetUnconfirmedServiceRequestParseWithBufferProducer[BACnetUnconfirmedServiceRequest]((uint16)(uint16(apduLength)-uint16(uint16(1)))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'serviceRequest' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("APDUUnconfirmedRequest"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/APDUUnknown.go b/plc4go/protocols/bacnetip/readwrite/model/APDUUnknown.go
index 8b9328158b..f3b90edbbe 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/APDUUnknown.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/APDUUnknown.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -143,6 +145,12 @@ func APDUUnknownParse(ctx context.Context, theBytes []byte, apduLength uint16) (
 	return APDUUnknownParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), apduLength)
 }
 
+func APDUUnknownParseWithBufferProducer(apduLength uint16) func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUUnknown, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (APDUUnknown, error) {
+		return APDUUnknownParseWithBuffer(ctx, readBuffer, apduLength)
+	}
+}
+
 func APDUUnknownParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, apduLength uint16) (APDUUnknown, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -154,12 +162,10 @@ func APDUUnknownParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (unknownTypeRest)
-	_unknownTypeRest, _unknownTypeRestErr := /*TODO: migrate me*/ readBuffer.ReadUint8("unknownTypeRest", 4)
-	if _unknownTypeRestErr != nil {
-		return nil, errors.Wrap(_unknownTypeRestErr, "Error parsing 'unknownTypeRest' field of APDUUnknown")
+	unknownTypeRest, err := ReadSimpleField(ctx, "unknownTypeRest", ReadUnsignedByte(readBuffer, uint8(4)))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'unknownTypeRest' field"))
 	}
-	unknownTypeRest := _unknownTypeRest
 
 	unknownBytes, err := readBuffer.ReadByteArray("unknownBytes", int(utils.InlineIf((bool((apduLength) > (0))), func() any { return int32(apduLength) }, func() any { return int32(int32(0)) }).(int32)))
 	if err != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAbortReasonTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAbortReasonTagged.go
index dfd179323a..f7039fa445 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAbortReasonTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAbortReasonTagged.go
@@ -136,6 +136,12 @@ func BACnetAbortReasonTaggedParse(ctx context.Context, theBytes []byte, actualLe
 	return BACnetAbortReasonTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), actualLength)
 }
 
+func BACnetAbortReasonTaggedParseWithBufferProducer(actualLength uint32) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAbortReasonTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAbortReasonTagged, error) {
+		return BACnetAbortReasonTaggedParseWithBuffer(ctx, readBuffer, actualLength)
+	}
+}
+
 func BACnetAbortReasonTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, actualLength uint32) (BACnetAbortReasonTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessAuthenticationFactorDisableTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessAuthenticationFactorDisableTagged.go
index 40c661a397..c78226c3d5 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessAuthenticationFactorDisableTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessAuthenticationFactorDisableTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAccessAuthenticationFactorDisableTaggedParse(ctx context.Context, the
 	return BACnetAccessAuthenticationFactorDisableTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessAuthenticationFactorDisableTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessAuthenticationFactorDisableTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessAuthenticationFactorDisableTagged, error) {
+		return BACnetAccessAuthenticationFactorDisableTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessAuthenticationFactorDisableTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessAuthenticationFactorDisableTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAccessAuthenticationFactorDisableTaggedParseWithBuffer(ctx context.Co
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessAuthenticationFactorDisableTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableReasonTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableReasonTagged.go
index a9e5ce863e..5cab0c8085 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableReasonTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableReasonTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAccessCredentialDisableReasonTaggedParse(ctx context.Context, theByte
 	return BACnetAccessCredentialDisableReasonTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessCredentialDisableReasonTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessCredentialDisableReasonTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessCredentialDisableReasonTagged, error) {
+		return BACnetAccessCredentialDisableReasonTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessCredentialDisableReasonTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessCredentialDisableReasonTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAccessCredentialDisableReasonTaggedParseWithBuffer(ctx context.Contex
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessCredentialDisableReasonTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableTagged.go
index cfa885fb10..2a1fd23ed1 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessCredentialDisableTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAccessCredentialDisableTaggedParse(ctx context.Context, theBytes []by
 	return BACnetAccessCredentialDisableTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessCredentialDisableTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessCredentialDisableTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessCredentialDisableTagged, error) {
+		return BACnetAccessCredentialDisableTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessCredentialDisableTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessCredentialDisableTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAccessCredentialDisableTaggedParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessCredentialDisableTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessEventTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessEventTagged.go
index 0a65c83d00..81e0391afa 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessEventTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessEventTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAccessEventTaggedParse(ctx context.Context, theBytes []byte, tagNumbe
 	return BACnetAccessEventTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessEventTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessEventTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessEventTagged, error) {
+		return BACnetAccessEventTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessEventTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessEventTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAccessEventTaggedParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessEventTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessPassbackModeTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessPassbackModeTagged.go
index ebdf547b89..2af0a538ec 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessPassbackModeTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessPassbackModeTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetAccessPassbackModeTaggedParse(ctx context.Context, theBytes []byte, t
 	return BACnetAccessPassbackModeTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessPassbackModeTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessPassbackModeTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessPassbackModeTagged, error) {
+		return BACnetAccessPassbackModeTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessPassbackModeTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessPassbackModeTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetAccessPassbackModeTaggedParseWithBuffer(ctx context.Context, readBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessPassbackModeTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRule.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRule.go
index d028ef06c6..86a964363e 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRule.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRule.go
@@ -149,6 +149,12 @@ func BACnetAccessRuleParse(ctx context.Context, theBytes []byte) (BACnetAccessRu
 	return BACnetAccessRuleParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAccessRuleParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessRule, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessRule, error) {
+		return BACnetAccessRuleParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAccessRuleParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessRule, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -160,26 +166,12 @@ func BACnetAccessRuleParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (timeRangeSpecifier)
-	if pullErr := readBuffer.PullContext("timeRangeSpecifier"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for timeRangeSpecifier")
-	}
-	_timeRangeSpecifier, _timeRangeSpecifierErr := BACnetAccessRuleTimeRangeSpecifierTaggedParseWithBuffer(ctx, readBuffer, uint8(uint8(0)), TagClass(TagClass_CONTEXT_SPECIFIC_TAGS))
-	if _timeRangeSpecifierErr != nil {
-		return nil, errors.Wrap(_timeRangeSpecifierErr, "Error parsing 'timeRangeSpecifier' field of BACnetAccessRule")
-	}
-	timeRangeSpecifier := _timeRangeSpecifier.(BACnetAccessRuleTimeRangeSpecifierTagged)
-	if closeErr := readBuffer.CloseContext("timeRangeSpecifier"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for timeRangeSpecifier")
+	timeRangeSpecifier, err := ReadSimpleField[BACnetAccessRuleTimeRangeSpecifierTagged](ctx, "timeRangeSpecifier", ReadComplex[BACnetAccessRuleTimeRangeSpecifierTagged](BACnetAccessRuleTimeRangeSpecifierTaggedParseWithBufferProducer((uint8)(uint8(0)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'timeRangeSpecifier' field"))
 	}
 
-	_timeRange, err := ReadOptionalField[BACnetDeviceObjectPropertyReferenceEnclosed](ctx, "timeRange", ReadComplex[BACnetDeviceObjectPropertyReferenceEnclosed](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetDeviceObjectPropertyReferenceEnclosed, error) {
-		v, err := BACnetDeviceObjectPropertyReferenceEnclosedParseWithBuffer(ctx, readBuffer, (uint8)(uint8(1)))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetDeviceObjectPropertyReferenceEnclosed), nil
-	}, readBuffer), bool((timeRangeSpecifier) != (nil)))
+	_timeRange, err := ReadOptionalField[BACnetDeviceObjectPropertyReferenceEnclosed](ctx, "timeRange", ReadComplex[BACnetDeviceObjectPropertyReferenceEnclosed](BACnetDeviceObjectPropertyReferenceEnclosedParseWithBufferProducer((uint8)(uint8(1))), readBuffer), bool((timeRangeSpecifier) != (nil)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'timeRange' field"))
 	}
@@ -188,26 +180,12 @@ func BACnetAccessRuleParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 		timeRange = *_timeRange
 	}
 
-	// Simple Field (locationSpecifier)
-	if pullErr := readBuffer.PullContext("locationSpecifier"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for locationSpecifier")
-	}
-	_locationSpecifier, _locationSpecifierErr := BACnetAccessRuleLocationSpecifierTaggedParseWithBuffer(ctx, readBuffer, uint8(uint8(2)), TagClass(TagClass_CONTEXT_SPECIFIC_TAGS))
-	if _locationSpecifierErr != nil {
-		return nil, errors.Wrap(_locationSpecifierErr, "Error parsing 'locationSpecifier' field of BACnetAccessRule")
-	}
-	locationSpecifier := _locationSpecifier.(BACnetAccessRuleLocationSpecifierTagged)
-	if closeErr := readBuffer.CloseContext("locationSpecifier"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for locationSpecifier")
+	locationSpecifier, err := ReadSimpleField[BACnetAccessRuleLocationSpecifierTagged](ctx, "locationSpecifier", ReadComplex[BACnetAccessRuleLocationSpecifierTagged](BACnetAccessRuleLocationSpecifierTaggedParseWithBufferProducer((uint8)(uint8(2)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'locationSpecifier' field"))
 	}
 
-	_location, err := ReadOptionalField[BACnetDeviceObjectReferenceEnclosed](ctx, "location", ReadComplex[BACnetDeviceObjectReferenceEnclosed](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetDeviceObjectReferenceEnclosed, error) {
-		v, err := BACnetDeviceObjectReferenceEnclosedParseWithBuffer(ctx, readBuffer, (uint8)(uint8(3)))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetDeviceObjectReferenceEnclosed), nil
-	}, readBuffer), bool((locationSpecifier) != (nil)))
+	_location, err := ReadOptionalField[BACnetDeviceObjectReferenceEnclosed](ctx, "location", ReadComplex[BACnetDeviceObjectReferenceEnclosed](BACnetDeviceObjectReferenceEnclosedParseWithBufferProducer((uint8)(uint8(3))), readBuffer), bool((locationSpecifier) != (nil)))
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'location' field"))
 	}
@@ -216,17 +194,9 @@ func BACnetAccessRuleParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 		location = *_location
 	}
 
-	// Simple Field (enable)
-	if pullErr := readBuffer.PullContext("enable"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for enable")
-	}
-	_enable, _enableErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(4)), BACnetDataType(BACnetDataType_BOOLEAN))
-	if _enableErr != nil {
-		return nil, errors.Wrap(_enableErr, "Error parsing 'enable' field of BACnetAccessRule")
-	}
-	enable := _enable.(BACnetContextTagBoolean)
-	if closeErr := readBuffer.CloseContext("enable"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for enable")
+	enable, err := ReadSimpleField[BACnetContextTagBoolean](ctx, "enable", ReadComplex[BACnetContextTagBoolean](BACnetContextTagParseWithBufferProducer[BACnetContextTagBoolean]((uint8)(uint8(4)), (BACnetDataType)(BACnetDataType_BOOLEAN)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'enable' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAccessRule"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleLocationSpecifierTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleLocationSpecifierTagged.go
index 5dc07c7ed0..56b2255a93 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleLocationSpecifierTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleLocationSpecifierTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetAccessRuleLocationSpecifierTaggedParse(ctx context.Context, theBytes
 	return BACnetAccessRuleLocationSpecifierTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessRuleLocationSpecifierTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessRuleLocationSpecifierTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessRuleLocationSpecifierTagged, error) {
+		return BACnetAccessRuleLocationSpecifierTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessRuleLocationSpecifierTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessRuleLocationSpecifierTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetAccessRuleLocationSpecifierTaggedParseWithBuffer(ctx context.Context,
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessRuleLocationSpecifierTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleTimeRangeSpecifierTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleTimeRangeSpecifierTagged.go
index f88216a0be..8c84cbdf28 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleTimeRangeSpecifierTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessRuleTimeRangeSpecifierTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetAccessRuleTimeRangeSpecifierTaggedParse(ctx context.Context, theBytes
 	return BACnetAccessRuleTimeRangeSpecifierTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessRuleTimeRangeSpecifierTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessRuleTimeRangeSpecifierTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessRuleTimeRangeSpecifierTagged, error) {
+		return BACnetAccessRuleTimeRangeSpecifierTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessRuleTimeRangeSpecifierTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessRuleTimeRangeSpecifierTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetAccessRuleTimeRangeSpecifierTaggedParseWithBuffer(ctx context.Context
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessRuleTimeRangeSpecifierTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessThreatLevel.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessThreatLevel.go
index 9318021fb1..db37927291 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessThreatLevel.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessThreatLevel.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -103,6 +105,12 @@ func BACnetAccessThreatLevelParse(ctx context.Context, theBytes []byte) (BACnetA
 	return BACnetAccessThreatLevelParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAccessThreatLevelParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessThreatLevel, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessThreatLevel, error) {
+		return BACnetAccessThreatLevelParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAccessThreatLevelParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessThreatLevel, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -114,17 +122,9 @@ func BACnetAccessThreatLevelParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (threatLevel)
-	if pullErr := readBuffer.PullContext("threatLevel"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for threatLevel")
-	}
-	_threatLevel, _threatLevelErr := BACnetApplicationTagParseWithBuffer(ctx, readBuffer)
-	if _threatLevelErr != nil {
-		return nil, errors.Wrap(_threatLevelErr, "Error parsing 'threatLevel' field of BACnetAccessThreatLevel")
-	}
-	threatLevel := _threatLevel.(BACnetApplicationTagUnsignedInteger)
-	if closeErr := readBuffer.CloseContext("threatLevel"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for threatLevel")
+	threatLevel, err := ReadSimpleField[BACnetApplicationTagUnsignedInteger](ctx, "threatLevel", ReadComplex[BACnetApplicationTagUnsignedInteger](BACnetApplicationTagParseWithBufferProducer[BACnetApplicationTagUnsignedInteger](), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'threatLevel' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAccessThreatLevel"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessUserTypeTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessUserTypeTagged.go
index e850bef437..ff61c6ac5b 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessUserTypeTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessUserTypeTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAccessUserTypeTaggedParse(ctx context.Context, theBytes []byte, tagNu
 	return BACnetAccessUserTypeTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessUserTypeTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessUserTypeTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessUserTypeTagged, error) {
+		return BACnetAccessUserTypeTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessUserTypeTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessUserTypeTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAccessUserTypeTaggedParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessUserTypeTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessZoneOccupancyStateTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessZoneOccupancyStateTagged.go
index 09c81b181e..27bb6a8677 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessZoneOccupancyStateTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccessZoneOccupancyStateTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAccessZoneOccupancyStateTaggedParse(ctx context.Context, theBytes []b
 	return BACnetAccessZoneOccupancyStateTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccessZoneOccupancyStateTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessZoneOccupancyStateTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccessZoneOccupancyStateTagged, error) {
+		return BACnetAccessZoneOccupancyStateTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccessZoneOccupancyStateTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccessZoneOccupancyStateTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAccessZoneOccupancyStateTaggedParseWithBuffer(ctx context.Context, re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccessZoneOccupancyStateTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecord.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecord.go
index 2b6bf97e4e..90c589153f 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecord.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecord.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -133,6 +135,12 @@ func BACnetAccumulatorRecordParse(ctx context.Context, theBytes []byte) (BACnetA
 	return BACnetAccumulatorRecordParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAccumulatorRecordParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccumulatorRecord, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccumulatorRecord, error) {
+		return BACnetAccumulatorRecordParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAccumulatorRecordParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccumulatorRecord, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -144,56 +152,24 @@ func BACnetAccumulatorRecordParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (timestamp)
-	if pullErr := readBuffer.PullContext("timestamp"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for timestamp")
-	}
-	_timestamp, _timestampErr := BACnetDateTimeEnclosedParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _timestampErr != nil {
-		return nil, errors.Wrap(_timestampErr, "Error parsing 'timestamp' field of BACnetAccumulatorRecord")
-	}
-	timestamp := _timestamp.(BACnetDateTimeEnclosed)
-	if closeErr := readBuffer.CloseContext("timestamp"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for timestamp")
+	timestamp, err := ReadSimpleField[BACnetDateTimeEnclosed](ctx, "timestamp", ReadComplex[BACnetDateTimeEnclosed](BACnetDateTimeEnclosedParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'timestamp' field"))
 	}
 
-	// Simple Field (presentValue)
-	if pullErr := readBuffer.PullContext("presentValue"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for presentValue")
-	}
-	_presentValue, _presentValueErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_SIGNED_INTEGER))
-	if _presentValueErr != nil {
-		return nil, errors.Wrap(_presentValueErr, "Error parsing 'presentValue' field of BACnetAccumulatorRecord")
-	}
-	presentValue := _presentValue.(BACnetContextTagSignedInteger)
-	if closeErr := readBuffer.CloseContext("presentValue"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for presentValue")
+	presentValue, err := ReadSimpleField[BACnetContextTagSignedInteger](ctx, "presentValue", ReadComplex[BACnetContextTagSignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagSignedInteger]((uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_SIGNED_INTEGER)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'presentValue' field"))
 	}
 
-	// Simple Field (accumulatedValue)
-	if pullErr := readBuffer.PullContext("accumulatedValue"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for accumulatedValue")
-	}
-	_accumulatedValue, _accumulatedValueErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(2)), BACnetDataType(BACnetDataType_SIGNED_INTEGER))
-	if _accumulatedValueErr != nil {
-		return nil, errors.Wrap(_accumulatedValueErr, "Error parsing 'accumulatedValue' field of BACnetAccumulatorRecord")
-	}
-	accumulatedValue := _accumulatedValue.(BACnetContextTagSignedInteger)
-	if closeErr := readBuffer.CloseContext("accumulatedValue"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for accumulatedValue")
+	accumulatedValue, err := ReadSimpleField[BACnetContextTagSignedInteger](ctx, "accumulatedValue", ReadComplex[BACnetContextTagSignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagSignedInteger]((uint8)(uint8(2)), (BACnetDataType)(BACnetDataType_SIGNED_INTEGER)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'accumulatedValue' field"))
 	}
 
-	// Simple Field (accumulatorStatus)
-	if pullErr := readBuffer.PullContext("accumulatorStatus"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for accumulatorStatus")
-	}
-	_accumulatorStatus, _accumulatorStatusErr := BACnetAccumulatorRecordAccumulatorStatusTaggedParseWithBuffer(ctx, readBuffer, uint8(uint8(3)), TagClass(TagClass_CONTEXT_SPECIFIC_TAGS))
-	if _accumulatorStatusErr != nil {
-		return nil, errors.Wrap(_accumulatorStatusErr, "Error parsing 'accumulatorStatus' field of BACnetAccumulatorRecord")
-	}
-	accumulatorStatus := _accumulatorStatus.(BACnetAccumulatorRecordAccumulatorStatusTagged)
-	if closeErr := readBuffer.CloseContext("accumulatorStatus"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for accumulatorStatus")
+	accumulatorStatus, err := ReadSimpleField[BACnetAccumulatorRecordAccumulatorStatusTagged](ctx, "accumulatorStatus", ReadComplex[BACnetAccumulatorRecordAccumulatorStatusTagged](BACnetAccumulatorRecordAccumulatorStatusTaggedParseWithBufferProducer((uint8)(uint8(3)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'accumulatorStatus' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAccumulatorRecord"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecordAccumulatorStatusTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecordAccumulatorStatusTagged.go
index ba738945d7..835952a390 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecordAccumulatorStatusTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAccumulatorRecordAccumulatorStatusTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetAccumulatorRecordAccumulatorStatusTaggedParse(ctx context.Context, th
 	return BACnetAccumulatorRecordAccumulatorStatusTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAccumulatorRecordAccumulatorStatusTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccumulatorRecordAccumulatorStatusTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAccumulatorRecordAccumulatorStatusTagged, error) {
+		return BACnetAccumulatorRecordAccumulatorStatusTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAccumulatorRecordAccumulatorStatusTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAccumulatorRecordAccumulatorStatusTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetAccumulatorRecordAccumulatorStatusTaggedParseWithBuffer(ctx context.C
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAccumulatorRecordAccumulatorStatusTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetActionCommand.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetActionCommand.go
index 23546f9543..5e28cd77d9 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetActionCommand.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetActionCommand.go
@@ -195,6 +195,12 @@ func BACnetActionCommandParse(ctx context.Context, theBytes []byte) (BACnetActio
 	return BACnetActionCommandParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetActionCommandParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionCommand, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionCommand, error) {
+		return BACnetActionCommandParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetActionCommandParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionCommand, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -206,13 +212,7 @@ func BACnetActionCommandParseWithBuffer(ctx context.Context, readBuffer utils.Re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	_deviceIdentifier, err := ReadOptionalField[BACnetContextTagObjectIdentifier](ctx, "deviceIdentifier", ReadComplex[BACnetContextTagObjectIdentifier](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetContextTagObjectIdentifier, error) {
-		v, err := BACnetContextTagParseWithBuffer(ctx, readBuffer, (uint8)(uint8(0)), (BACnetDataType)(BACnetDataType_BACNET_OBJECT_IDENTIFIER))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetContextTagObjectIdentifier), nil
-	}, readBuffer), true)
+	_deviceIdentifier, err := ReadOptionalField[BACnetContextTagObjectIdentifier](ctx, "deviceIdentifier", ReadComplex[BACnetContextTagObjectIdentifier](BACnetContextTagParseWithBufferProducer[BACnetContextTagObjectIdentifier]((uint8)(uint8(0)), (BACnetDataType)(BACnetDataType_BACNET_OBJECT_IDENTIFIER)), readBuffer), true)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'deviceIdentifier' field"))
 	}
@@ -221,39 +221,17 @@ func BACnetActionCommandParseWithBuffer(ctx context.Context, readBuffer utils.Re
 		deviceIdentifier = *_deviceIdentifier
 	}
 
-	// Simple Field (objectIdentifier)
-	if pullErr := readBuffer.PullContext("objectIdentifier"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for objectIdentifier")
-	}
-	_objectIdentifier, _objectIdentifierErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_BACNET_OBJECT_IDENTIFIER))
-	if _objectIdentifierErr != nil {
-		return nil, errors.Wrap(_objectIdentifierErr, "Error parsing 'objectIdentifier' field of BACnetActionCommand")
-	}
-	objectIdentifier := _objectIdentifier.(BACnetContextTagObjectIdentifier)
-	if closeErr := readBuffer.CloseContext("objectIdentifier"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for objectIdentifier")
+	objectIdentifier, err := ReadSimpleField[BACnetContextTagObjectIdentifier](ctx, "objectIdentifier", ReadComplex[BACnetContextTagObjectIdentifier](BACnetContextTagParseWithBufferProducer[BACnetContextTagObjectIdentifier]((uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_BACNET_OBJECT_IDENTIFIER)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'objectIdentifier' field"))
 	}
 
-	// Simple Field (propertyIdentifier)
-	if pullErr := readBuffer.PullContext("propertyIdentifier"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for propertyIdentifier")
-	}
-	_propertyIdentifier, _propertyIdentifierErr := BACnetPropertyIdentifierTaggedParseWithBuffer(ctx, readBuffer, uint8(uint8(2)), TagClass(TagClass_CONTEXT_SPECIFIC_TAGS))
-	if _propertyIdentifierErr != nil {
-		return nil, errors.Wrap(_propertyIdentifierErr, "Error parsing 'propertyIdentifier' field of BACnetActionCommand")
-	}
-	propertyIdentifier := _propertyIdentifier.(BACnetPropertyIdentifierTagged)
-	if closeErr := readBuffer.CloseContext("propertyIdentifier"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for propertyIdentifier")
+	propertyIdentifier, err := ReadSimpleField[BACnetPropertyIdentifierTagged](ctx, "propertyIdentifier", ReadComplex[BACnetPropertyIdentifierTagged](BACnetPropertyIdentifierTaggedParseWithBufferProducer((uint8)(uint8(2)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'propertyIdentifier' field"))
 	}
 
-	_arrayIndex, err := ReadOptionalField[BACnetContextTagUnsignedInteger](ctx, "arrayIndex", ReadComplex[BACnetContextTagUnsignedInteger](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetContextTagUnsignedInteger, error) {
-		v, err := BACnetContextTagParseWithBuffer(ctx, readBuffer, (uint8)(uint8(3)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetContextTagUnsignedInteger), nil
-	}, readBuffer), true)
+	_arrayIndex, err := ReadOptionalField[BACnetContextTagUnsignedInteger](ctx, "arrayIndex", ReadComplex[BACnetContextTagUnsignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagUnsignedInteger]((uint8)(uint8(3)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER)), readBuffer), true)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'arrayIndex' field"))
 	}
@@ -262,13 +240,7 @@ func BACnetActionCommandParseWithBuffer(ctx context.Context, readBuffer utils.Re
 		arrayIndex = *_arrayIndex
 	}
 
-	_propertyValue, err := ReadOptionalField[BACnetConstructedData](ctx, "propertyValue", ReadComplex[BACnetConstructedData](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetConstructedData, error) {
-		v, err := BACnetConstructedDataParseWithBuffer(ctx, readBuffer, (uint8)(uint8(4)), (BACnetObjectType)(objectIdentifier.GetObjectType()), (BACnetPropertyIdentifier)(propertyIdentifier.GetValue()), (BACnetTagPayloadUnsignedInteger)((CastBACnetTagPayloadUnsignedInteger(utils.InlineIf(bool((arrayIndex) != (nil)), func() any { return CastBACnetTagPayloadUnsignedInteger((arrayIndex).GetPayload()) }, func() any { return CastBACnetTagPayloadUnsignedInteger(nil) })))))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetConstructedData), nil
-	}, readBuffer), true)
+	_propertyValue, err := ReadOptionalField[BACnetConstructedData](ctx, "propertyValue", ReadComplex[BACnetConstructedData](BACnetConstructedDataParseWithBufferProducer[BACnetConstructedData]((uint8)(uint8(4)), (BACnetObjectType)(objectIdentifier.GetObjectType()), (BACnetPropertyIdentifier)(propertyIdentifier.GetValue()), (BACnetTagPayloadUnsignedInteger)((CastBACnetTagPayloadUnsignedInteger(utils.InlineIf(bool((arrayIndex) != (nil)), func() any { return CastBACnetTagPayloadUnsignedInteger [...]
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'propertyValue' field"))
 	}
@@ -277,13 +249,7 @@ func BACnetActionCommandParseWithBuffer(ctx context.Context, readBuffer utils.Re
 		propertyValue = *_propertyValue
 	}
 
-	_priority, err := ReadOptionalField[BACnetContextTagUnsignedInteger](ctx, "priority", ReadComplex[BACnetContextTagUnsignedInteger](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetContextTagUnsignedInteger, error) {
-		v, err := BACnetContextTagParseWithBuffer(ctx, readBuffer, (uint8)(uint8(5)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetContextTagUnsignedInteger), nil
-	}, readBuffer), true)
+	_priority, err := ReadOptionalField[BACnetContextTagUnsignedInteger](ctx, "priority", ReadComplex[BACnetContextTagUnsignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagUnsignedInteger]((uint8)(uint8(5)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER)), readBuffer), true)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'priority' field"))
 	}
@@ -292,13 +258,7 @@ func BACnetActionCommandParseWithBuffer(ctx context.Context, readBuffer utils.Re
 		priority = *_priority
 	}
 
-	_postDelay, err := ReadOptionalField[BACnetContextTagBoolean](ctx, "postDelay", ReadComplex[BACnetContextTagBoolean](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetContextTagBoolean, error) {
-		v, err := BACnetContextTagParseWithBuffer(ctx, readBuffer, (uint8)(uint8(6)), (BACnetDataType)(BACnetDataType_BOOLEAN))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetContextTagBoolean), nil
-	}, readBuffer), true)
+	_postDelay, err := ReadOptionalField[BACnetContextTagBoolean](ctx, "postDelay", ReadComplex[BACnetContextTagBoolean](BACnetContextTagParseWithBufferProducer[BACnetContextTagBoolean]((uint8)(uint8(6)), (BACnetDataType)(BACnetDataType_BOOLEAN)), readBuffer), true)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'postDelay' field"))
 	}
@@ -307,30 +267,14 @@ func BACnetActionCommandParseWithBuffer(ctx context.Context, readBuffer utils.Re
 		postDelay = *_postDelay
 	}
 
-	// Simple Field (quitOnFailure)
-	if pullErr := readBuffer.PullContext("quitOnFailure"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for quitOnFailure")
-	}
-	_quitOnFailure, _quitOnFailureErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(7)), BACnetDataType(BACnetDataType_BOOLEAN))
-	if _quitOnFailureErr != nil {
-		return nil, errors.Wrap(_quitOnFailureErr, "Error parsing 'quitOnFailure' field of BACnetActionCommand")
-	}
-	quitOnFailure := _quitOnFailure.(BACnetContextTagBoolean)
-	if closeErr := readBuffer.CloseContext("quitOnFailure"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for quitOnFailure")
+	quitOnFailure, err := ReadSimpleField[BACnetContextTagBoolean](ctx, "quitOnFailure", ReadComplex[BACnetContextTagBoolean](BACnetContextTagParseWithBufferProducer[BACnetContextTagBoolean]((uint8)(uint8(7)), (BACnetDataType)(BACnetDataType_BOOLEAN)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'quitOnFailure' field"))
 	}
 
-	// Simple Field (writeSuccessful)
-	if pullErr := readBuffer.PullContext("writeSuccessful"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for writeSuccessful")
-	}
-	_writeSuccessful, _writeSuccessfulErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(8)), BACnetDataType(BACnetDataType_BOOLEAN))
-	if _writeSuccessfulErr != nil {
-		return nil, errors.Wrap(_writeSuccessfulErr, "Error parsing 'writeSuccessful' field of BACnetActionCommand")
-	}
-	writeSuccessful := _writeSuccessful.(BACnetContextTagBoolean)
-	if closeErr := readBuffer.CloseContext("writeSuccessful"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for writeSuccessful")
+	writeSuccessful, err := ReadSimpleField[BACnetContextTagBoolean](ctx, "writeSuccessful", ReadComplex[BACnetContextTagBoolean](BACnetContextTagParseWithBufferProducer[BACnetContextTagBoolean]((uint8)(uint8(8)), (BACnetDataType)(BACnetDataType_BOOLEAN)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'writeSuccessful' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetActionCommand"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetActionList.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetActionList.go
index a045db5245..06202c1a61 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetActionList.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetActionList.go
@@ -129,6 +129,12 @@ func BACnetActionListParse(ctx context.Context, theBytes []byte) (BACnetActionLi
 	return BACnetActionListParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetActionListParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionList, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionList, error) {
+		return BACnetActionListParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetActionListParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionList, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -140,17 +146,9 @@ func BACnetActionListParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (innerOpeningTag)
-	if pullErr := readBuffer.PullContext("innerOpeningTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for innerOpeningTag")
-	}
-	_innerOpeningTag, _innerOpeningTagErr := BACnetOpeningTagParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _innerOpeningTagErr != nil {
-		return nil, errors.Wrap(_innerOpeningTagErr, "Error parsing 'innerOpeningTag' field of BACnetActionList")
-	}
-	innerOpeningTag := _innerOpeningTag.(BACnetOpeningTag)
-	if closeErr := readBuffer.CloseContext("innerOpeningTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for innerOpeningTag")
+	innerOpeningTag, err := ReadSimpleField[BACnetOpeningTag](ctx, "innerOpeningTag", ReadComplex[BACnetOpeningTag](BACnetOpeningTagParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'innerOpeningTag' field"))
 	}
 
 	action, err := ReadTerminatedArrayField[BACnetActionCommand](ctx, "action", ReadComplex[BACnetActionCommand](BACnetActionCommandParseWithBuffer, readBuffer), IsBACnetConstructedDataClosingTag(ctx, readBuffer, false, 0))
@@ -158,17 +156,9 @@ func BACnetActionListParseWithBuffer(ctx context.Context, readBuffer utils.ReadB
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'action' field"))
 	}
 
-	// Simple Field (innerClosingTag)
-	if pullErr := readBuffer.PullContext("innerClosingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for innerClosingTag")
-	}
-	_innerClosingTag, _innerClosingTagErr := BACnetClosingTagParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _innerClosingTagErr != nil {
-		return nil, errors.Wrap(_innerClosingTagErr, "Error parsing 'innerClosingTag' field of BACnetActionList")
-	}
-	innerClosingTag := _innerClosingTag.(BACnetClosingTag)
-	if closeErr := readBuffer.CloseContext("innerClosingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for innerClosingTag")
+	innerClosingTag, err := ReadSimpleField[BACnetClosingTag](ctx, "innerClosingTag", ReadComplex[BACnetClosingTag](BACnetClosingTagParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'innerClosingTag' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetActionList"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetActionTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetActionTagged.go
index 91d83385ad..8ef1a1ab3f 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetActionTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetActionTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetActionTaggedParse(ctx context.Context, theBytes []byte, tagNumber uin
 	return BACnetActionTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetActionTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetActionTagged, error) {
+		return BACnetActionTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetActionTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetActionTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetActionTaggedParseWithBuffer(ctx context.Context, readBuffer utils.Rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetActionTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAddress.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAddress.go
index b8a0f03cd6..e0e7532d85 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAddress.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAddress.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -152,6 +154,12 @@ func BACnetAddressParse(ctx context.Context, theBytes []byte) (BACnetAddress, er
 	return BACnetAddressParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAddressParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddress, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddress, error) {
+		return BACnetAddressParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAddressParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddress, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -163,17 +171,9 @@ func BACnetAddressParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (networkNumber)
-	if pullErr := readBuffer.PullContext("networkNumber"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for networkNumber")
-	}
-	_networkNumber, _networkNumberErr := BACnetApplicationTagParseWithBuffer(ctx, readBuffer)
-	if _networkNumberErr != nil {
-		return nil, errors.Wrap(_networkNumberErr, "Error parsing 'networkNumber' field of BACnetAddress")
-	}
-	networkNumber := _networkNumber.(BACnetApplicationTagUnsignedInteger)
-	if closeErr := readBuffer.CloseContext("networkNumber"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for networkNumber")
+	networkNumber, err := ReadSimpleField[BACnetApplicationTagUnsignedInteger](ctx, "networkNumber", ReadComplex[BACnetApplicationTagUnsignedInteger](BACnetApplicationTagParseWithBufferProducer[BACnetApplicationTagUnsignedInteger](), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'networkNumber' field"))
 	}
 
 	// Virtual field
@@ -186,17 +186,9 @@ func BACnetAddressParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuff
 	isLocalNetwork := bool(_isLocalNetwork)
 	_ = isLocalNetwork
 
-	// Simple Field (macAddress)
-	if pullErr := readBuffer.PullContext("macAddress"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for macAddress")
-	}
-	_macAddress, _macAddressErr := BACnetApplicationTagParseWithBuffer(ctx, readBuffer)
-	if _macAddressErr != nil {
-		return nil, errors.Wrap(_macAddressErr, "Error parsing 'macAddress' field of BACnetAddress")
-	}
-	macAddress := _macAddress.(BACnetApplicationTagOctetString)
-	if closeErr := readBuffer.CloseContext("macAddress"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for macAddress")
+	macAddress, err := ReadSimpleField[BACnetApplicationTagOctetString](ctx, "macAddress", ReadComplex[BACnetApplicationTagOctetString](BACnetApplicationTagParseWithBufferProducer[BACnetApplicationTagOctetString](), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'macAddress' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressBinding.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressBinding.go
index 5d3ac0149f..dc29f234a7 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressBinding.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressBinding.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -113,6 +115,12 @@ func BACnetAddressBindingParse(ctx context.Context, theBytes []byte) (BACnetAddr
 	return BACnetAddressBindingParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAddressBindingParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddressBinding, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddressBinding, error) {
+		return BACnetAddressBindingParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAddressBindingParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddressBinding, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -124,30 +132,14 @@ func BACnetAddressBindingParseWithBuffer(ctx context.Context, readBuffer utils.R
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (deviceIdentifier)
-	if pullErr := readBuffer.PullContext("deviceIdentifier"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for deviceIdentifier")
-	}
-	_deviceIdentifier, _deviceIdentifierErr := BACnetApplicationTagParseWithBuffer(ctx, readBuffer)
-	if _deviceIdentifierErr != nil {
-		return nil, errors.Wrap(_deviceIdentifierErr, "Error parsing 'deviceIdentifier' field of BACnetAddressBinding")
-	}
-	deviceIdentifier := _deviceIdentifier.(BACnetApplicationTagObjectIdentifier)
-	if closeErr := readBuffer.CloseContext("deviceIdentifier"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for deviceIdentifier")
+	deviceIdentifier, err := ReadSimpleField[BACnetApplicationTagObjectIdentifier](ctx, "deviceIdentifier", ReadComplex[BACnetApplicationTagObjectIdentifier](BACnetApplicationTagParseWithBufferProducer[BACnetApplicationTagObjectIdentifier](), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'deviceIdentifier' field"))
 	}
 
-	// Simple Field (deviceAddress)
-	if pullErr := readBuffer.PullContext("deviceAddress"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for deviceAddress")
-	}
-	_deviceAddress, _deviceAddressErr := BACnetAddressParseWithBuffer(ctx, readBuffer)
-	if _deviceAddressErr != nil {
-		return nil, errors.Wrap(_deviceAddressErr, "Error parsing 'deviceAddress' field of BACnetAddressBinding")
-	}
-	deviceAddress := _deviceAddress.(BACnetAddress)
-	if closeErr := readBuffer.CloseContext("deviceAddress"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for deviceAddress")
+	deviceAddress, err := ReadSimpleField[BACnetAddress](ctx, "deviceAddress", ReadComplex[BACnetAddress](BACnetAddressParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'deviceAddress' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAddressBinding"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressEnclosed.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressEnclosed.go
index 886d092fdd..67730e16bf 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressEnclosed.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAddressEnclosed.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -126,6 +128,12 @@ func BACnetAddressEnclosedParse(ctx context.Context, theBytes []byte, tagNumber
 	return BACnetAddressEnclosedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber)
 }
 
+func BACnetAddressEnclosedParseWithBufferProducer(tagNumber uint8) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddressEnclosed, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAddressEnclosed, error) {
+		return BACnetAddressEnclosedParseWithBuffer(ctx, readBuffer, tagNumber)
+	}
+}
+
 func BACnetAddressEnclosedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8) (BACnetAddressEnclosed, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -137,43 +145,19 @@ func BACnetAddressEnclosedParseWithBuffer(ctx context.Context, readBuffer utils.
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (openingTag)
-	if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for openingTag")
-	}
-	_openingTag, _openingTagErr := BACnetOpeningTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _openingTagErr != nil {
-		return nil, errors.Wrap(_openingTagErr, "Error parsing 'openingTag' field of BACnetAddressEnclosed")
-	}
-	openingTag := _openingTag.(BACnetOpeningTag)
-	if closeErr := readBuffer.CloseContext("openingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for openingTag")
+	openingTag, err := ReadSimpleField[BACnetOpeningTag](ctx, "openingTag", ReadComplex[BACnetOpeningTag](BACnetOpeningTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'openingTag' field"))
 	}
 
-	// Simple Field (address)
-	if pullErr := readBuffer.PullContext("address"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for address")
-	}
-	_address, _addressErr := BACnetAddressParseWithBuffer(ctx, readBuffer)
-	if _addressErr != nil {
-		return nil, errors.Wrap(_addressErr, "Error parsing 'address' field of BACnetAddressEnclosed")
-	}
-	address := _address.(BACnetAddress)
-	if closeErr := readBuffer.CloseContext("address"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for address")
+	address, err := ReadSimpleField[BACnetAddress](ctx, "address", ReadComplex[BACnetAddress](BACnetAddressParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'address' field"))
 	}
 
-	// Simple Field (closingTag)
-	if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for closingTag")
-	}
-	_closingTag, _closingTagErr := BACnetClosingTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _closingTagErr != nil {
-		return nil, errors.Wrap(_closingTagErr, "Error parsing 'closingTag' field of BACnetAddressEnclosed")
-	}
-	closingTag := _closingTag.(BACnetClosingTag)
-	if closeErr := readBuffer.CloseContext("closingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for closingTag")
+	closingTag, err := ReadSimpleField[BACnetClosingTag](ctx, "closingTag", ReadComplex[BACnetClosingTag](BACnetClosingTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'closingTag' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAddressEnclosed"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTag.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTag.go
index fa98e7f379..1250620a7e 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTag.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTag.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -153,6 +155,17 @@ func BACnetApplicationTagParse(ctx context.Context, theBytes []byte) (BACnetAppl
 	return BACnetApplicationTagParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetApplicationTagParseWithBufferProducer[T BACnetApplicationTag]() func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (T, error) {
+		buffer, err := BACnetApplicationTagParseWithBuffer(ctx, readBuffer)
+		if err != nil {
+			var zero T
+			return zero, err
+		}
+		return buffer.(T), err
+	}
+}
+
 func BACnetApplicationTagParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTag, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -164,17 +177,9 @@ func BACnetApplicationTagParseWithBuffer(ctx context.Context, readBuffer utils.R
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetApplicationTag")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBitString.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBitString.go
index bc316efeec..70494a6c17 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBitString.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBitString.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -128,6 +130,12 @@ func BACnetApplicationTagBitStringParse(ctx context.Context, theBytes []byte, he
 	return BACnetApplicationTagBitStringParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), header)
 }
 
+func BACnetApplicationTagBitStringParseWithBufferProducer(header BACnetTagHeader) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagBitString, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagBitString, error) {
+		return BACnetApplicationTagBitStringParseWithBuffer(ctx, readBuffer, header)
+	}
+}
+
 func BACnetApplicationTagBitStringParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, header BACnetTagHeader) (BACnetApplicationTagBitString, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -139,17 +147,9 @@ func BACnetApplicationTagBitStringParseWithBuffer(ctx context.Context, readBuffe
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadBitStringParseWithBuffer(ctx, readBuffer, uint32(header.GetActualLength()))
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagBitString")
-	}
-	payload := _payload.(BACnetTagPayloadBitString)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadBitString](ctx, "payload", ReadComplex[BACnetTagPayloadBitString](BACnetTagPayloadBitStringParseWithBufferProducer((uint32)(header.GetActualLength())), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetApplicationTagBitString"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go
index 0633ffac59..9ed52783f0 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagBoolean.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +149,12 @@ func BACnetApplicationTagBooleanParse(ctx context.Context, theBytes []byte, head
 	return BACnetApplicationTagBooleanParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), header)
 }
 
+func BACnetApplicationTagBooleanParseWithBufferProducer(header BACnetTagHeader) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagBoolean, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagBoolean, error) {
+		return BACnetApplicationTagBooleanParseWithBuffer(ctx, readBuffer, header)
+	}
+}
+
 func BACnetApplicationTagBooleanParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, header BACnetTagHeader) (BACnetApplicationTagBoolean, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +166,9 @@ func BACnetApplicationTagBooleanParseWithBuffer(ctx context.Context, readBuffer
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadBooleanParseWithBuffer(ctx, readBuffer, uint32(header.GetActualLength()))
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagBoolean")
-	}
-	payload := _payload.(BACnetTagPayloadBoolean)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadBoolean](ctx, "payload", ReadComplex[BACnetTagPayloadBoolean](BACnetTagPayloadBooleanParseWithBufferProducer((uint32)(header.GetActualLength())), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go
index e4db279d8e..95510c0ef3 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagCharacterString.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +149,12 @@ func BACnetApplicationTagCharacterStringParse(ctx context.Context, theBytes []by
 	return BACnetApplicationTagCharacterStringParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), header)
 }
 
+func BACnetApplicationTagCharacterStringParseWithBufferProducer(header BACnetTagHeader) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagCharacterString, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagCharacterString, error) {
+		return BACnetApplicationTagCharacterStringParseWithBuffer(ctx, readBuffer, header)
+	}
+}
+
 func BACnetApplicationTagCharacterStringParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, header BACnetTagHeader) (BACnetApplicationTagCharacterString, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +166,9 @@ func BACnetApplicationTagCharacterStringParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadCharacterStringParseWithBuffer(ctx, readBuffer, uint32(header.GetActualLength()))
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagCharacterString")
-	}
-	payload := _payload.(BACnetTagPayloadCharacterString)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadCharacterString](ctx, "payload", ReadComplex[BACnetTagPayloadCharacterString](BACnetTagPayloadCharacterStringParseWithBufferProducer((uint32)(header.GetActualLength())), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDate.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDate.go
index 2a265aac0f..7ef3558e2d 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDate.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDate.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -128,6 +130,12 @@ func BACnetApplicationTagDateParse(ctx context.Context, theBytes []byte) (BACnet
 	return BACnetApplicationTagDateParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetApplicationTagDateParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagDate, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagDate, error) {
+		return BACnetApplicationTagDateParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetApplicationTagDateParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagDate, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -139,17 +147,9 @@ func BACnetApplicationTagDateParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadDateParseWithBuffer(ctx, readBuffer)
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagDate")
-	}
-	payload := _payload.(BACnetTagPayloadDate)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadDate](ctx, "payload", ReadComplex[BACnetTagPayloadDate](BACnetTagPayloadDateParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetApplicationTagDate"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDouble.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDouble.go
index 76e5a2e205..48cadd2f1d 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDouble.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagDouble.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +149,12 @@ func BACnetApplicationTagDoubleParse(ctx context.Context, theBytes []byte) (BACn
 	return BACnetApplicationTagDoubleParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetApplicationTagDoubleParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagDouble, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagDouble, error) {
+		return BACnetApplicationTagDoubleParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetApplicationTagDoubleParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagDouble, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +166,9 @@ func BACnetApplicationTagDoubleParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadDoubleParseWithBuffer(ctx, readBuffer)
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagDouble")
-	}
-	payload := _payload.(BACnetTagPayloadDouble)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadDouble](ctx, "payload", ReadComplex[BACnetTagPayloadDouble](BACnetTagPayloadDoubleParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go
index ed095d82d6..35a7b262c7 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagEnumerated.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +149,12 @@ func BACnetApplicationTagEnumeratedParse(ctx context.Context, theBytes []byte, h
 	return BACnetApplicationTagEnumeratedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), header)
 }
 
+func BACnetApplicationTagEnumeratedParseWithBufferProducer(header BACnetTagHeader) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagEnumerated, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagEnumerated, error) {
+		return BACnetApplicationTagEnumeratedParseWithBuffer(ctx, readBuffer, header)
+	}
+}
+
 func BACnetApplicationTagEnumeratedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, header BACnetTagHeader) (BACnetApplicationTagEnumerated, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +166,9 @@ func BACnetApplicationTagEnumeratedParseWithBuffer(ctx context.Context, readBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadEnumeratedParseWithBuffer(ctx, readBuffer, uint32(header.GetActualLength()))
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagEnumerated")
-	}
-	payload := _payload.(BACnetTagPayloadEnumerated)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadEnumerated](ctx, "payload", ReadComplex[BACnetTagPayloadEnumerated](BACnetTagPayloadEnumeratedParseWithBufferProducer((uint32)(header.GetActualLength())), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagNull.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagNull.go
index 678d38dc81..50afdb7b5a 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagNull.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagNull.go
@@ -107,6 +107,12 @@ func BACnetApplicationTagNullParse(ctx context.Context, theBytes []byte) (BACnet
 	return BACnetApplicationTagNullParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetApplicationTagNullParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagNull, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagNull, error) {
+		return BACnetApplicationTagNullParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetApplicationTagNullParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagNull, error) {
 	positionAware := readBuffer
 	_ = positionAware
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go
index 9e0cebc756..88bbf2cc24 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagObjectIdentifier.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -157,6 +159,12 @@ func BACnetApplicationTagObjectIdentifierParse(ctx context.Context, theBytes []b
 	return BACnetApplicationTagObjectIdentifierParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetApplicationTagObjectIdentifierParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagObjectIdentifier, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagObjectIdentifier, error) {
+		return BACnetApplicationTagObjectIdentifierParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetApplicationTagObjectIdentifierParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagObjectIdentifier, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -168,17 +176,9 @@ func BACnetApplicationTagObjectIdentifierParseWithBuffer(ctx context.Context, re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadObjectIdentifierParseWithBuffer(ctx, readBuffer)
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagObjectIdentifier")
-	}
-	payload := _payload.(BACnetTagPayloadObjectIdentifier)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadObjectIdentifier](ctx, "payload", ReadComplex[BACnetTagPayloadObjectIdentifier](BACnetTagPayloadObjectIdentifierParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go
index 3d4eaf0a36..8870addd32 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagOctetString.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -128,6 +130,12 @@ func BACnetApplicationTagOctetStringParse(ctx context.Context, theBytes []byte,
 	return BACnetApplicationTagOctetStringParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), header)
 }
 
+func BACnetApplicationTagOctetStringParseWithBufferProducer(header BACnetTagHeader) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagOctetString, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagOctetString, error) {
+		return BACnetApplicationTagOctetStringParseWithBuffer(ctx, readBuffer, header)
+	}
+}
+
 func BACnetApplicationTagOctetStringParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, header BACnetTagHeader) (BACnetApplicationTagOctetString, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -139,17 +147,9 @@ func BACnetApplicationTagOctetStringParseWithBuffer(ctx context.Context, readBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadOctetStringParseWithBuffer(ctx, readBuffer, uint32(header.GetActualLength()))
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagOctetString")
-	}
-	payload := _payload.(BACnetTagPayloadOctetString)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadOctetString](ctx, "payload", ReadComplex[BACnetTagPayloadOctetString](BACnetTagPayloadOctetStringParseWithBufferProducer((uint32)(header.GetActualLength())), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetApplicationTagOctetString"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagReal.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagReal.go
index 769825f642..9de690fea6 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagReal.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagReal.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +149,12 @@ func BACnetApplicationTagRealParse(ctx context.Context, theBytes []byte) (BACnet
 	return BACnetApplicationTagRealParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetApplicationTagRealParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagReal, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagReal, error) {
+		return BACnetApplicationTagRealParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetApplicationTagRealParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagReal, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +166,9 @@ func BACnetApplicationTagRealParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadRealParseWithBuffer(ctx, readBuffer)
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagReal")
-	}
-	payload := _payload.(BACnetTagPayloadReal)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadReal](ctx, "payload", ReadComplex[BACnetTagPayloadReal](BACnetTagPayloadRealParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go
index 8b6521d0d5..fb60a86470 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagSignedInteger.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +149,12 @@ func BACnetApplicationTagSignedIntegerParse(ctx context.Context, theBytes []byte
 	return BACnetApplicationTagSignedIntegerParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), header)
 }
 
+func BACnetApplicationTagSignedIntegerParseWithBufferProducer(header BACnetTagHeader) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagSignedInteger, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagSignedInteger, error) {
+		return BACnetApplicationTagSignedIntegerParseWithBuffer(ctx, readBuffer, header)
+	}
+}
+
 func BACnetApplicationTagSignedIntegerParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, header BACnetTagHeader) (BACnetApplicationTagSignedInteger, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +166,9 @@ func BACnetApplicationTagSignedIntegerParseWithBuffer(ctx context.Context, readB
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadSignedIntegerParseWithBuffer(ctx, readBuffer, uint32(header.GetActualLength()))
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagSignedInteger")
-	}
-	payload := _payload.(BACnetTagPayloadSignedInteger)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadSignedInteger](ctx, "payload", ReadComplex[BACnetTagPayloadSignedInteger](BACnetTagPayloadSignedIntegerParseWithBufferProducer((uint32)(header.GetActualLength())), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagTime.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagTime.go
index ea424b7ac4..ee82cbe1f8 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagTime.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagTime.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -128,6 +130,12 @@ func BACnetApplicationTagTimeParse(ctx context.Context, theBytes []byte) (BACnet
 	return BACnetApplicationTagTimeParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetApplicationTagTimeParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagTime, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagTime, error) {
+		return BACnetApplicationTagTimeParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetApplicationTagTimeParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagTime, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -139,17 +147,9 @@ func BACnetApplicationTagTimeParseWithBuffer(ctx context.Context, readBuffer uti
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadTimeParseWithBuffer(ctx, readBuffer)
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagTime")
-	}
-	payload := _payload.(BACnetTagPayloadTime)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadTime](ctx, "payload", ReadComplex[BACnetTagPayloadTime](BACnetTagPayloadTimeParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetApplicationTagTime"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go
index 0683f19058..6020025113 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetApplicationTagUnsignedInteger.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +149,12 @@ func BACnetApplicationTagUnsignedIntegerParse(ctx context.Context, theBytes []by
 	return BACnetApplicationTagUnsignedIntegerParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), header)
 }
 
+func BACnetApplicationTagUnsignedIntegerParseWithBufferProducer(header BACnetTagHeader) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagUnsignedInteger, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetApplicationTagUnsignedInteger, error) {
+		return BACnetApplicationTagUnsignedIntegerParseWithBuffer(ctx, readBuffer, header)
+	}
+}
+
 func BACnetApplicationTagUnsignedIntegerParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, header BACnetTagHeader) (BACnetApplicationTagUnsignedInteger, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +166,9 @@ func BACnetApplicationTagUnsignedIntegerParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (payload)
-	if pullErr := readBuffer.PullContext("payload"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for payload")
-	}
-	_payload, _payloadErr := BACnetTagPayloadUnsignedIntegerParseWithBuffer(ctx, readBuffer, uint32(header.GetActualLength()))
-	if _payloadErr != nil {
-		return nil, errors.Wrap(_payloadErr, "Error parsing 'payload' field of BACnetApplicationTagUnsignedInteger")
-	}
-	payload := _payload.(BACnetTagPayloadUnsignedInteger)
-	if closeErr := readBuffer.CloseContext("payload"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for payload")
+	payload, err := ReadSimpleField[BACnetTagPayloadUnsignedInteger](ctx, "payload", ReadComplex[BACnetTagPayloadUnsignedInteger](BACnetTagPayloadUnsignedIntegerParseWithBufferProducer((uint32)(header.GetActualLength())), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'payload' field"))
 	}
 
 	// Virtual field
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedAccessRights.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedAccessRights.go
index 4e5cbc1180..9fc4077928 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedAccessRights.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedAccessRights.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -113,6 +115,12 @@ func BACnetAssignedAccessRightsParse(ctx context.Context, theBytes []byte) (BACn
 	return BACnetAssignedAccessRightsParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAssignedAccessRightsParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedAccessRights, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedAccessRights, error) {
+		return BACnetAssignedAccessRightsParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAssignedAccessRightsParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedAccessRights, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -124,30 +132,14 @@ func BACnetAssignedAccessRightsParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (assignedAccessRights)
-	if pullErr := readBuffer.PullContext("assignedAccessRights"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for assignedAccessRights")
-	}
-	_assignedAccessRights, _assignedAccessRightsErr := BACnetDeviceObjectReferenceEnclosedParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _assignedAccessRightsErr != nil {
-		return nil, errors.Wrap(_assignedAccessRightsErr, "Error parsing 'assignedAccessRights' field of BACnetAssignedAccessRights")
-	}
-	assignedAccessRights := _assignedAccessRights.(BACnetDeviceObjectReferenceEnclosed)
-	if closeErr := readBuffer.CloseContext("assignedAccessRights"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for assignedAccessRights")
+	assignedAccessRights, err := ReadSimpleField[BACnetDeviceObjectReferenceEnclosed](ctx, "assignedAccessRights", ReadComplex[BACnetDeviceObjectReferenceEnclosed](BACnetDeviceObjectReferenceEnclosedParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'assignedAccessRights' field"))
 	}
 
-	// Simple Field (enable)
-	if pullErr := readBuffer.PullContext("enable"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for enable")
-	}
-	_enable, _enableErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_BOOLEAN))
-	if _enableErr != nil {
-		return nil, errors.Wrap(_enableErr, "Error parsing 'enable' field of BACnetAssignedAccessRights")
-	}
-	enable := _enable.(BACnetContextTagBoolean)
-	if closeErr := readBuffer.CloseContext("enable"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for enable")
+	enable, err := ReadSimpleField[BACnetContextTagBoolean](ctx, "enable", ReadComplex[BACnetContextTagBoolean](BACnetContextTagParseWithBufferProducer[BACnetContextTagBoolean]((uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_BOOLEAN)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'enable' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAssignedAccessRights"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCalls.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCalls.go
index 9176cc59d6..43e5954dc4 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCalls.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCalls.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -103,6 +105,12 @@ func BACnetAssignedLandingCallsParse(ctx context.Context, theBytes []byte) (BACn
 	return BACnetAssignedLandingCallsParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAssignedLandingCallsParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCalls, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCalls, error) {
+		return BACnetAssignedLandingCallsParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAssignedLandingCallsParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCalls, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -114,17 +122,9 @@ func BACnetAssignedLandingCallsParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (landingCalls)
-	if pullErr := readBuffer.PullContext("landingCalls"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for landingCalls")
-	}
-	_landingCalls, _landingCallsErr := BACnetAssignedLandingCallsLandingCallsListParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _landingCallsErr != nil {
-		return nil, errors.Wrap(_landingCallsErr, "Error parsing 'landingCalls' field of BACnetAssignedLandingCalls")
-	}
-	landingCalls := _landingCalls.(BACnetAssignedLandingCallsLandingCallsList)
-	if closeErr := readBuffer.CloseContext("landingCalls"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for landingCalls")
+	landingCalls, err := ReadSimpleField[BACnetAssignedLandingCallsLandingCallsList](ctx, "landingCalls", ReadComplex[BACnetAssignedLandingCallsLandingCallsList](BACnetAssignedLandingCallsLandingCallsListParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'landingCalls' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAssignedLandingCalls"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsList.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsList.go
index aaa2f34359..ffeb44a963 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsList.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsList.go
@@ -132,6 +132,12 @@ func BACnetAssignedLandingCallsLandingCallsListParse(ctx context.Context, theByt
 	return BACnetAssignedLandingCallsLandingCallsListParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber)
 }
 
+func BACnetAssignedLandingCallsLandingCallsListParseWithBufferProducer(tagNumber uint8) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCallsLandingCallsList, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCallsLandingCallsList, error) {
+		return BACnetAssignedLandingCallsLandingCallsListParseWithBuffer(ctx, readBuffer, tagNumber)
+	}
+}
+
 func BACnetAssignedLandingCallsLandingCallsListParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8) (BACnetAssignedLandingCallsLandingCallsList, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -143,17 +149,9 @@ func BACnetAssignedLandingCallsLandingCallsListParseWithBuffer(ctx context.Conte
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (openingTag)
-	if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for openingTag")
-	}
-	_openingTag, _openingTagErr := BACnetOpeningTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _openingTagErr != nil {
-		return nil, errors.Wrap(_openingTagErr, "Error parsing 'openingTag' field of BACnetAssignedLandingCallsLandingCallsList")
-	}
-	openingTag := _openingTag.(BACnetOpeningTag)
-	if closeErr := readBuffer.CloseContext("openingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for openingTag")
+	openingTag, err := ReadSimpleField[BACnetOpeningTag](ctx, "openingTag", ReadComplex[BACnetOpeningTag](BACnetOpeningTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'openingTag' field"))
 	}
 
 	landingCalls, err := ReadTerminatedArrayField[BACnetAssignedLandingCallsLandingCallsListEntry](ctx, "landingCalls", ReadComplex[BACnetAssignedLandingCallsLandingCallsListEntry](BACnetAssignedLandingCallsLandingCallsListEntryParseWithBuffer, readBuffer), IsBACnetConstructedDataClosingTag(ctx, readBuffer, false, tagNumber))
@@ -161,17 +159,9 @@ func BACnetAssignedLandingCallsLandingCallsListParseWithBuffer(ctx context.Conte
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'landingCalls' field"))
 	}
 
-	// Simple Field (closingTag)
-	if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for closingTag")
-	}
-	_closingTag, _closingTagErr := BACnetClosingTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _closingTagErr != nil {
-		return nil, errors.Wrap(_closingTagErr, "Error parsing 'closingTag' field of BACnetAssignedLandingCallsLandingCallsList")
-	}
-	closingTag := _closingTag.(BACnetClosingTag)
-	if closeErr := readBuffer.CloseContext("closingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for closingTag")
+	closingTag, err := ReadSimpleField[BACnetClosingTag](ctx, "closingTag", ReadComplex[BACnetClosingTag](BACnetClosingTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'closingTag' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAssignedLandingCallsLandingCallsList"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsListEntry.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsListEntry.go
index 9dcaf678e6..58ed85c3fe 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsListEntry.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAssignedLandingCallsLandingCallsListEntry.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -113,6 +115,12 @@ func BACnetAssignedLandingCallsLandingCallsListEntryParse(ctx context.Context, t
 	return BACnetAssignedLandingCallsLandingCallsListEntryParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAssignedLandingCallsLandingCallsListEntryParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCallsLandingCallsListEntry, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCallsLandingCallsListEntry, error) {
+		return BACnetAssignedLandingCallsLandingCallsListEntryParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAssignedLandingCallsLandingCallsListEntryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAssignedLandingCallsLandingCallsListEntry, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -124,30 +132,14 @@ func BACnetAssignedLandingCallsLandingCallsListEntryParseWithBuffer(ctx context.
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (floorNumber)
-	if pullErr := readBuffer.PullContext("floorNumber"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for floorNumber")
-	}
-	_floorNumber, _floorNumberErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(0)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
-	if _floorNumberErr != nil {
-		return nil, errors.Wrap(_floorNumberErr, "Error parsing 'floorNumber' field of BACnetAssignedLandingCallsLandingCallsListEntry")
-	}
-	floorNumber := _floorNumber.(BACnetContextTagUnsignedInteger)
-	if closeErr := readBuffer.CloseContext("floorNumber"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for floorNumber")
+	floorNumber, err := ReadSimpleField[BACnetContextTagUnsignedInteger](ctx, "floorNumber", ReadComplex[BACnetContextTagUnsignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagUnsignedInteger]((uint8)(uint8(0)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'floorNumber' field"))
 	}
 
-	// Simple Field (direction)
-	if pullErr := readBuffer.PullContext("direction"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for direction")
-	}
-	_direction, _directionErr := BACnetLiftCarDirectionTaggedParseWithBuffer(ctx, readBuffer, uint8(uint8(1)), TagClass(TagClass_CONTEXT_SPECIFIC_TAGS))
-	if _directionErr != nil {
-		return nil, errors.Wrap(_directionErr, "Error parsing 'direction' field of BACnetAssignedLandingCallsLandingCallsListEntry")
-	}
-	direction := _direction.(BACnetLiftCarDirectionTagged)
-	if closeErr := readBuffer.CloseContext("direction"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for direction")
+	direction, err := ReadSimpleField[BACnetLiftCarDirectionTagged](ctx, "direction", ReadComplex[BACnetLiftCarDirectionTagged](BACnetLiftCarDirectionTaggedParseWithBufferProducer((uint8)(uint8(1)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'direction' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAssignedLandingCallsLandingCallsListEntry"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactor.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactor.go
index 4b51aab766..451d551158 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactor.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactor.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -123,6 +125,12 @@ func BACnetAuthenticationFactorParse(ctx context.Context, theBytes []byte) (BACn
 	return BACnetAuthenticationFactorParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAuthenticationFactorParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactor, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactor, error) {
+		return BACnetAuthenticationFactorParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAuthenticationFactorParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactor, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -134,43 +142,19 @@ func BACnetAuthenticationFactorParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (formatType)
-	if pullErr := readBuffer.PullContext("formatType"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for formatType")
-	}
-	_formatType, _formatTypeErr := BACnetAuthenticationFactorTypeTaggedParseWithBuffer(ctx, readBuffer, uint8(uint8(0)), TagClass(TagClass_CONTEXT_SPECIFIC_TAGS))
-	if _formatTypeErr != nil {
-		return nil, errors.Wrap(_formatTypeErr, "Error parsing 'formatType' field of BACnetAuthenticationFactor")
-	}
-	formatType := _formatType.(BACnetAuthenticationFactorTypeTagged)
-	if closeErr := readBuffer.CloseContext("formatType"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for formatType")
+	formatType, err := ReadSimpleField[BACnetAuthenticationFactorTypeTagged](ctx, "formatType", ReadComplex[BACnetAuthenticationFactorTypeTagged](BACnetAuthenticationFactorTypeTaggedParseWithBufferProducer((uint8)(uint8(0)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'formatType' field"))
 	}
 
-	// Simple Field (formatClass)
-	if pullErr := readBuffer.PullContext("formatClass"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for formatClass")
-	}
-	_formatClass, _formatClassErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
-	if _formatClassErr != nil {
-		return nil, errors.Wrap(_formatClassErr, "Error parsing 'formatClass' field of BACnetAuthenticationFactor")
-	}
-	formatClass := _formatClass.(BACnetContextTagUnsignedInteger)
-	if closeErr := readBuffer.CloseContext("formatClass"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for formatClass")
+	formatClass, err := ReadSimpleField[BACnetContextTagUnsignedInteger](ctx, "formatClass", ReadComplex[BACnetContextTagUnsignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagUnsignedInteger]((uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'formatClass' field"))
 	}
 
-	// Simple Field (value)
-	if pullErr := readBuffer.PullContext("value"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for value")
-	}
-	_value, _valueErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(2)), BACnetDataType(BACnetDataType_OCTET_STRING))
-	if _valueErr != nil {
-		return nil, errors.Wrap(_valueErr, "Error parsing 'value' field of BACnetAuthenticationFactor")
-	}
-	value := _value.(BACnetContextTagOctetString)
-	if closeErr := readBuffer.CloseContext("value"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for value")
+	value, err := ReadSimpleField[BACnetContextTagOctetString](ctx, "value", ReadComplex[BACnetContextTagOctetString](BACnetContextTagParseWithBufferProducer[BACnetContextTagOctetString]((uint8)(uint8(2)), (BACnetDataType)(BACnetDataType_OCTET_STRING)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'value' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAuthenticationFactor"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorEnclosed.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorEnclosed.go
index fef3f59ef8..4f708fb2df 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorEnclosed.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorEnclosed.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -126,6 +128,12 @@ func BACnetAuthenticationFactorEnclosedParse(ctx context.Context, theBytes []byt
 	return BACnetAuthenticationFactorEnclosedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber)
 }
 
+func BACnetAuthenticationFactorEnclosedParseWithBufferProducer(tagNumber uint8) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactorEnclosed, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactorEnclosed, error) {
+		return BACnetAuthenticationFactorEnclosedParseWithBuffer(ctx, readBuffer, tagNumber)
+	}
+}
+
 func BACnetAuthenticationFactorEnclosedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8) (BACnetAuthenticationFactorEnclosed, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -137,43 +145,19 @@ func BACnetAuthenticationFactorEnclosedParseWithBuffer(ctx context.Context, read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (openingTag)
-	if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for openingTag")
-	}
-	_openingTag, _openingTagErr := BACnetOpeningTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _openingTagErr != nil {
-		return nil, errors.Wrap(_openingTagErr, "Error parsing 'openingTag' field of BACnetAuthenticationFactorEnclosed")
-	}
-	openingTag := _openingTag.(BACnetOpeningTag)
-	if closeErr := readBuffer.CloseContext("openingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for openingTag")
+	openingTag, err := ReadSimpleField[BACnetOpeningTag](ctx, "openingTag", ReadComplex[BACnetOpeningTag](BACnetOpeningTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'openingTag' field"))
 	}
 
-	// Simple Field (authenticationFactor)
-	if pullErr := readBuffer.PullContext("authenticationFactor"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for authenticationFactor")
-	}
-	_authenticationFactor, _authenticationFactorErr := BACnetAuthenticationFactorParseWithBuffer(ctx, readBuffer)
-	if _authenticationFactorErr != nil {
-		return nil, errors.Wrap(_authenticationFactorErr, "Error parsing 'authenticationFactor' field of BACnetAuthenticationFactorEnclosed")
-	}
-	authenticationFactor := _authenticationFactor.(BACnetAuthenticationFactor)
-	if closeErr := readBuffer.CloseContext("authenticationFactor"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for authenticationFactor")
+	authenticationFactor, err := ReadSimpleField[BACnetAuthenticationFactor](ctx, "authenticationFactor", ReadComplex[BACnetAuthenticationFactor](BACnetAuthenticationFactorParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'authenticationFactor' field"))
 	}
 
-	// Simple Field (closingTag)
-	if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for closingTag")
-	}
-	_closingTag, _closingTagErr := BACnetClosingTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _closingTagErr != nil {
-		return nil, errors.Wrap(_closingTagErr, "Error parsing 'closingTag' field of BACnetAuthenticationFactorEnclosed")
-	}
-	closingTag := _closingTag.(BACnetClosingTag)
-	if closeErr := readBuffer.CloseContext("closingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for closingTag")
+	closingTag, err := ReadSimpleField[BACnetClosingTag](ctx, "closingTag", ReadComplex[BACnetClosingTag](BACnetClosingTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'closingTag' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAuthenticationFactorEnclosed"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorFormat.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorFormat.go
index 07a57b5100..d61cd1f8b7 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorFormat.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorFormat.go
@@ -129,6 +129,12 @@ func BACnetAuthenticationFactorFormatParse(ctx context.Context, theBytes []byte)
 	return BACnetAuthenticationFactorFormatParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAuthenticationFactorFormatParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactorFormat, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactorFormat, error) {
+		return BACnetAuthenticationFactorFormatParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAuthenticationFactorFormatParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactorFormat, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -140,26 +146,12 @@ func BACnetAuthenticationFactorFormatParseWithBuffer(ctx context.Context, readBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (formatType)
-	if pullErr := readBuffer.PullContext("formatType"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for formatType")
-	}
-	_formatType, _formatTypeErr := BACnetAuthenticationFactorTypeTaggedParseWithBuffer(ctx, readBuffer, uint8(uint8(0)), TagClass(TagClass_CONTEXT_SPECIFIC_TAGS))
-	if _formatTypeErr != nil {
-		return nil, errors.Wrap(_formatTypeErr, "Error parsing 'formatType' field of BACnetAuthenticationFactorFormat")
-	}
-	formatType := _formatType.(BACnetAuthenticationFactorTypeTagged)
-	if closeErr := readBuffer.CloseContext("formatType"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for formatType")
+	formatType, err := ReadSimpleField[BACnetAuthenticationFactorTypeTagged](ctx, "formatType", ReadComplex[BACnetAuthenticationFactorTypeTagged](BACnetAuthenticationFactorTypeTaggedParseWithBufferProducer((uint8)(uint8(0)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'formatType' field"))
 	}
 
-	_vendorId, err := ReadOptionalField[BACnetVendorIdTagged](ctx, "vendorId", ReadComplex[BACnetVendorIdTagged](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetVendorIdTagged, error) {
-		v, err := BACnetVendorIdTaggedParseWithBuffer(ctx, readBuffer, (uint8)(uint8(1)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetVendorIdTagged), nil
-	}, readBuffer), true)
+	_vendorId, err := ReadOptionalField[BACnetVendorIdTagged](ctx, "vendorId", ReadComplex[BACnetVendorIdTagged](BACnetVendorIdTaggedParseWithBufferProducer((uint8)(uint8(1)), (TagClass)(TagClass_CONTEXT_SPECIFIC_TAGS)), readBuffer), true)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'vendorId' field"))
 	}
@@ -168,13 +160,7 @@ func BACnetAuthenticationFactorFormatParseWithBuffer(ctx context.Context, readBu
 		vendorId = *_vendorId
 	}
 
-	_vendorFormat, err := ReadOptionalField[BACnetContextTagUnsignedInteger](ctx, "vendorFormat", ReadComplex[BACnetContextTagUnsignedInteger](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetContextTagUnsignedInteger, error) {
-		v, err := BACnetContextTagParseWithBuffer(ctx, readBuffer, (uint8)(uint8(2)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetContextTagUnsignedInteger), nil
-	}, readBuffer), true)
+	_vendorFormat, err := ReadOptionalField[BACnetContextTagUnsignedInteger](ctx, "vendorFormat", ReadComplex[BACnetContextTagUnsignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagUnsignedInteger]((uint8)(uint8(2)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER)), readBuffer), true)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'vendorFormat' field"))
 	}
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorTypeTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorTypeTagged.go
index db33a4b311..ac45160e1a 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorTypeTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationFactorTypeTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetAuthenticationFactorTypeTaggedParse(ctx context.Context, theBytes []b
 	return BACnetAuthenticationFactorTypeTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAuthenticationFactorTypeTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactorTypeTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationFactorTypeTagged, error) {
+		return BACnetAuthenticationFactorTypeTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAuthenticationFactorTypeTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAuthenticationFactorTypeTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetAuthenticationFactorTypeTaggedParseWithBuffer(ctx context.Context, re
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAuthenticationFactorTypeTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicy.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicy.go
index 235d68540a..773f181076 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicy.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicy.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -123,6 +125,12 @@ func BACnetAuthenticationPolicyParse(ctx context.Context, theBytes []byte) (BACn
 	return BACnetAuthenticationPolicyParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAuthenticationPolicyParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicy, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicy, error) {
+		return BACnetAuthenticationPolicyParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAuthenticationPolicyParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicy, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -134,43 +142,19 @@ func BACnetAuthenticationPolicyParseWithBuffer(ctx context.Context, readBuffer u
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (policy)
-	if pullErr := readBuffer.PullContext("policy"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for policy")
-	}
-	_policy, _policyErr := BACnetAuthenticationPolicyListParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _policyErr != nil {
-		return nil, errors.Wrap(_policyErr, "Error parsing 'policy' field of BACnetAuthenticationPolicy")
-	}
-	policy := _policy.(BACnetAuthenticationPolicyList)
-	if closeErr := readBuffer.CloseContext("policy"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for policy")
+	policy, err := ReadSimpleField[BACnetAuthenticationPolicyList](ctx, "policy", ReadComplex[BACnetAuthenticationPolicyList](BACnetAuthenticationPolicyListParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'policy' field"))
 	}
 
-	// Simple Field (orderEnforced)
-	if pullErr := readBuffer.PullContext("orderEnforced"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for orderEnforced")
-	}
-	_orderEnforced, _orderEnforcedErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_BOOLEAN))
-	if _orderEnforcedErr != nil {
-		return nil, errors.Wrap(_orderEnforcedErr, "Error parsing 'orderEnforced' field of BACnetAuthenticationPolicy")
-	}
-	orderEnforced := _orderEnforced.(BACnetContextTagBoolean)
-	if closeErr := readBuffer.CloseContext("orderEnforced"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for orderEnforced")
+	orderEnforced, err := ReadSimpleField[BACnetContextTagBoolean](ctx, "orderEnforced", ReadComplex[BACnetContextTagBoolean](BACnetContextTagParseWithBufferProducer[BACnetContextTagBoolean]((uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_BOOLEAN)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'orderEnforced' field"))
 	}
 
-	// Simple Field (timeout)
-	if pullErr := readBuffer.PullContext("timeout"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for timeout")
-	}
-	_timeout, _timeoutErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(2)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
-	if _timeoutErr != nil {
-		return nil, errors.Wrap(_timeoutErr, "Error parsing 'timeout' field of BACnetAuthenticationPolicy")
-	}
-	timeout := _timeout.(BACnetContextTagUnsignedInteger)
-	if closeErr := readBuffer.CloseContext("timeout"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for timeout")
+	timeout, err := ReadSimpleField[BACnetContextTagUnsignedInteger](ctx, "timeout", ReadComplex[BACnetContextTagUnsignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagUnsignedInteger]((uint8)(uint8(2)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'timeout' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAuthenticationPolicy"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyList.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyList.go
index 6f7b2990ca..bb60aa9c5e 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyList.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyList.go
@@ -132,6 +132,12 @@ func BACnetAuthenticationPolicyListParse(ctx context.Context, theBytes []byte, t
 	return BACnetAuthenticationPolicyListParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber)
 }
 
+func BACnetAuthenticationPolicyListParseWithBufferProducer(tagNumber uint8) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicyList, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicyList, error) {
+		return BACnetAuthenticationPolicyListParseWithBuffer(ctx, readBuffer, tagNumber)
+	}
+}
+
 func BACnetAuthenticationPolicyListParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8) (BACnetAuthenticationPolicyList, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -143,17 +149,9 @@ func BACnetAuthenticationPolicyListParseWithBuffer(ctx context.Context, readBuff
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (openingTag)
-	if pullErr := readBuffer.PullContext("openingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for openingTag")
-	}
-	_openingTag, _openingTagErr := BACnetOpeningTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _openingTagErr != nil {
-		return nil, errors.Wrap(_openingTagErr, "Error parsing 'openingTag' field of BACnetAuthenticationPolicyList")
-	}
-	openingTag := _openingTag.(BACnetOpeningTag)
-	if closeErr := readBuffer.CloseContext("openingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for openingTag")
+	openingTag, err := ReadSimpleField[BACnetOpeningTag](ctx, "openingTag", ReadComplex[BACnetOpeningTag](BACnetOpeningTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'openingTag' field"))
 	}
 
 	entries, err := ReadTerminatedArrayField[BACnetAuthenticationPolicyListEntry](ctx, "entries", ReadComplex[BACnetAuthenticationPolicyListEntry](BACnetAuthenticationPolicyListEntryParseWithBuffer, readBuffer), IsBACnetConstructedDataClosingTag(ctx, readBuffer, false, tagNumber))
@@ -161,17 +159,9 @@ func BACnetAuthenticationPolicyListParseWithBuffer(ctx context.Context, readBuff
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'entries' field"))
 	}
 
-	// Simple Field (closingTag)
-	if pullErr := readBuffer.PullContext("closingTag"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for closingTag")
-	}
-	_closingTag, _closingTagErr := BACnetClosingTagParseWithBuffer(ctx, readBuffer, uint8(tagNumber))
-	if _closingTagErr != nil {
-		return nil, errors.Wrap(_closingTagErr, "Error parsing 'closingTag' field of BACnetAuthenticationPolicyList")
-	}
-	closingTag := _closingTag.(BACnetClosingTag)
-	if closeErr := readBuffer.CloseContext("closingTag"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for closingTag")
+	closingTag, err := ReadSimpleField[BACnetClosingTag](ctx, "closingTag", ReadComplex[BACnetClosingTag](BACnetClosingTagParseWithBufferProducer((uint8)(tagNumber)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'closingTag' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAuthenticationPolicyList"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyListEntry.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyListEntry.go
index 67d8eab8a7..920031d88a 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyListEntry.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationPolicyListEntry.go
@@ -26,6 +26,8 @@ import (
 	"github.com/pkg/errors"
 	"github.com/rs/zerolog"
 
+	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -113,6 +115,12 @@ func BACnetAuthenticationPolicyListEntryParse(ctx context.Context, theBytes []by
 	return BACnetAuthenticationPolicyListEntryParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetAuthenticationPolicyListEntryParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicyListEntry, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicyListEntry, error) {
+		return BACnetAuthenticationPolicyListEntryParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetAuthenticationPolicyListEntryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationPolicyListEntry, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -124,30 +132,14 @@ func BACnetAuthenticationPolicyListEntryParseWithBuffer(ctx context.Context, rea
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (credentialDataInput)
-	if pullErr := readBuffer.PullContext("credentialDataInput"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for credentialDataInput")
-	}
-	_credentialDataInput, _credentialDataInputErr := BACnetDeviceObjectReferenceEnclosedParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _credentialDataInputErr != nil {
-		return nil, errors.Wrap(_credentialDataInputErr, "Error parsing 'credentialDataInput' field of BACnetAuthenticationPolicyListEntry")
-	}
-	credentialDataInput := _credentialDataInput.(BACnetDeviceObjectReferenceEnclosed)
-	if closeErr := readBuffer.CloseContext("credentialDataInput"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for credentialDataInput")
+	credentialDataInput, err := ReadSimpleField[BACnetDeviceObjectReferenceEnclosed](ctx, "credentialDataInput", ReadComplex[BACnetDeviceObjectReferenceEnclosed](BACnetDeviceObjectReferenceEnclosedParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'credentialDataInput' field"))
 	}
 
-	// Simple Field (index)
-	if pullErr := readBuffer.PullContext("index"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for index")
-	}
-	_index, _indexErr := BACnetContextTagParseWithBuffer(ctx, readBuffer, uint8(uint8(1)), BACnetDataType(BACnetDataType_UNSIGNED_INTEGER))
-	if _indexErr != nil {
-		return nil, errors.Wrap(_indexErr, "Error parsing 'index' field of BACnetAuthenticationPolicyListEntry")
-	}
-	index := _index.(BACnetContextTagUnsignedInteger)
-	if closeErr := readBuffer.CloseContext("index"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for index")
+	index, err := ReadSimpleField[BACnetContextTagUnsignedInteger](ctx, "index", ReadComplex[BACnetContextTagUnsignedInteger](BACnetContextTagParseWithBufferProducer[BACnetContextTagUnsignedInteger]((uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_UNSIGNED_INTEGER)), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'index' field"))
 	}
 
 	if closeErr := readBuffer.CloseContext("BACnetAuthenticationPolicyListEntry"); closeErr != nil {
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationStatusTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationStatusTagged.go
index 24156e9722..ac51ac3eb4 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationStatusTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthenticationStatusTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetAuthenticationStatusTaggedParse(ctx context.Context, theBytes []byte,
 	return BACnetAuthenticationStatusTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAuthenticationStatusTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationStatusTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthenticationStatusTagged, error) {
+		return BACnetAuthenticationStatusTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAuthenticationStatusTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAuthenticationStatusTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetAuthenticationStatusTaggedParseWithBuffer(ctx context.Context, readBu
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAuthenticationStatusTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationExemptionTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationExemptionTagged.go
index 7417d57ec5..183b0eb0b7 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationExemptionTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationExemptionTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAuthorizationExemptionTaggedParse(ctx context.Context, theBytes []byt
 	return BACnetAuthorizationExemptionTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAuthorizationExemptionTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthorizationExemptionTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthorizationExemptionTagged, error) {
+		return BACnetAuthorizationExemptionTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAuthorizationExemptionTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAuthorizationExemptionTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAuthorizationExemptionTaggedParseWithBuffer(ctx context.Context, read
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAuthorizationExemptionTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationModeTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationModeTagged.go
index 32786deb32..cbe62beded 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationModeTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetAuthorizationModeTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -147,6 +148,12 @@ func BACnetAuthorizationModeTaggedParse(ctx context.Context, theBytes []byte, ta
 	return BACnetAuthorizationModeTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetAuthorizationModeTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthorizationModeTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetAuthorizationModeTagged, error) {
+		return BACnetAuthorizationModeTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetAuthorizationModeTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetAuthorizationModeTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -158,17 +165,9 @@ func BACnetAuthorizationModeTaggedParseWithBuffer(ctx context.Context, readBuffe
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetAuthorizationModeTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'header' field"))
 	}
 
 	// Validation
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetBDTEntry.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetBDTEntry.go
index dab902e373..e0383a5bdf 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetBDTEntry.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetBDTEntry.go
@@ -117,6 +117,12 @@ func BACnetBDTEntryParse(ctx context.Context, theBytes []byte) (BACnetBDTEntry,
 	return BACnetBDTEntryParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes))
 }
 
+func BACnetBDTEntryParseWithBufferProducer() func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetBDTEntry, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetBDTEntry, error) {
+		return BACnetBDTEntryParseWithBuffer(ctx, readBuffer)
+	}
+}
+
 func BACnetBDTEntryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetBDTEntry, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -128,26 +134,12 @@ func BACnetBDTEntryParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuf
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (bbmdAddress)
-	if pullErr := readBuffer.PullContext("bbmdAddress"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for bbmdAddress")
-	}
-	_bbmdAddress, _bbmdAddressErr := BACnetHostNPortEnclosedParseWithBuffer(ctx, readBuffer, uint8(uint8(0)))
-	if _bbmdAddressErr != nil {
-		return nil, errors.Wrap(_bbmdAddressErr, "Error parsing 'bbmdAddress' field of BACnetBDTEntry")
-	}
-	bbmdAddress := _bbmdAddress.(BACnetHostNPortEnclosed)
-	if closeErr := readBuffer.CloseContext("bbmdAddress"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for bbmdAddress")
+	bbmdAddress, err := ReadSimpleField[BACnetHostNPortEnclosed](ctx, "bbmdAddress", ReadComplex[BACnetHostNPortEnclosed](BACnetHostNPortEnclosedParseWithBufferProducer((uint8)(uint8(0))), readBuffer))
+	if err != nil {
+		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'bbmdAddress' field"))
 	}
 
-	_broadcastMask, err := ReadOptionalField[BACnetContextTagOctetString](ctx, "broadcastMask", ReadComplex[BACnetContextTagOctetString](func(ctx context.Context, buffer utils.ReadBuffer) (BACnetContextTagOctetString, error) {
-		v, err := BACnetContextTagParseWithBuffer(ctx, readBuffer, (uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_OCTET_STRING))
-		if err != nil {
-			return nil, err
-		}
-		return v.(BACnetContextTagOctetString), nil
-	}, readBuffer), true)
+	_broadcastMask, err := ReadOptionalField[BACnetContextTagOctetString](ctx, "broadcastMask", ReadComplex[BACnetContextTagOctetString](BACnetContextTagParseWithBufferProducer[BACnetContextTagOctetString]((uint8)(uint8(1)), (BACnetDataType)(BACnetDataType_OCTET_STRING)), readBuffer), true)
 	if err != nil {
 		return nil, errors.Wrap(err, fmt.Sprintf("Error parsing 'broadcastMask' field"))
 	}
diff --git a/plc4go/protocols/bacnetip/readwrite/model/BACnetBackupStateTagged.go b/plc4go/protocols/bacnetip/readwrite/model/BACnetBackupStateTagged.go
index ed604d87ee..985e3d97d2 100644
--- a/plc4go/protocols/bacnetip/readwrite/model/BACnetBackupStateTagged.go
+++ b/plc4go/protocols/bacnetip/readwrite/model/BACnetBackupStateTagged.go
@@ -27,6 +27,7 @@ import (
 	"github.com/rs/zerolog"
 
 	. "github.com/apache/plc4x/plc4go/spi/codegen/fields"
+	. "github.com/apache/plc4x/plc4go/spi/codegen/io"
 	"github.com/apache/plc4x/plc4go/spi/utils"
 )
 
@@ -118,6 +119,12 @@ func BACnetBackupStateTaggedParse(ctx context.Context, theBytes []byte, tagNumbe
 	return BACnetBackupStateTaggedParseWithBuffer(ctx, utils.NewReadBufferByteBased(theBytes), tagNumber, tagClass)
 }
 
+func BACnetBackupStateTaggedParseWithBufferProducer(tagNumber uint8, tagClass TagClass) func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetBackupStateTagged, error) {
+	return func(ctx context.Context, readBuffer utils.ReadBuffer) (BACnetBackupStateTagged, error) {
+		return BACnetBackupStateTaggedParseWithBuffer(ctx, readBuffer, tagNumber, tagClass)
+	}
+}
+
 func BACnetBackupStateTaggedParseWithBuffer(ctx context.Context, readBuffer utils.ReadBuffer, tagNumber uint8, tagClass TagClass) (BACnetBackupStateTagged, error) {
 	positionAware := readBuffer
 	_ = positionAware
@@ -129,17 +136,9 @@ func BACnetBackupStateTaggedParseWithBuffer(ctx context.Context, readBuffer util
 	currentPos := positionAware.GetPos()
 	_ = currentPos
 
-	// Simple Field (header)
-	if pullErr := readBuffer.PullContext("header"); pullErr != nil {
-		return nil, errors.Wrap(pullErr, "Error pulling for header")
-	}
-	_header, _headerErr := BACnetTagHeaderParseWithBuffer(ctx, readBuffer)
-	if _headerErr != nil {
-		return nil, errors.Wrap(_headerErr, "Error parsing 'header' field of BACnetBackupStateTagged")
-	}
-	header := _header.(BACnetTagHeader)
-	if closeErr := readBuffer.CloseContext("header"); closeErr != nil {
-		return nil, errors.Wrap(closeErr, "Error closing for header")
+	header, err := ReadSimpleField[BACnetTagHeader](ctx, "header", ReadComplex[BACnetTagHeader](BACnetTagHeaderParseWithBuffer, readBuffer))
... 118294 lines suppressed ...