You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2023/01/26 17:49:18 UTC

[plc4x] branch develop updated: feat(code-gen): typeSwitches in typeSwitches now allowed.

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

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


The following commit(s) were added to refs/heads/develop by this push:
     new 514391705c feat(code-gen): typeSwitches in typeSwitches now allowed.
514391705c is described below

commit 514391705cb4fa697df550dcd9fccd0447c97205
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Thu Jan 26 18:48:56 2023 +0100

    feat(code-gen): typeSwitches in typeSwitches now allowed.
---
 .../BaseFreemarkerLanguageTemplateHelper.java      |   12 +-
 .../templates/java/complex-type-template.java.ftlh |   66 +-
 code-generation/pom.xml                            |    9 +-
 .../DefaultDiscriminatedComplexTypeDefinition.java |    4 +-
 .../mspec/parser/MessageFormatListener.java        |   70 +-
 .../src/main/resources/protocols/test/test.mspec   |   65 +
 code-generation/{ => tests}/pom.xml                |   17 +-
 code-generation/tests/protocol-test-java/pom.xml   |  158 ++
 .../java/test/readwrite/AbstractTypeTest.java      |   79 +-
 .../test/readwrite/AbstractTypeTestSubType.java    |  261 +++
 .../plc4x/java/test/readwrite/ArrayTypeTest.java   |  248 +++
 .../java/test/readwrite/CheckSumTypeTest.java      |   83 +-
 .../test/readwrite/ComplexOfComplexUsageA.java     |   75 +-
 .../test/readwrite/ComplexOfComplexUsageB.java     |  104 +-
 .../test/readwrite/ComplexOfComplexUsageC.java     |   79 +-
 .../test/readwrite/ComplexOfComplexUsageD.java     |   71 +-
 .../plc4x/java/test/readwrite/ConstTypeTest.java   |  196 ++
 .../plc4x/java/test/readwrite/DataIOType.java      |  110 ++
 .../java/test/readwrite/EnumDiscriminatedType.java |   76 +-
 .../test/readwrite/EnumDiscriminatedTypeA.java     |   68 +-
 .../test/readwrite/EnumDiscriminatedTypeB.java     |   68 +-
 .../test/readwrite/EnumDiscriminatedTypeC.java     |   68 +-
 .../readwrite/EnumDiscriminatedTypeMultiple.java   |  116 +-
 .../readwrite/EnumDiscriminatedTypeMultipleA.java  |   83 +-
 .../readwrite/EnumDiscriminatedTypeMultipleB.java  |   83 +-
 .../readwrite/EnumDiscriminatedTypeMultipleC.java  |   83 +-
 .../readwrite/EnumDiscriminatedTypeParameter.java  |   77 +-
 .../readwrite/EnumDiscriminatedTypeParameterA.java |   80 +-
 .../readwrite/EnumDiscriminatedTypeParameterB.java |   80 +-
 .../readwrite/EnumDiscriminatedTypeParameterC.java |   71 +-
 .../EnumDiscriminatedTypeParameterMultiple.java    |  110 +-
 .../EnumDiscriminatedTypeParameterMultipleA.java   |   90 +-
 .../EnumDiscriminatedTypeParameterMultipleB.java   |   85 +-
 .../EnumDiscriminatedTypeParameterMultipleC.java   |   85 +-
 .../apache/plc4x/java/test/readwrite/EnumType.java |   57 +
 .../plc4x/java/test/readwrite/EnumTypeBit.java     |   55 +
 .../plc4x/java/test/readwrite/EnumTypeInt.java     |   56 +
 .../java/test/readwrite/EnumTypeParameters.java    |  188 ++
 .../plc4x/java/test/readwrite/EnumTypeTest.java    |   90 +-
 .../plc4x/java/test/readwrite/FieldTypeTest.java   |  325 ++++
 .../readwrite/FieldTypeTestWithUnknownField.java   |  225 +++
 .../readwrite/ImplicitPascalStringTypeTest.java    |   80 +-
 .../java/test/readwrite/ImplicitTypeTest.java      |  187 ++
 .../plc4x/java/test/readwrite/IntTypeTest.java     |  217 +++
 .../plc4x/java/test/readwrite/LengthLoopTest.java  |   87 +-
 .../java/test/readwrite/OptionalTypeTest.java      |   92 +-
 .../plc4x/java/test/readwrite/PaddingTypeTest.java |   87 +-
 .../java/test/readwrite/PascalStringTypeTest.java  |   85 +-
 .../java/test/readwrite/ReservedTypeTest.java      |   73 +-
 .../java/test/readwrite/ReservedTypeTestChild.java |   61 +-
 .../test/readwrite/ReservedTypeTestParent.java     |   86 +-
 .../java/test/readwrite/SimpleBitTypeTest.java     |   71 +-
 .../test/readwrite/SimpleDiscriminatedType.java    |   62 +-
 .../test/readwrite/SimpleDiscriminatedTypeA.java   |   71 +-
 .../test/readwrite/SimpleDiscriminatedTypeB.java   |   71 +-
 .../test/readwrite/SimpleDiscriminatedTypeC.java   |   70 +-
 .../plc4x/java/test/readwrite/SimpleTypeTest.java  |  234 +++
 .../TypeSwitchInTypeSwitchParentType.java          |   93 +-
 .../TypeSwitchInTypeSwitchParentTypeChild0.java    |  192 ++
 ...eSwitchInTypeSwitchParentTypeChild0Infant0.java |  194 ++
 ...SwitchParentTypeChild0Infant0InfantsChild0.java |  160 ++
 ...SwitchParentTypeChild0Infant0InfantsChild1.java |  160 ++
 ...eSwitchInTypeSwitchParentTypeChild0Infant1.java |  151 ++
 ...eSwitchInTypeSwitchParentTypeChild0Infant2.java |  151 ++
 .../TypeSwitchInTypeSwitchParentTypeChild1.java    |  192 ++
 ...eSwitchInTypeSwitchParentTypeChild1Infant3.java |   88 +-
 ...eSwitchInTypeSwitchParentTypeChild1Infant4.java |   91 +-
 ...eSwitchInTypeSwitchParentTypeChild1Infant5.java |   88 +-
 .../TypeSwitchInTypeSwitchParentTypeChild2.java    |  198 +++
 ...eSwitchInTypeSwitchParentTypeChild2Infant6.java |  151 ++
 ...eSwitchInTypeSwitchParentTypeChild2Infant7.java |   91 +-
 ...eSwitchInTypeSwitchParentTypeChild2Infant8.java |  151 ++
 .../plc4x/java/test/readwrite/UIntTypeTest.java    |  219 +++
 .../java/test/readwrite/VirtualFieldTest.java      |  194 ++
 .../java/test/readwrite/utils/StaticHelper.java    |   90 +
 .../CIPEncapsulationConnectionRequest.java         |   10 +-
 .../CIPEncapsulationConnectionResponse.java        |   10 +-
 .../abeth/readwrite/CIPEncapsulationPacket.java    |   14 +-
 .../readwrite/CIPEncapsulationReadRequest.java     |   10 +-
 .../readwrite/CIPEncapsulationReadResponse.java    |    8 +-
 .../abeth/readwrite/DF1CommandRequestMessage.java  |    8 +-
 ...ndResponseMessageProtectedTypedLogicalRead.java |    8 +-
 .../java/abeth/readwrite/DF1RequestCommand.java    |    4 +-
 .../java/abeth/readwrite/DF1RequestMessage.java    |    4 +-
 .../DF1RequestProtectedTypedLogicalRead.java       |    8 +-
 .../java/abeth/readwrite/DF1ResponseMessage.java   |    4 +-
 plc4j/drivers/ads/pom.xml                          |    1 +
 .../readwrite/AdsAddDeviceNotificationRequest.java |    9 +-
 .../AdsAddDeviceNotificationResponse.java          |    8 +-
 .../AdsDeleteDeviceNotificationRequest.java        |    8 +-
 .../AdsDeleteDeviceNotificationResponse.java       |    8 +-
 .../readwrite/AdsDeviceNotificationRequest.java    |    9 +-
 .../readwrite/AdsDeviceNotificationResponse.java   |    9 +-
 .../java/ads/readwrite/AdsInvalidRequest.java      |    8 +-
 .../java/ads/readwrite/AdsInvalidResponse.java     |    8 +-
 .../java/ads/readwrite/AdsMultiRequestItem.java    |   12 +-
 .../ads/readwrite/AdsMultiRequestItemRead.java     |    8 +-
 .../readwrite/AdsMultiRequestItemReadWrite.java    |    8 +-
 .../ads/readwrite/AdsMultiRequestItemWrite.java    |    9 +-
 .../ads/readwrite/AdsReadDeviceInfoRequest.java    |    8 +-
 .../ads/readwrite/AdsReadDeviceInfoResponse.java   |    8 +-
 .../plc4x/java/ads/readwrite/AdsReadRequest.java   |    8 +-
 .../plc4x/java/ads/readwrite/AdsReadResponse.java  |    8 +-
 .../java/ads/readwrite/AdsReadStateRequest.java    |    8 +-
 .../java/ads/readwrite/AdsReadStateResponse.java   |    8 +-
 .../java/ads/readwrite/AdsReadWriteRequest.java    |    8 +-
 .../java/ads/readwrite/AdsReadWriteResponse.java   |    8 +-
 .../java/ads/readwrite/AdsWriteControlRequest.java |    8 +-
 .../ads/readwrite/AdsWriteControlResponse.java     |    8 +-
 .../plc4x/java/ads/readwrite/AdsWriteRequest.java  |    8 +-
 .../plc4x/java/ads/readwrite/AdsWriteResponse.java |    8 +-
 .../apache/plc4x/java/ads/readwrite/AmsPacket.java |   44 +-
 .../plc4x/java/ads/readwrite/ErrorResponse.java    |    8 +-
 .../apache/plc4x/java/bacnetip/readwrite/APDU.java |   20 +-
 .../plc4x/java/bacnetip/readwrite/APDUAbort.java   |    9 +-
 .../java/bacnetip/readwrite/APDUComplexAck.java    |    8 +-
 .../bacnetip/readwrite/APDUConfirmedRequest.java   |   10 +-
 .../plc4x/java/bacnetip/readwrite/APDUError.java   |    9 +-
 .../plc4x/java/bacnetip/readwrite/APDUReject.java  |    8 +-
 .../java/bacnetip/readwrite/APDUSegmentAck.java    |    8 +-
 .../java/bacnetip/readwrite/APDUSimpleAck.java     |    9 +-
 .../bacnetip/readwrite/APDUUnconfirmedRequest.java |   10 +-
 .../plc4x/java/bacnetip/readwrite/APDUUnknown.java |    8 +-
 .../bacnetip/readwrite/BACnetApplicationTag.java   |   40 +-
 .../readwrite/BACnetApplicationTagBitString.java   |    8 +-
 .../readwrite/BACnetApplicationTagBoolean.java     |    8 +-
 .../BACnetApplicationTagCharacterString.java       |    8 +-
 .../readwrite/BACnetApplicationTagDate.java        |   10 +-
 .../readwrite/BACnetApplicationTagDouble.java      |   10 +-
 .../readwrite/BACnetApplicationTagEnumerated.java  |    8 +-
 .../readwrite/BACnetApplicationTagNull.java        |   10 +-
 .../BACnetApplicationTagObjectIdentifier.java      |    9 +-
 .../readwrite/BACnetApplicationTagOctetString.java |    8 +-
 .../readwrite/BACnetApplicationTagReal.java        |   10 +-
 .../BACnetApplicationTagSignedInteger.java         |    8 +-
 .../readwrite/BACnetApplicationTagTime.java        |   10 +-
 .../BACnetApplicationTagUnsignedInteger.java       |    8 +-
 .../bacnetip/readwrite/BACnetCalendarEntry.java    |    8 +-
 .../readwrite/BACnetCalendarEntryDate.java         |   10 +-
 .../readwrite/BACnetCalendarEntryDateRange.java    |   10 +-
 .../readwrite/BACnetCalendarEntryWeekNDay.java     |   10 +-
 .../bacnetip/readwrite/BACnetChannelValue.java     |   30 +-
 .../readwrite/BACnetChannelValueBitString.java     |   10 +-
 .../readwrite/BACnetChannelValueBoolean.java       |   10 +-
 .../BACnetChannelValueCharacterString.java         |   10 +-
 .../bacnetip/readwrite/BACnetChannelValueDate.java |   10 +-
 .../readwrite/BACnetChannelValueDouble.java        |   10 +-
 .../readwrite/BACnetChannelValueEnumerated.java    |   10 +-
 .../readwrite/BACnetChannelValueInteger.java       |   10 +-
 .../BACnetChannelValueLightingCommand.java         |   10 +-
 .../bacnetip/readwrite/BACnetChannelValueNull.java |   10 +-
 .../BACnetChannelValueObjectidentifier.java        |   10 +-
 .../readwrite/BACnetChannelValueOctetString.java   |   11 +-
 .../bacnetip/readwrite/BACnetChannelValueReal.java |   10 +-
 .../bacnetip/readwrite/BACnetChannelValueTime.java |   10 +-
 .../readwrite/BACnetChannelValueUnsigned.java      |   11 +-
 .../java/bacnetip/readwrite/BACnetClientCOV.java   |    6 +-
 .../bacnetip/readwrite/BACnetClientCOVNone.java    |    9 +-
 .../bacnetip/readwrite/BACnetClientCOVObject.java  |    8 +-
 .../readwrite/BACnetConfirmedServiceRequest.java   |  113 +-
 ...netConfirmedServiceRequestAcknowledgeAlarm.java |   11 +-
 ...ACnetConfirmedServiceRequestAddListElement.java |   11 +-
 ...ACnetConfirmedServiceRequestAtomicReadFile.java |   11 +-
 ...onfirmedServiceRequestAtomicReadFileRecord.java |   11 +-
 ...onfirmedServiceRequestAtomicReadFileStream.java |   11 +-
 ...ServiceRequestAtomicReadFileStreamOrRecord.java |   12 +-
 ...CnetConfirmedServiceRequestAtomicWriteFile.java |   11 +-
 .../BACnetConfirmedServiceRequestAuthenticate.java |   13 +-
 ...rmedServiceRequestConfirmedCOVNotification.java |   11 +-
 ...iceRequestConfirmedCOVNotificationMultiple.java |   11 +-
 ...edServiceRequestConfirmedEventNotification.java |   11 +-
 ...rmedServiceRequestConfirmedPrivateTransfer.java |   11 +-
 ...onfirmedServiceRequestConfirmedTextMessage.java |   11 +-
 ...iceRequestConfirmedTextMessageMessageClass.java |   12 +-
 ...tConfirmedTextMessageMessageClassCharacter.java |   12 +-
 ...estConfirmedTextMessageMessageClassNumeric.java |   12 +-
 .../BACnetConfirmedServiceRequestCreateObject.java |   11 +-
 .../BACnetConfirmedServiceRequestDeleteObject.java |   11 +-
 ...edServiceRequestDeviceCommunicationControl.java |   11 +-
 ...onfirmedServiceRequestGetEnrollmentSummary.java |   11 +-
 ...ConfirmedServiceRequestGetEventInformation.java |   11 +-
 ...ConfirmedServiceRequestLifeSafetyOperation.java |   11 +-
 .../BACnetConfirmedServiceRequestReadProperty.java |   11 +-
 ...irmedServiceRequestReadPropertyConditional.java |   13 +-
 ...onfirmedServiceRequestReadPropertyMultiple.java |   13 +-
 .../BACnetConfirmedServiceRequestReadRange.java    |   11 +-
 ...ACnetConfirmedServiceRequestReadRangeRange.java |   13 +-
 ...rmedServiceRequestReadRangeRangeByPosition.java |   12 +-
 ...rviceRequestReadRangeRangeBySequenceNumber.java |   11 +-
 ...onfirmedServiceRequestReadRangeRangeByTime.java |   11 +-
 ...tConfirmedServiceRequestReinitializeDevice.java |   11 +-
 ...etConfirmedServiceRequestRemoveListElement.java |   11 +-
 .../BACnetConfirmedServiceRequestRequestKey.java   |   13 +-
 .../BACnetConfirmedServiceRequestSubscribeCOV.java |   11 +-
 ...onfirmedServiceRequestSubscribeCOVProperty.java |   11 +-
 ...ServiceRequestSubscribeCOVPropertyMultiple.java |   11 +-
 .../BACnetConfirmedServiceRequestUnknown.java      |   13 +-
 .../BACnetConfirmedServiceRequestVTClose.java      |   13 +-
 .../BACnetConfirmedServiceRequestVTData.java       |   11 +-
 .../BACnetConfirmedServiceRequestVTOpen.java       |   11 +-
 ...BACnetConfirmedServiceRequestWriteProperty.java |   11 +-
 ...nfirmedServiceRequestWritePropertyMultiple.java |   13 +-
 .../bacnetip/readwrite/BACnetConstructedData.java  | 1879 ++++++++++----------
 .../readwrite/BACnetConstructedDataAPDULength.java |    9 +-
 .../BACnetConstructedDataAPDUSegmentTimeout.java   |    8 +-
 .../BACnetConstructedDataAPDUTimeout.java          |    9 +-
 .../BACnetConstructedDataAbsenteeLimit.java        |    8 +-
 .../BACnetConstructedDataAcceptedModes.java        |    8 +-
 .../BACnetConstructedDataAccessAlarmEvents.java    |    8 +-
 .../BACnetConstructedDataAccessCredentialAll.java  |    8 +-
 ...BACnetConstructedDataAccessDoorAlarmValues.java |    8 +-
 .../BACnetConstructedDataAccessDoorAll.java        |    8 +-
 ...BACnetConstructedDataAccessDoorFaultValues.java |    8 +-
 ...ACnetConstructedDataAccessDoorPresentValue.java |    8 +-
 ...ConstructedDataAccessDoorRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataAccessDoors.java          |    8 +-
 .../BACnetConstructedDataAccessEvent.java          |    9 +-
 ...tructedDataAccessEventAuthenticationFactor.java |    8 +-
 ...BACnetConstructedDataAccessEventCredential.java |    8 +-
 .../BACnetConstructedDataAccessEventTag.java       |    8 +-
 .../BACnetConstructedDataAccessEventTime.java      |    8 +-
 .../BACnetConstructedDataAccessPointAll.java       |    8 +-
 .../BACnetConstructedDataAccessRightsAll.java      |    8 +-
 ...CnetConstructedDataAccessTransactionEvents.java |    8 +-
 .../BACnetConstructedDataAccessUserAll.java        |    8 +-
 ...BACnetConstructedDataAccessZoneAdjustValue.java |    8 +-
 ...BACnetConstructedDataAccessZoneAlarmValues.java |    8 +-
 .../BACnetConstructedDataAccessZoneAll.java        |    8 +-
 .../BACnetConstructedDataAccompaniment.java        |    8 +-
 .../BACnetConstructedDataAccompanimentTime.java    |    8 +-
 .../BACnetConstructedDataAccumulatorAll.java       |    8 +-
 ...etConstructedDataAccumulatorFaultHighLimit.java |    8 +-
 ...netConstructedDataAccumulatorFaultLowLimit.java |    8 +-
 .../BACnetConstructedDataAccumulatorHighLimit.java |    8 +-
 .../BACnetConstructedDataAccumulatorLowLimit.java  |    8 +-
 ...CnetConstructedDataAccumulatorMaxPresValue.java |    8 +-
 ...CnetConstructedDataAccumulatorMinPresValue.java |    8 +-
 .../BACnetConstructedDataAckRequired.java          |    9 +-
 .../BACnetConstructedDataAckedTransitions.java     |    8 +-
 .../readwrite/BACnetConstructedDataAction.java     |    8 +-
 .../readwrite/BACnetConstructedDataActionText.java |    8 +-
 .../BACnetConstructedDataActivationTime.java       |    8 +-
 ...tConstructedDataActiveAuthenticationPolicy.java |    8 +-
 ...structedDataActiveCOVMultipleSubscriptions.java |    8 +-
 ...ACnetConstructedDataActiveCOVSubscriptions.java |    8 +-
 .../readwrite/BACnetConstructedDataActiveText.java |    9 +-
 .../BACnetConstructedDataActiveVTSessions.java     |    8 +-
 .../BACnetConstructedDataActualShedLevel.java      |    8 +-
 .../BACnetConstructedDataAdjustValue.java          |    9 +-
 .../readwrite/BACnetConstructedDataAlarmValue.java |    8 +-
 .../BACnetConstructedDataAlarmValues.java          |    8 +-
 .../BACnetConstructedDataAlertEnrollmentAll.java   |    8 +-
 ...ConstructedDataAlertEnrollmentPresentValue.java |    8 +-
 .../BACnetConstructedDataAlignIntervals.java       |    8 +-
 .../BACnetConstructedDataAllWritesSuccessful.java  |    8 +-
 ...ACnetConstructedDataAllowGroupDelayInhibit.java |    8 +-
 .../BACnetConstructedDataAnalogInputAll.java       |    8 +-
 ...etConstructedDataAnalogInputFaultHighLimit.java |    8 +-
 ...netConstructedDataAnalogInputFaultLowLimit.java |    8 +-
 ...etConstructedDataAnalogInputInterfaceValue.java |    8 +-
 ...CnetConstructedDataAnalogInputMaxPresValue.java |    8 +-
 ...CnetConstructedDataAnalogInputPresentValue.java |    8 +-
 .../BACnetConstructedDataAnalogOutputAll.java      |    8 +-
 ...tConstructedDataAnalogOutputInterfaceValue.java |    8 +-
 ...netConstructedDataAnalogOutputMaxPresValue.java |    8 +-
 ...netConstructedDataAnalogOutputPresentValue.java |    8 +-
 ...nstructedDataAnalogOutputRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataAnalogValueAll.java       |    8 +-
 ...etConstructedDataAnalogValueFaultHighLimit.java |    8 +-
 ...netConstructedDataAnalogValueFaultLowLimit.java |    8 +-
 ...CnetConstructedDataAnalogValueMaxPresValue.java |    8 +-
 ...CnetConstructedDataAnalogValuePresentValue.java |    8 +-
 ...onstructedDataAnalogValueRelinquishDefault.java |    8 +-
 ...tConstructedDataApplicationSoftwareVersion.java |    8 +-
 .../readwrite/BACnetConstructedDataArchive.java    |    8 +-
 .../BACnetConstructedDataAssignedAccessRights.java |    8 +-
 .../BACnetConstructedDataAssignedLandingCalls.java |    8 +-
 .../BACnetConstructedDataAttemptedSamples.java     |    8 +-
 ...BACnetConstructedDataAuthenticationFactors.java |    8 +-
 ...netConstructedDataAuthenticationPolicyList.java |    8 +-
 ...etConstructedDataAuthenticationPolicyNames.java |    8 +-
 .../BACnetConstructedDataAuthenticationStatus.java |    8 +-
 ...CnetConstructedDataAuthorizationExemptions.java |    8 +-
 .../BACnetConstructedDataAuthorizationMode.java    |    8 +-
 .../BACnetConstructedDataAutoSlaveDiscovery.java   |    8 +-
 .../BACnetConstructedDataAverageValue.java         |    8 +-
 .../BACnetConstructedDataAveragingAll.java         |    8 +-
 ...BACnetConstructedDataBACnetIPGlobalAddress.java |    8 +-
 .../BACnetConstructedDataBACnetIPMode.java         |    8 +-
 ...netConstructedDataBACnetIPMulticastAddress.java |    8 +-
 .../BACnetConstructedDataBACnetIPNATTraversal.java |    8 +-
 .../BACnetConstructedDataBACnetIPUDPPort.java      |    8 +-
 .../BACnetConstructedDataBACnetIPv6Mode.java       |    8 +-
 ...tConstructedDataBACnetIPv6MulticastAddress.java |    8 +-
 .../BACnetConstructedDataBACnetIPv6UDPPort.java    |    8 +-
 ...etConstructedDataBBMDAcceptFDRegistrations.java |    8 +-
 ...structedDataBBMDBroadcastDistributionTable.java |    8 +-
 ...ACnetConstructedDataBBMDForeignDeviceTable.java |    8 +-
 ...BACnetConstructedDataBackupAndRestoreState.java |    8 +-
 .../BACnetConstructedDataBackupFailureTimeout.java |    8 +-
 ...BACnetConstructedDataBackupPreparationTime.java |    8 +-
 ...netConstructedDataBaseDeviceSecurityPolicy.java |    8 +-
 .../readwrite/BACnetConstructedDataBelongsTo.java  |    8 +-
 .../readwrite/BACnetConstructedDataBias.java       |    8 +-
 .../BACnetConstructedDataBinaryInputAll.java       |    8 +-
 ...etConstructedDataBinaryInputInterfaceValue.java |    8 +-
 ...CnetConstructedDataBinaryInputPresentValue.java |    8 +-
 ...CnetConstructedDataBinaryLightingOutputAll.java |    9 +-
 ...uctedDataBinaryLightingOutputFeedbackValue.java |    8 +-
 ...ructedDataBinaryLightingOutputPresentValue.java |    8 +-
 ...dDataBinaryLightingOutputRelinquishDefault.java |   21 +-
 .../BACnetConstructedDataBinaryOutputAll.java      |    8 +-
 ...etConstructedDataBinaryOutputFeedbackValue.java |    8 +-
 ...tConstructedDataBinaryOutputInterfaceValue.java |    8 +-
 ...netConstructedDataBinaryOutputPresentValue.java |    8 +-
 ...nstructedDataBinaryOutputRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataBinaryValueAll.java       |    8 +-
 ...CnetConstructedDataBinaryValuePresentValue.java |    8 +-
 ...onstructedDataBinaryValueRelinquishDefault.java |    8 +-
 .../readwrite/BACnetConstructedDataBitMask.java    |    8 +-
 ...etConstructedDataBitStringValueAlarmValues.java |    8 +-
 ...tConstructedDataBitStringValuePresentValue.java |    8 +-
 ...tructedDataBitStringValueRelinquishDefault.java |    8 +-
 .../readwrite/BACnetConstructedDataBitText.java    |    8 +-
 .../BACnetConstructedDataBitstringValueAll.java    |    8 +-
 .../BACnetConstructedDataBlinkWarnEnable.java      |    8 +-
 .../readwrite/BACnetConstructedDataBufferSize.java |    9 +-
 .../BACnetConstructedDataCOVIncrement.java         |    8 +-
 .../readwrite/BACnetConstructedDataCOVPeriod.java  |    8 +-
 ...etConstructedDataCOVResubscriptionInterval.java |    8 +-
 .../readwrite/BACnetConstructedDataCOVUPeriod.java |    9 +-
 .../BACnetConstructedDataCOVURecipients.java       |    8 +-
 .../BACnetConstructedDataCalendarAll.java          |    8 +-
 .../BACnetConstructedDataCalendarPresentValue.java |    8 +-
 .../BACnetConstructedDataCarAssignedDirection.java |    8 +-
 .../BACnetConstructedDataCarDoorCommand.java       |    8 +-
 .../BACnetConstructedDataCarDoorStatus.java        |    8 +-
 .../BACnetConstructedDataCarDoorText.java          |    8 +-
 .../BACnetConstructedDataCarDoorZone.java          |    9 +-
 .../BACnetConstructedDataCarDriveStatus.java       |    8 +-
 .../readwrite/BACnetConstructedDataCarLoad.java    |    8 +-
 .../BACnetConstructedDataCarLoadUnits.java         |    8 +-
 .../readwrite/BACnetConstructedDataCarMode.java    |    8 +-
 .../BACnetConstructedDataCarMovingDirection.java   |    8 +-
 .../BACnetConstructedDataCarPosition.java          |    9 +-
 .../BACnetConstructedDataChangeOfStateCount.java   |    8 +-
 .../BACnetConstructedDataChangeOfStateTime.java    |    8 +-
 .../BACnetConstructedDataChangesPending.java       |    8 +-
 .../readwrite/BACnetConstructedDataChannelAll.java |    8 +-
 ...dDataChannelListOfObjectPropertyReferences.java |   21 +-
 .../BACnetConstructedDataChannelNumber.java        |    8 +-
 .../BACnetConstructedDataChannelPresentValue.java  |    8 +-
 ...tructedDataCharacterStringValueAlarmValues.java |    8 +-
 ...tructedDataCharacterStringValueFaultValues.java |    8 +-
 ...ructedDataCharacterStringValuePresentValue.java |    8 +-
 ...dDataCharacterStringValueRelinquishDefault.java |   21 +-
 ...CnetConstructedDataCharacterstringValueAll.java |    9 +-
 .../BACnetConstructedDataClientCOVIncrement.java   |    8 +-
 .../readwrite/BACnetConstructedDataCommand.java    |    8 +-
 .../BACnetConstructedDataCommandAction.java        |    8 +-
 .../readwrite/BACnetConstructedDataCommandAll.java |    8 +-
 .../BACnetConstructedDataCommandTimeArray.java     |    8 +-
 .../BACnetConstructedDataConfigurationFiles.java   |    8 +-
 .../BACnetConstructedDataControlGroups.java        |    8 +-
 ...ConstructedDataControlledVariableReference.java |    8 +-
 ...CnetConstructedDataControlledVariableUnits.java |    8 +-
 ...CnetConstructedDataControlledVariableValue.java |    8 +-
 .../readwrite/BACnetConstructedDataCount.java      |    8 +-
 .../BACnetConstructedDataCountBeforeChange.java    |    8 +-
 .../BACnetConstructedDataCountChangeTime.java      |    8 +-
 ...ACnetConstructedDataCredentialDataInputAll.java |    9 +-
 ...tructedDataCredentialDataInputPresentValue.java |    8 +-
 ...nstructedDataCredentialDataInputUpdateTime.java |    8 +-
 .../BACnetConstructedDataCredentialDisable.java    |    8 +-
 .../BACnetConstructedDataCredentialStatus.java     |    8 +-
 .../BACnetConstructedDataCredentials.java          |    9 +-
 .../BACnetConstructedDataCredentialsInZone.java    |    8 +-
 ...ACnetConstructedDataCurrentCommandPriority.java |    8 +-
 .../BACnetConstructedDataDatabaseRevision.java     |    8 +-
 .../readwrite/BACnetConstructedDataDateList.java   |    8 +-
 ...onstructedDataDatePatternValuePresentValue.java |    8 +-
 ...uctedDataDatePatternValueRelinquishDefault.java |    8 +-
 ...ructedDataDateTimePatternValuePresentValue.java |    8 +-
 ...dDataDateTimePatternValueRelinquishDefault.java |   21 +-
 ...etConstructedDataDateTimeValuePresentValue.java |    8 +-
 ...structedDataDateTimeValueRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataDateValueAll.java         |    8 +-
 ...BACnetConstructedDataDateValuePresentValue.java |    8 +-
 ...tConstructedDataDateValueRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataDatepatternValueAll.java  |    8 +-
 .../BACnetConstructedDataDatetimeValueAll.java     |    8 +-
 ...CnetConstructedDataDatetimepatternValueAll.java |    9 +-
 ...BACnetConstructedDataDaylightSavingsStatus.java |    8 +-
 .../BACnetConstructedDataDaysRemaining.java        |    8 +-
 .../readwrite/BACnetConstructedDataDeadband.java   |    8 +-
 .../BACnetConstructedDataDefaultFadeTime.java      |    8 +-
 .../BACnetConstructedDataDefaultRampRate.java      |    8 +-
 .../BACnetConstructedDataDefaultStepIncrement.java |    8 +-
 ...structedDataDefaultSubordinateRelationship.java |    8 +-
 .../BACnetConstructedDataDefaultTimeout.java       |    8 +-
 ...CnetConstructedDataDeployedProfileLocation.java |    8 +-
 .../BACnetConstructedDataDerivativeConstant.java   |    8 +-
 ...CnetConstructedDataDerivativeConstantUnits.java |    8 +-
 .../BACnetConstructedDataDescription.java          |    9 +-
 .../BACnetConstructedDataDescriptionOfHalt.java    |    8 +-
 .../BACnetConstructedDataDeviceAddressBinding.java |    8 +-
 .../readwrite/BACnetConstructedDataDeviceAll.java  |    8 +-
 .../BACnetConstructedDataDeviceMaxInfoFrames.java  |    8 +-
 .../BACnetConstructedDataDeviceMaxMaster.java      |    8 +-
 .../readwrite/BACnetConstructedDataDeviceType.java |    9 +-
 .../BACnetConstructedDataDirectReading.java        |    8 +-
 ...CnetConstructedDataDistributionKeyRevision.java |    8 +-
 .../readwrite/BACnetConstructedDataDoNotHide.java  |    8 +-
 .../BACnetConstructedDataDoorAlarmState.java       |    8 +-
 ...BACnetConstructedDataDoorExtendedPulseTime.java |    8 +-
 .../BACnetConstructedDataDoorMembers.java          |    8 +-
 .../BACnetConstructedDataDoorOpenTooLongTime.java  |    8 +-
 .../BACnetConstructedDataDoorPulseTime.java        |    8 +-
 .../readwrite/BACnetConstructedDataDoorStatus.java |    9 +-
 .../BACnetConstructedDataDoorUnlockDelayTime.java  |    8 +-
 .../readwrite/BACnetConstructedDataDutyWindow.java |    9 +-
 .../BACnetConstructedDataEffectivePeriod.java      |    8 +-
 .../BACnetConstructedDataEgressActive.java         |    8 +-
 .../readwrite/BACnetConstructedDataEgressTime.java |    9 +-
 .../BACnetConstructedDataElapsedActiveTime.java    |    8 +-
 .../BACnetConstructedDataElevatorGroup.java        |    8 +-
 .../BACnetConstructedDataElevatorGroupAll.java     |    8 +-
 ...etConstructedDataElevatorGroupGroupMembers.java |    8 +-
 .../readwrite/BACnetConstructedDataEnable.java     |    8 +-
 .../BACnetConstructedDataEnergyMeter.java          |    9 +-
 .../BACnetConstructedDataEnergyMeterRef.java       |    8 +-
 .../BACnetConstructedDataEntryPoints.java          |    9 +-
 .../readwrite/BACnetConstructedDataErrorLimit.java |    9 +-
 .../BACnetConstructedDataEscalatorAll.java         |    8 +-
 ...BACnetConstructedDataEscalatorFaultSignals.java |    8 +-
 .../BACnetConstructedDataEscalatorMode.java        |    8 +-
 ...BACnetConstructedDataEventAlgorithmInhibit.java |    8 +-
 ...netConstructedDataEventAlgorithmInhibitRef.java |    8 +-
 .../BACnetConstructedDataEventDetectionEnable.java |    8 +-
 .../BACnetConstructedDataEventEnable.java          |    9 +-
 .../BACnetConstructedDataEventEnrollmentAll.java   |    8 +-
 .../BACnetConstructedDataEventLogAll.java          |    8 +-
 .../BACnetConstructedDataEventLogLogBuffer.java    |    8 +-
 .../BACnetConstructedDataEventMessageTexts.java    |    8 +-
 ...CnetConstructedDataEventMessageTextsConfig.java |    8 +-
 .../BACnetConstructedDataEventParameters.java      |    8 +-
 .../readwrite/BACnetConstructedDataEventState.java |    9 +-
 .../BACnetConstructedDataEventTimeStamps.java      |    8 +-
 .../readwrite/BACnetConstructedDataEventType.java  |    8 +-
 .../BACnetConstructedDataExceptionSchedule.java    |    8 +-
 .../BACnetConstructedDataExecutionDelay.java       |    8 +-
 .../readwrite/BACnetConstructedDataExitPoints.java |    9 +-
 .../BACnetConstructedDataExpectedShedLevel.java    |    8 +-
 .../BACnetConstructedDataExpirationTime.java       |    8 +-
 .../BACnetConstructedDataExtendedTimeEnable.java   |    8 +-
 .../BACnetConstructedDataFDBBMDAddress.java        |    8 +-
 ...ACnetConstructedDataFDSubscriptionLifetime.java |    8 +-
 .../BACnetConstructedDataFailedAttemptEvents.java  |    8 +-
 .../BACnetConstructedDataFailedAttempts.java       |    8 +-
 .../BACnetConstructedDataFailedAttemptsTime.java   |    8 +-
 .../BACnetConstructedDataFaultHighLimit.java       |    8 +-
 .../BACnetConstructedDataFaultLowLimit.java        |    8 +-
 .../BACnetConstructedDataFaultParameters.java      |    8 +-
 .../BACnetConstructedDataFaultSignals.java         |    8 +-
 .../readwrite/BACnetConstructedDataFaultType.java  |    8 +-
 .../BACnetConstructedDataFaultValues.java          |    8 +-
 .../BACnetConstructedDataFileAccessMethod.java     |    8 +-
 .../readwrite/BACnetConstructedDataFileAll.java    |    8 +-
 .../BACnetConstructedDataFileRecordCount.java      |    8 +-
 .../readwrite/BACnetConstructedDataFileSize.java   |    8 +-
 .../readwrite/BACnetConstructedDataFileType.java   |    8 +-
 .../BACnetConstructedDataFirmwareRevision.java     |    8 +-
 .../readwrite/BACnetConstructedDataFloorText.java  |    8 +-
 .../BACnetConstructedDataFullDutyBaseline.java     |    8 +-
 .../BACnetConstructedDataGlobalGroupAll.java       |    8 +-
 ...CnetConstructedDataGlobalGroupGroupMembers.java |    8 +-
 ...CnetConstructedDataGlobalGroupPresentValue.java |    8 +-
 .../BACnetConstructedDataGlobalIdentifier.java     |    8 +-
 .../readwrite/BACnetConstructedDataGroupAll.java   |    8 +-
 .../readwrite/BACnetConstructedDataGroupID.java    |    8 +-
 .../BACnetConstructedDataGroupMemberNames.java     |    8 +-
 .../BACnetConstructedDataGroupMembers.java         |    8 +-
 .../readwrite/BACnetConstructedDataGroupMode.java  |    8 +-
 .../BACnetConstructedDataGroupPresentValue.java    |    8 +-
 .../readwrite/BACnetConstructedDataHighLimit.java  |    8 +-
 .../readwrite/BACnetConstructedDataHigherDeck.java |    9 +-
 .../readwrite/BACnetConstructedDataIPAddress.java  |    8 +-
 .../BACnetConstructedDataIPDHCPEnable.java         |    8 +-
 .../BACnetConstructedDataIPDHCPLeaseTime.java      |    8 +-
 ...netConstructedDataIPDHCPLeaseTimeRemaining.java |    8 +-
 .../BACnetConstructedDataIPDHCPServer.java         |    9 +-
 .../BACnetConstructedDataIPDNSServer.java          |    8 +-
 .../BACnetConstructedDataIPDefaultGateway.java     |    8 +-
 .../BACnetConstructedDataIPSubnetMask.java         |    8 +-
 .../BACnetConstructedDataIPv6Address.java          |    9 +-
 ...netConstructedDataIPv6AutoAddressingEnable.java |    8 +-
 .../BACnetConstructedDataIPv6DHCPLeaseTime.java    |    8 +-
 ...tConstructedDataIPv6DHCPLeaseTimeRemaining.java |    8 +-
 .../BACnetConstructedDataIPv6DHCPServer.java       |    8 +-
 .../BACnetConstructedDataIPv6DNSServer.java        |    8 +-
 .../BACnetConstructedDataIPv6DefaultGateway.java   |    8 +-
 .../BACnetConstructedDataIPv6PrefixLength.java     |    8 +-
 .../BACnetConstructedDataIPv6ZoneIndex.java        |    8 +-
 .../readwrite/BACnetConstructedDataInProcess.java  |    8 +-
 .../readwrite/BACnetConstructedDataInProgress.java |    9 +-
 .../BACnetConstructedDataInactiveText.java         |    8 +-
 .../BACnetConstructedDataInitialTimeout.java       |    8 +-
 .../BACnetConstructedDataInputReference.java       |    8 +-
 .../BACnetConstructedDataInstallationID.java       |    8 +-
 .../readwrite/BACnetConstructedDataInstanceOf.java |    9 +-
 .../BACnetConstructedDataInstantaneousPower.java   |    8 +-
 .../BACnetConstructedDataIntegerValueAll.java      |    8 +-
 ...netConstructedDataIntegerValueCOVIncrement.java |    8 +-
 .../BACnetConstructedDataIntegerValueDeadband.java |    8 +-
 ...tConstructedDataIntegerValueFaultHighLimit.java |    8 +-
 ...etConstructedDataIntegerValueFaultLowLimit.java |    8 +-
 ...BACnetConstructedDataIntegerValueHighLimit.java |    8 +-
 .../BACnetConstructedDataIntegerValueLowLimit.java |    8 +-
 ...netConstructedDataIntegerValueMaxPresValue.java |    8 +-
 ...netConstructedDataIntegerValueMinPresValue.java |    8 +-
 ...netConstructedDataIntegerValuePresentValue.java |    8 +-
 ...nstructedDataIntegerValueRelinquishDefault.java |    8 +-
 ...ACnetConstructedDataIntegerValueResolution.java |    8 +-
 .../BACnetConstructedDataIntegralConstant.java     |    8 +-
 ...BACnetConstructedDataIntegralConstantUnits.java |    8 +-
 .../BACnetConstructedDataIntervalOffset.java       |    8 +-
 .../readwrite/BACnetConstructedDataIsUTC.java      |    8 +-
 .../readwrite/BACnetConstructedDataKeySets.java    |    8 +-
 .../BACnetConstructedDataLandingCallControl.java   |    8 +-
 .../BACnetConstructedDataLandingCalls.java         |    8 +-
 .../BACnetConstructedDataLandingDoorStatus.java    |    8 +-
 .../BACnetConstructedDataLargeAnalogValueAll.java  |    8 +-
 ...onstructedDataLargeAnalogValueCOVIncrement.java |    8 +-
 ...netConstructedDataLargeAnalogValueDeadband.java |    8 +-
 ...structedDataLargeAnalogValueFaultHighLimit.java |    8 +-
 ...nstructedDataLargeAnalogValueFaultLowLimit.java |    8 +-
 ...etConstructedDataLargeAnalogValueHighLimit.java |    8 +-
 ...netConstructedDataLargeAnalogValueLowLimit.java |    8 +-
 ...onstructedDataLargeAnalogValueMaxPresValue.java |    8 +-
 ...onstructedDataLargeAnalogValueMinPresValue.java |    8 +-
 ...onstructedDataLargeAnalogValuePresentValue.java |    8 +-
 ...uctedDataLargeAnalogValueRelinquishDefault.java |    8 +-
 ...tConstructedDataLargeAnalogValueResolution.java |    8 +-
 .../BACnetConstructedDataLastAccessEvent.java      |    8 +-
 .../BACnetConstructedDataLastAccessPoint.java      |    8 +-
 .../BACnetConstructedDataLastCommandTime.java      |    8 +-
 .../BACnetConstructedDataLastCredentialAdded.java  |    8 +-
 ...CnetConstructedDataLastCredentialAddedTime.java |    8 +-
 ...BACnetConstructedDataLastCredentialRemoved.java |    8 +-
 ...etConstructedDataLastCredentialRemovedTime.java |    8 +-
 .../BACnetConstructedDataLastKeyServer.java        |    8 +-
 .../BACnetConstructedDataLastNotifyRecord.java     |    8 +-
 .../BACnetConstructedDataLastPriority.java         |    8 +-
 .../BACnetConstructedDataLastRestartReason.java    |    8 +-
 .../BACnetConstructedDataLastRestoreTime.java      |    8 +-
 .../BACnetConstructedDataLastStateChange.java      |    8 +-
 .../BACnetConstructedDataLastUseTime.java          |    9 +-
 ...BACnetConstructedDataLifeSafetyAlarmValues.java |    8 +-
 ...tConstructedDataLifeSafetyPointAlarmValues.java |    8 +-
 .../BACnetConstructedDataLifeSafetyPointAll.java   |    8 +-
 ...tConstructedDataLifeSafetyPointFaultValues.java |    8 +-
 ...ConstructedDataLifeSafetyPointPresentValue.java |    8 +-
 ...etConstructedDataLifeSafetyZoneAlarmValues.java |    8 +-
 .../BACnetConstructedDataLifeSafetyZoneAll.java    |    8 +-
 ...etConstructedDataLifeSafetyZoneFaultValues.java |    8 +-
 ...uctedDataLifeSafetyZoneMaintenanceRequired.java |    8 +-
 ...tConstructedDataLifeSafetyZonePresentValue.java |    8 +-
 .../readwrite/BACnetConstructedDataLiftAll.java    |    8 +-
 .../BACnetConstructedDataLiftFaultSignals.java     |    8 +-
 .../BACnetConstructedDataLightingCommand.java      |    8 +-
 ...structedDataLightingCommandDefaultPriority.java |    8 +-
 .../BACnetConstructedDataLightingOutputAll.java    |    8 +-
 ...ConstructedDataLightingOutputFeedbackValue.java |    8 +-
 ...tConstructedDataLightingOutputPresentValue.java |    8 +-
 ...tructedDataLightingOutputRelinquishDefault.java |    8 +-
 ...ConstructedDataLightingOutputTrackingValue.java |    8 +-
 .../BACnetConstructedDataLimitEnable.java          |    9 +-
 ...CnetConstructedDataLimitMonitoringInterval.java |    8 +-
 .../readwrite/BACnetConstructedDataLinkSpeed.java  |    8 +-
 ...ACnetConstructedDataLinkSpeedAutonegotiate.java |    8 +-
 .../readwrite/BACnetConstructedDataLinkSpeeds.java |    8 +-
 .../BACnetConstructedDataListOfGroupMembers.java   |    8 +-
 ...structedDataListOfObjectPropertyReferences.java |    8 +-
 .../BACnetConstructedDataLoadControlAll.java       |    8 +-
 ...CnetConstructedDataLoadControlPresentValue.java |    8 +-
 .../readwrite/BACnetConstructedDataLocalDate.java  |    8 +-
 .../BACnetConstructedDataLocalForwardingOnly.java  |    8 +-
 .../readwrite/BACnetConstructedDataLocalTime.java  |    8 +-
 .../readwrite/BACnetConstructedDataLocation.java   |    8 +-
 .../readwrite/BACnetConstructedDataLockStatus.java |    9 +-
 .../readwrite/BACnetConstructedDataLockout.java    |    8 +-
 ...BACnetConstructedDataLockoutRelinquishTime.java |    8 +-
 .../readwrite/BACnetConstructedDataLogBuffer.java  |    8 +-
 ...CnetConstructedDataLogDeviceObjectProperty.java |    8 +-
 .../BACnetConstructedDataLogInterval.java          |    9 +-
 .../BACnetConstructedDataLoggingObject.java        |    8 +-
 .../BACnetConstructedDataLoggingRecord.java        |    8 +-
 .../BACnetConstructedDataLoggingType.java          |    9 +-
 .../readwrite/BACnetConstructedDataLoopAction.java |    8 +-
 .../readwrite/BACnetConstructedDataLoopAll.java    |    8 +-
 .../BACnetConstructedDataLoopPresentValue.java     |    8 +-
 .../BACnetConstructedDataLowDiffLimit.java         |    8 +-
 .../readwrite/BACnetConstructedDataLowLimit.java   |    8 +-
 .../readwrite/BACnetConstructedDataLowerDeck.java  |    8 +-
 .../readwrite/BACnetConstructedDataMACAddress.java |    9 +-
 .../BACnetConstructedDataMachineRoomID.java        |    8 +-
 .../BACnetConstructedDataMaintenanceRequired.java  |    8 +-
 .../BACnetConstructedDataMakingCarCall.java        |    8 +-
 ...onstructedDataManipulatedVariableReference.java |    8 +-
 ...etConstructedDataManualSlaveAddressBinding.java |    8 +-
 .../BACnetConstructedDataMaskedAlarmValues.java    |    8 +-
 ...BACnetConstructedDataMaxAPDULengthAccepted.java |    8 +-
 .../BACnetConstructedDataMaxActualValue.java       |    8 +-
 .../BACnetConstructedDataMaxFailedAttempts.java    |    8 +-
 .../BACnetConstructedDataMaxInfoFrames.java        |    8 +-
 .../readwrite/BACnetConstructedDataMaxMaster.java  |    8 +-
 .../BACnetConstructedDataMaxPresValue.java         |    8 +-
 .../BACnetConstructedDataMaxSegmentsAccepted.java  |    8 +-
 .../BACnetConstructedDataMaximumOutput.java        |    8 +-
 .../BACnetConstructedDataMaximumValue.java         |    8 +-
 ...BACnetConstructedDataMaximumValueTimestamp.java |    8 +-
 .../readwrite/BACnetConstructedDataMemberOf.java   |    8 +-
 .../BACnetConstructedDataMemberStatusFlags.java    |    8 +-
 .../readwrite/BACnetConstructedDataMembers.java    |    8 +-
 .../BACnetConstructedDataMinActualValue.java       |    8 +-
 .../BACnetConstructedDataMinPresValue.java         |    8 +-
 .../BACnetConstructedDataMinimumOffTime.java       |    8 +-
 .../BACnetConstructedDataMinimumOnTime.java        |    8 +-
 .../BACnetConstructedDataMinimumOutput.java        |    8 +-
 .../BACnetConstructedDataMinimumValue.java         |    8 +-
 ...BACnetConstructedDataMinimumValueTimestamp.java |    8 +-
 .../readwrite/BACnetConstructedDataMode.java       |    8 +-
 .../readwrite/BACnetConstructedDataModelName.java  |    8 +-
 .../BACnetConstructedDataModificationDate.java     |    8 +-
 ...tConstructedDataMultiStateInputAlarmValues.java |    8 +-
 .../BACnetConstructedDataMultiStateInputAll.java   |    8 +-
 ...tConstructedDataMultiStateInputFaultValues.java |    8 +-
 ...nstructedDataMultiStateInputInterfaceValue.java |    8 +-
 .../BACnetConstructedDataMultiStateOutputAll.java  |    8 +-
 ...nstructedDataMultiStateOutputFeedbackValue.java |    8 +-
 ...structedDataMultiStateOutputInterfaceValue.java |    8 +-
 ...uctedDataMultiStateOutputRelinquishDefault.java |    8 +-
 ...tConstructedDataMultiStateValueAlarmValues.java |    8 +-
 .../BACnetConstructedDataMultiStateValueAll.java   |    8 +-
 ...tConstructedDataMultiStateValueFaultValues.java |    8 +-
 ...ructedDataMultiStateValueRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataMusterPoint.java          |    9 +-
 .../BACnetConstructedDataNegativeAccessRules.java  |    8 +-
 ...nstructedDataNetworkAccessSecurityPolicies.java |    8 +-
 .../BACnetConstructedDataNetworkInterfaceName.java |    8 +-
 .../BACnetConstructedDataNetworkNumber.java        |    8 +-
 .../BACnetConstructedDataNetworkNumberQuality.java |    8 +-
 .../BACnetConstructedDataNetworkPortAll.java       |    8 +-
 ...netConstructedDataNetworkPortMaxInfoFrames.java |    8 +-
 .../BACnetConstructedDataNetworkPortMaxMaster.java |    8 +-
 .../BACnetConstructedDataNetworkSecurityAll.java   |    8 +-
 .../BACnetConstructedDataNetworkType.java          |    9 +-
 .../BACnetConstructedDataNextStoppingFloor.java    |    8 +-
 .../BACnetConstructedDataNodeSubtype.java          |    9 +-
 .../readwrite/BACnetConstructedDataNodeType.java   |    8 +-
 .../BACnetConstructedDataNotificationClass.java    |    8 +-
 .../BACnetConstructedDataNotificationClassAll.java |    8 +-
 ...netConstructedDataNotificationForwarderAll.java |    9 +-
 ...BACnetConstructedDataNotificationThreshold.java |    8 +-
 .../readwrite/BACnetConstructedDataNotifyType.java |    9 +-
 .../BACnetConstructedDataNumberOfAPDURetries.java  |    8 +-
 ...structedDataNumberOfAuthenticationPolicies.java |    8 +-
 .../BACnetConstructedDataNumberOfStates.java       |    8 +-
 .../BACnetConstructedDataObjectIdentifier.java     |    8 +-
 .../readwrite/BACnetConstructedDataObjectList.java |    8 +-
 .../readwrite/BACnetConstructedDataObjectName.java |    9 +-
 ...CnetConstructedDataObjectPropertyReference.java |    8 +-
 .../readwrite/BACnetConstructedDataObjectType.java |    9 +-
 .../BACnetConstructedDataOccupancyCount.java       |    8 +-
 .../BACnetConstructedDataOccupancyCountAdjust.java |    8 +-
 .../BACnetConstructedDataOccupancyCountEnable.java |    8 +-
 .../BACnetConstructedDataOccupancyLowerLimit.java  |    8 +-
 ...ConstructedDataOccupancyLowerLimitEnforced.java |    8 +-
 .../BACnetConstructedDataOccupancyState.java       |    8 +-
 .../BACnetConstructedDataOccupancyUpperLimit.java  |    8 +-
 ...ConstructedDataOccupancyUpperLimitEnforced.java |    8 +-
 ...onstructedDataOctetStringValuePresentValue.java |    8 +-
 ...uctedDataOctetStringValueRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataOctetstringValueAll.java  |    8 +-
 .../BACnetConstructedDataOperationDirection.java   |    8 +-
 .../BACnetConstructedDataOperationExpected.java    |    8 +-
 .../readwrite/BACnetConstructedDataOptional.java   |    8 +-
 .../BACnetConstructedDataOutOfService.java         |    8 +-
 .../BACnetConstructedDataOutputUnits.java          |    8 +-
 .../BACnetConstructedDataPacketReorderTime.java    |    8 +-
 .../BACnetConstructedDataPassbackMode.java         |    8 +-
 .../BACnetConstructedDataPassbackTimeout.java      |    8 +-
 .../BACnetConstructedDataPassengerAlarm.java       |    8 +-
 .../readwrite/BACnetConstructedDataPolarity.java   |    8 +-
 .../readwrite/BACnetConstructedDataPortFilter.java |    8 +-
 .../BACnetConstructedDataPositiveAccessRules.java  |    8 +-
 ...CnetConstructedDataPositiveIntegerValueAll.java |    9 +-
 ...ructedDataPositiveIntegerValueCOVIncrement.java |    8 +-
 ...onstructedDataPositiveIntegerValueDeadband.java |    8 +-
 ...ctedDataPositiveIntegerValueFaultHighLimit.java |    8 +-
 ...uctedDataPositiveIntegerValueFaultLowLimit.java |    8 +-
 ...nstructedDataPositiveIntegerValueHighLimit.java |    8 +-
 ...onstructedDataPositiveIntegerValueLowLimit.java |    8 +-
 ...ructedDataPositiveIntegerValueMaxPresValue.java |    8 +-
 ...ructedDataPositiveIntegerValueMinPresValue.java |    8 +-
 ...dDataPositiveIntegerValueRelinquishDefault.java |   21 +-
 ...structedDataPositiveIntegerValueResolution.java |    8 +-
 .../readwrite/BACnetConstructedDataPower.java      |    8 +-
 .../readwrite/BACnetConstructedDataPowerMode.java  |    8 +-
 .../readwrite/BACnetConstructedDataPrescale.java   |    8 +-
 .../BACnetConstructedDataPresentValue.java         |    8 +-
 .../readwrite/BACnetConstructedDataPriority.java   |    8 +-
 .../BACnetConstructedDataPriorityArray.java        |    8 +-
 .../BACnetConstructedDataPriorityForWriting.java   |    8 +-
 .../BACnetConstructedDataProcessIdentifier.java    |    8 +-
 ...CnetConstructedDataProcessIdentifierFilter.java |    8 +-
 .../BACnetConstructedDataProfileLocation.java      |    8 +-
 .../BACnetConstructedDataProfileName.java          |    9 +-
 .../readwrite/BACnetConstructedDataProgramAll.java |    8 +-
 .../BACnetConstructedDataProgramChange.java        |    8 +-
 .../BACnetConstructedDataProgramLocation.java      |    8 +-
 .../BACnetConstructedDataProgramState.java         |    8 +-
 .../BACnetConstructedDataPropertyList.java         |    8 +-
 .../BACnetConstructedDataProportionalConstant.java |    8 +-
 ...etConstructedDataProportionalConstantUnits.java |    8 +-
 .../BACnetConstructedDataProtocolLevel.java        |    8 +-
 ...onstructedDataProtocolObjectTypesSupported.java |    8 +-
 .../BACnetConstructedDataProtocolRevision.java     |    8 +-
 ...etConstructedDataProtocolServicesSupported.java |    8 +-
 .../BACnetConstructedDataProtocolVersion.java      |    8 +-
 ...etConstructedDataPulseConverterAdjustValue.java |    8 +-
 .../BACnetConstructedDataPulseConverterAll.java    |    8 +-
 ...tConstructedDataPulseConverterPresentValue.java |    8 +-
 .../readwrite/BACnetConstructedDataPulseRate.java  |    8 +-
 .../readwrite/BACnetConstructedDataReadOnly.java   |    8 +-
 .../BACnetConstructedDataReasonForDisable.java     |    8 +-
 .../BACnetConstructedDataReasonForHalt.java        |    8 +-
 .../BACnetConstructedDataRecipientList.java        |    8 +-
 .../BACnetConstructedDataRecordCount.java          |    9 +-
 ...netConstructedDataRecordsSinceNotification.java |    8 +-
 .../BACnetConstructedDataReferencePort.java        |    8 +-
 .../BACnetConstructedDataRegisteredCarCall.java    |    8 +-
 .../BACnetConstructedDataReliability.java          |    9 +-
 ...onstructedDataReliabilityEvaluationInhibit.java |    8 +-
 .../BACnetConstructedDataRelinquishDefault.java    |    8 +-
 .../readwrite/BACnetConstructedDataRepresents.java |    9 +-
 .../BACnetConstructedDataRequestedShedLevel.java   |    8 +-
 ...CnetConstructedDataRequestedUpdateInterval.java |    8 +-
 .../readwrite/BACnetConstructedDataRequired.java   |    8 +-
 .../readwrite/BACnetConstructedDataResolution.java |    9 +-
 ...nstructedDataRestartNotificationRecipients.java |    8 +-
 ...BACnetConstructedDataRestoreCompletionTime.java |    8 +-
 ...ACnetConstructedDataRestorePreparationTime.java |    8 +-
 .../BACnetConstructedDataRoutingTable.java         |    8 +-
 .../readwrite/BACnetConstructedDataScale.java      |    8 +-
 .../BACnetConstructedDataScaleFactor.java          |    9 +-
 .../BACnetConstructedDataScheduleAll.java          |    8 +-
 .../BACnetConstructedDataScheduleDefault.java      |    8 +-
 .../BACnetConstructedDataSchedulePresentValue.java |    8 +-
 .../BACnetConstructedDataSecuredStatus.java        |    8 +-
 .../BACnetConstructedDataSecurityPDUTimeout.java   |    8 +-
 .../BACnetConstructedDataSecurityTimeWindow.java   |    8 +-
 ...BACnetConstructedDataSegmentationSupported.java |    8 +-
 .../BACnetConstructedDataSerialNumber.java         |    8 +-
 .../readwrite/BACnetConstructedDataSetpoint.java   |    8 +-
 .../BACnetConstructedDataSetpointReference.java    |    8 +-
 .../readwrite/BACnetConstructedDataSetting.java    |    8 +-
 .../BACnetConstructedDataShedDuration.java         |    8 +-
 ...BACnetConstructedDataShedLevelDescriptions.java |    8 +-
 .../readwrite/BACnetConstructedDataShedLevels.java |    8 +-
 .../readwrite/BACnetConstructedDataSilenced.java   |    8 +-
 .../BACnetConstructedDataSlaveAddressBinding.java  |    8 +-
 .../BACnetConstructedDataSlaveProxyEnable.java     |    8 +-
 .../readwrite/BACnetConstructedDataStartTime.java  |    8 +-
 .../BACnetConstructedDataStateChangeValues.java    |    8 +-
 .../BACnetConstructedDataStateDescription.java     |    8 +-
 .../readwrite/BACnetConstructedDataStateText.java  |    8 +-
 .../BACnetConstructedDataStatusFlags.java          |    9 +-
 .../readwrite/BACnetConstructedDataStopTime.java   |    8 +-
 .../BACnetConstructedDataStopWhenFull.java         |    8 +-
 .../BACnetConstructedDataStrikeCount.java          |    9 +-
 .../BACnetConstructedDataStructuredObjectList.java |    8 +-
 .../BACnetConstructedDataStructuredViewAll.java    |    8 +-
 ...ACnetConstructedDataSubordinateAnnotations.java |    8 +-
 .../BACnetConstructedDataSubordinateList.java      |    8 +-
 .../BACnetConstructedDataSubordinateNodeTypes.java |    8 +-
 ...netConstructedDataSubordinateRelationships.java |    8 +-
 .../BACnetConstructedDataSubordinateTags.java      |    8 +-
 .../BACnetConstructedDataSubscribedRecipients.java |    8 +-
 ...ACnetConstructedDataSupportedFormatClasses.java |    8 +-
 .../BACnetConstructedDataSupportedFormats.java     |    8 +-
 ...ConstructedDataSupportedSecurityAlgorithms.java |    8 +-
 .../BACnetConstructedDataSystemStatus.java         |    8 +-
 .../readwrite/BACnetConstructedDataTags.java       |    8 +-
 .../BACnetConstructedDataThreatAuthority.java      |    8 +-
 .../BACnetConstructedDataThreatLevel.java          |    9 +-
 .../readwrite/BACnetConstructedDataTimeDelay.java  |    8 +-
 .../BACnetConstructedDataTimeDelayNormal.java      |    8 +-
 ...BACnetConstructedDataTimeOfActiveTimeReset.java |    8 +-
 .../BACnetConstructedDataTimeOfDeviceRestart.java  |    8 +-
 ...BACnetConstructedDataTimeOfStateCountReset.java |    8 +-
 ...ACnetConstructedDataTimeOfStrikeCountReset.java |    8 +-
 ...onstructedDataTimePatternValuePresentValue.java |    8 +-
 ...uctedDataTimePatternValueRelinquishDefault.java |    8 +-
 ...ConstructedDataTimeSynchronizationInterval.java |    8 +-
 ...nstructedDataTimeSynchronizationRecipients.java |    8 +-
 .../BACnetConstructedDataTimeValueAll.java         |    8 +-
 ...BACnetConstructedDataTimeValuePresentValue.java |    8 +-
 ...tConstructedDataTimeValueRelinquishDefault.java |    8 +-
 .../BACnetConstructedDataTimepatternValueAll.java  |    8 +-
 .../BACnetConstructedDataTimerAlarmValues.java     |    8 +-
 .../readwrite/BACnetConstructedDataTimerAll.java   |    8 +-
 .../BACnetConstructedDataTimerMaxPresValue.java    |    8 +-
 .../BACnetConstructedDataTimerMinPresValue.java    |    8 +-
 .../BACnetConstructedDataTimerResolution.java      |    8 +-
 .../BACnetConstructedDataTimerRunning.java         |    8 +-
 .../readwrite/BACnetConstructedDataTimerState.java |    9 +-
 .../BACnetConstructedDataTotalRecordCount.java     |    8 +-
 .../readwrite/BACnetConstructedDataTraceFlag.java  |    8 +-
 .../BACnetConstructedDataTrackingValue.java        |    8 +-
 ...onstructedDataTransactionNotificationClass.java |    8 +-
 .../readwrite/BACnetConstructedDataTransition.java |    9 +-
 .../BACnetConstructedDataTrendLogAll.java          |    8 +-
 .../BACnetConstructedDataTrendLogLogBuffer.java    |    8 +-
 ...tructedDataTrendLogLogDeviceObjectProperty.java |    8 +-
 .../BACnetConstructedDataTrendLogMultipleAll.java  |    8 +-
 ...etConstructedDataTrendLogMultipleLogBuffer.java |    8 +-
 ...ataTrendLogMultipleLogDeviceObjectProperty.java |   21 +-
 .../readwrite/BACnetConstructedDataTrigger.java    |    8 +-
 .../readwrite/BACnetConstructedDataUTCOffset.java  |    8 +-
 ...ructedDataUTCTimeSynchronizationRecipients.java |    8 +-
 .../readwrite/BACnetConstructedDataUnits.java      |    8 +-
 .../BACnetConstructedDataUnspecified.java          |    8 +-
 .../BACnetConstructedDataUpdateInterval.java       |    8 +-
 .../BACnetConstructedDataUpdateKeySetTimeout.java  |    8 +-
 .../readwrite/BACnetConstructedDataUpdateTime.java |    9 +-
 ...ACnetConstructedDataUserExternalIdentifier.java |    8 +-
 ...netConstructedDataUserInformationReference.java |    8 +-
 .../readwrite/BACnetConstructedDataUserName.java   |    8 +-
 .../readwrite/BACnetConstructedDataUserType.java   |    8 +-
 .../BACnetConstructedDataUsesRemaining.java        |    8 +-
 .../BACnetConstructedDataVTClassesSupported.java   |    8 +-
 .../BACnetConstructedDataValidSamples.java         |    8 +-
 .../BACnetConstructedDataValueBeforeChange.java    |    8 +-
 .../BACnetConstructedDataValueChangeTime.java      |    8 +-
 .../readwrite/BACnetConstructedDataValueSet.java   |    8 +-
 .../BACnetConstructedDataValueSource.java          |    9 +-
 .../BACnetConstructedDataValueSourceArray.java     |    8 +-
 .../BACnetConstructedDataVarianceValue.java        |    8 +-
 .../BACnetConstructedDataVendorIdentifier.java     |    8 +-
 .../readwrite/BACnetConstructedDataVendorName.java |    9 +-
 .../BACnetConstructedDataVerificationTime.java     |    8 +-
 ...ACnetConstructedDataVirtualMACAddressTable.java |    8 +-
 .../BACnetConstructedDataWeeklySchedule.java       |    8 +-
 .../BACnetConstructedDataWindowInterval.java       |    8 +-
 .../BACnetConstructedDataWindowSamples.java        |    8 +-
 .../BACnetConstructedDataWriteStatus.java          |    9 +-
 .../readwrite/BACnetConstructedDataZoneFrom.java   |    8 +-
 .../BACnetConstructedDataZoneMembers.java          |    8 +-
 .../readwrite/BACnetConstructedDataZoneTo.java     |    8 +-
 .../java/bacnetip/readwrite/BACnetContextTag.java  |   39 +-
 .../readwrite/BACnetContextTagBitString.java       |    8 +-
 .../readwrite/BACnetContextTagBoolean.java         |    8 +-
 .../readwrite/BACnetContextTagCharacterString.java |    8 +-
 .../bacnetip/readwrite/BACnetContextTagDate.java   |    8 +-
 .../bacnetip/readwrite/BACnetContextTagDouble.java |    9 +-
 .../readwrite/BACnetContextTagEnumerated.java      |    8 +-
 .../bacnetip/readwrite/BACnetContextTagNull.java   |    8 +-
 .../BACnetContextTagObjectIdentifier.java          |    8 +-
 .../readwrite/BACnetContextTagOctetString.java     |    8 +-
 .../bacnetip/readwrite/BACnetContextTagReal.java   |    8 +-
 .../readwrite/BACnetContextTagSignedInteger.java   |    8 +-
 .../bacnetip/readwrite/BACnetContextTagTime.java   |    8 +-
 .../readwrite/BACnetContextTagUnknown.java         |    8 +-
 .../readwrite/BACnetContextTagUnsignedInteger.java |    8 +-
 .../plc4x/java/bacnetip/readwrite/BACnetError.java |   20 +-
 .../bacnetip/readwrite/BACnetErrorGeneral.java     |    8 +-
 .../readwrite/BACnetEventLogRecordLogDatum.java    |   14 +-
 .../BACnetEventLogRecordLogDatumLogStatus.java     |    8 +-
 .../BACnetEventLogRecordLogDatumNotification.java  |    8 +-
 .../BACnetEventLogRecordLogDatumTimeChange.java    |    8 +-
 .../bacnetip/readwrite/BACnetEventParameter.java   |   57 +-
 .../readwrite/BACnetEventParameterAccessEvent.java |   10 +-
 .../readwrite/BACnetEventParameterBufferReady.java |   10 +-
 .../BACnetEventParameterChangeOfBitstring.java     |    8 +-
 ...ACnetEventParameterChangeOfCharacterString.java |    8 +-
 .../BACnetEventParameterChangeOfDiscreteValue.java |    9 +-
 .../BACnetEventParameterChangeOfLifeSavety.java    |    8 +-
 .../BACnetEventParameterChangeOfState.java         |   10 +-
 .../BACnetEventParameterChangeOfStatusFlags.java   |    8 +-
 .../BACnetEventParameterChangeOfTimer.java         |   10 +-
 .../BACnetEventParameterChangeOfValue.java         |   10 +-
 ...CnetEventParameterChangeOfValueCivCriteria.java |   10 +-
 ...ntParameterChangeOfValueCivCriteriaBitmask.java |   11 +-
 ...alueCivCriteriaReferencedPropertyIncrement.java |   12 +-
 .../BACnetEventParameterCommandFailure.java        |   10 +-
 .../BACnetEventParameterDoubleOutOfRange.java      |    8 +-
 .../readwrite/BACnetEventParameterExtended.java    |   10 +-
 .../BACnetEventParameterFloatingLimit.java         |   10 +-
 .../readwrite/BACnetEventParameterNone.java        |   10 +-
 .../readwrite/BACnetEventParameterOutOfRange.java  |   10 +-
 .../BACnetEventParameterSignedOutOfRange.java      |    8 +-
 .../BACnetEventParameterUnsignedOutOfRange.java    |    8 +-
 .../BACnetEventParameterUnsignedRange.java         |   10 +-
 .../bacnetip/readwrite/BACnetFaultParameter.java   |   24 +-
 .../BACnetFaultParameterFaultCharacterString.java  |    8 +-
 .../BACnetFaultParameterFaultExtended.java         |   10 +-
 ...FaultParameterFaultExtendedParametersEntry.java |   51 +-
 ...meterFaultExtendedParametersEntryBitString.java |   11 +-
 ...rameterFaultExtendedParametersEntryBoolean.java |   11 +-
 ...aultExtendedParametersEntryCharacterString.java |   11 +-
 ...tParameterFaultExtendedParametersEntryDate.java |   11 +-
 ...arameterFaultExtendedParametersEntryDouble.java |   11 +-
 ...eterFaultExtendedParametersEntryEnumerated.java |   12 +-
 ...rameterFaultExtendedParametersEntryInteger.java |   11 +-
 ...tParameterFaultExtendedParametersEntryNull.java |   11 +-
 ...ultExtendedParametersEntryObjectidentifier.java |   11 +-
 ...terFaultExtendedParametersEntryOctetString.java |   12 +-
 ...tParameterFaultExtendedParametersEntryReal.java |   11 +-
 ...meterFaultExtendedParametersEntryReference.java |   11 +-
 ...tParameterFaultExtendedParametersEntryTime.java |   11 +-
 ...ameterFaultExtendedParametersEntryUnsigned.java |   11 +-
 .../BACnetFaultParameterFaultLifeSafety.java       |   10 +-
 .../readwrite/BACnetFaultParameterFaultListed.java |   11 +-
 .../BACnetFaultParameterFaultOutOfRange.java       |   10 +-
 ...aultParameterFaultOutOfRangeMaxNormalValue.java |   22 +-
 ...rameterFaultOutOfRangeMaxNormalValueDouble.java |   11 +-
 ...ameterFaultOutOfRangeMaxNormalValueInteger.java |   11 +-
 ...ParameterFaultOutOfRangeMaxNormalValueReal.java |   12 +-
 ...meterFaultOutOfRangeMaxNormalValueUnsigned.java |   11 +-
 ...aultParameterFaultOutOfRangeMinNormalValue.java |   22 +-
 ...rameterFaultOutOfRangeMinNormalValueDouble.java |   11 +-
 ...ameterFaultOutOfRangeMinNormalValueInteger.java |   11 +-
 ...ParameterFaultOutOfRangeMinNormalValueReal.java |   12 +-
 ...meterFaultOutOfRangeMinNormalValueUnsigned.java |   11 +-
 .../readwrite/BACnetFaultParameterFaultState.java  |   10 +-
 .../BACnetFaultParameterFaultStatusFlags.java      |    8 +-
 .../readwrite/BACnetFaultParameterNone.java        |   10 +-
 .../java/bacnetip/readwrite/BACnetHostAddress.java |    8 +-
 .../readwrite/BACnetHostAddressIpAddress.java      |    8 +-
 .../bacnetip/readwrite/BACnetHostAddressName.java  |    8 +-
 .../bacnetip/readwrite/BACnetHostAddressNull.java  |    8 +-
 .../readwrite/BACnetLandingCallStatusCommand.java  |   10 +-
 .../BACnetLandingCallStatusCommandDestination.java |   11 +-
 .../BACnetLandingCallStatusCommandDirection.java   |   12 +-
 .../java/bacnetip/readwrite/BACnetLogData.java     |    9 +-
 .../bacnetip/readwrite/BACnetLogDataLogData.java   |   10 +-
 .../readwrite/BACnetLogDataLogDataEntry.java       |   36 +-
 .../BACnetLogDataLogDataEntryAnyValue.java         |   10 +-
 .../BACnetLogDataLogDataEntryBitStringValue.java   |    8 +-
 .../BACnetLogDataLogDataEntryBooleanValue.java     |    8 +-
 .../BACnetLogDataLogDataEntryEnumeratedValue.java  |    8 +-
 .../BACnetLogDataLogDataEntryFailure.java          |   10 +-
 .../BACnetLogDataLogDataEntryIntegerValue.java     |    8 +-
 .../BACnetLogDataLogDataEntryNullValue.java        |   10 +-
 .../BACnetLogDataLogDataEntryRealValue.java        |   10 +-
 .../BACnetLogDataLogDataEntryUnsignedValue.java    |    8 +-
 .../readwrite/BACnetLogDataLogDataTimeChange.java  |    9 +-
 .../bacnetip/readwrite/BACnetLogDataLogStatus.java |    9 +-
 .../readwrite/BACnetLogRecordLogDatum.java         |   46 +-
 .../readwrite/BACnetLogRecordLogDatumAnyValue.java |    9 +-
 .../BACnetLogRecordLogDatumBitStringValue.java     |    8 +-
 .../BACnetLogRecordLogDatumBooleanValue.java       |    8 +-
 .../BACnetLogRecordLogDatumEnumeratedValue.java    |    8 +-
 .../readwrite/BACnetLogRecordLogDatumFailure.java  |    8 +-
 .../BACnetLogRecordLogDatumIntegerValue.java       |    8 +-
 .../BACnetLogRecordLogDatumLogStatus.java          |    8 +-
 .../BACnetLogRecordLogDatumNullValue.java          |    8 +-
 .../BACnetLogRecordLogDatumRealValue.java          |    8 +-
 .../BACnetLogRecordLogDatumTimeChange.java         |    8 +-
 .../BACnetLogRecordLogDatumUnsignedValue.java      |    8 +-
 .../readwrite/BACnetNotificationParameters.java    |   72 +-
 .../BACnetNotificationParametersAccessEvent.java   |    8 +-
 .../BACnetNotificationParametersBufferReady.java   |    8 +-
 ...netNotificationParametersChangeOfBitString.java |    8 +-
 ...ificationParametersChangeOfCharacterString.java |    8 +-
 ...otificationParametersChangeOfDiscreteValue.java |    8 +-
 ...ionParametersChangeOfDiscreteValueNewValue.java |   48 +-
 ...metersChangeOfDiscreteValueNewValueBoolean.java |   11 +-
 ...angeOfDiscreteValueNewValueCharacterString.java |   11 +-
 ...etersChangeOfDiscreteValueNewValueDatetime.java |   11 +-
 ...ersChangeOfDiscreteValueNewValueEnumerated.java |   11 +-
 ...metersChangeOfDiscreteValueNewValueInteger.java |   11 +-
 ...ngeOfDiscreteValueNewValueObjectidentifier.java |   11 +-
 ...tersChangeOfDiscreteValueNewValueOctetDate.java |   11 +-
 ...rsChangeOfDiscreteValueNewValueOctetString.java |   12 +-
 ...tersChangeOfDiscreteValueNewValueOctetTime.java |   11 +-
 ...etersChangeOfDiscreteValueNewValueUnsigned.java |   11 +-
 ...etNotificationParametersChangeOfLifeSafety.java |    8 +-
 ...tNotificationParametersChangeOfReliability.java |    8 +-
 .../BACnetNotificationParametersChangeOfState.java |    8 +-
 ...tNotificationParametersChangeOfStatusFlags.java |    8 +-
 .../BACnetNotificationParametersChangeOfTimer.java |    8 +-
 .../BACnetNotificationParametersChangeOfValue.java |    8 +-
 ...otificationParametersChangeOfValueNewValue.java |   12 +-
 ...ParametersChangeOfValueNewValueChangedBits.java |   12 +-
 ...arametersChangeOfValueNewValueChangedValue.java |   12 +-
 ...BACnetNotificationParametersCommandFailure.java |    8 +-
 ...CnetNotificationParametersComplexEventType.java |    8 +-
 ...CnetNotificationParametersDoubleOutOfRange.java |    8 +-
 .../BACnetNotificationParametersExtended.java      |    8 +-
 .../BACnetNotificationParametersFloatingLimit.java |    8 +-
 .../BACnetNotificationParametersOutOfRange.java    |    8 +-
 ...CnetNotificationParametersSignedOutOfRange.java |    8 +-
 ...etNotificationParametersUnsignedOutOfRange.java |    8 +-
 .../BACnetNotificationParametersUnsignedRange.java |    8 +-
 .../bacnetip/readwrite/BACnetOptionalBinaryPV.java |    6 +-
 .../readwrite/BACnetOptionalBinaryPVNull.java      |   10 +-
 .../readwrite/BACnetOptionalBinaryPVValue.java     |   10 +-
 .../readwrite/BACnetOptionalCharacterString.java   |   10 +-
 .../BACnetOptionalCharacterStringNull.java         |   10 +-
 .../BACnetOptionalCharacterStringValue.java        |   10 +-
 .../bacnetip/readwrite/BACnetOptionalREAL.java     |    6 +-
 .../bacnetip/readwrite/BACnetOptionalREALNull.java |   10 +-
 .../readwrite/BACnetOptionalREALValue.java         |   10 +-
 .../bacnetip/readwrite/BACnetOptionalUnsigned.java |    6 +-
 .../readwrite/BACnetOptionalUnsignedNull.java      |   10 +-
 .../readwrite/BACnetOptionalUnsignedValue.java     |   11 +-
 .../bacnetip/readwrite/BACnetPriorityValue.java    |   59 +-
 .../readwrite/BACnetPriorityValueBitString.java    |    8 +-
 .../readwrite/BACnetPriorityValueBoolean.java      |    8 +-
 .../BACnetPriorityValueCharacterString.java        |    9 +-
 .../BACnetPriorityValueConstructedValue.java       |    8 +-
 .../readwrite/BACnetPriorityValueDate.java         |    8 +-
 .../readwrite/BACnetPriorityValueDateTime.java     |    8 +-
 .../readwrite/BACnetPriorityValueDouble.java       |    8 +-
 .../readwrite/BACnetPriorityValueEnumerated.java   |    8 +-
 .../readwrite/BACnetPriorityValueInteger.java      |    8 +-
 .../readwrite/BACnetPriorityValueNull.java         |    8 +-
 .../BACnetPriorityValueObjectidentifier.java       |    8 +-
 .../readwrite/BACnetPriorityValueOctetString.java  |    8 +-
 .../readwrite/BACnetPriorityValueReal.java         |    8 +-
 .../readwrite/BACnetPriorityValueTime.java         |    8 +-
 .../readwrite/BACnetPriorityValueUnsigned.java     |    8 +-
 .../readwrite/BACnetProcessIdSelection.java        |    7 +-
 .../readwrite/BACnetProcessIdSelectionNull.java    |   10 +-
 .../readwrite/BACnetProcessIdSelectionValue.java   |   10 +-
 .../BACnetPropertyAccessResultAccessResult.java    |   24 +-
 ...ccessResultAccessResultPropertyAccessError.java |   19 +-
 ...pertyAccessResultAccessResultPropertyValue.java |   19 +-
 .../BACnetPropertyStateActionUnknown.java          |    8 +-
 .../bacnetip/readwrite/BACnetPropertyStates.java   |  218 ++-
 ...ACnetPropertyStatesAccessCredentialDisable.java |    8 +-
 ...ropertyStatesAccessCredentialDisableReason.java |    8 +-
 .../readwrite/BACnetPropertyStatesAccessEvent.java |    8 +-
 .../readwrite/BACnetPropertyStatesAction.java      |    8 +-
 .../BACnetPropertyStatesAuthenticationStatus.java  |    8 +-
 .../readwrite/BACnetPropertyStatesBackupState.java |    8 +-
 .../BACnetPropertyStatesBacnetIpMode.java          |    8 +-
 .../BACnetPropertyStatesBinaryLightningValue.java  |    8 +-
 .../readwrite/BACnetPropertyStatesBinaryValue.java |    8 +-
 .../readwrite/BACnetPropertyStatesBoolean.java     |    8 +-
 .../BACnetPropertyStatesDoorAlarmState.java        |    9 +-
 .../BACnetPropertyStatesDoorSecuredStatus.java     |    8 +-
 .../readwrite/BACnetPropertyStatesDoorStatus.java  |    8 +-
 .../readwrite/BACnetPropertyStatesDoorValue.java   |    8 +-
 .../BACnetPropertyStatesEscalatorFault.java        |    9 +-
 .../BACnetPropertyStatesEscalatorMode.java         |    8 +-
 ...tPropertyStatesEscalatorOperationDirection.java |    9 +-
 .../readwrite/BACnetPropertyStatesEventType.java   |    8 +-
 .../BACnetPropertyStatesExtendedValue.java         |    9 +-
 .../BACnetPropertyStatesFileAccessMethod.java      |    8 +-
 .../BACnetPropertyStatesIntegerValue.java          |    8 +-
 .../BACnetPropertyStatesLifeSafetyMode.java        |    9 +-
 .../BACnetPropertyStatesLifeSafetyOperations.java  |    8 +-
 .../BACnetPropertyStatesLifeSafetyState.java       |    9 +-
 .../BACnetPropertyStatesLiftCarDirection.java      |    8 +-
 .../BACnetPropertyStatesLiftCarDoorCommand.java    |    8 +-
 .../BACnetPropertyStatesLiftCarDriveStatus.java    |    8 +-
 .../readwrite/BACnetPropertyStatesLiftCarMode.java |    8 +-
 .../readwrite/BACnetPropertyStatesLiftFault.java   |    8 +-
 .../BACnetPropertyStatesLiftGroupMode.java         |    8 +-
 .../BACnetPropertyStatesLightningInProgress.java   |    8 +-
 .../BACnetPropertyStatesLightningOperation.java    |    8 +-
 .../BACnetPropertyStatesLightningTransition.java   |    8 +-
 .../readwrite/BACnetPropertyStatesLockStatus.java  |    8 +-
 .../readwrite/BACnetPropertyStatesMaintenance.java |    8 +-
 .../BACnetPropertyStatesNetworkNumberQuality.java  |    8 +-
 .../BACnetPropertyStatesNetworkPortCommand.java    |    8 +-
 .../readwrite/BACnetPropertyStatesNetworkType.java |    8 +-
 .../readwrite/BACnetPropertyStatesNodeType.java    |    8 +-
 .../readwrite/BACnetPropertyStatesNotifyType.java  |    8 +-
 .../readwrite/BACnetPropertyStatesPolarity.java    |    8 +-
 .../BACnetPropertyStatesProgramChange.java         |    8 +-
 .../BACnetPropertyStatesProtocolLevel.java         |    8 +-
 .../BACnetPropertyStatesReasonForHalt.java         |    8 +-
 .../readwrite/BACnetPropertyStatesReliability.java |    8 +-
 .../BACnetPropertyStatesRestartReason.java         |    8 +-
 .../BACnetPropertyStatesSecurityLevel.java         |    8 +-
 .../readwrite/BACnetPropertyStatesShedState.java   |    8 +-
 .../BACnetPropertyStatesSilencedState.java         |    8 +-
 .../readwrite/BACnetPropertyStatesState.java       |    8 +-
 .../BACnetPropertyStatesSystemStatus.java          |    8 +-
 .../readwrite/BACnetPropertyStatesTimerState.java  |    8 +-
 .../BACnetPropertyStatesTimerTransition.java       |    9 +-
 .../readwrite/BACnetPropertyStatesUnits.java       |    8 +-
 .../readwrite/BACnetPropertyStatesWriteStatus.java |    8 +-
 .../BACnetPropertyStatesZoneOccupanyState.java     |    8 +-
 .../java/bacnetip/readwrite/BACnetRecipient.java   |    6 +-
 .../bacnetip/readwrite/BACnetRecipientAddress.java |    8 +-
 .../bacnetip/readwrite/BACnetRecipientDevice.java  |    8 +-
 .../plc4x/java/bacnetip/readwrite/BACnetScale.java |    6 +-
 .../bacnetip/readwrite/BACnetScaleFloatScale.java  |    8 +-
 .../readwrite/BACnetScaleIntegerScale.java         |    8 +-
 .../java/bacnetip/readwrite/BACnetServiceAck.java  |   49 +-
 .../readwrite/BACnetServiceAckAtomicReadFile.java  |    8 +-
 .../BACnetServiceAckAtomicReadFileRecord.java      |   11 +-
 .../BACnetServiceAckAtomicReadFileStream.java      |   11 +-
 ...CnetServiceAckAtomicReadFileStreamOrRecord.java |   10 +-
 .../readwrite/BACnetServiceAckAtomicWriteFile.java |    8 +-
 .../readwrite/BACnetServiceAckAuthenticate.java    |    8 +-
 .../BACnetServiceAckConfirmedPrivateTransfer.java  |    8 +-
 .../readwrite/BACnetServiceAckCreateObject.java    |    8 +-
 .../readwrite/BACnetServiceAckGetAlarmSummary.java |    8 +-
 .../BACnetServiceAckGetEnrollmentSummary.java      |    8 +-
 .../BACnetServiceAckGetEventInformation.java       |    8 +-
 .../readwrite/BACnetServiceAckReadProperty.java    |    8 +-
 .../BACnetServiceAckReadPropertyConditional.java   |    8 +-
 .../BACnetServiceAckReadPropertyMultiple.java      |    8 +-
 .../readwrite/BACnetServiceAckReadRange.java       |    8 +-
 .../readwrite/BACnetServiceAckRequestKey.java      |    8 +-
 .../bacnetip/readwrite/BACnetServiceAckVTData.java |    8 +-
 .../bacnetip/readwrite/BACnetServiceAckVTOpen.java |    8 +-
 .../java/bacnetip/readwrite/BACnetShedLevel.java   |    8 +-
 .../bacnetip/readwrite/BACnetShedLevelAmount.java  |    8 +-
 .../bacnetip/readwrite/BACnetShedLevelLevel.java   |    8 +-
 .../bacnetip/readwrite/BACnetShedLevelPercent.java |    8 +-
 .../readwrite/BACnetSpecialEventPeriod.java        |   10 +-
 .../BACnetSpecialEventPeriodCalendarEntry.java     |    9 +-
 .../BACnetSpecialEventPeriodCalendarReference.java |    8 +-
 .../java/bacnetip/readwrite/BACnetTimeStamp.java   |    8 +-
 .../readwrite/BACnetTimeStampDateTime.java         |    8 +-
 .../readwrite/BACnetTimeStampSequence.java         |    8 +-
 .../bacnetip/readwrite/BACnetTimeStampTime.java    |    9 +-
 .../readwrite/BACnetTimerStateChangeValue.java     |   53 +-
 .../BACnetTimerStateChangeValueBitString.java      |    8 +-
 .../BACnetTimerStateChangeValueBoolean.java        |    8 +-
 ...BACnetTimerStateChangeValueCharacterString.java |    8 +-
 ...ACnetTimerStateChangeValueConstructedValue.java |    8 +-
 .../readwrite/BACnetTimerStateChangeValueDate.java |    8 +-
 .../BACnetTimerStateChangeValueDateTime.java       |    8 +-
 .../BACnetTimerStateChangeValueDouble.java         |    8 +-
 .../BACnetTimerStateChangeValueEnumerated.java     |    9 +-
 .../BACnetTimerStateChangeValueInteger.java        |    8 +-
 ...BACnetTimerStateChangeValueLightingCommand.java |    8 +-
 .../BACnetTimerStateChangeValueNoValue.java        |    8 +-
 .../readwrite/BACnetTimerStateChangeValueNull.java |    8 +-
 ...ACnetTimerStateChangeValueObjectidentifier.java |    8 +-
 .../BACnetTimerStateChangeValueOctetString.java    |    9 +-
 .../readwrite/BACnetTimerStateChangeValueReal.java |    8 +-
 .../readwrite/BACnetTimerStateChangeValueTime.java |    8 +-
 .../BACnetTimerStateChangeValueUnsigned.java       |    8 +-
 .../readwrite/BACnetUnconfirmedServiceRequest.java |   47 +-
 .../BACnetUnconfirmedServiceRequestIAm.java        |   11 +-
 .../BACnetUnconfirmedServiceRequestIHave.java      |   11 +-
 ...confirmedServiceRequestTimeSynchronization.java |   11 +-
 ...firmedServiceRequestUTCTimeSynchronization.java |   11 +-
 ...edServiceRequestUnconfirmedCOVNotification.java |   11 +-
 ...eRequestUnconfirmedCOVNotificationMultiple.java |   12 +-
 ...ServiceRequestUnconfirmedEventNotification.java |   12 +-
 ...edServiceRequestUnconfirmedPrivateTransfer.java |   11 +-
 ...firmedServiceRequestUnconfirmedTextMessage.java |   11 +-
 .../BACnetUnconfirmedServiceRequestUnknown.java    |   12 +-
 .../BACnetUnconfirmedServiceRequestWhoHas.java     |   11 +-
 ...ACnetUnconfirmedServiceRequestWhoHasObject.java |    9 +-
 ...firmedServiceRequestWhoHasObjectIdentifier.java |   11 +-
 ...tUnconfirmedServiceRequestWhoHasObjectName.java |   11 +-
 .../BACnetUnconfirmedServiceRequestWhoIs.java      |   11 +-
 .../BACnetUnconfirmedServiceRequestWriteGroup.java |   11 +-
 .../java/bacnetip/readwrite/BACnetValueSource.java |    8 +-
 .../readwrite/BACnetValueSourceAddress.java        |    8 +-
 .../bacnetip/readwrite/BACnetValueSourceNone.java  |    8 +-
 .../readwrite/BACnetValueSourceObject.java         |    8 +-
 .../apache/plc4x/java/bacnetip/readwrite/BVLC.java |   30 +-
 .../BVLCDeleteForeignDeviceTableEntry.java         |    9 +-
 .../BVLCDistributeBroadcastToNetwork.java          |   10 +-
 .../java/bacnetip/readwrite/BVLCForwardedNPDU.java |   10 +-
 .../readwrite/BVLCOriginalBroadcastNPDU.java       |   10 +-
 .../readwrite/BVLCOriginalUnicastNPDU.java         |   10 +-
 .../BVLCReadBroadcastDistributionTable.java        |    9 +-
 .../BVLCReadBroadcastDistributionTableAck.java     |   10 +-
 .../readwrite/BVLCReadForeignDeviceTable.java      |    9 +-
 .../readwrite/BVLCReadForeignDeviceTableAck.java   |   10 +-
 .../readwrite/BVLCRegisterForeignDevice.java       |    9 +-
 .../plc4x/java/bacnetip/readwrite/BVLCResult.java  |    8 +-
 .../java/bacnetip/readwrite/BVLCSecureBVLL.java    |   10 +-
 .../BVLCWriteBroadcastDistributionTable.java       |   10 +-
 .../bacnetip/readwrite/ChangeListAddError.java     |    8 +-
 .../bacnetip/readwrite/ChangeListRemoveError.java  |    8 +-
 .../readwrite/ConfirmedPrivateTransferError.java   |    8 +-
 .../java/bacnetip/readwrite/CreateObjectError.java |    8 +-
 .../apache/plc4x/java/bacnetip/readwrite/NLM.java  |   46 +-
 .../bacnetip/readwrite/NLMChallengeRequest.java    |   10 +-
 .../NLMDisconnectConnectionToNetwork.java          |   10 +-
 .../readwrite/NLMEstablishConnectionToNetwork.java |   10 +-
 .../bacnetip/readwrite/NLMIAmRouterToNetwork.java  |   10 +-
 .../readwrite/NLMICouldBeRouterToNetwork.java      |   10 +-
 .../readwrite/NLMInitalizeRoutingTable.java        |   10 +-
 .../readwrite/NLMInitalizeRoutingTableAck.java     |   10 +-
 .../bacnetip/readwrite/NLMNetworkNumberIs.java     |   10 +-
 .../readwrite/NLMRejectRouterToNetwork.java        |   11 +-
 .../bacnetip/readwrite/NLMRequestKeyUpdate.java    |   10 +-
 .../bacnetip/readwrite/NLMRequestMasterKey.java    |   10 +-
 .../plc4x/java/bacnetip/readwrite/NLMReserved.java |    8 +-
 .../readwrite/NLMRouterAvailableToNetwork.java     |   10 +-
 .../bacnetip/readwrite/NLMRouterBusyToNetwork.java |   10 +-
 .../bacnetip/readwrite/NLMSecurityPayload.java     |   10 +-
 .../bacnetip/readwrite/NLMSecurityResponse.java    |   10 +-
 .../java/bacnetip/readwrite/NLMSetMasterKey.java   |    8 +-
 .../readwrite/NLMUpdateKeyDistributionKey.java     |   10 +-
 .../bacnetip/readwrite/NLMUpdateKeyUpdate.java     |   10 +-
 .../readwrite/NLMVendorProprietaryMessage.java     |   10 +-
 .../bacnetip/readwrite/NLMWhatIsNetworkNumber.java |   10 +-
 .../readwrite/NLMWhoIsRouterToNetwork.java         |   11 +-
 .../SubscribeCOVPropertyMultipleError.java         |    8 +-
 .../java/bacnetip/readwrite/VTCloseError.java      |    8 +-
 .../readwrite/WritePropertyMultipleError.java      |    9 +-
 .../java/cbus/readwrite/AccessControlData.java     |   21 +-
 .../AccessControlDataAccessPointClosed.java        |    8 +-
 .../AccessControlDataAccessPointForcedOpen.java    |   10 +-
 .../AccessControlDataAccessPointLeftOpen.java      |   10 +-
 .../AccessControlDataCloseAccessPoint.java         |    8 +-
 .../AccessControlDataInvalidAccessRequest.java     |    8 +-
 .../AccessControlDataLockAccessPoint.java          |    8 +-
 .../readwrite/AccessControlDataRequestToExit.java  |    8 +-
 .../AccessControlDataValidAccessRequest.java       |    8 +-
 .../java/cbus/readwrite/AirConditioningData.java   |   64 +-
 .../AirConditioningDataHumidityScheduleEntry.java  |    8 +-
 .../AirConditioningDataHvacScheduleEntry.java      |    8 +-
 .../cbus/readwrite/AirConditioningDataRefresh.java |   10 +-
 ...ConditioningDataSetHumidityLowerGuardLimit.java |    8 +-
 ...AirConditioningDataSetHumiditySetbackLimit.java |    8 +-
 ...ConditioningDataSetHumidityUpperGuardLimit.java |    8 +-
 .../AirConditioningDataSetHvacLowerGuardLimit.java |    8 +-
 .../AirConditioningDataSetHvacSetbackLimit.java    |    8 +-
 .../AirConditioningDataSetHvacUpperGuardLimit.java |    8 +-
 .../AirConditioningDataSetPlantHumidityLevel.java  |    8 +-
 .../AirConditioningDataSetPlantHvacLevel.java      |    8 +-
 .../AirConditioningDataSetZoneGroupOff.java        |   10 +-
 .../AirConditioningDataSetZoneGroupOn.java         |   10 +-
 .../AirConditioningDataSetZoneHumidityMode.java    |    8 +-
 .../AirConditioningDataSetZoneHvacMode.java        |   10 +-
 .../readwrite/AirConditioningDataZoneHumidity.java |   11 +-
 ...AirConditioningDataZoneHumidityPlantStatus.java |    8 +-
 .../AirConditioningDataZoneHvacPlantStatus.java    |    8 +-
 .../AirConditioningDataZoneTemperature.java        |   10 +-
 .../apache/plc4x/java/cbus/readwrite/CALData.java  |   26 +-
 .../java/cbus/readwrite/CALDataAcknowledge.java    |    9 +-
 .../java/cbus/readwrite/CALDataGetStatus.java      |    9 +-
 .../plc4x/java/cbus/readwrite/CALDataIdentify.java |    8 +-
 .../java/cbus/readwrite/CALDataIdentifyReply.java  |    8 +-
 .../plc4x/java/cbus/readwrite/CALDataRecall.java   |    8 +-
 .../plc4x/java/cbus/readwrite/CALDataReply.java    |    8 +-
 .../plc4x/java/cbus/readwrite/CALDataReset.java    |    8 +-
 .../plc4x/java/cbus/readwrite/CALDataStatus.java   |    8 +-
 .../java/cbus/readwrite/CALDataStatusExtended.java |    8 +-
 .../plc4x/java/cbus/readwrite/CALDataWrite.java    |    8 +-
 .../apache/plc4x/java/cbus/readwrite/CALReply.java |    6 +-
 .../plc4x/java/cbus/readwrite/CALReplyLong.java    |    8 +-
 .../plc4x/java/cbus/readwrite/CALReplyShort.java   |    8 +-
 .../plc4x/java/cbus/readwrite/CBusCommand.java     |   12 +-
 .../readwrite/CBusCommandDeviceManagement.java     |    9 +-
 .../readwrite/CBusCommandPointToMultiPoint.java    |    8 +-
 .../cbus/readwrite/CBusCommandPointToPoint.java    |    8 +-
 .../CBusCommandPointToPointToMultiPoint.java       |    8 +-
 .../plc4x/java/cbus/readwrite/CBusMessage.java     |    6 +-
 .../java/cbus/readwrite/CBusMessageToClient.java   |    8 +-
 .../java/cbus/readwrite/CBusMessageToServer.java   |    8 +-
 .../readwrite/CBusPointToMultiPointCommand.java    |   10 +-
 .../CBusPointToMultiPointCommandNormal.java        |    8 +-
 .../CBusPointToMultiPointCommandStatus.java        |    8 +-
 .../cbus/readwrite/CBusPointToPointCommand.java    |   10 +-
 .../readwrite/CBusPointToPointCommandDirect.java   |    8 +-
 .../readwrite/CBusPointToPointCommandIndirect.java |    8 +-
 .../CBusPointToPointToMultiPointCommand.java       |    8 +-
 .../CBusPointToPointToMultiPointCommandNormal.java |   12 +-
 .../CBusPointToPointToMultiPointCommandStatus.java |   11 +-
 .../cbus/readwrite/ClockAndTimekeepingData.java    |   12 +-
 .../ClockAndTimekeepingDataRequestRefresh.java     |    8 +-
 .../ClockAndTimekeepingDataUpdateDate.java         |   11 +-
 .../ClockAndTimekeepingDataUpdateTime.java         |   10 +-
 .../plc4x/java/cbus/readwrite/EncodedReply.java    |    9 +-
 .../java/cbus/readwrite/EncodedReplyCALReply.java  |    8 +-
 .../java/cbus/readwrite/ErrorReportingData.java    |    4 +-
 .../cbus/readwrite/ErrorReportingDataGeneric.java  |   10 +-
 .../ErrorReportingSystemCategoryType.java          |   32 +-
 ...ystemCategoryTypeBuildingManagementSystems.java |   15 +-
 ...ortingSystemCategoryTypeClimateControllers.java |   14 +-
 ...ErrorReportingSystemCategoryTypeInputUnits.java |   14 +-
 ...rrorReportingSystemCategoryTypeOutputUnits.java |   14 +-
 .../ErrorReportingSystemCategoryTypeReserved.java  |   14 +-
 ...rorReportingSystemCategoryTypeSupportUnits.java |   14 +-
 .../java/cbus/readwrite/IdentifyReplyCommand.java  |   56 +-
 .../IdentifyReplyCommandCurrentSenseLevels.java    |    8 +-
 .../readwrite/IdentifyReplyCommandDSIStatus.java   |    8 +-
 .../cbus/readwrite/IdentifyReplyCommandDelays.java |    8 +-
 ...ntifyReplyCommandExtendedDiagnosticSummary.java |    8 +-
 .../IdentifyReplyCommandFirmwareVersion.java       |    8 +-
 .../IdentifyReplyCommandGAVPhysicalAddresses.java  |    8 +-
 .../IdentifyReplyCommandGAVValuesCurrent.java      |    8 +-
 .../IdentifyReplyCommandGAVValuesStored.java       |    8 +-
 .../IdentifyReplyCommandLogicalAssignment.java     |    8 +-
 .../IdentifyReplyCommandManufacturer.java          |    8 +-
 .../IdentifyReplyCommandMaximumLevels.java         |    8 +-
 .../IdentifyReplyCommandMinimumLevels.java         |    8 +-
 .../IdentifyReplyCommandNetworkTerminalLevels.java |    9 +-
 .../IdentifyReplyCommandNetworkVoltage.java        |    8 +-
 .../IdentifyReplyCommandOutputUnitSummary.java     |    8 +-
 .../readwrite/IdentifyReplyCommandSummary.java     |    8 +-
 .../IdentifyReplyCommandTerminalLevels.java        |    8 +-
 .../cbus/readwrite/IdentifyReplyCommandType.java   |    8 +-
 .../java/cbus/readwrite/LevelInformation.java      |    8 +-
 .../cbus/readwrite/LevelInformationAbsent.java     |    8 +-
 .../cbus/readwrite/LevelInformationCorrupted.java  |    8 +-
 .../cbus/readwrite/LevelInformationNormal.java     |    8 +-
 .../plc4x/java/cbus/readwrite/LightingData.java    |   12 +-
 .../java/cbus/readwrite/LightingDataLabel.java     |    8 +-
 .../plc4x/java/cbus/readwrite/LightingDataOff.java |    8 +-
 .../plc4x/java/cbus/readwrite/LightingDataOn.java  |    8 +-
 .../cbus/readwrite/LightingDataRampToLevel.java    |    9 +-
 .../cbus/readwrite/LightingDataTerminateRamp.java  |    9 +-
 .../plc4x/java/cbus/readwrite/MeasurementData.java |    4 +-
 .../MeasurementDataChannelMeasurementData.java     |   10 +-
 .../cbus/readwrite/MediaTransportControlData.java  |   77 +-
 .../MediaTransportControlDataCategoryName.java     |    8 +-
 ...trolDataEnumerateCategoriesSelectionTracks.java |   10 +-
 .../MediaTransportControlDataEnumerationsSize.java |    8 +-
 .../MediaTransportControlDataFastForward.java      |    8 +-
 ...iaTransportControlDataNextPreviousCategory.java |    8 +-
 ...aTransportControlDataNextPreviousSelection.java |    8 +-
 ...MediaTransportControlDataNextPreviousTrack.java |    8 +-
 .../MediaTransportControlDataPauseResume.java      |    8 +-
 .../readwrite/MediaTransportControlDataPlay.java   |   10 +-
 .../MediaTransportControlDataRepeatOnOff.java      |    8 +-
 .../readwrite/MediaTransportControlDataRewind.java |   10 +-
 .../MediaTransportControlDataSelectionName.java    |    8 +-
 .../MediaTransportControlDataSetCategory.java      |    8 +-
 .../MediaTransportControlDataSetSelection.java     |    8 +-
 .../MediaTransportControlDataSetTrack.java         |   11 +-
 .../MediaTransportControlDataShuffleOnOff.java     |    8 +-
 ...ediaTransportControlDataSourcePowerControl.java |    8 +-
 .../MediaTransportControlDataStatusRequest.java    |    8 +-
 .../readwrite/MediaTransportControlDataStop.java   |   10 +-
 .../MediaTransportControlDataTotalTracks.java      |    8 +-
 .../MediaTransportControlDataTrackName.java        |    8 +-
 .../plc4x/java/cbus/readwrite/MeteringData.java    |   22 +-
 .../MeteringDataDrinkingWaterConsumption.java      |   10 +-
 .../MeteringDataElectricityConsumption.java        |    8 +-
 .../cbus/readwrite/MeteringDataGasConsumption.java |    8 +-
 .../MeteringDataMeasureDrinkingWater.java          |    8 +-
 .../readwrite/MeteringDataMeasureElectricity.java  |    8 +-
 .../cbus/readwrite/MeteringDataMeasureGas.java     |    9 +-
 .../cbus/readwrite/MeteringDataMeasureOil.java     |    9 +-
 .../readwrite/MeteringDataMeasureOtherWater.java   |    8 +-
 .../cbus/readwrite/MeteringDataOilConsumption.java |    8 +-
 .../MeteringDataOtherWaterConsumption.java         |    8 +-
 .../plc4x/java/cbus/readwrite/MonitoredSAL.java    |    8 +-
 .../readwrite/MonitoredSALLongFormSmartMode.java   |    8 +-
 .../java/cbus/readwrite/MonitoredSALReply.java     |    8 +-
 .../readwrite/MonitoredSALShortFormBasicMode.java  |    8 +-
 .../java/cbus/readwrite/ParameterChangeReply.java  |    8 +-
 .../plc4x/java/cbus/readwrite/ParameterValue.java  |   36 +-
 .../ParameterValueApplicationAddress1.java         |    8 +-
 .../ParameterValueApplicationAddress2.java         |    8 +-
 .../readwrite/ParameterValueBaudRateSelector.java  |    8 +-
 .../ParameterValueCustomManufacturer.java          |    8 +-
 .../cbus/readwrite/ParameterValueCustomTypes.java  |    8 +-
 .../readwrite/ParameterValueInterfaceOptions1.java |    8 +-
 ...meterValueInterfaceOptions1PowerUpSettings.java |    8 +-
 .../readwrite/ParameterValueInterfaceOptions2.java |    8 +-
 .../readwrite/ParameterValueInterfaceOptions3.java |    8 +-
 .../java/cbus/readwrite/ParameterValueRaw.java     |    8 +-
 .../cbus/readwrite/ParameterValueSerialNumber.java |    8 +-
 .../plc4x/java/cbus/readwrite/PowerUpReply.java    |    8 +-
 .../apache/plc4x/java/cbus/readwrite/Reply.java    |    9 +-
 .../java/cbus/readwrite/ReplyEncodedReply.java     |    8 +-
 .../java/cbus/readwrite/ReplyOrConfirmation.java   |   11 +-
 .../readwrite/ReplyOrConfirmationConfirmation.java |    8 +-
 .../cbus/readwrite/ReplyOrConfirmationReply.java   |    8 +-
 .../apache/plc4x/java/cbus/readwrite/Request.java  |   16 +-
 .../plc4x/java/cbus/readwrite/RequestCommand.java  |    8 +-
 .../cbus/readwrite/RequestDirectCommandAccess.java |    8 +-
 .../plc4x/java/cbus/readwrite/RequestEmpty.java    |    8 +-
 .../plc4x/java/cbus/readwrite/RequestNull.java     |    8 +-
 .../plc4x/java/cbus/readwrite/RequestObsolete.java |    8 +-
 .../plc4x/java/cbus/readwrite/RequestReset.java    |    8 +-
 .../readwrite/RequestSmartConnectShortcut.java     |    8 +-
 .../apache/plc4x/java/cbus/readwrite/SALData.java  |   51 +-
 .../java/cbus/readwrite/SALDataAccessControl.java  |    8 +-
 .../cbus/readwrite/SALDataAirConditioning.java     |    8 +-
 .../java/cbus/readwrite/SALDataAudioAndVideo.java  |    8 +-
 .../cbus/readwrite/SALDataClockAndTimekeeping.java |    8 +-
 .../java/cbus/readwrite/SALDataEnableControl.java  |    8 +-
 .../java/cbus/readwrite/SALDataErrorReporting.java |    8 +-
 .../java/cbus/readwrite/SALDataFreeUsage.java      |    8 +-
 .../plc4x/java/cbus/readwrite/SALDataHeating.java  |    8 +-
 .../java/cbus/readwrite/SALDataHvacActuator.java   |    8 +-
 .../cbus/readwrite/SALDataIrrigationControl.java   |    8 +-
 .../plc4x/java/cbus/readwrite/SALDataLighting.java |    8 +-
 .../java/cbus/readwrite/SALDataMeasurement.java    |    8 +-
 .../java/cbus/readwrite/SALDataMediaTransport.java |    8 +-
 .../plc4x/java/cbus/readwrite/SALDataMetering.java |    8 +-
 .../SALDataPoolsSpasPondsFountainsControl.java     |    9 +-
 .../plc4x/java/cbus/readwrite/SALDataReserved.java |    8 +-
 .../cbus/readwrite/SALDataRoomControlSystem.java   |    8 +-
 .../plc4x/java/cbus/readwrite/SALDataSecurity.java |    8 +-
 .../SALDataTelephonyStatusAndControl.java          |    9 +-
 .../readwrite/SALDataTemperatureBroadcast.java     |    9 +-
 .../plc4x/java/cbus/readwrite/SALDataTesting.java  |    8 +-
 .../java/cbus/readwrite/SALDataTriggerControl.java |    8 +-
 .../java/cbus/readwrite/SALDataVentilation.java    |    8 +-
 .../plc4x/java/cbus/readwrite/SecurityData.java    |  100 +-
 .../java/cbus/readwrite/SecurityDataAlarmOff.java  |    8 +-
 .../java/cbus/readwrite/SecurityDataAlarmOn.java   |    8 +-
 .../readwrite/SecurityDataArmFailedCleared.java    |    8 +-
 .../readwrite/SecurityDataArmFailedRaised.java     |    8 +-
 .../readwrite/SecurityDataArmReadyNotReady.java    |    8 +-
 .../java/cbus/readwrite/SecurityDataArmSystem.java |    8 +-
 .../readwrite/SecurityDataCurrentAlarmType.java    |    8 +-
 .../cbus/readwrite/SecurityDataDisplayMessage.java |    8 +-
 .../cbus/readwrite/SecurityDataDropTamper.java     |    9 +-
 .../cbus/readwrite/SecurityDataEmulatedKeypad.java |    8 +-
 .../readwrite/SecurityDataEntryDelayStarted.java   |    8 +-
 .../java/cbus/readwrite/SecurityDataEvent.java     |    8 +-
 .../readwrite/SecurityDataExitDelayStarted.java    |    8 +-
 .../readwrite/SecurityDataFireAlarmCleared.java    |    8 +-
 .../readwrite/SecurityDataFireAlarmRaised.java     |    8 +-
 .../readwrite/SecurityDataGasAlarmCleared.java     |    8 +-
 .../cbus/readwrite/SecurityDataGasAlarmRaised.java |    8 +-
 .../readwrite/SecurityDataLineCutAlarmCleared.java |    8 +-
 .../readwrite/SecurityDataLineCutAlarmRaised.java  |    8 +-
 .../readwrite/SecurityDataLowBatteryCharging.java  |    8 +-
 .../readwrite/SecurityDataLowBatteryCorrected.java |    8 +-
 .../readwrite/SecurityDataLowBatteryDetected.java  |    8 +-
 .../cbus/readwrite/SecurityDataMainsFailure.java   |    9 +-
 .../SecurityDataMainsRestoredOrApplied.java        |    8 +-
 .../plc4x/java/cbus/readwrite/SecurityDataOff.java |    8 +-
 .../plc4x/java/cbus/readwrite/SecurityDataOn.java  |    8 +-
 .../readwrite/SecurityDataOtherAlarmCleared.java   |    8 +-
 .../readwrite/SecurityDataOtherAlarmRaised.java    |    8 +-
 .../cbus/readwrite/SecurityDataPanicActivated.java |    8 +-
 .../cbus/readwrite/SecurityDataPanicCleared.java   |    9 +-
 .../readwrite/SecurityDataPasswordEntryStatus.java |    8 +-
 .../cbus/readwrite/SecurityDataRaiseAlarm.java     |    9 +-
 .../cbus/readwrite/SecurityDataRaiseTamper.java    |    9 +-
 .../readwrite/SecurityDataRequestZoneName.java     |    8 +-
 .../cbus/readwrite/SecurityDataStatus1Request.java |    8 +-
 .../cbus/readwrite/SecurityDataStatus2Request.java |    8 +-
 .../cbus/readwrite/SecurityDataStatusReport1.java  |   10 +-
 .../cbus/readwrite/SecurityDataStatusReport2.java  |    9 +-
 .../readwrite/SecurityDataSystemArmedDisarmed.java |    8 +-
 .../cbus/readwrite/SecurityDataSystemDisarmed.java |    8 +-
 .../java/cbus/readwrite/SecurityDataTamperOff.java |    8 +-
 .../java/cbus/readwrite/SecurityDataTamperOn.java  |    8 +-
 .../cbus/readwrite/SecurityDataZoneIsolated.java   |    9 +-
 .../java/cbus/readwrite/SecurityDataZoneName.java  |    8 +-
 .../java/cbus/readwrite/SecurityDataZoneOpen.java  |    8 +-
 .../cbus/readwrite/SecurityDataZoneSealed.java     |    9 +-
 .../java/cbus/readwrite/SecurityDataZoneShort.java |    8 +-
 .../cbus/readwrite/SecurityDataZoneUnsealed.java   |    9 +-
 .../java/cbus/readwrite/ServerErrorReply.java      |    8 +-
 .../plc4x/java/cbus/readwrite/StatusRequest.java   |    8 +-
 .../cbus/readwrite/StatusRequestBinaryState.java   |    8 +-
 .../StatusRequestBinaryStateDeprecated.java        |    8 +-
 .../java/cbus/readwrite/StatusRequestLevel.java    |    8 +-
 .../plc4x/java/cbus/readwrite/TelephonyData.java   |   33 +-
 .../readwrite/TelephonyDataClearDiversion.java     |    8 +-
 .../cbus/readwrite/TelephonyDataDialInFailure.java |    8 +-
 .../readwrite/TelephonyDataDialOutFailure.java     |    8 +-
 .../java/cbus/readwrite/TelephonyDataDivert.java   |    8 +-
 ...TelephonyDataInternetConnectionRequestMade.java |   10 +-
 .../TelephonyDataIsolateSecondaryOutlet.java       |    8 +-
 .../cbus/readwrite/TelephonyDataLineOffHook.java   |    8 +-
 .../cbus/readwrite/TelephonyDataLineOnHook.java    |    9 +-
 .../readwrite/TelephonyDataRecallLastNumber.java   |    8 +-
 .../TelephonyDataRecallLastNumberRequest.java      |   10 +-
 .../readwrite/TelephonyDataRejectIncomingCall.java |    8 +-
 .../java/cbus/readwrite/TelephonyDataRinging.java  |    9 +-
 .../java/cbus/readwrite/TriggerControlData.java    |   14 +-
 .../readwrite/TriggerControlDataIndicatorKill.java |   10 +-
 .../cbus/readwrite/TriggerControlDataLabel.java    |    8 +-
 .../readwrite/TriggerControlDataTriggerEvent.java  |   10 +-
 .../readwrite/TriggerControlDataTriggerMax.java    |   10 +-
 .../readwrite/TriggerControlDataTriggerMin.java    |   10 +-
 .../canopen/readwrite/CANOpenHeartbeatPayload.java |    8 +-
 .../canopen/readwrite/CANOpenNetworkPayload.java   |   10 +-
 .../java/canopen/readwrite/CANOpenPDOPayload.java  |    8 +-
 .../java/canopen/readwrite/CANOpenPayload.java     |   28 +-
 .../java/canopen/readwrite/CANOpenSDORequest.java  |    8 +-
 .../java/canopen/readwrite/CANOpenSDOResponse.java |    9 +-
 .../readwrite/CANOpenTimeSynchronization.java      |    8 +-
 .../java/canopen/readwrite/SDOAbortRequest.java    |    8 +-
 .../java/canopen/readwrite/SDOAbortResponse.java   |    8 +-
 .../java/canopen/readwrite/SDOBlockRequest.java    |    8 +-
 .../java/canopen/readwrite/SDOBlockResponse.java   |    8 +-
 .../readwrite/SDOInitiateDownloadRequest.java      |    9 +-
 .../readwrite/SDOInitiateDownloadResponse.java     |    9 +-
 .../SDOInitiateExpeditedUploadResponse.java        |   13 +-
 .../SDOInitiateSegmentedReservedResponse.java      |   13 +-
 .../SDOInitiateSegmentedUploadResponse.java        |   13 +-
 .../readwrite/SDOInitiateUploadRequest.java        |    8 +-
 .../readwrite/SDOInitiateUploadResponse.java       |    9 +-
 .../SDOInitiateUploadResponsePayload.java          |    8 +-
 .../plc4x/java/canopen/readwrite/SDORequest.java   |   14 +-
 .../plc4x/java/canopen/readwrite/SDOResponse.java  |   14 +-
 .../readwrite/SDOSegmentDownloadRequest.java       |    8 +-
 .../readwrite/SDOSegmentDownloadResponse.java      |    9 +-
 .../canopen/readwrite/SDOSegmentUploadRequest.java |    8 +-
 .../readwrite/SDOSegmentUploadResponse.java        |    9 +-
 .../java/firmata/readwrite/FirmataCommand.java     |   14 +-
 .../readwrite/FirmataCommandProtocolVersion.java   |    8 +-
 .../FirmataCommandSetDigitalPinValue.java          |    8 +-
 .../readwrite/FirmataCommandSetPinMode.java        |    8 +-
 .../firmata/readwrite/FirmataCommandSysex.java     |    9 +-
 .../readwrite/FirmataCommandSystemReset.java       |    8 +-
 .../java/firmata/readwrite/FirmataMessage.java     |   16 +-
 .../firmata/readwrite/FirmataMessageAnalogIO.java  |    8 +-
 .../firmata/readwrite/FirmataMessageCommand.java   |    9 +-
 .../firmata/readwrite/FirmataMessageDigitalIO.java |    8 +-
 .../FirmataMessageSubscribeAnalogPinValue.java     |    9 +-
 .../FirmataMessageSubscribeDigitalPinValue.java    |    9 +-
 .../plc4x/java/firmata/readwrite/SysexCommand.java |   39 +-
 .../SysexCommandAnalogMappingQueryRequest.java     |    8 +-
 .../SysexCommandAnalogMappingQueryResponse.java    |    8 +-
 .../SysexCommandAnalogMappingResponse.java         |    8 +-
 .../readwrite/SysexCommandCapabilityQuery.java     |    8 +-
 .../readwrite/SysexCommandCapabilityResponse.java  |    8 +-
 .../readwrite/SysexCommandExtendedAnalog.java      |    8 +-
 .../firmata/readwrite/SysexCommandExtendedId.java  |    9 +-
 .../readwrite/SysexCommandPinStateQuery.java       |    9 +-
 .../readwrite/SysexCommandPinStateResponse.java    |    8 +-
 .../SysexCommandReportFirmwareRequest.java         |    8 +-
 .../SysexCommandReportFirmwareResponse.java        |    8 +-
 .../readwrite/SysexCommandSamplingInterval.java    |    8 +-
 .../firmata/readwrite/SysexCommandStringData.java  |    9 +-
 .../readwrite/SysexCommandSysexNonRealtime.java    |    8 +-
 .../readwrite/SysexCommandSysexRealtime.java       |    9 +-
 .../apache/plc4x/java/knxnetip/readwrite/Apdu.java |    6 +-
 .../plc4x/java/knxnetip/readwrite/ApduControl.java |   10 +-
 .../java/knxnetip/readwrite/ApduControlAck.java    |    8 +-
 .../knxnetip/readwrite/ApduControlConnect.java     |    8 +-
 .../knxnetip/readwrite/ApduControlContainer.java   |   10 +-
 .../knxnetip/readwrite/ApduControlDisconnect.java  |    8 +-
 .../java/knxnetip/readwrite/ApduControlNack.java   |    8 +-
 .../plc4x/java/knxnetip/readwrite/ApduData.java    |   35 +-
 .../java/knxnetip/readwrite/ApduDataAdcRead.java   |    8 +-
 .../knxnetip/readwrite/ApduDataAdcResponse.java    |   10 +-
 .../java/knxnetip/readwrite/ApduDataContainer.java |    8 +-
 .../readwrite/ApduDataDeviceDescriptorRead.java    |   10 +-
 .../ApduDataDeviceDescriptorResponse.java          |   11 +-
 .../plc4x/java/knxnetip/readwrite/ApduDataExt.java |  111 +-
 .../readwrite/ApduDataExtAuthorizeRequest.java     |    9 +-
 .../readwrite/ApduDataExtAuthorizeResponse.java    |    8 +-
 .../readwrite/ApduDataExtDomainAddressRead.java    |    8 +-
 .../ApduDataExtDomainAddressResponse.java          |    8 +-
 .../ApduDataExtDomainAddressSelectiveRead.java     |    8 +-
 .../ApduDataExtDomainAddressSerialNumberRead.java  |    8 +-
 ...duDataExtDomainAddressSerialNumberResponse.java |    8 +-
 .../ApduDataExtDomainAddressSerialNumberWrite.java |    8 +-
 .../readwrite/ApduDataExtDomainAddressWrite.java   |    8 +-
 .../readwrite/ApduDataExtFileStreamInfoReport.java |    8 +-
 .../ApduDataExtGroupPropertyValueInfoReport.java   |    8 +-
 .../ApduDataExtGroupPropertyValueRead.java         |    8 +-
 .../ApduDataExtGroupPropertyValueResponse.java     |    8 +-
 .../ApduDataExtGroupPropertyValueWrite.java        |    8 +-
 ...duDataExtIndividualAddressSerialNumberRead.java |    8 +-
 ...taExtIndividualAddressSerialNumberResponse.java |    8 +-
 ...uDataExtIndividualAddressSerialNumberWrite.java |    8 +-
 .../knxnetip/readwrite/ApduDataExtKeyResponse.java |    8 +-
 .../knxnetip/readwrite/ApduDataExtKeyWrite.java    |   10 +-
 .../knxnetip/readwrite/ApduDataExtLinkRead.java    |   10 +-
 .../readwrite/ApduDataExtLinkResponse.java         |    8 +-
 .../knxnetip/readwrite/ApduDataExtLinkWrite.java   |   10 +-
 .../readwrite/ApduDataExtMemoryBitWrite.java       |    9 +-
 .../readwrite/ApduDataExtNetworkParameterRead.java |    8 +-
 .../ApduDataExtNetworkParameterResponse.java       |    8 +-
 .../ApduDataExtNetworkParameterWrite.java          |    8 +-
 .../ApduDataExtOpenRoutingTableRequest.java        |    8 +-
 .../ApduDataExtPropertyDescriptionRead.java        |    9 +-
 .../ApduDataExtPropertyDescriptionResponse.java    |    8 +-
 .../readwrite/ApduDataExtPropertyValueRead.java    |    9 +-
 .../ApduDataExtPropertyValueResponse.java          |    8 +-
 .../readwrite/ApduDataExtPropertyValueWrite.java   |    8 +-
 .../ApduDataExtReadRouterMemoryRequest.java        |    8 +-
 .../ApduDataExtReadRouterMemoryResponse.java       |    8 +-
 .../ApduDataExtReadRouterStatusRequest.java        |    8 +-
 .../ApduDataExtReadRouterStatusResponse.java       |    8 +-
 .../ApduDataExtReadRoutingTableRequest.java        |    8 +-
 .../ApduDataExtReadRoutingTableResponse.java       |    8 +-
 .../ApduDataExtWriteRouterMemoryRequest.java       |    8 +-
 .../ApduDataExtWriteRouterStatusRequest.java       |    8 +-
 .../ApduDataExtWriteRoutingTableRequest.java       |    8 +-
 .../knxnetip/readwrite/ApduDataGroupValueRead.java |   10 +-
 .../readwrite/ApduDataGroupValueResponse.java      |   11 +-
 .../readwrite/ApduDataGroupValueWrite.java         |   10 +-
 .../readwrite/ApduDataIndividualAddressRead.java   |   10 +-
 .../ApduDataIndividualAddressResponse.java         |   11 +-
 .../readwrite/ApduDataIndividualAddressWrite.java  |   11 +-
 .../knxnetip/readwrite/ApduDataMemoryRead.java     |   10 +-
 .../knxnetip/readwrite/ApduDataMemoryResponse.java |   10 +-
 .../knxnetip/readwrite/ApduDataMemoryWrite.java    |   10 +-
 .../java/knxnetip/readwrite/ApduDataOther.java     |    8 +-
 .../java/knxnetip/readwrite/ApduDataRestart.java   |    8 +-
 .../knxnetip/readwrite/ApduDataUserMessage.java    |   10 +-
 .../apache/plc4x/java/knxnetip/readwrite/CEMI.java |   48 +-
 .../readwrite/CEMIAdditionalInformation.java       |   10 +-
 .../CEMIAdditionalInformationBusmonitorInfo.java   |    8 +-
 ...CEMIAdditionalInformationRelativeTimestamp.java |    9 +-
 .../java/knxnetip/readwrite/ComObjectTable.java    |   11 +-
 .../readwrite/ComObjectTableRealisationType1.java  |    8 +-
 .../readwrite/ComObjectTableRealisationType2.java  |    8 +-
 .../readwrite/ComObjectTableRealisationType6.java  |    8 +-
 .../java/knxnetip/readwrite/ConnectionRequest.java |    9 +-
 .../readwrite/ConnectionRequestInformation.java    |   10 +-
 ...nnectionRequestInformationDeviceManagement.java |    8 +-
 ...nnectionRequestInformationTunnelConnection.java |    8 +-
 .../knxnetip/readwrite/ConnectionResponse.java     |    9 +-
 .../readwrite/ConnectionResponseDataBlock.java     |   10 +-
 ...onnectionResponseDataBlockDeviceManagement.java |    8 +-
 ...onnectionResponseDataBlockTunnelConnection.java |    8 +-
 .../knxnetip/readwrite/ConnectionStateRequest.java |    8 +-
 .../readwrite/ConnectionStateResponse.java         |    8 +-
 .../knxnetip/readwrite/DescriptionRequest.java     |    9 +-
 .../knxnetip/readwrite/DescriptionResponse.java    |    9 +-
 .../knxnetip/readwrite/DeviceConfigurationAck.java |    8 +-
 .../readwrite/DeviceConfigurationRequest.java      |    8 +-
 .../java/knxnetip/readwrite/DisconnectRequest.java |    9 +-
 .../knxnetip/readwrite/DisconnectResponse.java     |    9 +-
 .../java/knxnetip/readwrite/KnxGroupAddress.java   |    8 +-
 .../knxnetip/readwrite/KnxGroupAddress2Level.java  |    8 +-
 .../knxnetip/readwrite/KnxGroupAddress3Level.java  |    8 +-
 .../readwrite/KnxGroupAddressFreeLevel.java        |    8 +-
 .../java/knxnetip/readwrite/KnxNetIpCore.java      |    8 +-
 .../readwrite/KnxNetIpDeviceManagement.java        |    8 +-
 .../java/knxnetip/readwrite/KnxNetIpMessage.java   |   35 +-
 .../java/knxnetip/readwrite/KnxNetIpRouting.java   |    8 +-
 .../java/knxnetip/readwrite/KnxNetIpTunneling.java |    8 +-
 .../knxnetip/readwrite/KnxNetObjectServer.java     |    8 +-
 .../KnxNetRemoteConfigurationAndDiagnosis.java     |   10 +-
 .../knxnetip/readwrite/KnxNetRemoteLogging.java    |    8 +-
 .../plc4x/java/knxnetip/readwrite/LBusmonInd.java  |    8 +-
 .../plc4x/java/knxnetip/readwrite/LDataCon.java    |    9 +-
 .../java/knxnetip/readwrite/LDataExtended.java     |    8 +-
 .../plc4x/java/knxnetip/readwrite/LDataFrame.java  |    8 +-
 .../java/knxnetip/readwrite/LDataFrameACK.java     |    8 +-
 .../plc4x/java/knxnetip/readwrite/LDataInd.java    |    9 +-
 .../plc4x/java/knxnetip/readwrite/LDataReq.java    |    9 +-
 .../plc4x/java/knxnetip/readwrite/LPollData.java   |    9 +-
 .../java/knxnetip/readwrite/LPollDataCon.java      |    8 +-
 .../java/knxnetip/readwrite/LPollDataReq.java      |    8 +-
 .../plc4x/java/knxnetip/readwrite/LRawCon.java     |    8 +-
 .../plc4x/java/knxnetip/readwrite/LRawInd.java     |    8 +-
 .../plc4x/java/knxnetip/readwrite/LRawReq.java     |    8 +-
 .../knxnetip/readwrite/MFuncPropCommandReq.java    |    8 +-
 .../java/knxnetip/readwrite/MFuncPropCon.java      |    8 +-
 .../knxnetip/readwrite/MFuncPropStateReadReq.java  |    8 +-
 .../java/knxnetip/readwrite/MPropInfoInd.java      |    8 +-
 .../java/knxnetip/readwrite/MPropReadCon.java      |    8 +-
 .../java/knxnetip/readwrite/MPropReadReq.java      |    8 +-
 .../java/knxnetip/readwrite/MPropWriteCon.java     |    8 +-
 .../java/knxnetip/readwrite/MPropWriteReq.java     |    8 +-
 .../plc4x/java/knxnetip/readwrite/MResetInd.java   |    8 +-
 .../plc4x/java/knxnetip/readwrite/MResetReq.java   |    8 +-
 .../java/knxnetip/readwrite/RoutingIndication.java |    9 +-
 .../java/knxnetip/readwrite/SearchRequest.java     |    8 +-
 .../java/knxnetip/readwrite/SearchResponse.java    |    8 +-
 .../plc4x/java/knxnetip/readwrite/ServiceId.java   |   16 +-
 .../java/knxnetip/readwrite/TDataConnectedInd.java |    8 +-
 .../java/knxnetip/readwrite/TDataConnectedReq.java |    8 +-
 .../knxnetip/readwrite/TDataIndividualInd.java     |    8 +-
 .../knxnetip/readwrite/TDataIndividualReq.java     |    8 +-
 .../java/knxnetip/readwrite/TunnelingRequest.java  |    9 +-
 .../java/knxnetip/readwrite/TunnelingResponse.java |    9 +-
 .../java/knxnetip/readwrite/UnknownMessage.java    |   10 +-
 .../plc4x/java/modbus/readwrite/ModbusADU.java     |    8 +-
 .../java/modbus/readwrite/ModbusAsciiADU.java      |    8 +-
 .../plc4x/java/modbus/readwrite/ModbusPDU.java     |  104 +-
 .../readwrite/ModbusPDUDiagnosticRequest.java      |    8 +-
 .../readwrite/ModbusPDUDiagnosticResponse.java     |    8 +-
 .../java/modbus/readwrite/ModbusPDUError.java      |   10 +-
 .../ModbusPDUGetComEventCounterRequest.java        |    8 +-
 .../ModbusPDUGetComEventCounterResponse.java       |    8 +-
 .../readwrite/ModbusPDUGetComEventLogRequest.java  |    9 +-
 .../readwrite/ModbusPDUGetComEventLogResponse.java |    9 +-
 .../ModbusPDUMaskWriteHoldingRegisterRequest.java  |    9 +-
 .../ModbusPDUMaskWriteHoldingRegisterResponse.java |    9 +-
 .../readwrite/ModbusPDUReadCoilsRequest.java       |    8 +-
 .../readwrite/ModbusPDUReadCoilsResponse.java      |    8 +-
 .../ModbusPDUReadDeviceIdentificationRequest.java  |    8 +-
 .../ModbusPDUReadDeviceIdentificationResponse.java |    8 +-
 .../ModbusPDUReadDiscreteInputsRequest.java        |    8 +-
 .../ModbusPDUReadDiscreteInputsResponse.java       |    8 +-
 .../ModbusPDUReadExceptionStatusRequest.java       |    8 +-
 .../ModbusPDUReadExceptionStatusResponse.java      |    8 +-
 .../readwrite/ModbusPDUReadFifoQueueRequest.java   |    9 +-
 .../readwrite/ModbusPDUReadFifoQueueResponse.java  |    9 +-
 .../readwrite/ModbusPDUReadFileRecordRequest.java  |   10 +-
 .../readwrite/ModbusPDUReadFileRecordResponse.java |   10 +-
 .../ModbusPDUReadHoldingRegistersRequest.java      |    8 +-
 .../ModbusPDUReadHoldingRegistersResponse.java     |    8 +-
 .../ModbusPDUReadInputRegistersRequest.java        |    8 +-
 .../ModbusPDUReadInputRegistersResponse.java       |    8 +-
 ...DUReadWriteMultipleHoldingRegistersRequest.java |    8 +-
 ...UReadWriteMultipleHoldingRegistersResponse.java |    8 +-
 .../readwrite/ModbusPDUReportServerIdRequest.java  |    9 +-
 .../readwrite/ModbusPDUReportServerIdResponse.java |    9 +-
 .../readwrite/ModbusPDUWriteFileRecordRequest.java |   10 +-
 .../ModbusPDUWriteFileRecordResponse.java          |    8 +-
 .../ModbusPDUWriteMultipleCoilsRequest.java        |    8 +-
 .../ModbusPDUWriteMultipleCoilsResponse.java       |    8 +-
 ...busPDUWriteMultipleHoldingRegistersRequest.java |    8 +-
 ...usPDUWriteMultipleHoldingRegistersResponse.java |    8 +-
 .../readwrite/ModbusPDUWriteSingleCoilRequest.java |    9 +-
 .../ModbusPDUWriteSingleCoilResponse.java          |    8 +-
 .../ModbusPDUWriteSingleRegisterRequest.java       |    8 +-
 .../ModbusPDUWriteSingleRegisterResponse.java      |    8 +-
 .../plc4x/java/modbus/readwrite/ModbusRtuADU.java  |    8 +-
 .../plc4x/java/modbus/readwrite/ModbusTcpADU.java  |    8 +-
 .../opcua/readwrite/ActivateSessionRequest.java    |    8 +-
 .../opcua/readwrite/ActivateSessionResponse.java   |    8 +-
 .../plc4x/java/opcua/readwrite/AddNodesItem.java   |   10 +-
 .../java/opcua/readwrite/AddNodesRequest.java      |   10 +-
 .../java/opcua/readwrite/AddNodesResponse.java     |   10 +-
 .../plc4x/java/opcua/readwrite/AddNodesResult.java |   10 +-
 .../java/opcua/readwrite/AddReferencesItem.java    |    8 +-
 .../java/opcua/readwrite/AddReferencesRequest.java |    8 +-
 .../opcua/readwrite/AddReferencesResponse.java     |    8 +-
 .../opcua/readwrite/AdditionalParametersType.java  |    8 +-
 .../opcua/readwrite/AggregateConfiguration.java    |    8 +-
 .../java/opcua/readwrite/AliasNameDataType.java    |    8 +-
 .../plc4x/java/opcua/readwrite/Annotation.java     |   10 +-
 .../opcua/readwrite/AnonymousIdentityToken.java    |    8 +-
 .../opcua/readwrite/ApplicationDescription.java    |    8 +-
 .../plc4x/java/opcua/readwrite/Argument.java       |   10 +-
 .../java/opcua/readwrite/AxisInformation.java      |   10 +-
 .../java/opcua/readwrite/BrowseDescription.java    |    8 +-
 .../java/opcua/readwrite/BrowseNextRequest.java    |    8 +-
 .../java/opcua/readwrite/BrowseNextResponse.java   |    8 +-
 .../plc4x/java/opcua/readwrite/BrowsePath.java     |   10 +-
 .../java/opcua/readwrite/BrowsePathResult.java     |   10 +-
 .../java/opcua/readwrite/BrowsePathTarget.java     |   10 +-
 .../plc4x/java/opcua/readwrite/BrowseRequest.java  |   10 +-
 .../plc4x/java/opcua/readwrite/BrowseResponse.java |   10 +-
 .../plc4x/java/opcua/readwrite/BrowseResult.java   |   10 +-
 .../plc4x/java/opcua/readwrite/BuildInfo.java      |   10 +-
 .../java/opcua/readwrite/CallMethodRequest.java    |    8 +-
 .../java/opcua/readwrite/CallMethodResult.java     |   10 +-
 .../plc4x/java/opcua/readwrite/CallRequest.java    |   10 +-
 .../plc4x/java/opcua/readwrite/CallResponse.java   |   10 +-
 .../plc4x/java/opcua/readwrite/CancelRequest.java  |   10 +-
 .../plc4x/java/opcua/readwrite/CancelResponse.java |   10 +-
 .../java/opcua/readwrite/CartesianCoordinates.java |    8 +-
 .../java/opcua/readwrite/ChannelSecurityToken.java |    8 +-
 .../opcua/readwrite/CloseSecureChannelRequest.java |    8 +-
 .../readwrite/CloseSecureChannelResponse.java      |    8 +-
 .../java/opcua/readwrite/CloseSessionRequest.java  |    8 +-
 .../java/opcua/readwrite/CloseSessionResponse.java |    8 +-
 .../java/opcua/readwrite/ComplexNumberType.java    |    8 +-
 .../readwrite/ConfigurationVersionDataType.java    |    8 +-
 .../readwrite/ConnectionTransportDataType.java     |    8 +-
 .../plc4x/java/opcua/readwrite/ContentFilter.java  |   10 +-
 .../java/opcua/readwrite/ContentFilterElement.java |    8 +-
 .../readwrite/ContentFilterElementResult.java      |    8 +-
 .../java/opcua/readwrite/ContentFilterResult.java  |    8 +-
 .../readwrite/CreateMonitoredItemsRequest.java     |    8 +-
 .../readwrite/CreateMonitoredItemsResponse.java    |    8 +-
 .../java/opcua/readwrite/CreateSessionRequest.java |    8 +-
 .../opcua/readwrite/CreateSessionResponse.java     |    8 +-
 .../opcua/readwrite/CreateSubscriptionRequest.java |    8 +-
 .../readwrite/CreateSubscriptionResponse.java      |    8 +-
 .../java/opcua/readwrite/CurrencyUnitType.java     |   10 +-
 .../opcua/readwrite/DataChangeNotification.java    |    8 +-
 .../readwrite/DataSetReaderMessageDataType.java    |    8 +-
 .../readwrite/DataSetReaderTransportDataType.java  |    8 +-
 .../opcua/readwrite/DataSetWriterDataType.java     |    8 +-
 .../readwrite/DataSetWriterMessageDataType.java    |    8 +-
 .../readwrite/DataSetWriterTransportDataType.java  |    8 +-
 .../java/opcua/readwrite/DataTypeDefinition.java   |    8 +-
 .../java/opcua/readwrite/DataTypeDescription.java  |    8 +-
 .../java/opcua/readwrite/DataTypeSchemaHeader.java |    8 +-
 .../java/opcua/readwrite/DecimalDataType.java      |   10 +-
 .../readwrite/DeleteMonitoredItemsRequest.java     |    8 +-
 .../readwrite/DeleteMonitoredItemsResponse.java    |    8 +-
 .../java/opcua/readwrite/DeleteNodesItem.java      |   10 +-
 .../java/opcua/readwrite/DeleteNodesRequest.java   |    8 +-
 .../java/opcua/readwrite/DeleteNodesResponse.java  |    8 +-
 .../java/opcua/readwrite/DeleteReferencesItem.java |    8 +-
 .../opcua/readwrite/DeleteReferencesRequest.java   |    8 +-
 .../opcua/readwrite/DeleteReferencesResponse.java  |    8 +-
 .../readwrite/DeleteSubscriptionsRequest.java      |    8 +-
 .../readwrite/DeleteSubscriptionsResponse.java     |    8 +-
 .../opcua/readwrite/DiscoveryConfiguration.java    |    8 +-
 .../opcua/readwrite/DoubleComplexNumberType.java   |    8 +-
 .../plc4x/java/opcua/readwrite/EUInformation.java  |   10 +-
 .../opcua/readwrite/EndpointConfiguration.java     |    8 +-
 .../java/opcua/readwrite/EndpointDescription.java  |    8 +-
 .../plc4x/java/opcua/readwrite/EndpointType.java   |   10 +-
 .../opcua/readwrite/EndpointUrlListDataType.java   |    8 +-
 .../plc4x/java/opcua/readwrite/EnumValueType.java  |   11 +-
 .../java/opcua/readwrite/EphemeralKeyType.java     |   10 +-
 .../plc4x/java/opcua/readwrite/EventFieldList.java |   10 +-
 .../opcua/readwrite/EventNotificationList.java     |    9 +-
 .../opcua/readwrite/ExtensionObjectDefinition.java |  687 ++++---
 .../plc4x/java/opcua/readwrite/FieldMetaData.java  |   10 +-
 .../java/opcua/readwrite/FieldTargetDataType.java  |    8 +-
 .../plc4x/java/opcua/readwrite/FilterOperand.java  |   10 +-
 .../readwrite/FindServersOnNetworkRequest.java     |    8 +-
 .../readwrite/FindServersOnNetworkResponse.java    |    8 +-
 .../java/opcua/readwrite/FindServersRequest.java   |    8 +-
 .../java/opcua/readwrite/FindServersResponse.java  |    8 +-
 .../apache/plc4x/java/opcua/readwrite/Frame.java   |   10 +-
 .../opcua/readwrite/GenericAttributeValue.java     |    8 +-
 .../java/opcua/readwrite/GetEndpointsRequest.java  |    8 +-
 .../java/opcua/readwrite/GetEndpointsResponse.java |    8 +-
 .../plc4x/java/opcua/readwrite/HistoryData.java    |   10 +-
 .../plc4x/java/opcua/readwrite/HistoryEvent.java   |   10 +-
 .../opcua/readwrite/HistoryEventFieldList.java     |    8 +-
 .../java/opcua/readwrite/HistoryReadDetails.java   |    8 +-
 .../java/opcua/readwrite/HistoryReadRequest.java   |    8 +-
 .../java/opcua/readwrite/HistoryReadResponse.java  |    8 +-
 .../java/opcua/readwrite/HistoryReadResult.java    |    8 +-
 .../java/opcua/readwrite/HistoryReadValueId.java   |    8 +-
 .../java/opcua/readwrite/HistoryUpdateDetails.java |    8 +-
 .../java/opcua/readwrite/HistoryUpdateRequest.java |    8 +-
 .../opcua/readwrite/HistoryUpdateResponse.java     |    8 +-
 .../java/opcua/readwrite/HistoryUpdateResult.java  |    8 +-
 .../opcua/readwrite/IdentityMappingRuleType.java   |    8 +-
 .../java/opcua/readwrite/IssuedIdentityToken.java  |    8 +-
 .../plc4x/java/opcua/readwrite/KeyValuePair.java   |   10 +-
 .../plc4x/java/opcua/readwrite/MessagePDU.java     |   16 +-
 .../readwrite/ModelChangeStructureDataType.java    |    9 +-
 .../java/opcua/readwrite/ModificationInfo.java     |   10 +-
 .../readwrite/ModifyMonitoredItemsRequest.java     |    8 +-
 .../readwrite/ModifyMonitoredItemsResponse.java    |    8 +-
 .../opcua/readwrite/ModifySubscriptionRequest.java |    8 +-
 .../readwrite/ModifySubscriptionResponse.java      |    8 +-
 .../readwrite/MonitoredItemCreateRequest.java      |    8 +-
 .../opcua/readwrite/MonitoredItemCreateResult.java |    8 +-
 .../readwrite/MonitoredItemModifyRequest.java      |    8 +-
 .../opcua/readwrite/MonitoredItemModifyResult.java |    8 +-
 .../opcua/readwrite/MonitoredItemNotification.java |    8 +-
 .../java/opcua/readwrite/MonitoringFilter.java     |   10 +-
 .../opcua/readwrite/MonitoringFilterResult.java    |    8 +-
 .../java/opcua/readwrite/MonitoringParameters.java |    8 +-
 .../opcua/readwrite/NetworkAddressDataType.java    |    8 +-
 .../java/opcua/readwrite/NetworkGroupDataType.java |    8 +-
 .../apache/plc4x/java/opcua/readwrite/Node.java    |   10 +-
 .../plc4x/java/opcua/readwrite/NodeAttributes.java |   10 +-
 .../java/opcua/readwrite/NodeIdByteString.java     |   10 +-
 .../plc4x/java/opcua/readwrite/NodeIdFourByte.java |   10 +-
 .../plc4x/java/opcua/readwrite/NodeIdGuid.java     |    9 +-
 .../plc4x/java/opcua/readwrite/NodeIdNumeric.java  |   10 +-
 .../plc4x/java/opcua/readwrite/NodeIdString.java   |   10 +-
 .../plc4x/java/opcua/readwrite/NodeIdTwoByte.java  |   10 +-
 .../java/opcua/readwrite/NodeIdTypeDefinition.java |   14 +-
 .../plc4x/java/opcua/readwrite/NodeReference.java  |   10 +-
 .../java/opcua/readwrite/NodeTypeDescription.java  |    8 +-
 .../java/opcua/readwrite/NotificationData.java     |   10 +-
 .../java/opcua/readwrite/NotificationMessage.java  |    8 +-
 .../plc4x/java/opcua/readwrite/NullExtension.java  |   10 +-
 .../opcua/readwrite/OpcuaAcknowledgeResponse.java  |    8 +-
 .../java/opcua/readwrite/OpcuaCloseRequest.java    |   10 +-
 .../java/opcua/readwrite/OpcuaHelloRequest.java    |   10 +-
 .../java/opcua/readwrite/OpcuaMessageRequest.java  |    8 +-
 .../java/opcua/readwrite/OpcuaMessageResponse.java |    8 +-
 .../java/opcua/readwrite/OpcuaOpenRequest.java     |   10 +-
 .../java/opcua/readwrite/OpcuaOpenResponse.java    |   10 +-
 .../plc4x/java/opcua/readwrite/OpcuaVector.java    |   10 +-
 .../opcua/readwrite/OpenSecureChannelRequest.java  |    8 +-
 .../opcua/readwrite/OpenSecureChannelResponse.java |    8 +-
 .../plc4x/java/opcua/readwrite/OptionSet.java      |   10 +-
 .../plc4x/java/opcua/readwrite/Orientation.java    |   10 +-
 .../plc4x/java/opcua/readwrite/ParsingResult.java  |   10 +-
 .../readwrite/ProgramDiagnostic2DataType.java      |    8 +-
 .../opcua/readwrite/ProgramDiagnosticDataType.java |    8 +-
 .../readwrite/PubSubConfigurationDataType.java     |    8 +-
 .../opcua/readwrite/PubSubConnectionDataType.java  |    8 +-
 .../java/opcua/readwrite/PubSubGroupDataType.java  |    8 +-
 .../plc4x/java/opcua/readwrite/PublishRequest.java |   10 +-
 .../java/opcua/readwrite/PublishResponse.java      |   10 +-
 .../readwrite/PublishedDataSetSourceDataType.java  |    8 +-
 .../opcua/readwrite/PublishedVariableDataType.java |    8 +-
 .../java/opcua/readwrite/QueryDataDescription.java |    8 +-
 .../plc4x/java/opcua/readwrite/QueryDataSet.java   |   10 +-
 .../java/opcua/readwrite/QueryFirstRequest.java    |    8 +-
 .../java/opcua/readwrite/QueryFirstResponse.java   |    8 +-
 .../java/opcua/readwrite/QueryNextRequest.java     |   10 +-
 .../java/opcua/readwrite/QueryNextResponse.java    |    8 +-
 .../apache/plc4x/java/opcua/readwrite/Range.java   |   10 +-
 .../plc4x/java/opcua/readwrite/RationalNumber.java |   10 +-
 .../plc4x/java/opcua/readwrite/ReadRequest.java    |   10 +-
 .../plc4x/java/opcua/readwrite/ReadResponse.java   |   10 +-
 .../plc4x/java/opcua/readwrite/ReadValueId.java    |   10 +-
 .../readwrite/ReaderGroupMessageDataType.java      |    8 +-
 .../readwrite/ReaderGroupTransportDataType.java    |    8 +-
 .../opcua/readwrite/RedundantServerDataType.java   |    8 +-
 .../java/opcua/readwrite/ReferenceDescription.java |    8 +-
 .../plc4x/java/opcua/readwrite/ReferenceNode.java  |   10 +-
 .../java/opcua/readwrite/RegisterNodesRequest.java |    8 +-
 .../opcua/readwrite/RegisterNodesResponse.java     |    8 +-
 .../opcua/readwrite/RegisterServer2Request.java    |    8 +-
 .../opcua/readwrite/RegisterServer2Response.java   |    8 +-
 .../opcua/readwrite/RegisterServerRequest.java     |    8 +-
 .../opcua/readwrite/RegisterServerResponse.java    |    8 +-
 .../java/opcua/readwrite/RegisteredServer.java     |   10 +-
 .../plc4x/java/opcua/readwrite/RelativePath.java   |   10 +-
 .../java/opcua/readwrite/RelativePathElement.java  |    8 +-
 .../java/opcua/readwrite/RepublishRequest.java     |   10 +-
 .../java/opcua/readwrite/RepublishResponse.java    |    8 +-
 .../plc4x/java/opcua/readwrite/RequestHeader.java  |   10 +-
 .../plc4x/java/opcua/readwrite/ResponseHeader.java |   10 +-
 .../java/opcua/readwrite/RolePermissionType.java   |    8 +-
 .../SamplingIntervalDiagnosticsDataType.java       |    8 +-
 .../readwrite/SemanticChangeStructureDataType.java |    8 +-
 .../ServerDiagnosticsSummaryDataType.java          |    8 +-
 .../java/opcua/readwrite/ServerOnNetwork.java      |   10 +-
 .../java/opcua/readwrite/ServerStatusDataType.java |    8 +-
 .../opcua/readwrite/ServiceCounterDataType.java    |    8 +-
 .../plc4x/java/opcua/readwrite/ServiceFault.java   |   10 +-
 .../readwrite/SessionDiagnosticsDataType.java      |    8 +-
 .../SessionSecurityDiagnosticsDataType.java        |    8 +-
 .../readwrite/SessionlessInvokeRequestType.java    |    8 +-
 .../readwrite/SessionlessInvokeResponseType.java   |    8 +-
 .../opcua/readwrite/SetMonitoringModeRequest.java  |    8 +-
 .../opcua/readwrite/SetMonitoringModeResponse.java |    8 +-
 .../opcua/readwrite/SetPublishingModeRequest.java  |    8 +-
 .../opcua/readwrite/SetPublishingModeResponse.java |    8 +-
 .../java/opcua/readwrite/SetTriggeringRequest.java |    8 +-
 .../opcua/readwrite/SetTriggeringResponse.java     |    8 +-
 .../plc4x/java/opcua/readwrite/SignatureData.java  |   10 +-
 .../opcua/readwrite/SignedSoftwareCertificate.java |    8 +-
 .../opcua/readwrite/StatusChangeNotification.java  |    8 +-
 .../plc4x/java/opcua/readwrite/StatusResult.java   |   10 +-
 .../plc4x/java/opcua/readwrite/StructureField.java |   10 +-
 .../opcua/readwrite/SubscribedDataSetDataType.java |    8 +-
 .../readwrite/SubscriptionAcknowledgement.java     |    8 +-
 .../readwrite/SubscriptionDiagnosticsDataType.java |    8 +-
 .../java/opcua/readwrite/TimeZoneDataType.java     |   10 +-
 .../plc4x/java/opcua/readwrite/TransferResult.java |   10 +-
 .../readwrite/TransferSubscriptionsRequest.java    |    8 +-
 .../readwrite/TransferSubscriptionsResponse.java   |    8 +-
 .../TranslateBrowsePathsToNodeIdsRequest.java      |    8 +-
 .../TranslateBrowsePathsToNodeIdsResponse.java     |    8 +-
 .../java/opcua/readwrite/TrustListDataType.java    |    8 +-
 .../apache/plc4x/java/opcua/readwrite/Union.java   |   10 +-
 .../opcua/readwrite/UnregisterNodesRequest.java    |    8 +-
 .../opcua/readwrite/UnregisterNodesResponse.java   |    8 +-
 .../opcua/readwrite/UnsignedRationalNumber.java    |    8 +-
 .../java/opcua/readwrite/UserIdentityToken.java    |    8 +-
 .../readwrite/UserIdentityTokenDefinition.java     |   16 +-
 .../opcua/readwrite/UserNameIdentityToken.java     |    8 +-
 .../java/opcua/readwrite/UserTokenPolicy.java      |   10 +-
 .../apache/plc4x/java/opcua/readwrite/Variant.java |   52 +-
 .../plc4x/java/opcua/readwrite/VariantBoolean.java |    8 +-
 .../plc4x/java/opcua/readwrite/VariantByte.java    |    8 +-
 .../java/opcua/readwrite/VariantByteString.java    |    8 +-
 .../java/opcua/readwrite/VariantDataValue.java     |    8 +-
 .../java/opcua/readwrite/VariantDateTime.java      |    8 +-
 .../opcua/readwrite/VariantDiagnosticInfo.java     |    8 +-
 .../plc4x/java/opcua/readwrite/VariantDouble.java  |    8 +-
 .../opcua/readwrite/VariantExpandedNodeId.java     |    8 +-
 .../opcua/readwrite/VariantExtensionObject.java    |    8 +-
 .../plc4x/java/opcua/readwrite/VariantFloat.java   |    8 +-
 .../plc4x/java/opcua/readwrite/VariantGuid.java    |    8 +-
 .../plc4x/java/opcua/readwrite/VariantInt16.java   |    8 +-
 .../plc4x/java/opcua/readwrite/VariantInt32.java   |    8 +-
 .../plc4x/java/opcua/readwrite/VariantInt64.java   |    8 +-
 .../java/opcua/readwrite/VariantLocalizedText.java |    8 +-
 .../plc4x/java/opcua/readwrite/VariantNodeId.java  |    8 +-
 .../java/opcua/readwrite/VariantQualifiedName.java |    8 +-
 .../plc4x/java/opcua/readwrite/VariantSByte.java   |    8 +-
 .../java/opcua/readwrite/VariantStatusCode.java    |    8 +-
 .../plc4x/java/opcua/readwrite/VariantString.java  |    8 +-
 .../plc4x/java/opcua/readwrite/VariantUInt16.java  |    8 +-
 .../plc4x/java/opcua/readwrite/VariantUInt32.java  |    8 +-
 .../plc4x/java/opcua/readwrite/VariantUInt64.java  |    8 +-
 .../plc4x/java/opcua/readwrite/VariantVariant.java |    8 +-
 .../java/opcua/readwrite/VariantXmlElement.java    |    8 +-
 .../java/opcua/readwrite/ViewDescription.java      |   10 +-
 .../plc4x/java/opcua/readwrite/WriteRequest.java   |   10 +-
 .../plc4x/java/opcua/readwrite/WriteResponse.java  |   10 +-
 .../plc4x/java/opcua/readwrite/WriteValue.java     |   10 +-
 .../readwrite/WriterGroupMessageDataType.java      |    8 +-
 .../readwrite/WriterGroupTransportDataType.java    |    8 +-
 .../java/opcua/readwrite/X509IdentityToken.java    |    8 +-
 .../apache/plc4x/java/opcua/readwrite/XVType.java  |   10 +-
 ...licationCommunicationStartAcknowledgeBlock.java |   59 +-
 ...onCommunicationStartAcknowledgeBlockCellId.java |   11 +-
 ...ommunicationStartAcknowledgeBlockChannelId.java |   11 +-
 ...CommunicationStartAcknowledgeBlockClientId.java |   11 +-
 ...icationStartAcknowledgeBlockControllerName.java |   12 +-
 ...tartAcknowledgeBlockControllerSerialNumber.java |   11 +-
 ...tAcknowledgeBlockControllerSoftwareVersion.java |   12 +-
 ...tartAcknowledgeBlockLinkingHandlingSupport.java |   11 +-
 ...onStartAcknowledgeBlockOpenProtocolVersion.java |   11 +-
 ...nCommunicationStartAcknowledgeBlockRbuType.java |   11 +-
 ...StartAcknowledgeBlockSequenceNumberSupport.java |   11 +-
 ...ommunicationStartAcknowledgeBlockStationId.java |   11 +-
 ...municationStartAcknowledgeBlockStationName.java |   11 +-
 ...unicationStartAcknowledgeBlockSupplierCode.java |   11 +-
 ...nicationStartAcknowledgeBlockSystemSubtype.java |   12 +-
 ...mmunicationStartAcknowledgeBlockSystemType.java |   11 +-
 ...onStartAcknowledgeBlockToolSoftwareVersion.java |   11 +-
 .../readwrite/OpenProtocolMessage.java             |   20 +-
 ...nProtocolMessageApplicationCommandAccepted.java |    8 +-
 ...OpenProtocolMessageApplicationCommandError.java |    8 +-
 ...otocolMessageApplicationCommunicationStart.java |    8 +-
 ...geApplicationCommunicationStartAcknowledge.java |   11 +-
 ...rotocolMessageApplicationCommunicationStop.java |    8 +-
 ...otocolMessageApplicationGenericDataRequest.java |    8 +-
 ...tocolMessageApplicationGenericSubscription.java |    8 +-
 ...otocolMessageApplicationGenericUnsubscribe.java |    8 +-
 .../java/plc4x/readwrite/Plc4xConnectRequest.java  |    8 +-
 .../java/plc4x/readwrite/Plc4xConnectResponse.java |    8 +-
 .../plc4x/java/plc4x/readwrite/Plc4xMessage.java   |   14 +-
 .../java/plc4x/readwrite/Plc4xReadRequest.java     |    8 +-
 .../java/plc4x/readwrite/Plc4xReadResponse.java    |    8 +-
 .../java/plc4x/readwrite/Plc4xWriteRequest.java    |    8 +-
 .../java/plc4x/readwrite/Plc4xWriteResponse.java   |    8 +-
 .../profinet/readwrite/DceRpc_InterfaceUuid.java   |   17 +-
 .../DceRpc_InterfaceUuid_ControllerInterface.java  |    8 +-
 .../DceRpc_InterfaceUuid_DeviceInterface.java      |    8 +-
 .../DceRpc_InterfaceUuid_ParameterInterface.java   |    8 +-
 .../DceRpc_InterfaceUuid_SupervisorInterface.java  |    8 +-
 .../profinet/readwrite/Ethernet_FramePayload.java  |    9 +-
 .../readwrite/Ethernet_FramePayload_IPv4.java      |   10 +-
 .../readwrite/Ethernet_FramePayload_PnDcp.java     |   10 +-
 .../Ethernet_FramePayload_VirtualLan.java          |   10 +-
 .../profinet/readwrite/PcDcp_Pdu_DelayReq.java     |    8 +-
 .../plc4x/java/profinet/readwrite/PnDcp_Block.java |   69 +-
 .../readwrite/PnDcp_Block_ALLSelector.java         |    8 +-
 .../PnDcp_Block_ControlOptionFactoryReset.java     |   10 +-
 .../PnDcp_Block_ControlOptionResetToFactory.java   |   10 +-
 .../PnDcp_Block_ControlOptionResponse.java         |    8 +-
 .../readwrite/PnDcp_Block_ControlOptionSignal.java |    8 +-
 .../readwrite/PnDcp_Block_ControlOptionStart.java  |    8 +-
 .../readwrite/PnDcp_Block_ControlOptionStop.java   |    8 +-
 .../PnDcp_Block_DeviceInitiativeOption.java        |    8 +-
 .../PnDcp_Block_DevicePropertiesAliasName.java     |    8 +-
 .../PnDcp_Block_DevicePropertiesDeviceId.java      |   10 +-
 ...PnDcp_Block_DevicePropertiesDeviceInstance.java |   10 +-
 .../PnDcp_Block_DevicePropertiesDeviceOptions.java |    8 +-
 .../PnDcp_Block_DevicePropertiesDeviceRole.java    |   10 +-
 .../PnDcp_Block_DevicePropertiesDeviceVendor.java  |    8 +-
 .../PnDcp_Block_DevicePropertiesNameOfStation.java |    8 +-
 .../PnDcp_Block_DevicePropertiesOemDeviceId.java   |   10 +-
 ...nDcp_Block_DevicePropertiesStandardGateway.java |   10 +-
 .../PnDcp_Block_DhcpOptionClassIdentifier.java     |   10 +-
 ...PnDcp_Block_DhcpOptionDhcpClientIdentifier.java |   10 +-
 ...p_Block_DhcpOptionFullyQualifiedDomainName.java |   10 +-
 .../readwrite/PnDcp_Block_DhcpOptionHostName.java  |    8 +-
 ...PnDcp_Block_DhcpOptionParameterRequestList.java |   10 +-
 .../PnDcp_Block_DhcpOptionServerIdentifier.java    |   10 +-
 .../PnDcp_Block_DhcpOptionUuidBasedClient.java     |   10 +-
 ..._Block_DhcpOptionVendorSpecificInformation.java |   10 +-
 .../readwrite/PnDcp_Block_FullIpSuite.java         |    8 +-
 .../readwrite/PnDcp_Block_IpMacAddress.java        |    9 +-
 .../readwrite/PnDcp_Block_IpParameter.java         |    8 +-
 .../plc4x/java/profinet/readwrite/PnDcp_Pdu.java   |   10 +-
 .../profinet/readwrite/PnDcp_Pdu_IdentifyReq.java  |    8 +-
 .../profinet/readwrite/PnDcp_Pdu_IdentifyRes.java  |    8 +-
 .../readwrite/PnDcp_Pdu_IdentifyRes_Payload.java   |    2 +-
 .../readwrite/PnDcp_Pdu_RealTimeCyclic.java        |    8 +-
 .../java/profinet/readwrite/PnIoCm_Block.java      |   20 +-
 .../readwrite/PnIoCm_Block_AlarmCrReq.java         |    9 +-
 .../readwrite/PnIoCm_Block_AlarmCrRes.java         |   10 +-
 .../profinet/readwrite/PnIoCm_Block_ArReq.java     |    8 +-
 .../profinet/readwrite/PnIoCm_Block_ArRes.java     |    8 +-
 .../profinet/readwrite/PnIoCm_Block_ArServer.java  |    8 +-
 .../PnIoCm_Block_ExpectedSubmoduleReq.java         |    8 +-
 .../profinet/readwrite/PnIoCm_Block_IoCrReq.java   |    8 +-
 .../profinet/readwrite/PnIoCm_Block_IoCrRes.java   |    9 +-
 .../readwrite/PnIoCm_Block_ModuleDiff.java         |    9 +-
 .../java/profinet/readwrite/PnIoCm_Packet.java     |    8 +-
 .../java/profinet/readwrite/PnIoCm_Packet_Rej.java |    8 +-
 .../java/profinet/readwrite/PnIoCm_Packet_Req.java |    8 +-
 .../java/profinet/readwrite/PnIoCm_Packet_Res.java |    8 +-
 .../java/profinet/readwrite/PnIoCm_Submodule.java  |    6 +-
 .../PnIoCm_Submodule_InputAndOutputData.java       |    8 +-
 .../PnIoCm_Submodule_NoInputNoOutputData.java      |   10 +-
 .../apache/plc4x/java/s7/readwrite/COTPPacket.java |   14 +-
 .../s7/readwrite/COTPPacketConnectionRequest.java  |    9 +-
 .../s7/readwrite/COTPPacketConnectionResponse.java |    9 +-
 .../plc4x/java/s7/readwrite/COTPPacketData.java    |   10 +-
 .../s7/readwrite/COTPPacketDisconnectRequest.java  |    9 +-
 .../s7/readwrite/COTPPacketDisconnectResponse.java |   10 +-
 .../java/s7/readwrite/COTPPacketTpduError.java     |    8 +-
 .../plc4x/java/s7/readwrite/COTPParameter.java     |   14 +-
 .../java/s7/readwrite/COTPParameterCalledTsap.java |   11 +-
 .../s7/readwrite/COTPParameterCallingTsap.java     |    8 +-
 .../java/s7/readwrite/COTPParameterChecksum.java   |   11 +-
 ...TPParameterDisconnectAdditionalInformation.java |    8 +-
 .../java/s7/readwrite/COTPParameterTpduSize.java   |   11 +-
 .../apache/plc4x/java/s7/readwrite/S7Address.java  |    4 +-
 .../plc4x/java/s7/readwrite/S7AddressAny.java      |    8 +-
 .../java/s7/readwrite/S7DataAlarmMessage.java      |    8 +-
 .../apache/plc4x/java/s7/readwrite/S7Message.java  |   10 +-
 .../java/s7/readwrite/S7MessageObjectRequest.java  |    8 +-
 .../java/s7/readwrite/S7MessageObjectResponse.java |    8 +-
 .../plc4x/java/s7/readwrite/S7MessageRequest.java  |    8 +-
 .../plc4x/java/s7/readwrite/S7MessageResponse.java |    8 +-
 .../java/s7/readwrite/S7MessageResponseData.java   |    8 +-
 .../plc4x/java/s7/readwrite/S7MessageUserData.java |    8 +-
 .../plc4x/java/s7/readwrite/S7Parameter.java       |   17 +-
 .../s7/readwrite/S7ParameterModeTransition.java    |    9 +-
 .../s7/readwrite/S7ParameterReadVarRequest.java    |    9 +-
 .../s7/readwrite/S7ParameterReadVarResponse.java   |    9 +-
 .../readwrite/S7ParameterSetupCommunication.java   |    8 +-
 .../java/s7/readwrite/S7ParameterUserData.java     |    8 +-
 .../java/s7/readwrite/S7ParameterUserDataItem.java |    5 +-
 .../S7ParameterUserDataItemCPUFunctions.java       |   10 +-
 .../s7/readwrite/S7ParameterWriteVarRequest.java   |    9 +-
 .../s7/readwrite/S7ParameterWriteVarResponse.java  |    9 +-
 .../apache/plc4x/java/s7/readwrite/S7Payload.java  |   13 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarm8.java   |    8 +-
 .../java/s7/readwrite/S7PayloadAlarmAckInd.java    |    8 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarmS.java   |    8 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarmSC.java  |    8 +-
 .../plc4x/java/s7/readwrite/S7PayloadAlarmSQ.java  |    8 +-
 .../s7/readwrite/S7PayloadDiagnosticMessage.java   |    8 +-
 .../plc4x/java/s7/readwrite/S7PayloadNotify.java   |    8 +-
 .../plc4x/java/s7/readwrite/S7PayloadNotify8.java  |    8 +-
 .../s7/readwrite/S7PayloadReadVarResponse.java     |    8 +-
 .../plc4x/java/s7/readwrite/S7PayloadUserData.java |    8 +-
 .../java/s7/readwrite/S7PayloadUserDataItem.java   |   59 +-
 .../S7PayloadUserDataItemCpuFunctionAlarmAck.java  |    8 +-
 ...oadUserDataItemCpuFunctionAlarmAckResponse.java |    9 +-
 ...S7PayloadUserDataItemCpuFunctionAlarmQuery.java |    8 +-
 ...dUserDataItemCpuFunctionAlarmQueryResponse.java |    8 +-
 ...loadUserDataItemCpuFunctionMsgSubscription.java |    8 +-
 ...temCpuFunctionMsgSubscriptionAlarmResponse.java |   11 +-
 ...DataItemCpuFunctionMsgSubscriptionResponse.java |    8 +-
 ...aItemCpuFunctionMsgSubscriptionSysResponse.java |   11 +-
 ...yloadUserDataItemCpuFunctionReadSzlRequest.java |    8 +-
 ...loadUserDataItemCpuFunctionReadSzlResponse.java |    8 +-
 .../s7/readwrite/S7PayloadWriteVarRequest.java     |    8 +-
 .../s7/readwrite/S7PayloadWriteVarResponse.java    |    8 +-
 .../s7/readwrite/S7VarRequestParameterItem.java    |    5 +-
 .../S7VarRequestParameterItemAddress.java          |   10 +-
 .../java/plc4x/readwrite/Plc4xConnectRequest.java  |    8 +-
 .../java/plc4x/readwrite/Plc4xConnectResponse.java |    8 +-
 .../plc4x/java/plc4x/readwrite/Plc4xMessage.java   |   14 +-
 .../java/plc4x/readwrite/Plc4xReadRequest.java     |    8 +-
 .../java/plc4x/readwrite/Plc4xReadResponse.java    |    8 +-
 .../java/plc4x/readwrite/Plc4xWriteRequest.java    |    8 +-
 .../java/plc4x/readwrite/Plc4xWriteResponse.java   |    8 +-
 .../org/apache/plc4x/protocol/ads/ADSProtocol.java |    4 +
 .../plc4x/java/df1/readwrite/DF1Command.java       |    6 +-
 .../apache/plc4x/java/df1/readwrite/DF1Symbol.java |    8 +-
 .../java/df1/readwrite/DF1SymbolMessageFrame.java  |    8 +-
 .../df1/readwrite/DF1SymbolMessageFrameACK.java    |    8 +-
 .../df1/readwrite/DF1SymbolMessageFrameNAK.java    |    8 +-
 .../df1/readwrite/DF1UnprotectedReadRequest.java   |    8 +-
 .../df1/readwrite/DF1UnprotectedReadResponse.java  |    9 +-
 2154 files changed, 18553 insertions(+), 12303 deletions(-)

diff --git a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
index 34b90cc78b..398d1bcbef 100644
--- a/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
+++ b/code-generation/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/BaseFreemarkerLanguageTemplateHelper.java
@@ -195,9 +195,15 @@ public abstract class BaseFreemarkerLanguageTemplateHelper implements Freemarker
         SwitchField switchField = null;
         Function<String, TypeReference> typeRefRetriever = null;
         if (thisType.isDiscriminatedComplexTypeDefinition()) {
-            ComplexTypeDefinition parentType = thisType.asDiscriminatedComplexTypeDefinition().orElseThrow().getParentType().orElseThrow();
-            switchField = parentType.getSwitchField().orElse(null);
-            typeRefRetriever = propertyName -> parentType.getTypeReferenceForProperty(propertyName).orElse(null);
+            DiscriminatedComplexTypeDefinition discriminatedComplexTypeDefinition = thisType.asDiscriminatedComplexTypeDefinition().orElseThrow();
+            switchField = discriminatedComplexTypeDefinition.getSwitchField().orElse(null);
+            typeRefRetriever = propertyName -> discriminatedComplexTypeDefinition.getTypeReferenceForProperty(propertyName).orElse(null);
+            // Please forgive us, we didn't know what we were doing.
+            if(switchField == null) {
+                ComplexTypeDefinition parentType = thisType.asDiscriminatedComplexTypeDefinition().orElseThrow().getParentType().orElseThrow();
+                switchField = parentType.getSwitchField().orElse(null);
+                typeRefRetriever = propertyName -> parentType.getTypeReferenceForProperty(propertyName).orElse(null);
+            }
         } else if (thisType.isDataIoTypeDefinition()) {
             final DefaultDataIoTypeDefinition dataIoTypeDefinition = (DefaultDataIoTypeDefinition) this.thisType;
             switchField = dataIoTypeDefinition.getSwitchField().orElseThrow();
diff --git a/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh b/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
index 6b98ee7dea..eebc88c352 100644
--- a/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
+++ b/code-generation/language-java/src/main/resources/templates/java/complex-type-template.java.ftlh
@@ -78,7 +78,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
     <#assign discriminatedChildType = type.asDiscriminatedComplexTypeDefinition().orElseThrow()>
     // Accessors for discriminator values.
     <#list discriminatedChildType.getDiscriminatorMap() as discriminatorName, discriminatorValue>
-        <#-- If the discriminator name matches that of another field, suppress the methods generation -->
+    <#-- If the discriminator name matches that of another field, suppress the methods generation -->
         <#if !discriminatedChildType.isNonDiscriminatorField(discriminatorName)><#--&& !discriminatedChildType.isParserArgument(discriminatorName)-->
             <#assign discriminatorType = helper.getDiscriminatorTypes()[discriminatorName]>
     public ${helper.getLanguageTypeNameForTypeReference(discriminatorType)} get${discriminatorName?cap_first}() {
@@ -226,14 +226,14 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
 </#list>
 
     <#if outputFlavor != "passive">
+<#if type.isDiscriminatedParentTypeDefinition()>
+    protected abstract void serialize${type.name?cap_first}Child(WriteBuffer writeBuffer) throws SerializationException;
+
+</#if>
 <#if type.isDiscriminatedChildTypeDefinition()>
     @Override
     protected void serialize${type.parentType.orElseThrow().name}Child(WriteBuffer writeBuffer) throws SerializationException {
 <#else>
-    <#if type.isDiscriminatedParentTypeDefinition()>
-    abstract protected void serialize${type.name?cap_first}Child(WriteBuffer writeBuffer) throws SerializationException;
-
-    </#if>
     public void serialize(WriteBuffer writeBuffer) throws SerializationException {
 </#if>
         PositionAware positionAware = writeBuffer;
@@ -592,7 +592,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
 <#-- Here come the actual parse and serialize methods that actually do the parsing and serlaizing -->
     <#assign hasParserArguments=parserArguments?has_content/>
     <#assign parserArgumentList><#if hasParserArguments><#list parserArguments as parserArgument>${helper.getLanguageTypeNameForTypeReference(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if></#assign>
-    public static ${type.name}<#if type.isDiscriminatedChildTypeDefinition()>Builder staticParseBuilder<#else> staticParse</#if>(ReadBuffer readBuffer<#if hasParserArguments>, ${parserArgumentList}</#if>) throws ParseException {
+    public static <#if type.isDiscriminatedChildTypeDefinition()>${type.parentType.orElseThrow().name}Builder staticParse${type.parentType.orElseThrow().name}Builder<#else>${type.name} staticParse</#if>(ReadBuffer readBuffer<#if hasParserArguments>, ${parserArgumentList}</#if>) throws ParseException {
         readBuffer.pullContext("${type.name}");
         PositionAware positionAware = readBuffer;
         int startPos = positionAware.getPos();
@@ -729,6 +729,8 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                                     true
                                 <#else>
                                     <#assign discriminatorExpression=switchField.discriminatorExpressions[discriminatorValueTerm?index].asLiteral().orElseThrow().asVariableLiteral().orElseThrow()>
+                                    <#--${helper.info("discriminator-name {}", discriminatorExpression.discriminatorName)}
+                                    ${helper.info("discriminator-types {}", helper.getDiscriminatorTypes())}-->
                                     <#assign discriminatorType=helper.getDiscriminatorTypes()[discriminatorExpression.discriminatorName]>
                                     EvaluationHelper.equals(
                                     ${helper.toParseExpression(switchField, discriminatorType, discriminatorExpression, parserArguments)},
@@ -747,7 +749,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
                     <@compress single_line=true>
                         <#assign hasCaseParseArguments=case.allParserArguments.isPresent() && case.allParserArguments.orElseThrow()?has_content>
                         <#assign caseParseArguments><#if hasCaseParseArguments><#list case.allParserArguments.orElseThrow() as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if></#assign>
-                        builder = ${case.name}.staticParseBuilder(readBuffer<#if hasCaseParseArguments>, ${tracer.dive("case parse arguments")} ${caseParseArguments}</#if>);
+                        builder = ${case.name}.staticParse${type.name}Builder(readBuffer<#if hasCaseParseArguments>, ${tracer.dive("case parse arguments")} ${caseParseArguments}</#if>);
                     </...@compress>
                     }<#sep> else </#sep>
                 </#list>
@@ -789,7 +791,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
     readBuffer.closeContext("${type.name}");
     // Create the instance
     <#if type.isDiscriminatedChildTypeDefinition()>
-        return new ${type.name}Builder(
+        return new ${type.name}BuilderImpl(
         <#list type.propertyFields as field>
             ${field.name}<#sep>, </#sep>
         </#list>
@@ -802,6 +804,9 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
         <#list reservedFields as reservedField>
             reservedField${reservedField?index}<#sep>, </#sep>
         </#list>
+        <#if type.parentType.isPresent() && type.isDiscriminatedChildTypeDefinition() && type.isDiscriminatedParentTypeDefinition()>
+            , builder
+        </#if>
         );
     <#elseif type.isDiscriminatedParentTypeDefinition()>
         ${type.name} _${type.name?uncap_first} = builder.build(
@@ -840,8 +845,14 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
     }
 
     <#if type.isDiscriminatedParentTypeDefinition()>
-        public static interface ${type.name}Builder {
+        public interface ${type.name}Builder {
             ${type.name} build(
+        <#if type.parentType.isPresent() && type.isDiscriminatedChildTypeDefinition() && type.isDiscriminatedParentTypeDefinition()>
+            <#list type.parentType.orElseThrow().asComplexTypeDefinition().orElseThrow().allPropertyFields as field>
+                ${helper.getLanguageTypeNameForField(field)} ${field.name}<#sep>, </#sep>
+            </#list>
+            <#if type.propertyFields?has_content || filteredParserArguments?has_content>,</#if>
+        </#if>
         <#list type.propertyFields as field>
             ${helper.getLanguageTypeNameForField(field)} ${field.name}<#sep>, </#sep>
             </#list>
@@ -856,7 +867,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
 
     </#if>
     <#if type.isDiscriminatedChildTypeDefinition()>
-        public static class ${type.name}Builder implements ${type.parentType.orElseThrow().name}.${type.parentType.orElseThrow().name}Builder {
+        public static class ${type.name}BuilderImpl implements ${type.parentType.orElseThrow().name}.${type.parentType.orElseThrow().name}Builder {
         <#if type.propertyFields?has_content>
             <#list type.propertyFields as field>
         private final ${helper.getLanguageTypeNameForField(field)} ${field.name};
@@ -870,8 +881,11 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
         <#list reservedFields as reservedField>
         private final ${helper.getLanguageTypeNameForTypeReference(reservedField.type, false)} reservedField${reservedField?index};
         </#list>
+        <#if type.parentType.isPresent() && type.isDiscriminatedChildTypeDefinition() && type.isDiscriminatedParentTypeDefinition()>
+        private final ${type.name}Builder builder;
+        </#if>
 
-        public ${type.name}Builder(
+        public ${type.name}BuilderImpl(
         <#list type.propertyFields as field>
             ${helper.getLanguageTypeNameForField(field)} ${field.name}<#sep>, </#sep>
         </#list>
@@ -885,6 +899,9 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
         <#list reservedFields as reservedField>
             ${helper.getLanguageTypeNameForTypeReference(reservedField.type, false)} reservedField${reservedField?index}<#sep>, </#sep>
         </#list>
+        <#if type.parentType.isPresent() && type.isDiscriminatedChildTypeDefinition() && type.isDiscriminatedParentTypeDefinition()>
+            , ${type.name}Builder builder
+        </#if>
         ) {
         <#list type.propertyFields as field>
             this.${field.name} = ${field.name};
@@ -897,19 +914,39 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
         <#list reservedFields as reservedField>
             this.reservedField${reservedField?index} = reservedField${reservedField?index};
         </#list>
+        <#if type.parentType.isPresent() && type.isDiscriminatedChildTypeDefinition() && type.isDiscriminatedParentTypeDefinition()>
+            this.builder = builder;
+        </#if>
         }
 
         public ${type.name} build(
-        <#list type.parentType.orElseThrow().asComplexTypeDefinition().orElseThrow().propertyFields as field>
+        <#list type.parentType.orElseThrow().asComplexTypeDefinition().orElseThrow().allPropertyFields as field>
             ${helper.getLanguageTypeNameForField(field)} ${field.name}<#sep>, </#sep>
         </#list>
         <#if filteredParentParserArguments?has_content>
             <#if type.parentType.orElseThrow().asComplexTypeDefinition().orElseThrow().propertyFields?has_content>, </#if>
-                <#list filteredParentParserArguments as arg>
+            <#list filteredParentParserArguments as arg>
                 ${helper.getLanguageTypeNameForTypeReference(arg.type)} ${arg.name}<#sep>, </#sep>
+            </#list>
+        </#if>
+        ) {
+        <#if type.parentType.isPresent() && type.isDiscriminatedChildTypeDefinition() && type.isDiscriminatedParentTypeDefinition()>
+            return builder.build(
+            <#list type.parentType.orElseThrow().asComplexTypeDefinition().orElseThrow().allPropertyFields as field>
+                ${field.name}<#sep>, </#sep>
+            </#list>
+            <#if type.parentType.orElseThrow().asComplexTypeDefinition().orElseThrow().allPropertyFields?has_content>, </#if>
+            <#list type.propertyFields as field>
+                ${field.name}<#sep>, </#sep>
+            </#list>
+            <#if filteredParentParserArguments?has_content>
+                <#if type.parentType.orElseThrow().asComplexTypeDefinition().orElseThrow().allPropertyFields?has_content>, </#if>
+                <#list filteredParentParserArguments as arg>
+                    ${arg.name}<#sep>, </#sep>
                 </#list>
             </#if>
-        ) {
+            );
+        <#else>
             ${type.name} ${type.name?uncap_first} = new ${type.name}(
             <#list type.allPropertyFields as field>
                 ${field.name}<#sep>, </#sep>
@@ -924,6 +961,7 @@ public<#if type.isDiscriminatedParentTypeDefinition()> abstract</#if> class ${ty
             ${type.name?uncap_first}.reservedField${reservedField?index} = reservedField${reservedField?index};
         </#list>
             return ${type.name?uncap_first};
+        </#if>
         }
     }
 
diff --git a/code-generation/pom.xml b/code-generation/pom.xml
index 2eee34a58f..9a114d007d 100644
--- a/code-generation/pom.xml
+++ b/code-generation/pom.xml
@@ -35,9 +35,9 @@
 
   <modules>
     <module>language-base-freemarker</module>
+    <module>language-java</module>
     <module>protocol-base-mspec</module>
     <module>protocol-test</module>
-    <module>language-java</module>
   </modules>
 
   <profiles>
@@ -68,6 +68,13 @@
         <module>language-python</module>
       </modules>
     </profile>
+
+    <profile>
+      <id>enable-all-checks</id>
+      <modules>
+        <module>tests</module>
+      </modules>
+    </profile>
   </profiles>
 
   <dependencies>
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
index ef4edd9175..3615bcaad3 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
@@ -33,8 +33,8 @@ public class DefaultDiscriminatedComplexTypeDefinition extends DefaultComplexTyp
 
     private final List<Term> discriminatorValueTerms;
 
-    public DefaultDiscriminatedComplexTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments, List<Term> discriminatorValueTerms, List<Field> fields) {
-        super(name, attributes, parserArguments, false, fields);
+    public DefaultDiscriminatedComplexTypeDefinition(String name, Map<String, Term> attributes, List<Argument> parserArguments, boolean isAbstract, List<Field> fields, List<Term> discriminatorValueTerms) {
+        super(name, attributes, parserArguments, isAbstract, fields);
         this.discriminatorValueTerms = Objects.requireNonNull(discriminatorValueTerms);
     }
 
diff --git a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index b3b33bb208..4f58055b5d 100644
--- a/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/code-generation/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -74,7 +74,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
         return enumContexts;
     }
 
-    private String currentTypeName;
+    private Stack<String> currentTypeName = new Stack<>();
 
     public MessageFormatListener() {
         types = new HashMap<>();
@@ -94,7 +94,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
 
     @Override
     public void enterComplexType(MSpecParser.ComplexTypeContext ctx) {
-        currentTypeName = getIdString(ctx.name);
+        currentTypeName.push(getIdString(ctx.name));
         // Set a map of attributes that should be set for all fields.
         Map<String, Term> curBatchSetAttributes = new HashMap<>();
         // Add all attributes defined in the current batchSet field.
@@ -164,12 +164,19 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
             dispatchType(typeName, type);
 
             // Set the parent type for all sub-types.
-            if (switchField != null) {
-                for (DiscriminatedComplexTypeDefinition subtype : switchField.getCases()) {
-                    if (subtype instanceof DefaultDiscriminatedComplexTypeDefinition) {
-                        LOGGER.debug("Setting parent {} for {}", type, subtype);
-                        ((DefaultDiscriminatedComplexTypeDefinition) subtype).setParentType(type);
-                    }
+            setParentRelationship(type);
+        }
+        currentTypeName.pop();
+    }
+
+    protected void setParentRelationship(DefaultComplexTypeDefinition type) {
+        Optional<SwitchField> switchField = type.getSwitchField();
+        if (switchField.isPresent()) {
+            for (DiscriminatedComplexTypeDefinition subtype : switchField.get().getCases()) {
+                if (subtype instanceof DefaultDiscriminatedComplexTypeDefinition) {
+                    LOGGER.debug("Setting parent {} for {}", type, subtype);
+                    ((DefaultDiscriminatedComplexTypeDefinition) subtype).setParentType(type);
+                    setParentRelationship((DefaultDiscriminatedComplexTypeDefinition) subtype);
                 }
             }
         }
@@ -512,17 +519,33 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
     @Override
     public void enterCaseStatement(MSpecParser.CaseStatementContext ctx) {
         List<Field> parserContext = new LinkedList<>();
+
+        // Calculate the name of the current type
+        String namePrefix = "";
+        if(ctx.nameWildcard != null) {
+            namePrefix = getCurrentTypeName();
+        }
+        String typeName = namePrefix + ctx.name.getText();
+
+        currentTypeName.push(typeName);
+        // For DataIo we don't generate types.
+        if (ctx.parent.parent instanceof MSpecParser.DataIoDefinitionContext) {
+            currentTypeName.pop();
+        }
+
         parserContexts.push(parserContext);
     }
 
     @Override
     public void exitCaseStatement(MSpecParser.CaseStatementContext ctx) {
-        String namePrefix = "";
-        // TODO: maybe name this prefix and suffix wildcard
-        if (ctx.nameWildcard != null) {
-            namePrefix = currentTypeName;
+        String typeName = currentTypeName.pop();
+        // For DataIo we don't generate types.
+        if (ctx.parent.parent instanceof MSpecParser.DataIoDefinitionContext) {
+            currentTypeName.push(typeName);
+            typeName = ctx.name.getText();
         }
-        String typeName = namePrefix + ctx.name.getText();
+
+        boolean abstractType = getSwitchField() != null;
 
         final Map<String, Term> attributes = batchSetAttributes.peek();
 
@@ -548,8 +571,8 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
         }
         final List<Field> fields = parserContexts.pop();
         DefaultDiscriminatedComplexTypeDefinition type =
-            new DefaultDiscriminatedComplexTypeDefinition(typeName, attributes, parserArguments,
-                discriminatorValues, fields);
+            new DefaultDiscriminatedComplexTypeDefinition(typeName, attributes, parserArguments, abstractType,
+                fields, discriminatorValues);
         // Link the fields and the complex types.
         if (fields != null) {
             fields.forEach(field -> ((DefaultField) field).setOwner(type));
@@ -620,8 +643,8 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
         Objects.requireNonNull(expressionString, "Expression string should not be null");
         InputStream inputStream = IOUtils.toInputStream(expressionString, Charset.defaultCharset());
 
-        Objects.requireNonNull(currentTypeName, "expression term can only occur within a type");
-        ExpressionStringParser parser = new ExpressionStringParser(this, currentTypeName);
+        Objects.requireNonNull(getCurrentTypeName(), "expression term can only occur within a type");
+        ExpressionStringParser parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
             return parser.parse(inputStream);
         } catch (Exception e) {
@@ -634,7 +657,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
         // TODO: make nullsafe
         final String variableLiteral = variableLiteralContext.getText();
         InputStream inputStream = IOUtils.toInputStream(variableLiteral, Charset.defaultCharset());
-        ExpressionStringParser parser = new ExpressionStringParser(this, currentTypeName);
+        ExpressionStringParser parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
             // As this come from a VariableLiteralContext we know that it is a VariableLiteral
             return (VariableLiteral) parser.parse(inputStream);
@@ -648,7 +671,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
         // TODO: make nullsafe
         final String valueLiteralContextText = valueLiteralContext.getText();
         InputStream inputStream = IOUtils.toInputStream(valueLiteralContextText, Charset.defaultCharset());
-        ExpressionStringParser parser = new ExpressionStringParser(this, currentTypeName);
+        ExpressionStringParser parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
             // As this come from a ValueLiteralContext we know that it is a Literal
             return (Literal) parser.parse(inputStream);
@@ -794,7 +817,7 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
 
     private Term parseExpression(String expressionString) {
         InputStream inputStream = IOUtils.toInputStream(expressionString, Charset.defaultCharset());
-        ExpressionStringParser parser = new ExpressionStringParser(this, currentTypeName);
+        ExpressionStringParser parser = new ExpressionStringParser(this, getCurrentTypeName());
         try {
             return parser.parse(inputStream);
         } catch (Exception e) {
@@ -802,6 +825,13 @@ public class MessageFormatListener extends MSpecBaseListener implements LazyType
         }
     }
 
+    private String getCurrentTypeName() {
+        if(currentTypeName.isEmpty()) {
+            return null;
+        }
+        return currentTypeName.peek();
+    }
+
     private Map<String, Term> getAttributes(RuleContext ctx) {
         Map<String, Term> attributes = new HashMap<>();
         // Add any attributes from the current batchSet context.
diff --git a/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec b/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec
index 7e3ecdc45a..d07acc5cc7 100644
--- a/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec
+++ b/code-generation/protocol-test/src/main/resources/protocols/test/test.mspec
@@ -471,6 +471,71 @@
     ]
 ]
 
+////////////////////////////////////////////////////////////////
+// TypeSwitch in TypeSwitch
+////////////////////////////////////////////////////////////////
+
+/* Needs to be ported to C and GO
+[discriminatedType TypeSwitchInTypeSwitchParentType
+    [discriminator uint 8 typeNumber]
+    [simple uint 8 parentFieldHurz]
+    [typeSwitch typeNumber
+        ['0x00' *Child0
+            [discriminator uint 8 childNumber]
+            [simple uint 8 childFieldwolf]
+            [typeSwitch childNumber
+                ['0x01' *Infant0
+                    [discriminator uint 8 infantNumber]
+                    [simple uint 8 infantSomeField00]
+                    [typeSwitch infantNumber
+                        ['0x98' *InfantsChild0
+                            [simple uint 8 infantsChild0SomeField00]
+                        ]
+                        ['0x99' *InfantsChild1
+                            [simple uint 8 infantsChild1SomeField00]
+                        ]
+                    ]
+                ]
+                ['0x02' *Infant1
+                    [simple uint 8 infantSomeField01]
+                ]
+                ['0x03' *Infant2
+                    [simple uint 8 infantSomeField02]
+                ]
+            ]
+        ]
+        ['0x10' *Child1
+            [discriminator uint 8 childNumber]
+            [simple uint 8 childFieldLamm]
+            [typeSwitch childNumber
+                ['0x11' *Infant3
+                    [simple uint 8 infantSomeField1ß]
+                ]
+                ['0x12' *Infant4
+                    [simple uint 8 infantSomeField11]
+                ]
+                ['0x13' *Infant5
+                    [simple uint 8 infantSomeField12]
+                ]
+            ]
+        ]
+        ['0x20' *Child2
+            [discriminator uint 8 childNumber]
+            [simple uint 8 childFieldGrueneWiese]
+            [typeSwitch childNumber
+                ['0x21' *Infant6
+                    [simple uint 8 infantSomeField21]
+                ]
+                ['0x22' *Infant7
+                    [simple uint 8 infantSomeField22]
+                ]
+                ['0x23' *Infant8
+                    [simple uint 8 infantSomeField23]
+                ]
+            ]
+        ]
+    ]
+]*/
 
 ////////////////////////////////////////////////////////////////
 // Missing Tests
diff --git a/code-generation/pom.xml b/code-generation/tests/pom.xml
similarity index 80%
copy from code-generation/pom.xml
copy to code-generation/tests/pom.xml
index 2eee34a58f..54edd136e9 100644
--- a/code-generation/pom.xml
+++ b/code-generation/tests/pom.xml
@@ -23,49 +23,42 @@
 
   <parent>
     <groupId>org.apache.plc4x</groupId>
-    <artifactId>plc4x-parent</artifactId>
+    <artifactId>plc4x-code-generation</artifactId>
     <version>0.11.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4x-code-generation</artifactId>
+  <artifactId>plc4x-code-generation-tests</artifactId>
   <packaging>pom</packaging>
 
-  <name>Code-Generation</name>
-  <description>Home of the PLC4X code-generation framework.</description>
+  <name>Code-Generation Tests</name>
+  <description>Tests for the various code-generation modules</description>
 
   <modules>
-    <module>language-base-freemarker</module>
-    <module>protocol-base-mspec</module>
-    <module>protocol-test</module>
-    <module>language-java</module>
+    <module>protocol-test-java</module>
   </modules>
 
   <profiles>
     <profile>
       <id>with-c</id>
       <modules>
-        <module>language-c</module>
       </modules>
     </profile>
 
     <profile>
       <id>with-dotnet</id>
       <modules>
-        <module>language-cs</module>
       </modules>
     </profile>
 
     <profile>
       <id>with-go</id>
       <modules>
-        <module>language-go</module>
       </modules>
     </profile>
 
     <profile>
       <id>with-python</id>
       <modules>
-        <module>language-python</module>
       </modules>
     </profile>
   </profiles>
diff --git a/code-generation/tests/protocol-test-java/pom.xml b/code-generation/tests/protocol-test-java/pom.xml
new file mode 100644
index 0000000000..58324964bc
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/pom.xml
@@ -0,0 +1,158 @@
+<?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.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4x-code-generation-tests</artifactId>
+    <version>0.11.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>plc4x-code-generation-protocol-test-java</artifactId>
+
+  <name>Code-Generation: Protocol Test: Test Java</name>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.plc4x.plugins</groupId>
+        <artifactId>plc4x-maven-plugin</artifactId>
+        <version>${plc4x-code-generation.version}</version>
+        <executions>
+          <execution>
+            <id>generate-driver</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>generate-driver</goal>
+            </goals>
+            <configuration>
+              <protocolName>test</protocolName>
+              <languageName>java</languageName>
+              <outputFlavor>read-write</outputFlavor>
+              <outputDir>src/main/generated</outputDir>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4x-code-generation-language-java</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4x-code-generation-protocol-test</usedDependency>
+          </usedDependencies>
+        </configuration>
+      </plugin>
+
+      <!--
+          Make the failsafe execute all integration-tests
+        -->
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-failsafe-plugin</artifactId>
+        <executions>
+          <execution>
+            <goals>
+              <goal>integration-test</goal>
+              <goal>verify</goal>
+            </goals>
+          </execution>
+        </executions>
+        <configuration>
+          <!--
+                Notice the @ instead of the $ as prefix? That's late evaluation.
+          -->
+          <!--argLine>@{failsafeArgLine}</argLine-->
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
+<dependencies>
+  <dependency>
+    <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4j-api</artifactId>
+    <version>0.11.0-SNAPSHOT</version>
+  </dependency>
+
+  <dependency>
+    <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4j-spi</artifactId>
+    <version>0.11.0-SNAPSHOT</version>
+  </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-transport-tcp</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-buffer</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-utils-test-utils</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-code-generation-language-java</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+      <!-- Scope is 'provided' as this way it's not shipped with the driver -->
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-code-generation-protocol-test</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-code-generation-protocol-test</artifactId>
+      <version>0.11.0-SNAPSHOT</version>
+      <classifier>tests</classifier>
+      <type>test-jar</type>
+      <scope>test</scope>
+    </dependency>
+
+  </dependencies>
+
+</project>
+
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTest.java
similarity index 61%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTest.java
index 1efa15bf0c..a76523e176 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.s7.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,30 +35,49 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class S7ParameterUserDataItem implements Message {
+public abstract class AbstractTypeTest implements Message {
 
   // Abstract accessors for discriminator values.
-  public abstract Short getItemType();
 
-  public S7ParameterUserDataItem() {
+  // Properties.
+  protected final short simpleField;
+
+  public AbstractTypeTest(short simpleField) {
     super();
+    this.simpleField = simpleField;
+  }
+
+  public abstract boolean getAbstractBitField();
+
+  public abstract byte getAbstractIntField();
+
+  public abstract short getAbstractUintField();
+
+  public abstract float getAbstractFloatField();
+
+  public abstract double getAbstractDoubleField();
+
+  public abstract String getAbstractStringField();
+
+  public short getSimpleField() {
+    return simpleField;
   }
 
-  protected abstract void serializeS7ParameterUserDataItemChild(WriteBuffer writeBuffer)
+  protected abstract void serializeAbstractTypeTestChild(WriteBuffer writeBuffer)
       throws SerializationException;
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7ParameterUserDataItem");
+    writeBuffer.pushContext("AbstractTypeTest");
 
-    // Discriminator Field (itemType) (Used as input to a switch field)
-    writeDiscriminatorField("itemType", getItemType(), writeUnsignedShort(writeBuffer, 8));
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
 
     // Switch field (Serialize the sub-type)
-    serializeS7ParameterUserDataItemChild(writeBuffer);
+    serializeAbstractTypeTestChild(writeBuffer);
 
-    writeBuffer.popContext("S7ParameterUserDataItem");
+    writeBuffer.popContext("AbstractTypeTest");
   }
 
   @Override
@@ -69,9 +88,9 @@ public abstract class S7ParameterUserDataItem implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    S7ParameterUserDataItem _value = this;
+    AbstractTypeTest _value = this;
 
-    // Discriminator Field (itemType)
+    // Simple field (simpleField)
     lengthInBits += 8;
 
     // Length of sub-type elements will be added by sub-type...
@@ -79,42 +98,42 @@ public abstract class S7ParameterUserDataItem implements Message {
     return lengthInBits;
   }
 
-  public static S7ParameterUserDataItem staticParse(ReadBuffer readBuffer, Object... args)
+  public static AbstractTypeTest staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static S7ParameterUserDataItem staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("S7ParameterUserDataItem");
+  public static AbstractTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AbstractTypeTest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short itemType = readDiscriminatorField("itemType", readUnsignedShort(readBuffer, 8));
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    S7ParameterUserDataItemBuilder builder = null;
-    if (EvaluationHelper.equals(itemType, (short) 0x12)) {
-      builder = S7ParameterUserDataItemCPUFunctions.staticParseBuilder(readBuffer);
+    AbstractTypeTestBuilder builder = null;
+    if (EvaluationHelper.equals(simpleField, (short) 0)) {
+      builder = AbstractTypeTestSubType.staticParseAbstractTypeTestBuilder(readBuffer);
     }
     if (builder == null) {
       throw new ParseException(
           "Unsupported case for discriminated type"
               + " parameters ["
-              + "itemType="
-              + itemType
+              + "simpleField="
+              + simpleField
               + "]");
     }
 
-    readBuffer.closeContext("S7ParameterUserDataItem");
+    readBuffer.closeContext("AbstractTypeTest");
     // Create the instance
-    S7ParameterUserDataItem _s7ParameterUserDataItem = builder.build();
-    return _s7ParameterUserDataItem;
+    AbstractTypeTest _abstractTypeTest = builder.build(simpleField);
+    return _abstractTypeTest;
   }
 
-  public static interface S7ParameterUserDataItemBuilder {
-    S7ParameterUserDataItem build();
+  public interface AbstractTypeTestBuilder {
+    AbstractTypeTest build(short simpleField);
   }
 
   @Override
@@ -122,16 +141,16 @@ public abstract class S7ParameterUserDataItem implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7ParameterUserDataItem)) {
+    if (!(o instanceof AbstractTypeTest)) {
       return false;
     }
-    S7ParameterUserDataItem that = (S7ParameterUserDataItem) o;
-    return true;
+    AbstractTypeTest that = (AbstractTypeTest) o;
+    return (getSimpleField() == that.getSimpleField()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash();
+    return Objects.hash(getSimpleField());
   }
 
   @Override
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTestSubType.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTestSubType.java
new file mode 100644
index 0000000000..a5fad8a786
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTestSubType.java
@@ -0,0 +1,261 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class AbstractTypeTestSubType extends AbstractTypeTest implements Message {
+
+  // Accessors for discriminator values.
+
+  // Properties.
+  protected final boolean abstractBitField;
+  protected final byte abstractIntField;
+  protected final short abstractUintField;
+  protected final float abstractFloatField;
+  protected final double abstractDoubleField;
+  protected final String abstractStringField;
+
+  public AbstractTypeTestSubType(
+      short simpleField,
+      boolean abstractBitField,
+      byte abstractIntField,
+      short abstractUintField,
+      float abstractFloatField,
+      double abstractDoubleField,
+      String abstractStringField) {
+    super(simpleField);
+    this.abstractBitField = abstractBitField;
+    this.abstractIntField = abstractIntField;
+    this.abstractUintField = abstractUintField;
+    this.abstractFloatField = abstractFloatField;
+    this.abstractDoubleField = abstractDoubleField;
+    this.abstractStringField = abstractStringField;
+  }
+
+  public boolean getAbstractBitField() {
+    return abstractBitField;
+  }
+
+  public byte getAbstractIntField() {
+    return abstractIntField;
+  }
+
+  public short getAbstractUintField() {
+    return abstractUintField;
+  }
+
+  public float getAbstractFloatField() {
+    return abstractFloatField;
+  }
+
+  public double getAbstractDoubleField() {
+    return abstractDoubleField;
+  }
+
+  public String getAbstractStringField() {
+    return abstractStringField;
+  }
+
+  @Override
+  protected void serializeAbstractTypeTestChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("AbstractTypeTestSubType");
+
+    // Simple Field (abstractBitField)
+    writeSimpleField("abstractBitField", abstractBitField, writeBoolean(writeBuffer));
+
+    // Simple Field (abstractIntField)
+    writeSimpleField("abstractIntField", abstractIntField, writeSignedByte(writeBuffer, 8));
+
+    // Simple Field (abstractUintField)
+    writeSimpleField("abstractUintField", abstractUintField, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (abstractFloatField)
+    writeSimpleField("abstractFloatField", abstractFloatField, writeFloat(writeBuffer, 32));
+
+    // Simple Field (abstractDoubleField)
+    writeSimpleField("abstractDoubleField", abstractDoubleField, writeDouble(writeBuffer, 64));
+
+    // Simple Field (abstractStringField)
+    writeSimpleField("abstractStringField", abstractStringField, writeString(writeBuffer, 8));
+
+    writeBuffer.popContext("AbstractTypeTestSubType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    AbstractTypeTestSubType _value = this;
+
+    // Simple field (abstractBitField)
+    lengthInBits += 1;
+
+    // Simple field (abstractIntField)
+    lengthInBits += 8;
+
+    // Simple field (abstractUintField)
+    lengthInBits += 8;
+
+    // Simple field (abstractFloatField)
+    lengthInBits += 32;
+
+    // Simple field (abstractDoubleField)
+    lengthInBits += 64;
+
+    // Simple field (abstractStringField)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static AbstractTypeTestBuilder staticParseAbstractTypeTestBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("AbstractTypeTestSubType");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    boolean abstractBitField = readSimpleField("abstractBitField", readBoolean(readBuffer));
+
+    byte abstractIntField = readSimpleField("abstractIntField", readSignedByte(readBuffer, 8));
+
+    short abstractUintField =
+        readSimpleField("abstractUintField", readUnsignedShort(readBuffer, 8));
+
+    float abstractFloatField = readSimpleField("abstractFloatField", readFloat(readBuffer, 32));
+
+    double abstractDoubleField = readSimpleField("abstractDoubleField", readDouble(readBuffer, 64));
+
+    String abstractStringField = readSimpleField("abstractStringField", readString(readBuffer, 8));
+
+    readBuffer.closeContext("AbstractTypeTestSubType");
+    // Create the instance
+    return new AbstractTypeTestSubTypeBuilderImpl(
+        abstractBitField,
+        abstractIntField,
+        abstractUintField,
+        abstractFloatField,
+        abstractDoubleField,
+        abstractStringField);
+  }
+
+  public static class AbstractTypeTestSubTypeBuilderImpl
+      implements AbstractTypeTest.AbstractTypeTestBuilder {
+    private final boolean abstractBitField;
+    private final byte abstractIntField;
+    private final short abstractUintField;
+    private final float abstractFloatField;
+    private final double abstractDoubleField;
+    private final String abstractStringField;
+
+    public AbstractTypeTestSubTypeBuilderImpl(
+        boolean abstractBitField,
+        byte abstractIntField,
+        short abstractUintField,
+        float abstractFloatField,
+        double abstractDoubleField,
+        String abstractStringField) {
+
+      this.abstractBitField = abstractBitField;
+      this.abstractIntField = abstractIntField;
+      this.abstractUintField = abstractUintField;
+      this.abstractFloatField = abstractFloatField;
+      this.abstractDoubleField = abstractDoubleField;
+      this.abstractStringField = abstractStringField;
+    }
+
+    public AbstractTypeTestSubType build(short simpleField) {
+      AbstractTypeTestSubType abstractTypeTestSubType =
+          new AbstractTypeTestSubType(
+              simpleField,
+              abstractBitField,
+              abstractIntField,
+              abstractUintField,
+              abstractFloatField,
+              abstractDoubleField,
+              abstractStringField);
+      return abstractTypeTestSubType;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AbstractTypeTestSubType)) {
+      return false;
+    }
+    AbstractTypeTestSubType that = (AbstractTypeTestSubType) o;
+    return (getAbstractBitField() == that.getAbstractBitField())
+        && (getAbstractIntField() == that.getAbstractIntField())
+        && (getAbstractUintField() == that.getAbstractUintField())
+        && (getAbstractFloatField() == that.getAbstractFloatField())
+        && (getAbstractDoubleField() == that.getAbstractDoubleField())
+        && (getAbstractStringField() == that.getAbstractStringField())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(),
+        getAbstractBitField(),
+        getAbstractIntField(),
+        getAbstractUintField(),
+        getAbstractFloatField(),
+        getAbstractDoubleField(),
+        getAbstractStringField());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ArrayTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ArrayTypeTest.java
new file mode 100644
index 0000000000..411b449ec2
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ArrayTypeTest.java
@@ -0,0 +1,248 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class ArrayTypeTest implements Message {
+
+  // Properties.
+  protected final List<Boolean> bitField;
+  protected final byte[] byteField;
+  protected final List<Byte> intField;
+  protected final List<Short> uintField;
+  protected final List<Float> floatField;
+  protected final List<Double> doubleField;
+  protected final List<String> stringField;
+
+  public ArrayTypeTest(
+      List<Boolean> bitField,
+      byte[] byteField,
+      List<Byte> intField,
+      List<Short> uintField,
+      List<Float> floatField,
+      List<Double> doubleField,
+      List<String> stringField) {
+    super();
+    this.bitField = bitField;
+    this.byteField = byteField;
+    this.intField = intField;
+    this.uintField = uintField;
+    this.floatField = floatField;
+    this.doubleField = doubleField;
+    this.stringField = stringField;
+  }
+
+  public List<Boolean> getBitField() {
+    return bitField;
+  }
+
+  public byte[] getByteField() {
+    return byteField;
+  }
+
+  public List<Byte> getIntField() {
+    return intField;
+  }
+
+  public List<Short> getUintField() {
+    return uintField;
+  }
+
+  public List<Float> getFloatField() {
+    return floatField;
+  }
+
+  public List<Double> getDoubleField() {
+    return doubleField;
+  }
+
+  public List<String> getStringField() {
+    return stringField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ArrayTypeTest");
+
+    // Array Field (bitField)
+    writeSimpleTypeArrayField("bitField", bitField, writeBoolean(writeBuffer));
+
+    // Array Field (byteField)
+    writeByteArrayField("byteField", byteField, writeByteArray(writeBuffer, 8));
+
+    // Array Field (intField)
+    writeSimpleTypeArrayField("intField", intField, writeSignedByte(writeBuffer, 8));
+
+    // Array Field (uintField)
+    writeSimpleTypeArrayField("uintField", uintField, writeUnsignedShort(writeBuffer, 8));
+
+    // Array Field (floatField)
+    writeSimpleTypeArrayField("floatField", floatField, writeFloat(writeBuffer, 32));
+
+    // Array Field (doubleField)
+    writeSimpleTypeArrayField("doubleField", doubleField, writeDouble(writeBuffer, 64));
+
+    // Array Field (stringField)
+    writeSimpleTypeArrayField("stringField", stringField, writeString(writeBuffer, 8));
+
+    writeBuffer.popContext("ArrayTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ArrayTypeTest _value = this;
+
+    // Array field
+    if (bitField != null) {
+      lengthInBits += 1 * bitField.size();
+    }
+
+    // Array field
+    if (byteField != null) {
+      lengthInBits += 8 * byteField.length;
+    }
+
+    // Array field
+    if (intField != null) {
+      lengthInBits += 8 * intField.size();
+    }
+
+    // Array field
+    if (uintField != null) {
+      lengthInBits += 8 * uintField.size();
+    }
+
+    // Array field
+    if (floatField != null) {
+      lengthInBits += 32 * floatField.size();
+    }
+
+    // Array field
+    if (doubleField != null) {
+      lengthInBits += 64 * doubleField.size();
+    }
+
+    // Array field
+    if (stringField != null) {
+      lengthInBits += 8 * stringField.size();
+    }
+
+    return lengthInBits;
+  }
+
+  public static ArrayTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ArrayTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ArrayTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    List<Boolean> bitField = readCountArrayField("bitField", readBoolean(readBuffer), 5);
+
+    byte[] byteField = readBuffer.readByteArray("byteField", Math.toIntExact(5));
+
+    List<Byte> intField = readCountArrayField("intField", readSignedByte(readBuffer, 8), 5);
+
+    List<Short> uintField = readCountArrayField("uintField", readUnsignedShort(readBuffer, 8), 5);
+
+    List<Float> floatField = readCountArrayField("floatField", readFloat(readBuffer, 32), 5);
+
+    List<Double> doubleField = readCountArrayField("doubleField", readDouble(readBuffer, 64), 5);
+
+    List<String> stringField = readCountArrayField("stringField", readString(readBuffer, 8), 5);
+
+    readBuffer.closeContext("ArrayTypeTest");
+    // Create the instance
+    ArrayTypeTest _arrayTypeTest;
+    _arrayTypeTest =
+        new ArrayTypeTest(
+            bitField, byteField, intField, uintField, floatField, doubleField, stringField);
+    return _arrayTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ArrayTypeTest)) {
+      return false;
+    }
+    ArrayTypeTest that = (ArrayTypeTest) o;
+    return (getBitField() == that.getBitField())
+        && (getByteField() == that.getByteField())
+        && (getIntField() == that.getIntField())
+        && (getUintField() == that.getUintField())
+        && (getFloatField() == that.getFloatField())
+        && (getDoubleField() == that.getDoubleField())
+        && (getStringField() == that.getStringField())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getBitField(),
+        getByteField(),
+        getIntField(),
+        getUintField(),
+        getFloatField(),
+        getDoubleField(),
+        getStringField());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/CheckSumTypeTest.java
similarity index 59%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/CheckSumTypeTest.java
index 4fbed10ec8..30e53828fd 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/CheckSumTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.s7.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,30 +35,30 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class S7Address implements Message {
+public class CheckSumTypeTest implements Message {
 
-  // Abstract accessors for discriminator values.
-  public abstract Short getAddressType();
-
-  public S7Address() {
+  public CheckSumTypeTest() {
     super();
   }
 
-  protected abstract void serializeS7AddressChild(WriteBuffer writeBuffer)
-      throws SerializationException;
-
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7Address");
+    writeBuffer.pushContext("CheckSumTypeTest");
 
-    // Discriminator Field (addressType) (Used as input to a switch field)
-    writeDiscriminatorField("addressType", getAddressType(), writeUnsignedShort(writeBuffer, 8));
+    // Checksum Field (checksum) (Calculated)
+    writeChecksumField(
+        "intField",
+        (byte) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcInt8(-(23))),
+        writeSignedByte(writeBuffer, 8));
 
-    // Switch field (Serialize the sub-type)
-    serializeS7AddressChild(writeBuffer);
+    // Checksum Field (checksum) (Calculated)
+    writeChecksumField(
+        "uintField",
+        (short) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcUint8(42)),
+        writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("S7Address");
+    writeBuffer.popContext("CheckSumTypeTest");
   }
 
   @Override
@@ -69,51 +69,46 @@ public abstract class S7Address implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    S7Address _value = this;
+    CheckSumTypeTest _value = this;
 
-    // Discriminator Field (addressType)
+    // Checksum Field (checksum)
     lengthInBits += 8;
 
-    // Length of sub-type elements will be added by sub-type...
+    // Checksum Field (checksum)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+  public static CheckSumTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("S7Address");
+  public static CheckSumTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("CheckSumTypeTest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short addressType = readDiscriminatorField("addressType", readUnsignedShort(readBuffer, 8));
+    byte intField =
+        readChecksumField(
+            "intField",
+            readSignedByte(readBuffer, 8),
+            (byte) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcInt8(-(23))));
 
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    S7AddressBuilder builder = null;
-    if (EvaluationHelper.equals(addressType, (short) 0x10)) {
-      builder = S7AddressAny.staticParseBuilder(readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "addressType="
-              + addressType
-              + "]");
-    }
+    short uintField =
+        readChecksumField(
+            "uintField",
+            readUnsignedShort(readBuffer, 8),
+            (short) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcUint8(42)));
 
-    readBuffer.closeContext("S7Address");
+    readBuffer.closeContext("CheckSumTypeTest");
     // Create the instance
-    S7Address _s7Address = builder.build();
-    return _s7Address;
-  }
-
-  public static interface S7AddressBuilder {
-    S7Address build();
+    CheckSumTypeTest _checkSumTypeTest;
+    _checkSumTypeTest = new CheckSumTypeTest();
+    return _checkSumTypeTest;
   }
 
   @Override
@@ -121,10 +116,10 @@ public abstract class S7Address implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7Address)) {
+    if (!(o instanceof CheckSumTypeTest)) {
       return false;
     }
-    S7Address that = (S7Address) o;
+    CheckSumTypeTest that = (CheckSumTypeTest) o;
     return true;
   }
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageA.java
similarity index 60%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageA.java
index a4b2a26fcb..d3b3c8a8f2 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageA.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,28 +35,29 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
+public class ComplexOfComplexUsageA implements Message {
 
-  // Accessors for discriminator values.
-  public PnDcp_BlockOptions getOption() {
-    return PnDcp_BlockOptions.ALL_SELECTOR_OPTION;
-  }
+  // Properties.
+  protected final ComplexOfComplexUsageB b;
 
-  public Short getSuboption() {
-    return (short) 0xFF;
+  public ComplexOfComplexUsageA(ComplexOfComplexUsageB b) {
+    super();
+    this.b = b;
   }
 
-  public PnDcp_Block_ALLSelector() {
-    super();
+  public ComplexOfComplexUsageB getB() {
+    return b;
   }
 
-  @Override
-  protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("PnDcp_Block_ALLSelector");
+    writeBuffer.pushContext("ComplexOfComplexUsageA");
 
-    writeBuffer.popContext("PnDcp_Block_ALLSelector");
+    // Simple Field (b)
+    writeSimpleField("b", b, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("ComplexOfComplexUsageA");
   }
 
   @Override
@@ -66,32 +67,38 @@ public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    PnDcp_Block_ALLSelector _value = this;
+    int lengthInBits = 0;
+    ComplexOfComplexUsageA _value = this;
+
+    // Simple field (b)
+    lengthInBits += b.getLengthInBits();
 
     return lengthInBits;
   }
 
-  public static PnDcp_Block_ALLSelectorBuilder staticParseBuilder(ReadBuffer readBuffer)
+  public static ComplexOfComplexUsageA staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("PnDcp_Block_ALLSelector");
     PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    readBuffer.closeContext("PnDcp_Block_ALLSelector");
-    // Create the instance
-    return new PnDcp_Block_ALLSelectorBuilder();
+    return staticParse(readBuffer);
   }
 
-  public static class PnDcp_Block_ALLSelectorBuilder implements PnDcp_Block.PnDcp_BlockBuilder {
+  public static ComplexOfComplexUsageA staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageA");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
 
-    public PnDcp_Block_ALLSelectorBuilder() {}
+    ComplexOfComplexUsageB b =
+        readSimpleField(
+            "b",
+            new DataReaderComplexDefault<>(
+                () -> ComplexOfComplexUsageB.staticParse(readBuffer), readBuffer));
 
-    public PnDcp_Block_ALLSelector build() {
-      PnDcp_Block_ALLSelector pnDcp_Block_ALLSelector = new PnDcp_Block_ALLSelector();
-      return pnDcp_Block_ALLSelector;
-    }
+    readBuffer.closeContext("ComplexOfComplexUsageA");
+    // Create the instance
+    ComplexOfComplexUsageA _complexOfComplexUsageA;
+    _complexOfComplexUsageA = new ComplexOfComplexUsageA(b);
+    return _complexOfComplexUsageA;
   }
 
   @Override
@@ -99,16 +106,16 @@ public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof PnDcp_Block_ALLSelector)) {
+    if (!(o instanceof ComplexOfComplexUsageA)) {
       return false;
     }
-    PnDcp_Block_ALLSelector that = (PnDcp_Block_ALLSelector) o;
-    return super.equals(that) && true;
+    ComplexOfComplexUsageA that = (ComplexOfComplexUsageA) o;
+    return (getB() == that.getB()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(getB());
   }
 
   @Override
diff --git a/plc4j/drivers/c-bus/src/main/generated/org/apache/plc4x/java/cbus/readwrite/StatusRequest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageB.java
similarity index 55%
copy from plc4j/drivers/c-bus/src/main/generated/org/apache/plc4x/java/cbus/readwrite/StatusRequest.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageB.java
index 1420a5c375..9fe642e7f1 100644
--- a/plc4j/drivers/c-bus/src/main/generated/org/apache/plc4x/java/cbus/readwrite/StatusRequest.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageB.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.cbus.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,34 +35,38 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class StatusRequest implements Message {
-
-  // Abstract accessors for discriminator values.
+public class ComplexOfComplexUsageB implements Message {
 
   // Properties.
-  protected final byte statusType;
+  protected final ComplexOfComplexUsageC c;
+  protected final List<ComplexOfComplexUsageD> ds;
 
-  public StatusRequest(byte statusType) {
+  public ComplexOfComplexUsageB(ComplexOfComplexUsageC c, List<ComplexOfComplexUsageD> ds) {
     super();
-    this.statusType = statusType;
+    this.c = c;
+    this.ds = ds;
   }
 
-  public byte getStatusType() {
-    return statusType;
+  public ComplexOfComplexUsageC getC() {
+    return c;
   }
 
-  protected abstract void serializeStatusRequestChild(WriteBuffer writeBuffer)
-      throws SerializationException;
+  public List<ComplexOfComplexUsageD> getDs() {
+    return ds;
+  }
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("StatusRequest");
+    writeBuffer.pushContext("ComplexOfComplexUsageB");
+
+    // Optional Field (c) (Can be skipped, if the value is null)
+    writeOptionalField("c", c, new DataWriterComplexDefault<>(writeBuffer));
 
-    // Switch field (Serialize the sub-type)
-    serializeStatusRequestChild(writeBuffer);
+    // Array Field (ds)
+    writeComplexTypeArrayField("ds", ds, writeBuffer);
 
-    writeBuffer.popContext("StatusRequest");
+    writeBuffer.popContext("ComplexOfComplexUsageB");
   }
 
   @Override
@@ -73,53 +77,55 @@ public abstract class StatusRequest implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    StatusRequest _value = this;
+    ComplexOfComplexUsageB _value = this;
+
+    // Optional Field (c)
+    if (c != null) {
+      lengthInBits += c.getLengthInBits();
+    }
 
-    // Length of sub-type elements will be added by sub-type...
+    // Array field
+    if (ds != null) {
+      int i = 0;
+      for (ComplexOfComplexUsageD element : ds) {
+        boolean last = ++i >= ds.size();
+        lengthInBits += element.getLengthInBits();
+      }
+    }
 
     return lengthInBits;
   }
 
-  public static StatusRequest staticParse(ReadBuffer readBuffer, Object... args)
+  public static ComplexOfComplexUsageB staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static StatusRequest staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("StatusRequest");
+  public static ComplexOfComplexUsageB staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageB");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    byte statusType = readPeekField("statusType", readByte(readBuffer, 8));
+    ComplexOfComplexUsageC c =
+        readOptionalField(
+            "c",
+            new DataReaderComplexDefault<>(
+                () -> ComplexOfComplexUsageC.staticParse(readBuffer), readBuffer));
 
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    StatusRequestBuilder builder = null;
-    if (EvaluationHelper.equals(statusType, (byte) 0x7A)) {
-      builder = StatusRequestBinaryState.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(statusType, (byte) 0xFA)) {
-      builder = StatusRequestBinaryStateDeprecated.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(statusType, (byte) 0x73)) {
-      builder = StatusRequestLevel.staticParseBuilder(readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "statusType="
-              + statusType
-              + "]");
-    }
+    List<ComplexOfComplexUsageD> ds =
+        readCountArrayField(
+            "ds",
+            new DataReaderComplexDefault<>(
+                () -> ComplexOfComplexUsageD.staticParse(readBuffer), readBuffer),
+            5);
 
-    readBuffer.closeContext("StatusRequest");
+    readBuffer.closeContext("ComplexOfComplexUsageB");
     // Create the instance
-    StatusRequest _statusRequest = builder.build(statusType);
-    return _statusRequest;
-  }
-
-  public static interface StatusRequestBuilder {
-    StatusRequest build(byte statusType);
+    ComplexOfComplexUsageB _complexOfComplexUsageB;
+    _complexOfComplexUsageB = new ComplexOfComplexUsageB(c, ds);
+    return _complexOfComplexUsageB;
   }
 
   @Override
@@ -127,16 +133,16 @@ public abstract class StatusRequest implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof StatusRequest)) {
+    if (!(o instanceof ComplexOfComplexUsageB)) {
       return false;
     }
-    StatusRequest that = (StatusRequest) o;
-    return (getStatusType() == that.getStatusType()) && true;
+    ComplexOfComplexUsageB that = (ComplexOfComplexUsageB) o;
+    return (getC() == that.getC()) && (getDs() == that.getDs()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(getStatusType());
+    return Objects.hash(getC(), getDs());
   }
 
   @Override
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/TDataIndividualInd.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageC.java
similarity index 62%
copy from plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/TDataIndividualInd.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageC.java
index 979834ea88..fc1778d5ed 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/TDataIndividualInd.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageC.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.knxnetip.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,28 +35,29 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class TDataIndividualInd extends CEMI implements Message {
+public class ComplexOfComplexUsageC implements Message {
 
-  // Accessors for discriminator values.
-  public Short getMessageCode() {
-    return (short) 0x94;
-  }
+  // Properties.
+  protected final short irrelevant;
 
-  // Arguments.
-  protected final Integer size;
+  public ComplexOfComplexUsageC(short irrelevant) {
+    super();
+    this.irrelevant = irrelevant;
+  }
 
-  public TDataIndividualInd(Integer size) {
-    super(size);
-    this.size = size;
+  public short getIrrelevant() {
+    return irrelevant;
   }
 
-  @Override
-  protected void serializeCEMIChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("TDataIndividualInd");
+    writeBuffer.pushContext("ComplexOfComplexUsageC");
 
-    writeBuffer.popContext("TDataIndividualInd");
+    // Simple Field (irrelevant)
+    writeSimpleField("irrelevant", irrelevant, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("ComplexOfComplexUsageC");
   }
 
   @Override
@@ -66,38 +67,34 @@ public class TDataIndividualInd extends CEMI implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    TDataIndividualInd _value = this;
+    int lengthInBits = 0;
+    ComplexOfComplexUsageC _value = this;
+
+    // Simple field (irrelevant)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static TDataIndividualIndBuilder staticParseBuilder(ReadBuffer readBuffer, Integer size)
+  public static ComplexOfComplexUsageC staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("TDataIndividualInd");
     PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    readBuffer.closeContext("TDataIndividualInd");
-    // Create the instance
-    return new TDataIndividualIndBuilder(size);
+    return staticParse(readBuffer);
   }
 
-  public static class TDataIndividualIndBuilder implements CEMI.CEMIBuilder {
-    private final Integer size;
-
-    public TDataIndividualIndBuilder(Integer size) {
-
-      this.size = size;
-    }
-
-    public TDataIndividualInd build(Integer size) {
+  public static ComplexOfComplexUsageC staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageC");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
 
-      TDataIndividualInd tDataIndividualInd = new TDataIndividualInd(size);
+    short irrelevant = readSimpleField("irrelevant", readUnsignedShort(readBuffer, 8));
 
-      return tDataIndividualInd;
-    }
+    readBuffer.closeContext("ComplexOfComplexUsageC");
+    // Create the instance
+    ComplexOfComplexUsageC _complexOfComplexUsageC;
+    _complexOfComplexUsageC = new ComplexOfComplexUsageC(irrelevant);
+    return _complexOfComplexUsageC;
   }
 
   @Override
@@ -105,16 +102,16 @@ public class TDataIndividualInd extends CEMI implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof TDataIndividualInd)) {
+    if (!(o instanceof ComplexOfComplexUsageC)) {
       return false;
     }
-    TDataIndividualInd that = (TDataIndividualInd) o;
-    return super.equals(that) && true;
+    ComplexOfComplexUsageC that = (ComplexOfComplexUsageC) o;
+    return (getIrrelevant() == that.getIrrelevant()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(getIrrelevant());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageD.java
similarity index 61%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageD.java
index a4b2a26fcb..1ae7e04b52 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageD.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,28 +35,29 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
+public class ComplexOfComplexUsageD implements Message {
 
-  // Accessors for discriminator values.
-  public PnDcp_BlockOptions getOption() {
-    return PnDcp_BlockOptions.ALL_SELECTOR_OPTION;
-  }
+  // Properties.
+  protected final short irrelevant;
 
-  public Short getSuboption() {
-    return (short) 0xFF;
+  public ComplexOfComplexUsageD(short irrelevant) {
+    super();
+    this.irrelevant = irrelevant;
   }
 
-  public PnDcp_Block_ALLSelector() {
-    super();
+  public short getIrrelevant() {
+    return irrelevant;
   }
 
-  @Override
-  protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("PnDcp_Block_ALLSelector");
+    writeBuffer.pushContext("ComplexOfComplexUsageD");
 
-    writeBuffer.popContext("PnDcp_Block_ALLSelector");
+    // Simple Field (irrelevant)
+    writeSimpleField("irrelevant", irrelevant, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("ComplexOfComplexUsageD");
   }
 
   @Override
@@ -66,32 +67,34 @@ public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    PnDcp_Block_ALLSelector _value = this;
+    int lengthInBits = 0;
+    ComplexOfComplexUsageD _value = this;
+
+    // Simple field (irrelevant)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static PnDcp_Block_ALLSelectorBuilder staticParseBuilder(ReadBuffer readBuffer)
+  public static ComplexOfComplexUsageD staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("PnDcp_Block_ALLSelector");
     PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    readBuffer.closeContext("PnDcp_Block_ALLSelector");
-    // Create the instance
-    return new PnDcp_Block_ALLSelectorBuilder();
+    return staticParse(readBuffer);
   }
 
-  public static class PnDcp_Block_ALLSelectorBuilder implements PnDcp_Block.PnDcp_BlockBuilder {
+  public static ComplexOfComplexUsageD staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageD");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
 
-    public PnDcp_Block_ALLSelectorBuilder() {}
+    short irrelevant = readSimpleField("irrelevant", readUnsignedShort(readBuffer, 8));
 
-    public PnDcp_Block_ALLSelector build() {
-      PnDcp_Block_ALLSelector pnDcp_Block_ALLSelector = new PnDcp_Block_ALLSelector();
-      return pnDcp_Block_ALLSelector;
-    }
+    readBuffer.closeContext("ComplexOfComplexUsageD");
+    // Create the instance
+    ComplexOfComplexUsageD _complexOfComplexUsageD;
+    _complexOfComplexUsageD = new ComplexOfComplexUsageD(irrelevant);
+    return _complexOfComplexUsageD;
   }
 
   @Override
@@ -99,16 +102,16 @@ public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof PnDcp_Block_ALLSelector)) {
+    if (!(o instanceof ComplexOfComplexUsageD)) {
       return false;
     }
-    PnDcp_Block_ALLSelector that = (PnDcp_Block_ALLSelector) o;
-    return super.equals(that) && true;
+    ComplexOfComplexUsageD that = (ComplexOfComplexUsageD) o;
+    return (getIrrelevant() == that.getIrrelevant()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(getIrrelevant());
   }
 
   @Override
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ConstTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ConstTypeTest.java
new file mode 100644
index 0000000000..170cd18df5
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ConstTypeTest.java
@@ -0,0 +1,196 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class ConstTypeTest implements Message {
+
+  // Constant values.
+  public static final Boolean BITFIELD = true;
+  public static final Byte INTFIELD = 100;
+  public static final Short UINTFIELD = 100;
+  public static final Float FLOATFIELD = 100.0F;
+  public static final Double DOUBLEFIELD = 100.0;
+  public static final String STRINGFIELD = "HELLO TODDY";
+
+  public ConstTypeTest() {
+    super();
+  }
+
+  public boolean getBitField() {
+    return BITFIELD;
+  }
+
+  public byte getIntField() {
+    return INTFIELD;
+  }
+
+  public short getUintField() {
+    return UINTFIELD;
+  }
+
+  public float getFloatField() {
+    return FLOATFIELD;
+  }
+
+  public double getDoubleField() {
+    return DOUBLEFIELD;
+  }
+
+  public String getStringField() {
+    return STRINGFIELD;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ConstTypeTest");
+
+    // Const Field (bitField)
+    writeConstField("bitField", BITFIELD, writeBoolean(writeBuffer));
+
+    // Const Field (intField)
+    writeConstField("intField", INTFIELD, writeSignedByte(writeBuffer, 8));
+
+    // Const Field (uintField)
+    writeConstField("uintField", UINTFIELD, writeUnsignedShort(writeBuffer, 8));
+
+    // Const Field (floatField)
+    writeConstField("floatField", FLOATFIELD, writeFloat(writeBuffer, 32));
+
+    // Const Field (doubleField)
+    writeConstField("doubleField", DOUBLEFIELD, writeDouble(writeBuffer, 64));
+
+    // Const Field (stringField)
+    writeConstField("stringField", STRINGFIELD, writeString(writeBuffer, 8));
+
+    writeBuffer.popContext("ConstTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ConstTypeTest _value = this;
+
+    // Const Field (bitField)
+    lengthInBits += 1;
+
+    // Const Field (intField)
+    lengthInBits += 8;
+
+    // Const Field (uintField)
+    lengthInBits += 8;
+
+    // Const Field (floatField)
+    lengthInBits += 32;
+
+    // Const Field (doubleField)
+    lengthInBits += 64;
+
+    // Const Field (stringField)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static ConstTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ConstTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ConstTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    boolean bitField = readConstField("bitField", readBoolean(readBuffer), ConstTypeTest.BITFIELD);
+
+    byte intField =
+        readConstField("intField", readSignedByte(readBuffer, 8), ConstTypeTest.INTFIELD);
+
+    short uintField =
+        readConstField("uintField", readUnsignedShort(readBuffer, 8), ConstTypeTest.UINTFIELD);
+
+    float floatField =
+        readConstField("floatField", readFloat(readBuffer, 32), ConstTypeTest.FLOATFIELD);
+
+    double doubleField =
+        readConstField("doubleField", readDouble(readBuffer, 64), ConstTypeTest.DOUBLEFIELD);
+
+    String stringField =
+        readConstField("stringField", readString(readBuffer, 8), ConstTypeTest.STRINGFIELD);
+
+    readBuffer.closeContext("ConstTypeTest");
+    // Create the instance
+    ConstTypeTest _constTypeTest;
+    _constTypeTest = new ConstTypeTest();
+    return _constTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ConstTypeTest)) {
+      return false;
+    }
+    ConstTypeTest that = (ConstTypeTest) o;
+    return true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash();
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/DataIOType.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/DataIOType.java
new file mode 100644
index 0000000000..4872ae7fd4
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/DataIOType.java
@@ -0,0 +1,110 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.generation.ByteOrder;
+import org.apache.plc4x.java.spi.generation.EvaluationHelper;
+import org.apache.plc4x.java.spi.generation.ParseException;
+import org.apache.plc4x.java.spi.generation.ReadBuffer;
+import org.apache.plc4x.java.spi.generation.SerializationException;
+import org.apache.plc4x.java.spi.generation.WriteBuffer;
+import org.apache.plc4x.java.spi.values.*;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class DataIOType {
+
+  private static final Logger LOGGER = LoggerFactory.getLogger(DataIOType.class);
+
+  public static PlcValue staticParse(ReadBuffer readBuffer, EnumType dataType)
+      throws ParseException {
+    if (EvaluationHelper.equals(dataType, EnumType.BOOL)) { // BOOL
+
+      // Simple Field (value)
+      Boolean value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readBit("");
+
+      return new PlcBOOL(value);
+    } else if (EvaluationHelper.equals(dataType, EnumType.UINT)) { // USINT
+
+      // Simple Field (value)
+      Short value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedShort("", 8);
+
+      return new PlcUSINT(value);
+    } else if (EvaluationHelper.equals(dataType, EnumType.INT)) { // UINT
+
+      // Simple Field (value)
+      Integer value = /*TODO: migrate me*/ /*TODO: migrate me*/ readBuffer.readUnsignedInt("", 16);
+
+      return new PlcUINT(value);
+    }
+    return null;
+  }
+
+  public static void staticSerialize(WriteBuffer writeBuffer, PlcValue _value, EnumType dataType)
+      throws SerializationException {
+    staticSerialize(writeBuffer, _value, dataType, ByteOrder.BIG_ENDIAN);
+  }
+
+  public static void staticSerialize(
+      WriteBuffer writeBuffer, PlcValue _value, EnumType dataType, ByteOrder byteOrder)
+      throws SerializationException {
+    if (EvaluationHelper.equals(dataType, EnumType.BOOL)) { // BOOL
+      // Simple Field (value)
+      boolean value = (boolean) _value.getBoolean();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeBit("", (boolean) (value));
+    } else if (EvaluationHelper.equals(dataType, EnumType.UINT)) { // USINT
+      // Simple Field (value)
+      short value = (short) _value.getShort();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedShort("", 8, ((Number) (value)).shortValue());
+    } else if (EvaluationHelper.equals(dataType, EnumType.INT)) { // UINT
+      // Simple Field (value)
+      int value = (int) _value.getInt();
+      /*TODO: migrate me*/
+      /*TODO: migrate me*/ writeBuffer.writeUnsignedInt("", 16, ((Number) (value)).intValue());
+    }
+  }
+
+  public static int getLengthInBytes(PlcValue _value, EnumType dataType) {
+    return (int) Math.ceil((float) getLengthInBits(_value, dataType) / 8.0);
+  }
+
+  public static int getLengthInBits(PlcValue _value, EnumType dataType) {
+    int sizeInBits = 0;
+    if (EvaluationHelper.equals(dataType, EnumType.BOOL)) { // BOOL
+      // Simple Field (value)
+      sizeInBits += 1;
+    } else if (EvaluationHelper.equals(dataType, EnumType.UINT)) { // USINT
+      // Simple Field (value)
+      sizeInBits += 8;
+    } else if (EvaluationHelper.equals(dataType, EnumType.INT)) { // UINT
+      // Simple Field (value)
+      sizeInBits += 16;
+    }
+    return sizeInBits;
+  }
+}
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedType.java
similarity index 60%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedType.java
index d73fc7480c..5f3acacec1 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/Ethernet_FramePayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedType.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,30 +35,35 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class Ethernet_FramePayload implements Message {
+public abstract class EnumDiscriminatedType implements Message {
 
   // Abstract accessors for discriminator values.
-  public abstract Integer getPacketType();
+  public abstract EnumType getDiscr();
 
-  public Ethernet_FramePayload() {
+  public EnumDiscriminatedType() {
     super();
   }
 
-  protected abstract void serializeEthernet_FramePayloadChild(WriteBuffer writeBuffer)
+  protected abstract void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
       throws SerializationException;
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("Ethernet_FramePayload");
+    writeBuffer.pushContext("EnumDiscriminatedType");
 
-    // Discriminator Field (packetType) (Used as input to a switch field)
-    writeDiscriminatorField("packetType", getPacketType(), writeUnsignedInt(writeBuffer, 16));
+    // Discriminator Field (discr) (Used as input to a switch field)
+    writeDiscriminatorEnumField(
+        "discr",
+        "EnumType",
+        getDiscr(),
+        new DataWriterEnumDefault<>(
+            EnumType::getValue, EnumType::name, writeUnsignedShort(writeBuffer, 8)));
 
     // Switch field (Serialize the sub-type)
-    serializeEthernet_FramePayloadChild(writeBuffer);
+    serializeEnumDiscriminatedTypeChild(writeBuffer);
 
-    writeBuffer.popContext("Ethernet_FramePayload");
+    writeBuffer.popContext("EnumDiscriminatedType");
   }
 
   @Override
@@ -69,56 +74,55 @@ public abstract class Ethernet_FramePayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    Ethernet_FramePayload _value = this;
+    EnumDiscriminatedType _value = this;
 
-    // Discriminator Field (packetType)
-    lengthInBits += 16;
+    // Discriminator Field (discr)
+    lengthInBits += 8;
 
     // Length of sub-type elements will be added by sub-type...
 
     return lengthInBits;
   }
 
-  public static Ethernet_FramePayload staticParse(ReadBuffer readBuffer, Object... args)
+  public static EnumDiscriminatedType staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static Ethernet_FramePayload staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("Ethernet_FramePayload");
+  public static EnumDiscriminatedType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedType");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    int packetType = readDiscriminatorField("packetType", readUnsignedInt(readBuffer, 16));
+    EnumType discr =
+        readDiscriminatorField(
+            "discr",
+            new DataReaderEnumDefault<>(EnumType::enumForValue, readUnsignedShort(readBuffer, 8)));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    Ethernet_FramePayloadBuilder builder = null;
-    if (EvaluationHelper.equals(packetType, (int) 0x0800)) {
-      builder = Ethernet_FramePayload_IPv4.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(packetType, (int) 0x8100)) {
-      builder = Ethernet_FramePayload_VirtualLan.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(packetType, (int) 0x8892)) {
-      builder = Ethernet_FramePayload_PnDcp.staticParseBuilder(readBuffer);
+    EnumDiscriminatedTypeBuilder builder = null;
+    if (EvaluationHelper.equals(discr, EnumType.BOOL)) {
+      builder = EnumDiscriminatedTypeA.staticParseEnumDiscriminatedTypeBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(discr, EnumType.UINT)) {
+      builder = EnumDiscriminatedTypeB.staticParseEnumDiscriminatedTypeBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(discr, EnumType.INT)) {
+      builder = EnumDiscriminatedTypeC.staticParseEnumDiscriminatedTypeBuilder(readBuffer);
     }
     if (builder == null) {
       throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "packetType="
-              + packetType
-              + "]");
+          "Unsupported case for discriminated type" + " parameters [" + "discr=" + discr + "]");
     }
 
-    readBuffer.closeContext("Ethernet_FramePayload");
+    readBuffer.closeContext("EnumDiscriminatedType");
     // Create the instance
-    Ethernet_FramePayload _ethernet_FramePayload = builder.build();
-    return _ethernet_FramePayload;
+    EnumDiscriminatedType _enumDiscriminatedType = builder.build();
+    return _enumDiscriminatedType;
   }
 
-  public static interface Ethernet_FramePayloadBuilder {
-    Ethernet_FramePayload build();
+  public interface EnumDiscriminatedTypeBuilder {
+    EnumDiscriminatedType build();
   }
 
   @Override
@@ -126,10 +130,10 @@ public abstract class Ethernet_FramePayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof Ethernet_FramePayload)) {
+    if (!(o instanceof EnumDiscriminatedType)) {
       return false;
     }
-    Ethernet_FramePayload that = (Ethernet_FramePayload) o;
+    EnumDiscriminatedType that = (EnumDiscriminatedType) o;
     return true;
   }
 
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeA.java
similarity index 60%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeA.java
index 944efcc8f2..9cc198650a 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeA.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,26 +35,36 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUuid
-    implements Message {
+public class EnumDiscriminatedTypeA extends EnumDiscriminatedType implements Message {
 
   // Accessors for discriminator values.
-  public Long getInterfaceType() {
-    return (long) 0xDEA00004L;
+  public EnumType getDiscr() {
+    return EnumType.BOOL;
   }
 
-  public DceRpc_InterfaceUuid_ParameterInterface() {
+  // Properties.
+  protected final short simpA;
+
+  public EnumDiscriminatedTypeA(short simpA) {
     super();
+    this.simpA = simpA;
+  }
+
+  public short getSimpA() {
+    return simpA;
   }
 
   @Override
-  protected void serializeDceRpc_InterfaceUuidChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("DceRpc_InterfaceUuid_ParameterInterface");
+    writeBuffer.pushContext("EnumDiscriminatedTypeA");
+
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("DceRpc_InterfaceUuid_ParameterInterface");
+    writeBuffer.popContext("EnumDiscriminatedTypeA");
   }
 
   @Override
@@ -65,32 +75,40 @@ public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUui
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    DceRpc_InterfaceUuid_ParameterInterface _value = this;
+    EnumDiscriminatedTypeA _value = this;
+
+    // Simple field (simpA)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static DceRpc_InterfaceUuid_ParameterInterfaceBuilder staticParseBuilder(
+  public static EnumDiscriminatedTypeBuilder staticParseEnumDiscriminatedTypeBuilder(
       ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("DceRpc_InterfaceUuid_ParameterInterface");
+    readBuffer.pullContext("EnumDiscriminatedTypeA");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    readBuffer.closeContext("DceRpc_InterfaceUuid_ParameterInterface");
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeA");
     // Create the instance
-    return new DceRpc_InterfaceUuid_ParameterInterfaceBuilder();
+    return new EnumDiscriminatedTypeABuilderImpl(simpA);
   }
 
-  public static class DceRpc_InterfaceUuid_ParameterInterfaceBuilder
-      implements DceRpc_InterfaceUuid.DceRpc_InterfaceUuidBuilder {
+  public static class EnumDiscriminatedTypeABuilderImpl
+      implements EnumDiscriminatedType.EnumDiscriminatedTypeBuilder {
+    private final short simpA;
 
-    public DceRpc_InterfaceUuid_ParameterInterfaceBuilder() {}
+    public EnumDiscriminatedTypeABuilderImpl(short simpA) {
+
+      this.simpA = simpA;
+    }
 
-    public DceRpc_InterfaceUuid_ParameterInterface build() {
-      DceRpc_InterfaceUuid_ParameterInterface dceRpc_InterfaceUuid_ParameterInterface =
-          new DceRpc_InterfaceUuid_ParameterInterface();
-      return dceRpc_InterfaceUuid_ParameterInterface;
+    public EnumDiscriminatedTypeA build() {
+      EnumDiscriminatedTypeA enumDiscriminatedTypeA = new EnumDiscriminatedTypeA(simpA);
+      return enumDiscriminatedTypeA;
     }
   }
 
@@ -99,16 +117,16 @@ public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUui
     if (this == o) {
       return true;
     }
-    if (!(o instanceof DceRpc_InterfaceUuid_ParameterInterface)) {
+    if (!(o instanceof EnumDiscriminatedTypeA)) {
       return false;
     }
-    DceRpc_InterfaceUuid_ParameterInterface that = (DceRpc_InterfaceUuid_ParameterInterface) o;
-    return super.equals(that) && true;
+    EnumDiscriminatedTypeA that = (EnumDiscriminatedTypeA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(super.hashCode(), getSimpA());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeB.java
similarity index 60%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeB.java
index 944efcc8f2..09a5b9644d 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeB.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,26 +35,36 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUuid
-    implements Message {
+public class EnumDiscriminatedTypeB extends EnumDiscriminatedType implements Message {
 
   // Accessors for discriminator values.
-  public Long getInterfaceType() {
-    return (long) 0xDEA00004L;
+  public EnumType getDiscr() {
+    return EnumType.UINT;
   }
 
-  public DceRpc_InterfaceUuid_ParameterInterface() {
+  // Properties.
+  protected final short simpB;
+
+  public EnumDiscriminatedTypeB(short simpB) {
     super();
+    this.simpB = simpB;
+  }
+
+  public short getSimpB() {
+    return simpB;
   }
 
   @Override
-  protected void serializeDceRpc_InterfaceUuidChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("DceRpc_InterfaceUuid_ParameterInterface");
+    writeBuffer.pushContext("EnumDiscriminatedTypeB");
+
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("DceRpc_InterfaceUuid_ParameterInterface");
+    writeBuffer.popContext("EnumDiscriminatedTypeB");
   }
 
   @Override
@@ -65,32 +75,40 @@ public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUui
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    DceRpc_InterfaceUuid_ParameterInterface _value = this;
+    EnumDiscriminatedTypeB _value = this;
+
+    // Simple field (simpB)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static DceRpc_InterfaceUuid_ParameterInterfaceBuilder staticParseBuilder(
+  public static EnumDiscriminatedTypeBuilder staticParseEnumDiscriminatedTypeBuilder(
       ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("DceRpc_InterfaceUuid_ParameterInterface");
+    readBuffer.pullContext("EnumDiscriminatedTypeB");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    readBuffer.closeContext("DceRpc_InterfaceUuid_ParameterInterface");
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeB");
     // Create the instance
-    return new DceRpc_InterfaceUuid_ParameterInterfaceBuilder();
+    return new EnumDiscriminatedTypeBBuilderImpl(simpB);
   }
 
-  public static class DceRpc_InterfaceUuid_ParameterInterfaceBuilder
-      implements DceRpc_InterfaceUuid.DceRpc_InterfaceUuidBuilder {
+  public static class EnumDiscriminatedTypeBBuilderImpl
+      implements EnumDiscriminatedType.EnumDiscriminatedTypeBuilder {
+    private final short simpB;
 
-    public DceRpc_InterfaceUuid_ParameterInterfaceBuilder() {}
+    public EnumDiscriminatedTypeBBuilderImpl(short simpB) {
+
+      this.simpB = simpB;
+    }
 
-    public DceRpc_InterfaceUuid_ParameterInterface build() {
-      DceRpc_InterfaceUuid_ParameterInterface dceRpc_InterfaceUuid_ParameterInterface =
-          new DceRpc_InterfaceUuid_ParameterInterface();
-      return dceRpc_InterfaceUuid_ParameterInterface;
+    public EnumDiscriminatedTypeB build() {
+      EnumDiscriminatedTypeB enumDiscriminatedTypeB = new EnumDiscriminatedTypeB(simpB);
+      return enumDiscriminatedTypeB;
     }
   }
 
@@ -99,16 +117,16 @@ public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUui
     if (this == o) {
       return true;
     }
-    if (!(o instanceof DceRpc_InterfaceUuid_ParameterInterface)) {
+    if (!(o instanceof EnumDiscriminatedTypeB)) {
       return false;
     }
-    DceRpc_InterfaceUuid_ParameterInterface that = (DceRpc_InterfaceUuid_ParameterInterface) o;
-    return super.equals(that) && true;
+    EnumDiscriminatedTypeB that = (EnumDiscriminatedTypeB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(super.hashCode(), getSimpB());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeC.java
similarity index 60%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeC.java
index 944efcc8f2..81fb9d0399 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/DceRpc_InterfaceUuid_ParameterInterface.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeC.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,26 +35,36 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUuid
-    implements Message {
+public class EnumDiscriminatedTypeC extends EnumDiscriminatedType implements Message {
 
   // Accessors for discriminator values.
-  public Long getInterfaceType() {
-    return (long) 0xDEA00004L;
+  public EnumType getDiscr() {
+    return EnumType.INT;
   }
 
-  public DceRpc_InterfaceUuid_ParameterInterface() {
+  // Properties.
+  protected final short simpC;
+
+  public EnumDiscriminatedTypeC(short simpC) {
     super();
+    this.simpC = simpC;
+  }
+
+  public short getSimpC() {
+    return simpC;
   }
 
   @Override
-  protected void serializeDceRpc_InterfaceUuidChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("DceRpc_InterfaceUuid_ParameterInterface");
+    writeBuffer.pushContext("EnumDiscriminatedTypeC");
+
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("DceRpc_InterfaceUuid_ParameterInterface");
+    writeBuffer.popContext("EnumDiscriminatedTypeC");
   }
 
   @Override
@@ -65,32 +75,40 @@ public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUui
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    DceRpc_InterfaceUuid_ParameterInterface _value = this;
+    EnumDiscriminatedTypeC _value = this;
+
+    // Simple field (simpC)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static DceRpc_InterfaceUuid_ParameterInterfaceBuilder staticParseBuilder(
+  public static EnumDiscriminatedTypeBuilder staticParseEnumDiscriminatedTypeBuilder(
       ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("DceRpc_InterfaceUuid_ParameterInterface");
+    readBuffer.pullContext("EnumDiscriminatedTypeC");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    readBuffer.closeContext("DceRpc_InterfaceUuid_ParameterInterface");
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeC");
     // Create the instance
-    return new DceRpc_InterfaceUuid_ParameterInterfaceBuilder();
+    return new EnumDiscriminatedTypeCBuilderImpl(simpC);
   }
 
-  public static class DceRpc_InterfaceUuid_ParameterInterfaceBuilder
-      implements DceRpc_InterfaceUuid.DceRpc_InterfaceUuidBuilder {
+  public static class EnumDiscriminatedTypeCBuilderImpl
+      implements EnumDiscriminatedType.EnumDiscriminatedTypeBuilder {
+    private final short simpC;
 
-    public DceRpc_InterfaceUuid_ParameterInterfaceBuilder() {}
+    public EnumDiscriminatedTypeCBuilderImpl(short simpC) {
+
+      this.simpC = simpC;
+    }
 
-    public DceRpc_InterfaceUuid_ParameterInterface build() {
-      DceRpc_InterfaceUuid_ParameterInterface dceRpc_InterfaceUuid_ParameterInterface =
-          new DceRpc_InterfaceUuid_ParameterInterface();
-      return dceRpc_InterfaceUuid_ParameterInterface;
+    public EnumDiscriminatedTypeC build() {
+      EnumDiscriminatedTypeC enumDiscriminatedTypeC = new EnumDiscriminatedTypeC(simpC);
+      return enumDiscriminatedTypeC;
     }
   }
 
@@ -99,16 +117,16 @@ public class DceRpc_InterfaceUuid_ParameterInterface extends DceRpc_InterfaceUui
     if (this == o) {
       return true;
     }
-    if (!(o instanceof DceRpc_InterfaceUuid_ParameterInterface)) {
+    if (!(o instanceof EnumDiscriminatedTypeC)) {
       return false;
     }
-    DceRpc_InterfaceUuid_ParameterInterface that = (DceRpc_InterfaceUuid_ParameterInterface) o;
-    return super.equals(that) && true;
+    EnumDiscriminatedTypeC that = (EnumDiscriminatedTypeC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(super.hashCode(), getSimpC());
   }
 
   @Override
diff --git a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/NodeIdTypeDefinition.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultiple.java
similarity index 51%
copy from plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/NodeIdTypeDefinition.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultiple.java
index 785e1ef1d9..00b74dc91f 100644
--- a/plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/NodeIdTypeDefinition.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultiple.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.opcua.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,37 +35,45 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class NodeIdTypeDefinition implements Message {
+public abstract class EnumDiscriminatedTypeMultiple implements Message {
 
   // Abstract accessors for discriminator values.
-  public abstract NodeIdType getNodeType();
+  public abstract EnumType getDiscr1();
 
-  public NodeIdTypeDefinition() {
+  public abstract EnumTypeInt getDiscr2();
+
+  public EnumDiscriminatedTypeMultiple() {
     super();
   }
 
-  public abstract String getIdentifier();
-
-  protected abstract void serializeNodeIdTypeDefinitionChild(WriteBuffer writeBuffer)
+  protected abstract void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
       throws SerializationException;
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("NodeIdTypeDefinition");
+    writeBuffer.pushContext("EnumDiscriminatedTypeMultiple");
+
+    // Discriminator Field (discr1) (Used as input to a switch field)
+    writeDiscriminatorEnumField(
+        "discr1",
+        "EnumType",
+        getDiscr1(),
+        new DataWriterEnumDefault<>(
+            EnumType::getValue, EnumType::name, writeUnsignedShort(writeBuffer, 8)));
 
-    // Discriminator Field (nodeType) (Used as input to a switch field)
+    // Discriminator Field (discr2) (Used as input to a switch field)
     writeDiscriminatorEnumField(
-        "nodeType",
-        "NodeIdType",
-        getNodeType(),
+        "discr2",
+        "EnumTypeInt",
+        getDiscr2(),
         new DataWriterEnumDefault<>(
-            NodeIdType::getValue, NodeIdType::name, writeUnsignedShort(writeBuffer, 6)));
+            EnumTypeInt::getValue, EnumTypeInt::name, writeSignedByte(writeBuffer, 8)));
 
     // Switch field (Serialize the sub-type)
-    serializeNodeIdTypeDefinitionChild(writeBuffer);
+    serializeEnumDiscriminatedTypeMultipleChild(writeBuffer);
 
-    writeBuffer.popContext("NodeIdTypeDefinition");
+    writeBuffer.popContext("EnumDiscriminatedTypeMultiple");
   }
 
   @Override
@@ -76,66 +84,80 @@ public abstract class NodeIdTypeDefinition implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    NodeIdTypeDefinition _value = this;
+    EnumDiscriminatedTypeMultiple _value = this;
 
-    // Discriminator Field (nodeType)
-    lengthInBits += 6;
+    // Discriminator Field (discr1)
+    lengthInBits += 8;
+
+    // Discriminator Field (discr2)
+    lengthInBits += 8;
 
     // Length of sub-type elements will be added by sub-type...
 
     return lengthInBits;
   }
 
-  public static NodeIdTypeDefinition staticParse(ReadBuffer readBuffer, Object... args)
+  public static EnumDiscriminatedTypeMultiple staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static NodeIdTypeDefinition staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("NodeIdTypeDefinition");
+  public static EnumDiscriminatedTypeMultiple staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultiple");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NodeIdType nodeType =
+    EnumType discr1 =
+        readDiscriminatorField(
+            "discr1",
+            new DataReaderEnumDefault<>(EnumType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    EnumTypeInt discr2 =
         readDiscriminatorField(
-            "nodeType",
-            new DataReaderEnumDefault<>(
-                NodeIdType::enumForValue, readUnsignedShort(readBuffer, 6)));
+            "discr2",
+            new DataReaderEnumDefault<>(EnumTypeInt::enumForValue, readSignedByte(readBuffer, 8)));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    NodeIdTypeDefinitionBuilder builder = null;
-    if (EvaluationHelper.equals(nodeType, NodeIdType.nodeIdTypeTwoByte)) {
-      builder = NodeIdTwoByte.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(nodeType, NodeIdType.nodeIdTypeFourByte)) {
-      builder = NodeIdFourByte.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(nodeType, NodeIdType.nodeIdTypeNumeric)) {
-      builder = NodeIdNumeric.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(nodeType, NodeIdType.nodeIdTypeString)) {
-      builder = NodeIdString.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(nodeType, NodeIdType.nodeIdTypeGuid)) {
-      builder = NodeIdGuid.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(nodeType, NodeIdType.nodeIdTypeByteString)) {
-      builder = NodeIdByteString.staticParseBuilder(readBuffer);
+    EnumDiscriminatedTypeMultipleBuilder builder = null;
+    if (EvaluationHelper.equals(discr1, EnumType.BOOL)
+        && EvaluationHelper.equals(discr2, EnumTypeInt.BOOLINT)) {
+      builder =
+          EnumDiscriminatedTypeMultipleA.staticParseEnumDiscriminatedTypeMultipleBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(discr1, EnumType.UINT)
+        && EvaluationHelper.equals(discr2, EnumTypeInt.UINTINT)) {
+      builder =
+          EnumDiscriminatedTypeMultipleB.staticParseEnumDiscriminatedTypeMultipleBuilder(
+              readBuffer);
+    } else if (EvaluationHelper.equals(discr1, EnumType.INT)
+        && EvaluationHelper.equals(discr2, EnumTypeInt.INTINT)) {
+      builder =
+          EnumDiscriminatedTypeMultipleC.staticParseEnumDiscriminatedTypeMultipleBuilder(
+              readBuffer);
     }
     if (builder == null) {
       throw new ParseException(
           "Unsupported case for discriminated type"
               + " parameters ["
-              + "nodeType="
-              + nodeType
+              + "discr1="
+              + discr1
+              + " "
+              + "discr2="
+              + discr2
               + "]");
     }
 
-    readBuffer.closeContext("NodeIdTypeDefinition");
+    readBuffer.closeContext("EnumDiscriminatedTypeMultiple");
     // Create the instance
-    NodeIdTypeDefinition _nodeIdTypeDefinition = builder.build();
-    return _nodeIdTypeDefinition;
+    EnumDiscriminatedTypeMultiple _enumDiscriminatedTypeMultiple = builder.build();
+    return _enumDiscriminatedTypeMultiple;
   }
 
-  public static interface NodeIdTypeDefinitionBuilder {
-    NodeIdTypeDefinition build();
+  public interface EnumDiscriminatedTypeMultipleBuilder {
+    EnumDiscriminatedTypeMultiple build();
   }
 
   @Override
@@ -143,10 +165,10 @@ public abstract class NodeIdTypeDefinition implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof NodeIdTypeDefinition)) {
+    if (!(o instanceof EnumDiscriminatedTypeMultiple)) {
       return false;
     }
-    NodeIdTypeDefinition that = (NodeIdTypeDefinition) o;
+    EnumDiscriminatedTypeMultiple that = (EnumDiscriminatedTypeMultiple) o;
     return true;
   }
 
diff --git a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleA.java
similarity index 57%
copy from plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleA.java
index eb4f353360..e0613a8b70 100644
--- a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleA.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.canopen.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,41 +35,41 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
+public class EnumDiscriminatedTypeMultipleA extends EnumDiscriminatedTypeMultiple
+    implements Message {
 
   // Accessors for discriminator values.
-  public CANOpenService getService() {
-    return CANOpenService.HEARTBEAT;
+  public EnumType getDiscr1() {
+    return EnumType.BOOL;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.BOOLINT;
   }
 
   // Properties.
-  protected final NMTState state;
+  protected final short simpA;
 
-  public CANOpenHeartbeatPayload(NMTState state) {
+  public EnumDiscriminatedTypeMultipleA(short simpA) {
     super();
-    this.state = state;
+    this.simpA = simpA;
   }
 
-  public NMTState getState() {
-    return state;
+  public short getSimpA() {
+    return simpA;
   }
 
   @Override
-  protected void serializeCANOpenPayloadChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CANOpenHeartbeatPayload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeMultipleA");
 
-    // Simple Field (state)
-    writeSimpleEnumField(
-        "state",
-        "NMTState",
-        state,
-        new DataWriterEnumDefault<>(
-            NMTState::getValue, NMTState::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("CANOpenHeartbeatPayload");
+    writeBuffer.popContext("EnumDiscriminatedTypeMultipleA");
   }
 
   @Override
@@ -80,44 +80,41 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    CANOpenHeartbeatPayload _value = this;
+    EnumDiscriminatedTypeMultipleA _value = this;
 
-    // Simple field (state)
+    // Simple field (simpA)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static CANOpenHeartbeatPayloadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, CANOpenService service) throws ParseException {
-    readBuffer.pullContext("CANOpenHeartbeatPayload");
+  public static EnumDiscriminatedTypeMultipleBuilder
+      staticParseEnumDiscriminatedTypeMultipleBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultipleA");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NMTState state =
-        readEnumField(
-            "state",
-            "NMTState",
-            new DataReaderEnumDefault<>(NMTState::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("CANOpenHeartbeatPayload");
+    readBuffer.closeContext("EnumDiscriminatedTypeMultipleA");
     // Create the instance
-    return new CANOpenHeartbeatPayloadBuilder(state);
+    return new EnumDiscriminatedTypeMultipleABuilderImpl(simpA);
   }
 
-  public static class CANOpenHeartbeatPayloadBuilder
-      implements CANOpenPayload.CANOpenPayloadBuilder {
-    private final NMTState state;
+  public static class EnumDiscriminatedTypeMultipleABuilderImpl
+      implements EnumDiscriminatedTypeMultiple.EnumDiscriminatedTypeMultipleBuilder {
+    private final short simpA;
 
-    public CANOpenHeartbeatPayloadBuilder(NMTState state) {
+    public EnumDiscriminatedTypeMultipleABuilderImpl(short simpA) {
 
-      this.state = state;
+      this.simpA = simpA;
     }
 
-    public CANOpenHeartbeatPayload build() {
-      CANOpenHeartbeatPayload cANOpenHeartbeatPayload = new CANOpenHeartbeatPayload(state);
-      return cANOpenHeartbeatPayload;
+    public EnumDiscriminatedTypeMultipleA build() {
+      EnumDiscriminatedTypeMultipleA enumDiscriminatedTypeMultipleA =
+          new EnumDiscriminatedTypeMultipleA(simpA);
+      return enumDiscriminatedTypeMultipleA;
     }
   }
 
@@ -126,16 +123,16 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CANOpenHeartbeatPayload)) {
+    if (!(o instanceof EnumDiscriminatedTypeMultipleA)) {
       return false;
     }
-    CANOpenHeartbeatPayload that = (CANOpenHeartbeatPayload) o;
-    return (getState() == that.getState()) && super.equals(that) && true;
+    EnumDiscriminatedTypeMultipleA that = (EnumDiscriminatedTypeMultipleA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getState());
+    return Objects.hash(super.hashCode(), getSimpA());
   }
 
   @Override
diff --git a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleB.java
similarity index 57%
copy from plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleB.java
index eb4f353360..bcbbb85515 100644
--- a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleB.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.canopen.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,41 +35,41 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
+public class EnumDiscriminatedTypeMultipleB extends EnumDiscriminatedTypeMultiple
+    implements Message {
 
   // Accessors for discriminator values.
-  public CANOpenService getService() {
-    return CANOpenService.HEARTBEAT;
+  public EnumType getDiscr1() {
+    return EnumType.UINT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.UINTINT;
   }
 
   // Properties.
-  protected final NMTState state;
+  protected final short simpB;
 
-  public CANOpenHeartbeatPayload(NMTState state) {
+  public EnumDiscriminatedTypeMultipleB(short simpB) {
     super();
-    this.state = state;
+    this.simpB = simpB;
   }
 
-  public NMTState getState() {
-    return state;
+  public short getSimpB() {
+    return simpB;
   }
 
   @Override
-  protected void serializeCANOpenPayloadChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CANOpenHeartbeatPayload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeMultipleB");
 
-    // Simple Field (state)
-    writeSimpleEnumField(
-        "state",
-        "NMTState",
-        state,
-        new DataWriterEnumDefault<>(
-            NMTState::getValue, NMTState::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("CANOpenHeartbeatPayload");
+    writeBuffer.popContext("EnumDiscriminatedTypeMultipleB");
   }
 
   @Override
@@ -80,44 +80,41 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    CANOpenHeartbeatPayload _value = this;
+    EnumDiscriminatedTypeMultipleB _value = this;
 
-    // Simple field (state)
+    // Simple field (simpB)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static CANOpenHeartbeatPayloadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, CANOpenService service) throws ParseException {
-    readBuffer.pullContext("CANOpenHeartbeatPayload");
+  public static EnumDiscriminatedTypeMultipleBuilder
+      staticParseEnumDiscriminatedTypeMultipleBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultipleB");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NMTState state =
-        readEnumField(
-            "state",
-            "NMTState",
-            new DataReaderEnumDefault<>(NMTState::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("CANOpenHeartbeatPayload");
+    readBuffer.closeContext("EnumDiscriminatedTypeMultipleB");
     // Create the instance
-    return new CANOpenHeartbeatPayloadBuilder(state);
+    return new EnumDiscriminatedTypeMultipleBBuilderImpl(simpB);
   }
 
-  public static class CANOpenHeartbeatPayloadBuilder
-      implements CANOpenPayload.CANOpenPayloadBuilder {
-    private final NMTState state;
+  public static class EnumDiscriminatedTypeMultipleBBuilderImpl
+      implements EnumDiscriminatedTypeMultiple.EnumDiscriminatedTypeMultipleBuilder {
+    private final short simpB;
 
-    public CANOpenHeartbeatPayloadBuilder(NMTState state) {
+    public EnumDiscriminatedTypeMultipleBBuilderImpl(short simpB) {
 
-      this.state = state;
+      this.simpB = simpB;
     }
 
-    public CANOpenHeartbeatPayload build() {
-      CANOpenHeartbeatPayload cANOpenHeartbeatPayload = new CANOpenHeartbeatPayload(state);
-      return cANOpenHeartbeatPayload;
+    public EnumDiscriminatedTypeMultipleB build() {
+      EnumDiscriminatedTypeMultipleB enumDiscriminatedTypeMultipleB =
+          new EnumDiscriminatedTypeMultipleB(simpB);
+      return enumDiscriminatedTypeMultipleB;
     }
   }
 
@@ -126,16 +123,16 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CANOpenHeartbeatPayload)) {
+    if (!(o instanceof EnumDiscriminatedTypeMultipleB)) {
       return false;
     }
-    CANOpenHeartbeatPayload that = (CANOpenHeartbeatPayload) o;
-    return (getState() == that.getState()) && super.equals(that) && true;
+    EnumDiscriminatedTypeMultipleB that = (EnumDiscriminatedTypeMultipleB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getState());
+    return Objects.hash(super.hashCode(), getSimpB());
   }
 
   @Override
diff --git a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleC.java
similarity index 57%
copy from plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleC.java
index eb4f353360..4d6fc2498b 100644
--- a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleC.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.canopen.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,41 +35,41 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
+public class EnumDiscriminatedTypeMultipleC extends EnumDiscriminatedTypeMultiple
+    implements Message {
 
   // Accessors for discriminator values.
-  public CANOpenService getService() {
-    return CANOpenService.HEARTBEAT;
+  public EnumType getDiscr1() {
+    return EnumType.INT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.INTINT;
   }
 
   // Properties.
-  protected final NMTState state;
+  protected final short simpC;
 
-  public CANOpenHeartbeatPayload(NMTState state) {
+  public EnumDiscriminatedTypeMultipleC(short simpC) {
     super();
-    this.state = state;
+    this.simpC = simpC;
   }
 
-  public NMTState getState() {
-    return state;
+  public short getSimpC() {
+    return simpC;
   }
 
   @Override
-  protected void serializeCANOpenPayloadChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CANOpenHeartbeatPayload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeMultipleC");
 
-    // Simple Field (state)
-    writeSimpleEnumField(
-        "state",
-        "NMTState",
-        state,
-        new DataWriterEnumDefault<>(
-            NMTState::getValue, NMTState::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("CANOpenHeartbeatPayload");
+    writeBuffer.popContext("EnumDiscriminatedTypeMultipleC");
   }
 
   @Override
@@ -80,44 +80,41 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    CANOpenHeartbeatPayload _value = this;
+    EnumDiscriminatedTypeMultipleC _value = this;
 
-    // Simple field (state)
+    // Simple field (simpC)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static CANOpenHeartbeatPayloadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, CANOpenService service) throws ParseException {
-    readBuffer.pullContext("CANOpenHeartbeatPayload");
+  public static EnumDiscriminatedTypeMultipleBuilder
+      staticParseEnumDiscriminatedTypeMultipleBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultipleC");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NMTState state =
-        readEnumField(
-            "state",
-            "NMTState",
-            new DataReaderEnumDefault<>(NMTState::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("CANOpenHeartbeatPayload");
+    readBuffer.closeContext("EnumDiscriminatedTypeMultipleC");
     // Create the instance
-    return new CANOpenHeartbeatPayloadBuilder(state);
+    return new EnumDiscriminatedTypeMultipleCBuilderImpl(simpC);
   }
 
-  public static class CANOpenHeartbeatPayloadBuilder
-      implements CANOpenPayload.CANOpenPayloadBuilder {
-    private final NMTState state;
+  public static class EnumDiscriminatedTypeMultipleCBuilderImpl
+      implements EnumDiscriminatedTypeMultiple.EnumDiscriminatedTypeMultipleBuilder {
+    private final short simpC;
 
-    public CANOpenHeartbeatPayloadBuilder(NMTState state) {
+    public EnumDiscriminatedTypeMultipleCBuilderImpl(short simpC) {
 
-      this.state = state;
+      this.simpC = simpC;
     }
 
-    public CANOpenHeartbeatPayload build() {
-      CANOpenHeartbeatPayload cANOpenHeartbeatPayload = new CANOpenHeartbeatPayload(state);
-      return cANOpenHeartbeatPayload;
+    public EnumDiscriminatedTypeMultipleC build() {
+      EnumDiscriminatedTypeMultipleC enumDiscriminatedTypeMultipleC =
+          new EnumDiscriminatedTypeMultipleC(simpC);
+      return enumDiscriminatedTypeMultipleC;
     }
   }
 
@@ -126,16 +123,16 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CANOpenHeartbeatPayload)) {
+    if (!(o instanceof EnumDiscriminatedTypeMultipleC)) {
       return false;
     }
-    CANOpenHeartbeatPayload that = (CANOpenHeartbeatPayload) o;
-    return (getState() == that.getState()) && super.equals(that) && true;
+    EnumDiscriminatedTypeMultipleC that = (EnumDiscriminatedTypeMultipleC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getState());
+    return Objects.hash(super.hashCode(), getSimpC());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameter.java
similarity index 61%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameter.java
index 390b6ca1b5..cf8c30ac85 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnIoCm_Packet.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameter.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,27 +35,27 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class PnIoCm_Packet implements Message {
+public abstract class EnumDiscriminatedTypeParameter implements Message {
 
   // Abstract accessors for discriminator values.
-  public abstract DceRpc_PacketType getPacketType();
+  public abstract EnumType getDiscr();
 
-  public PnIoCm_Packet() {
+  public EnumDiscriminatedTypeParameter() {
     super();
   }
 
-  protected abstract void serializePnIoCm_PacketChild(WriteBuffer writeBuffer)
+  protected abstract void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
       throws SerializationException;
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("PnIoCm_Packet");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameter");
 
     // Switch field (Serialize the sub-type)
-    serializePnIoCm_PacketChild(writeBuffer);
+    serializeEnumDiscriminatedTypeParameterChild(writeBuffer);
 
-    writeBuffer.popContext("PnIoCm_Packet");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameter");
   }
 
   @Override
@@ -66,67 +66,68 @@ public abstract class PnIoCm_Packet implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    PnIoCm_Packet _value = this;
+    EnumDiscriminatedTypeParameter _value = this;
 
     // Length of sub-type elements will be added by sub-type...
 
     return lengthInBits;
   }
 
-  public static PnIoCm_Packet staticParse(ReadBuffer readBuffer, Object... args)
+  public static EnumDiscriminatedTypeParameter staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     if ((args == null) || (args.length != 1)) {
       throw new PlcRuntimeException(
           "Wrong number of arguments, expected 1, but got " + args.length);
     }
-    DceRpc_PacketType packetType;
-    if (args[0] instanceof DceRpc_PacketType) {
-      packetType = (DceRpc_PacketType) args[0];
+    EnumType discr;
+    if (args[0] instanceof EnumType) {
+      discr = (EnumType) args[0];
     } else if (args[0] instanceof String) {
-      packetType = DceRpc_PacketType.valueOf((String) args[0]);
+      discr = EnumType.valueOf((String) args[0]);
     } else {
       throw new PlcRuntimeException(
-          "Argument 0 expected to be of type DceRpc_PacketType or a string which is parseable but"
-              + " was "
+          "Argument 0 expected to be of type EnumType or a string which is parseable but was "
               + args[0].getClass().getName());
     }
-    return staticParse(readBuffer, packetType);
+    return staticParse(readBuffer, discr);
   }
 
-  public static PnIoCm_Packet staticParse(ReadBuffer readBuffer, DceRpc_PacketType packetType)
+  public static EnumDiscriminatedTypeParameter staticParse(ReadBuffer readBuffer, EnumType discr)
       throws ParseException {
-    readBuffer.pullContext("PnIoCm_Packet");
+    readBuffer.pullContext("EnumDiscriminatedTypeParameter");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    PnIoCm_PacketBuilder builder = null;
-    if (EvaluationHelper.equals(packetType, DceRpc_PacketType.REQUEST)) {
-      builder = PnIoCm_Packet_Req.staticParseBuilder(readBuffer, packetType);
-    } else if (EvaluationHelper.equals(packetType, DceRpc_PacketType.RESPONSE)) {
-      builder = PnIoCm_Packet_Res.staticParseBuilder(readBuffer, packetType);
-    } else if (EvaluationHelper.equals(packetType, DceRpc_PacketType.REJECT)) {
-      builder = PnIoCm_Packet_Rej.staticParseBuilder(readBuffer, packetType);
+    EnumDiscriminatedTypeParameterBuilder builder = null;
+    if (EvaluationHelper.equals(discr, EnumType.BOOL)) {
+      builder =
+          EnumDiscriminatedTypeParameterA.staticParseEnumDiscriminatedTypeParameterBuilder(
+              readBuffer, discr);
+    } else if (EvaluationHelper.equals(discr, EnumType.UINT)) {
+      builder =
+          EnumDiscriminatedTypeParameterB.staticParseEnumDiscriminatedTypeParameterBuilder(
+              readBuffer, discr);
+    } else if (EvaluationHelper.equals(discr, EnumType.INT)) {
+      builder =
+          EnumDiscriminatedTypeParameterC.staticParseEnumDiscriminatedTypeParameterBuilder(
+              readBuffer, discr);
     }
     if (builder == null) {
       throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "packetType="
-              + packetType
-              + "]");
+          "Unsupported case for discriminated type" + " parameters [" + "discr=" + discr + "]");
     }
 
-    readBuffer.closeContext("PnIoCm_Packet");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameter");
     // Create the instance
-    PnIoCm_Packet _pnIoCm_Packet = builder.build();
-    return _pnIoCm_Packet;
+    EnumDiscriminatedTypeParameter _enumDiscriminatedTypeParameter = builder.build();
+    return _enumDiscriminatedTypeParameter;
   }
 
-  public static interface PnIoCm_PacketBuilder {
-    PnIoCm_Packet build();
+  public interface EnumDiscriminatedTypeParameterBuilder {
+    EnumDiscriminatedTypeParameter build();
   }
 
   @Override
@@ -134,10 +135,10 @@ public abstract class PnIoCm_Packet implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof PnIoCm_Packet)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameter)) {
       return false;
     }
-    PnIoCm_Packet that = (PnIoCm_Packet) o;
+    EnumDiscriminatedTypeParameter that = (EnumDiscriminatedTypeParameter) o;
     return true;
   }
 
diff --git a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterA.java
similarity index 57%
copy from plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterA.java
index eb4f353360..882edf9efc 100644
--- a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterA.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.canopen.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,41 +35,37 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
+public class EnumDiscriminatedTypeParameterA extends EnumDiscriminatedTypeParameter
+    implements Message {
 
   // Accessors for discriminator values.
-  public CANOpenService getService() {
-    return CANOpenService.HEARTBEAT;
+  public EnumType getDiscr() {
+    return EnumType.BOOL;
   }
 
   // Properties.
-  protected final NMTState state;
+  protected final short simpA;
 
-  public CANOpenHeartbeatPayload(NMTState state) {
+  public EnumDiscriminatedTypeParameterA(short simpA) {
     super();
-    this.state = state;
+    this.simpA = simpA;
   }
 
-  public NMTState getState() {
-    return state;
+  public short getSimpA() {
+    return simpA;
   }
 
   @Override
-  protected void serializeCANOpenPayloadChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CANOpenHeartbeatPayload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterA");
 
-    // Simple Field (state)
-    writeSimpleEnumField(
-        "state",
-        "NMTState",
-        state,
-        new DataWriterEnumDefault<>(
-            NMTState::getValue, NMTState::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("CANOpenHeartbeatPayload");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterA");
   }
 
   @Override
@@ -80,44 +76,42 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    CANOpenHeartbeatPayload _value = this;
+    EnumDiscriminatedTypeParameterA _value = this;
 
-    // Simple field (state)
+    // Simple field (simpA)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static CANOpenHeartbeatPayloadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, CANOpenService service) throws ParseException {
-    readBuffer.pullContext("CANOpenHeartbeatPayload");
+  public static EnumDiscriminatedTypeParameterBuilder
+      staticParseEnumDiscriminatedTypeParameterBuilder(ReadBuffer readBuffer, EnumType discr)
+          throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterA");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NMTState state =
-        readEnumField(
-            "state",
-            "NMTState",
-            new DataReaderEnumDefault<>(NMTState::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("CANOpenHeartbeatPayload");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterA");
     // Create the instance
-    return new CANOpenHeartbeatPayloadBuilder(state);
+    return new EnumDiscriminatedTypeParameterABuilderImpl(simpA);
   }
 
-  public static class CANOpenHeartbeatPayloadBuilder
-      implements CANOpenPayload.CANOpenPayloadBuilder {
-    private final NMTState state;
+  public static class EnumDiscriminatedTypeParameterABuilderImpl
+      implements EnumDiscriminatedTypeParameter.EnumDiscriminatedTypeParameterBuilder {
+    private final short simpA;
 
-    public CANOpenHeartbeatPayloadBuilder(NMTState state) {
+    public EnumDiscriminatedTypeParameterABuilderImpl(short simpA) {
 
-      this.state = state;
+      this.simpA = simpA;
     }
 
-    public CANOpenHeartbeatPayload build() {
-      CANOpenHeartbeatPayload cANOpenHeartbeatPayload = new CANOpenHeartbeatPayload(state);
-      return cANOpenHeartbeatPayload;
+    public EnumDiscriminatedTypeParameterA build() {
+      EnumDiscriminatedTypeParameterA enumDiscriminatedTypeParameterA =
+          new EnumDiscriminatedTypeParameterA(simpA);
+      return enumDiscriminatedTypeParameterA;
     }
   }
 
@@ -126,16 +120,16 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CANOpenHeartbeatPayload)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameterA)) {
       return false;
     }
-    CANOpenHeartbeatPayload that = (CANOpenHeartbeatPayload) o;
-    return (getState() == that.getState()) && super.equals(that) && true;
+    EnumDiscriminatedTypeParameterA that = (EnumDiscriminatedTypeParameterA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getState());
+    return Objects.hash(super.hashCode(), getSimpA());
   }
 
   @Override
diff --git a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterB.java
similarity index 57%
copy from plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterB.java
index eb4f353360..29e63cbda8 100644
--- a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterB.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.canopen.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,41 +35,37 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
+public class EnumDiscriminatedTypeParameterB extends EnumDiscriminatedTypeParameter
+    implements Message {
 
   // Accessors for discriminator values.
-  public CANOpenService getService() {
-    return CANOpenService.HEARTBEAT;
+  public EnumType getDiscr() {
+    return EnumType.UINT;
   }
 
   // Properties.
-  protected final NMTState state;
+  protected final short simpB;
 
-  public CANOpenHeartbeatPayload(NMTState state) {
+  public EnumDiscriminatedTypeParameterB(short simpB) {
     super();
-    this.state = state;
+    this.simpB = simpB;
   }
 
-  public NMTState getState() {
-    return state;
+  public short getSimpB() {
+    return simpB;
   }
 
   @Override
-  protected void serializeCANOpenPayloadChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CANOpenHeartbeatPayload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterB");
 
-    // Simple Field (state)
-    writeSimpleEnumField(
-        "state",
-        "NMTState",
-        state,
-        new DataWriterEnumDefault<>(
-            NMTState::getValue, NMTState::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("CANOpenHeartbeatPayload");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterB");
   }
 
   @Override
@@ -80,44 +76,42 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    CANOpenHeartbeatPayload _value = this;
+    EnumDiscriminatedTypeParameterB _value = this;
 
-    // Simple field (state)
+    // Simple field (simpB)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static CANOpenHeartbeatPayloadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, CANOpenService service) throws ParseException {
-    readBuffer.pullContext("CANOpenHeartbeatPayload");
+  public static EnumDiscriminatedTypeParameterBuilder
+      staticParseEnumDiscriminatedTypeParameterBuilder(ReadBuffer readBuffer, EnumType discr)
+          throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterB");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NMTState state =
-        readEnumField(
-            "state",
-            "NMTState",
-            new DataReaderEnumDefault<>(NMTState::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("CANOpenHeartbeatPayload");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterB");
     // Create the instance
-    return new CANOpenHeartbeatPayloadBuilder(state);
+    return new EnumDiscriminatedTypeParameterBBuilderImpl(simpB);
   }
 
-  public static class CANOpenHeartbeatPayloadBuilder
-      implements CANOpenPayload.CANOpenPayloadBuilder {
-    private final NMTState state;
+  public static class EnumDiscriminatedTypeParameterBBuilderImpl
+      implements EnumDiscriminatedTypeParameter.EnumDiscriminatedTypeParameterBuilder {
+    private final short simpB;
 
-    public CANOpenHeartbeatPayloadBuilder(NMTState state) {
+    public EnumDiscriminatedTypeParameterBBuilderImpl(short simpB) {
 
-      this.state = state;
+      this.simpB = simpB;
     }
 
-    public CANOpenHeartbeatPayload build() {
-      CANOpenHeartbeatPayload cANOpenHeartbeatPayload = new CANOpenHeartbeatPayload(state);
-      return cANOpenHeartbeatPayload;
+    public EnumDiscriminatedTypeParameterB build() {
+      EnumDiscriminatedTypeParameterB enumDiscriminatedTypeParameterB =
+          new EnumDiscriminatedTypeParameterB(simpB);
+      return enumDiscriminatedTypeParameterB;
     }
   }
 
@@ -126,16 +120,16 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CANOpenHeartbeatPayload)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameterB)) {
       return false;
     }
-    CANOpenHeartbeatPayload that = (CANOpenHeartbeatPayload) o;
-    return (getState() == that.getState()) && super.equals(that) && true;
+    EnumDiscriminatedTypeParameterB that = (EnumDiscriminatedTypeParameterB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getState());
+    return Objects.hash(super.hashCode(), getSimpB());
   }
 
   @Override
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetRemoteLogging.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterC.java
similarity index 57%
copy from plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetRemoteLogging.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterC.java
index d5cde72c42..7fb1c26c91 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetRemoteLogging.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterC.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.knxnetip.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,35 +35,37 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class KnxNetRemoteLogging extends ServiceId implements Message {
+public class EnumDiscriminatedTypeParameterC extends EnumDiscriminatedTypeParameter
+    implements Message {
 
   // Accessors for discriminator values.
-  public Short getServiceType() {
-    return (short) 0x06;
+  public EnumType getDiscr() {
+    return EnumType.INT;
   }
 
   // Properties.
-  protected final short version;
+  protected final short simpC;
 
-  public KnxNetRemoteLogging(short version) {
+  public EnumDiscriminatedTypeParameterC(short simpC) {
     super();
-    this.version = version;
+    this.simpC = simpC;
   }
 
-  public short getVersion() {
-    return version;
+  public short getSimpC() {
+    return simpC;
   }
 
   @Override
-  protected void serializeServiceIdChild(WriteBuffer writeBuffer) throws SerializationException {
+  protected void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("KnxNetRemoteLogging");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterC");
 
-    // Simple Field (version)
-    writeSimpleField("version", version, writeUnsignedShort(writeBuffer, 8));
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("KnxNetRemoteLogging");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterC");
   }
 
   @Override
@@ -74,39 +76,42 @@ public class KnxNetRemoteLogging extends ServiceId implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    KnxNetRemoteLogging _value = this;
+    EnumDiscriminatedTypeParameterC _value = this;
 
-    // Simple field (version)
+    // Simple field (simpC)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static KnxNetRemoteLoggingBuilder staticParseBuilder(ReadBuffer readBuffer)
-      throws ParseException {
-    readBuffer.pullContext("KnxNetRemoteLogging");
+  public static EnumDiscriminatedTypeParameterBuilder
+      staticParseEnumDiscriminatedTypeParameterBuilder(ReadBuffer readBuffer, EnumType discr)
+          throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterC");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short version = readSimpleField("version", readUnsignedShort(readBuffer, 8));
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("KnxNetRemoteLogging");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterC");
     // Create the instance
-    return new KnxNetRemoteLoggingBuilder(version);
+    return new EnumDiscriminatedTypeParameterCBuilderImpl(simpC);
   }
 
-  public static class KnxNetRemoteLoggingBuilder implements ServiceId.ServiceIdBuilder {
-    private final short version;
+  public static class EnumDiscriminatedTypeParameterCBuilderImpl
+      implements EnumDiscriminatedTypeParameter.EnumDiscriminatedTypeParameterBuilder {
+    private final short simpC;
 
-    public KnxNetRemoteLoggingBuilder(short version) {
+    public EnumDiscriminatedTypeParameterCBuilderImpl(short simpC) {
 
-      this.version = version;
+      this.simpC = simpC;
     }
 
-    public KnxNetRemoteLogging build() {
-      KnxNetRemoteLogging knxNetRemoteLogging = new KnxNetRemoteLogging(version);
-      return knxNetRemoteLogging;
+    public EnumDiscriminatedTypeParameterC build() {
+      EnumDiscriminatedTypeParameterC enumDiscriminatedTypeParameterC =
+          new EnumDiscriminatedTypeParameterC(simpC);
+      return enumDiscriminatedTypeParameterC;
     }
   }
 
@@ -115,16 +120,16 @@ public class KnxNetRemoteLogging extends ServiceId implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof KnxNetRemoteLogging)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameterC)) {
       return false;
     }
-    KnxNetRemoteLogging that = (KnxNetRemoteLogging) o;
-    return (getVersion() == that.getVersion()) && super.equals(that) && true;
+    EnumDiscriminatedTypeParameterC that = (EnumDiscriminatedTypeParameterC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getVersion());
+    return Objects.hash(super.hashCode(), getSimpC());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultiple.java
similarity index 53%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultiple.java
index 6e7e5aa558..a5aa522d53 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Payload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultiple.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.s7.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,33 +35,29 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class S7Payload implements Message {
+public abstract class EnumDiscriminatedTypeParameterMultiple implements Message {
 
   // Abstract accessors for discriminator values.
-  public abstract Short getMessageType();
+  public abstract EnumType getDiscr1();
 
-  public abstract Short getParameterParameterType();
+  public abstract EnumTypeInt getDiscr2();
 
-  // Arguments.
-  protected final S7Parameter parameter;
-
-  public S7Payload(S7Parameter parameter) {
+  public EnumDiscriminatedTypeParameterMultiple() {
     super();
-    this.parameter = parameter;
   }
 
-  protected abstract void serializeS7PayloadChild(WriteBuffer writeBuffer)
-      throws SerializationException;
+  protected abstract void serializeEnumDiscriminatedTypeParameterMultipleChild(
+      WriteBuffer writeBuffer) throws SerializationException;
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7Payload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultiple");
 
     // Switch field (Serialize the sub-type)
-    serializeS7PayloadChild(writeBuffer);
+    serializeEnumDiscriminatedTypeParameterMultipleChild(writeBuffer);
 
-    writeBuffer.popContext("S7Payload");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultiple");
   }
 
   @Override
@@ -72,83 +68,89 @@ public abstract class S7Payload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    S7Payload _value = this;
+    EnumDiscriminatedTypeParameterMultiple _value = this;
 
     // Length of sub-type elements will be added by sub-type...
 
     return lengthInBits;
   }
 
-  public static S7Payload staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+  public static EnumDiscriminatedTypeParameterMultiple staticParse(
+      ReadBuffer readBuffer, Object... args) throws ParseException {
     PositionAware positionAware = readBuffer;
     if ((args == null) || (args.length != 2)) {
       throw new PlcRuntimeException(
           "Wrong number of arguments, expected 2, but got " + args.length);
     }
-    Short messageType;
-    if (args[0] instanceof Short) {
-      messageType = (Short) args[0];
+    EnumType discr1;
+    if (args[0] instanceof EnumType) {
+      discr1 = (EnumType) args[0];
     } else if (args[0] instanceof String) {
-      messageType = Short.valueOf((String) args[0]);
+      discr1 = EnumType.valueOf((String) args[0]);
     } else {
       throw new PlcRuntimeException(
-          "Argument 0 expected to be of type Short or a string which is parseable but was "
+          "Argument 0 expected to be of type EnumType or a string which is parseable but was "
               + args[0].getClass().getName());
     }
-    S7Parameter parameter;
-    if (args[1] instanceof S7Parameter) {
-      parameter = (S7Parameter) args[1];
+    EnumTypeInt discr2;
+    if (args[1] instanceof EnumTypeInt) {
+      discr2 = (EnumTypeInt) args[1];
+    } else if (args[1] instanceof String) {
+      discr2 = EnumTypeInt.valueOf((String) args[1]);
     } else {
       throw new PlcRuntimeException(
-          "Argument 1 expected to be of type S7Parameter or a string which is parseable but was "
+          "Argument 1 expected to be of type EnumTypeInt or a string which is parseable but was "
               + args[1].getClass().getName());
     }
-    return staticParse(readBuffer, messageType, parameter);
+    return staticParse(readBuffer, discr1, discr2);
   }
 
-  public static S7Payload staticParse(
-      ReadBuffer readBuffer, Short messageType, S7Parameter parameter) throws ParseException {
-    readBuffer.pullContext("S7Payload");
+  public static EnumDiscriminatedTypeParameterMultiple staticParse(
+      ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultiple");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    S7PayloadBuilder builder = null;
-    if (EvaluationHelper.equals(parameter.getParameterType(), (short) 0x04)
-        && EvaluationHelper.equals(messageType, (short) 0x03)) {
-      builder = S7PayloadReadVarResponse.staticParseBuilder(readBuffer, messageType, parameter);
-    } else if (EvaluationHelper.equals(parameter.getParameterType(), (short) 0x05)
-        && EvaluationHelper.equals(messageType, (short) 0x01)) {
-      builder = S7PayloadWriteVarRequest.staticParseBuilder(readBuffer, messageType, parameter);
-    } else if (EvaluationHelper.equals(parameter.getParameterType(), (short) 0x05)
-        && EvaluationHelper.equals(messageType, (short) 0x03)) {
-      builder = S7PayloadWriteVarResponse.staticParseBuilder(readBuffer, messageType, parameter);
-    } else if (EvaluationHelper.equals(parameter.getParameterType(), (short) 0x00)
-        && EvaluationHelper.equals(messageType, (short) 0x07)) {
-      builder = S7PayloadUserData.staticParseBuilder(readBuffer, messageType, parameter);
+    EnumDiscriminatedTypeParameterMultipleBuilder builder = null;
+    if (EvaluationHelper.equals(discr1, EnumType.BOOL)
+        && EvaluationHelper.equals(discr2, EnumTypeInt.BOOLINT)) {
+      builder =
+          EnumDiscriminatedTypeParameterMultipleA
+              .staticParseEnumDiscriminatedTypeParameterMultipleBuilder(readBuffer, discr1, discr2);
+    } else if (EvaluationHelper.equals(discr1, EnumType.UINT)
+        && EvaluationHelper.equals(discr2, EnumTypeInt.UINTINT)) {
+      builder =
+          EnumDiscriminatedTypeParameterMultipleB
+              .staticParseEnumDiscriminatedTypeParameterMultipleBuilder(readBuffer, discr1, discr2);
+    } else if (EvaluationHelper.equals(discr1, EnumType.INT)
+        && EvaluationHelper.equals(discr2, EnumTypeInt.INTINT)) {
+      builder =
+          EnumDiscriminatedTypeParameterMultipleC
+              .staticParseEnumDiscriminatedTypeParameterMultipleBuilder(readBuffer, discr1, discr2);
     }
     if (builder == null) {
       throw new ParseException(
           "Unsupported case for discriminated type"
               + " parameters ["
-              + "parameterparameterType="
-              + parameter.getParameterType()
+              + "discr1="
+              + discr1
               + " "
-              + "messageType="
-              + messageType
+              + "discr2="
+              + discr2
               + "]");
     }
 
-    readBuffer.closeContext("S7Payload");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultiple");
     // Create the instance
-    S7Payload _s7Payload = builder.build(parameter);
-
-    return _s7Payload;
+    EnumDiscriminatedTypeParameterMultiple _enumDiscriminatedTypeParameterMultiple =
+        builder.build();
+    return _enumDiscriminatedTypeParameterMultiple;
   }
 
-  public static interface S7PayloadBuilder {
-    S7Payload build(S7Parameter parameter);
+  public interface EnumDiscriminatedTypeParameterMultipleBuilder {
+    EnumDiscriminatedTypeParameterMultiple build();
   }
 
   @Override
@@ -156,10 +158,10 @@ public abstract class S7Payload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7Payload)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultiple)) {
       return false;
     }
-    S7Payload that = (S7Payload) o;
+    EnumDiscriminatedTypeParameterMultiple that = (EnumDiscriminatedTypeParameterMultiple) o;
     return true;
   }
 
diff --git a/plc4j/drivers/modbus/src/main/generated/org/apache/plc4x/java/modbus/readwrite/ModbusPDUError.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleA.java
similarity index 54%
copy from plc4j/drivers/modbus/src/main/generated/org/apache/plc4x/java/modbus/readwrite/ModbusPDUError.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleA.java
index 1f91461099..463e50d90a 100644
--- a/plc4j/drivers/modbus/src/main/generated/org/apache/plc4x/java/modbus/readwrite/ModbusPDUError.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleA.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.modbus.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,48 +35,41 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class ModbusPDUError extends ModbusPDU implements Message {
+public class EnumDiscriminatedTypeParameterMultipleA extends EnumDiscriminatedTypeParameterMultiple
+    implements Message {
 
   // Accessors for discriminator values.
-  public Boolean getErrorFlag() {
-    return (boolean) true;
+  public EnumType getDiscr1() {
+    return EnumType.BOOL;
   }
 
-  public Short getFunctionFlag() {
-    return 0;
-  }
-
-  public Boolean getResponse() {
-    return false;
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.BOOLINT;
   }
 
   // Properties.
-  protected final ModbusErrorCode exceptionCode;
+  protected final short simpA;
 
-  public ModbusPDUError(ModbusErrorCode exceptionCode) {
+  public EnumDiscriminatedTypeParameterMultipleA(short simpA) {
     super();
-    this.exceptionCode = exceptionCode;
+    this.simpA = simpA;
   }
 
-  public ModbusErrorCode getExceptionCode() {
-    return exceptionCode;
+  public short getSimpA() {
+    return simpA;
   }
 
   @Override
-  protected void serializeModbusPDUChild(WriteBuffer writeBuffer) throws SerializationException {
+  protected void serializeEnumDiscriminatedTypeParameterMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("ModbusPDUError");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultipleA");
 
-    // Simple Field (exceptionCode)
-    writeSimpleEnumField(
-        "exceptionCode",
-        "ModbusErrorCode",
-        exceptionCode,
-        new DataWriterEnumDefault<>(
-            ModbusErrorCode::getValue, ModbusErrorCode::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("ModbusPDUError");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultipleA");
   }
 
   @Override
@@ -87,44 +80,43 @@ public class ModbusPDUError extends ModbusPDU implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    ModbusPDUError _value = this;
+    EnumDiscriminatedTypeParameterMultipleA _value = this;
 
-    // Simple field (exceptionCode)
+    // Simple field (simpA)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static ModbusPDUErrorBuilder staticParseBuilder(ReadBuffer readBuffer, Boolean response)
-      throws ParseException {
-    readBuffer.pullContext("ModbusPDUError");
+  public static EnumDiscriminatedTypeParameterMultipleBuilder
+      staticParseEnumDiscriminatedTypeParameterMultipleBuilder(
+          ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultipleA");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    ModbusErrorCode exceptionCode =
-        readEnumField(
-            "exceptionCode",
-            "ModbusErrorCode",
-            new DataReaderEnumDefault<>(
-                ModbusErrorCode::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("ModbusPDUError");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultipleA");
     // Create the instance
-    return new ModbusPDUErrorBuilder(exceptionCode);
+    return new EnumDiscriminatedTypeParameterMultipleABuilderImpl(simpA);
   }
 
-  public static class ModbusPDUErrorBuilder implements ModbusPDU.ModbusPDUBuilder {
-    private final ModbusErrorCode exceptionCode;
+  public static class EnumDiscriminatedTypeParameterMultipleABuilderImpl
+      implements EnumDiscriminatedTypeParameterMultiple
+          .EnumDiscriminatedTypeParameterMultipleBuilder {
+    private final short simpA;
 
-    public ModbusPDUErrorBuilder(ModbusErrorCode exceptionCode) {
+    public EnumDiscriminatedTypeParameterMultipleABuilderImpl(short simpA) {
 
-      this.exceptionCode = exceptionCode;
+      this.simpA = simpA;
     }
 
-    public ModbusPDUError build() {
-      ModbusPDUError modbusPDUError = new ModbusPDUError(exceptionCode);
-      return modbusPDUError;
+    public EnumDiscriminatedTypeParameterMultipleA build() {
+      EnumDiscriminatedTypeParameterMultipleA enumDiscriminatedTypeParameterMultipleA =
+          new EnumDiscriminatedTypeParameterMultipleA(simpA);
+      return enumDiscriminatedTypeParameterMultipleA;
     }
   }
 
@@ -133,16 +125,16 @@ public class ModbusPDUError extends ModbusPDU implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof ModbusPDUError)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultipleA)) {
       return false;
     }
-    ModbusPDUError that = (ModbusPDUError) o;
-    return (getExceptionCode() == that.getExceptionCode()) && super.equals(that) && true;
+    EnumDiscriminatedTypeParameterMultipleA that = (EnumDiscriminatedTypeParameterMultipleA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getExceptionCode());
+    return Objects.hash(super.hashCode(), getSimpA());
   }
 
   @Override
diff --git a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleB.java
similarity index 54%
copy from plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleB.java
index eb4f353360..934a1e2f7f 100644
--- a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleB.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.canopen.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,41 +35,41 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
+public class EnumDiscriminatedTypeParameterMultipleB extends EnumDiscriminatedTypeParameterMultiple
+    implements Message {
 
   // Accessors for discriminator values.
-  public CANOpenService getService() {
-    return CANOpenService.HEARTBEAT;
+  public EnumType getDiscr1() {
+    return EnumType.UINT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.UINTINT;
   }
 
   // Properties.
-  protected final NMTState state;
+  protected final short simpB;
 
-  public CANOpenHeartbeatPayload(NMTState state) {
+  public EnumDiscriminatedTypeParameterMultipleB(short simpB) {
     super();
-    this.state = state;
+    this.simpB = simpB;
   }
 
-  public NMTState getState() {
-    return state;
+  public short getSimpB() {
+    return simpB;
   }
 
   @Override
-  protected void serializeCANOpenPayloadChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeParameterMultipleChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CANOpenHeartbeatPayload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultipleB");
 
-    // Simple Field (state)
-    writeSimpleEnumField(
-        "state",
-        "NMTState",
-        state,
-        new DataWriterEnumDefault<>(
-            NMTState::getValue, NMTState::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("CANOpenHeartbeatPayload");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultipleB");
   }
 
   @Override
@@ -80,44 +80,43 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    CANOpenHeartbeatPayload _value = this;
+    EnumDiscriminatedTypeParameterMultipleB _value = this;
 
-    // Simple field (state)
+    // Simple field (simpB)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static CANOpenHeartbeatPayloadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, CANOpenService service) throws ParseException {
-    readBuffer.pullContext("CANOpenHeartbeatPayload");
+  public static EnumDiscriminatedTypeParameterMultipleBuilder
+      staticParseEnumDiscriminatedTypeParameterMultipleBuilder(
+          ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultipleB");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NMTState state =
-        readEnumField(
-            "state",
-            "NMTState",
-            new DataReaderEnumDefault<>(NMTState::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("CANOpenHeartbeatPayload");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultipleB");
     // Create the instance
-    return new CANOpenHeartbeatPayloadBuilder(state);
+    return new EnumDiscriminatedTypeParameterMultipleBBuilderImpl(simpB);
   }
 
-  public static class CANOpenHeartbeatPayloadBuilder
-      implements CANOpenPayload.CANOpenPayloadBuilder {
-    private final NMTState state;
+  public static class EnumDiscriminatedTypeParameterMultipleBBuilderImpl
+      implements EnumDiscriminatedTypeParameterMultiple
+          .EnumDiscriminatedTypeParameterMultipleBuilder {
+    private final short simpB;
 
-    public CANOpenHeartbeatPayloadBuilder(NMTState state) {
+    public EnumDiscriminatedTypeParameterMultipleBBuilderImpl(short simpB) {
 
-      this.state = state;
+      this.simpB = simpB;
     }
 
-    public CANOpenHeartbeatPayload build() {
-      CANOpenHeartbeatPayload cANOpenHeartbeatPayload = new CANOpenHeartbeatPayload(state);
-      return cANOpenHeartbeatPayload;
+    public EnumDiscriminatedTypeParameterMultipleB build() {
+      EnumDiscriminatedTypeParameterMultipleB enumDiscriminatedTypeParameterMultipleB =
+          new EnumDiscriminatedTypeParameterMultipleB(simpB);
+      return enumDiscriminatedTypeParameterMultipleB;
     }
   }
 
@@ -126,16 +125,16 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CANOpenHeartbeatPayload)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultipleB)) {
       return false;
     }
-    CANOpenHeartbeatPayload that = (CANOpenHeartbeatPayload) o;
-    return (getState() == that.getState()) && super.equals(that) && true;
+    EnumDiscriminatedTypeParameterMultipleB that = (EnumDiscriminatedTypeParameterMultipleB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getState());
+    return Objects.hash(super.hashCode(), getSimpB());
   }
 
   @Override
diff --git a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleC.java
similarity index 54%
copy from plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleC.java
index eb4f353360..c3ddc71c3e 100644
--- a/plc4j/drivers/canopen/src/main/generated/org/apache/plc4x/java/canopen/readwrite/CANOpenHeartbeatPayload.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleC.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.canopen.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,41 +35,41 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
+public class EnumDiscriminatedTypeParameterMultipleC extends EnumDiscriminatedTypeParameterMultiple
+    implements Message {
 
   // Accessors for discriminator values.
-  public CANOpenService getService() {
-    return CANOpenService.HEARTBEAT;
+  public EnumType getDiscr1() {
+    return EnumType.INT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.INTINT;
   }
 
   // Properties.
-  protected final NMTState state;
+  protected final short simpC;
 
-  public CANOpenHeartbeatPayload(NMTState state) {
+  public EnumDiscriminatedTypeParameterMultipleC(short simpC) {
     super();
-    this.state = state;
+    this.simpC = simpC;
   }
 
-  public NMTState getState() {
-    return state;
+  public short getSimpC() {
+    return simpC;
   }
 
   @Override
-  protected void serializeCANOpenPayloadChild(WriteBuffer writeBuffer)
+  protected void serializeEnumDiscriminatedTypeParameterMultipleChild(WriteBuffer writeBuffer)
       throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CANOpenHeartbeatPayload");
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultipleC");
 
-    // Simple Field (state)
-    writeSimpleEnumField(
-        "state",
-        "NMTState",
-        state,
-        new DataWriterEnumDefault<>(
-            NMTState::getValue, NMTState::name, writeUnsignedShort(writeBuffer, 8)));
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("CANOpenHeartbeatPayload");
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultipleC");
   }
 
   @Override
@@ -80,44 +80,43 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    CANOpenHeartbeatPayload _value = this;
+    EnumDiscriminatedTypeParameterMultipleC _value = this;
 
-    // Simple field (state)
+    // Simple field (simpC)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static CANOpenHeartbeatPayloadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, CANOpenService service) throws ParseException {
-    readBuffer.pullContext("CANOpenHeartbeatPayload");
+  public static EnumDiscriminatedTypeParameterMultipleBuilder
+      staticParseEnumDiscriminatedTypeParameterMultipleBuilder(
+          ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultipleC");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    NMTState state =
-        readEnumField(
-            "state",
-            "NMTState",
-            new DataReaderEnumDefault<>(NMTState::enumForValue, readUnsignedShort(readBuffer, 8)));
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
 
-    readBuffer.closeContext("CANOpenHeartbeatPayload");
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultipleC");
     // Create the instance
-    return new CANOpenHeartbeatPayloadBuilder(state);
+    return new EnumDiscriminatedTypeParameterMultipleCBuilderImpl(simpC);
   }
 
-  public static class CANOpenHeartbeatPayloadBuilder
-      implements CANOpenPayload.CANOpenPayloadBuilder {
-    private final NMTState state;
+  public static class EnumDiscriminatedTypeParameterMultipleCBuilderImpl
+      implements EnumDiscriminatedTypeParameterMultiple
+          .EnumDiscriminatedTypeParameterMultipleBuilder {
+    private final short simpC;
 
-    public CANOpenHeartbeatPayloadBuilder(NMTState state) {
+    public EnumDiscriminatedTypeParameterMultipleCBuilderImpl(short simpC) {
 
-      this.state = state;
+      this.simpC = simpC;
     }
 
-    public CANOpenHeartbeatPayload build() {
-      CANOpenHeartbeatPayload cANOpenHeartbeatPayload = new CANOpenHeartbeatPayload(state);
-      return cANOpenHeartbeatPayload;
+    public EnumDiscriminatedTypeParameterMultipleC build() {
+      EnumDiscriminatedTypeParameterMultipleC enumDiscriminatedTypeParameterMultipleC =
+          new EnumDiscriminatedTypeParameterMultipleC(simpC);
+      return enumDiscriminatedTypeParameterMultipleC;
     }
   }
 
@@ -126,16 +125,16 @@ public class CANOpenHeartbeatPayload extends CANOpenPayload implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CANOpenHeartbeatPayload)) {
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultipleC)) {
       return false;
     }
-    CANOpenHeartbeatPayload that = (CANOpenHeartbeatPayload) o;
-    return (getState() == that.getState()) && super.equals(that) && true;
+    EnumDiscriminatedTypeParameterMultipleC that = (EnumDiscriminatedTypeParameterMultipleC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getState());
+    return Objects.hash(super.hashCode(), getSimpC());
   }
 
   @Override
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumType.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumType.java
new file mode 100644
index 0000000000..b33ec4683f
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumType.java
@@ -0,0 +1,57 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum EnumType {
+  BOOL((short) 0x01),
+  UINT((short) 0x02),
+  INT((short) 0x03),
+  BYTE_ARRAY((short) 0x11);
+  private static final Map<Short, EnumType> map;
+
+  static {
+    map = new HashMap<>();
+    for (EnumType value : EnumType.values()) {
+      map.put((short) value.getValue(), value);
+    }
+  }
+
+  private short value;
+
+  EnumType(short value) {
+    this.value = value;
+  }
+
+  public short getValue() {
+    return value;
+  }
+
+  public static EnumType enumForValue(short value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(short value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeBit.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeBit.java
new file mode 100644
index 0000000000..62468467a8
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeBit.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum EnumTypeBit {
+  TRUE((boolean) true),
+  FALSE((boolean) false);
+  private static final Map<Boolean, EnumTypeBit> map;
+
+  static {
+    map = new HashMap<>();
+    for (EnumTypeBit value : EnumTypeBit.values()) {
+      map.put((boolean) value.getValue(), value);
+    }
+  }
+
+  private boolean value;
+
+  EnumTypeBit(boolean value) {
+    this.value = value;
+  }
+
+  public boolean getValue() {
+    return value;
+  }
+
+  public static EnumTypeBit enumForValue(boolean value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(boolean value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeInt.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeInt.java
new file mode 100644
index 0000000000..f11326834c
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeInt.java
@@ -0,0 +1,56 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import java.util.HashMap;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum EnumTypeInt {
+  BOOLINT((byte) 0x01),
+  UINTINT((byte) 0x02),
+  INTINT((byte) 0x03);
+  private static final Map<Byte, EnumTypeInt> map;
+
+  static {
+    map = new HashMap<>();
+    for (EnumTypeInt value : EnumTypeInt.values()) {
+      map.put((byte) value.getValue(), value);
+    }
+  }
+
+  private byte value;
+
+  EnumTypeInt(byte value) {
+    this.value = value;
+  }
+
+  public byte getValue() {
+    return value;
+  }
+
+  public static EnumTypeInt enumForValue(byte value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(byte value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeParameters.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeParameters.java
new file mode 100644
index 0000000000..89856065ba
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeParameters.java
@@ -0,0 +1,188 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import java.util.ArrayList;
+import java.util.HashMap;
+import java.util.List;
+import java.util.Map;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public enum EnumTypeParameters {
+  BOOL((byte) 0x01, (short) 1, (byte) 1, (String) "BOOL", EnumType.BOOL, (boolean) false),
+  BYTE((byte) 0x02, (short) 2, (byte) 2, (String) "BYTE", EnumType.UINT, (boolean) true);
+  private static final Map<Byte, EnumTypeParameters> map;
+
+  static {
+    map = new HashMap<>();
+    for (EnumTypeParameters value : EnumTypeParameters.values()) {
+      map.put((byte) value.getValue(), value);
+    }
+  }
+
+  private byte value;
+  private short uintType;
+  private byte intType;
+  private String stringType;
+  private EnumType enumType;
+  private boolean bitType;
+
+  EnumTypeParameters(
+      byte value,
+      short uintType,
+      byte intType,
+      String stringType,
+      EnumType enumType,
+      boolean bitType) {
+    this.value = value;
+    this.uintType = uintType;
+    this.intType = intType;
+    this.stringType = stringType;
+    this.enumType = enumType;
+    this.bitType = bitType;
+  }
+
+  public byte getValue() {
+    return value;
+  }
+
+  public short getUintType() {
+    return uintType;
+  }
+
+  public static EnumTypeParameters firstEnumForFieldUintType(short fieldValue) {
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getUintType() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<EnumTypeParameters> enumsForFieldUintType(short fieldValue) {
+    List<EnumTypeParameters> _values = new ArrayList();
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getUintType() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public byte getIntType() {
+    return intType;
+  }
+
+  public static EnumTypeParameters firstEnumForFieldIntType(byte fieldValue) {
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getIntType() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<EnumTypeParameters> enumsForFieldIntType(byte fieldValue) {
+    List<EnumTypeParameters> _values = new ArrayList();
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getIntType() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public String getStringType() {
+    return stringType;
+  }
+
+  public static EnumTypeParameters firstEnumForFieldStringType(String fieldValue) {
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getStringType().equals(fieldValue)) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<EnumTypeParameters> enumsForFieldStringType(String fieldValue) {
+    List<EnumTypeParameters> _values = new ArrayList();
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getStringType().equals(fieldValue)) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public EnumType getEnumType() {
+    return enumType;
+  }
+
+  public static EnumTypeParameters firstEnumForFieldEnumType(EnumType fieldValue) {
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getEnumType() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<EnumTypeParameters> enumsForFieldEnumType(EnumType fieldValue) {
+    List<EnumTypeParameters> _values = new ArrayList();
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getEnumType() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public boolean getBitType() {
+    return bitType;
+  }
+
+  public static EnumTypeParameters firstEnumForFieldBitType(boolean fieldValue) {
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getBitType() == fieldValue) {
+        return _val;
+      }
+    }
+    return null;
+  }
+
+  public static List<EnumTypeParameters> enumsForFieldBitType(boolean fieldValue) {
+    List<EnumTypeParameters> _values = new ArrayList();
+    for (EnumTypeParameters _val : EnumTypeParameters.values()) {
+      if (_val.getBitType() == fieldValue) {
+        _values.add(_val);
+      }
+    }
+    return _values;
+  }
+
+  public static EnumTypeParameters enumForValue(byte value) {
+    return map.get(value);
+  }
+
+  public static Boolean isDefined(byte value) {
+    return map.containsKey(value);
+  }
+}
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpCore.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeTest.java
similarity index 60%
copy from plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpCore.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeTest.java
index 8f9ab9efaa..e6044da752 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpCore.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.knxnetip.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,35 +35,36 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class KnxNetIpCore extends ServiceId implements Message {
-
-  // Accessors for discriminator values.
-  public Short getServiceType() {
-    return (short) 0x02;
-  }
+public class EnumTypeTest implements Message {
 
   // Properties.
-  protected final short version;
+  protected final EnumTypeParameters enumField;
 
-  public KnxNetIpCore(short version) {
+  public EnumTypeTest(EnumTypeParameters enumField) {
     super();
-    this.version = version;
+    this.enumField = enumField;
   }
 
-  public short getVersion() {
-    return version;
+  public EnumTypeParameters getEnumField() {
+    return enumField;
   }
 
-  @Override
-  protected void serializeServiceIdChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("KnxNetIpCore");
-
-    // Simple Field (version)
-    writeSimpleField("version", version, writeUnsignedShort(writeBuffer, 8));
-
-    writeBuffer.popContext("KnxNetIpCore");
+    writeBuffer.pushContext("EnumTypeTest");
+
+    // Enum field (enumField)
+    writeEnumField(
+        "enumField",
+        "EnumTypeParameters",
+        enumField,
+        new DataWriterEnumDefault<>(
+            EnumTypeParameters::getIntType,
+            EnumTypeParameters::name,
+            writeSignedByte(writeBuffer, 8)));
+
+    writeBuffer.popContext("EnumTypeTest");
   }
 
   @Override
@@ -73,41 +74,38 @@ public class KnxNetIpCore extends ServiceId implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    KnxNetIpCore _value = this;
+    int lengthInBits = 0;
+    EnumTypeTest _value = this;
 
-    // Simple field (version)
+    // Enum Field (enumField)
     lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static KnxNetIpCoreBuilder staticParseBuilder(ReadBuffer readBuffer)
+  public static EnumTypeTest staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("KnxNetIpCore");
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static EnumTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumTypeTest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short version = readSimpleField("version", readUnsignedShort(readBuffer, 8));
+    EnumTypeParameters enumField =
+        readEnumField(
+            "enumField",
+            "EnumTypeParameters",
+            readEnum(EnumTypeParameters::firstEnumForFieldIntType, readSignedByte(readBuffer, 8)));
 
-    readBuffer.closeContext("KnxNetIpCore");
+    readBuffer.closeContext("EnumTypeTest");
     // Create the instance
-    return new KnxNetIpCoreBuilder(version);
-  }
-
-  public static class KnxNetIpCoreBuilder implements ServiceId.ServiceIdBuilder {
-    private final short version;
-
-    public KnxNetIpCoreBuilder(short version) {
-
-      this.version = version;
-    }
-
-    public KnxNetIpCore build() {
-      KnxNetIpCore knxNetIpCore = new KnxNetIpCore(version);
-      return knxNetIpCore;
-    }
+    EnumTypeTest _enumTypeTest;
+    _enumTypeTest = new EnumTypeTest(enumField);
+    return _enumTypeTest;
   }
 
   @Override
@@ -115,16 +113,16 @@ public class KnxNetIpCore extends ServiceId implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof KnxNetIpCore)) {
+    if (!(o instanceof EnumTypeTest)) {
       return false;
     }
-    KnxNetIpCore that = (KnxNetIpCore) o;
-    return (getVersion() == that.getVersion()) && super.equals(that) && true;
+    EnumTypeTest that = (EnumTypeTest) o;
+    return (getEnumField() == that.getEnumField()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getVersion());
+    return Objects.hash(getEnumField());
   }
 
   @Override
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTest.java
new file mode 100644
index 0000000000..2005029990
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTest.java
@@ -0,0 +1,325 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class FieldTypeTest implements Message {
+
+  // Constant values.
+  public static final Short CONSTFIELD = 5;
+
+  // Properties.
+  protected final short simpleField;
+  protected final List<Short> arrayFieldCount;
+  protected final List<Short> arrayFieldLength;
+  protected final List<Short> arrayFieldTerminated;
+  protected final short assertField;
+  protected final EnumTypeParameters enumField;
+  protected final short manualField;
+  protected final Short optionalField;
+  protected final short peekField;
+  // Reserved Fields
+  private Short reservedField0;
+
+  public FieldTypeTest(
+      short simpleField,
+      List<Short> arrayFieldCount,
+      List<Short> arrayFieldLength,
+      List<Short> arrayFieldTerminated,
+      short assertField,
+      EnumTypeParameters enumField,
+      short manualField,
+      Short optionalField,
+      short peekField) {
+    super();
+    this.simpleField = simpleField;
+    this.arrayFieldCount = arrayFieldCount;
+    this.arrayFieldLength = arrayFieldLength;
+    this.arrayFieldTerminated = arrayFieldTerminated;
+    this.assertField = assertField;
+    this.enumField = enumField;
+    this.manualField = manualField;
+    this.optionalField = optionalField;
+    this.peekField = peekField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  public List<Short> getArrayFieldCount() {
+    return arrayFieldCount;
+  }
+
+  public List<Short> getArrayFieldLength() {
+    return arrayFieldLength;
+  }
+
+  public List<Short> getArrayFieldTerminated() {
+    return arrayFieldTerminated;
+  }
+
+  public short getAssertField() {
+    return assertField;
+  }
+
+  public EnumTypeParameters getEnumField() {
+    return enumField;
+  }
+
+  public short getManualField() {
+    return manualField;
+  }
+
+  public Short getOptionalField() {
+    return optionalField;
+  }
+
+  public short getPeekField() {
+    return peekField;
+  }
+
+  public short getVirtualField() {
+    return (short) ((getConstField()) + (10));
+  }
+
+  public short getConstField() {
+    return CONSTFIELD;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    throw new SerializationException("Unknown field not serializable");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    FieldTypeTest _value = this;
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // Array field
+    if (arrayFieldCount != null) {
+      lengthInBits += 8 * arrayFieldCount.size();
+    }
+
+    // Array field
+    if (arrayFieldLength != null) {
+      lengthInBits += 8 * arrayFieldLength.size();
+    }
+
+    // Array field
+    if (arrayFieldTerminated != null) {
+      lengthInBits += 8 * arrayFieldTerminated.size();
+    }
+
+    // Checksum Field (checksum)
+    lengthInBits += 8;
+
+    // Const Field (constField)
+    lengthInBits += 8;
+
+    // Enum Field (enumField)
+    lengthInBits += 8;
+
+    // Implicit Field (implicitField)
+    lengthInBits += 8;
+
+    // Manual Field (manualField)
+    lengthInBits += (simpleField) * (8);
+
+    // Optional Field (optionalField)
+    if (optionalField != null) {
+      lengthInBits += 8;
+    }
+
+    // Padding Field (padding)
+    int _timesPadding = (int) (simpleField);
+    while (_timesPadding-- > 0) {
+      lengthInBits += 8;
+    }
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Unknown field
+    lengthInBits += 8;
+
+    // A virtual field doesn't have any in- or output.
+
+    return lengthInBits;
+  }
+
+  public static FieldTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static FieldTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("FieldTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
+
+    List<Short> arrayFieldCount =
+        readCountArrayField("arrayFieldCount", readUnsignedShort(readBuffer, 8), 5);
+
+    List<Short> arrayFieldLength =
+        readLengthArrayField("arrayFieldLength", readUnsignedShort(readBuffer, 8), 5);
+
+    List<Short> arrayFieldTerminated =
+        readTerminatedArrayField(
+            "arrayFieldTerminated", readUnsignedShort(readBuffer, 8), () -> ((boolean) (true)));
+
+    short assertField =
+        readAssertField("assertField", readUnsignedShort(readBuffer, 8), (short) (42));
+
+    short checksumField =
+        readChecksumField(
+            "checksumField",
+            readUnsignedShort(readBuffer, 8),
+            (short) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcUint8(-(23))));
+
+    short constField =
+        readConstField("constField", readUnsignedShort(readBuffer, 8), FieldTypeTest.CONSTFIELD);
+
+    EnumTypeParameters enumField =
+        readEnumField(
+            "enumField",
+            "EnumTypeParameters",
+            readEnum(EnumTypeParameters::firstEnumForFieldIntType, readSignedByte(readBuffer, 8)));
+
+    short implicitField = readImplicitField("implicitField", readUnsignedShort(readBuffer, 8));
+
+    short manualField =
+        readManualField(
+            "manualField",
+            readBuffer,
+            () ->
+                (short)
+                    (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.readManualField(
+                        readBuffer, simpleField)));
+
+    Short optionalField =
+        readOptionalField("optionalField", readUnsignedShort(readBuffer, 8), (simpleField) == (5));
+
+    readPaddingField(readUnsignedShort(readBuffer, 8), (int) (simpleField));
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    readUnknownField("unknown", readUnsignedShort(readBuffer, 8));
+    short virtualField = readVirtualField("virtualField", short.class, (constField) + (10));
+    // Validation
+    if (!(false)) {
+      throw new ParseValidationException("Validation Message");
+    }
+
+    short peekField = readPeekField("peekField", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("FieldTypeTest");
+    // Create the instance
+    FieldTypeTest _fieldTypeTest;
+    _fieldTypeTest =
+        new FieldTypeTest(
+            simpleField,
+            arrayFieldCount,
+            arrayFieldLength,
+            arrayFieldTerminated,
+            assertField,
+            enumField,
+            manualField,
+            optionalField,
+            peekField);
+    _fieldTypeTest.reservedField0 = reservedField0;
+    return _fieldTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof FieldTypeTest)) {
+      return false;
+    }
+    FieldTypeTest that = (FieldTypeTest) o;
+    return (getSimpleField() == that.getSimpleField())
+        && (getArrayFieldCount() == that.getArrayFieldCount())
+        && (getArrayFieldLength() == that.getArrayFieldLength())
+        && (getArrayFieldTerminated() == that.getArrayFieldTerminated())
+        && (getAssertField() == that.getAssertField())
+        && (getEnumField() == that.getEnumField())
+        && (getManualField() == that.getManualField())
+        && (getOptionalField() == that.getOptionalField())
+        && (getPeekField() == that.getPeekField())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getSimpleField(),
+        getArrayFieldCount(),
+        getArrayFieldLength(),
+        getArrayFieldTerminated(),
+        getAssertField(),
+        getEnumField(),
+        getManualField(),
+        getOptionalField(),
+        getPeekField());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTestWithUnknownField.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTestWithUnknownField.java
new file mode 100644
index 0000000000..634e3111c4
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTestWithUnknownField.java
@@ -0,0 +1,225 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class FieldTypeTestWithUnknownField implements Message {
+
+  // Constant values.
+  public static final Short CONSTFIELD = 5;
+
+  // Properties.
+  protected final short simpleField;
+  protected final List<Short> arrayField;
+  protected final EnumTypeParameters enumField;
+  protected final Short optionalField;
+  // Reserved Fields
+  private Short reservedField0;
+
+  public FieldTypeTestWithUnknownField(
+      short simpleField,
+      List<Short> arrayField,
+      EnumTypeParameters enumField,
+      Short optionalField) {
+    super();
+    this.simpleField = simpleField;
+    this.arrayField = arrayField;
+    this.enumField = enumField;
+    this.optionalField = optionalField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  public List<Short> getArrayField() {
+    return arrayField;
+  }
+
+  public EnumTypeParameters getEnumField() {
+    return enumField;
+  }
+
+  public Short getOptionalField() {
+    return optionalField;
+  }
+
+  public short getConstField() {
+    return CONSTFIELD;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    throw new SerializationException("Unknown field not serializable");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    FieldTypeTestWithUnknownField _value = this;
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // Array field
+    if (arrayField != null) {
+      lengthInBits += 8 * arrayField.size();
+    }
+
+    // Checksum Field (checksum)
+    lengthInBits += 8;
+
+    // Const Field (constField)
+    lengthInBits += 8;
+
+    // Enum Field (enumField)
+    lengthInBits += 8;
+
+    // Implicit Field (implicitField)
+    lengthInBits += 8;
+
+    // Optional Field (optionalField)
+    if (optionalField != null) {
+      lengthInBits += 8;
+    }
+
+    // Padding Field (padding)
+    int _timesPadding = (int) (simpleField);
+    while (_timesPadding-- > 0) {
+      lengthInBits += 8;
+    }
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Unknown field
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static FieldTypeTestWithUnknownField staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static FieldTypeTestWithUnknownField staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("FieldTypeTestWithUnknownField");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
+
+    List<Short> arrayField = readCountArrayField("arrayField", readUnsignedShort(readBuffer, 8), 5);
+
+    short checksumField =
+        readChecksumField(
+            "checksumField",
+            readUnsignedShort(readBuffer, 8),
+            (short) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcUint8(-(23))));
+
+    short constField =
+        readConstField(
+            "constField",
+            readUnsignedShort(readBuffer, 8),
+            FieldTypeTestWithUnknownField.CONSTFIELD);
+
+    EnumTypeParameters enumField =
+        readEnumField(
+            "enumField",
+            "EnumTypeParameters",
+            readEnum(EnumTypeParameters::firstEnumForFieldIntType, readSignedByte(readBuffer, 8)));
+
+    short implicitField = readImplicitField("implicitField", readUnsignedShort(readBuffer, 8));
+
+    Short optionalField =
+        readOptionalField("optionalField", readUnsignedShort(readBuffer, 8), (simpleField) == (5));
+
+    readPaddingField(readUnsignedShort(readBuffer, 8), (int) (simpleField));
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    readUnknownField("unknown", readUnsignedInt(readBuffer, 16));
+
+    readBuffer.closeContext("FieldTypeTestWithUnknownField");
+    // Create the instance
+    FieldTypeTestWithUnknownField _fieldTypeTestWithUnknownField;
+    _fieldTypeTestWithUnknownField =
+        new FieldTypeTestWithUnknownField(simpleField, arrayField, enumField, optionalField);
+    _fieldTypeTestWithUnknownField.reservedField0 = reservedField0;
+    return _fieldTypeTestWithUnknownField;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof FieldTypeTestWithUnknownField)) {
+      return false;
+    }
+    FieldTypeTestWithUnknownField that = (FieldTypeTestWithUnknownField) o;
+    return (getSimpleField() == that.getSimpleField())
+        && (getArrayField() == that.getArrayField())
+        && (getEnumField() == that.getEnumField())
+        && (getOptionalField() == that.getOptionalField())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getSimpleField(), getArrayField(), getEnumField(), getOptionalField());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitPascalStringTypeTest.java
similarity index 57%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitPascalStringTypeTest.java
index 4fbed10ec8..51b4a57d9a 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitPascalStringTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.s7.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,30 +35,34 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class S7Address implements Message {
+public class ImplicitPascalStringTypeTest implements Message {
 
-  // Abstract accessors for discriminator values.
-  public abstract Short getAddressType();
+  // Properties.
+  protected final String stringField;
 
-  public S7Address() {
+  public ImplicitPascalStringTypeTest(String stringField) {
     super();
+    this.stringField = stringField;
   }
 
-  protected abstract void serializeS7AddressChild(WriteBuffer writeBuffer)
-      throws SerializationException;
+  public String getStringField() {
+    return stringField;
+  }
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7Address");
+    writeBuffer.pushContext("ImplicitPascalStringTypeTest");
 
-    // Discriminator Field (addressType) (Used as input to a switch field)
-    writeDiscriminatorField("addressType", getAddressType(), writeUnsignedShort(writeBuffer, 8));
+    // Implicit Field (stringLength) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    byte stringLength = (byte) (getStringField().length());
+    writeImplicitField("stringLength", stringLength, writeSignedByte(writeBuffer, 8));
 
-    // Switch field (Serialize the sub-type)
-    serializeS7AddressChild(writeBuffer);
+    // Simple Field (stringField)
+    writeSimpleField("stringField", stringField, writeString(writeBuffer, stringLength));
 
-    writeBuffer.popContext("S7Address");
+    writeBuffer.popContext("ImplicitPascalStringTypeTest");
   }
 
   @Override
@@ -69,51 +73,39 @@ public abstract class S7Address implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    S7Address _value = this;
+    ImplicitPascalStringTypeTest _value = this;
 
-    // Discriminator Field (addressType)
+    // Implicit Field (stringLength)
     lengthInBits += 8;
 
-    // Length of sub-type elements will be added by sub-type...
+    // Simple field (stringField)
+    lengthInBits += getStringField().length();
 
     return lengthInBits;
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+  public static ImplicitPascalStringTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("S7Address");
+  public static ImplicitPascalStringTypeTest staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("ImplicitPascalStringTypeTest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short addressType = readDiscriminatorField("addressType", readUnsignedShort(readBuffer, 8));
+    byte stringLength = readImplicitField("stringLength", readSignedByte(readBuffer, 8));
 
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    S7AddressBuilder builder = null;
-    if (EvaluationHelper.equals(addressType, (short) 0x10)) {
-      builder = S7AddressAny.staticParseBuilder(readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "addressType="
-              + addressType
-              + "]");
-    }
+    String stringField = readSimpleField("stringField", readString(readBuffer, stringLength));
 
-    readBuffer.closeContext("S7Address");
+    readBuffer.closeContext("ImplicitPascalStringTypeTest");
     // Create the instance
-    S7Address _s7Address = builder.build();
-    return _s7Address;
-  }
-
-  public static interface S7AddressBuilder {
-    S7Address build();
+    ImplicitPascalStringTypeTest _implicitPascalStringTypeTest;
+    _implicitPascalStringTypeTest = new ImplicitPascalStringTypeTest(stringField);
+    return _implicitPascalStringTypeTest;
   }
 
   @Override
@@ -121,16 +113,16 @@ public abstract class S7Address implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7Address)) {
+    if (!(o instanceof ImplicitPascalStringTypeTest)) {
       return false;
     }
-    S7Address that = (S7Address) o;
-    return true;
+    ImplicitPascalStringTypeTest that = (ImplicitPascalStringTypeTest) o;
+    return (getStringField() == that.getStringField()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash();
+    return Objects.hash(getStringField());
   }
 
   @Override
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitTypeTest.java
new file mode 100644
index 0000000000..6d352ce826
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitTypeTest.java
@@ -0,0 +1,187 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class ImplicitTypeTest implements Message {
+
+  // Properties.
+  protected final short simpleField;
+
+  public ImplicitTypeTest(short simpleField) {
+    super();
+    this.simpleField = simpleField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("ImplicitTypeTest");
+
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
+
+    // Implicit Field (bitField) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    boolean bitField = (boolean) ((getSimpleField()) > (0));
+    writeImplicitField("bitField", bitField, writeBoolean(writeBuffer));
+
+    // Implicit Field (intField) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    byte intField = (byte) (getSimpleField());
+    writeImplicitField("intField", intField, writeSignedByte(writeBuffer, 8));
+
+    // Implicit Field (uintField) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    short uintField = (short) (getSimpleField());
+    writeImplicitField("uintField", uintField, writeUnsignedShort(writeBuffer, 8));
+
+    // Implicit Field (floatField) (Used for parsing, but its value is not stored as it's implicitly
+    // given by the objects content)
+    float floatField = (float) (getSimpleField());
+    writeImplicitField("floatField", floatField, writeFloat(writeBuffer, 32));
+
+    // Implicit Field (doubleField) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    double doubleField = (double) (getSimpleField());
+    writeImplicitField("doubleField", doubleField, writeDouble(writeBuffer, 64));
+
+    // Implicit Field (stringField) (Used for parsing, but its value is not stored as it's
+    // implicitly given by the objects content)
+    String stringField = (String) ((((getSimpleField()) > (0)) ? "HELLO TODDY" : "BYE TODDY"));
+    writeImplicitField("stringField", stringField, writeString(writeBuffer, 8));
+
+    writeBuffer.popContext("ImplicitTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ImplicitTypeTest _value = this;
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // Implicit Field (bitField)
+    lengthInBits += 1;
+
+    // Implicit Field (intField)
+    lengthInBits += 8;
+
+    // Implicit Field (uintField)
+    lengthInBits += 8;
+
+    // Implicit Field (floatField)
+    lengthInBits += 32;
+
+    // Implicit Field (doubleField)
+    lengthInBits += 64;
+
+    // Implicit Field (stringField)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static ImplicitTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ImplicitTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ImplicitTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
+
+    boolean bitField = readImplicitField("bitField", readBoolean(readBuffer));
+
+    byte intField = readImplicitField("intField", readSignedByte(readBuffer, 8));
+
+    short uintField = readImplicitField("uintField", readUnsignedShort(readBuffer, 8));
+
+    float floatField = readImplicitField("floatField", readFloat(readBuffer, 32));
+
+    double doubleField = readImplicitField("doubleField", readDouble(readBuffer, 64));
+
+    String stringField = readImplicitField("stringField", readString(readBuffer, 8));
+
+    readBuffer.closeContext("ImplicitTypeTest");
+    // Create the instance
+    ImplicitTypeTest _implicitTypeTest;
+    _implicitTypeTest = new ImplicitTypeTest(simpleField);
+    return _implicitTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ImplicitTypeTest)) {
+      return false;
+    }
+    ImplicitTypeTest that = (ImplicitTypeTest) o;
+    return (getSimpleField() == that.getSimpleField()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getSimpleField());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/IntTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/IntTypeTest.java
new file mode 100644
index 0000000000..3c08fb6516
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/IntTypeTest.java
@@ -0,0 +1,217 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.apache.plc4x.java.test.readwrite;
+
+import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataReaderFactory.*;
+import static org.apache.plc4x.java.spi.codegen.io.DataWriterFactory.*;
+import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
+
+import java.time.*;
+import java.util.*;
+import org.apache.plc4x.java.api.exceptions.*;
+import org.apache.plc4x.java.api.value.*;
+import org.apache.plc4x.java.spi.codegen.*;
+import org.apache.plc4x.java.spi.codegen.fields.*;
+import org.apache.plc4x.java.spi.codegen.io.*;
+import org.apache.plc4x.java.spi.generation.*;
+
+// Code generated by code-generation. DO NOT EDIT.
+
+public class IntTypeTest implements Message {
+
+  // Properties.
+  protected final byte ThreeField;
+  protected final byte ByteField;
+  protected final short WordField;
+  protected final int WordPlusByteField;
+  protected final int DoubleIntField;
+  protected final long QuadIntField;
+
+  public IntTypeTest(
+      byte ThreeField,
+      byte ByteField,
+      short WordField,
+      int WordPlusByteField,
+      int DoubleIntField,
+      long QuadIntField) {
+    super();
+    this.ThreeField = ThreeField;
+    this.ByteField = ByteField;
+    this.WordField = WordField;
+    this.WordPlusByteField = WordPlusByteField;
+    this.DoubleIntField = DoubleIntField;
+    this.QuadIntField = QuadIntField;
+  }
+
+  public byte getThreeField() {
+    return ThreeField;
+  }
+
+  public byte getByteField() {
+    return ByteField;
+  }
+
+  public short getWordField() {
+    return WordField;
+  }
+
+  public int getWordPlusByteField() {
+    return WordPlusByteField;
+  }
+
+  public int getDoubleIntField() {
+    return DoubleIntField;
+  }
+
+  public long getQuadIntField() {
+    return QuadIntField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    int startPos = positionAware.getPos();
+    writeBuffer.pushContext("IntTypeTest");
+
+    // Simple Field (ThreeField)
+    writeSimpleField("ThreeField", ThreeField, writeSignedByte(writeBuffer, 3));
+
+    // Simple Field (ByteField)
+    writeSimpleField("ByteField", ByteField, writeSignedByte(writeBuffer, 8));
+
+    // Simple Field (WordField)
+    writeSimpleField("WordField", WordField, writeSignedShort(writeBuffer, 16));
+
+    // Simple Field (WordPlusByteField)
+    writeSimpleField("WordPlusByteField", WordPlusByteField, writeSignedInt(writeBuffer, 24));
+
+    // Simple Field (DoubleIntField)
+    writeSimpleField("DoubleIntField", DoubleIntField, writeSignedInt(writeBuffer, 32));
+
+    // Simple Field (QuadIntField)
+    writeSimpleField("QuadIntField", QuadIntField, writeSignedLong(writeBuffer, 64));
+
+    writeBuffer.popContext("IntTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    IntTypeTest _value = this;
+
+    // Simple field (ThreeField)
+    lengthInBits += 3;
+
+    // Simple field (ByteField)
+    lengthInBits += 8;
+
+    // Simple field (WordField)
+    lengthInBits += 16;
+
+    // Simple field (WordPlusByteField)
+    lengthInBits += 24;
+
+    // Simple field (DoubleIntField)
+    lengthInBits += 32;
+
+    // Simple field (QuadIntField)
+    lengthInBits += 64;
+
+    return lengthInBits;
+  }
+
+  public static IntTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static IntTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("IntTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
+
+    byte ThreeField = readSimpleField("ThreeField", readSignedByte(readBuffer, 3));
+
+    byte ByteField = readSimpleField("ByteField", readSignedByte(readBuffer, 8));
+
+    short WordField = readSimpleField("WordField", readSignedShort(readBuffer, 16));
+
+    int WordPlusByteField = readSimpleField("WordPlusByteField", readSignedInt(readBuffer, 24));
+
+    int DoubleIntField = readSimpleField("DoubleIntField", readSignedInt(readBuffer, 32));
+
+    long QuadIntField = readSimpleField("QuadIntField", readSignedLong(readBuffer, 64));
+
+    readBuffer.closeContext("IntTypeTest");
+    // Create the instance
+    IntTypeTest _intTypeTest;
+    _intTypeTest =
+        new IntTypeTest(
+            ThreeField, ByteField, WordField, WordPlusByteField, DoubleIntField, QuadIntField);
+    return _intTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof IntTypeTest)) {
+      return false;
+    }
+    IntTypeTest that = (IntTypeTest) o;
+    return (getThreeField() == that.getThreeField())
+        && (getByteField() == that.getByteField())
+        && (getWordField() == that.getWordField())
+        && (getWordPlusByteField() == that.getWordPlusByteField())
+        && (getDoubleIntField() == that.getDoubleIntField())
+        && (getQuadIntField() == that.getQuadIntField())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        getThreeField(),
+        getByteField(),
+        getWordField(),
+        getWordPlusByteField(),
+        getDoubleIntField(),
+        getQuadIntField());
+  }
+
+  @Override
+  public String toString() {
+    WriteBufferBoxBased writeBufferBoxBased = new WriteBufferBoxBased(true, true);
+    try {
+      writeBufferBoxBased.writeSerializable(this);
+    } catch (SerializationException e) {
+      throw new RuntimeException(e);
+    }
+    return "\n" + writeBufferBoxBased.getBox().toString() + "\n";
+  }
+}
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpCore.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/LengthLoopTest.java
similarity index 58%
copy from plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpCore.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/LengthLoopTest.java
index 8f9ab9efaa..f85cc8c205 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpCore.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/LengthLoopTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.knxnetip.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,35 +35,34 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class KnxNetIpCore extends ServiceId implements Message {
-
-  // Accessors for discriminator values.
-  public Short getServiceType() {
-    return (short) 0x02;
-  }
+public class LengthLoopTest implements Message {
 
   // Properties.
-  protected final short version;
+  protected final int commandType;
 
-  public KnxNetIpCore(short version) {
+  public LengthLoopTest(int commandType) {
     super();
-    this.version = version;
+    this.commandType = commandType;
   }
 
-  public short getVersion() {
-    return version;
+  public int getCommandType() {
+    return commandType;
   }
 
-  @Override
-  protected void serializeServiceIdChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("KnxNetIpCore");
+    writeBuffer.pushContext("LengthLoopTest");
+
+    // Simple Field (commandType)
+    writeSimpleField("commandType", commandType, writeUnsignedInt(writeBuffer, 16));
 
-    // Simple Field (version)
-    writeSimpleField("version", version, writeUnsignedShort(writeBuffer, 8));
+    // Implicit Field (len) (Used for parsing, but its value is not stored as it's implicitly given
+    // by the objects content)
+    int len = (int) ((getLengthInBytes()) - (8));
+    writeImplicitField("len", len, writeUnsignedInt(writeBuffer, 16));
 
-    writeBuffer.popContext("KnxNetIpCore");
+    writeBuffer.popContext("LengthLoopTest");
   }
 
   @Override
@@ -73,41 +72,39 @@ public class KnxNetIpCore extends ServiceId implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    KnxNetIpCore _value = this;
+    int lengthInBits = 0;
+    LengthLoopTest _value = this;
 
-    // Simple field (version)
-    lengthInBits += 8;
+    // Simple field (commandType)
+    lengthInBits += 16;
+
+    // Implicit Field (len)
+    lengthInBits += 16;
 
     return lengthInBits;
   }
 
-  public static KnxNetIpCoreBuilder staticParseBuilder(ReadBuffer readBuffer)
+  public static LengthLoopTest staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("KnxNetIpCore");
     PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    short version = readSimpleField("version", readUnsignedShort(readBuffer, 8));
-
-    readBuffer.closeContext("KnxNetIpCore");
-    // Create the instance
-    return new KnxNetIpCoreBuilder(version);
+    return staticParse(readBuffer);
   }
 
-  public static class KnxNetIpCoreBuilder implements ServiceId.ServiceIdBuilder {
-    private final short version;
+  public static LengthLoopTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("LengthLoopTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
 
-    public KnxNetIpCoreBuilder(short version) {
+    int commandType = readSimpleField("commandType", readUnsignedInt(readBuffer, 16));
 
-      this.version = version;
-    }
+    int len = readImplicitField("len", readUnsignedInt(readBuffer, 16));
 
-    public KnxNetIpCore build() {
-      KnxNetIpCore knxNetIpCore = new KnxNetIpCore(version);
-      return knxNetIpCore;
-    }
+    readBuffer.closeContext("LengthLoopTest");
+    // Create the instance
+    LengthLoopTest _lengthLoopTest;
+    _lengthLoopTest = new LengthLoopTest(commandType);
+    return _lengthLoopTest;
   }
 
   @Override
@@ -115,16 +112,16 @@ public class KnxNetIpCore extends ServiceId implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof KnxNetIpCore)) {
+    if (!(o instanceof LengthLoopTest)) {
       return false;
     }
-    KnxNetIpCore that = (KnxNetIpCore) o;
-    return (getVersion() == that.getVersion()) && super.equals(that) && true;
+    LengthLoopTest that = (LengthLoopTest) o;
+    return (getCommandType() == that.getCommandType()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getVersion());
+    return Objects.hash(getCommandType());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/OptionalTypeTest.java
similarity index 57%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/OptionalTypeTest.java
index 4fbed10ec8..cc1e7d34d9 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/OptionalTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.s7.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,30 +35,42 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class S7Address implements Message {
+public class OptionalTypeTest implements Message {
 
-  // Abstract accessors for discriminator values.
-  public abstract Short getAddressType();
+  // Properties.
+  protected final short simpleField;
+  protected final Short optionalField;
 
-  public S7Address() {
+  public OptionalTypeTest(short simpleField, Short optionalField) {
     super();
+    this.simpleField = simpleField;
+    this.optionalField = optionalField;
   }
 
-  protected abstract void serializeS7AddressChild(WriteBuffer writeBuffer)
-      throws SerializationException;
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  public Short getOptionalField() {
+    return optionalField;
+  }
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7Address");
+    writeBuffer.pushContext("OptionalTypeTest");
 
-    // Discriminator Field (addressType) (Used as input to a switch field)
-    writeDiscriminatorField("addressType", getAddressType(), writeUnsignedShort(writeBuffer, 8));
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
 
-    // Switch field (Serialize the sub-type)
-    serializeS7AddressChild(writeBuffer);
+    // Optional Field (optionalField) (Can be skipped, if the value is null)
+    writeOptionalField(
+        "optionalField",
+        optionalField,
+        writeUnsignedShort(writeBuffer, 8),
+        (getSimpleField()) == (5));
 
-    writeBuffer.popContext("S7Address");
+    writeBuffer.popContext("OptionalTypeTest");
   }
 
   @Override
@@ -69,51 +81,41 @@ public abstract class S7Address implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    S7Address _value = this;
+    OptionalTypeTest _value = this;
 
-    // Discriminator Field (addressType)
+    // Simple field (simpleField)
     lengthInBits += 8;
 
-    // Length of sub-type elements will be added by sub-type...
+    // Optional Field (optionalField)
+    if (optionalField != null) {
+      lengthInBits += 8;
+    }
 
     return lengthInBits;
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+  public static OptionalTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("S7Address");
+  public static OptionalTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OptionalTypeTest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short addressType = readDiscriminatorField("addressType", readUnsignedShort(readBuffer, 8));
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
 
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    S7AddressBuilder builder = null;
-    if (EvaluationHelper.equals(addressType, (short) 0x10)) {
-      builder = S7AddressAny.staticParseBuilder(readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "addressType="
-              + addressType
-              + "]");
-    }
+    Short optionalField =
+        readOptionalField("optionalField", readUnsignedShort(readBuffer, 8), (simpleField) == (5));
 
-    readBuffer.closeContext("S7Address");
+    readBuffer.closeContext("OptionalTypeTest");
     // Create the instance
-    S7Address _s7Address = builder.build();
-    return _s7Address;
-  }
-
-  public static interface S7AddressBuilder {
-    S7Address build();
+    OptionalTypeTest _optionalTypeTest;
+    _optionalTypeTest = new OptionalTypeTest(simpleField, optionalField);
+    return _optionalTypeTest;
   }
 
   @Override
@@ -121,16 +123,18 @@ public abstract class S7Address implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7Address)) {
+    if (!(o instanceof OptionalTypeTest)) {
       return false;
     }
-    S7Address that = (S7Address) o;
-    return true;
+    OptionalTypeTest that = (OptionalTypeTest) o;
+    return (getSimpleField() == that.getSimpleField())
+        && (getOptionalField() == that.getOptionalField())
+        && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash();
+    return Objects.hash(getSimpleField(), getOptionalField());
   }
 
   @Override
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpRouting.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PaddingTypeTest.java
similarity index 59%
copy from plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpRouting.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PaddingTypeTest.java
index c2858cfc65..062bd73421 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/KnxNetIpRouting.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PaddingTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.knxnetip.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,35 +35,33 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class KnxNetIpRouting extends ServiceId implements Message {
-
-  // Accessors for discriminator values.
-  public Short getServiceType() {
-    return (short) 0x05;
-  }
+public class PaddingTypeTest implements Message {
 
   // Properties.
-  protected final short version;
+  protected final short simpleField;
 
-  public KnxNetIpRouting(short version) {
+  public PaddingTypeTest(short simpleField) {
     super();
-    this.version = version;
+    this.simpleField = simpleField;
   }
 
-  public short getVersion() {
-    return version;
+  public short getSimpleField() {
+    return simpleField;
   }
 
-  @Override
-  protected void serializeServiceIdChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("KnxNetIpRouting");
+    writeBuffer.pushContext("PaddingTypeTest");
 
-    // Simple Field (version)
-    writeSimpleField("version", version, writeUnsignedShort(writeBuffer, 8));
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("KnxNetIpRouting");
+    // Padding Field (padding)
+    writePaddingField(
+        "padding", (int) (simpleField), (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("PaddingTypeTest");
   }
 
   @Override
@@ -73,41 +71,42 @@ public class KnxNetIpRouting extends ServiceId implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    KnxNetIpRouting _value = this;
+    int lengthInBits = 0;
+    PaddingTypeTest _value = this;
 
-    // Simple field (version)
+    // Simple field (simpleField)
     lengthInBits += 8;
 
+    // Padding Field (padding)
+    int _timesPadding = (int) (simpleField);
+    while (_timesPadding-- > 0) {
+      lengthInBits += 8;
+    }
+
     return lengthInBits;
   }
 
-  public static KnxNetIpRoutingBuilder staticParseBuilder(ReadBuffer readBuffer)
+  public static PaddingTypeTest staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("KnxNetIpRouting");
     PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    short version = readSimpleField("version", readUnsignedShort(readBuffer, 8));
-
-    readBuffer.closeContext("KnxNetIpRouting");
-    // Create the instance
-    return new KnxNetIpRoutingBuilder(version);
+    return staticParse(readBuffer);
   }
 
-  public static class KnxNetIpRoutingBuilder implements ServiceId.ServiceIdBuilder {
-    private final short version;
+  public static PaddingTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("PaddingTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
 
-    public KnxNetIpRoutingBuilder(short version) {
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
 
-      this.version = version;
-    }
+    readPaddingField(readUnsignedShort(readBuffer, 8), (int) (simpleField));
 
-    public KnxNetIpRouting build() {
-      KnxNetIpRouting knxNetIpRouting = new KnxNetIpRouting(version);
-      return knxNetIpRouting;
-    }
+    readBuffer.closeContext("PaddingTypeTest");
+    // Create the instance
+    PaddingTypeTest _paddingTypeTest;
+    _paddingTypeTest = new PaddingTypeTest(simpleField);
+    return _paddingTypeTest;
   }
 
   @Override
@@ -115,16 +114,16 @@ public class KnxNetIpRouting extends ServiceId implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof KnxNetIpRouting)) {
+    if (!(o instanceof PaddingTypeTest)) {
       return false;
     }
-    KnxNetIpRouting that = (KnxNetIpRouting) o;
-    return (getVersion() == that.getVersion()) && super.equals(that) && true;
+    PaddingTypeTest that = (PaddingTypeTest) o;
+    return (getSimpleField() == that.getSimpleField()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode(), getVersion());
+    return Objects.hash(getSimpleField());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PascalStringTypeTest.java
similarity index 58%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PascalStringTypeTest.java
index 4fbed10ec8..79105b5ee1 100644
--- a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7Address.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PascalStringTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.s7.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,30 +35,38 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class S7Address implements Message {
+public class PascalStringTypeTest implements Message {
 
-  // Abstract accessors for discriminator values.
-  public abstract Short getAddressType();
+  // Properties.
+  protected final byte stringLength;
+  protected final String stringField;
 
-  public S7Address() {
+  public PascalStringTypeTest(byte stringLength, String stringField) {
     super();
+    this.stringLength = stringLength;
+    this.stringField = stringField;
   }
 
-  protected abstract void serializeS7AddressChild(WriteBuffer writeBuffer)
-      throws SerializationException;
+  public byte getStringLength() {
+    return stringLength;
+  }
+
+  public String getStringField() {
+    return stringField;
+  }
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("S7Address");
+    writeBuffer.pushContext("PascalStringTypeTest");
 
-    // Discriminator Field (addressType) (Used as input to a switch field)
-    writeDiscriminatorField("addressType", getAddressType(), writeUnsignedShort(writeBuffer, 8));
+    // Simple Field (stringLength)
+    writeSimpleField("stringLength", stringLength, writeSignedByte(writeBuffer, 8));
 
-    // Switch field (Serialize the sub-type)
-    serializeS7AddressChild(writeBuffer);
+    // Simple Field (stringField)
+    writeSimpleField("stringField", stringField, writeString(writeBuffer, stringLength));
 
-    writeBuffer.popContext("S7Address");
+    writeBuffer.popContext("PascalStringTypeTest");
   }
 
   @Override
@@ -69,51 +77,38 @@ public abstract class S7Address implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    S7Address _value = this;
+    PascalStringTypeTest _value = this;
 
-    // Discriminator Field (addressType)
+    // Simple field (stringLength)
     lengthInBits += 8;
 
-    // Length of sub-type elements will be added by sub-type...
+    // Simple field (stringField)
+    lengthInBits += getStringLength();
 
     return lengthInBits;
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+  public static PascalStringTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static S7Address staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("S7Address");
+  public static PascalStringTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("PascalStringTypeTest");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short addressType = readDiscriminatorField("addressType", readUnsignedShort(readBuffer, 8));
+    byte stringLength = readSimpleField("stringLength", readSignedByte(readBuffer, 8));
 
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    S7AddressBuilder builder = null;
-    if (EvaluationHelper.equals(addressType, (short) 0x10)) {
-      builder = S7AddressAny.staticParseBuilder(readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "addressType="
-              + addressType
-              + "]");
-    }
+    String stringField = readSimpleField("stringField", readString(readBuffer, stringLength));
 
-    readBuffer.closeContext("S7Address");
+    readBuffer.closeContext("PascalStringTypeTest");
     // Create the instance
-    S7Address _s7Address = builder.build();
-    return _s7Address;
-  }
-
-  public static interface S7AddressBuilder {
-    S7Address build();
+    PascalStringTypeTest _pascalStringTypeTest;
+    _pascalStringTypeTest = new PascalStringTypeTest(stringLength, stringField);
+    return _pascalStringTypeTest;
   }
 
   @Override
@@ -121,16 +116,18 @@ public abstract class S7Address implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof S7Address)) {
+    if (!(o instanceof PascalStringTypeTest)) {
       return false;
     }
-    S7Address that = (S7Address) o;
-    return true;
+    PascalStringTypeTest that = (PascalStringTypeTest) o;
+    return (getStringLength() == that.getStringLength())
+        && (getStringField() == that.getStringField())
+        && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash();
+    return Objects.hash(getStringLength(), getStringField());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_FullIpSuite.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTest.java
similarity index 63%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_FullIpSuite.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTest.java
index 355f1fe486..fa0c0d26fd 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_FullIpSuite.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,28 +35,27 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class PnDcp_Block_FullIpSuite extends PnDcp_Block implements Message {
+public class ReservedTypeTest implements Message {
 
-  // Accessors for discriminator values.
-  public PnDcp_BlockOptions getOption() {
-    return PnDcp_BlockOptions.IP_OPTION;
-  }
-
-  public Short getSuboption() {
-    return (short) 3;
-  }
+  // Reserved Fields
+  private Short reservedField0;
 
-  public PnDcp_Block_FullIpSuite() {
+  public ReservedTypeTest() {
     super();
   }
 
-  @Override
-  protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("PnDcp_Block_FullIpSuite");
+    writeBuffer.pushContext("ReservedTypeTest");
 
-    writeBuffer.popContext("PnDcp_Block_FullIpSuite");
+    // Reserved Field (reserved)
+    writeReservedField(
+        "reserved",
+        reservedField0 != null ? reservedField0 : (short) 0x00,
+        writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("ReservedTypeTest");
   }
 
   @Override
@@ -66,32 +65,36 @@ public class PnDcp_Block_FullIpSuite extends PnDcp_Block implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    PnDcp_Block_FullIpSuite _value = this;
+    int lengthInBits = 0;
+    ReservedTypeTest _value = this;
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static PnDcp_Block_FullIpSuiteBuilder staticParseBuilder(ReadBuffer readBuffer)
+  public static ReservedTypeTest staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("PnDcp_Block_FullIpSuite");
     PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    readBuffer.closeContext("PnDcp_Block_FullIpSuite");
-    // Create the instance
-    return new PnDcp_Block_FullIpSuiteBuilder();
+    return staticParse(readBuffer);
   }
 
-  public static class PnDcp_Block_FullIpSuiteBuilder implements PnDcp_Block.PnDcp_BlockBuilder {
+  public static ReservedTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ReservedTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
 
-    public PnDcp_Block_FullIpSuiteBuilder() {}
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
 
-    public PnDcp_Block_FullIpSuite build() {
-      PnDcp_Block_FullIpSuite pnDcp_Block_FullIpSuite = new PnDcp_Block_FullIpSuite();
-      return pnDcp_Block_FullIpSuite;
-    }
+    readBuffer.closeContext("ReservedTypeTest");
+    // Create the instance
+    ReservedTypeTest _reservedTypeTest;
+    _reservedTypeTest = new ReservedTypeTest();
+    _reservedTypeTest.reservedField0 = reservedField0;
+    return _reservedTypeTest;
   }
 
   @Override
@@ -99,16 +102,16 @@ public class PnDcp_Block_FullIpSuite extends PnDcp_Block implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof PnDcp_Block_FullIpSuite)) {
+    if (!(o instanceof ReservedTypeTest)) {
       return false;
     }
-    PnDcp_Block_FullIpSuite that = (PnDcp_Block_FullIpSuite) o;
-    return super.equals(that) && true;
+    ReservedTypeTest that = (ReservedTypeTest) o;
+    return true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash();
   }
 
   @Override
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/ApduDataGroupValueRead.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestChild.java
similarity index 65%
copy from plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/ApduDataGroupValueRead.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestChild.java
index 2d63e3ccbe..cd2bcd8df9 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/ApduDataGroupValueRead.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestChild.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.knxnetip.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,36 +35,30 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class ApduDataGroupValueRead extends ApduData implements Message {
+public class ReservedTypeTestChild extends ReservedTypeTestParent implements Message {
 
   // Accessors for discriminator values.
-  public Byte getApciType() {
-    return (byte) 0x0;
-  }
-
-  // Arguments.
-  protected final Short dataLength;
   // Reserved Fields
   private Short reservedField0;
 
-  public ApduDataGroupValueRead(Short dataLength) {
-    super(dataLength);
-    this.dataLength = dataLength;
+  public ReservedTypeTestChild(short simpleField) {
+    super(simpleField);
   }
 
   @Override
-  protected void serializeApduDataChild(WriteBuffer writeBuffer) throws SerializationException {
+  protected void serializeReservedTypeTestParentChild(WriteBuffer writeBuffer)
+      throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("ApduDataGroupValueRead");
+    writeBuffer.pushContext("ReservedTypeTestChild");
 
     // Reserved Field (reserved)
     writeReservedField(
         "reserved",
         reservedField0 != null ? reservedField0 : (short) 0x00,
-        writeUnsignedShort(writeBuffer, 6));
+        writeUnsignedShort(writeBuffer, 8));
 
-    writeBuffer.popContext("ApduDataGroupValueRead");
+    writeBuffer.popContext("ReservedTypeTestChild");
   }
 
   @Override
@@ -75,44 +69,41 @@ public class ApduDataGroupValueRead extends ApduData implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = super.getLengthInBits();
-    ApduDataGroupValueRead _value = this;
+    ReservedTypeTestChild _value = this;
 
     // Reserved Field (reserved)
-    lengthInBits += 6;
+    lengthInBits += 8;
 
     return lengthInBits;
   }
 
-  public static ApduDataGroupValueReadBuilder staticParseBuilder(
-      ReadBuffer readBuffer, Short dataLength) throws ParseException {
-    readBuffer.pullContext("ApduDataGroupValueRead");
+  public static ReservedTypeTestParentBuilder staticParseReservedTypeTestParentBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ReservedTypeTestChild");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
     Short reservedField0 =
-        readReservedField("reserved", readUnsignedShort(readBuffer, 6), (short) 0x00);
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
 
-    readBuffer.closeContext("ApduDataGroupValueRead");
+    readBuffer.closeContext("ReservedTypeTestChild");
     // Create the instance
-    return new ApduDataGroupValueReadBuilder(dataLength, reservedField0);
+    return new ReservedTypeTestChildBuilderImpl(reservedField0);
   }
 
-  public static class ApduDataGroupValueReadBuilder implements ApduData.ApduDataBuilder {
-    private final Short dataLength;
+  public static class ReservedTypeTestChildBuilderImpl
+      implements ReservedTypeTestParent.ReservedTypeTestParentBuilder {
     private final Short reservedField0;
 
-    public ApduDataGroupValueReadBuilder(Short dataLength, Short reservedField0) {
-      this.dataLength = dataLength;
+    public ReservedTypeTestChildBuilderImpl(Short reservedField0) {
       this.reservedField0 = reservedField0;
     }
 
-    public ApduDataGroupValueRead build(Short dataLength) {
-
-      ApduDataGroupValueRead apduDataGroupValueRead = new ApduDataGroupValueRead(dataLength);
-
-      apduDataGroupValueRead.reservedField0 = reservedField0;
-      return apduDataGroupValueRead;
+    public ReservedTypeTestChild build(short simpleField) {
+      ReservedTypeTestChild reservedTypeTestChild = new ReservedTypeTestChild(simpleField);
+      reservedTypeTestChild.reservedField0 = reservedField0;
+      return reservedTypeTestChild;
     }
   }
 
@@ -121,10 +112,10 @@ public class ApduDataGroupValueRead extends ApduData implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof ApduDataGroupValueRead)) {
+    if (!(o instanceof ReservedTypeTestChild)) {
       return false;
     }
-    ApduDataGroupValueRead that = (ApduDataGroupValueRead) o;
+    ReservedTypeTestChild that = (ReservedTypeTestChild) o;
     return super.equals(that) && true;
   }
 
diff --git a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/CEMIAdditionalInformation.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestParent.java
similarity index 58%
copy from plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/CEMIAdditionalInformation.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestParent.java
index 3b2f680445..325de24c9a 100644
--- a/plc4j/drivers/knxnetip/src/main/generated/org/apache/plc4x/java/knxnetip/readwrite/CEMIAdditionalInformation.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestParent.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.knxnetip.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,33 +35,45 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public abstract class CEMIAdditionalInformation implements Message {
+public abstract class ReservedTypeTestParent implements Message {
 
   // Abstract accessors for discriminator values.
-  public abstract Short getAdditionalInformationType();
 
-  public CEMIAdditionalInformation() {
+  // Properties.
+  protected final short simpleField;
+  // Reserved Fields
+  private Short reservedField0;
+
+  public ReservedTypeTestParent(short simpleField) {
     super();
+    this.simpleField = simpleField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
   }
 
-  protected abstract void serializeCEMIAdditionalInformationChild(WriteBuffer writeBuffer)
+  protected abstract void serializeReservedTypeTestParentChild(WriteBuffer writeBuffer)
       throws SerializationException;
 
   public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("CEMIAdditionalInformation");
+    writeBuffer.pushContext("ReservedTypeTestParent");
 
-    // Discriminator Field (additionalInformationType) (Used as input to a switch field)
-    writeDiscriminatorField(
-        "additionalInformationType",
-        getAdditionalInformationType(),
+    // Reserved Field (reserved)
+    writeReservedField(
+        "reserved",
+        reservedField0 != null ? reservedField0 : (short) 0x00,
         writeUnsignedShort(writeBuffer, 8));
 
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
+
     // Switch field (Serialize the sub-type)
-    serializeCEMIAdditionalInformationChild(writeBuffer);
+    serializeReservedTypeTestParentChild(writeBuffer);
 
-    writeBuffer.popContext("CEMIAdditionalInformation");
+    writeBuffer.popContext("ReservedTypeTestParent");
   }
 
   @Override
@@ -72,9 +84,12 @@ public abstract class CEMIAdditionalInformation implements Message {
   @Override
   public int getLengthInBits() {
     int lengthInBits = 0;
-    CEMIAdditionalInformation _value = this;
+    ReservedTypeTestParent _value = this;
 
-    // Discriminator Field (additionalInformationType)
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Simple field (simpleField)
     lengthInBits += 8;
 
     // Length of sub-type elements will be added by sub-type...
@@ -82,45 +97,46 @@ public abstract class CEMIAdditionalInformation implements Message {
     return lengthInBits;
   }
 
-  public static CEMIAdditionalInformation staticParse(ReadBuffer readBuffer, Object... args)
+  public static ReservedTypeTestParent staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
     PositionAware positionAware = readBuffer;
     return staticParse(readBuffer);
   }
 
-  public static CEMIAdditionalInformation staticParse(ReadBuffer readBuffer) throws ParseException {
-    readBuffer.pullContext("CEMIAdditionalInformation");
+  public static ReservedTypeTestParent staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ReservedTypeTestParent");
     PositionAware positionAware = readBuffer;
     int startPos = positionAware.getPos();
     int curPos;
 
-    short additionalInformationType =
-        readDiscriminatorField("additionalInformationType", readUnsignedShort(readBuffer, 8));
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
 
     // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    CEMIAdditionalInformationBuilder builder = null;
-    if (EvaluationHelper.equals(additionalInformationType, (short) 0x03)) {
-      builder = CEMIAdditionalInformationBusmonitorInfo.staticParseBuilder(readBuffer);
-    } else if (EvaluationHelper.equals(additionalInformationType, (short) 0x04)) {
-      builder = CEMIAdditionalInformationRelativeTimestamp.staticParseBuilder(readBuffer);
+    ReservedTypeTestParentBuilder builder = null;
+    if (EvaluationHelper.equals(simpleField, (short) 0)) {
+      builder = ReservedTypeTestChild.staticParseReservedTypeTestParentBuilder(readBuffer);
     }
     if (builder == null) {
       throw new ParseException(
           "Unsupported case for discriminated type"
               + " parameters ["
-              + "additionalInformationType="
-              + additionalInformationType
+              + "simpleField="
+              + simpleField
               + "]");
     }
 
-    readBuffer.closeContext("CEMIAdditionalInformation");
+    readBuffer.closeContext("ReservedTypeTestParent");
     // Create the instance
-    CEMIAdditionalInformation _cEMIAdditionalInformation = builder.build();
-    return _cEMIAdditionalInformation;
+    ReservedTypeTestParent _reservedTypeTestParent = builder.build(simpleField);
+    _reservedTypeTestParent.reservedField0 = reservedField0;
+    return _reservedTypeTestParent;
   }
 
-  public static interface CEMIAdditionalInformationBuilder {
-    CEMIAdditionalInformation build();
+  public interface ReservedTypeTestParentBuilder {
+    ReservedTypeTestParent build(short simpleField);
   }
 
   @Override
@@ -128,16 +144,16 @@ public abstract class CEMIAdditionalInformation implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof CEMIAdditionalInformation)) {
+    if (!(o instanceof ReservedTypeTestParent)) {
       return false;
     }
-    CEMIAdditionalInformation that = (CEMIAdditionalInformation) o;
-    return true;
+    ReservedTypeTestParent that = (ReservedTypeTestParent) o;
+    return (getSimpleField() == that.getSimpleField()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash();
+    return Objects.hash(getSimpleField());
   }
 
   @Override
diff --git a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleBitTypeTest.java
similarity index 63%
copy from plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleBitTypeTest.java
index a4b2a26fcb..acd03bc00d 100644
--- a/plc4j/drivers/profinet/src/main/generated/org/apache/plc4x/java/profinet/readwrite/PnDcp_Block_ALLSelector.java
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleBitTypeTest.java
@@ -16,7 +16,7 @@
  * specific language governing permissions and limitations
  * under the License.
  */
-package org.apache.plc4x.java.profinet.readwrite;
+package org.apache.plc4x.java.test.readwrite;
 
 import static org.apache.plc4x.java.spi.codegen.fields.FieldReaderFactory.*;
 import static org.apache.plc4x.java.spi.codegen.fields.FieldWriterFactory.*;
@@ -35,28 +35,29 @@ import org.apache.plc4x.java.spi.generation.*;
 
 // Code generated by code-generation. DO NOT EDIT.
 
-public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
+public class SimpleBitTypeTest implements Message {
 
-  // Accessors for discriminator values.
-  public PnDcp_BlockOptions getOption() {
-    return PnDcp_BlockOptions.ALL_SELECTOR_OPTION;
-  }
+  // Properties.
+  protected final boolean bitField;
 
-  public Short getSuboption() {
-    return (short) 0xFF;
+  public SimpleBitTypeTest(boolean bitField) {
+    super();
+    this.bitField = bitField;
   }
 
-  public PnDcp_Block_ALLSelector() {
-    super();
+  public boolean getBitField() {
+    return bitField;
   }
 
-  @Override
-  protected void serializePnDcp_BlockChild(WriteBuffer writeBuffer) throws SerializationException {
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
     PositionAware positionAware = writeBuffer;
     int startPos = positionAware.getPos();
-    writeBuffer.pushContext("PnDcp_Block_ALLSelector");
+    writeBuffer.pushContext("SimpleBitTypeTest");
 
-    writeBuffer.popContext("PnDcp_Block_ALLSelector");
+    // Simple Field (bitField)
+    writeSimpleField("bitField", bitField, writeBoolean(writeBuffer));
+
+    writeBuffer.popContext("SimpleBitTypeTest");
   }
 
   @Override
@@ -66,32 +67,34 @@ public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
 
   @Override
   public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    PnDcp_Block_ALLSelector _value = this;
+    int lengthInBits = 0;
+    SimpleBitTypeTest _value = this;
+
+    // Simple field (bitField)
+    lengthInBits += 1;
 
     return lengthInBits;
   }
 
-  public static PnDcp_Block_ALLSelectorBuilder staticParseBuilder(ReadBuffer readBuffer)
+  public static SimpleBitTypeTest staticParse(ReadBuffer readBuffer, Object... args)
       throws ParseException {
-    readBuffer.pullContext("PnDcp_Block_ALLSelector");
     PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    readBuffer.closeContext("PnDcp_Block_ALLSelector");
-    // Create the instance
-    return new PnDcp_Block_ALLSelectorBuilder();
+    return staticParse(readBuffer);
   }
 
-  public static class PnDcp_Block_ALLSelectorBuilder implements PnDcp_Block.PnDcp_BlockBuilder {
+  public static SimpleBitTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SimpleBitTypeTest");
+    PositionAware positionAware = readBuffer;
+    int startPos = positionAware.getPos();
+    int curPos;
 
-    public PnDcp_Block_ALLSelectorBuilder() {}
+    boolean bitField = readSimpleField("bitField", readBoolean(readBuffer));
 
-    public PnDcp_Block_ALLSelector build() {
-      PnDcp_Block_ALLSelector pnDcp_Block_ALLSelector = new PnDcp_Block_ALLSelector();
-      return pnDcp_Block_ALLSelector;
-    }
+    readBuffer.closeContext("SimpleBitTypeTest");
+    // Create the instance
+    SimpleBitTypeTest _simpleBitTypeTest;
+    _simpleBitTypeTest = new SimpleBitTypeTest(bitField);
+    return _simpleBitTypeTest;
   }
 
   @Override
@@ -99,16 +102,16 @@ public class PnDcp_Block_ALLSelector extends PnDcp_Block implements Message {
     if (this == o) {
       return true;
     }
-    if (!(o instanceof PnDcp_Block_ALLSelector)) {
+    if (!(o instanceof SimpleBitTypeTest)) {
       return false;
     }
-    PnDcp_Block_ALLSelector that = (PnDcp_Block_ALLSelector) o;
-    return super.equals(that) && true;
+    SimpleBitTypeTest that = (SimpleBitTypeTest) o;
+    return (getBitField() == that.getBitField()) && true;
   }
 
   @Override
   public int hashCode() {
-    return Objects.hash(super.hashCode());
+    return Objects.hash(getBitField());
   }
 
   @Override
diff --git a/plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedType.java
similarity index 63%
copy from plc4j/drivers/s7/src/main/generated/org/apache/plc4x/java/s7/readwrite/S7ParameterUserDataItem.java
copy to code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedType.java
index 1efa15bf0c..afd696abb8 100644
... 83896 lines suppressed ...