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 2024/01/06 13:26:38 UTC

(plc4x) 09/10: chore: Added the missing generated files.

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

cdutz pushed a commit to branch feature/new-ui-tool
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit aa88c288cba0fdca3010546814edc33e417a7e47
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 14:07:03 2024 +0100

    chore: Added the missing generated files.
---
 .../java/test/readwrite/AbstractTypeTest.java      |   166 +
 .../test/readwrite/AbstractTypeTestSubType.java    |   260 +
 .../plc4x/java/test/readwrite/ArrayTypeTest.java   |   248 +
 .../java/test/readwrite/CheckSumTypeTest.java      |   141 +
 .../test/readwrite/ComplexOfComplexUsageA.java     |   131 +
 .../test/readwrite/ComplexOfComplexUsageB.java     |   158 +
 .../test/readwrite/ComplexOfComplexUsageC.java     |   127 +
 .../test/readwrite/ComplexOfComplexUsageD.java     |   127 +
 .../plc4x/java/test/readwrite/ConstTypeTest.java   |   196 +
 .../plc4x/java/test/readwrite/DataIOType.java      |   110 +
 .../java/test/readwrite/EnumDiscriminatedType.java |   155 +
 .../test/readwrite/EnumDiscriminatedTypeA.java     |   141 +
 .../test/readwrite/EnumDiscriminatedTypeB.java     |   141 +
 .../test/readwrite/EnumDiscriminatedTypeC.java     |   141 +
 .../readwrite/EnumDiscriminatedTypeMultiple.java   |   190 +
 .../readwrite/EnumDiscriminatedTypeMultipleA.java  |   147 +
 .../readwrite/EnumDiscriminatedTypeMultipleB.java  |   147 +
 .../readwrite/EnumDiscriminatedTypeMultipleC.java  |   147 +
 .../readwrite/EnumDiscriminatedTypeParameter.java  |   160 +
 .../readwrite/EnumDiscriminatedTypeParameterA.java |   144 +
 .../readwrite/EnumDiscriminatedTypeParameterB.java |   144 +
 .../readwrite/EnumDiscriminatedTypeParameterC.java |   144 +
 .../EnumDiscriminatedTypeParameterMultiple.java    |   183 +
 .../EnumDiscriminatedTypeParameterMultipleA.java   |   149 +
 .../EnumDiscriminatedTypeParameterMultipleB.java   |   149 +
 .../EnumDiscriminatedTypeParameterMultipleC.java   |   149 +
 .../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    |   138 +
 .../plc4x/java/test/readwrite/FieldTypeTest.java   |   322 +
 .../readwrite/FieldTypeTestWithUnknownField.java   |   222 +
 .../readwrite/ImplicitPascalStringTypeTest.java    |   138 +
 .../java/test/readwrite/ImplicitTypeTest.java      |   187 +
 .../plc4x/java/test/readwrite/IntTypeTest.java     |   217 +
 .../plc4x/java/test/readwrite/LengthLoopTest.java  |   137 +
 .../java/test/readwrite/OptionalTypeTest.java      |   146 +
 .../plc4x/java/test/readwrite/PaddingTypeTest.java |   139 +
 .../java/test/readwrite/PascalStringTypeTest.java  |   143 +
 .../java/test/readwrite/ReservedTypeTest.java      |   120 +
 .../java/test/readwrite/ReservedTypeTestChild.java |   128 +
 .../test/readwrite/ReservedTypeTestParent.java     |   163 +
 .../java/test/readwrite/SimpleBitTypeTest.java     |   127 +
 .../test/readwrite/SimpleDiscriminatedType.java    |   147 +
 .../test/readwrite/SimpleDiscriminatedTypeA.java   |   141 +
 .../test/readwrite/SimpleDiscriminatedTypeB.java   |   141 +
 .../test/readwrite/SimpleDiscriminatedTypeC.java   |   141 +
 .../plc4x/java/test/readwrite/SimpleTypeTest.java  |   234 +
 .../plc4x/java/test/readwrite/UIntTypeTest.java    |   219 +
 .../java/test/readwrite/VirtualFieldTest.java      |   194 +
 .../java/firmata/readwrite/FirmataCommand.java     |   172 +
 .../readwrite/FirmataCommandProtocolVersion.java   |   161 +
 .../FirmataCommandSetDigitalPinValue.java          |   167 +
 .../readwrite/FirmataCommandSetPinMode.java        |   169 +
 .../firmata/readwrite/FirmataCommandSysex.java     |   154 +
 .../readwrite/FirmataCommandSystemReset.java       |   122 +
 .../java/firmata/readwrite/FirmataMessage.java     |   182 +
 .../firmata/readwrite/FirmataMessageAnalogIO.java  |   177 +
 .../firmata/readwrite/FirmataMessageCommand.java   |   150 +
 .../firmata/readwrite/FirmataMessageDigitalIO.java |   179 +
 .../FirmataMessageSubscribeAnalogPinValue.java     |   190 +
 .../FirmataMessageSubscribeDigitalPinValue.java    |   190 +
 .../plc4x/java/firmata/readwrite/PinMode.java      |    65 +
 .../plc4x/java/firmata/readwrite/SysexCommand.java |   206 +
 .../SysexCommandAnalogMappingQueryRequest.java     |   126 +
 .../SysexCommandAnalogMappingQueryResponse.java    |   145 +
 .../SysexCommandAnalogMappingResponse.java         |   126 +
 .../readwrite/SysexCommandCapabilityQuery.java     |   125 +
 .../readwrite/SysexCommandCapabilityResponse.java  |   126 +
 .../readwrite/SysexCommandExtendedAnalog.java      |   125 +
 .../firmata/readwrite/SysexCommandExtendedId.java  |   146 +
 .../readwrite/SysexCommandPinStateQuery.java       |   144 +
 .../readwrite/SysexCommandPinStateResponse.java    |   181 +
 .../SysexCommandReportFirmwareRequest.java         |   126 +
 .../SysexCommandReportFirmwareResponse.java        |   201 +
 .../readwrite/SysexCommandSamplingInterval.java    |   126 +
 .../firmata/readwrite/SysexCommandStringData.java  |   125 +
 .../readwrite/SysexCommandSysexNonRealtime.java    |   126 +
 .../readwrite/SysexCommandSysexRealtime.java       |   125 +
 .../plc4x/java/knxnetip/readwrite/AccessLevel.java |   110 +
 .../apache/plc4x/java/knxnetip/readwrite/Apdu.java |   187 +
 .../plc4x/java/knxnetip/readwrite/ApduControl.java |   153 +
 .../java/knxnetip/readwrite/ApduControlAck.java    |   120 +
 .../knxnetip/readwrite/ApduControlConnect.java     |   120 +
 .../knxnetip/readwrite/ApduControlContainer.java   |   143 +
 .../knxnetip/readwrite/ApduControlDisconnect.java  |   120 +
 .../java/knxnetip/readwrite/ApduControlNack.java   |   120 +
 .../plc4x/java/knxnetip/readwrite/ApduData.java    |   192 +
 .../java/knxnetip/readwrite/ApduDataAdcRead.java   |   120 +
 .../knxnetip/readwrite/ApduDataAdcResponse.java    |   120 +
 .../java/knxnetip/readwrite/ApduDataContainer.java |   143 +
 .../readwrite/ApduDataDeviceDescriptorRead.java    |   140 +
 .../ApduDataDeviceDescriptorResponse.java          |   164 +
 .../plc4x/java/knxnetip/readwrite/ApduDataExt.java |   270 +
 .../readwrite/ApduDataExtAuthorizeRequest.java     |   162 +
 .../readwrite/ApduDataExtAuthorizeResponse.java    |   141 +
 .../readwrite/ApduDataExtDomainAddressRead.java    |   122 +
 .../ApduDataExtDomainAddressResponse.java          |   122 +
 .../ApduDataExtDomainAddressSelectiveRead.java     |   122 +
 .../ApduDataExtDomainAddressSerialNumberRead.java  |   122 +
 ...duDataExtDomainAddressSerialNumberResponse.java |   123 +
 .../ApduDataExtDomainAddressSerialNumberWrite.java |   122 +
 .../readwrite/ApduDataExtDomainAddressWrite.java   |   122 +
 .../readwrite/ApduDataExtFileStreamInfoReport.java |   122 +
 .../ApduDataExtGroupPropertyValueInfoReport.java   |   122 +
 .../ApduDataExtGroupPropertyValueRead.java         |   122 +
 .../ApduDataExtGroupPropertyValueResponse.java     |   122 +
 .../ApduDataExtGroupPropertyValueWrite.java        |   122 +
 ...duDataExtIndividualAddressSerialNumberRead.java |   123 +
 ...taExtIndividualAddressSerialNumberResponse.java |   125 +
 ...uDataExtIndividualAddressSerialNumberWrite.java |   123 +
 .../knxnetip/readwrite/ApduDataExtKeyResponse.java |   120 +
 .../knxnetip/readwrite/ApduDataExtKeyWrite.java    |   120 +
 .../knxnetip/readwrite/ApduDataExtLinkRead.java    |   120 +
 .../readwrite/ApduDataExtLinkResponse.java         |   120 +
 .../knxnetip/readwrite/ApduDataExtLinkWrite.java   |   120 +
 .../readwrite/ApduDataExtMemoryBitWrite.java       |   121 +
 .../readwrite/ApduDataExtNetworkParameterRead.java |   122 +
 .../ApduDataExtNetworkParameterResponse.java       |   122 +
 .../ApduDataExtNetworkParameterWrite.java          |   122 +
 .../ApduDataExtOpenRoutingTableRequest.java        |   122 +
 .../ApduDataExtPropertyDescriptionRead.java        |   178 +
 .../ApduDataExtPropertyDescriptionResponse.java    |   353 +
 .../readwrite/ApduDataExtPropertyValueRead.java    |   197 +
 .../ApduDataExtPropertyValueResponse.java          |   217 +
 .../readwrite/ApduDataExtPropertyValueWrite.java   |   217 +
 .../ApduDataExtReadRouterMemoryRequest.java        |   122 +
 .../ApduDataExtReadRouterMemoryResponse.java       |   122 +
 .../ApduDataExtReadRouterStatusRequest.java        |   122 +
 .../ApduDataExtReadRouterStatusResponse.java       |   122 +
 .../ApduDataExtReadRoutingTableRequest.java        |   122 +
 .../ApduDataExtReadRoutingTableResponse.java       |   122 +
 .../ApduDataExtWriteRouterMemoryRequest.java       |   122 +
 .../ApduDataExtWriteRouterStatusRequest.java       |   122 +
 .../ApduDataExtWriteRoutingTableRequest.java       |   122 +
 .../knxnetip/readwrite/ApduDataGroupValueRead.java |   129 +
 .../readwrite/ApduDataGroupValueResponse.java      |   163 +
 .../readwrite/ApduDataGroupValueWrite.java         |   163 +
 .../readwrite/ApduDataIndividualAddressRead.java   |   121 +
 .../ApduDataIndividualAddressResponse.java         |   122 +
 .../readwrite/ApduDataIndividualAddressWrite.java  |   122 +
 .../knxnetip/readwrite/ApduDataMemoryRead.java     |   158 +
 .../knxnetip/readwrite/ApduDataMemoryResponse.java |   170 +
 .../knxnetip/readwrite/ApduDataMemoryWrite.java    |   120 +
 .../java/knxnetip/readwrite/ApduDataOther.java     |   143 +
 .../java/knxnetip/readwrite/ApduDataRestart.java   |   120 +
 .../knxnetip/readwrite/ApduDataUserMessage.java    |   120 +
 .../apache/plc4x/java/knxnetip/readwrite/CEMI.java |   203 +
 .../readwrite/CEMIAdditionalInformation.java       |   157 +
 .../CEMIAdditionalInformationBusmonitorInfo.java   |   268 +
 ...CEMIAdditionalInformationRelativeTimestamp.java |   169 +
 .../java/knxnetip/readwrite/CEMIPriority.java      |    57 +
 .../knxnetip/readwrite/ChannelInformation.java     |   143 +
 .../java/knxnetip/readwrite/ComObjectTable.java    |   161 +
 .../readwrite/ComObjectTableAddresses.java         |  1956 +++
 .../readwrite/ComObjectTableRealisationType1.java  |   200 +
 .../readwrite/ComObjectTableRealisationType2.java  |   200 +
 .../readwrite/ComObjectTableRealisationType6.java  |   151 +
 .../knxnetip/readwrite/ComObjectValueType.java     |    95 +
 .../java/knxnetip/readwrite/ConnectionRequest.java |   217 +
 .../readwrite/ConnectionRequestInformation.java    |   166 +
 ...nnectionRequestInformationDeviceManagement.java |   125 +
 ...nnectionRequestInformationTunnelConnection.java |   162 +
 .../knxnetip/readwrite/ConnectionResponse.java     |   253 +
 .../readwrite/ConnectionResponseDataBlock.java     |   166 +
 ...onnectionResponseDataBlockDeviceManagement.java |   125 +
 ...onnectionResponseDataBlockTunnelConnection.java |   147 +
 .../knxnetip/readwrite/ConnectionStateRequest.java |   197 +
 .../readwrite/ConnectionStateResponse.java         |   180 +
 .../java/knxnetip/readwrite/DIBDeviceInfo.java     |   326 +
 .../knxnetip/readwrite/DIBSuppSvcFamilies.java     |   161 +
 .../knxnetip/readwrite/DescriptionRequest.java     |   152 +
 .../knxnetip/readwrite/DescriptionResponse.java    |   179 +
 .../knxnetip/readwrite/DeviceConfigurationAck.java |   154 +
 .../readwrite/DeviceConfigurationAckDataBlock.java |   182 +
 .../readwrite/DeviceConfigurationRequest.java      |   189 +
 .../DeviceConfigurationRequestDataBlock.java       |   166 +
 .../java/knxnetip/readwrite/DeviceDescriptor.java  |   139 +
 .../readwrite/DeviceDescriptorMediumType.java      |    59 +
 .../knxnetip/readwrite/DeviceDescriptorType2.java  |   310 +
 .../java/knxnetip/readwrite/DeviceStatus.java      |   136 +
 .../java/knxnetip/readwrite/DisconnectRequest.java |   196 +
 .../knxnetip/readwrite/DisconnectResponse.java     |   180 +
 .../java/knxnetip/readwrite/FirmwareType.java      |    69 +
 .../GroupObjectDescriptorRealisationType1.java     |   291 +
 .../GroupObjectDescriptorRealisationType2.java     |   300 +
 .../GroupObjectDescriptorRealisationType6.java     |   112 +
 .../GroupObjectDescriptorRealisationType7.java     |   300 +
 .../GroupObjectDescriptorRealisationTypeB.java     |   282 +
 .../knxnetip/readwrite/HPAIControlEndpoint.java    |   183 +
 .../java/knxnetip/readwrite/HPAIDataEndpoint.java  |   183 +
 .../knxnetip/readwrite/HPAIDiscoveryEndpoint.java  |   183 +
 .../java/knxnetip/readwrite/HostProtocolCode.java  |    55 +
 .../plc4x/java/knxnetip/readwrite/IPAddress.java   |   128 +
 .../plc4x/java/knxnetip/readwrite/KnxAddress.java  |   158 +
 .../java/knxnetip/readwrite/KnxDatapoint.java      | 16108 +++++++++++++++++++
 .../knxnetip/readwrite/KnxDatapointMainType.java   |   199 +
 .../java/knxnetip/readwrite/KnxDatapointType.java  |  1266 ++
 .../java/knxnetip/readwrite/KnxGroupAddress.java   |   158 +
 .../knxnetip/readwrite/KnxGroupAddress2Level.java  |   160 +
 .../knxnetip/readwrite/KnxGroupAddress3Level.java  |   178 +
 .../readwrite/KnxGroupAddressFreeLevel.java        |   141 +
 .../readwrite/KnxInterfaceObjectProperty.java      |  1460 ++
 .../knxnetip/readwrite/KnxInterfaceObjectType.java |   132 +
 .../plc4x/java/knxnetip/readwrite/KnxLayer.java    |    56 +
 .../java/knxnetip/readwrite/KnxManufacturer.java   |   837 +
 .../plc4x/java/knxnetip/readwrite/KnxMedium.java   |    59 +
 .../java/knxnetip/readwrite/KnxNetIpCore.java      |   139 +
 .../readwrite/KnxNetIpDeviceManagement.java        |   139 +
 .../java/knxnetip/readwrite/KnxNetIpMessage.java   |   242 +
 .../java/knxnetip/readwrite/KnxNetIpRouting.java   |   139 +
 .../java/knxnetip/readwrite/KnxNetIpTunneling.java |   139 +
 .../knxnetip/readwrite/KnxNetObjectServer.java     |   139 +
 .../KnxNetRemoteConfigurationAndDiagnosis.java     |   141 +
 .../knxnetip/readwrite/KnxNetRemoteLogging.java    |   139 +
 .../plc4x/java/knxnetip/readwrite/KnxProperty.java |  1795 +++
 .../knxnetip/readwrite/KnxPropertyDataType.java    |   180 +
 .../plc4x/java/knxnetip/readwrite/LBusmonInd.java  |   226 +
 .../plc4x/java/knxnetip/readwrite/LDataCon.java    |   202 +
 .../java/knxnetip/readwrite/LDataExtended.java     |   292 +
 .../plc4x/java/knxnetip/readwrite/LDataFrame.java  |   265 +
 .../java/knxnetip/readwrite/LDataFrameACK.java     |   135 +
 .../plc4x/java/knxnetip/readwrite/LDataInd.java    |   202 +
 .../plc4x/java/knxnetip/readwrite/LDataReq.java    |   202 +
 .../plc4x/java/knxnetip/readwrite/LPollData.java   |   219 +
 .../java/knxnetip/readwrite/LPollDataCon.java      |   120 +
 .../java/knxnetip/readwrite/LPollDataReq.java      |   120 +
 .../plc4x/java/knxnetip/readwrite/LRawCon.java     |   120 +
 .../plc4x/java/knxnetip/readwrite/LRawInd.java     |   120 +
 .../plc4x/java/knxnetip/readwrite/LRawReq.java     |   120 +
 .../plc4x/java/knxnetip/readwrite/MACAddress.java  |   129 +
 .../knxnetip/readwrite/MFuncPropCommandReq.java    |   120 +
 .../java/knxnetip/readwrite/MFuncPropCon.java      |   120 +
 .../knxnetip/readwrite/MFuncPropStateReadReq.java  |   120 +
 .../java/knxnetip/readwrite/MPropInfoInd.java      |   120 +
 .../java/knxnetip/readwrite/MPropReadCon.java      |   249 +
 .../java/knxnetip/readwrite/MPropReadReq.java      |   229 +
 .../java/knxnetip/readwrite/MPropWriteCon.java     |   120 +
 .../java/knxnetip/readwrite/MPropWriteReq.java     |   120 +
 .../plc4x/java/knxnetip/readwrite/MResetInd.java   |   120 +
 .../plc4x/java/knxnetip/readwrite/MResetReq.java   |   120 +
 .../readwrite/ProjectInstallationIdentifier.java   |   146 +
 .../java/knxnetip/readwrite/RelativeTimestamp.java |   127 +
 .../java/knxnetip/readwrite/RoutingIndication.java |   122 +
 .../java/knxnetip/readwrite/SearchRequest.java     |   151 +
 .../java/knxnetip/readwrite/SearchResponse.java    |   210 +
 .../plc4x/java/knxnetip/readwrite/ServiceId.java   |   158 +
 .../plc4x/java/knxnetip/readwrite/Status.java      |    65 +
 .../knxnetip/readwrite/SupportedPhysicalMedia.java |   132 +
 .../java/knxnetip/readwrite/TDataConnectedInd.java |   120 +
 .../java/knxnetip/readwrite/TDataConnectedReq.java |   120 +
 .../knxnetip/readwrite/TDataIndividualInd.java     |   120 +
 .../knxnetip/readwrite/TDataIndividualReq.java     |   120 +
 .../java/knxnetip/readwrite/TunnelingRequest.java  |   185 +
 .../readwrite/TunnelingRequestDataBlock.java       |   165 +
 .../java/knxnetip/readwrite/TunnelingResponse.java |   152 +
 .../readwrite/TunnelingResponseDataBlock.java      |   182 +
 .../java/knxnetip/readwrite/UnknownMessage.java    |   150 +
 .../plc4x/java/modbus/readwrite/DataItem.java      |   917 ++
 .../plc4x/java/modbus/readwrite/DriverType.java    |    56 +
 .../plc4x/java/modbus/readwrite/ModbusADU.java     |   167 +
 .../java/modbus/readwrite/ModbusAsciiADU.java      |   195 +
 .../java/modbus/readwrite/ModbusConstants.java     |   131 +
 .../java/modbus/readwrite/ModbusDataType.java      |   107 +
 .../ModbusDeviceInformationConformityLevel.java    |    57 +
 .../readwrite/ModbusDeviceInformationLevel.java    |    57 +
 .../ModbusDeviceInformationMoreFollows.java        |    55 +
 .../readwrite/ModbusDeviceInformationObject.java   |   154 +
 .../java/modbus/readwrite/ModbusErrorCode.java     |    63 +
 .../plc4x/java/modbus/readwrite/ModbusPDU.java     |   361 +
 .../readwrite/ModbusPDUDiagnosticRequest.java      |   167 +
 .../readwrite/ModbusPDUDiagnosticResponse.java     |   167 +
 .../java/modbus/readwrite/ModbusPDUError.java      |   157 +
 .../ModbusPDUGetComEventCounterRequest.java        |   130 +
 .../ModbusPDUGetComEventCounterResponse.java       |   168 +
 .../readwrite/ModbusPDUGetComEventLogRequest.java  |   130 +
 .../readwrite/ModbusPDUGetComEventLogResponse.java |   217 +
 .../ModbusPDUMaskWriteHoldingRegisterRequest.java  |   187 +
 .../ModbusPDUMaskWriteHoldingRegisterResponse.java |   187 +
 .../readwrite/ModbusPDUReadCoilsRequest.java       |   167 +
 .../readwrite/ModbusPDUReadCoilsResponse.java      |   159 +
 .../ModbusPDUReadDeviceIdentificationRequest.java  |   201 +
 .../ModbusPDUReadDeviceIdentificationResponse.java |   335 +
 .../ModbusPDUReadDiscreteInputsRequest.java        |   168 +
 .../ModbusPDUReadDiscreteInputsResponse.java       |   161 +
 .../ModbusPDUReadExceptionStatusRequest.java       |   130 +
 .../ModbusPDUReadExceptionStatusResponse.java      |   149 +
 .../readwrite/ModbusPDUReadFifoQueueRequest.java   |   149 +
 .../readwrite/ModbusPDUReadFifoQueueResponse.java  |   172 +
 .../readwrite/ModbusPDUReadFileRecordRequest.java  |   169 +
 .../ModbusPDUReadFileRecordRequestItem.java        |   177 +
 .../readwrite/ModbusPDUReadFileRecordResponse.java |   169 +
 .../ModbusPDUReadFileRecordResponseItem.java       |   155 +
 .../ModbusPDUReadHoldingRegistersRequest.java      |   168 +
 .../ModbusPDUReadHoldingRegistersResponse.java     |   161 +
 .../ModbusPDUReadInputRegistersRequest.java        |   168 +
 .../ModbusPDUReadInputRegistersResponse.java       |   161 +
 ...DUReadWriteMultipleHoldingRegistersRequest.java |   255 +
 ...UReadWriteMultipleHoldingRegistersResponse.java |   164 +
 .../readwrite/ModbusPDUReportServerIdRequest.java  |   130 +
 .../readwrite/ModbusPDUReportServerIdResponse.java |   161 +
 .../readwrite/ModbusPDUWriteFileRecordRequest.java |   169 +
 .../ModbusPDUWriteFileRecordRequestItem.java       |   190 +
 .../ModbusPDUWriteFileRecordResponse.java          |   169 +
 .../ModbusPDUWriteFileRecordResponseItem.java      |   189 +
 .../ModbusPDUWriteMultipleCoilsRequest.java        |   198 +
 .../ModbusPDUWriteMultipleCoilsResponse.java       |   168 +
 ...busPDUWriteMultipleHoldingRegistersRequest.java |   201 +
 ...usPDUWriteMultipleHoldingRegistersResponse.java |   171 +
 .../readwrite/ModbusPDUWriteSingleCoilRequest.java |   168 +
 .../ModbusPDUWriteSingleCoilResponse.java          |   168 +
 .../ModbusPDUWriteSingleRegisterRequest.java       |   168 +
 .../ModbusPDUWriteSingleRegisterResponse.java      |   168 +
 .../plc4x/java/modbus/readwrite/ModbusRtuADU.java  |   194 +
 .../plc4x/java/modbus/readwrite/ModbusTcpADU.java  |   243 +
 .../java/opcua/readwrite/AccessLevelExType.java    |    67 +
 .../java/opcua/readwrite/AccessLevelType.java      |    61 +
 .../opcua/readwrite/AccessRestrictionType.java     |    58 +
 .../opcua/readwrite/ActivateSessionRequest.java    |   353 +
 .../opcua/readwrite/ActivateSessionResponse.java   |   285 +
 .../plc4x/java/opcua/readwrite/AddNodesItem.java   |   316 +
 .../java/opcua/readwrite/AddNodesRequest.java      |   201 +
 .../java/opcua/readwrite/AddNodesResponse.java     |   258 +
 .../plc4x/java/opcua/readwrite/AddNodesResult.java |   166 +
 .../java/opcua/readwrite/AddReferencesItem.java    |   288 +
 .../java/opcua/readwrite/AddReferencesRequest.java |   202 +
 .../opcua/readwrite/AddReferencesResponse.java     |   256 +
 .../opcua/readwrite/AdditionalParametersType.java  |   174 +
 .../opcua/readwrite/AggregateConfiguration.java    |   259 +
 .../plc4x/java/opcua/readwrite/AlarmMask.java      |    57 +
 .../java/opcua/readwrite/AliasNameDataType.java    |   196 +
 .../plc4x/java/opcua/readwrite/Annotation.java     |   183 +
 .../java/opcua/readwrite/AnnotationDataType.java   |   187 +
 .../opcua/readwrite/AnonymousIdentityToken.java    |   122 +
 .../opcua/readwrite/ApplicationDescription.java    |   343 +
 .../readwrite/ApplicationInstanceCertificate.java  |   112 +
 .../java/opcua/readwrite/ApplicationType.java      |    57 +
 .../plc4x/java/opcua/readwrite/Argument.java       |   265 +
 .../java/opcua/readwrite/AttributeWriteMask.java   |    80 +
 .../plc4x/java/opcua/readwrite/AudioDataType.java  |   111 +
 .../java/opcua/readwrite/AxisInformation.java      |   280 +
 .../java/opcua/readwrite/AxisScaleEnumeration.java |    56 +
 .../java/opcua/readwrite/BitFieldDefinition.java   |   236 +
 .../java/opcua/readwrite/BitFieldMaskDataType.java |   111 +
 .../readwrite/BrokerTransportQualityOfService.java |    58 +
 .../java/opcua/readwrite/BrowseDescription.java    |   276 +
 .../java/opcua/readwrite/BrowseDirection.java      |    57 +
 .../java/opcua/readwrite/BrowseNextRequest.java    |   239 +
 .../java/opcua/readwrite/BrowseNextResponse.java   |   258 +
 .../plc4x/java/opcua/readwrite/BrowsePath.java     |   168 +
 .../java/opcua/readwrite/BrowsePathResult.java     |   194 +
 .../java/opcua/readwrite/BrowsePathTarget.java     |   165 +
 .../plc4x/java/opcua/readwrite/BrowseRequest.java  |   256 +
 .../plc4x/java/opcua/readwrite/BrowseResponse.java |   258 +
 .../plc4x/java/opcua/readwrite/BrowseResult.java   |   228 +
 .../java/opcua/readwrite/BrowseResultMask.java     |    63 +
 .../plc4x/java/opcua/readwrite/BuildInfo.java      |   267 +
 .../java/opcua/readwrite/ByteStringArray.java      |   143 +
 .../java/opcua/readwrite/ByteStringNodeId.java     |   147 +
 .../java/opcua/readwrite/CallMethodRequest.java    |   218 +
 .../java/opcua/readwrite/CallMethodResult.java     |   323 +
 .../plc4x/java/opcua/readwrite/CallRequest.java    |   201 +
 .../plc4x/java/opcua/readwrite/CallResponse.java   |   258 +
 .../plc4x/java/opcua/readwrite/CancelRequest.java  |   165 +
 .../plc4x/java/opcua/readwrite/CancelResponse.java |   165 +
 .../java/opcua/readwrite/CartesianCoordinates.java |   122 +
 .../java/opcua/readwrite/ChannelSecurityToken.java |   197 +
 .../opcua/readwrite/CloseSecureChannelRequest.java |   147 +
 .../readwrite/CloseSecureChannelResponse.java      |   147 +
 .../java/opcua/readwrite/CloseSessionRequest.java  |   176 +
 .../java/opcua/readwrite/CloseSessionResponse.java |   146 +
 .../java/opcua/readwrite/ComplexNumberType.java    |   160 +
 .../readwrite/ConfigurationVersionDataType.java    |   161 +
 .../readwrite/ConnectionTransportDataType.java     |   122 +
 .../plc4x/java/opcua/readwrite/ContentFilter.java  |   172 +
 .../java/opcua/readwrite/ContentFilterElement.java |   204 +
 .../readwrite/ContentFilterElementResult.java      |   266 +
 .../java/opcua/readwrite/ContentFilterResult.java  |   238 +
 .../java/opcua/readwrite/ContinuationPoint.java    |   111 +
 .../java/opcua/readwrite/ConversionLimitEnum.java  |    56 +
 .../apache/plc4x/java/opcua/readwrite/Counter.java |   110 +
 .../readwrite/CreateMonitoredItemsRequest.java     |   259 +
 .../readwrite/CreateMonitoredItemsResponse.java    |   258 +
 .../java/opcua/readwrite/CreateSessionRequest.java |   359 +
 .../opcua/readwrite/CreateSessionResponse.java     |   451 +
 .../opcua/readwrite/CreateSubscriptionRequest.java |   308 +
 .../readwrite/CreateSubscriptionResponse.java      |   249 +
 .../java/opcua/readwrite/CurrencyUnitType.java     |   205 +
 .../opcua/readwrite/DataChangeNotification.java    |   243 +
 .../java/opcua/readwrite/DataChangeTrigger.java    |    56 +
 .../opcua/readwrite/DataSetFieldContentMask.java   |    60 +
 .../java/opcua/readwrite/DataSetFieldFlags.java    |    55 +
 .../java/opcua/readwrite/DataSetOrderingType.java  |    56 +
 .../readwrite/DataSetReaderMessageDataType.java    |   123 +
 .../readwrite/DataSetReaderTransportDataType.java  |   123 +
 .../opcua/readwrite/DataSetWriterDataType.java     |   401 +
 .../readwrite/DataSetWriterMessageDataType.java    |   123 +
 .../readwrite/DataSetWriterTransportDataType.java  |   123 +
 .../java/opcua/readwrite/DataTypeDefinition.java   |   122 +
 .../java/opcua/readwrite/DataTypeDescription.java  |   167 +
 .../java/opcua/readwrite/DataTypeSchemaHeader.java |   358 +
 .../plc4x/java/opcua/readwrite/DataValue.java      |   374 +
 .../plc4x/java/opcua/readwrite/DateString.java     |   111 +
 .../plc4x/java/opcua/readwrite/DeadbandType.java   |    56 +
 .../plc4x/java/opcua/readwrite/DecimalString.java  |   111 +
 .../readwrite/DeleteMonitoredItemsRequest.java     |   221 +
 .../readwrite/DeleteMonitoredItemsResponse.java    |   256 +
 .../java/opcua/readwrite/DeleteNodesItem.java      |   173 +
 .../java/opcua/readwrite/DeleteNodesRequest.java   |   202 +
 .../java/opcua/readwrite/DeleteNodesResponse.java  |   256 +
 .../java/opcua/readwrite/DeleteReferencesItem.java |   259 +
 .../opcua/readwrite/DeleteReferencesRequest.java   |   205 +
 .../opcua/readwrite/DeleteReferencesResponse.java  |   256 +
 .../readwrite/DeleteSubscriptionsRequest.java      |   196 +
 .../readwrite/DeleteSubscriptionsResponse.java     |   256 +
 .../plc4x/java/opcua/readwrite/DiagnosticInfo.java |   415 +
 .../java/opcua/readwrite/DiagnosticsLevel.java     |    58 +
 .../opcua/readwrite/DiscoveryConfiguration.java    |   122 +
 .../opcua/readwrite/DoubleComplexNumberType.java   |   161 +
 .../apache/plc4x/java/opcua/readwrite/Duplex.java  |    56 +
 .../plc4x/java/opcua/readwrite/DurationString.java |   111 +
 .../plc4x/java/opcua/readwrite/EUInformation.java  |   212 +
 .../java/opcua/readwrite/EccEncryptedSecret.java   |   111 +
 .../plc4x/java/opcua/readwrite/EncodedTicket.java  |   111 +
 .../opcua/readwrite/EndpointConfiguration.java     |   337 +
 .../java/opcua/readwrite/EndpointDescription.java  |   373 +
 .../plc4x/java/opcua/readwrite/EndpointType.java   |   232 +
 .../opcua/readwrite/EndpointUrlListDataType.java   |   172 +
 .../plc4x/java/opcua/readwrite/EnumValueType.java  |   186 +
 .../java/opcua/readwrite/EphemeralKeyType.java     |   168 +
 .../plc4x/java/opcua/readwrite/EventFieldList.java |   190 +
 .../opcua/readwrite/EventNotificationList.java     |   183 +
 .../java/opcua/readwrite/EventNotifierType.java    |    57 +
 .../opcua/readwrite/ExceptionDeviationFormat.java  |    58 +
 .../plc4x/java/opcua/readwrite/ExpandedNodeId.java |   225 +
 .../java/opcua/readwrite/ExtensionHeader.java      |   149 +
 .../java/opcua/readwrite/ExtensionObject.java      |   203 +
 .../opcua/readwrite/ExtensionObjectDefinition.java |   879 +
 .../readwrite/ExtensionObjectEncodingMask.java     |   168 +
 .../plc4x/java/opcua/readwrite/FieldMetaData.java  |   434 +
 .../java/opcua/readwrite/FieldTargetDataType.java  |   311 +
 .../plc4x/java/opcua/readwrite/FilterOperand.java  |   122 +
 .../plc4x/java/opcua/readwrite/FilterOperator.java |    71 +
 .../readwrite/FindServersOnNetworkRequest.java     |   256 +
 .../readwrite/FindServersOnNetworkResponse.java    |   229 +
 .../java/opcua/readwrite/FindServersRequest.java   |   278 +
 .../java/opcua/readwrite/FindServersResponse.java  |   201 +
 .../plc4x/java/opcua/readwrite/FourByteNodeId.java |   143 +
 .../apache/plc4x/java/opcua/readwrite/Frame.java   |   122 +
 .../opcua/readwrite/GenericAttributeValue.java     |   163 +
 .../java/opcua/readwrite/GetEndpointsRequest.java  |   278 +
 .../java/opcua/readwrite/GetEndpointsResponse.java |   201 +
 .../plc4x/java/opcua/readwrite/GuidNodeId.java     |   146 +
 .../plc4x/java/opcua/readwrite/GuidValue.java      |   191 +
 .../apache/plc4x/java/opcua/readwrite/Handle.java  |   110 +
 .../plc4x/java/opcua/readwrite/HistoryData.java    |   170 +
 .../plc4x/java/opcua/readwrite/HistoryEvent.java   |   172 +
 .../opcua/readwrite/HistoryEventFieldList.java     |   171 +
 .../java/opcua/readwrite/HistoryReadDetails.java   |   122 +
 .../java/opcua/readwrite/HistoryReadRequest.java   |   305 +
 .../java/opcua/readwrite/HistoryReadResponse.java  |   258 +
 .../java/opcua/readwrite/HistoryReadResult.java    |   193 +
 .../java/opcua/readwrite/HistoryReadValueId.java   |   219 +
 .../java/opcua/readwrite/HistoryUpdateDetails.java |   122 +
 .../java/opcua/readwrite/HistoryUpdateRequest.java |   207 +
 .../opcua/readwrite/HistoryUpdateResponse.java     |   258 +
 .../java/opcua/readwrite/HistoryUpdateResult.java  |   259 +
 .../java/opcua/readwrite/HistoryUpdateType.java    |    57 +
 .../apache/plc4x/java/opcua/readwrite/IdType.java  |    57 +
 .../java/opcua/readwrite/IdentityCriteriaType.java |    61 +
 .../opcua/readwrite/IdentityMappingRuleType.java   |   177 +
 .../plc4x/java/opcua/readwrite/ImageBMP.java       |   110 +
 .../plc4x/java/opcua/readwrite/ImageGIF.java       |   110 +
 .../plc4x/java/opcua/readwrite/ImageJPG.java       |   110 +
 .../plc4x/java/opcua/readwrite/ImagePNG.java       |   110 +
 .../apache/plc4x/java/opcua/readwrite/Index.java   |   110 +
 .../plc4x/java/opcua/readwrite/IntegerId.java      |   110 +
 .../java/opcua/readwrite/InterfaceAdminStatus.java |    56 +
 .../java/opcua/readwrite/InterfaceOperStatus.java  |    60 +
 .../java/opcua/readwrite/IssuedIdentityToken.java  |   170 +
 .../readwrite/JsonDataSetMessageContentMask.java   |    65 +
 .../readwrite/JsonNetworkMessageContentMask.java   |    61 +
 .../plc4x/java/opcua/readwrite/KeyValuePair.java   |   167 +
 .../opcua/readwrite/LinearConversionDataType.java  |   199 +
 .../plc4x/java/opcua/readwrite/LocaleId.java       |   110 +
 .../plc4x/java/opcua/readwrite/LocalizedText.java  |   195 +
 .../plc4x/java/opcua/readwrite/MessagePDU.java     |   189 +
 .../java/opcua/readwrite/MessageSecurityMode.java  |    57 +
 .../readwrite/ModelChangeStructureDataType.java    |   185 +
 .../readwrite/ModelChangeStructureVerbMask.java    |    58 +
 .../java/opcua/readwrite/ModificationInfo.java     |   195 +
 .../readwrite/ModifyMonitoredItemsRequest.java     |   259 +
 .../readwrite/ModifyMonitoredItemsResponse.java    |   258 +
 .../opcua/readwrite/ModifySubscriptionRequest.java |   299 +
 .../readwrite/ModifySubscriptionResponse.java      |   224 +
 .../readwrite/MonitoredItemCreateRequest.java      |   207 +
 .../opcua/readwrite/MonitoredItemCreateResult.java |   239 +
 .../readwrite/MonitoredItemModifyRequest.java      |   169 +
 .../opcua/readwrite/MonitoredItemModifyResult.java |   219 +
 .../opcua/readwrite/MonitoredItemNotification.java |   164 +
 .../java/opcua/readwrite/MonitoringFilter.java     |   122 +
 .../opcua/readwrite/MonitoringFilterResult.java    |   122 +
 .../plc4x/java/opcua/readwrite/MonitoringMode.java |    56 +
 .../java/opcua/readwrite/MonitoringParameters.java |   243 +
 .../plc4x/java/opcua/readwrite/NamingRuleType.java |    56 +
 .../java/opcua/readwrite/NegotiationStatus.java    |    58 +
 .../opcua/readwrite/NetworkAddressDataType.java    |   145 +
 .../java/opcua/readwrite/NetworkGroupDataType.java |   197 +
 .../plc4x/java/opcua/readwrite/NodeAttributes.java |   240 +
 .../java/opcua/readwrite/NodeAttributesMask.java   |    88 +
 .../plc4x/java/opcua/readwrite/NodeClass.java      |    62 +
 .../apache/plc4x/java/opcua/readwrite/NodeId.java  |   149 +
 .../java/opcua/readwrite/NodeIdByteString.java     |   175 +
 .../plc4x/java/opcua/readwrite/NodeIdFourByte.java |   171 +
 .../plc4x/java/opcua/readwrite/NodeIdGuid.java     |   173 +
 .../plc4x/java/opcua/readwrite/NodeIdNumeric.java  |   171 +
 .../plc4x/java/opcua/readwrite/NodeIdString.java   |   174 +
 .../plc4x/java/opcua/readwrite/NodeIdTwoByte.java  |   152 +
 .../plc4x/java/opcua/readwrite/NodeIdType.java     |    59 +
 .../java/opcua/readwrite/NodeIdTypeDefinition.java |   167 +
 .../plc4x/java/opcua/readwrite/NodeReference.java  |   258 +
 .../java/opcua/readwrite/NodeTypeDescription.java  |   236 +
 .../java/opcua/readwrite/NormalizedString.java     |   111 +
 .../java/opcua/readwrite/NotificationData.java     |   122 +
 .../java/opcua/readwrite/NotificationMessage.java  |   222 +
 .../plc4x/java/opcua/readwrite/NullExtension.java  |   122 +
 .../plc4x/java/opcua/readwrite/NumericNodeId.java  |   143 +
 .../plc4x/java/opcua/readwrite/NumericRange.java   |   111 +
 .../plc4x/java/opcua/readwrite/OpcuaAPU.java       |   150 +
 .../opcua/readwrite/OpcuaAcknowledgeResponse.java  |   262 +
 .../java/opcua/readwrite/OpcuaCloseRequest.java    |   266 +
 .../plc4x/java/opcua/readwrite/OpcuaDataType.java  |   104 +
 .../java/opcua/readwrite/OpcuaHelloRequest.java    |   291 +
 .../java/opcua/readwrite/OpcuaIdentifierType.java  |    57 +
 .../java/opcua/readwrite/OpcuaMessageError.java    |   202 +
 .../java/opcua/readwrite/OpcuaMessageRequest.java  |   264 +
 .../java/opcua/readwrite/OpcuaMessageResponse.java |   264 +
 .../readwrite/OpcuaNodeIdServicesDataType.java     |   499 +
 .../opcua/readwrite/OpcuaNodeIdServicesMethod.java |  1947 +++
 .../opcua/readwrite/OpcuaNodeIdServicesObject.java |  1537 ++
 .../readwrite/OpcuaNodeIdServicesObjectType.java   |   316 +
 .../OpcuaNodeIdServicesReferenceType.java          |   125 +
 .../OpcuaNodeIdServicesVariableAccess.java         |    56 +
 ...OpcuaNodeIdServicesVariableAcknowledgeable.java |    83 +
 .../readwrite/OpcuaNodeIdServicesVariableAdd.java  |    86 +
 .../OpcuaNodeIdServicesVariableAggregate.java      |    58 +
 .../OpcuaNodeIdServicesVariableAlarm.java          |   320 +
 .../OpcuaNodeIdServicesVariableAlias.java          |    59 +
 .../OpcuaNodeIdServicesVariableAliases.java        |    56 +
 .../OpcuaNodeIdServicesVariableAllow.java          |    54 +
 .../OpcuaNodeIdServicesVariableAlternative.java    |    57 +
 .../OpcuaNodeIdServicesVariableAnalog.java         |    56 +
 .../OpcuaNodeIdServicesVariableAnnotations.java    |    55 +
 .../OpcuaNodeIdServicesVariableApplication.java    |    59 +
 .../OpcuaNodeIdServicesVariableArray.java          |    58 +
 .../OpcuaNodeIdServicesVariableAttribute.java      |    55 +
 .../OpcuaNodeIdServicesVariableAudio.java          |    56 +
 .../OpcuaNodeIdServicesVariableAudit.java          |   132 +
 .../OpcuaNodeIdServicesVariableAuthorization.java  |    62 +
 .../readwrite/OpcuaNodeIdServicesVariableAxis.java |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableBase.java |    69 +
 .../readwrite/OpcuaNodeIdServicesVariableBit.java  |    56 +
 .../OpcuaNodeIdServicesVariableBroker.java         |    71 +
 .../OpcuaNodeIdServicesVariableBrowse.java         |    55 +
 .../OpcuaNodeIdServicesVariableBuild.java          |    59 +
 .../OpcuaNodeIdServicesVariableCartesian.java      |    55 +
 .../OpcuaNodeIdServicesVariableCertificate.java    |  2471 +++
 .../OpcuaNodeIdServicesVariableChange.java         |    54 +
 .../OpcuaNodeIdServicesVariableClose.java          |    58 +
 .../OpcuaNodeIdServicesVariableCondition.java      |    84 +
 .../OpcuaNodeIdServicesVariableConnect.java        |    55 +
 .../OpcuaNodeIdServicesVariableConversion.java     |    55 +
 .../OpcuaNodeIdServicesVariableCreate.java         |    61 +
 .../readwrite/OpcuaNodeIdServicesVariableCube.java |    56 +
 .../OpcuaNodeIdServicesVariableCurrency.java       |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableData.java |   250 +
 .../OpcuaNodeIdServicesVariableDatagram.java       |    79 +
 .../OpcuaNodeIdServicesVariableDeadband.java       |    54 +
 .../OpcuaNodeIdServicesVariableDefault.java        |    71 +
 .../OpcuaNodeIdServicesVariableDelete.java         |    55 +
 .../OpcuaNodeIdServicesVariableDiagnostics.java    |    55 +
 .../OpcuaNodeIdServicesVariableDialog.java         |    81 +
 .../OpcuaNodeIdServicesVariableDisconnect.java     |    56 +
 .../OpcuaNodeIdServicesVariableDiscrepancy.java    |    57 +
 .../OpcuaNodeIdServicesVariableDuplex.java         |    54 +
 .../OpcuaNodeIdServicesVariableEngineering.java    |    55 +
 .../readwrite/OpcuaNodeIdServicesVariableEnum.java |    55 +
 .../OpcuaNodeIdServicesVariableEvent.java          |    54 +
 .../OpcuaNodeIdServicesVariableException.java      |    55 +
 .../OpcuaNodeIdServicesVariableExclusive.java      |    87 +
 .../OpcuaNodeIdServicesVariableExpression.java     |    55 +
 .../OpcuaNodeIdServicesVariableExtension.java      |    58 +
 .../readwrite/OpcuaNodeIdServicesVariableFile.java |   121 +
 .../OpcuaNodeIdServicesVariableFilter.java         |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableFind.java |    55 +
 .../OpcuaNodeIdServicesVariableFinite.java         |    68 +
 .../OpcuaNodeIdServicesVariableFrame.java          |    60 +
 .../OpcuaNodeIdServicesVariableGeneral.java        |    54 +
 .../OpcuaNodeIdServicesVariableGenerate.java       |    57 +
 .../readwrite/OpcuaNodeIdServicesVariableGet.java  |    75 +
 .../readwrite/OpcuaNodeIdServicesVariableH.java    |    68 +
 .../OpcuaNodeIdServicesVariableHistorical.java     |    79 +
 .../OpcuaNodeIdServicesVariableHistory.java        |    84 +
 .../readwrite/OpcuaNodeIdServicesVariableI.java    |   101 +
 .../readwrite/OpcuaNodeIdServicesVariableIcon.java |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableId.java   |    54 +
 .../OpcuaNodeIdServicesVariableIdentity.java       |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableIetf.java |    62 +
 .../OpcuaNodeIdServicesVariableImage.java          |    55 +
 .../OpcuaNodeIdServicesVariableInput.java          |    54 +
 .../OpcuaNodeIdServicesVariableInterface.java      |    56 +
 .../readwrite/OpcuaNodeIdServicesVariableJson.java |    59 +
 .../readwrite/OpcuaNodeIdServicesVariableKey.java  |    77 +
 .../OpcuaNodeIdServicesVariableLimit.java          |    69 +
 .../OpcuaNodeIdServicesVariableLocal.java          |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableMax.java  |    57 +
 .../OpcuaNodeIdServicesVariableMessage.java        |    54 +
 .../OpcuaNodeIdServicesVariableModel.java          |    54 +
 .../OpcuaNodeIdServicesVariableModify.java         |    64 +
 .../OpcuaNodeIdServicesVariableMonitoring.java     |    55 +
 .../readwrite/OpcuaNodeIdServicesVariableMove.java |    55 +
 .../OpcuaNodeIdServicesVariableMulti.java          |    59 +
 .../readwrite/OpcuaNodeIdServicesVariableN.java    |    54 +
 .../OpcuaNodeIdServicesVariableNamespace.java      |    82 +
 .../OpcuaNodeIdServicesVariableNamespaces.java     |    85 +
 .../OpcuaNodeIdServicesVariableNaming.java         |    54 +
 .../OpcuaNodeIdServicesVariableNegotiation.java    |    55 +
 .../OpcuaNodeIdServicesVariableNetwork.java        |    58 +
 .../readwrite/OpcuaNodeIdServicesVariableNode.java |    56 +
 .../readwrite/OpcuaNodeIdServicesVariableNon.java  |   105 +
 .../readwrite/OpcuaNodeIdServicesVariableO.java    |    81 +
 .../readwrite/OpcuaNodeIdServicesVariableOff.java  |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableOpc.java  |  1027 ++
 .../readwrite/OpcuaNodeIdServicesVariableOpen.java |    58 +
 .../OpcuaNodeIdServicesVariableOperation.java      |    66 +
 .../OpcuaNodeIdServicesVariableOption.java         |    57 +
 .../OpcuaNodeIdServicesVariableOrdered.java        |    55 +
 .../OpcuaNodeIdServicesVariableOrientation.java    |    55 +
 .../OpcuaNodeIdServicesVariableOutput.java         |    54 +
 .../OpcuaNodeIdServicesVariableOverride.java       |    54 +
 .../OpcuaNodeIdServicesVariablePassword.java       |    54 +
 .../OpcuaNodeIdServicesVariablePerform.java        |    54 +
 .../OpcuaNodeIdServicesVariablePermission.java     |    55 +
 .../OpcuaNodeIdServicesVariablePriority.java       |    56 +
 .../OpcuaNodeIdServicesVariableProgram.java        |   126 +
 .../OpcuaNodeIdServicesVariableProgress.java       |    55 +
 .../OpcuaNodeIdServicesVariableProvisionable.java  |  1931 +++
 .../readwrite/OpcuaNodeIdServicesVariablePub.java  |   775 +
 .../OpcuaNodeIdServicesVariablePublish.java        |   405 +
 .../OpcuaNodeIdServicesVariablePublished.java      |   186 +
 .../OpcuaNodeIdServicesVariableQuantities.java     |    59 +
 .../OpcuaNodeIdServicesVariableQuantity.java       |    67 +
 .../OpcuaNodeIdServicesVariableRational.java       |    55 +
 .../readwrite/OpcuaNodeIdServicesVariableRead.java |    55 +
 .../OpcuaNodeIdServicesVariableReader.java         |   251 +
 .../OpcuaNodeIdServicesVariableRedundancy.java     |    55 +
 .../OpcuaNodeIdServicesVariableRedundant.java      |    55 +
 .../OpcuaNodeIdServicesVariableReference.java      |    55 +
 .../OpcuaNodeIdServicesVariableRemove.java         |    68 +
 .../OpcuaNodeIdServicesVariableRequest.java        |    55 +
 .../OpcuaNodeIdServicesVariableResend.java         |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableRole.java |    80 +
 .../OpcuaNodeIdServicesVariableSampling.java       |    65 +
 .../OpcuaNodeIdServicesVariableSecurity.java       |    85 +
 .../OpcuaNodeIdServicesVariableSelection.java      |    57 +
 .../OpcuaNodeIdServicesVariableSemantic.java       |    54 +
 .../OpcuaNodeIdServicesVariableServer.java         |  3978 +++++
 .../OpcuaNodeIdServicesVariableSession.java        |   216 +
 .../OpcuaNodeIdServicesVariableSessions.java       |   156 +
 .../readwrite/OpcuaNodeIdServicesVariableSet.java  |    58 +
 .../OpcuaNodeIdServicesVariableShelved.java        |    67 +
 .../OpcuaNodeIdServicesVariableStandalone.java     |    56 +
 .../OpcuaNodeIdServicesVariableState.java          |    69 +
 .../OpcuaNodeIdServicesVariableStructure.java      |    55 +
 .../OpcuaNodeIdServicesVariableSubscribed.java     |    75 +
 .../OpcuaNodeIdServicesVariableSubscription.java   |   122 +
 .../OpcuaNodeIdServicesVariableSyntax.java         |    54 +
 .../OpcuaNodeIdServicesVariableSystem.java         |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableTag.java  |    56 +
 .../OpcuaNodeIdServicesVariableTarget.java         |    62 +
 .../OpcuaNodeIdServicesVariableTemporary.java      |    76 +
 .../OpcuaNodeIdServicesVariableThree.java          |    73 +
 .../OpcuaNodeIdServicesVariableTimed.java          |    55 +
 .../OpcuaNodeIdServicesVariableTimestamps.java     |    55 +
 .../OpcuaNodeIdServicesVariableTopics.java         |    56 +
 .../OpcuaNodeIdServicesVariableTransaction.java    |    60 +
 .../OpcuaNodeIdServicesVariableTransition.java     |    76 +
 .../OpcuaNodeIdServicesVariableTransparent.java    |    56 +
 .../OpcuaNodeIdServicesVariableTrust.java          |    69 +
 .../readwrite/OpcuaNodeIdServicesVariableTsn.java  |    57 +
 .../readwrite/OpcuaNodeIdServicesVariableTwo.java  |    60 +
 .../readwrite/OpcuaNodeIdServicesVariableType.java |   115 +
 .../readwrite/OpcuaNodeIdServicesVariableUadp.java |    73 +
 .../readwrite/OpcuaNodeIdServicesVariableUnit.java |    57 +
 .../OpcuaNodeIdServicesVariableUpdate.java         |    55 +
 .../readwrite/OpcuaNodeIdServicesVariableUser.java |    71 +
 .../OpcuaNodeIdServicesVariableValue.java          |    54 +
 .../OpcuaNodeIdServicesVariableVector.java         |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableView.java |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableWell.java |   185 +
 .../readwrite/OpcuaNodeIdServicesVariableWith.java |    54 +
 .../OpcuaNodeIdServicesVariableWrite.java          |    54 +
 .../OpcuaNodeIdServicesVariableWriter.java         |   231 +
 .../readwrite/OpcuaNodeIdServicesVariableX.java    |    54 +
 .../readwrite/OpcuaNodeIdServicesVariableY.java    |    54 +
 .../java/opcua/readwrite/OpcuaOpenRequest.java     |   347 +
 .../java/opcua/readwrite/OpcuaOpenResponse.java    |   348 +
 .../java/opcua/readwrite/OpcuaStatusCode.java      |   324 +
 .../plc4x/java/opcua/readwrite/OpcuaVector.java    |   122 +
 .../plc4x/java/opcua/readwrite/OpenFileMode.java   |    57 +
 .../opcua/readwrite/OpenSecureChannelRequest.java  |   295 +
 .../opcua/readwrite/OpenSecureChannelResponse.java |   226 +
 .../plc4x/java/opcua/readwrite/OptionSet.java      |   168 +
 .../plc4x/java/opcua/readwrite/Orientation.java    |   122 +
 .../opcua/readwrite/OverrideValueHandling.java     |    56 +
 .../plc4x/java/opcua/readwrite/ParsingResult.java  |   264 +
 .../java/opcua/readwrite/PascalByteString.java     |   147 +
 .../plc4x/java/opcua/readwrite/PascalString.java   |   160 +
 .../java/opcua/readwrite/PasswordOptionsMask.java  |    63 +
 .../java/opcua/readwrite/PerformUpdateType.java    |    57 +
 .../plc4x/java/opcua/readwrite/PermissionType.java |    71 +
 .../opcua/readwrite/PortableQualifiedName.java     |   166 +
 .../opcua/readwrite/PriorityMappingEntryType.java  |   218 +
 .../readwrite/ProgramDiagnostic2DataType.java      |   559 +
 .../opcua/readwrite/ProgramDiagnosticDataType.java |   449 +
 .../readwrite/PubSubConfigurationDataType.java     |   265 +
 .../readwrite/PubSubConfigurationRefDataType.java  |   222 +
 .../readwrite/PubSubConfigurationRefMask.java      |    67 +
 .../opcua/readwrite/PubSubConnectionDataType.java  |   462 +
 .../PubSubDiagnosticsCounterClassification.java    |    56 +
 .../java/opcua/readwrite/PubSubGroupDataType.java  |   382 +
 .../readwrite/PubSubKeyPushTargetDataType.java     |   442 +
 .../plc4x/java/opcua/readwrite/PubSubState.java    |    58 +
 .../plc4x/java/opcua/readwrite/PublishRequest.java |   212 +
 .../java/opcua/readwrite/PublishResponse.java      |   400 +
 .../readwrite/PublishedDataSetSourceDataType.java  |   123 +
 .../opcua/readwrite/PublishedVariableDataType.java |   350 +
 .../plc4x/java/opcua/readwrite/QosDataType.java    |   122 +
 .../plc4x/java/opcua/readwrite/QualifiedName.java  |   146 +
 .../java/opcua/readwrite/QuantityDimension.java    |   316 +
 .../java/opcua/readwrite/QueryDataDescription.java |   188 +
 .../plc4x/java/opcua/readwrite/QueryDataSet.java   |   222 +
 .../java/opcua/readwrite/QueryFirstRequest.java    |   313 +
 .../java/opcua/readwrite/QueryFirstResponse.java   |   376 +
 .../java/opcua/readwrite/QueryNextRequest.java     |   210 +
 .../java/opcua/readwrite/QueryNextResponse.java    |   234 +
 .../apache/plc4x/java/opcua/readwrite/Range.java   |   160 +
 .../plc4x/java/opcua/readwrite/RationalNumber.java |   160 +
 .../plc4x/java/opcua/readwrite/ReadRequest.java    |   258 +
 .../plc4x/java/opcua/readwrite/ReadResponse.java   |   256 +
 .../plc4x/java/opcua/readwrite/ReadValueId.java    |   207 +
 .../readwrite/ReaderGroupMessageDataType.java      |   122 +
 .../readwrite/ReaderGroupTransportDataType.java    |   123 +
 .../java/opcua/readwrite/RedundancySupport.java    |    59 +
 .../opcua/readwrite/RedundantServerDataType.java   |   193 +
 .../java/opcua/readwrite/RedundantServerMode.java  |    57 +
 .../java/opcua/readwrite/ReferenceDescription.java |   314 +
 .../readwrite/ReferenceDescriptionDataType.java    |   218 +
 .../readwrite/ReferenceListEntryDataType.java      |   196 +
 .../java/opcua/readwrite/RegisterNodesRequest.java |   200 +
 .../opcua/readwrite/RegisterNodesResponse.java     |   203 +
 .../opcua/readwrite/RegisterServer2Request.java    |   233 +
 .../opcua/readwrite/RegisterServer2Response.java   |   266 +
 .../opcua/readwrite/RegisterServerRequest.java     |   173 +
 .../opcua/readwrite/RegisterServerResponse.java    |   146 +
 .../java/opcua/readwrite/RegisteredServer.java     |   401 +
 .../plc4x/java/opcua/readwrite/RelativePath.java   |   172 +
 .../java/opcua/readwrite/RelativePathElement.java  |   226 +
 .../java/opcua/readwrite/RepublishRequest.java     |   190 +
 .../java/opcua/readwrite/RepublishResponse.java    |   174 +
 .../plc4x/java/opcua/readwrite/RequestHeader.java  |   294 +
 .../plc4x/java/opcua/readwrite/ResponseHeader.java |   305 +
 .../java/opcua/readwrite/RolePermissionType.java   |   173 +
 .../java/opcua/readwrite/RsaEncryptedSecret.java   |   111 +
 .../SamplingIntervalDiagnosticsDataType.java       |   221 +
 .../opcua/readwrite/SecurityGroupDataType.java     |   439 +
 .../opcua/readwrite/SecurityTokenRequestType.java  |    55 +
 .../readwrite/SemanticChangeStructureDataType.java |   167 +
 .../opcua/readwrite/SemanticVersionString.java     |   111 +
 .../ServerDiagnosticsSummaryDataType.java          |   418 +
 .../java/opcua/readwrite/ServerOnNetwork.java      |   248 +
 .../plc4x/java/opcua/readwrite/ServerState.java    |    61 +
 .../java/opcua/readwrite/ServerStatusDataType.java |   271 +
 .../opcua/readwrite/ServiceCounterDataType.java    |   161 +
 .../plc4x/java/opcua/readwrite/ServiceFault.java   |   146 +
 .../readwrite/SessionAuthenticationToken.java      |   112 +
 .../readwrite/SessionDiagnosticsDataType.java      |  1331 ++
 .../SessionSecurityDiagnosticsDataType.java        |   404 +
 .../readwrite/SessionlessInvokeRequestType.java    |   334 +
 .../readwrite/SessionlessInvokeResponseType.java   |   250 +
 .../opcua/readwrite/SetMonitoringModeRequest.java  |   255 +
 .../opcua/readwrite/SetMonitoringModeResponse.java |   256 +
 .../opcua/readwrite/SetPublishingModeRequest.java  |   229 +
 .../opcua/readwrite/SetPublishingModeResponse.java |   256 +
 .../java/opcua/readwrite/SetTriggeringRequest.java |   293 +
 .../opcua/readwrite/SetTriggeringResponse.java     |   377 +
 .../plc4x/java/opcua/readwrite/SignatureData.java  |   167 +
 .../opcua/readwrite/SignedSoftwareCertificate.java |   171 +
 .../opcua/readwrite/StatusChangeNotification.java  |   178 +
 .../plc4x/java/opcua/readwrite/StatusCode.java     |   127 +
 .../plc4x/java/opcua/readwrite/StatusResult.java   |   167 +
 .../plc4x/java/opcua/readwrite/StringNodeId.java   |   146 +
 .../plc4x/java/opcua/readwrite/Structure.java      |   110 +
 .../plc4x/java/opcua/readwrite/StructureField.java |   328 +
 .../plc4x/java/opcua/readwrite/StructureType.java  |    58 +
 .../opcua/readwrite/SubscribedDataSetDataType.java |   122 +
 .../readwrite/SubscriptionAcknowledgement.java     |   161 +
 .../readwrite/SubscriptionDiagnosticsDataType.java |   877 +
 .../plc4x/java/opcua/readwrite/TimeString.java     |   111 +
 .../java/opcua/readwrite/TimeZoneDataType.java     |   170 +
 .../java/opcua/readwrite/TimestampsToReturn.java   |    58 +
 .../java/opcua/readwrite/TransactionErrorType.java |   189 +
 .../plc4x/java/opcua/readwrite/TransferResult.java |   203 +
 .../readwrite/TransferSubscriptionsRequest.java    |   229 +
 .../readwrite/TransferSubscriptionsResponse.java   |   258 +
 .../TranslateBrowsePathsToNodeIdsRequest.java      |   204 +
 .../TranslateBrowsePathsToNodeIdsResponse.java     |   259 +
 .../plc4x/java/opcua/readwrite/TrimmedString.java  |   111 +
 .../java/opcua/readwrite/TrustListDataType.java    |   374 +
 .../plc4x/java/opcua/readwrite/TrustListMasks.java |    59 +
 .../readwrite/TrustListValidationOptions.java      |    61 +
 .../plc4x/java/opcua/readwrite/TsnFailureCode.java |    79 +
 .../java/opcua/readwrite/TsnListenerStatus.java    |    57 +
 .../plc4x/java/opcua/readwrite/TsnStreamState.java |    58 +
 .../java/opcua/readwrite/TsnTalkerStatus.java      |    56 +
 .../plc4x/java/opcua/readwrite/TwoByteNodeId.java  |   127 +
 .../readwrite/UadpDataSetMessageContentMask.java   |    60 +
 .../readwrite/UadpNetworkMessageContentMask.java   |    65 +
 .../apache/plc4x/java/opcua/readwrite/Union.java   |   122 +
 .../opcua/readwrite/UnregisterNodesRequest.java    |   203 +
 .../opcua/readwrite/UnregisterNodesResponse.java   |   146 +
 .../opcua/readwrite/UnsignedRationalNumber.java    |   161 +
 .../plc4x/java/opcua/readwrite/UriString.java      |   110 +
 .../opcua/readwrite/UserConfigurationMask.java     |    58 +
 .../java/opcua/readwrite/UserIdentityToken.java    |   189 +
 .../readwrite/UserIdentityTokenDefinition.java     |   166 +
 .../opcua/readwrite/UserManagementDataType.java    |   198 +
 .../opcua/readwrite/UserNameIdentityToken.java     |   191 +
 .../java/opcua/readwrite/UserTokenPolicy.java      |   255 +
 .../plc4x/java/opcua/readwrite/UserTokenType.java  |    57 +
 .../apache/plc4x/java/opcua/readwrite/UtcTime.java |   110 +
 .../apache/plc4x/java/opcua/readwrite/Variant.java |   287 +
 .../plc4x/java/opcua/readwrite/VariantBoolean.java |   182 +
 .../plc4x/java/opcua/readwrite/VariantByte.java    |   184 +
 .../java/opcua/readwrite/VariantByteString.java    |   189 +
 .../java/opcua/readwrite/VariantDataValue.java     |   188 +
 .../java/opcua/readwrite/VariantDateTime.java      |   182 +
 .../opcua/readwrite/VariantDiagnosticInfo.java     |   189 +
 .../plc4x/java/opcua/readwrite/VariantDouble.java  |   182 +
 .../opcua/readwrite/VariantExpandedNodeId.java     |   189 +
 .../opcua/readwrite/VariantExtensionObject.java    |   189 +
 .../plc4x/java/opcua/readwrite/VariantFloat.java   |   182 +
 .../plc4x/java/opcua/readwrite/VariantGuid.java    |   188 +
 .../plc4x/java/opcua/readwrite/VariantInt16.java   |   184 +
 .../plc4x/java/opcua/readwrite/VariantInt32.java   |   182 +
 .../plc4x/java/opcua/readwrite/VariantInt64.java   |   182 +
 .../java/opcua/readwrite/VariantLocalizedText.java |   188 +
 .../plc4x/java/opcua/readwrite/VariantNodeId.java  |   188 +
 .../plc4x/java/opcua/readwrite/VariantNull.java    |   130 +
 .../java/opcua/readwrite/VariantQualifiedName.java |   188 +
 .../plc4x/java/opcua/readwrite/VariantSByte.java   |   182 +
 .../java/opcua/readwrite/VariantStatusCode.java    |   188 +
 .../plc4x/java/opcua/readwrite/VariantString.java  |   188 +
 .../plc4x/java/opcua/readwrite/VariantUInt16.java  |   184 +
 .../plc4x/java/opcua/readwrite/VariantUInt32.java  |   184 +
 .../plc4x/java/opcua/readwrite/VariantUInt64.java  |   185 +
 .../plc4x/java/opcua/readwrite/VariantVariant.java |   188 +
 .../java/opcua/readwrite/VariantXmlElement.java    |   188 +
 .../plc4x/java/opcua/readwrite/VersionTime.java    |   111 +
 .../java/opcua/readwrite/ViewDescription.java      |   180 +
 .../plc4x/java/opcua/readwrite/WriteRequest.java   |   201 +
 .../plc4x/java/opcua/readwrite/WriteResponse.java  |   256 +
 .../plc4x/java/opcua/readwrite/WriteValue.java     |   205 +
 .../readwrite/WriterGroupMessageDataType.java      |   122 +
 .../readwrite/WriterGroupTransportDataType.java    |   123 +
 .../java/opcua/readwrite/X509IdentityToken.java    |   146 +
 .../apache/plc4x/java/opcua/readwrite/XVType.java  |   157 +
 .../plc4x/java/opcua/readwrite/XmlElement.java     |   143 +
 .../openprotocol/readwrite/AlarmActiveStatus.java  |    55 +
 .../readwrite/ApplicationCommunicationError.java   |   142 +
 .../java/openprotocol/readwrite/BatchStatus.java   |    56 +
 .../java/openprotocol/readwrite/Constants.java     |   126 +
 .../java/openprotocol/readwrite/ForcedOrder.java   |    56 +
 .../openprotocol/readwrite/IdentifierResult.java   |    55 +
 .../java/openprotocol/readwrite/JobBatchMode.java  |    55 +
 .../LinkLevelNegativeAcknowledgeError.java         |    58 +
 .../plc4x/java/openprotocol/readwrite/Mid.java     |   239 +
 .../plc4x/java/openprotocol/readwrite/NoYes.java   |    55 +
 .../plc4x/java/openprotocol/readwrite/NokOk.java   |    55 +
 .../plc4x/java/openprotocol/readwrite/OkNok.java   |    55 +
 .../readwrite/OpenProtocolMessage.java             |   568 +
 .../readwrite/OpenProtocolMessageAlarm.java        |   194 +
 .../OpenProtocolMessageAlarmAcknowledge.java       |   192 +
 .../OpenProtocolMessageAlarmAcknowledgeRev1.java   |   153 +
 .../readwrite/OpenProtocolMessageAlarmRev1.java    |   354 +
 .../readwrite/OpenProtocolMessageAlarmRev2.java    |   402 +
 .../readwrite/OpenProtocolMessageAlarmStatus.java  |   196 +
 .../OpenProtocolMessageAlarmStatusAcknowledge.java |   192 +
 ...nProtocolMessageAlarmStatusAcknowledgeRev1.java |   155 +
 .../OpenProtocolMessageAlarmStatusRev1.java        |   416 +
 .../OpenProtocolMessageAlarmStatusRev2.java        |   416 +
 .../OpenProtocolMessageAlarmSubscribe.java         |   192 +
 .../OpenProtocolMessageAlarmSubscribeRev1.java     |   153 +
 .../OpenProtocolMessageAlarmUnsubscribe.java       |   192 +
 .../OpenProtocolMessageAlarmUnsubscribeRev1.java   |   153 +
 ...nProtocolMessageApplicationCommandAccepted.java |   194 +
 ...tocolMessageApplicationCommandAcceptedRev1.java |   187 +
 ...OpenProtocolMessageApplicationCommandError.java |   193 +
 ...ProtocolMessageApplicationCommandErrorRev1.java |   223 +
 ...otocolMessageApplicationCommunicationStart.java |   154 +
 ...geApplicationCommunicationStartAcknowledge.java |   219 +
 ...plicationCommunicationStartAcknowledgeRev1.java |   302 +
 ...plicationCommunicationStartAcknowledgeRev2.java |   350 +
 ...plicationCommunicationStartAcknowledgeRev3.java |   515 +
 ...plicationCommunicationStartAcknowledgeRev4.java |   612 +
 ...plicationCommunicationStartAcknowledgeRev5.java |   708 +
 ...plicationCommunicationStartAcknowledgeRev6.java |   961 ++
 ...rotocolMessageApplicationCommunicationStop.java |   154 +
 ...otocolMessageApplicationGenericDataRequest.java |   194 +
 ...olMessageApplicationGenericDataRequestRev1.java |   253 +
 ...tocolMessageApplicationGenericSubscription.java |   194 +
 ...lMessageApplicationGenericSubscriptionRev1.java |   254 +
 ...otocolMessageApplicationGenericUnsubscribe.java |   194 +
 ...olMessageApplicationGenericUnsubscribeRev1.java |   254 +
 .../readwrite/OpenProtocolMessageDisableTool.java  |   192 +
 .../OpenProtocolMessageDisableToolRev1.java        |   153 +
 .../OpenProtocolMessageDynamicPsetSelection.java   |   192 +
 ...penProtocolMessageDynamicPsetSelectionRev1.java |   235 +
 .../readwrite/OpenProtocolMessageEnableTool.java   |   190 +
 .../OpenProtocolMessageEnableToolRev1.java         |   153 +
 ...penProtocolMessageExecuteDynamicJobRequest.java |   197 +
 ...rotocolMessageExecuteDynamicJobRequestRev1.java |  1115 ++
 ...tocolMessageExecuteDynamicJobRequestRev999.java |  1115 ++
 ...enProtocolMessageIdentifierDownloadRequest.java |   193 +
 ...otocolMessageIdentifierDownloadRequestRev1.java |   183 +
 ...lMessageKeepAliveOpenProtocolCommunication.java |   194 +
 ...sageKeepAliveOpenProtocolCommunicationRev1.java |   156 +
 ...penProtocolMessageLastTighteningResultData.java |   225 +
 ...rotocolMessageLastTighteningResultDataRev1.java |  1314 ++
 ...rotocolMessageLastTighteningResultDataRev2.java |  3300 ++++
 ...rotocolMessageLastTighteningResultDataRev3.java |  2612 +++
 ...rotocolMessageLastTighteningResultDataRev4.java |  2762 ++++
 ...rotocolMessageLastTighteningResultDataRev5.java |  2814 ++++
 ...rotocolMessageLastTighteningResultDataRev6.java |  2921 ++++
 ...rotocolMessageLastTighteningResultDataRev7.java |  2990 ++++
 ...tocolMessageLastTighteningResultDataRev998.java |  3036 ++++
 ...MessageLastTighteningResultDataRev999Light.java |   560 +
 ...olMessageLastTighteningResultDataSubscribe.java |   194 +
 ...ssageLastTighteningResultDataSubscribeRev1.java |   156 +
 ...rotocolMessageLinkLevelNegativeAcknowledge.java |   194 +
 ...colMessageLinkLevelNegativeAcknowledgeRev1.java |   223 +
 ...rotocolMessageLinkLevelPositiveAcknowledge.java |   194 +
 ...colMessageLinkLevelPositiveAcknowledgeRev1.java |   187 +
 ...penProtocolMessageLockAtBatchDoneSubscribe.java |   193 +
 ...rotocolMessageLockAtBatchDoneSubscribeRev1.java |   156 +
 ...nProtocolMessageLockAtBatchDoneUnsubscribe.java |   194 +
 ...tocolMessageLockAtBatchDoneUnsubscribeRev1.java |   156 +
 .../OpenProtocolMessageLockAtBatchDoneUpload.java  |   192 +
 ...colMessageLockAtBatchDoneUploadAcknowledge.java |   194 +
 ...essageLockAtBatchDoneUploadAcknowledgeRev1.java |   156 +
 ...enProtocolMessageLockAtBatchDoneUploadRev1.java |   182 +
 ...ProtocolMessageParameterSetDataUploadReply.java |   199 +
 ...ocolMessageParameterSetDataUploadReplyRev1.java |   667 +
 ...ocolMessageParameterSetDataUploadReplyRev2.java |   767 +
 ...otocolMessageParameterSetDataUploadRequest.java |   199 +
 ...olMessageParameterSetDataUploadRequestRev1.java |   183 +
 ...olMessageParameterSetDataUploadRequestRev2.java |   183 +
 ...enProtocolMessageParameterSetIdUploadReply.java |   201 +
 ...otocolMessageParameterSetIdUploadReplyRev1.java |   204 +
 ...otocolMessageParameterSetIdUploadReplyRev2.java |   238 +
 ...otocolMessageParameterSetIdUploadReplyRev3.java |   268 +
 ...ProtocolMessageParameterSetIdUploadRequest.java |   194 +
 ...ocolMessageParameterSetIdUploadRequestRev1.java |   156 +
 .../OpenProtocolMessageParameterSetSelected.java   |   196 +
 ...ocolMessageParameterSetSelectedAcknowledge.java |   194 +
 ...MessageParameterSetSelectedAcknowledgeRev1.java |   156 +
 ...penProtocolMessageParameterSetSelectedRev1.java |   215 +
 ...penProtocolMessageParameterSetSelectedRev2.java |   820 +
 ...otocolMessageParameterSetSelectedSubscribe.java |   194 +
 ...olMessageParameterSetSelectedSubscribeRev1.java |   156 +
 ...ocolMessageParameterSetSelectedUnsubscribe.java |   194 +
 ...MessageParameterSetSelectedUnsubscribeRev1.java |   156 +
 ...colMessageProgramPsetSelectionInDynamicJob.java |   194 +
 ...essageProgramPsetSelectionInDynamicJobRev1.java |   183 +
 ...otocolMessageResetParameterSetBatchCounter.java |   194 +
 ...olMessageResetParameterSetBatchCounterRev1.java |   183 +
 .../OpenProtocolMessageResultTracesCurve.java      |   192 +
 ...enProtocolMessageResultTracesCurvePlotData.java |   193 +
 ...otocolMessageResultTracesCurvePlotDataRev1.java |   259 +
 .../OpenProtocolMessageResultTracesCurveRev1.java  |   153 +
 .../OpenProtocolMessageSelectParameterSet.java     |   192 +
 .../OpenProtocolMessageSelectParameterSetRev1.java |   181 +
 ...penProtocolMessageSetParameterSetBatchSize.java |   193 +
 ...rotocolMessageSetParameterSetBatchSizeRev1.java |   212 +
 .../readwrite/OpenProtocolMessageSetTime.java      |   190 +
 .../readwrite/OpenProtocolMessageSetTimeRev1.java  |   174 +
 .../java/openprotocol/readwrite/ResultType.java    |    61 +
 .../openprotocol/readwrite/RotationDirection.java  |    56 +
 .../java/openprotocol/readwrite/StageResult.java   |   157 +
 .../plc4x/java/openprotocol/readwrite/Status.java  |    56 +
 .../java/openprotocol/readwrite/Strategy.java      |    80 +
 .../java/openprotocol/readwrite/ToolLoosening.java |    56 +
 .../java/openprotocol/readwrite/TraceType.java     |    60 +
 .../plc4x/java/openprotocol/readwrite/Unit.java    |    61 +
 .../openprotocol/readwrite/VariableDataField.java  |   225 +
 .../java/plc4x/readwrite/Plc4xConnectRequest.java  |   166 +
 .../java/plc4x/readwrite/Plc4xConnectResponse.java |   181 +
 .../plc4x/java/plc4x/readwrite/Plc4xConstants.java |   130 +
 .../plc4x/java/plc4x/readwrite/Plc4xMessage.java   |   234 +
 .../java/plc4x/readwrite/Plc4xReadRequest.java     |   197 +
 .../java/plc4x/readwrite/Plc4xReadResponse.java    |   234 +
 .../java/plc4x/readwrite/Plc4xRequestType.java     |    65 +
 .../java/plc4x/readwrite/Plc4xResponseCode.java    |    64 +
 .../plc4x/readwrite/Plc4xSubscriptionType.java     |    56 +
 .../plc4x/java/plc4x/readwrite/Plc4xTag.java       |   160 +
 .../java/plc4x/readwrite/Plc4xTagRequest.java      |   130 +
 .../java/plc4x/readwrite/Plc4xTagResponse.java     |   156 +
 .../java/plc4x/readwrite/Plc4xTagValueRequest.java |   183 +
 .../plc4x/readwrite/Plc4xTagValueResponse.java     |   211 +
 .../plc4x/java/plc4x/readwrite/Plc4xValue.java     |   467 +
 .../plc4x/java/plc4x/readwrite/Plc4xValueType.java |    84 +
 .../java/plc4x/readwrite/Plc4xWriteRequest.java    |   197 +
 .../java/plc4x/readwrite/Plc4xWriteResponse.java   |   234 +
 .../java/profinet/readwrite/CharacterEncoding.java |    55 +
 .../plc4x/java/profinet/readwrite/CheckPeers.java  |   280 +
 .../plc4x/java/profinet/readwrite/DataItem.java    |  1139 ++
 .../profinet/readwrite/DceRpc_ActivityUuid.java    |   175 +
 .../profinet/readwrite/DceRpc_InterfaceUuid.java   |   279 +
 .../DceRpc_InterfaceUuid_ControllerInterface.java  |   124 +
 .../DceRpc_InterfaceUuid_DeviceInterface.java      |   123 +
 .../DceRpc_InterfaceUuid_ParameterInterface.java   |   124 +
 .../DceRpc_InterfaceUuid_SupervisorInterface.java  |   124 +
 .../java/profinet/readwrite/DceRpc_ObjectUuid.java |   268 +
 .../java/profinet/readwrite/DceRpc_Operation.java  |    59 +
 .../java/profinet/readwrite/DceRpc_Packet.java     |   967 ++
 .../java/profinet/readwrite/DceRpc_PacketType.java |    64 +
 .../plc4x/java/profinet/readwrite/EndOfLldp.java   |   120 +
 .../java/profinet/readwrite/Ethernet_Frame.java    |   183 +
 .../profinet/readwrite/Ethernet_FramePayload.java  |   154 +
 .../readwrite/Ethernet_FramePayload_IPv4.java      |   518 +
 .../readwrite/Ethernet_FramePayload_LLDP.java      |   144 +
 .../readwrite/Ethernet_FramePayload_PnDcp.java     |   145 +
 .../Ethernet_FramePayload_VirtualLan.java          |   213 +
 .../profinet/readwrite/FloatingPointEncoding.java  |    57 +
 .../profinet/readwrite/IODReadRequestHeader.java   |   495 +
 .../profinet/readwrite/IODReadResponseHeader.java  |   521 +
 .../profinet/readwrite/IODWriteRequestHeader.java  |   497 +
 .../profinet/readwrite/IODWriteResponseHeader.java |   459 +
 .../java/profinet/readwrite/IntegerEncoding.java   |    55 +
 .../plc4x/java/profinet/readwrite/IpAddress.java   |   128 +
 .../plc4x/java/profinet/readwrite/LldpUnit.java    |   184 +
 .../plc4x/java/profinet/readwrite/Lldp_Pdu.java    |   146 +
 .../plc4x/java/profinet/readwrite/MacAddress.java  |   129 +
 .../readwrite/ManagementAddressSubType.java        |    55 +
 .../MultipleInterfaceModeNameOfDevice.java         |    55 +
 .../java/profinet/readwrite/PDInterfaceAdjust.java |   304 +
 .../java/profinet/readwrite/PDPortDataCheck.java   |   310 +
 .../java/profinet/readwrite/PascalString.java      |   161 +
 .../readwrite/PascalString16BitLength.java         |   161 +
 .../java/profinet/readwrite/PcDcp_GetSet_Pdu.java  |   342 +
 .../profinet/readwrite/PcDcp_Pdu_DelayReq.java     |   388 +
 .../plc4x/java/profinet/readwrite/PnDcp_Block.java |   295 +
 .../profinet/readwrite/PnDcp_BlockOptions.java     |    59 +
 .../readwrite/PnDcp_Block_ALLSelector.java         |   124 +
 .../PnDcp_Block_ControlOptionFactoryReset.java     |   126 +
 .../PnDcp_Block_ControlOptionResetToFactory.java   |   126 +
 .../PnDcp_Block_ControlOptionResponse.java         |   126 +
 .../readwrite/PnDcp_Block_ControlOptionSignal.java |   126 +
 .../readwrite/PnDcp_Block_ControlOptionStart.java  |   126 +
 .../readwrite/PnDcp_Block_ControlOptionStop.java   |   126 +
 .../PnDcp_Block_DeviceInitiativeOption.java        |   126 +
 .../PnDcp_Block_DevicePropertiesAliasName.java     |   214 +
 .../PnDcp_Block_DevicePropertiesDeviceId.java      |   204 +
 ...PnDcp_Block_DevicePropertiesDeviceInstance.java |   207 +
 .../PnDcp_Block_DevicePropertiesDeviceOptions.java |   192 +
 .../PnDcp_Block_DevicePropertiesDeviceRole.java    |   291 +
 .../PnDcp_Block_DevicePropertiesDeviceVendor.java  |   214 +
 .../PnDcp_Block_DevicePropertiesNameOfStation.java |   214 +
 .../PnDcp_Block_DevicePropertiesOemDeviceId.java   |   126 +
 ...nDcp_Block_DevicePropertiesStandardGateway.java |   127 +
 .../PnDcp_Block_DhcpOptionClassIdentifier.java     |   126 +
 ...PnDcp_Block_DhcpOptionDhcpClientIdentifier.java |   127 +
 ...p_Block_DhcpOptionFullyQualifiedDomainName.java |   128 +
 .../readwrite/PnDcp_Block_DhcpOptionHostName.java  |   126 +
 ...PnDcp_Block_DhcpOptionParameterRequestList.java |   127 +
 .../PnDcp_Block_DhcpOptionServerIdentifier.java    |   126 +
 .../PnDcp_Block_DhcpOptionUuidBasedClient.java     |   126 +
 ..._Block_DhcpOptionVendorSpecificInformation.java |   129 +
 .../readwrite/PnDcp_Block_FullIpSuite.java         |   124 +
 .../readwrite/PnDcp_Block_IpMacAddress.java        |   175 +
 .../readwrite/PnDcp_Block_IpParameter.java         |   349 +
 .../java/profinet/readwrite/PnDcp_FrameId.java     |    72 +
 .../plc4x/java/profinet/readwrite/PnDcp_Pdu.java   |   184 +
 .../profinet/readwrite/PnDcp_Pdu_AlarmLow.java     |   413 +
 .../profinet/readwrite/PnDcp_Pdu_IdentifyReq.java  |   336 +
 .../profinet/readwrite/PnDcp_Pdu_IdentifyRes.java  |   336 +
 .../readwrite/PnDcp_Pdu_IdentifyRes_Payload.java   |   254 +
 .../readwrite/PnDcp_Pdu_RealTimeCyclic.java        |   436 +
 .../java/profinet/readwrite/PnDcp_ServiceId.java   |    57 +
 .../java/profinet/readwrite/PnDcp_ServiceType.java |   197 +
 .../readwrite/PnDcp_SupportedDeviceOption.java     |   164 +
 .../java/profinet/readwrite/PnIoCm_AddInfo.java    |    54 +
 .../profinet/readwrite/PnIoCm_AlarmCrType.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_ArInfo.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_ArType.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_Block.java      |   216 +
 .../java/profinet/readwrite/PnIoCm_BlockType.java  |   138 +
 .../readwrite/PnIoCm_Block_AlarmCrReq.java         |   530 +
 .../readwrite/PnIoCm_Block_AlarmCrRes.java         |   297 +
 .../profinet/readwrite/PnIoCm_Block_ArReq.java     |   793 +
 .../profinet/readwrite/PnIoCm_Block_ArRes.java     |   358 +
 .../profinet/readwrite/PnIoCm_Block_ArServer.java  |   241 +
 .../PnIoCm_Block_ExpectedSubmoduleReq.java         |   249 +
 .../profinet/readwrite/PnIoCm_Block_IAndM0.java    |   532 +
 .../profinet/readwrite/PnIoCm_Block_IAndM1.java    |   251 +
 .../profinet/readwrite/PnIoCm_Block_IAndM2.java    |   221 +
 .../profinet/readwrite/PnIoCm_Block_IAndM3.java    |   220 +
 .../profinet/readwrite/PnIoCm_Block_IAndM4.java    |   220 +
 .../profinet/readwrite/PnIoCm_Block_IoCrReq.java   |   881 +
 .../profinet/readwrite/PnIoCm_Block_IoCrRes.java   |   290 +
 .../readwrite/PnIoCm_Block_ModuleDiff.java         |   244 +
 .../PnIoCm_Block_RealIdentificationData.java       |   245 +
 .../PnIoCm_Block_ReqPlugAlarmApplicationReady.java |   122 +
 .../profinet/readwrite/PnIoCm_CompanionArType.java |    54 +
 .../PnIoCm_Control_Request_ApplicationReady.java   |   362 +
 .../PnIoCm_Control_Request_ParameterEnd.java       |   362 +
 .../PnIoCm_Control_Response_ApplicationReady.java  |   373 +
 .../PnIoCm_Control_Response_ParameterEnd.java      |   362 +
 .../readwrite/PnIoCm_DataUnitDataObject.java       |   180 +
 .../profinet/readwrite/PnIoCm_DataUnitIoCs.java    |   199 +
 .../profinet/readwrite/PnIoCm_DescriptionType.java |    54 +
 .../PnIoCm_ExpectedSubmoduleBlockReqApi.java       |   260 +
 .../java/profinet/readwrite/PnIoCm_IdentInfo.java  |    54 +
 .../profinet/readwrite/PnIoCm_IoCrBlockReqApi.java |   231 +
 .../java/profinet/readwrite/PnIoCm_IoCrType.java   |    55 +
 .../plc4x/java/profinet/readwrite/PnIoCm_IoCs.java |   182 +
 .../profinet/readwrite/PnIoCm_IoDataObject.java    |   183 +
 .../readwrite/PnIoCm_ModuleDiffBlockApi.java       |   182 +
 .../PnIoCm_ModuleDiffBlockApi_Module.java          |   241 +
 .../PnIoCm_ModuleDiffBlockApi_Submodule.java       |   387 +
 .../profinet/readwrite/PnIoCm_ModuleState.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_Packet.java     |   171 +
 .../PnIoCm_Packet_ConnectionlessCancel.java        |   123 +
 .../profinet/readwrite/PnIoCm_Packet_Fault.java    |   140 +
 .../profinet/readwrite/PnIoCm_Packet_NoCall.java   |   122 +
 .../profinet/readwrite/PnIoCm_Packet_Ping.java     |   121 +
 .../java/profinet/readwrite/PnIoCm_Packet_Rej.java |   140 +
 .../java/profinet/readwrite/PnIoCm_Packet_Req.java |   225 +
 .../java/profinet/readwrite/PnIoCm_Packet_Res.java |   309 +
 .../profinet/readwrite/PnIoCm_Packet_Working.java  |   122 +
 .../readwrite/PnIoCm_RealIdentificationApi.java    |   183 +
 .../PnIoCm_RealIdentificationApi_Slot.java         |   208 +
 .../PnIoCm_RealIdentificationApi_Subslot.java      |   161 +
 .../java/profinet/readwrite/PnIoCm_RtClass.java    |    54 +
 .../java/profinet/readwrite/PnIoCm_State.java      |    54 +
 .../java/profinet/readwrite/PnIoCm_Submodule.java  |   348 +
 .../profinet/readwrite/PnIoCm_SubmoduleType.java   |    57 +
 .../PnIoCm_Submodule_InputAndOutputData.java       |   342 +
 .../readwrite/PnIoCm_Submodule_InputData.java      |   246 +
 .../PnIoCm_Submodule_NoInputNoOutputData.java      |   237 +
 .../readwrite/PnIoCm_Submodule_OutputData.java     |   246 +
 .../readwrite/PnIo_CyclicServiceDataUnit.java      |   148 +
 .../java/profinet/readwrite/ProfinetDataType.java  |   138 +
 .../profinet/readwrite/ProfinetDeviceState.java    |    61 +
 .../java/profinet/readwrite/TlvChassisId.java      |   160 +
 .../java/profinet/readwrite/TlvIEEESubType.java    |    55 +
 .../readwrite/TlvIeee8023MacPhyConfigStatus.java   |   189 +
 .../readwrite/TlvIeee8023MaxFrameSize.java         |   141 +
 .../profinet/readwrite/TlvManagementAddress.java   |   261 +
 .../profinet/readwrite/TlvOrgSpecificIeee8023.java |   145 +
 .../readwrite/TlvOrgSpecificIeee8023Unit.java      |   156 +
 .../profinet/readwrite/TlvOrgSpecificProfibus.java |   145 +
 .../readwrite/TlvOrgSpecificProfibusUnit.java      |   165 +
 .../readwrite/TlvOrganizationSpecific.java         |   151 +
 .../readwrite/TlvOrganizationSpecificUnit.java     |   150 +
 .../profinet/readwrite/TlvPortDescription.java     |   139 +
 .../plc4x/java/profinet/readwrite/TlvPortId.java   |   159 +
 .../profinet/readwrite/TlvProfibusSubType.java     |    57 +
 .../readwrite/TlvProfibusSubTypeChassisMac.java    |   145 +
 .../readwrite/TlvProfibusSubTypeMeasuredDelay.java |   234 +
 .../readwrite/TlvProfibusSubTypeMrpPortStatus.java |   164 +
 .../readwrite/TlvProfibusSubTypePortStatus.java    |   249 +
 .../profinet/readwrite/TlvSystemCapabilities.java  |   524 +
 .../profinet/readwrite/TlvSystemDescription.java   |   139 +
 .../java/profinet/readwrite/TlvSystemName.java     |   139 +
 .../java/profinet/readwrite/TlvTimeToLive.java     |   139 +
 .../plc4x/java/profinet/readwrite/TlvType.java     |    63 +
 .../plc4x/java/profinet/readwrite/UserData.java    |   155 +
 .../apache/plc4x/java/profinet/readwrite/Uuid.java |   128 +
 .../profinet/readwrite/VirtualLanPriority.java     |    88 +
 .../java/profinet/readwrite/CharacterEncoding.java |    55 +
 .../plc4x/java/profinet/readwrite/CheckPeers.java  |   280 +
 .../plc4x/java/profinet/readwrite/DataItem.java    |  1139 ++
 .../profinet/readwrite/DceRpc_ActivityUuid.java    |   175 +
 .../profinet/readwrite/DceRpc_InterfaceUuid.java   |   279 +
 .../DceRpc_InterfaceUuid_ControllerInterface.java  |   124 +
 .../DceRpc_InterfaceUuid_DeviceInterface.java      |   123 +
 .../DceRpc_InterfaceUuid_ParameterInterface.java   |   124 +
 .../DceRpc_InterfaceUuid_SupervisorInterface.java  |   124 +
 .../java/profinet/readwrite/DceRpc_ObjectUuid.java |   268 +
 .../java/profinet/readwrite/DceRpc_Operation.java  |    59 +
 .../java/profinet/readwrite/DceRpc_Packet.java     |   967 ++
 .../java/profinet/readwrite/DceRpc_PacketType.java |    64 +
 .../plc4x/java/profinet/readwrite/EndOfLldp.java   |   120 +
 .../java/profinet/readwrite/Ethernet_Frame.java    |   183 +
 .../profinet/readwrite/Ethernet_FramePayload.java  |   154 +
 .../readwrite/Ethernet_FramePayload_IPv4.java      |   518 +
 .../readwrite/Ethernet_FramePayload_LLDP.java      |   144 +
 .../readwrite/Ethernet_FramePayload_PnDcp.java     |   145 +
 .../Ethernet_FramePayload_VirtualLan.java          |   213 +
 .../profinet/readwrite/FloatingPointEncoding.java  |    57 +
 .../profinet/readwrite/IODReadRequestHeader.java   |   495 +
 .../profinet/readwrite/IODReadResponseHeader.java  |   521 +
 .../profinet/readwrite/IODWriteRequestHeader.java  |   497 +
 .../profinet/readwrite/IODWriteResponseHeader.java |   459 +
 .../java/profinet/readwrite/IntegerEncoding.java   |    55 +
 .../plc4x/java/profinet/readwrite/IpAddress.java   |   128 +
 .../plc4x/java/profinet/readwrite/LldpUnit.java    |   184 +
 .../plc4x/java/profinet/readwrite/Lldp_Pdu.java    |   146 +
 .../plc4x/java/profinet/readwrite/MacAddress.java  |   129 +
 .../readwrite/ManagementAddressSubType.java        |    55 +
 .../MultipleInterfaceModeNameOfDevice.java         |    55 +
 .../java/profinet/readwrite/PDInterfaceAdjust.java |   304 +
 .../java/profinet/readwrite/PDPortDataCheck.java   |   310 +
 .../java/profinet/readwrite/PascalString.java      |   161 +
 .../readwrite/PascalString16BitLength.java         |   161 +
 .../java/profinet/readwrite/PcDcp_GetSet_Pdu.java  |   342 +
 .../profinet/readwrite/PcDcp_Pdu_DelayReq.java     |   388 +
 .../plc4x/java/profinet/readwrite/PnDcp_Block.java |   295 +
 .../profinet/readwrite/PnDcp_BlockOptions.java     |    59 +
 .../readwrite/PnDcp_Block_ALLSelector.java         |   124 +
 .../PnDcp_Block_ControlOptionFactoryReset.java     |   126 +
 .../PnDcp_Block_ControlOptionResetToFactory.java   |   126 +
 .../PnDcp_Block_ControlOptionResponse.java         |   126 +
 .../readwrite/PnDcp_Block_ControlOptionSignal.java |   126 +
 .../readwrite/PnDcp_Block_ControlOptionStart.java  |   126 +
 .../readwrite/PnDcp_Block_ControlOptionStop.java   |   126 +
 .../PnDcp_Block_DeviceInitiativeOption.java        |   126 +
 .../PnDcp_Block_DevicePropertiesAliasName.java     |   214 +
 .../PnDcp_Block_DevicePropertiesDeviceId.java      |   204 +
 ...PnDcp_Block_DevicePropertiesDeviceInstance.java |   207 +
 .../PnDcp_Block_DevicePropertiesDeviceOptions.java |   192 +
 .../PnDcp_Block_DevicePropertiesDeviceRole.java    |   291 +
 .../PnDcp_Block_DevicePropertiesDeviceVendor.java  |   214 +
 .../PnDcp_Block_DevicePropertiesNameOfStation.java |   214 +
 .../PnDcp_Block_DevicePropertiesOemDeviceId.java   |   126 +
 ...nDcp_Block_DevicePropertiesStandardGateway.java |   127 +
 .../PnDcp_Block_DhcpOptionClassIdentifier.java     |   126 +
 ...PnDcp_Block_DhcpOptionDhcpClientIdentifier.java |   127 +
 ...p_Block_DhcpOptionFullyQualifiedDomainName.java |   128 +
 .../readwrite/PnDcp_Block_DhcpOptionHostName.java  |   126 +
 ...PnDcp_Block_DhcpOptionParameterRequestList.java |   127 +
 .../PnDcp_Block_DhcpOptionServerIdentifier.java    |   126 +
 .../PnDcp_Block_DhcpOptionUuidBasedClient.java     |   126 +
 ..._Block_DhcpOptionVendorSpecificInformation.java |   129 +
 .../readwrite/PnDcp_Block_FullIpSuite.java         |   124 +
 .../readwrite/PnDcp_Block_IpMacAddress.java        |   175 +
 .../readwrite/PnDcp_Block_IpParameter.java         |   349 +
 .../java/profinet/readwrite/PnDcp_FrameId.java     |    72 +
 .../plc4x/java/profinet/readwrite/PnDcp_Pdu.java   |   184 +
 .../profinet/readwrite/PnDcp_Pdu_AlarmLow.java     |   413 +
 .../profinet/readwrite/PnDcp_Pdu_IdentifyReq.java  |   336 +
 .../profinet/readwrite/PnDcp_Pdu_IdentifyRes.java  |   336 +
 .../readwrite/PnDcp_Pdu_IdentifyRes_Payload.java   |   254 +
 .../readwrite/PnDcp_Pdu_RealTimeCyclic.java        |   436 +
 .../java/profinet/readwrite/PnDcp_ServiceId.java   |    57 +
 .../java/profinet/readwrite/PnDcp_ServiceType.java |   197 +
 .../readwrite/PnDcp_SupportedDeviceOption.java     |   164 +
 .../java/profinet/readwrite/PnIoCm_AddInfo.java    |    54 +
 .../profinet/readwrite/PnIoCm_AlarmCrType.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_ArInfo.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_ArType.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_Block.java      |   216 +
 .../java/profinet/readwrite/PnIoCm_BlockType.java  |   138 +
 .../readwrite/PnIoCm_Block_AlarmCrReq.java         |   530 +
 .../readwrite/PnIoCm_Block_AlarmCrRes.java         |   297 +
 .../profinet/readwrite/PnIoCm_Block_ArReq.java     |   793 +
 .../profinet/readwrite/PnIoCm_Block_ArRes.java     |   358 +
 .../profinet/readwrite/PnIoCm_Block_ArServer.java  |   241 +
 .../PnIoCm_Block_ExpectedSubmoduleReq.java         |   249 +
 .../profinet/readwrite/PnIoCm_Block_IAndM0.java    |   532 +
 .../profinet/readwrite/PnIoCm_Block_IAndM1.java    |   251 +
 .../profinet/readwrite/PnIoCm_Block_IAndM2.java    |   221 +
 .../profinet/readwrite/PnIoCm_Block_IAndM3.java    |   220 +
 .../profinet/readwrite/PnIoCm_Block_IAndM4.java    |   220 +
 .../profinet/readwrite/PnIoCm_Block_IoCrReq.java   |   881 +
 .../profinet/readwrite/PnIoCm_Block_IoCrRes.java   |   290 +
 .../readwrite/PnIoCm_Block_ModuleDiff.java         |   244 +
 .../PnIoCm_Block_RealIdentificationData.java       |   245 +
 .../PnIoCm_Block_ReqPlugAlarmApplicationReady.java |   122 +
 .../profinet/readwrite/PnIoCm_CompanionArType.java |    54 +
 .../PnIoCm_Control_Request_ApplicationReady.java   |   362 +
 .../PnIoCm_Control_Request_ParameterEnd.java       |   362 +
 .../PnIoCm_Control_Response_ApplicationReady.java  |   373 +
 .../PnIoCm_Control_Response_ParameterEnd.java      |   362 +
 .../readwrite/PnIoCm_DataUnitDataObject.java       |   180 +
 .../profinet/readwrite/PnIoCm_DataUnitIoCs.java    |   199 +
 .../profinet/readwrite/PnIoCm_DescriptionType.java |    54 +
 .../PnIoCm_ExpectedSubmoduleBlockReqApi.java       |   260 +
 .../java/profinet/readwrite/PnIoCm_IdentInfo.java  |    54 +
 .../profinet/readwrite/PnIoCm_IoCrBlockReqApi.java |   231 +
 .../java/profinet/readwrite/PnIoCm_IoCrType.java   |    55 +
 .../plc4x/java/profinet/readwrite/PnIoCm_IoCs.java |   182 +
 .../profinet/readwrite/PnIoCm_IoDataObject.java    |   183 +
 .../readwrite/PnIoCm_ModuleDiffBlockApi.java       |   182 +
 .../PnIoCm_ModuleDiffBlockApi_Module.java          |   241 +
 .../PnIoCm_ModuleDiffBlockApi_Submodule.java       |   387 +
 .../profinet/readwrite/PnIoCm_ModuleState.java     |    54 +
 .../java/profinet/readwrite/PnIoCm_Packet.java     |   171 +
 .../PnIoCm_Packet_ConnectionlessCancel.java        |   123 +
 .../profinet/readwrite/PnIoCm_Packet_Fault.java    |   140 +
 .../profinet/readwrite/PnIoCm_Packet_NoCall.java   |   122 +
 .../profinet/readwrite/PnIoCm_Packet_Ping.java     |   121 +
 .../java/profinet/readwrite/PnIoCm_Packet_Rej.java |   140 +
 .../java/profinet/readwrite/PnIoCm_Packet_Req.java |   225 +
 .../java/profinet/readwrite/PnIoCm_Packet_Res.java |   309 +
 .../profinet/readwrite/PnIoCm_Packet_Working.java  |   122 +
 .../readwrite/PnIoCm_RealIdentificationApi.java    |   183 +
 .../PnIoCm_RealIdentificationApi_Slot.java         |   208 +
 .../PnIoCm_RealIdentificationApi_Subslot.java      |   161 +
 .../java/profinet/readwrite/PnIoCm_RtClass.java    |    54 +
 .../java/profinet/readwrite/PnIoCm_State.java      |    54 +
 .../java/profinet/readwrite/PnIoCm_Submodule.java  |   348 +
 .../profinet/readwrite/PnIoCm_SubmoduleType.java   |    57 +
 .../PnIoCm_Submodule_InputAndOutputData.java       |   342 +
 .../readwrite/PnIoCm_Submodule_InputData.java      |   246 +
 .../PnIoCm_Submodule_NoInputNoOutputData.java      |   237 +
 .../readwrite/PnIoCm_Submodule_OutputData.java     |   246 +
 .../readwrite/PnIo_CyclicServiceDataUnit.java      |   148 +
 .../java/profinet/readwrite/ProfinetDataType.java  |   138 +
 .../profinet/readwrite/ProfinetDeviceState.java    |    61 +
 .../java/profinet/readwrite/TlvChassisId.java      |   160 +
 .../java/profinet/readwrite/TlvIEEESubType.java    |    55 +
 .../readwrite/TlvIeee8023MacPhyConfigStatus.java   |   189 +
 .../readwrite/TlvIeee8023MaxFrameSize.java         |   141 +
 .../profinet/readwrite/TlvManagementAddress.java   |   261 +
 .../profinet/readwrite/TlvOrgSpecificIeee8023.java |   145 +
 .../readwrite/TlvOrgSpecificIeee8023Unit.java      |   156 +
 .../profinet/readwrite/TlvOrgSpecificProfibus.java |   145 +
 .../readwrite/TlvOrgSpecificProfibusUnit.java      |   165 +
 .../readwrite/TlvOrganizationSpecific.java         |   151 +
 .../readwrite/TlvOrganizationSpecificUnit.java     |   150 +
 .../profinet/readwrite/TlvPortDescription.java     |   139 +
 .../plc4x/java/profinet/readwrite/TlvPortId.java   |   159 +
 .../profinet/readwrite/TlvProfibusSubType.java     |    57 +
 .../readwrite/TlvProfibusSubTypeChassisMac.java    |   145 +
 .../readwrite/TlvProfibusSubTypeMeasuredDelay.java |   234 +
 .../readwrite/TlvProfibusSubTypeMrpPortStatus.java |   164 +
 .../readwrite/TlvProfibusSubTypePortStatus.java    |   249 +
 .../profinet/readwrite/TlvSystemCapabilities.java  |   524 +
 .../profinet/readwrite/TlvSystemDescription.java   |   139 +
 .../java/profinet/readwrite/TlvSystemName.java     |   139 +
 .../java/profinet/readwrite/TlvTimeToLive.java     |   139 +
 .../plc4x/java/profinet/readwrite/TlvType.java     |    63 +
 .../plc4x/java/profinet/readwrite/UserData.java    |   155 +
 .../apache/plc4x/java/profinet/readwrite/Uuid.java |   128 +
 .../profinet/readwrite/VirtualLanPriority.java     |    88 +
 .../plc4x/java/simulated/readwrite/DataItem.java   |   994 ++
 .../plc4x/java/simulated/readwrite/Dummy.java      |   134 +
 .../readwrite/SimulatedDataTypeSizes.java          |   107 +
 1361 files changed, 299165 insertions(+)

diff --git a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTest.java
new file mode 100644
index 0000000000..d7ede560f5
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTest.java
@@ -0,0 +1,166 @@
+/*
+ * 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 abstract class AbstractTypeTest implements Message {
+
+  // Abstract accessors for discriminator values.
+
+  // 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 serializeAbstractTypeTestChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("AbstractTypeTest");
+
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeAbstractTypeTestChild(writeBuffer);
+
+    writeBuffer.popContext("AbstractTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    AbstractTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static AbstractTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static AbstractTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("AbstractTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    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 ["
+              + "simpleField="
+              + simpleField
+              + "]");
+    }
+
+    readBuffer.closeContext("AbstractTypeTest");
+    // Create the instance
+    AbstractTypeTest _abstractTypeTest = builder.build(simpleField);
+    return _abstractTypeTest;
+  }
+
+  public interface AbstractTypeTestBuilder {
+    AbstractTypeTest build(short simpleField);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof AbstractTypeTest)) {
+      return false;
+    }
+    AbstractTypeTest that = (AbstractTypeTest) 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/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..38a79a9884
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTestSubType.java
@@ -0,0 +1,260 @@
+/*
+ * 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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..a530a73ff1
--- /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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/CheckSumTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/CheckSumTypeTest.java
new file mode 100644
index 0000000000..5226c1af8f
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/CheckSumTypeTest.java
@@ -0,0 +1,141 @@
+/*
+ * 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 CheckSumTypeTest implements Message {
+
+  public CheckSumTypeTest() {
+    super();
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("CheckSumTypeTest");
+
+    // Checksum Field (checksum) (Calculated)
+    writeChecksumField(
+        "intField",
+        (byte) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcInt8(-(23))),
+        writeSignedByte(writeBuffer, 8));
+
+    // Checksum Field (checksum) (Calculated)
+    writeChecksumField(
+        "uintField",
+        (short) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcUint8(42)),
+        writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("CheckSumTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    CheckSumTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Checksum Field (checksum)
+    lengthInBits += 8;
+
+    // Checksum Field (checksum)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static CheckSumTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static CheckSumTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("CheckSumTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte intField =
+        readChecksumField(
+            "intField",
+            readSignedByte(readBuffer, 8),
+            (byte) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcInt8(-(23))));
+
+    short uintField =
+        readChecksumField(
+            "uintField",
+            readUnsignedShort(readBuffer, 8),
+            (short) (org.apache.plc4x.java.test.readwrite.utils.StaticHelper.crcUint8(42)));
+
+    readBuffer.closeContext("CheckSumTypeTest");
+    // Create the instance
+    CheckSumTypeTest _checkSumTypeTest;
+    _checkSumTypeTest = new CheckSumTypeTest();
+    return _checkSumTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof CheckSumTypeTest)) {
+      return false;
+    }
+    CheckSumTypeTest that = (CheckSumTypeTest) 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/ComplexOfComplexUsageA.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageA.java
new file mode 100644
index 0000000000..99f01237dd
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageA.java
@@ -0,0 +1,131 @@
+/*
+ * 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 ComplexOfComplexUsageA implements Message {
+
+  // Properties.
+  protected final ComplexOfComplexUsageB b;
+
+  public ComplexOfComplexUsageA(ComplexOfComplexUsageB b) {
+    super();
+    this.b = b;
+  }
+
+  public ComplexOfComplexUsageB getB() {
+    return b;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ComplexOfComplexUsageA");
+
+    // Simple Field (b)
+    writeSimpleField("b", b, new DataWriterComplexDefault<>(writeBuffer));
+
+    writeBuffer.popContext("ComplexOfComplexUsageA");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ComplexOfComplexUsageA _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (b)
+    lengthInBits += b.getLengthInBits();
+
+    return lengthInBits;
+  }
+
+  public static ComplexOfComplexUsageA staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ComplexOfComplexUsageA staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageA");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    ComplexOfComplexUsageB b =
+        readSimpleField(
+            "b",
+            new DataReaderComplexDefault<>(
+                () -> ComplexOfComplexUsageB.staticParse(readBuffer), readBuffer));
+
+    readBuffer.closeContext("ComplexOfComplexUsageA");
+    // Create the instance
+    ComplexOfComplexUsageA _complexOfComplexUsageA;
+    _complexOfComplexUsageA = new ComplexOfComplexUsageA(b);
+    return _complexOfComplexUsageA;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ComplexOfComplexUsageA)) {
+      return false;
+    }
+    ComplexOfComplexUsageA that = (ComplexOfComplexUsageA) o;
+    return (getB() == that.getB()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getB());
+  }
+
+  @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/ComplexOfComplexUsageB.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageB.java
new file mode 100644
index 0000000000..6408dcf20d
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageB.java
@@ -0,0 +1,158 @@
+/*
+ * 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 ComplexOfComplexUsageB implements Message {
+
+  // Properties.
+  protected final ComplexOfComplexUsageC c;
+  protected final List<ComplexOfComplexUsageD> ds;
+
+  public ComplexOfComplexUsageB(ComplexOfComplexUsageC c, List<ComplexOfComplexUsageD> ds) {
+    super();
+    this.c = c;
+    this.ds = ds;
+  }
+
+  public ComplexOfComplexUsageC getC() {
+    return c;
+  }
+
+  public List<ComplexOfComplexUsageD> getDs() {
+    return ds;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ComplexOfComplexUsageB");
+
+    // Optional Field (c) (Can be skipped, if the value is null)
+    writeOptionalField("c", c, new DataWriterComplexDefault<>(writeBuffer));
+
+    // Array Field (ds)
+    writeComplexTypeArrayField("ds", ds, writeBuffer);
+
+    writeBuffer.popContext("ComplexOfComplexUsageB");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ComplexOfComplexUsageB _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Optional Field (c)
+    if (c != null) {
+      lengthInBits += c.getLengthInBits();
+    }
+
+    // Array field
+    if (ds != null) {
+      int i = 0;
+      for (ComplexOfComplexUsageD element : ds) {
+        ThreadLocalHelper.lastItemThreadLocal.set(++i >= ds.size());
+        lengthInBits += element.getLengthInBits();
+      }
+    }
+
+    return lengthInBits;
+  }
+
+  public static ComplexOfComplexUsageB staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ComplexOfComplexUsageB staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageB");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    ComplexOfComplexUsageC c =
+        readOptionalField(
+            "c",
+            new DataReaderComplexDefault<>(
+                () -> ComplexOfComplexUsageC.staticParse(readBuffer), readBuffer));
+
+    List<ComplexOfComplexUsageD> ds =
+        readCountArrayField(
+            "ds",
+            new DataReaderComplexDefault<>(
+                () -> ComplexOfComplexUsageD.staticParse(readBuffer), readBuffer),
+            5);
+
+    readBuffer.closeContext("ComplexOfComplexUsageB");
+    // Create the instance
+    ComplexOfComplexUsageB _complexOfComplexUsageB;
+    _complexOfComplexUsageB = new ComplexOfComplexUsageB(c, ds);
+    return _complexOfComplexUsageB;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ComplexOfComplexUsageB)) {
+      return false;
+    }
+    ComplexOfComplexUsageB that = (ComplexOfComplexUsageB) o;
+    return (getC() == that.getC()) && (getDs() == that.getDs()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getC(), getDs());
+  }
+
+  @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/ComplexOfComplexUsageC.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageC.java
new file mode 100644
index 0000000000..b0568be162
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageC.java
@@ -0,0 +1,127 @@
+/*
+ * 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 ComplexOfComplexUsageC implements Message {
+
+  // Properties.
+  protected final short irrelevant;
+
+  public ComplexOfComplexUsageC(short irrelevant) {
+    super();
+    this.irrelevant = irrelevant;
+  }
+
+  public short getIrrelevant() {
+    return irrelevant;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ComplexOfComplexUsageC");
+
+    // Simple Field (irrelevant)
+    writeSimpleField("irrelevant", irrelevant, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("ComplexOfComplexUsageC");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ComplexOfComplexUsageC _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (irrelevant)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static ComplexOfComplexUsageC staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ComplexOfComplexUsageC staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageC");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short irrelevant = readSimpleField("irrelevant", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("ComplexOfComplexUsageC");
+    // Create the instance
+    ComplexOfComplexUsageC _complexOfComplexUsageC;
+    _complexOfComplexUsageC = new ComplexOfComplexUsageC(irrelevant);
+    return _complexOfComplexUsageC;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ComplexOfComplexUsageC)) {
+      return false;
+    }
+    ComplexOfComplexUsageC that = (ComplexOfComplexUsageC) o;
+    return (getIrrelevant() == that.getIrrelevant()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getIrrelevant());
+  }
+
+  @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/ComplexOfComplexUsageD.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageD.java
new file mode 100644
index 0000000000..a1238d79b5
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageD.java
@@ -0,0 +1,127 @@
+/*
+ * 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 ComplexOfComplexUsageD implements Message {
+
+  // Properties.
+  protected final short irrelevant;
+
+  public ComplexOfComplexUsageD(short irrelevant) {
+    super();
+    this.irrelevant = irrelevant;
+  }
+
+  public short getIrrelevant() {
+    return irrelevant;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ComplexOfComplexUsageD");
+
+    // Simple Field (irrelevant)
+    writeSimpleField("irrelevant", irrelevant, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("ComplexOfComplexUsageD");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ComplexOfComplexUsageD _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (irrelevant)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static ComplexOfComplexUsageD staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ComplexOfComplexUsageD staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ComplexOfComplexUsageD");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short irrelevant = readSimpleField("irrelevant", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("ComplexOfComplexUsageD");
+    // Create the instance
+    ComplexOfComplexUsageD _complexOfComplexUsageD;
+    _complexOfComplexUsageD = new ComplexOfComplexUsageD(irrelevant);
+    return _complexOfComplexUsageD;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ComplexOfComplexUsageD)) {
+      return false;
+    }
+    ComplexOfComplexUsageD that = (ComplexOfComplexUsageD) o;
+    return (getIrrelevant() == that.getIrrelevant()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getIrrelevant());
+  }
+
+  @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/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..6dbd68b6b2
--- /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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedType.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedType.java
new file mode 100644
index 0000000000..2ad3c735bf
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedType.java
@@ -0,0 +1,155 @@
+/*
+ * 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 abstract class EnumDiscriminatedType implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract EnumType getDiscr();
+
+  public EnumDiscriminatedType() {
+    super();
+  }
+
+  protected abstract void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedType");
+
+    // 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)
+    serializeEnumDiscriminatedTypeChild(writeBuffer);
+
+    writeBuffer.popContext("EnumDiscriminatedType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    EnumDiscriminatedType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (discr)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static EnumDiscriminatedType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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)
+    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 [" + "discr=" + discr + "]");
+    }
+
+    readBuffer.closeContext("EnumDiscriminatedType");
+    // Create the instance
+    EnumDiscriminatedType _enumDiscriminatedType = builder.build();
+    return _enumDiscriminatedType;
+  }
+
+  public interface EnumDiscriminatedTypeBuilder {
+    EnumDiscriminatedType build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedType)) {
+      return false;
+    }
+    EnumDiscriminatedType that = (EnumDiscriminatedType) 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/EnumDiscriminatedTypeA.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeA.java
new file mode 100644
index 0000000000..c8dcb2aea0
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeA.java
@@ -0,0 +1,141 @@
+/*
+ * 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 EnumDiscriminatedTypeA extends EnumDiscriminatedType implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr() {
+    return EnumType.BOOL;
+  }
+
+  // Properties.
+  protected final short simpA;
+
+  public EnumDiscriminatedTypeA(short simpA) {
+    super();
+    this.simpA = simpA;
+  }
+
+  public short getSimpA() {
+    return simpA;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeA");
+
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeA");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeA _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpA)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeBuilder staticParseEnumDiscriminatedTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeA");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeA");
+    // Create the instance
+    return new EnumDiscriminatedTypeABuilderImpl(simpA);
+  }
+
+  public static class EnumDiscriminatedTypeABuilderImpl
+      implements EnumDiscriminatedType.EnumDiscriminatedTypeBuilder {
+    private final short simpA;
+
+    public EnumDiscriminatedTypeABuilderImpl(short simpA) {
+      this.simpA = simpA;
+    }
+
+    public EnumDiscriminatedTypeA build() {
+      EnumDiscriminatedTypeA enumDiscriminatedTypeA = new EnumDiscriminatedTypeA(simpA);
+      return enumDiscriminatedTypeA;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeA)) {
+      return false;
+    }
+    EnumDiscriminatedTypeA that = (EnumDiscriminatedTypeA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpA());
+  }
+
+  @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/EnumDiscriminatedTypeB.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeB.java
new file mode 100644
index 0000000000..e286ebce4c
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeB.java
@@ -0,0 +1,141 @@
+/*
+ * 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 EnumDiscriminatedTypeB extends EnumDiscriminatedType implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr() {
+    return EnumType.UINT;
+  }
+
+  // Properties.
+  protected final short simpB;
+
+  public EnumDiscriminatedTypeB(short simpB) {
+    super();
+    this.simpB = simpB;
+  }
+
+  public short getSimpB() {
+    return simpB;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeB");
+
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeB");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeB _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpB)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeBuilder staticParseEnumDiscriminatedTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeB");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeB");
+    // Create the instance
+    return new EnumDiscriminatedTypeBBuilderImpl(simpB);
+  }
+
+  public static class EnumDiscriminatedTypeBBuilderImpl
+      implements EnumDiscriminatedType.EnumDiscriminatedTypeBuilder {
+    private final short simpB;
+
+    public EnumDiscriminatedTypeBBuilderImpl(short simpB) {
+      this.simpB = simpB;
+    }
+
+    public EnumDiscriminatedTypeB build() {
+      EnumDiscriminatedTypeB enumDiscriminatedTypeB = new EnumDiscriminatedTypeB(simpB);
+      return enumDiscriminatedTypeB;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeB)) {
+      return false;
+    }
+    EnumDiscriminatedTypeB that = (EnumDiscriminatedTypeB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpB());
+  }
+
+  @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/EnumDiscriminatedTypeC.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeC.java
new file mode 100644
index 0000000000..b923ccac2b
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeC.java
@@ -0,0 +1,141 @@
+/*
+ * 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 EnumDiscriminatedTypeC extends EnumDiscriminatedType implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr() {
+    return EnumType.INT;
+  }
+
+  // Properties.
+  protected final short simpC;
+
+  public EnumDiscriminatedTypeC(short simpC) {
+    super();
+    this.simpC = simpC;
+  }
+
+  public short getSimpC() {
+    return simpC;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeC");
+
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeC");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeC _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpC)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeBuilder staticParseEnumDiscriminatedTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeC");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeC");
+    // Create the instance
+    return new EnumDiscriminatedTypeCBuilderImpl(simpC);
+  }
+
+  public static class EnumDiscriminatedTypeCBuilderImpl
+      implements EnumDiscriminatedType.EnumDiscriminatedTypeBuilder {
+    private final short simpC;
+
+    public EnumDiscriminatedTypeCBuilderImpl(short simpC) {
+      this.simpC = simpC;
+    }
+
+    public EnumDiscriminatedTypeC build() {
+      EnumDiscriminatedTypeC enumDiscriminatedTypeC = new EnumDiscriminatedTypeC(simpC);
+      return enumDiscriminatedTypeC;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeC)) {
+      return false;
+    }
+    EnumDiscriminatedTypeC that = (EnumDiscriminatedTypeC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpC());
+  }
+
+  @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/EnumDiscriminatedTypeMultiple.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultiple.java
new file mode 100644
index 0000000000..8ea49794d1
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultiple.java
@@ -0,0 +1,190 @@
+/*
+ * 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 abstract class EnumDiscriminatedTypeMultiple implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract EnumType getDiscr1();
+
+  public abstract EnumTypeInt getDiscr2();
+
+  public EnumDiscriminatedTypeMultiple() {
+    super();
+  }
+
+  protected abstract void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    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 (discr2) (Used as input to a switch field)
+    writeDiscriminatorEnumField(
+        "discr2",
+        "EnumTypeInt",
+        getDiscr2(),
+        new DataWriterEnumDefault<>(
+            EnumTypeInt::getValue, EnumTypeInt::name, writeSignedByte(writeBuffer, 8)));
+
+    // Switch field (Serialize the sub-type)
+    serializeEnumDiscriminatedTypeMultipleChild(writeBuffer);
+
+    writeBuffer.popContext("EnumDiscriminatedTypeMultiple");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    EnumDiscriminatedTypeMultiple _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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 EnumDiscriminatedTypeMultiple staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static EnumDiscriminatedTypeMultiple staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultiple");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    EnumType discr1 =
+        readDiscriminatorField(
+            "discr1",
+            new DataReaderEnumDefault<>(EnumType::enumForValue, readUnsignedShort(readBuffer, 8)));
+
+    EnumTypeInt discr2 =
+        readDiscriminatorField(
+            "discr2",
+            new DataReaderEnumDefault<>(EnumTypeInt::enumForValue, readSignedByte(readBuffer, 8)));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    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 ["
+              + "discr1="
+              + discr1
+              + " "
+              + "discr2="
+              + discr2
+              + "]");
+    }
+
+    readBuffer.closeContext("EnumDiscriminatedTypeMultiple");
+    // Create the instance
+    EnumDiscriminatedTypeMultiple _enumDiscriminatedTypeMultiple = builder.build();
+    return _enumDiscriminatedTypeMultiple;
+  }
+
+  public interface EnumDiscriminatedTypeMultipleBuilder {
+    EnumDiscriminatedTypeMultiple build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeMultiple)) {
+      return false;
+    }
+    EnumDiscriminatedTypeMultiple that = (EnumDiscriminatedTypeMultiple) 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/EnumDiscriminatedTypeMultipleA.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleA.java
new file mode 100644
index 0000000000..df93defe84
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleA.java
@@ -0,0 +1,147 @@
+/*
+ * 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 EnumDiscriminatedTypeMultipleA extends EnumDiscriminatedTypeMultiple
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr1() {
+    return EnumType.BOOL;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.BOOLINT;
+  }
+
+  // Properties.
+  protected final short simpA;
+
+  public EnumDiscriminatedTypeMultipleA(short simpA) {
+    super();
+    this.simpA = simpA;
+  }
+
+  public short getSimpA() {
+    return simpA;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeMultipleA");
+
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeMultipleA");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeMultipleA _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpA)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeMultipleBuilder
+      staticParseEnumDiscriminatedTypeMultipleBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultipleA");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeMultipleA");
+    // Create the instance
+    return new EnumDiscriminatedTypeMultipleABuilderImpl(simpA);
+  }
+
+  public static class EnumDiscriminatedTypeMultipleABuilderImpl
+      implements EnumDiscriminatedTypeMultiple.EnumDiscriminatedTypeMultipleBuilder {
+    private final short simpA;
+
+    public EnumDiscriminatedTypeMultipleABuilderImpl(short simpA) {
+      this.simpA = simpA;
+    }
+
+    public EnumDiscriminatedTypeMultipleA build() {
+      EnumDiscriminatedTypeMultipleA enumDiscriminatedTypeMultipleA =
+          new EnumDiscriminatedTypeMultipleA(simpA);
+      return enumDiscriminatedTypeMultipleA;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeMultipleA)) {
+      return false;
+    }
+    EnumDiscriminatedTypeMultipleA that = (EnumDiscriminatedTypeMultipleA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpA());
+  }
+
+  @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/EnumDiscriminatedTypeMultipleB.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleB.java
new file mode 100644
index 0000000000..b4408df718
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleB.java
@@ -0,0 +1,147 @@
+/*
+ * 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 EnumDiscriminatedTypeMultipleB extends EnumDiscriminatedTypeMultiple
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr1() {
+    return EnumType.UINT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.UINTINT;
+  }
+
+  // Properties.
+  protected final short simpB;
+
+  public EnumDiscriminatedTypeMultipleB(short simpB) {
+    super();
+    this.simpB = simpB;
+  }
+
+  public short getSimpB() {
+    return simpB;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeMultipleB");
+
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeMultipleB");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeMultipleB _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpB)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeMultipleBuilder
+      staticParseEnumDiscriminatedTypeMultipleBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultipleB");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeMultipleB");
+    // Create the instance
+    return new EnumDiscriminatedTypeMultipleBBuilderImpl(simpB);
+  }
+
+  public static class EnumDiscriminatedTypeMultipleBBuilderImpl
+      implements EnumDiscriminatedTypeMultiple.EnumDiscriminatedTypeMultipleBuilder {
+    private final short simpB;
+
+    public EnumDiscriminatedTypeMultipleBBuilderImpl(short simpB) {
+      this.simpB = simpB;
+    }
+
+    public EnumDiscriminatedTypeMultipleB build() {
+      EnumDiscriminatedTypeMultipleB enumDiscriminatedTypeMultipleB =
+          new EnumDiscriminatedTypeMultipleB(simpB);
+      return enumDiscriminatedTypeMultipleB;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeMultipleB)) {
+      return false;
+    }
+    EnumDiscriminatedTypeMultipleB that = (EnumDiscriminatedTypeMultipleB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpB());
+  }
+
+  @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/EnumDiscriminatedTypeMultipleC.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleC.java
new file mode 100644
index 0000000000..921e380583
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleC.java
@@ -0,0 +1,147 @@
+/*
+ * 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 EnumDiscriminatedTypeMultipleC extends EnumDiscriminatedTypeMultiple
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr1() {
+    return EnumType.INT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.INTINT;
+  }
+
+  // Properties.
+  protected final short simpC;
+
+  public EnumDiscriminatedTypeMultipleC(short simpC) {
+    super();
+    this.simpC = simpC;
+  }
+
+  public short getSimpC() {
+    return simpC;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeMultipleC");
+
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeMultipleC");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeMultipleC _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpC)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeMultipleBuilder
+      staticParseEnumDiscriminatedTypeMultipleBuilder(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeMultipleC");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeMultipleC");
+    // Create the instance
+    return new EnumDiscriminatedTypeMultipleCBuilderImpl(simpC);
+  }
+
+  public static class EnumDiscriminatedTypeMultipleCBuilderImpl
+      implements EnumDiscriminatedTypeMultiple.EnumDiscriminatedTypeMultipleBuilder {
+    private final short simpC;
+
+    public EnumDiscriminatedTypeMultipleCBuilderImpl(short simpC) {
+      this.simpC = simpC;
+    }
+
+    public EnumDiscriminatedTypeMultipleC build() {
+      EnumDiscriminatedTypeMultipleC enumDiscriminatedTypeMultipleC =
+          new EnumDiscriminatedTypeMultipleC(simpC);
+      return enumDiscriminatedTypeMultipleC;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeMultipleC)) {
+      return false;
+    }
+    EnumDiscriminatedTypeMultipleC that = (EnumDiscriminatedTypeMultipleC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpC());
+  }
+
+  @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/EnumDiscriminatedTypeParameter.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameter.java
new file mode 100644
index 0000000000..b0201b8e48
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameter.java
@@ -0,0 +1,160 @@
+/*
+ * 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 abstract class EnumDiscriminatedTypeParameter implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract EnumType getDiscr();
+
+  public EnumDiscriminatedTypeParameter() {
+    super();
+  }
+
+  protected abstract void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameter");
+
+    // Switch field (Serialize the sub-type)
+    serializeEnumDiscriminatedTypeParameterChild(writeBuffer);
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameter");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    EnumDiscriminatedTypeParameter _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  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);
+    }
+    EnumType discr;
+    if (args[0] instanceof EnumType) {
+      discr = (EnumType) args[0];
+    } else if (args[0] instanceof String) {
+      discr = EnumType.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type EnumType or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, discr);
+  }
+
+  public static EnumDiscriminatedTypeParameter staticParse(ReadBuffer readBuffer, EnumType discr)
+      throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameter");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    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 [" + "discr=" + discr + "]");
+    }
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameter");
+    // Create the instance
+    EnumDiscriminatedTypeParameter _enumDiscriminatedTypeParameter = builder.build();
+    return _enumDiscriminatedTypeParameter;
+  }
+
+  public interface EnumDiscriminatedTypeParameterBuilder {
+    EnumDiscriminatedTypeParameter build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameter)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameter that = (EnumDiscriminatedTypeParameter) 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/EnumDiscriminatedTypeParameterA.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterA.java
new file mode 100644
index 0000000000..4d06ceee2b
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterA.java
@@ -0,0 +1,144 @@
+/*
+ * 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 EnumDiscriminatedTypeParameterA extends EnumDiscriminatedTypeParameter
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr() {
+    return EnumType.BOOL;
+  }
+
+  // Properties.
+  protected final short simpA;
+
+  public EnumDiscriminatedTypeParameterA(short simpA) {
+    super();
+    this.simpA = simpA;
+  }
+
+  public short getSimpA() {
+    return simpA;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterA");
+
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterA");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeParameterA _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpA)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeParameterBuilder
+      staticParseEnumDiscriminatedTypeParameterBuilder(ReadBuffer readBuffer, EnumType discr)
+          throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterA");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterA");
+    // Create the instance
+    return new EnumDiscriminatedTypeParameterABuilderImpl(simpA);
+  }
+
+  public static class EnumDiscriminatedTypeParameterABuilderImpl
+      implements EnumDiscriminatedTypeParameter.EnumDiscriminatedTypeParameterBuilder {
+    private final short simpA;
+
+    public EnumDiscriminatedTypeParameterABuilderImpl(short simpA) {
+      this.simpA = simpA;
+    }
+
+    public EnumDiscriminatedTypeParameterA build() {
+      EnumDiscriminatedTypeParameterA enumDiscriminatedTypeParameterA =
+          new EnumDiscriminatedTypeParameterA(simpA);
+      return enumDiscriminatedTypeParameterA;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameterA)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameterA that = (EnumDiscriminatedTypeParameterA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpA());
+  }
+
+  @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/EnumDiscriminatedTypeParameterB.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterB.java
new file mode 100644
index 0000000000..9efd680971
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterB.java
@@ -0,0 +1,144 @@
+/*
+ * 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 EnumDiscriminatedTypeParameterB extends EnumDiscriminatedTypeParameter
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr() {
+    return EnumType.UINT;
+  }
+
+  // Properties.
+  protected final short simpB;
+
+  public EnumDiscriminatedTypeParameterB(short simpB) {
+    super();
+    this.simpB = simpB;
+  }
+
+  public short getSimpB() {
+    return simpB;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterB");
+
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterB");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeParameterB _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpB)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeParameterBuilder
+      staticParseEnumDiscriminatedTypeParameterBuilder(ReadBuffer readBuffer, EnumType discr)
+          throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterB");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterB");
+    // Create the instance
+    return new EnumDiscriminatedTypeParameterBBuilderImpl(simpB);
+  }
+
+  public static class EnumDiscriminatedTypeParameterBBuilderImpl
+      implements EnumDiscriminatedTypeParameter.EnumDiscriminatedTypeParameterBuilder {
+    private final short simpB;
+
+    public EnumDiscriminatedTypeParameterBBuilderImpl(short simpB) {
+      this.simpB = simpB;
+    }
+
+    public EnumDiscriminatedTypeParameterB build() {
+      EnumDiscriminatedTypeParameterB enumDiscriminatedTypeParameterB =
+          new EnumDiscriminatedTypeParameterB(simpB);
+      return enumDiscriminatedTypeParameterB;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameterB)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameterB that = (EnumDiscriminatedTypeParameterB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpB());
+  }
+
+  @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/EnumDiscriminatedTypeParameterC.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterC.java
new file mode 100644
index 0000000000..d5512a4c15
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterC.java
@@ -0,0 +1,144 @@
+/*
+ * 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 EnumDiscriminatedTypeParameterC extends EnumDiscriminatedTypeParameter
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr() {
+    return EnumType.INT;
+  }
+
+  // Properties.
+  protected final short simpC;
+
+  public EnumDiscriminatedTypeParameterC(short simpC) {
+    super();
+    this.simpC = simpC;
+  }
+
+  public short getSimpC() {
+    return simpC;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeParameterChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterC");
+
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterC");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeParameterC _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpC)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeParameterBuilder
+      staticParseEnumDiscriminatedTypeParameterBuilder(ReadBuffer readBuffer, EnumType discr)
+          throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterC");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterC");
+    // Create the instance
+    return new EnumDiscriminatedTypeParameterCBuilderImpl(simpC);
+  }
+
+  public static class EnumDiscriminatedTypeParameterCBuilderImpl
+      implements EnumDiscriminatedTypeParameter.EnumDiscriminatedTypeParameterBuilder {
+    private final short simpC;
+
+    public EnumDiscriminatedTypeParameterCBuilderImpl(short simpC) {
+      this.simpC = simpC;
+    }
+
+    public EnumDiscriminatedTypeParameterC build() {
+      EnumDiscriminatedTypeParameterC enumDiscriminatedTypeParameterC =
+          new EnumDiscriminatedTypeParameterC(simpC);
+      return enumDiscriminatedTypeParameterC;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameterC)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameterC that = (EnumDiscriminatedTypeParameterC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpC());
+  }
+
+  @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/EnumDiscriminatedTypeParameterMultiple.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultiple.java
new file mode 100644
index 0000000000..50ed8ab94b
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultiple.java
@@ -0,0 +1,183 @@
+/*
+ * 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 abstract class EnumDiscriminatedTypeParameterMultiple implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract EnumType getDiscr1();
+
+  public abstract EnumTypeInt getDiscr2();
+
+  public EnumDiscriminatedTypeParameterMultiple() {
+    super();
+  }
+
+  protected abstract void serializeEnumDiscriminatedTypeParameterMultipleChild(
+      WriteBuffer writeBuffer) throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultiple");
+
+    // Switch field (Serialize the sub-type)
+    serializeEnumDiscriminatedTypeParameterMultipleChild(writeBuffer);
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultiple");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    EnumDiscriminatedTypeParameterMultiple _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  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);
+    }
+    EnumType discr1;
+    if (args[0] instanceof EnumType) {
+      discr1 = (EnumType) args[0];
+    } else if (args[0] instanceof String) {
+      discr1 = EnumType.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type EnumType or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    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 EnumTypeInt or a string which is parseable but was "
+              + args[1].getClass().getName());
+    }
+    return staticParse(readBuffer, discr1, discr2);
+  }
+
+  public static EnumDiscriminatedTypeParameterMultiple staticParse(
+      ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultiple");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    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 ["
+              + "discr1="
+              + discr1
+              + " "
+              + "discr2="
+              + discr2
+              + "]");
+    }
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultiple");
+    // Create the instance
+    EnumDiscriminatedTypeParameterMultiple _enumDiscriminatedTypeParameterMultiple =
+        builder.build();
+    return _enumDiscriminatedTypeParameterMultiple;
+  }
+
+  public interface EnumDiscriminatedTypeParameterMultipleBuilder {
+    EnumDiscriminatedTypeParameterMultiple build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultiple)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameterMultiple that = (EnumDiscriminatedTypeParameterMultiple) 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/EnumDiscriminatedTypeParameterMultipleA.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleA.java
new file mode 100644
index 0000000000..0ac5d6da74
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleA.java
@@ -0,0 +1,149 @@
+/*
+ * 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 EnumDiscriminatedTypeParameterMultipleA extends EnumDiscriminatedTypeParameterMultiple
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr1() {
+    return EnumType.BOOL;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.BOOLINT;
+  }
+
+  // Properties.
+  protected final short simpA;
+
+  public EnumDiscriminatedTypeParameterMultipleA(short simpA) {
+    super();
+    this.simpA = simpA;
+  }
+
+  public short getSimpA() {
+    return simpA;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeParameterMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultipleA");
+
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultipleA");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeParameterMultipleA _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpA)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeParameterMultipleBuilder
+      staticParseEnumDiscriminatedTypeParameterMultipleBuilder(
+          ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultipleA");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultipleA");
+    // Create the instance
+    return new EnumDiscriminatedTypeParameterMultipleABuilderImpl(simpA);
+  }
+
+  public static class EnumDiscriminatedTypeParameterMultipleABuilderImpl
+      implements EnumDiscriminatedTypeParameterMultiple
+          .EnumDiscriminatedTypeParameterMultipleBuilder {
+    private final short simpA;
+
+    public EnumDiscriminatedTypeParameterMultipleABuilderImpl(short simpA) {
+      this.simpA = simpA;
+    }
+
+    public EnumDiscriminatedTypeParameterMultipleA build() {
+      EnumDiscriminatedTypeParameterMultipleA enumDiscriminatedTypeParameterMultipleA =
+          new EnumDiscriminatedTypeParameterMultipleA(simpA);
+      return enumDiscriminatedTypeParameterMultipleA;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultipleA)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameterMultipleA that = (EnumDiscriminatedTypeParameterMultipleA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpA());
+  }
+
+  @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/EnumDiscriminatedTypeParameterMultipleB.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleB.java
new file mode 100644
index 0000000000..77b9a546ec
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleB.java
@@ -0,0 +1,149 @@
+/*
+ * 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 EnumDiscriminatedTypeParameterMultipleB extends EnumDiscriminatedTypeParameterMultiple
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr1() {
+    return EnumType.UINT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.UINTINT;
+  }
+
+  // Properties.
+  protected final short simpB;
+
+  public EnumDiscriminatedTypeParameterMultipleB(short simpB) {
+    super();
+    this.simpB = simpB;
+  }
+
+  public short getSimpB() {
+    return simpB;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeParameterMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultipleB");
+
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultipleB");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeParameterMultipleB _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpB)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeParameterMultipleBuilder
+      staticParseEnumDiscriminatedTypeParameterMultipleBuilder(
+          ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultipleB");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultipleB");
+    // Create the instance
+    return new EnumDiscriminatedTypeParameterMultipleBBuilderImpl(simpB);
+  }
+
+  public static class EnumDiscriminatedTypeParameterMultipleBBuilderImpl
+      implements EnumDiscriminatedTypeParameterMultiple
+          .EnumDiscriminatedTypeParameterMultipleBuilder {
+    private final short simpB;
+
+    public EnumDiscriminatedTypeParameterMultipleBBuilderImpl(short simpB) {
+      this.simpB = simpB;
+    }
+
+    public EnumDiscriminatedTypeParameterMultipleB build() {
+      EnumDiscriminatedTypeParameterMultipleB enumDiscriminatedTypeParameterMultipleB =
+          new EnumDiscriminatedTypeParameterMultipleB(simpB);
+      return enumDiscriminatedTypeParameterMultipleB;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultipleB)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameterMultipleB that = (EnumDiscriminatedTypeParameterMultipleB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpB());
+  }
+
+  @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/EnumDiscriminatedTypeParameterMultipleC.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleC.java
new file mode 100644
index 0000000000..b364796e2b
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleC.java
@@ -0,0 +1,149 @@
+/*
+ * 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 EnumDiscriminatedTypeParameterMultipleC extends EnumDiscriminatedTypeParameterMultiple
+    implements Message {
+
+  // Accessors for discriminator values.
+  public EnumType getDiscr1() {
+    return EnumType.INT;
+  }
+
+  public EnumTypeInt getDiscr2() {
+    return EnumTypeInt.INTINT;
+  }
+
+  // Properties.
+  protected final short simpC;
+
+  public EnumDiscriminatedTypeParameterMultipleC(short simpC) {
+    super();
+    this.simpC = simpC;
+  }
+
+  public short getSimpC() {
+    return simpC;
+  }
+
+  @Override
+  protected void serializeEnumDiscriminatedTypeParameterMultipleChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumDiscriminatedTypeParameterMultipleC");
+
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("EnumDiscriminatedTypeParameterMultipleC");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    EnumDiscriminatedTypeParameterMultipleC _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpC)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumDiscriminatedTypeParameterMultipleBuilder
+      staticParseEnumDiscriminatedTypeParameterMultipleBuilder(
+          ReadBuffer readBuffer, EnumType discr1, EnumTypeInt discr2) throws ParseException {
+    readBuffer.pullContext("EnumDiscriminatedTypeParameterMultipleC");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("EnumDiscriminatedTypeParameterMultipleC");
+    // Create the instance
+    return new EnumDiscriminatedTypeParameterMultipleCBuilderImpl(simpC);
+  }
+
+  public static class EnumDiscriminatedTypeParameterMultipleCBuilderImpl
+      implements EnumDiscriminatedTypeParameterMultiple
+          .EnumDiscriminatedTypeParameterMultipleBuilder {
+    private final short simpC;
+
+    public EnumDiscriminatedTypeParameterMultipleCBuilderImpl(short simpC) {
+      this.simpC = simpC;
+    }
+
+    public EnumDiscriminatedTypeParameterMultipleC build() {
+      EnumDiscriminatedTypeParameterMultipleC enumDiscriminatedTypeParameterMultipleC =
+          new EnumDiscriminatedTypeParameterMultipleC(simpC);
+      return enumDiscriminatedTypeParameterMultipleC;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumDiscriminatedTypeParameterMultipleC)) {
+      return false;
+    }
+    EnumDiscriminatedTypeParameterMultipleC that = (EnumDiscriminatedTypeParameterMultipleC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpC());
+  }
+
+  @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/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..609be2b273
--- /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 final 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..beea4d448f
--- /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 final 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..d8314c4079
--- /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 final 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..81ec27443a
--- /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 final byte value;
+  private final short uintType;
+  private final byte intType;
+  private final String stringType;
+  private final EnumType enumType;
+  private final 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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeTest.java
new file mode 100644
index 0000000000..71f2bbadf2
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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 EnumTypeTest implements Message {
+
+  // Properties.
+  protected final EnumTypeParameters enumField;
+
+  public EnumTypeTest(EnumTypeParameters enumField) {
+    super();
+    this.enumField = enumField;
+  }
+
+  public EnumTypeParameters getEnumField() {
+    return enumField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("EnumTypeTest");
+
+    // Enum field (enumField)
+    writeEnumField(
+        "enumField",
+        "EnumTypeParameters",
+        enumField,
+        new DataWriterEnumDefault<>(
+            EnumTypeParameters::getIntType,
+            EnumTypeParameters::name,
+            writeSignedByte(writeBuffer, 8)));
+
+    writeBuffer.popContext("EnumTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    EnumTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Enum Field (enumField)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static EnumTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static EnumTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("EnumTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    EnumTypeParameters enumField =
+        readEnumField(
+            "enumField",
+            "EnumTypeParameters",
+            readEnum(EnumTypeParameters::firstEnumForFieldIntType, readSignedByte(readBuffer, 8)));
+
+    readBuffer.closeContext("EnumTypeTest");
+    // Create the instance
+    EnumTypeTest _enumTypeTest;
+    _enumTypeTest = new EnumTypeTest(enumField);
+    return _enumTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof EnumTypeTest)) {
+      return false;
+    }
+    EnumTypeTest that = (EnumTypeTest) o;
+    return (getEnumField() == that.getEnumField()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getEnumField());
+  }
+
+  @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/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..000ee98f77
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTest.java
@@ -0,0 +1,322 @@
+/*
+ * 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;
+
+  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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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);
+    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..e5fa537bfc
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTestWithUnknownField.java
@@ -0,0 +1,222 @@
+/*
+ * 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;
+
+  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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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);
+    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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitPascalStringTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitPascalStringTypeTest.java
new file mode 100644
index 0000000000..c4e7700473
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitPascalStringTypeTest.java
@@ -0,0 +1,138 @@
+/*
+ * 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 ImplicitPascalStringTypeTest implements Message {
+
+  // Properties.
+  protected final String stringField;
+
+  public ImplicitPascalStringTypeTest(String stringField) {
+    super();
+    this.stringField = stringField;
+  }
+
+  public String getStringField() {
+    return stringField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ImplicitPascalStringTypeTest");
+
+    // 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));
+
+    // Simple Field (stringField)
+    writeSimpleField("stringField", stringField, writeString(writeBuffer, stringLength));
+
+    writeBuffer.popContext("ImplicitPascalStringTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ImplicitPascalStringTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Implicit Field (stringLength)
+    lengthInBits += 8;
+
+    // Simple field (stringField)
+    lengthInBits += getStringField().length();
+
+    return lengthInBits;
+  }
+
+  public static ImplicitPascalStringTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ImplicitPascalStringTypeTest staticParse(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("ImplicitPascalStringTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte stringLength = readImplicitField("stringLength", readSignedByte(readBuffer, 8));
+
+    String stringField = readSimpleField("stringField", readString(readBuffer, stringLength));
+
+    readBuffer.closeContext("ImplicitPascalStringTypeTest");
+    // Create the instance
+    ImplicitPascalStringTypeTest _implicitPascalStringTypeTest;
+    _implicitPascalStringTypeTest = new ImplicitPascalStringTypeTest(stringField);
+    return _implicitPascalStringTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ImplicitPascalStringTypeTest)) {
+      return false;
+    }
+    ImplicitPascalStringTypeTest that = (ImplicitPascalStringTypeTest) o;
+    return (getStringField() == that.getStringField()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(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/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..b721b7330c
--- /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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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..5ccd564878
--- /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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/LengthLoopTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/LengthLoopTest.java
new file mode 100644
index 0000000000..f3a80c09ee
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/LengthLoopTest.java
@@ -0,0 +1,137 @@
+/*
+ * 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 LengthLoopTest implements Message {
+
+  // Properties.
+  protected final int commandType;
+
+  public LengthLoopTest(int commandType) {
+    super();
+    this.commandType = commandType;
+  }
+
+  public int getCommandType() {
+    return commandType;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("LengthLoopTest");
+
+    // Simple Field (commandType)
+    writeSimpleField("commandType", commandType, writeUnsignedInt(writeBuffer, 16));
+
+    // 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("LengthLoopTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    LengthLoopTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (commandType)
+    lengthInBits += 16;
+
+    // Implicit Field (len)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static LengthLoopTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static LengthLoopTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("LengthLoopTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int commandType = readSimpleField("commandType", readUnsignedInt(readBuffer, 16));
+
+    int len = readImplicitField("len", readUnsignedInt(readBuffer, 16));
+
+    readBuffer.closeContext("LengthLoopTest");
+    // Create the instance
+    LengthLoopTest _lengthLoopTest;
+    _lengthLoopTest = new LengthLoopTest(commandType);
+    return _lengthLoopTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof LengthLoopTest)) {
+      return false;
+    }
+    LengthLoopTest that = (LengthLoopTest) o;
+    return (getCommandType() == that.getCommandType()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getCommandType());
+  }
+
+  @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/OptionalTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/OptionalTypeTest.java
new file mode 100644
index 0000000000..3973c301b5
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/OptionalTypeTest.java
@@ -0,0 +1,146 @@
+/*
+ * 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 OptionalTypeTest implements Message {
+
+  // Properties.
+  protected final short simpleField;
+  protected final Short optionalField;
+
+  public OptionalTypeTest(short simpleField, Short optionalField) {
+    super();
+    this.simpleField = simpleField;
+    this.optionalField = optionalField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  public Short getOptionalField() {
+    return optionalField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("OptionalTypeTest");
+
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
+
+    // Optional Field (optionalField) (Can be skipped, if the value is null)
+    writeOptionalField("optionalField", optionalField, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("OptionalTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    OptionalTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // Optional Field (optionalField)
+    if (optionalField != null) {
+      lengthInBits += 8;
+    }
+
+    return lengthInBits;
+  }
+
+  public static OptionalTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static OptionalTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("OptionalTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
+
+    Short optionalField =
+        readOptionalField("optionalField", readUnsignedShort(readBuffer, 8), (simpleField) == (5));
+
+    readBuffer.closeContext("OptionalTypeTest");
+    // Create the instance
+    OptionalTypeTest _optionalTypeTest;
+    _optionalTypeTest = new OptionalTypeTest(simpleField, optionalField);
+    return _optionalTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof OptionalTypeTest)) {
+      return false;
+    }
+    OptionalTypeTest that = (OptionalTypeTest) o;
+    return (getSimpleField() == that.getSimpleField())
+        && (getOptionalField() == that.getOptionalField())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getSimpleField(), 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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PaddingTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PaddingTypeTest.java
new file mode 100644
index 0000000000..2eea0789a8
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PaddingTypeTest.java
@@ -0,0 +1,139 @@
+/*
+ * 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 PaddingTypeTest implements Message {
+
+  // Properties.
+  protected final short simpleField;
+
+  public PaddingTypeTest(short simpleField) {
+    super();
+    this.simpleField = simpleField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("PaddingTypeTest");
+
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
+
+    // Padding Field (padding)
+    writePaddingField(
+        "padding", (int) (simpleField), (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("PaddingTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    PaddingTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // Padding Field (padding)
+    int _timesPadding = (int) (simpleField);
+    while (_timesPadding-- > 0) {
+      lengthInBits += 8;
+    }
+
+    return lengthInBits;
+  }
+
+  public static PaddingTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static PaddingTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("PaddingTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
+
+    readPaddingField(readUnsignedShort(readBuffer, 8), (int) (simpleField));
+
+    readBuffer.closeContext("PaddingTypeTest");
+    // Create the instance
+    PaddingTypeTest _paddingTypeTest;
+    _paddingTypeTest = new PaddingTypeTest(simpleField);
+    return _paddingTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof PaddingTypeTest)) {
+      return false;
+    }
+    PaddingTypeTest that = (PaddingTypeTest) 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/PascalStringTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PascalStringTypeTest.java
new file mode 100644
index 0000000000..831b25a620
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PascalStringTypeTest.java
@@ -0,0 +1,143 @@
+/*
+ * 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 PascalStringTypeTest implements Message {
+
+  // Properties.
+  protected final byte stringLength;
+  protected final String stringField;
+
+  public PascalStringTypeTest(byte stringLength, String stringField) {
+    super();
+    this.stringLength = stringLength;
+    this.stringField = stringField;
+  }
+
+  public byte getStringLength() {
+    return stringLength;
+  }
+
+  public String getStringField() {
+    return stringField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("PascalStringTypeTest");
+
+    // Simple Field (stringLength)
+    writeSimpleField("stringLength", stringLength, writeSignedByte(writeBuffer, 8));
+
+    // Simple Field (stringField)
+    writeSimpleField("stringField", stringField, writeString(writeBuffer, stringLength));
+
+    writeBuffer.popContext("PascalStringTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    PascalStringTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (stringLength)
+    lengthInBits += 8;
+
+    // Simple field (stringField)
+    lengthInBits += getStringLength();
+
+    return lengthInBits;
+  }
+
+  public static PascalStringTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static PascalStringTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("PascalStringTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte stringLength = readSimpleField("stringLength", readSignedByte(readBuffer, 8));
+
+    String stringField = readSimpleField("stringField", readString(readBuffer, stringLength));
+
+    readBuffer.closeContext("PascalStringTypeTest");
+    // Create the instance
+    PascalStringTypeTest _pascalStringTypeTest;
+    _pascalStringTypeTest = new PascalStringTypeTest(stringLength, stringField);
+    return _pascalStringTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof PascalStringTypeTest)) {
+      return false;
+    }
+    PascalStringTypeTest that = (PascalStringTypeTest) o;
+    return (getStringLength() == that.getStringLength())
+        && (getStringField() == that.getStringField())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getStringLength(), 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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTest.java
new file mode 100644
index 0000000000..8bb4fb2f27
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTest.java
@@ -0,0 +1,120 @@
+/*
+ * 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 ReservedTypeTest implements Message {
+
+  public ReservedTypeTest() {
+    super();
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ReservedTypeTest");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("ReservedTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ReservedTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static ReservedTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ReservedTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ReservedTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    readBuffer.closeContext("ReservedTypeTest");
+    // Create the instance
+    ReservedTypeTest _reservedTypeTest;
+    _reservedTypeTest = new ReservedTypeTest();
+    return _reservedTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ReservedTypeTest)) {
+      return false;
+    }
+    ReservedTypeTest that = (ReservedTypeTest) 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/ReservedTypeTestChild.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestChild.java
new file mode 100644
index 0000000000..85bb3a3790
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestChild.java
@@ -0,0 +1,128 @@
+/*
+ * 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 ReservedTypeTestChild extends ReservedTypeTestParent implements Message {
+
+  // Accessors for discriminator values.
+
+  public ReservedTypeTestChild(short simpleField) {
+    super(simpleField);
+  }
+
+  @Override
+  protected void serializeReservedTypeTestParentChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ReservedTypeTestChild");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("ReservedTypeTestChild");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    ReservedTypeTestChild _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static ReservedTypeTestParentBuilder staticParseReservedTypeTestParentBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ReservedTypeTestChild");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    Short reservedField0 =
+        readReservedField("reserved", readUnsignedShort(readBuffer, 8), (short) 0x00);
+
+    readBuffer.closeContext("ReservedTypeTestChild");
+    // Create the instance
+    return new ReservedTypeTestChildBuilderImpl();
+  }
+
+  public static class ReservedTypeTestChildBuilderImpl
+      implements ReservedTypeTestParent.ReservedTypeTestParentBuilder {
+
+    public ReservedTypeTestChildBuilderImpl() {}
+
+    public ReservedTypeTestChild build(short simpleField) {
+      ReservedTypeTestChild reservedTypeTestChild = new ReservedTypeTestChild(simpleField);
+      return reservedTypeTestChild;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ReservedTypeTestChild)) {
+      return false;
+    }
+    ReservedTypeTestChild that = (ReservedTypeTestChild) o;
+    return super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode());
+  }
+
+  @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/ReservedTypeTestParent.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestParent.java
new file mode 100644
index 0000000000..1f450bcb5c
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestParent.java
@@ -0,0 +1,163 @@
+/*
+ * 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 abstract class ReservedTypeTestParent implements Message {
+
+  // Abstract accessors for discriminator values.
+
+  // Properties.
+  protected final short simpleField;
+
+  public ReservedTypeTestParent(short simpleField) {
+    super();
+    this.simpleField = simpleField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  protected abstract void serializeReservedTypeTestParentChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("ReservedTypeTestParent");
+
+    // Reserved Field (reserved)
+    writeReservedField("reserved", (short) 0x00, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeReservedTypeTestParentChild(writeBuffer);
+
+    writeBuffer.popContext("ReservedTypeTestParent");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    ReservedTypeTestParent _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Reserved Field (reserved)
+    lengthInBits += 8;
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static ReservedTypeTestParent staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static ReservedTypeTestParent staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("ReservedTypeTestParent");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    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)
+    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 ["
+              + "simpleField="
+              + simpleField
+              + "]");
+    }
+
+    readBuffer.closeContext("ReservedTypeTestParent");
+    // Create the instance
+    ReservedTypeTestParent _reservedTypeTestParent = builder.build(simpleField);
+    return _reservedTypeTestParent;
+  }
+
+  public interface ReservedTypeTestParentBuilder {
+    ReservedTypeTestParent build(short simpleField);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof ReservedTypeTestParent)) {
+      return false;
+    }
+    ReservedTypeTestParent that = (ReservedTypeTestParent) 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/SimpleBitTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleBitTypeTest.java
new file mode 100644
index 0000000000..eb62286604
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleBitTypeTest.java
@@ -0,0 +1,127 @@
+/*
+ * 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 SimpleBitTypeTest implements Message {
+
+  // Properties.
+  protected final boolean bitField;
+
+  public SimpleBitTypeTest(boolean bitField) {
+    super();
+    this.bitField = bitField;
+  }
+
+  public boolean getBitField() {
+    return bitField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("SimpleBitTypeTest");
+
+    // Simple Field (bitField)
+    writeSimpleField("bitField", bitField, writeBoolean(writeBuffer));
+
+    writeBuffer.popContext("SimpleBitTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    SimpleBitTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (bitField)
+    lengthInBits += 1;
+
+    return lengthInBits;
+  }
+
+  public static SimpleBitTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static SimpleBitTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SimpleBitTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    boolean bitField = readSimpleField("bitField", readBoolean(readBuffer));
+
+    readBuffer.closeContext("SimpleBitTypeTest");
+    // Create the instance
+    SimpleBitTypeTest _simpleBitTypeTest;
+    _simpleBitTypeTest = new SimpleBitTypeTest(bitField);
+    return _simpleBitTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof SimpleBitTypeTest)) {
+      return false;
+    }
+    SimpleBitTypeTest that = (SimpleBitTypeTest) o;
+    return (getBitField() == that.getBitField()) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getBitField());
+  }
+
+  @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/SimpleDiscriminatedType.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedType.java
new file mode 100644
index 0000000000..3be4febaf8
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedType.java
@@ -0,0 +1,147 @@
+/*
+ * 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 abstract class SimpleDiscriminatedType implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getDiscr();
+
+  public SimpleDiscriminatedType() {
+    super();
+  }
+
+  protected abstract void serializeSimpleDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("SimpleDiscriminatedType");
+
+    // Discriminator Field (discr) (Used as input to a switch field)
+    writeDiscriminatorField("discr", getDiscr(), writeUnsignedShort(writeBuffer, 8));
+
+    // Switch field (Serialize the sub-type)
+    serializeSimpleDiscriminatedTypeChild(writeBuffer);
+
+    writeBuffer.popContext("SimpleDiscriminatedType");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    SimpleDiscriminatedType _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (discr)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static SimpleDiscriminatedType staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static SimpleDiscriminatedType staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SimpleDiscriminatedType");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short discr = readDiscriminatorField("discr", readUnsignedShort(readBuffer, 8));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    SimpleDiscriminatedTypeBuilder builder = null;
+    if (EvaluationHelper.equals(discr, (short) 0x00)) {
+      builder = SimpleDiscriminatedTypeA.staticParseSimpleDiscriminatedTypeBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(discr, (short) 0x01)) {
+      builder = SimpleDiscriminatedTypeB.staticParseSimpleDiscriminatedTypeBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(discr, (short) 0x02)) {
+      builder = SimpleDiscriminatedTypeC.staticParseSimpleDiscriminatedTypeBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type" + " parameters [" + "discr=" + discr + "]");
+    }
+
+    readBuffer.closeContext("SimpleDiscriminatedType");
+    // Create the instance
+    SimpleDiscriminatedType _simpleDiscriminatedType = builder.build();
+    return _simpleDiscriminatedType;
+  }
+
+  public interface SimpleDiscriminatedTypeBuilder {
+    SimpleDiscriminatedType build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof SimpleDiscriminatedType)) {
+      return false;
+    }
+    SimpleDiscriminatedType that = (SimpleDiscriminatedType) 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/SimpleDiscriminatedTypeA.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeA.java
new file mode 100644
index 0000000000..125015b7f9
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeA.java
@@ -0,0 +1,141 @@
+/*
+ * 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 SimpleDiscriminatedTypeA extends SimpleDiscriminatedType implements Message {
+
+  // Accessors for discriminator values.
+  public Short getDiscr() {
+    return (short) 0x00;
+  }
+
+  // Properties.
+  protected final short simpA;
+
+  public SimpleDiscriminatedTypeA(short simpA) {
+    super();
+    this.simpA = simpA;
+  }
+
+  public short getSimpA() {
+    return simpA;
+  }
+
+  @Override
+  protected void serializeSimpleDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("SimpleDiscriminatedTypeA");
+
+    // Simple Field (simpA)
+    writeSimpleField("simpA", simpA, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("SimpleDiscriminatedTypeA");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    SimpleDiscriminatedTypeA _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpA)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static SimpleDiscriminatedTypeBuilder staticParseSimpleDiscriminatedTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SimpleDiscriminatedTypeA");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpA = readSimpleField("simpA", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("SimpleDiscriminatedTypeA");
+    // Create the instance
+    return new SimpleDiscriminatedTypeABuilderImpl(simpA);
+  }
+
+  public static class SimpleDiscriminatedTypeABuilderImpl
+      implements SimpleDiscriminatedType.SimpleDiscriminatedTypeBuilder {
+    private final short simpA;
+
+    public SimpleDiscriminatedTypeABuilderImpl(short simpA) {
+      this.simpA = simpA;
+    }
+
+    public SimpleDiscriminatedTypeA build() {
+      SimpleDiscriminatedTypeA simpleDiscriminatedTypeA = new SimpleDiscriminatedTypeA(simpA);
+      return simpleDiscriminatedTypeA;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof SimpleDiscriminatedTypeA)) {
+      return false;
+    }
+    SimpleDiscriminatedTypeA that = (SimpleDiscriminatedTypeA) o;
+    return (getSimpA() == that.getSimpA()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpA());
+  }
+
+  @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/SimpleDiscriminatedTypeB.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeB.java
new file mode 100644
index 0000000000..becfdfa80f
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeB.java
@@ -0,0 +1,141 @@
+/*
+ * 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 SimpleDiscriminatedTypeB extends SimpleDiscriminatedType implements Message {
+
+  // Accessors for discriminator values.
+  public Short getDiscr() {
+    return (short) 0x01;
+  }
+
+  // Properties.
+  protected final short simpB;
+
+  public SimpleDiscriminatedTypeB(short simpB) {
+    super();
+    this.simpB = simpB;
+  }
+
+  public short getSimpB() {
+    return simpB;
+  }
+
+  @Override
+  protected void serializeSimpleDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("SimpleDiscriminatedTypeB");
+
+    // Simple Field (simpB)
+    writeSimpleField("simpB", simpB, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("SimpleDiscriminatedTypeB");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    SimpleDiscriminatedTypeB _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpB)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static SimpleDiscriminatedTypeBuilder staticParseSimpleDiscriminatedTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SimpleDiscriminatedTypeB");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpB = readSimpleField("simpB", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("SimpleDiscriminatedTypeB");
+    // Create the instance
+    return new SimpleDiscriminatedTypeBBuilderImpl(simpB);
+  }
+
+  public static class SimpleDiscriminatedTypeBBuilderImpl
+      implements SimpleDiscriminatedType.SimpleDiscriminatedTypeBuilder {
+    private final short simpB;
+
+    public SimpleDiscriminatedTypeBBuilderImpl(short simpB) {
+      this.simpB = simpB;
+    }
+
+    public SimpleDiscriminatedTypeB build() {
+      SimpleDiscriminatedTypeB simpleDiscriminatedTypeB = new SimpleDiscriminatedTypeB(simpB);
+      return simpleDiscriminatedTypeB;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof SimpleDiscriminatedTypeB)) {
+      return false;
+    }
+    SimpleDiscriminatedTypeB that = (SimpleDiscriminatedTypeB) o;
+    return (getSimpB() == that.getSimpB()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpB());
+  }
+
+  @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/SimpleDiscriminatedTypeC.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeC.java
new file mode 100644
index 0000000000..bb1a63f8f6
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeC.java
@@ -0,0 +1,141 @@
+/*
+ * 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 SimpleDiscriminatedTypeC extends SimpleDiscriminatedType implements Message {
+
+  // Accessors for discriminator values.
+  public Short getDiscr() {
+    return (short) 0x02;
+  }
+
+  // Properties.
+  protected final short simpC;
+
+  public SimpleDiscriminatedTypeC(short simpC) {
+    super();
+    this.simpC = simpC;
+  }
+
+  public short getSimpC() {
+    return simpC;
+  }
+
+  @Override
+  protected void serializeSimpleDiscriminatedTypeChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("SimpleDiscriminatedTypeC");
+
+    // Simple Field (simpC)
+    writeSimpleField("simpC", simpC, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("SimpleDiscriminatedTypeC");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    SimpleDiscriminatedTypeC _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpC)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static SimpleDiscriminatedTypeBuilder staticParseSimpleDiscriminatedTypeBuilder(
+      ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SimpleDiscriminatedTypeC");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpC = readSimpleField("simpC", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("SimpleDiscriminatedTypeC");
+    // Create the instance
+    return new SimpleDiscriminatedTypeCBuilderImpl(simpC);
+  }
+
+  public static class SimpleDiscriminatedTypeCBuilderImpl
+      implements SimpleDiscriminatedType.SimpleDiscriminatedTypeBuilder {
+    private final short simpC;
+
+    public SimpleDiscriminatedTypeCBuilderImpl(short simpC) {
+      this.simpC = simpC;
+    }
+
+    public SimpleDiscriminatedTypeC build() {
+      SimpleDiscriminatedTypeC simpleDiscriminatedTypeC = new SimpleDiscriminatedTypeC(simpC);
+      return simpleDiscriminatedTypeC;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof SimpleDiscriminatedTypeC)) {
+      return false;
+    }
+    SimpleDiscriminatedTypeC that = (SimpleDiscriminatedTypeC) o;
+    return (getSimpC() == that.getSimpC()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getSimpC());
+  }
+
+  @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/SimpleTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleTypeTest.java
new file mode 100644
index 0000000000..2ee0c86c25
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleTypeTest.java
@@ -0,0 +1,234 @@
+/*
+ * 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 SimpleTypeTest implements Message {
+
+  // Properties.
+  protected final boolean bitField;
+  protected final byte byteField;
+  protected final byte intField;
+  protected final short uintField;
+  protected final float floatField;
+  protected final double doubleField;
+  protected final String stringField;
+
+  public SimpleTypeTest(
+      boolean bitField,
+      byte byteField,
+      byte intField,
+      short uintField,
+      float floatField,
+      double doubleField,
+      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 boolean getBitField() {
+    return bitField;
+  }
+
+  public byte getByteField() {
+    return byteField;
+  }
+
+  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;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("SimpleTypeTest");
+
+    // Simple Field (bitField)
+    writeSimpleField("bitField", bitField, writeBoolean(writeBuffer));
+
+    // Simple Field (byteField)
+    writeSimpleField("byteField", byteField, writeByte(writeBuffer, 8));
+
+    // Simple Field (intField)
+    writeSimpleField("intField", intField, writeSignedByte(writeBuffer, 8));
+
+    // Simple Field (uintField)
+    writeSimpleField("uintField", uintField, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (floatField)
+    writeSimpleField("floatField", floatField, writeFloat(writeBuffer, 32));
+
+    // Simple Field (doubleField)
+    writeSimpleField("doubleField", doubleField, writeDouble(writeBuffer, 64));
+
+    // Simple Field (stringField)
+    writeSimpleField("stringField", stringField, writeString(writeBuffer, 8));
+
+    writeBuffer.popContext("SimpleTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    SimpleTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (bitField)
+    lengthInBits += 1;
+
+    // Simple field (byteField)
+    lengthInBits += 8;
+
+    // Simple field (intField)
+    lengthInBits += 8;
+
+    // Simple field (uintField)
+    lengthInBits += 8;
+
+    // Simple field (floatField)
+    lengthInBits += 32;
+
+    // Simple field (doubleField)
+    lengthInBits += 64;
+
+    // Simple field (stringField)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static SimpleTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static SimpleTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("SimpleTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    boolean bitField = readSimpleField("bitField", readBoolean(readBuffer));
+
+    byte byteField = readSimpleField("byteField", readByte(readBuffer, 8));
+
+    byte intField = readSimpleField("intField", readSignedByte(readBuffer, 8));
+
+    short uintField = readSimpleField("uintField", readUnsignedShort(readBuffer, 8));
+
+    float floatField = readSimpleField("floatField", readFloat(readBuffer, 32));
+
+    double doubleField = readSimpleField("doubleField", readDouble(readBuffer, 64));
+
+    String stringField = readSimpleField("stringField", readString(readBuffer, 8));
+
+    readBuffer.closeContext("SimpleTypeTest");
+    // Create the instance
+    SimpleTypeTest _simpleTypeTest;
+    _simpleTypeTest =
+        new SimpleTypeTest(
+            bitField, byteField, intField, uintField, floatField, doubleField, stringField);
+    return _simpleTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof SimpleTypeTest)) {
+      return false;
+    }
+    SimpleTypeTest that = (SimpleTypeTest) 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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/UIntTypeTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/UIntTypeTest.java
new file mode 100644
index 0000000000..1306d4140d
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/UIntTypeTest.java
@@ -0,0 +1,219 @@
+/*
+ * 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.math.BigInteger;
+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 UIntTypeTest implements Message {
+
+  // Properties.
+  protected final byte ThreeField;
+  protected final short ByteField;
+  protected final int WordField;
+  protected final int WordPlusByteField;
+  protected final long DoubleIntField;
+  protected final BigInteger QuadIntField;
+
+  public UIntTypeTest(
+      byte ThreeField,
+      short ByteField,
+      int WordField,
+      int WordPlusByteField,
+      long DoubleIntField,
+      BigInteger 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 short getByteField() {
+    return ByteField;
+  }
+
+  public int getWordField() {
+    return WordField;
+  }
+
+  public int getWordPlusByteField() {
+    return WordPlusByteField;
+  }
+
+  public long getDoubleIntField() {
+    return DoubleIntField;
+  }
+
+  public BigInteger getQuadIntField() {
+    return QuadIntField;
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("UIntTypeTest");
+
+    // Simple Field (ThreeField)
+    writeSimpleField("ThreeField", ThreeField, writeUnsignedByte(writeBuffer, 3));
+
+    // Simple Field (ByteField)
+    writeSimpleField("ByteField", ByteField, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (WordField)
+    writeSimpleField("WordField", WordField, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (WordPlusByteField)
+    writeSimpleField("WordPlusByteField", WordPlusByteField, writeUnsignedInt(writeBuffer, 24));
+
+    // Simple Field (DoubleIntField)
+    writeSimpleField("DoubleIntField", DoubleIntField, writeUnsignedLong(writeBuffer, 32));
+
+    // Simple Field (QuadIntField)
+    writeSimpleField("QuadIntField", QuadIntField, writeUnsignedBigInteger(writeBuffer, 64));
+
+    writeBuffer.popContext("UIntTypeTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    UIntTypeTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // 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 UIntTypeTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static UIntTypeTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("UIntTypeTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte ThreeField = readSimpleField("ThreeField", readUnsignedByte(readBuffer, 3));
+
+    short ByteField = readSimpleField("ByteField", readUnsignedShort(readBuffer, 8));
+
+    int WordField = readSimpleField("WordField", readUnsignedInt(readBuffer, 16));
+
+    int WordPlusByteField = readSimpleField("WordPlusByteField", readUnsignedInt(readBuffer, 24));
+
+    long DoubleIntField = readSimpleField("DoubleIntField", readUnsignedLong(readBuffer, 32));
+
+    BigInteger QuadIntField =
+        readSimpleField("QuadIntField", readUnsignedBigInteger(readBuffer, 64));
+
+    readBuffer.closeContext("UIntTypeTest");
+    // Create the instance
+    UIntTypeTest _uIntTypeTest;
+    _uIntTypeTest =
+        new UIntTypeTest(
+            ThreeField, ByteField, WordField, WordPlusByteField, DoubleIntField, QuadIntField);
+    return _uIntTypeTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof UIntTypeTest)) {
+      return false;
+    }
+    UIntTypeTest that = (UIntTypeTest) 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/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/VirtualFieldTest.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/VirtualFieldTest.java
new file mode 100644
index 0000000000..f122e032e4
--- /dev/null
+++ b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/VirtualFieldTest.java
@@ -0,0 +1,194 @@
+/*
+ * 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 VirtualFieldTest implements Message {
+
+  // Properties.
+  protected final short simpleField;
+
+  public VirtualFieldTest(short simpleField) {
+    super();
+    this.simpleField = simpleField;
+  }
+
+  public short getSimpleField() {
+    return simpleField;
+  }
+
+  public boolean getVirtualBitField() {
+    return (boolean) ((getSimpleField()) == (0));
+  }
+
+  public byte getVirtualIntField() {
+    return (byte) (getSimpleField());
+  }
+
+  public short getVirtualUintField() {
+    return (short) (getSimpleField());
+  }
+
+  public float getVirtualFloatField() {
+    return (float) (getSimpleField());
+  }
+
+  public double getVirtualDoubleField() {
+    return (double) (getSimpleField());
+  }
+
+  public String getVirtualStringField() {
+    return String.valueOf(getSimpleField());
+  }
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("VirtualFieldTest");
+
+    // Simple Field (simpleField)
+    writeSimpleField("simpleField", simpleField, writeUnsignedShort(writeBuffer, 8));
+
+    // Virtual field (doesn't actually serialize anything, just makes the value available)
+    boolean virtualBitField = getVirtualBitField();
+    writeBuffer.writeVirtual("virtualBitField", virtualBitField);
+
+    // Virtual field (doesn't actually serialize anything, just makes the value available)
+    byte virtualIntField = getVirtualIntField();
+    writeBuffer.writeVirtual("virtualIntField", virtualIntField);
+
+    // Virtual field (doesn't actually serialize anything, just makes the value available)
+    short virtualUintField = getVirtualUintField();
+    writeBuffer.writeVirtual("virtualUintField", virtualUintField);
+
+    // Virtual field (doesn't actually serialize anything, just makes the value available)
+    float virtualFloatField = getVirtualFloatField();
+    writeBuffer.writeVirtual("virtualFloatField", virtualFloatField);
+
+    // Virtual field (doesn't actually serialize anything, just makes the value available)
+    double virtualDoubleField = getVirtualDoubleField();
+    writeBuffer.writeVirtual("virtualDoubleField", virtualDoubleField);
+
+    // Virtual field (doesn't actually serialize anything, just makes the value available)
+    String virtualStringField = getVirtualStringField();
+    writeBuffer.writeVirtual("virtualStringField", virtualStringField);
+
+    writeBuffer.popContext("VirtualFieldTest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    VirtualFieldTest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (simpleField)
+    lengthInBits += 8;
+
+    // A virtual field doesn't have any in- or output.
+
+    // A virtual field doesn't have any in- or output.
+
+    // A virtual field doesn't have any in- or output.
+
+    // A virtual field doesn't have any in- or output.
+
+    // A virtual field doesn't have any in- or output.
+
+    // A virtual field doesn't have any in- or output.
+
+    return lengthInBits;
+  }
+
+  public static VirtualFieldTest staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static VirtualFieldTest staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("VirtualFieldTest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short simpleField = readSimpleField("simpleField", readUnsignedShort(readBuffer, 8));
+    boolean virtualBitField =
+        readVirtualField("virtualBitField", boolean.class, (simpleField) == (0));
+    byte virtualIntField = readVirtualField("virtualIntField", byte.class, simpleField);
+    short virtualUintField = readVirtualField("virtualUintField", short.class, simpleField);
+    float virtualFloatField = readVirtualField("virtualFloatField", float.class, simpleField);
+    double virtualDoubleField = readVirtualField("virtualDoubleField", double.class, simpleField);
+    String virtualStringField = readVirtualField("virtualStringField", String.class, simpleField);
+
+    readBuffer.closeContext("VirtualFieldTest");
+    // Create the instance
+    VirtualFieldTest _virtualFieldTest;
+    _virtualFieldTest = new VirtualFieldTest(simpleField);
+    return _virtualFieldTest;
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof VirtualFieldTest)) {
+      return false;
+    }
+    VirtualFieldTest that = (VirtualFieldTest) 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/plc4j/drivers/firmata/src/main/generated/org/apache/plc4x/java/firmata/readwrite/FirmataCommand.java b/plc4j/drivers/firmata/src/main/generated/org/apache/plc4x/java/firmata/readwrite/FirmataCommand.java
new file mode 100644
index 0000000000..ede9b50ca7
--- /dev/null
+++ b/plc4j/drivers/firmata/src/main/generated/org/apache/plc4x/java/firmata/readwrite/FirmataCommand.java
@@ -0,0 +1,172 @@
+/*
+ * 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.firmata.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 abstract class FirmataCommand implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Byte getCommandCode();
+
+  public FirmataCommand() {
+    super();
+  }
+
+  protected abstract void serializeFirmataCommandChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("FirmataCommand");
+
+    // Discriminator Field (commandCode) (Used as input to a switch field)
+    writeDiscriminatorField("commandCode", getCommandCode(), writeUnsignedByte(writeBuffer, 4));
+
+    // Switch field (Serialize the sub-type)
+    serializeFirmataCommandChild(writeBuffer);
+
+    writeBuffer.popContext("FirmataCommand");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    FirmataCommand _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (commandCode)
+    lengthInBits += 4;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static FirmataCommand 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);
+    }
+    Boolean response;
+    if (args[0] instanceof Boolean) {
+      response = (Boolean) args[0];
+    } else if (args[0] instanceof String) {
+      response = Boolean.valueOf((String) args[0]);
+    } else {
+      throw new PlcRuntimeException(
+          "Argument 0 expected to be of type Boolean or a string which is parseable but was "
+              + args[0].getClass().getName());
+    }
+    return staticParse(readBuffer, response);
+  }
+
+  public static FirmataCommand staticParse(ReadBuffer readBuffer, Boolean response)
+      throws ParseException {
+    readBuffer.pullContext("FirmataCommand");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte commandCode = readDiscriminatorField("commandCode", readUnsignedByte(readBuffer, 4));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    FirmataCommandBuilder builder = null;
+    if (EvaluationHelper.equals(commandCode, (byte) 0x0)) {
+      builder = FirmataCommandSysex.staticParseFirmataCommandBuilder(readBuffer, response);
+    } else if (EvaluationHelper.equals(commandCode, (byte) 0x4)) {
+      builder = FirmataCommandSetPinMode.staticParseFirmataCommandBuilder(readBuffer, response);
+    } else if (EvaluationHelper.equals(commandCode, (byte) 0x5)) {
+      builder =
+          FirmataCommandSetDigitalPinValue.staticParseFirmataCommandBuilder(readBuffer, response);
+    } else if (EvaluationHelper.equals(commandCode, (byte) 0x9)) {
+      builder =
+          FirmataCommandProtocolVersion.staticParseFirmataCommandBuilder(readBuffer, response);
+    } else if (EvaluationHelper.equals(commandCode, (byte) 0xF)) {
+      builder = FirmataCommandSystemReset.staticParseFirmataCommandBuilder(readBuffer, response);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "commandCode="
+              + commandCode
+              + "]");
+    }
+
+    readBuffer.closeContext("FirmataCommand");
+    // Create the instance
+    FirmataCommand _firmataCommand = builder.build();
+    return _firmataCommand;
+  }
+
+  public interface FirmataCommandBuilder {
+    FirmataCommand build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof FirmataCommand)) {
+      return false;
+    }
+    FirmataCommand that = (FirmataCommand) 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/plc4j/drivers/firmata/src/main/generated/org/apache/plc4x/java/firmata/readwrite/FirmataCommandProtocolVersion.java b/plc4j/drivers/firmata/src/main/generated/org/apache/plc4x/java/firmata/readwrite/FirmataCommandProtocolVersion.java
new file mode 100644
index 0000000000..3b1d766bef
--- /dev/null
+++ b/plc4j/drivers/firmata/src/main/generated/org/apache/plc4x/java/firmata/readwrite/FirmataCommandProtocolVersion.java
@@ -0,0 +1,161 @@
+/*
+ * 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.firmata.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 FirmataCommandProtocolVersion extends FirmataCommand implements Message {
+
+  // Accessors for discriminator values.
+  public Byte getCommandCode() {
+    return (byte) 0x9;
+  }
+
+  // Properties.
+  protected final short majorVersion;
+  protected final short minorVersion;
+
+  public FirmataCommandProtocolVersion(short majorVersion, short minorVersion) {
+    super();
+    this.majorVersion = majorVersion;
+    this.minorVersion = minorVersion;
+  }
+
+  public short getMajorVersion() {
+    return majorVersion;
+  }
+
+  public short getMinorVersion() {
+    return minorVersion;
+  }
+
+  @Override
+  protected void serializeFirmataCommandChild(WriteBuffer writeBuffer)
+      throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("FirmataCommandProtocolVersion");
+
+    // Simple Field (majorVersion)
+    writeSimpleField("majorVersion", majorVersion, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (minorVersion)
+    writeSimpleField("minorVersion", minorVersion, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("FirmataCommandProtocolVersion");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    FirmataCommandProtocolVersion _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (majorVersion)
+    lengthInBits += 8;
+
+    // Simple field (minorVersion)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static FirmataCommandBuilder staticParseFirmataCommandBuilder(
+      ReadBuffer readBuffer, Boolean response) throws ParseException {
+    readBuffer.pullContext("FirmataCommandProtocolVersion");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short majorVersion = readSimpleField("majorVersion", readUnsignedShort(readBuffer, 8));
+
+    short minorVersion = readSimpleField("minorVersion", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("FirmataCommandProtocolVersion");
+    // Create the instance
+    return new FirmataCommandProtocolVersionBuilderImpl(majorVersion, minorVersion);
+  }
+
+  public static class FirmataCommandProtocolVersionBuilderImpl
+      implements FirmataCommand.FirmataCommandBuilder {
+    private final short majorVersion;
+    private final short minorVersion;
+
+    public FirmataCommandProtocolVersionBuilderImpl(short majorVersion, short minorVersion) {
+      this.majorVersion = majorVersion;
+      this.minorVersion = minorVersion;
+    }
+
+    public FirmataCommandProtocolVersion build() {
+      FirmataCommandProtocolVersion firmataCommandProtocolVersion =
+          new FirmataCommandProtocolVersion(majorVersion, minorVersion);
+      return firmataCommandProtocolVersion;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof FirmataCommandProtocolVersion)) {
+      return false;
+    }
+    FirmataCommandProtocolVersion that = (FirmataCommandProtocolVersion) o;
+    return (getMajorVersion() == that.getMajorVersion())
+        && (getMinorVersion() == that.getMinorVersion())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
... 298700 lines suppressed ...