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:29 UTC

(plc4x) branch feature/new-ui-tool updated (3f1ec74518 -> 1753c5c91b)

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

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


    from 3f1ec74518 chore: Added a check to ensure the JDK compatability of dependencies. Enabled the kafka module as it seems to now work with Java 21.
     new 7875ac83ad chore: updated generated code
     new 494a8ec0cb chore: Cleaned up stuff that shouldn't have been committed.
     new 991c59ea94 feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
     new 0f6e88f821 feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
     new 59eb441e06 feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
     new 82b564692b feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
     new d2c42c909b chore: Moved the generated ctrlx code into the main sources as it's not really generated.
     new f736e145b7 chore: Downgrade to the last version which has binaries for aarch64 on linux.
     new aa88c288cb chore: Added the missing generated files.
     new 1753c5c91b chore: updated generated code

The 10 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


Summary of changes:
 Dockerfile                                         |      2 +-
 .../TypeSwitchInTypeSwitchParentType.java          |    175 -
 .../TypeSwitchInTypeSwitchParentTypeChild0.java    |    192 -
 ...eSwitchInTypeSwitchParentTypeChild0Infant0.java |    194 -
 ...SwitchParentTypeChild0Infant0InfantsChild0.java |    160 -
 ...SwitchParentTypeChild0Infant0InfantsChild1.java |    160 -
 ...eSwitchInTypeSwitchParentTypeChild0Infant1.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild0Infant2.java |    151 -
 .../TypeSwitchInTypeSwitchParentTypeChild1.java    |    192 -
 ...eSwitchInTypeSwitchParentTypeChild1Infant3.java |    150 -
 ...eSwitchInTypeSwitchParentTypeChild1Infant4.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild1Infant5.java |    151 -
 .../TypeSwitchInTypeSwitchParentTypeChild2.java    |    198 -
 ...eSwitchInTypeSwitchParentTypeChild2Infant6.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild2Infant7.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild2Infant8.java |    151 -
 docker-compose.yaml                                |      2 +-
 .../ctrlx/readwrite/rest/datalayer/ApiClient.java  |      4 +-
 .../readwrite/rest/datalayer/ApiException.java     |      0
 .../readwrite/rest/datalayer/Configuration.java    |      0
 .../rest/datalayer/JavaTimeFormatter.java          |      0
 .../java/ctrlx/readwrite/rest/datalayer/Pair.java  |      0
 .../rest/datalayer/RFC3339DateFormat.java          |      0
 .../rest/datalayer/ServerConfiguration.java        |      0
 .../readwrite/rest/datalayer/ServerVariable.java   |      0
 .../ctrlx/readwrite/rest/datalayer/StringUtil.java |      0
 .../rest/datalayer/api/BulkAccessApi.java          |      0
 .../api/DataLayerInformationAndSettingsApi.java    |      0
 .../readwrite/rest/datalayer/api/NodesApi.java     |      0
 .../readwrite/rest/datalayer/api/RemotesApi.java   |      0
 .../rest/datalayer/api/RetainMemoryApi.java        |      0
 .../api/SubscriptionInformationAndSettingsApi.java |      0
 .../rest/datalayer/api/SubscriptionsApi.java       |      0
 .../readwrite/rest/datalayer/api/TypesApi.java     |      0
 .../readwrite/rest/datalayer/auth/ApiKeyAuth.java  |      0
 .../rest/datalayer/auth/Authentication.java        |      0
 .../rest/datalayer/auth/HttpBasicAuth.java         |      0
 .../rest/datalayer/auth/HttpBearerAuth.java        |      0
 .../ctrlx/readwrite/rest/datalayer/auth/OAuth.java |      0
 .../readwrite/rest/datalayer/auth/OAuthFlow.java   |      0
 .../readwrite/rest/datalayer/model/ARString.java   |      0
 .../rest/datalayer/model/AllowedOperations.java    |      0
 .../readwrite/rest/datalayer/model/BrowseData.java |      0
 .../rest/datalayer/model/BulkRequestInner.java     |      0
 .../rest/datalayer/model/BulkResponseInner.java    |      0
 .../datalayer/model/ChangeSubscriptionRequest.java |      0
 .../datalayer/model/CommDatalayerChangeEvents.java |      0
 .../datalayer/model/CommDatalayerCounting.java     |      0
 .../model/CommDatalayerDataChangeFilter.java       |      0
 .../model/CommDatalayerDataChangeTrigger.java      |      0
 .../datalayer/model/CommDatalayerProperties.java   |      0
 .../datalayer/model/CommDatalayerProperty.java     |      0
 .../datalayer/model/CommDatalayerPropertyRule.java |      0
 .../model/CommDatalayerQueueBehaviour.java         |      0
 .../datalayer/model/CommDatalayerQueueing.java     |      0
 .../model/CommDatalayerRemoteConfigItem.java       |      0
 .../datalayer/model/CommDatalayerSampling.java     |      0
 .../model/CommDatalayerServerSettings.java         |      0
 .../model/CommDatalayerSubscriptionData.java       |      0
 .../model/CommDatalayerSubscriptionProperties.java |      0
 .../rest/datalayer/model/CreateRemoteRequest.java  |      0
 .../datalayer/model/CreateSubscriptionRequest.java |      0
 .../model/CreateSubscriptionRequestAllOf.java      |      0
 .../readwrite/rest/datalayer/model/DLARString.java |      0
 .../readwrite/rest/datalayer/model/DLString.java   |      0
 .../readwrite/rest/datalayer/model/DLUInt32.java   |      0
 .../ctrlx/readwrite/rest/datalayer/model/Data.java |      0
 .../readwrite/rest/datalayer/model/Extension.java  |      0
 .../readwrite/rest/datalayer/model/JsonString.java |      0
 .../readwrite/rest/datalayer/model/Memory.java     |      0
 .../readwrite/rest/datalayer/model/MemoryType.java |      0
 .../rest/datalayer/model/MemoryValue.java          |      0
 .../readwrite/rest/datalayer/model/MetaData.java   |      0
 .../readwrite/rest/datalayer/model/NodeClass.java  |      0
 .../readwrite/rest/datalayer/model/Problem.java    |      0
 .../rest/datalayer/model/ReadNode200Response.java  |      0
 .../readwrite/rest/datalayer/model/Reference.java  |      0
 .../readwrite/rest/datalayer/model/Reflection.java |      0
 .../rest/datalayer/model/ReflectionBaseType.java   |      0
 .../rest/datalayer/model/ReflectionEnum.java       |      0
 .../rest/datalayer/model/ReflectionEnumVal.java    |      0
 .../rest/datalayer/model/ReflectionField.java      |      0
 .../rest/datalayer/model/ReflectionKeyValue.java   |      0
 .../rest/datalayer/model/ReflectionObject.java     |      0
 .../rest/datalayer/model/ReflectionRPCCall.java    |      0
 .../rest/datalayer/model/ReflectionSchema.java     |      0
 .../rest/datalayer/model/ReflectionService.java    |      0
 .../rest/datalayer/model/ReflectionType.java       |      0
 .../rest/datalayer/model/RemoteConfig.java         |      0
 .../rest/datalayer/model/RetainStats.java          |      0
 .../readwrite/rest/datalayer/model/SSEEvent.java   |      0
 .../rest/datalayer/model/SSEEventData.java         |      0
 .../rest/datalayer/model/SSEEventData1.java        |      0
 .../rest/datalayer/model/ServerSettings.java       |      0
 .../readwrite/rest/datalayer/model/State.java      |      0
 .../rest/datalayer/model/SubscriptionData.java     |      0
 .../rest/datalayer/model/SubscriptionID.java       |      0
 .../rest/datalayer/model/SubscriptionNodeList.java |      0
 .../datalayer/model/SubscriptionProperties.java    |      0
 .../model/SubscriptionPropertiesData.java          |      0
 .../rest/datalayer/model/SubscriptionSettings.java |      0
 .../ctrlx/readwrite/rest/datalayer/model/Task.java |      0
 .../readwrite/rest/datalayer/model/UInt32.java     |      0
 .../plc4x/java/eip/readwrite/CipExchange.java      |    204 -
 .../apache/plc4x/java/opcua/readwrite/Date.java    |    110 -
 .../java/opcua/readwrite/DecimalDataType.java      |    164 -
 .../apache/plc4x/java/opcua/readwrite/Node.java    |    362 -
 .../OpcuaNodeIdServicesVariableAddress.java        |     69 -
 .../OpcuaNodeIdServicesVariableChoice.java         |     54 -
 .../OpcuaNodeIdServicesVariableDevice.java         |     66 -
 .../OpcuaNodeIdServicesVariableDiscrete.java       |    193 -
 .../OpcuaNodeIdServicesVariableInitial.java        |     54 -
 .../OpcuaNodeIdServicesVariableInstrument.java     |    193 -
 .../OpcuaNodeIdServicesVariableRefresh.java        |     92 -
 .../readwrite/OpcuaNodeIdServicesVariableTrip.java |    192 -
 .../plc4x/java/opcua/readwrite/ReferenceNode.java  |    195 -
 .../apache/plc4x/java/opcua/readwrite/Time.java    |    110 -
 .../GSDML-V2.2-Advantech-ADAM6100-20111216.xml     |    346 +
 .../GSDML-V2.3-SIEMENS-SIMOCODEproVPN-20201104.xml |    873 +
 .../GSDML-V2.33-wago-series750_753-20230115.xml    | 113157 ++++++++++++++++++
 ...GSDML-V2.43-SIEMENS-SIMOCODEproVPN-20220817.xml |   1217 +
 plc4j/tools/pom.xml                                |      6 +-
 .../src/generated/plc4j-tools-ui-frontend.ts       |      2 +-
 plc4j/tools/ui/pom.xml                             |     10 +-
 pom.xml                                            |      3 +-
 docker-compose.yaml => tools/docker-compose.yaml   |      7 +-
 tools/release-0-update-generated-code.sh           |     61 +
 .../config.yml => tools/release-1-create-branch.sh |     16 +-
 .../release-2-prepare-release.sh                   |     16 +-
 .../release-3-perform-release.sh                   |      9 +-
 130 files changed, 115688 insertions(+), 4579 deletions(-)
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentType.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant1.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant2.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant3.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant4.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild1Infant5.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant6.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant7.java
 delete mode 100644 code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild2Infant8.java
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java (99%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequest.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateSubscriptionRequestAllOf.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLARString.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLString.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/DLUInt32.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Data.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Extension.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/JsonString.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Memory.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryType.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MemoryValue.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/MetaData.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/NodeClass.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Problem.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReadNode200Response.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reference.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Reflection.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionBaseType.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnum.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionEnumVal.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionField.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionKeyValue.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionObject.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionRPCCall.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionSchema.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionService.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ReflectionType.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RemoteConfig.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/RetainStats.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEvent.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SSEEventData1.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ServerSettings.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/State.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionData.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionID.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionNodeList.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionProperties.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionPropertiesData.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/SubscriptionSettings.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/Task.java (100%)
 rename plc4j/drivers/ctrlx/src/main/{generated => java}/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/UInt32.java (100%)
 delete mode 100644 plc4j/drivers/eip/src/main/generated/org/apache/plc4x/java/eip/readwrite/CipExchange.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Date.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/DecimalDataType.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Node.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableAddress.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableChoice.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDevice.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableDiscrete.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInitial.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableInstrument.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableRefresh.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/OpcuaNodeIdServicesVariableTrip.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/ReferenceNode.java
 delete mode 100644 plc4j/drivers/opcua/src/main/generated/org/apache/plc4x/java/opcua/readwrite/Time.java
 create mode 100755 plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.2-Advantech-ADAM6100-20111216.xml
 create mode 100755 plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.3-SIEMENS-SIMOCODEproVPN-20201104.xml
 create mode 100755 plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.33-wago-series750_753-20230115.xml
 create mode 100755 plc4j/drivers/profinet-ng/src/test/resources/GSDML-V2.43-SIEMENS-SIMOCODEproVPN-20220817.xml
 copy docker-compose.yaml => tools/docker-compose.yaml (88%)
 create mode 100755 tools/release-0-update-generated-code.sh
 copy plc4j/tools/scraper/src/test/resources/config.yml => tools/release-1-create-branch.sh (86%)
 mode change 100644 => 100755
 copy plc4j/tools/scraper/src/test/resources/config.yml => tools/release-2-prepare-release.sh (86%)
 mode change 100644 => 100755
 copy plc4c/fetch-dependencies.sh => tools/release-3-perform-release.sh (80%)


(plc4x) 08/10: chore: Downgrade to the last version which has binaries for aarch64 on linux.

Posted by cd...@apache.org.
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 f736e145b70339a2b546eddf83025cc18af9585d
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 14:05:31 2024 +0100

    chore: Downgrade to the last version which has binaries for aarch64 on linux.
---
 pom.xml | 3 ++-
 1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/pom.xml b/pom.xml
index 21209b8ff3..2c50c69391 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1357,7 +1357,8 @@
         <plugin>
           <groupId>com.googlecode.cmake-maven-project</groupId>
           <artifactId>cmake-maven-plugin</artifactId>
-          <version>3.27.7-b1</version>
+          <!-- Not all versions have all types of binaries deployed -->
+          <version>3.26.3-b1</version>
         </plugin>
 
         <plugin>


(plc4x) 10/10: chore: updated generated code

Posted by cd...@apache.org.
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 1753c5c91b9405885ac6b461131937e4f792c2f3
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 14:26:09 2024 +0100

    chore: updated generated code
---
 .../plc4x/java/df1/readwrite/DF1Command.java       | 181 ++++++++++++++
 .../apache/plc4x/java/df1/readwrite/DF1Symbol.java | 182 ++++++++++++++
 .../java/df1/readwrite/DF1SymbolMessageFrame.java  | 269 +++++++++++++++++++++
 .../df1/readwrite/DF1SymbolMessageFrameACK.java    | 120 +++++++++
 .../df1/readwrite/DF1SymbolMessageFrameNAK.java    | 120 +++++++++
 .../df1/readwrite/DF1UnprotectedReadRequest.java   | 159 ++++++++++++
 .../df1/readwrite/DF1UnprotectedReadResponse.java  | 156 ++++++++++++
 tools/release-0-update-generated-code.sh           |   8 +-
 8 files changed, 1194 insertions(+), 1 deletion(-)

diff --git a/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1Command.java b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1Command.java
new file mode 100644
index 0000000000..21daab926f
--- /dev/null
+++ b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1Command.java
@@ -0,0 +1,181 @@
+/*
+ * 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.df1.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 DF1Command implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getCommandCode();
+
+  // Properties.
+  protected final short status;
+  protected final int transactionCounter;
+
+  public DF1Command(short status, int transactionCounter) {
+    super();
+    this.status = status;
+    this.transactionCounter = transactionCounter;
+  }
+
+  public short getStatus() {
+    return status;
+  }
+
+  public int getTransactionCounter() {
+    return transactionCounter;
+  }
+
+  protected abstract void serializeDF1CommandChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DF1Command");
+
+    // Discriminator Field (commandCode) (Used as input to a switch field)
+    writeDiscriminatorField("commandCode", getCommandCode(), writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (status)
+    writeSimpleField("status", status, writeUnsignedShort(writeBuffer, 8));
+
+    // Simple Field (transactionCounter)
+    writeSimpleField("transactionCounter", transactionCounter, writeUnsignedInt(writeBuffer, 16));
+
+    // Switch field (Serialize the sub-type)
+    serializeDF1CommandChild(writeBuffer);
+
+    writeBuffer.popContext("DF1Command");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    DF1Command _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Discriminator Field (commandCode)
+    lengthInBits += 8;
+
+    // Simple field (status)
+    lengthInBits += 8;
+
+    // Simple field (transactionCounter)
+    lengthInBits += 16;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static DF1Command staticParse(ReadBuffer readBuffer, Object... args)
+      throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static DF1Command staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("DF1Command");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short commandCode = readDiscriminatorField("commandCode", readUnsignedShort(readBuffer, 8));
+
+    short status = readSimpleField("status", readUnsignedShort(readBuffer, 8));
+
+    int transactionCounter = readSimpleField("transactionCounter", readUnsignedInt(readBuffer, 16));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    DF1CommandBuilder builder = null;
+    if (EvaluationHelper.equals(commandCode, (short) 0x01)) {
+      builder = DF1UnprotectedReadRequest.staticParseDF1CommandBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(commandCode, (short) 0x41)) {
+      builder = DF1UnprotectedReadResponse.staticParseDF1CommandBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "commandCode="
+              + commandCode
+              + "]");
+    }
+
+    readBuffer.closeContext("DF1Command");
+    // Create the instance
+    DF1Command _dF1Command = builder.build(status, transactionCounter);
+    return _dF1Command;
+  }
+
+  public interface DF1CommandBuilder {
+    DF1Command build(short status, int transactionCounter);
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DF1Command)) {
+      return false;
+    }
+    DF1Command that = (DF1Command) o;
+    return (getStatus() == that.getStatus())
+        && (getTransactionCounter() == that.getTransactionCounter())
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(getStatus(), getTransactionCounter());
+  }
+
+  @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/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1Symbol.java b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1Symbol.java
new file mode 100644
index 0000000000..bb34a289ed
--- /dev/null
+++ b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1Symbol.java
@@ -0,0 +1,182 @@
+/*
+ * 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.df1.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 DF1Symbol implements Message {
+
+  // Abstract accessors for discriminator values.
+  public abstract Short getSymbolType();
+
+  // Constant values.
+  public static final Short MESSAGESTART = 0x10;
+
+  public DF1Symbol() {
+    super();
+  }
+
+  public short getMessageStart() {
+    return MESSAGESTART;
+  }
+
+  protected abstract void serializeDF1SymbolChild(WriteBuffer writeBuffer)
+      throws SerializationException;
+
+  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DF1Symbol");
+
+    // Const Field (messageStart)
+    writeConstField(
+        "messageStart",
+        MESSAGESTART,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Discriminator Field (symbolType) (Used as input to a switch field)
+    writeDiscriminatorField(
+        "symbolType",
+        getSymbolType(),
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Switch field (Serialize the sub-type)
+    serializeDF1SymbolChild(writeBuffer);
+
+    writeBuffer.popContext("DF1Symbol");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = 0;
+    DF1Symbol _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Const Field (messageStart)
+    lengthInBits += 8;
+
+    // Discriminator Field (symbolType)
+    lengthInBits += 8;
+
+    // Length of sub-type elements will be added by sub-type...
+
+    return lengthInBits;
+  }
+
+  public static DF1Symbol staticParse(ReadBuffer readBuffer, Object... args) throws ParseException {
+    PositionAware positionAware = readBuffer;
+    return staticParse(readBuffer);
+  }
+
+  public static DF1Symbol staticParse(ReadBuffer readBuffer) throws ParseException {
+    readBuffer.pullContext("DF1Symbol");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short messageStart =
+        readConstField(
+            "messageStart",
+            readUnsignedShort(readBuffer, 8),
+            DF1Symbol.MESSAGESTART,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short symbolType =
+        readDiscriminatorField(
+            "symbolType",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
+    DF1SymbolBuilder builder = null;
+    if (EvaluationHelper.equals(symbolType, (short) 0x02)) {
+      builder = DF1SymbolMessageFrame.staticParseDF1SymbolBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(symbolType, (short) 0x06)) {
+      builder = DF1SymbolMessageFrameACK.staticParseDF1SymbolBuilder(readBuffer);
+    } else if (EvaluationHelper.equals(symbolType, (short) 0x15)) {
+      builder = DF1SymbolMessageFrameNAK.staticParseDF1SymbolBuilder(readBuffer);
+    }
+    if (builder == null) {
+      throw new ParseException(
+          "Unsupported case for discriminated type"
+              + " parameters ["
+              + "symbolType="
+              + symbolType
+              + "]");
+    }
+
+    readBuffer.closeContext("DF1Symbol");
+    // Create the instance
+    DF1Symbol _dF1Symbol = builder.build();
+    return _dF1Symbol;
+  }
+
+  public interface DF1SymbolBuilder {
+    DF1Symbol build();
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DF1Symbol)) {
+      return false;
+    }
+    DF1Symbol that = (DF1Symbol) 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/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrame.java b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrame.java
new file mode 100644
index 0000000000..e5684d0c77
--- /dev/null
+++ b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrame.java
@@ -0,0 +1,269 @@
+/*
+ * 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.df1.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 DF1SymbolMessageFrame extends DF1Symbol implements Message {
+
+  // Accessors for discriminator values.
+  public Short getSymbolType() {
+    return (short) 0x02;
+  }
+
+  // Constant values.
+  public static final Short MESSAGEEND = 0x10;
+  public static final Short ENDTRANSACTION = 0x03;
+
+  // Properties.
+  protected final short destinationAddress;
+  protected final short sourceAddress;
+  protected final DF1Command command;
+
+  public DF1SymbolMessageFrame(short destinationAddress, short sourceAddress, DF1Command command) {
+    super();
+    this.destinationAddress = destinationAddress;
+    this.sourceAddress = sourceAddress;
+    this.command = command;
+  }
+
+  public short getDestinationAddress() {
+    return destinationAddress;
+  }
+
+  public short getSourceAddress() {
+    return sourceAddress;
+  }
+
+  public DF1Command getCommand() {
+    return command;
+  }
+
+  public short getMessageEnd() {
+    return MESSAGEEND;
+  }
+
+  public short getEndTransaction() {
+    return ENDTRANSACTION;
+  }
+
+  @Override
+  protected void serializeDF1SymbolChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DF1SymbolMessageFrame");
+
+    // Simple Field (destinationAddress)
+    writeSimpleField(
+        "destinationAddress",
+        destinationAddress,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Simple Field (sourceAddress)
+    writeSimpleField(
+        "sourceAddress",
+        sourceAddress,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Simple Field (command)
+    writeSimpleField(
+        "command",
+        command,
+        new DataWriterComplexDefault<>(writeBuffer),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Const Field (messageEnd)
+    writeConstField(
+        "messageEnd",
+        MESSAGEEND,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Const Field (endTransaction)
+    writeConstField(
+        "endTransaction",
+        ENDTRANSACTION,
+        writeUnsignedShort(writeBuffer, 8),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    // Checksum Field (checksum) (Calculated)
+    writeChecksumField(
+        "crc",
+        (int)
+            (org.apache.plc4x.java.df1.readwrite.utils.StaticHelper.crcCheck(
+                destinationAddress, sourceAddress, command)),
+        writeUnsignedInt(writeBuffer, 16),
+        WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    writeBuffer.popContext("DF1SymbolMessageFrame");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    DF1SymbolMessageFrame _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (destinationAddress)
+    lengthInBits += 8;
+
+    // Simple field (sourceAddress)
+    lengthInBits += 8;
+
+    // Simple field (command)
+    lengthInBits += command.getLengthInBits();
+
+    // Const Field (messageEnd)
+    lengthInBits += 8;
+
+    // Const Field (endTransaction)
+    lengthInBits += 8;
+
+    // Checksum Field (checksum)
+    lengthInBits += 16;
+
+    return lengthInBits;
+  }
+
+  public static DF1SymbolBuilder staticParseDF1SymbolBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("DF1SymbolMessageFrame");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    short destinationAddress =
+        readSimpleField(
+            "destinationAddress",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short sourceAddress =
+        readSimpleField(
+            "sourceAddress",
+            readUnsignedShort(readBuffer, 8),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    DF1Command command =
+        readSimpleField(
+            "command",
+            new DataReaderComplexDefault<>(() -> DF1Command.staticParse(readBuffer), readBuffer),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short messageEnd =
+        readConstField(
+            "messageEnd",
+            readUnsignedShort(readBuffer, 8),
+            DF1SymbolMessageFrame.MESSAGEEND,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    short endTransaction =
+        readConstField(
+            "endTransaction",
+            readUnsignedShort(readBuffer, 8),
+            DF1SymbolMessageFrame.ENDTRANSACTION,
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    int crc =
+        readChecksumField(
+            "crc",
+            readUnsignedInt(readBuffer, 16),
+            (int)
+                (org.apache.plc4x.java.df1.readwrite.utils.StaticHelper.crcCheck(
+                    destinationAddress, sourceAddress, command)),
+            WithOption.WithByteOrder(ByteOrder.BIG_ENDIAN));
+
+    readBuffer.closeContext("DF1SymbolMessageFrame");
+    // Create the instance
+    return new DF1SymbolMessageFrameBuilderImpl(destinationAddress, sourceAddress, command);
+  }
+
+  public static class DF1SymbolMessageFrameBuilderImpl implements DF1Symbol.DF1SymbolBuilder {
+    private final short destinationAddress;
+    private final short sourceAddress;
+    private final DF1Command command;
+
+    public DF1SymbolMessageFrameBuilderImpl(
+        short destinationAddress, short sourceAddress, DF1Command command) {
+      this.destinationAddress = destinationAddress;
+      this.sourceAddress = sourceAddress;
+      this.command = command;
+    }
+
+    public DF1SymbolMessageFrame build() {
+      DF1SymbolMessageFrame dF1SymbolMessageFrame =
+          new DF1SymbolMessageFrame(destinationAddress, sourceAddress, command);
+      return dF1SymbolMessageFrame;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DF1SymbolMessageFrame)) {
+      return false;
+    }
+    DF1SymbolMessageFrame that = (DF1SymbolMessageFrame) o;
+    return (getDestinationAddress() == that.getDestinationAddress())
+        && (getSourceAddress() == that.getSourceAddress())
+        && (getCommand() == that.getCommand())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(
+        super.hashCode(), getDestinationAddress(), getSourceAddress(), getCommand());
+  }
+
+  @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/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrameACK.java b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrameACK.java
new file mode 100644
index 0000000000..e62a8fa0f3
--- /dev/null
+++ b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrameACK.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.df1.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 DF1SymbolMessageFrameACK extends DF1Symbol implements Message {
+
+  // Accessors for discriminator values.
+  public Short getSymbolType() {
+    return (short) 0x06;
+  }
+
+  public DF1SymbolMessageFrameACK() {
+    super();
+  }
+
+  @Override
+  protected void serializeDF1SymbolChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DF1SymbolMessageFrameACK");
+
+    writeBuffer.popContext("DF1SymbolMessageFrameACK");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    DF1SymbolMessageFrameACK _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    return lengthInBits;
+  }
+
+  public static DF1SymbolBuilder staticParseDF1SymbolBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("DF1SymbolMessageFrameACK");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    readBuffer.closeContext("DF1SymbolMessageFrameACK");
+    // Create the instance
+    return new DF1SymbolMessageFrameACKBuilderImpl();
+  }
+
+  public static class DF1SymbolMessageFrameACKBuilderImpl implements DF1Symbol.DF1SymbolBuilder {
+
+    public DF1SymbolMessageFrameACKBuilderImpl() {}
+
+    public DF1SymbolMessageFrameACK build() {
+      DF1SymbolMessageFrameACK dF1SymbolMessageFrameACK = new DF1SymbolMessageFrameACK();
+      return dF1SymbolMessageFrameACK;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DF1SymbolMessageFrameACK)) {
+      return false;
+    }
+    DF1SymbolMessageFrameACK that = (DF1SymbolMessageFrameACK) 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/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrameNAK.java b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrameNAK.java
new file mode 100644
index 0000000000..ca65ed4098
--- /dev/null
+++ b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1SymbolMessageFrameNAK.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.df1.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 DF1SymbolMessageFrameNAK extends DF1Symbol implements Message {
+
+  // Accessors for discriminator values.
+  public Short getSymbolType() {
+    return (short) 0x15;
+  }
+
+  public DF1SymbolMessageFrameNAK() {
+    super();
+  }
+
+  @Override
+  protected void serializeDF1SymbolChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DF1SymbolMessageFrameNAK");
+
+    writeBuffer.popContext("DF1SymbolMessageFrameNAK");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    DF1SymbolMessageFrameNAK _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    return lengthInBits;
+  }
+
+  public static DF1SymbolBuilder staticParseDF1SymbolBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("DF1SymbolMessageFrameNAK");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    readBuffer.closeContext("DF1SymbolMessageFrameNAK");
+    // Create the instance
+    return new DF1SymbolMessageFrameNAKBuilderImpl();
+  }
+
+  public static class DF1SymbolMessageFrameNAKBuilderImpl implements DF1Symbol.DF1SymbolBuilder {
+
+    public DF1SymbolMessageFrameNAKBuilderImpl() {}
+
+    public DF1SymbolMessageFrameNAK build() {
+      DF1SymbolMessageFrameNAK dF1SymbolMessageFrameNAK = new DF1SymbolMessageFrameNAK();
+      return dF1SymbolMessageFrameNAK;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DF1SymbolMessageFrameNAK)) {
+      return false;
+    }
+    DF1SymbolMessageFrameNAK that = (DF1SymbolMessageFrameNAK) 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/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1UnprotectedReadRequest.java b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1UnprotectedReadRequest.java
new file mode 100644
index 0000000000..85eff7338e
--- /dev/null
+++ b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1UnprotectedReadRequest.java
@@ -0,0 +1,159 @@
+/*
+ * 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.df1.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 DF1UnprotectedReadRequest extends DF1Command implements Message {
+
+  // Accessors for discriminator values.
+  public Short getCommandCode() {
+    return (short) 0x01;
+  }
+
+  // Properties.
+  protected final int address;
+  protected final short size;
+
+  public DF1UnprotectedReadRequest(short status, int transactionCounter, int address, short size) {
+    super(status, transactionCounter);
+    this.address = address;
+    this.size = size;
+  }
+
+  public int getAddress() {
+    return address;
+  }
+
+  public short getSize() {
+    return size;
+  }
+
+  @Override
+  protected void serializeDF1CommandChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DF1UnprotectedReadRequest");
+
+    // Simple Field (address)
+    writeSimpleField("address", address, writeUnsignedInt(writeBuffer, 16));
+
+    // Simple Field (size)
+    writeSimpleField("size", size, writeUnsignedShort(writeBuffer, 8));
+
+    writeBuffer.popContext("DF1UnprotectedReadRequest");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    DF1UnprotectedReadRequest _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Simple field (address)
+    lengthInBits += 16;
+
+    // Simple field (size)
+    lengthInBits += 8;
+
+    return lengthInBits;
+  }
+
+  public static DF1CommandBuilder staticParseDF1CommandBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("DF1UnprotectedReadRequest");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    int address = readSimpleField("address", readUnsignedInt(readBuffer, 16));
+
+    short size = readSimpleField("size", readUnsignedShort(readBuffer, 8));
+
+    readBuffer.closeContext("DF1UnprotectedReadRequest");
+    // Create the instance
+    return new DF1UnprotectedReadRequestBuilderImpl(address, size);
+  }
+
+  public static class DF1UnprotectedReadRequestBuilderImpl implements DF1Command.DF1CommandBuilder {
+    private final int address;
+    private final short size;
+
+    public DF1UnprotectedReadRequestBuilderImpl(int address, short size) {
+      this.address = address;
+      this.size = size;
+    }
+
+    public DF1UnprotectedReadRequest build(short status, int transactionCounter) {
+      DF1UnprotectedReadRequest dF1UnprotectedReadRequest =
+          new DF1UnprotectedReadRequest(status, transactionCounter, address, size);
+      return dF1UnprotectedReadRequest;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DF1UnprotectedReadRequest)) {
+      return false;
+    }
+    DF1UnprotectedReadRequest that = (DF1UnprotectedReadRequest) o;
+    return (getAddress() == that.getAddress())
+        && (getSize() == that.getSize())
+        && super.equals(that)
+        && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getAddress(), getSize());
+  }
+
+  @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/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1UnprotectedReadResponse.java b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1UnprotectedReadResponse.java
new file mode 100644
index 0000000000..a480a7e629
--- /dev/null
+++ b/sandbox/test-java-df1-driver/src/main/generated/org/apache/plc4x/java/df1/readwrite/DF1UnprotectedReadResponse.java
@@ -0,0 +1,156 @@
+/*
+ * 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.df1.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 DF1UnprotectedReadResponse extends DF1Command implements Message {
+
+  // Accessors for discriminator values.
+  public Short getCommandCode() {
+    return (short) 0x41;
+  }
+
+  // Properties.
+  protected final byte[] data;
+
+  public DF1UnprotectedReadResponse(short status, int transactionCounter, byte[] data) {
+    super(status, transactionCounter);
+    this.data = data;
+  }
+
+  public byte[] getData() {
+    return data;
+  }
+
+  @Override
+  protected void serializeDF1CommandChild(WriteBuffer writeBuffer) throws SerializationException {
+    PositionAware positionAware = writeBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+    writeBuffer.pushContext("DF1UnprotectedReadResponse");
+
+    // Manual Array Field (data)
+    writeManualArrayField(
+        "data",
+        data,
+        (Byte _value) ->
+            org.apache.plc4x.java.df1.readwrite.utils.StaticHelper.writeData(writeBuffer, _value),
+        writeBuffer);
+
+    writeBuffer.popContext("DF1UnprotectedReadResponse");
+  }
+
+  @Override
+  public int getLengthInBytes() {
+    return (int) Math.ceil((float) getLengthInBits() / 8.0);
+  }
+
+  @Override
+  public int getLengthInBits() {
+    int lengthInBits = super.getLengthInBits();
+    DF1UnprotectedReadResponse _value = this;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    // Manual Array Field (data)
+    lengthInBits += org.apache.plc4x.java.df1.readwrite.utils.StaticHelper.dataLength(data) * 8;
+
+    return lengthInBits;
+  }
+
+  public static DF1CommandBuilder staticParseDF1CommandBuilder(ReadBuffer readBuffer)
+      throws ParseException {
+    readBuffer.pullContext("DF1UnprotectedReadResponse");
+    PositionAware positionAware = readBuffer;
+    boolean _lastItem = ThreadLocalHelper.lastItemThreadLocal.get();
+
+    byte[] data =
+        readManualByteArrayField(
+            "data",
+            readBuffer,
+            (byte[] _values) ->
+                (boolean)
+                    (org.apache.plc4x.java.df1.readwrite.utils.StaticHelper.dataTerminate(
+                        readBuffer)),
+            () ->
+                (byte)
+                    (org.apache.plc4x.java.df1.readwrite.utils.StaticHelper.readData(readBuffer)));
+
+    readBuffer.closeContext("DF1UnprotectedReadResponse");
+    // Create the instance
+    return new DF1UnprotectedReadResponseBuilderImpl(data);
+  }
+
+  public static class DF1UnprotectedReadResponseBuilderImpl
+      implements DF1Command.DF1CommandBuilder {
+    private final byte[] data;
+
+    public DF1UnprotectedReadResponseBuilderImpl(byte[] data) {
+      this.data = data;
+    }
+
+    public DF1UnprotectedReadResponse build(short status, int transactionCounter) {
+      DF1UnprotectedReadResponse dF1UnprotectedReadResponse =
+          new DF1UnprotectedReadResponse(status, transactionCounter, data);
+      return dF1UnprotectedReadResponse;
+    }
+  }
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (!(o instanceof DF1UnprotectedReadResponse)) {
+      return false;
+    }
+    DF1UnprotectedReadResponse that = (DF1UnprotectedReadResponse) o;
+    return (getData() == that.getData()) && super.equals(that) && true;
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(super.hashCode(), getData());
+  }
+
+  @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/tools/release-0-update-generated-code.sh b/tools/release-0-update-generated-code.sh
index e39481a964..3f9b85e8dc 100755
--- a/tools/release-0-update-generated-code.sh
+++ b/tools/release-0-update-generated-code.sh
@@ -46,8 +46,14 @@ if [ $? -ne 0 ]; then
     exit 1
 fi
 
+# Check if there is unchanged files (or committing and pushing nothing will fail)
+if [[ `git status --porcelain` ]]; then
+  # Changes
+  echo "No changes."
+  exit 0
+fi
+
 # 4. Add all new files to Git (localhost)
-# TODO: Possibly only add items in a generated directory ...
 git add --all
 
 # 5. Commit and push all changes to Git (localhost)


(plc4x) 01/10: chore: updated generated code

Posted by cd...@apache.org.
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 7875ac83adabb41ecb95876b997b0eb43710c85c
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 13:13:13 2024 +0100

    chore: updated generated code
---
 Dockerfile                                         |      2 +-
 .../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 -
 .../TypeSwitchInTypeSwitchParentType.java          |    175 -
 .../TypeSwitchInTypeSwitchParentTypeChild0.java    |    192 -
 ...eSwitchInTypeSwitchParentTypeChild0Infant0.java |    194 -
 ...SwitchParentTypeChild0Infant0InfantsChild0.java |    160 -
 ...SwitchParentTypeChild0Infant0InfantsChild1.java |    160 -
 ...eSwitchInTypeSwitchParentTypeChild0Infant1.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild0Infant2.java |    151 -
 .../TypeSwitchInTypeSwitchParentTypeChild1.java    |    192 -
 ...eSwitchInTypeSwitchParentTypeChild1Infant3.java |    150 -
 ...eSwitchInTypeSwitchParentTypeChild1Infant4.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild1Infant5.java |    151 -
 .../TypeSwitchInTypeSwitchParentTypeChild2.java    |    198 -
 ...eSwitchInTypeSwitchParentTypeChild2Infant6.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild2Infant7.java |    151 -
 ...eSwitchInTypeSwitchParentTypeChild2Infant8.java |    151 -
 .../plc4x/java/test/readwrite/UIntTypeTest.java    |    219 -
 .../java/test/readwrite/VirtualFieldTest.java      |    194 -
 docker-compose.yaml                                |      2 +-
 plc4go/script/GoTest.java                          |    141 +
 .../ctrlx/readwrite/rest/datalayer/ApiClient.java  |   1028 -
 .../readwrite/rest/datalayer/ApiException.java     |    119 -
 .../readwrite/rest/datalayer/Configuration.java    |     58 -
 .../rest/datalayer/JavaTimeFormatter.java          |     83 -
 .../java/ctrlx/readwrite/rest/datalayer/Pair.java  |     76 -
 .../rest/datalayer/RFC3339DateFormat.java          |     76 -
 .../rest/datalayer/ServerConfiguration.java        |     77 -
 .../readwrite/rest/datalayer/ServerVariable.java   |     42 -
 .../ctrlx/readwrite/rest/datalayer/StringUtil.java |    102 -
 .../rest/datalayer/api/BulkAccessApi.java          |    119 -
 .../api/DataLayerInformationAndSettingsApi.java    |    326 -
 .../readwrite/rest/datalayer/api/NodesApi.java     |    298 -
 .../readwrite/rest/datalayer/api/RemotesApi.java   |    497 -
 .../rest/datalayer/api/RetainMemoryApi.java        |    651 -
 .../api/SubscriptionInformationAndSettingsApi.java |    369 -
 .../rest/datalayer/api/SubscriptionsApi.java       |    351 -
 .../readwrite/rest/datalayer/api/TypesApi.java     |    122 -
 .../readwrite/rest/datalayer/auth/ApiKeyAuth.java  |     96 -
 .../rest/datalayer/auth/Authentication.java        |     49 -
 .../rest/datalayer/auth/HttpBasicAuth.java         |     71 -
 .../rest/datalayer/auth/HttpBearerAuth.java        |     79 -
 .../ctrlx/readwrite/rest/datalayer/auth/OAuth.java |     58 -
 .../readwrite/rest/datalayer/auth/OAuthFlow.java   |     44 -
 .../readwrite/rest/datalayer/model/ARString.java   |    220 -
 .../rest/datalayer/model/AllowedOperations.java    |    335 -
 .../readwrite/rest/datalayer/model/BrowseData.java |    223 -
 .../rest/datalayer/model/BulkRequestInner.java     |    343 -
 .../rest/datalayer/model/BulkResponseInner.java    |    429 -
 .../datalayer/model/ChangeSubscriptionRequest.java |    222 -
 .../datalayer/model/CommDatalayerChangeEvents.java |    253 -
 .../datalayer/model/CommDatalayerCounting.java     |    169 -
 .../model/CommDatalayerDataChangeFilter.java       |    170 -
 .../model/CommDatalayerDataChangeTrigger.java      |     89 -
 .../datalayer/model/CommDatalayerProperties.java   |     93 -
 .../datalayer/model/CommDatalayerProperty.java     |    206 -
 .../datalayer/model/CommDatalayerPropertyRule.java |    468 -
 .../model/CommDatalayerQueueBehaviour.java         |     87 -
 .../datalayer/model/CommDatalayerQueueing.java     |    213 -
 .../model/CommDatalayerRemoteConfigItem.java       |    211 -
 .../datalayer/model/CommDatalayerSampling.java     |    171 -
 .../model/CommDatalayerServerSettings.java         |    214 -
 .../model/CommDatalayerSubscriptionData.java       |    220 -
 .../model/CommDatalayerSubscriptionProperties.java |    353 -
 .../rest/datalayer/model/CreateRemoteRequest.java  |    206 -
 .../datalayer/model/CreateSubscriptionRequest.java |    217 -
 .../model/CreateSubscriptionRequestAllOf.java      |    220 -
 .../readwrite/rest/datalayer/model/DLARString.java |    220 -
 .../readwrite/rest/datalayer/model/DLString.java   |    209 -
 .../readwrite/rest/datalayer/model/DLUInt32.java   |    211 -
 .../ctrlx/readwrite/rest/datalayer/model/Data.java |    251 -
 .../readwrite/rest/datalayer/model/Extension.java  |    209 -
 .../readwrite/rest/datalayer/model/JsonString.java |    209 -
 .../readwrite/rest/datalayer/model/Memory.java     |    204 -
 .../readwrite/rest/datalayer/model/MemoryType.java |     93 -
 .../rest/datalayer/model/MemoryValue.java          |    253 -
 .../readwrite/rest/datalayer/model/MetaData.java   |    518 -
 .../readwrite/rest/datalayer/model/NodeClass.java  |     89 -
 .../readwrite/rest/datalayer/model/Problem.java    |    702 -
 .../rest/datalayer/model/ReadNode200Response.java  |    264 -
 .../readwrite/rest/datalayer/model/Reference.java  |    209 -
 .../readwrite/rest/datalayer/model/Reflection.java |    392 -
 .../rest/datalayer/model/ReflectionBaseType.java   |    117 -
 .../rest/datalayer/model/ReflectionEnum.java       |    401 -
 .../rest/datalayer/model/ReflectionEnumVal.java    |    343 -
 .../rest/datalayer/model/ReflectionField.java      |    613 -
 .../rest/datalayer/model/ReflectionKeyValue.java   |    211 -
 .../rest/datalayer/model/ReflectionObject.java     |    452 -
 .../rest/datalayer/model/ReflectionRPCCall.java    |    349 -
 .../rest/datalayer/model/ReflectionSchema.java     |    394 -
 .../rest/datalayer/model/ReflectionService.java    |    325 -
 .../rest/datalayer/model/ReflectionType.java       |    255 -
 .../rest/datalayer/model/RemoteConfig.java         |    204 -
 .../rest/datalayer/model/RetainStats.java          |    433 -
 .../readwrite/rest/datalayer/model/SSEEvent.java   |    287 -
 .../rest/datalayer/model/SSEEventData.java         |    338 -
 .../rest/datalayer/model/SSEEventData1.java        |    872 -
 .../rest/datalayer/model/ServerSettings.java       |    204 -
 .../readwrite/rest/datalayer/model/State.java      |     93 -
 .../rest/datalayer/model/SubscriptionData.java     |    204 -
 .../rest/datalayer/model/SubscriptionID.java       |    167 -
 .../rest/datalayer/model/SubscriptionNodeList.java |    178 -
 .../datalayer/model/SubscriptionProperties.java    |    204 -
 .../model/SubscriptionPropertiesData.java          |    351 -
 .../rest/datalayer/model/SubscriptionSettings.java |    303 -
 .../ctrlx/readwrite/rest/datalayer/model/Task.java |    378 -
 .../readwrite/rest/datalayer/model/UInt32.java     |    211 -
 .../plc4x/java/eip/readwrite/CipExchange.java      |    204 -
 .../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 -
 .../apache/plc4x/java/opcua/readwrite/Date.java    |    110 -
 .../plc4x/java/opcua/readwrite/DateString.java     |    111 -
 .../plc4x/java/opcua/readwrite/DeadbandType.java   |     56 -
 .../java/opcua/readwrite/DecimalDataType.java      |    164 -
 .../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 -
 .../apache/plc4x/java/opcua/readwrite/Node.java    |    362 -
 .../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 -
 .../OpcuaNodeIdServicesVariableAddress.java        |     69 -
 .../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 -
 .../OpcuaNodeIdServicesVariableChoice.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 -
 .../OpcuaNodeIdServicesVariableDevice.java         |     66 -
 .../OpcuaNodeIdServicesVariableDiagnostics.java    |     55 -
 .../OpcuaNodeIdServicesVariableDialog.java         |     81 -
 .../OpcuaNodeIdServicesVariableDisconnect.java     |     56 -
 .../OpcuaNodeIdServicesVariableDiscrepancy.java    |     57 -
 .../OpcuaNodeIdServicesVariableDiscrete.java       |    193 -
 .../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 -
 .../OpcuaNodeIdServicesVariableInitial.java        |     54 -
 .../OpcuaNodeIdServicesVariableInput.java          |     54 -
 .../OpcuaNodeIdServicesVariableInstrument.java     |    193 -
 .../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 -
 .../OpcuaNodeIdServicesVariableRefresh.java        |     92 -
 .../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 -
 .../readwrite/OpcuaNodeIdServicesVariableTrip.java |    192 -
 .../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 -
 .../plc4x/java/opcua/readwrite/ReferenceNode.java  |    195 -
 .../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 -
 .../apache/plc4x/java/opcua/readwrite/Time.java    |    110 -
 .../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 -
 .../GSDML-V2.2-Advantech-ADAM6100-20111216.xml     |    346 +
 .../GSDML-V2.3-SIEMENS-SIMOCODEproVPN-20201104.xml |    873 +
 .../GSDML-V2.33-wago-series750_753-20230115.xml    | 113157 ++++++++++++++++++
 ...GSDML-V2.43-SIEMENS-SIMOCODEproVPN-20220817.xml |   1217 +
 .../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 -
 plc4j/tools/pom.xml                                |      6 +-
 .../storage/settings/README_DO_NOT_TOUCH_FILES.txt |      9 +
 plc4j/tools/ui/backend/storage/settings/db.lck     |    Bin 0 -> 38 bytes
 plc4j/tools/ui/backend/storage/settings/dbex.lck   |    Bin 0 -> 4 bytes
 .../settings/log/README_DO_NOT_TOUCH_FILES.txt     |      8 +
 .../tools/ui/backend/storage/settings/log/log.ctrl |    Bin 0 -> 48 bytes
 .../tools/ui/backend/storage/settings/log/log1.dat |    Bin 0 -> 1048576 bytes
 .../ui/backend/storage/settings/log/logmirror.ctrl |    Bin 0 -> 48 bytes
 .../settings/seg0/README_DO_NOT_TOUCH_FILES.txt    |      8 +
 .../tools/ui/backend/storage/settings/seg0/c10.dat |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c101.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c111.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c121.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c130.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c141.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c150.dat      |    Bin 0 -> 12288 bytes
 .../ui/backend/storage/settings/seg0/c161.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c171.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c180.dat      |    Bin 0 -> 40960 bytes
 .../ui/backend/storage/settings/seg0/c191.dat      |    Bin 0 -> 16384 bytes
 .../ui/backend/storage/settings/seg0/c1a1.dat      |    Bin 0 -> 16384 bytes
 .../ui/backend/storage/settings/seg0/c1b1.dat      |    Bin 0 -> 20480 bytes
 .../ui/backend/storage/settings/seg0/c1c0.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c1d1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c1e0.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c1f1.dat      |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/c20.dat |    Bin 0 -> 32768 bytes
 .../ui/backend/storage/settings/seg0/c200.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c211.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c221.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c230.dat      |    Bin 0 -> 233472 bytes
 .../ui/backend/storage/settings/seg0/c241.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c251.dat      |    Bin 0 -> 16384 bytes
 .../ui/backend/storage/settings/seg0/c260.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c271.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c281.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c290.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c2a1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c2b1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c2c1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c2d0.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c2e1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c2f0.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c300.dat      |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/c31.dat |    Bin 0 -> 16384 bytes
 .../ui/backend/storage/settings/seg0/c311.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c321.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c331.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c340.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c351.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c361.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c371.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c380.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c391.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c3a1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c3b1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c3c0.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c3d1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c3e1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c3f1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c400.dat      |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/c41.dat |    Bin 0 -> 16384 bytes
 .../ui/backend/storage/settings/seg0/c411.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c421.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c430.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c441.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c451.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c461.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c470.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c481.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c490.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c4a1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c4b0.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c4c1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c4d0.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c4e1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c4f1.dat      |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/seg0/c501.dat      |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/c51.dat |    Bin 0 -> 16384 bytes
 .../tools/ui/backend/storage/settings/seg0/c60.dat |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/c71.dat |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/c81.dat |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/c90.dat |    Bin 0 -> 28672 bytes
 .../tools/ui/backend/storage/settings/seg0/ca1.dat |    Bin 0 -> 28672 bytes
 .../tools/ui/backend/storage/settings/seg0/cb1.dat |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/cc0.dat |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/cd1.dat |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/ce1.dat |    Bin 0 -> 8192 bytes
 .../tools/ui/backend/storage/settings/seg0/cf0.dat |    Bin 0 -> 8192 bytes
 .../ui/backend/storage/settings/service.properties |     23 +
 .../src/generated/plc4j-tools-ui-frontend.ts       |      2 +-
 plc4j/tools/ui/pom.xml                             |     10 +-
 .../plc4x/java/df1/readwrite/DF1Command.java       |    181 -
 .../apache/plc4x/java/df1/readwrite/DF1Symbol.java |    182 -
 .../java/df1/readwrite/DF1SymbolMessageFrame.java  |    269 -
 .../df1/readwrite/DF1SymbolMessageFrameACK.java    |    120 -
 .../df1/readwrite/DF1SymbolMessageFrameNAK.java    |    120 -
 .../df1/readwrite/DF1UnprotectedReadRequest.java   |    159 -
 .../df1/readwrite/DF1UnprotectedReadResponse.java  |    156 -
 docker-compose.yaml => tools/docker-compose.yaml   |      7 +-
 tools/release-0-update-generated-code.sh           |     43 +
 .../release-1-create-branch.sh                     |     22 +-
 .../release-2-prepare-release.sh                   |     22 +-
 .../release-3-perform-release.sh                   |     24 +-
 1587 files changed, 115864 insertions(+), 326989 deletions(-)

diff --git a/Dockerfile b/Dockerfile
index 467c7f1103..1ecd1c7271 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -20,7 +20,7 @@
 # This is the image we'll use to execute the build (and give it the name 'build').
 # (This image is based on Ubuntu)
 # Fixed version of this in order to have a fixed JDK version
-FROM azul/zulu-openjdk:11 as build
+FROM azul/zulu-openjdk:17 as build
 
 # Install some stuff we need to run the build
 RUN apt update -y
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
deleted file mode 100644
index d7ede560f5..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTest.java
+++ /dev/null
@@ -1,166 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 38a79a9884..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/AbstractTypeTestSubType.java
+++ /dev/null
@@ -1,260 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index a530a73ff1..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ArrayTypeTest.java
+++ /dev/null
@@ -1,248 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 5226c1af8f..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/CheckSumTypeTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 99f01237dd..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageA.java
+++ /dev/null
@@ -1,131 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 6408dcf20d..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageB.java
+++ /dev/null
@@ -1,158 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index b0568be162..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageC.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index a1238d79b5..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ComplexOfComplexUsageD.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 6dbd68b6b2..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ConstTypeTest.java
+++ /dev/null
@@ -1,196 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 4872ae7fd4..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/DataIOType.java
+++ /dev/null
@@ -1,110 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 2ad3c735bf..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedType.java
+++ /dev/null
@@ -1,155 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index c8dcb2aea0..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeA.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index e286ebce4c..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeB.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index b923ccac2b..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeC.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 8ea49794d1..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultiple.java
+++ /dev/null
@@ -1,190 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index df93defe84..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleA.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index b4408df718..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleB.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 921e380583..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeMultipleC.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index b0201b8e48..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameter.java
+++ /dev/null
@@ -1,160 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 4d06ceee2b..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterA.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 9efd680971..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterB.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index d5512a4c15..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterC.java
+++ /dev/null
@@ -1,144 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 50ed8ab94b..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultiple.java
+++ /dev/null
@@ -1,183 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 0ac5d6da74..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleA.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 77b9a546ec..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleB.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index b364796e2b..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumDiscriminatedTypeParameterMultipleC.java
+++ /dev/null
@@ -1,149 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 609be2b273..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumType.java
+++ /dev/null
@@ -1,57 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index beea4d448f..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeBit.java
+++ /dev/null
@@ -1,55 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index d8314c4079..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeInt.java
+++ /dev/null
@@ -1,56 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 81ec27443a..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeParameters.java
+++ /dev/null
@@ -1,188 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 71f2bbadf2..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/EnumTypeTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 000ee98f77..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTest.java
+++ /dev/null
@@ -1,322 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index e5fa537bfc..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/FieldTypeTestWithUnknownField.java
+++ /dev/null
@@ -1,222 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index c4e7700473..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitPascalStringTypeTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index b721b7330c..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ImplicitTypeTest.java
+++ /dev/null
@@ -1,187 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 5ccd564878..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/IntTypeTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index f3a80c09ee..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/LengthLoopTest.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 3973c301b5..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/OptionalTypeTest.java
+++ /dev/null
@@ -1,146 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 2eea0789a8..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PaddingTypeTest.java
+++ /dev/null
@@ -1,139 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 831b25a620..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/PascalStringTypeTest.java
+++ /dev/null
@@ -1,143 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 8bb4fb2f27..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTest.java
+++ /dev/null
@@ -1,120 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 85bb3a3790..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestChild.java
+++ /dev/null
@@ -1,128 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 1f450bcb5c..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/ReservedTypeTestParent.java
+++ /dev/null
@@ -1,163 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index eb62286604..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleBitTypeTest.java
+++ /dev/null
@@ -1,127 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 3be4febaf8..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedType.java
+++ /dev/null
@@ -1,147 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 125015b7f9..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeA.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index becfdfa80f..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeB.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index bb1a63f8f6..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleDiscriminatedTypeC.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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
deleted file mode 100644
index 2ee0c86c25..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/SimpleTypeTest.java
+++ /dev/null
@@ -1,234 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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/TypeSwitchInTypeSwitchParentType.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentType.java
deleted file mode 100644
index 7357127265..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentType.java
+++ /dev/null
@@ -1,175 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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 TypeSwitchInTypeSwitchParentType implements Message {
-
-  // Abstract accessors for discriminator values.
-  public abstract Short getTypeNumber();
-
-  // Properties.
-  protected final short parentFieldHurz;
-
-  public TypeSwitchInTypeSwitchParentType(short parentFieldHurz) {
-    super();
-    this.parentFieldHurz = parentFieldHurz;
-  }
-
-  public short getParentFieldHurz() {
-    return parentFieldHurz;
-  }
-
-  protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild(WriteBuffer writeBuffer)
-      throws SerializationException;
-
-  public void serialize(WriteBuffer writeBuffer) throws SerializationException {
-    PositionAware positionAware = writeBuffer;
-    int startPos = positionAware.getPos();
-    writeBuffer.pushContext("TypeSwitchInTypeSwitchParentType");
-
-    // Discriminator Field (typeNumber) (Used as input to a switch field)
-    writeDiscriminatorField("typeNumber", getTypeNumber(), writeUnsignedShort(writeBuffer, 8));
-
-    // Simple Field (parentFieldHurz)
-    writeSimpleField("parentFieldHurz", parentFieldHurz, writeUnsignedShort(writeBuffer, 8));
-
-    // Switch field (Serialize the sub-type)
-    serializeTypeSwitchInTypeSwitchParentTypeChild(writeBuffer);
-
-    writeBuffer.popContext("TypeSwitchInTypeSwitchParentType");
-  }
-
-  @Override
-  public int getLengthInBytes() {
-    return (int) Math.ceil((float) getLengthInBits() / 8.0);
-  }
-
-  @Override
-  public int getLengthInBits() {
-    int lengthInBits = 0;
-    TypeSwitchInTypeSwitchParentType _value = this;
-
-    // Discriminator Field (typeNumber)
-    lengthInBits += 8;
-
-    // Simple field (parentFieldHurz)
-    lengthInBits += 8;
-
-    // Length of sub-type elements will be added by sub-type...
-
-    return lengthInBits;
-  }
-
-  public static TypeSwitchInTypeSwitchParentType staticParse(ReadBuffer readBuffer, Object... args)
-      throws ParseException {
-    PositionAware positionAware = readBuffer;
-    return staticParse(readBuffer);
-  }
-
-  public static TypeSwitchInTypeSwitchParentType staticParse(ReadBuffer readBuffer)
-      throws ParseException {
-    readBuffer.pullContext("TypeSwitchInTypeSwitchParentType");
-    PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    short typeNumber = readDiscriminatorField("typeNumber", readUnsignedShort(readBuffer, 8));
-
-    short parentFieldHurz = readSimpleField("parentFieldHurz", readUnsignedShort(readBuffer, 8));
-
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    TypeSwitchInTypeSwitchParentTypeBuilder builder = null;
-    if (EvaluationHelper.equals(typeNumber, (short) 0x00)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild0.staticParseTypeSwitchInTypeSwitchParentTypeBuilder(
-              readBuffer);
-    } else if (EvaluationHelper.equals(typeNumber, (short) 0x10)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild1.staticParseTypeSwitchInTypeSwitchParentTypeBuilder(
-              readBuffer);
-    } else if (EvaluationHelper.equals(typeNumber, (short) 0x20)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild2.staticParseTypeSwitchInTypeSwitchParentTypeBuilder(
-              readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "typeNumber="
-              + typeNumber
-              + "]");
-    }
-
-    readBuffer.closeContext("TypeSwitchInTypeSwitchParentType");
-    // Create the instance
-    TypeSwitchInTypeSwitchParentType _typeSwitchInTypeSwitchParentType =
-        builder.build(parentFieldHurz);
-    return _typeSwitchInTypeSwitchParentType;
-  }
-
-  public interface TypeSwitchInTypeSwitchParentTypeBuilder {
-    TypeSwitchInTypeSwitchParentType build(short parentFieldHurz);
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (!(o instanceof TypeSwitchInTypeSwitchParentType)) {
-      return false;
-    }
-    TypeSwitchInTypeSwitchParentType that = (TypeSwitchInTypeSwitchParentType) o;
-    return (getParentFieldHurz() == that.getParentFieldHurz()) && true;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(getParentFieldHurz());
-  }
-
-  @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/TypeSwitchInTypeSwitchParentTypeChild0.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0.java
deleted file mode 100644
index 01ba553c16..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0.java
+++ /dev/null
@@ -1,192 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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 TypeSwitchInTypeSwitchParentTypeChild0
-    extends TypeSwitchInTypeSwitchParentType implements Message {
-
-  // Accessors for discriminator values.
-  public Short getTypeNumber() {
-    return (short) 0x00;
-  }
-  // Abstract accessors for discriminator values.
-  public abstract Short getChildNumber();
-
-  // Properties.
-  protected final short childFieldwolf;
-
-  public TypeSwitchInTypeSwitchParentTypeChild0(short parentFieldHurz, short childFieldwolf) {
-    super(parentFieldHurz);
-    this.childFieldwolf = childFieldwolf;
-  }
-
-  public short getChildFieldwolf() {
-    return childFieldwolf;
-  }
-
-  protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild0Child(
-      WriteBuffer writeBuffer) throws SerializationException;
-
-  @Override
-  protected void serializeTypeSwitchInTypeSwitchParentTypeChild(WriteBuffer writeBuffer)
-      throws SerializationException {
-    PositionAware positionAware = writeBuffer;
-    int startPos = positionAware.getPos();
-    writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0");
-
-    // Discriminator Field (childNumber) (Used as input to a switch field)
-    writeDiscriminatorField("childNumber", getChildNumber(), writeUnsignedShort(writeBuffer, 8));
-
-    // Simple Field (childFieldwolf)
-    writeSimpleField("childFieldwolf", childFieldwolf, writeUnsignedShort(writeBuffer, 8));
-
-    // Switch field (Serialize the sub-type)
-    serializeTypeSwitchInTypeSwitchParentTypeChild0Child(writeBuffer);
-
-    writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0");
-  }
-
-  @Override
-  public int getLengthInBytes() {
-    return (int) Math.ceil((float) getLengthInBits() / 8.0);
-  }
-
-  @Override
-  public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    TypeSwitchInTypeSwitchParentTypeChild0 _value = this;
-
-    // Discriminator Field (childNumber)
-    lengthInBits += 8;
-
-    // Simple field (childFieldwolf)
-    lengthInBits += 8;
-
-    // Length of sub-type elements will be added by sub-type...
-
-    return lengthInBits;
-  }
-
-  public static TypeSwitchInTypeSwitchParentTypeBuilder
-      staticParseTypeSwitchInTypeSwitchParentTypeBuilder(ReadBuffer readBuffer)
-          throws ParseException {
-    readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0");
-    PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    short childNumber = readDiscriminatorField("childNumber", readUnsignedShort(readBuffer, 8));
-
-    short childFieldwolf = readSimpleField("childFieldwolf", readUnsignedShort(readBuffer, 8));
-
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    TypeSwitchInTypeSwitchParentTypeChild0Builder builder = null;
-    if (EvaluationHelper.equals(childNumber, (short) 0x01)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild0Infant0
-              .staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(readBuffer);
-    } else if (EvaluationHelper.equals(childNumber, (short) 0x02)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild0Infant1
-              .staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(readBuffer);
-    } else if (EvaluationHelper.equals(childNumber, (short) 0x03)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild0Infant2
-              .staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
-              + "childNumber="
-              + childNumber
-              + "]");
-    }
-
-    readBuffer.closeContext("TypeSwitchInTypeSwitchParentTypeChild0");
-    // Create the instance
-    return new TypeSwitchInTypeSwitchParentTypeChild0BuilderImpl(childFieldwolf, builder);
-  }
-
-  public interface TypeSwitchInTypeSwitchParentTypeChild0Builder {
-    TypeSwitchInTypeSwitchParentTypeChild0 build(short parentFieldHurz, short childFieldwolf);
-  }
-
-  public static class TypeSwitchInTypeSwitchParentTypeChild0BuilderImpl
-      implements TypeSwitchInTypeSwitchParentType.TypeSwitchInTypeSwitchParentTypeBuilder {
-    private final short childFieldwolf;
-    private final TypeSwitchInTypeSwitchParentTypeChild0Builder builder;
-
-    public TypeSwitchInTypeSwitchParentTypeChild0BuilderImpl(
-        short childFieldwolf, TypeSwitchInTypeSwitchParentTypeChild0Builder builder) {
-
-      this.childFieldwolf = childFieldwolf;
-      this.builder = builder;
-    }
-
-    public TypeSwitchInTypeSwitchParentTypeChild0 build(short parentFieldHurz) {
-      return builder.build(parentFieldHurz, childFieldwolf);
-    }
-  }
-
-  @Override
-  public boolean equals(Object o) {
-    if (this == o) {
-      return true;
-    }
-    if (!(o instanceof TypeSwitchInTypeSwitchParentTypeChild0)) {
-      return false;
-    }
-    TypeSwitchInTypeSwitchParentTypeChild0 that = (TypeSwitchInTypeSwitchParentTypeChild0) o;
-    return (getChildFieldwolf() == that.getChildFieldwolf()) && super.equals(that) && true;
-  }
-
-  @Override
-  public int hashCode() {
-    return Objects.hash(super.hashCode(), getChildFieldwolf());
-  }
-
-  @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/TypeSwitchInTypeSwitchParentTypeChild0Infant0.java b/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0.java
deleted file mode 100644
index 0f86a2ba7b..0000000000
--- a/code-generation/tests/protocol-test-java/src/main/generated/org/apache/plc4x/java/test/readwrite/TypeSwitchInTypeSwitchParentTypeChild0Infant0.java
+++ /dev/null
@@ -1,194 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   https://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-package 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 TypeSwitchInTypeSwitchParentTypeChild0Infant0
-    extends TypeSwitchInTypeSwitchParentTypeChild0 implements Message {
-
-  // Accessors for discriminator values.
-  public Short getChildNumber() {
-    return (short) 0x01;
-  }
-  // Abstract accessors for discriminator values.
-  public abstract Short getInfantNumber();
-
-  // Properties.
-  protected final short infantSomeField00;
-
-  public TypeSwitchInTypeSwitchParentTypeChild0Infant0(
-      short parentFieldHurz, short childFieldwolf, short infantSomeField00) {
-    super(parentFieldHurz, childFieldwolf);
-    this.infantSomeField00 = infantSomeField00;
-  }
-
-  public short getInfantSomeField00() {
-    return infantSomeField00;
-  }
-
-  protected abstract void serializeTypeSwitchInTypeSwitchParentTypeChild0Infant0Child(
-      WriteBuffer writeBuffer) throws SerializationException;
-
-  @Override
-  protected void serializeTypeSwitchInTypeSwitchParentTypeChild0Child(WriteBuffer writeBuffer)
-      throws SerializationException {
-    PositionAware positionAware = writeBuffer;
-    int startPos = positionAware.getPos();
-    writeBuffer.pushContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0");
-
-    // Discriminator Field (infantNumber) (Used as input to a switch field)
-    writeDiscriminatorField("infantNumber", getInfantNumber(), writeUnsignedShort(writeBuffer, 8));
-
-    // Simple Field (infantSomeField00)
-    writeSimpleField("infantSomeField00", infantSomeField00, writeUnsignedShort(writeBuffer, 8));
-
-    // Switch field (Serialize the sub-type)
-    serializeTypeSwitchInTypeSwitchParentTypeChild0Infant0Child(writeBuffer);
-
-    writeBuffer.popContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0");
-  }
-
-  @Override
-  public int getLengthInBytes() {
-    return (int) Math.ceil((float) getLengthInBits() / 8.0);
-  }
-
-  @Override
-  public int getLengthInBits() {
-    int lengthInBits = super.getLengthInBits();
-    TypeSwitchInTypeSwitchParentTypeChild0Infant0 _value = this;
-
-    // Discriminator Field (infantNumber)
-    lengthInBits += 8;
-
-    // Simple field (infantSomeField00)
-    lengthInBits += 8;
-
-    // Length of sub-type elements will be added by sub-type...
-
-    return lengthInBits;
-  }
-
-  public static TypeSwitchInTypeSwitchParentTypeChild0Builder
-      staticParseTypeSwitchInTypeSwitchParentTypeChild0Builder(ReadBuffer readBuffer)
-          throws ParseException {
-    readBuffer.pullContext("TypeSwitchInTypeSwitchParentTypeChild0Infant0");
-    PositionAware positionAware = readBuffer;
-    int startPos = positionAware.getPos();
-    int curPos;
-
-    short infantNumber = readDiscriminatorField("infantNumber", readUnsignedShort(readBuffer, 8));
-
-    short infantSomeField00 =
-        readSimpleField("infantSomeField00", readUnsignedShort(readBuffer, 8));
-
-    // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
-    TypeSwitchInTypeSwitchParentTypeChild0Infant0Builder builder = null;
-    if (EvaluationHelper.equals(infantNumber, (short) 0x98)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild0
-              .staticParseTypeSwitchInTypeSwitchParentTypeChild0Infant0Builder(readBuffer);
-    } else if (EvaluationHelper.equals(infantNumber, (short) 0x99)) {
-      builder =
-          TypeSwitchInTypeSwitchParentTypeChild0Infant0InfantsChild1
-              .staticParseTypeSwitchInTypeSwitchParentTypeChild0Infant0Builder(readBuffer);
-    }
-    if (builder == null) {
-      throw new ParseException(
-          "Unsupported case for discriminated type"
-              + " parameters ["
... 443932 lines suppressed ...


(plc4x) 04/10: feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.

Posted by cd...@apache.org.
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 0f6e88f82121fd8610a85b40947a35de9bdc5ba3
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 13:32:16 2024 +0100

    feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
---
 tools/release-0-update-generated-code.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/release-0-update-generated-code.sh b/tools/release-0-update-generated-code.sh
index 7eb86eb15b..abaf150067 100755
--- a/tools/release-0-update-generated-code.sh
+++ b/tools/release-0-update-generated-code.sh
@@ -44,7 +44,7 @@ docker compose run --rm --abort-on-container-exit releaser bash /ws/mvnw -e -P w
 if [ $? -ne 0 ]; then
     echo "Got non-0 exit code from docker compose, aborting."
     exit 1
-done
+fi
 
 # 4. Add all new files to Git (localhost)
 # TODO: Possibly only add items in a generated directory ...


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

Posted by cd...@apache.org.
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 ...


(plc4x) 02/10: chore: Cleaned up stuff that shouldn't have been committed.

Posted by cd...@apache.org.
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 494a8ec0cb55893c9377e045aaf6c4b34ac4a2a1
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 13:20:57 2024 +0100

    chore: Cleaned up stuff that shouldn't have been committed.
---
 plc4go/script/GoTest.java                          | 141 ---------------------
 .../storage/settings/README_DO_NOT_TOUCH_FILES.txt |   9 --
 plc4j/tools/ui/backend/storage/settings/db.lck     | Bin 38 -> 0 bytes
 plc4j/tools/ui/backend/storage/settings/dbex.lck   | Bin 4 -> 0 bytes
 .../settings/log/README_DO_NOT_TOUCH_FILES.txt     |   8 --
 .../tools/ui/backend/storage/settings/log/log.ctrl | Bin 48 -> 0 bytes
 .../tools/ui/backend/storage/settings/log/log1.dat | Bin 1048576 -> 0 bytes
 .../ui/backend/storage/settings/log/logmirror.ctrl | Bin 48 -> 0 bytes
 .../settings/seg0/README_DO_NOT_TOUCH_FILES.txt    |   8 --
 .../tools/ui/backend/storage/settings/seg0/c10.dat | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c101.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c111.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c121.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c130.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c141.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c150.dat      | Bin 12288 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c161.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c171.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c180.dat      | Bin 40960 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c191.dat      | Bin 16384 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c1a1.dat      | Bin 16384 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c1b1.dat      | Bin 20480 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c1c0.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c1d1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c1e0.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c1f1.dat      | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c20.dat | Bin 32768 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c200.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c211.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c221.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c230.dat      | Bin 233472 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c241.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c251.dat      | Bin 16384 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c260.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c271.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c281.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c290.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c2a1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c2b1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c2c1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c2d0.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c2e1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c2f0.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c300.dat      | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c31.dat | Bin 16384 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c311.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c321.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c331.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c340.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c351.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c361.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c371.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c380.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c391.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c3a1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c3b1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c3c0.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c3d1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c3e1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c3f1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c400.dat      | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c41.dat | Bin 16384 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c411.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c421.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c430.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c441.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c451.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c461.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c470.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c481.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c490.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c4a1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c4b0.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c4c1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c4d0.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c4e1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c4f1.dat      | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/seg0/c501.dat      | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c51.dat | Bin 16384 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c60.dat | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c71.dat | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c81.dat | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/c90.dat | Bin 28672 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/ca1.dat | Bin 28672 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/cb1.dat | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/cc0.dat | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/cd1.dat | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/ce1.dat | Bin 8192 -> 0 bytes
 .../tools/ui/backend/storage/settings/seg0/cf0.dat | Bin 8192 -> 0 bytes
 .../ui/backend/storage/settings/service.properties |  23 ----
 90 files changed, 189 deletions(-)

diff --git a/plc4go/script/GoTest.java b/plc4go/script/GoTest.java
deleted file mode 100644
index dcb5adb483..0000000000
--- a/plc4go/script/GoTest.java
+++ /dev/null
@@ -1,141 +0,0 @@
-/*
- * Licensed to the Apache Software Foundation (ASF) under one
- * or more contributor license agreements.  See the NOTICE file
- * distributed with this work for additional information
- * regarding copyright ownership.  The ASF licenses this file
- * to you under the Apache License, Version 2.0 (the
- * "License"); you may not use this file except in compliance
- * with the License.  You may obtain a copy of the License at
- *
- *   http://www.apache.org/licenses/LICENSE-2.0
- *
- * Unless required by applicable law or agreed to in writing,
- * software distributed under the License is distributed on an
- * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
- * KIND, either express or implied.  See the License for the
- * specific language governing permissions and limitations
- * under the License.
- */
-
-package org.apache.plc4x.go;
-
-import org.junit.jupiter.api.DynamicContainer;
-import org.junit.jupiter.api.TestFactory;
-
-import java.io.BufferedReader;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStreamReader;
-import java.nio.file.Path;
-import java.util.Map;
-import java.util.stream.Stream;
-
-import static java.util.Locale.ROOT;
-import static java.util.Objects.requireNonNull;
-import static java.util.stream.Collectors.groupingBy;
-import static java.util.stream.Collectors.toList;
-import static org.junit.jupiter.api.Assertions.fail;
-import static org.junit.jupiter.api.DynamicContainer.dynamicContainer;
-import static org.junit.jupiter.api.DynamicTest.dynamicTest;
-
-class GoTest {
-    @TestFactory
-    Stream<DynamicContainer> goTests() throws IOException, InterruptedException {
-        final var goVersion = System.getProperty("go.version", "1.20.7"); // propagated from pom ${go.version}/surefire
-        final var osName = System.getProperty("os.name", "").toLowerCase(ROOT);
-        final var os = osName.contains("linux") ?
-            "linux" :
-            // todo: check these two
-            (osName.contains("win") ? "win" : "darwin");
-        final var arch = System.getProperty("os.arch");
-        final var goBase = Path.of(System.getProperty("user.home"))
-            .resolve(".mvnGoLang")
-            .resolve("go" + goVersion + "." + os + "-" + arch);
-        final var go = goBase.resolve("bin/go");
-        final var base = requireNonNull(go.getParent().getParent());
-        final var target = Path.of("target").toAbsolutePath();
-        final var env = Map.of(
-            "GOROOT", base.toString(),
-            "GOPATH",
-            base.getParent().toAbsolutePath().resolve(".go_path") + File.pathSeparator +
-                Path.of(".").toAbsolutePath(),
-            "GOBIN", target.toString(),
-            "GOCACHE", target.resolve("goBuildCache").toString(),
-            "PATH", go.getParent().toAbsolutePath() + File.pathSeparator + System.getenv("PATH"));
-
-        return readTestsFromOutput(env, go)
-            .collect(groupingBy(it -> {
-                final int sep = it.indexOf('_');
-                if (sep > 0) {
-                    return it.substring(0, sep);
-                }
-                return it;
-            }))
-            .entrySet().stream()
-            .map(group -> dynamicContainer(group.getKey(), group.getValue().stream()
-                .map(test -> dynamicTest(test.substring(test.indexOf('_') + 1), () -> runGoTest(env, go, test)))));
-    }
-
-    private void runGoTest(final Map<String, String> env, final Path go, final String test) throws IOException, InterruptedException {
-        final var result = go(env, go, "test", "-v", "-run", test, "./...");
-        if (result.exitValue() != 0) {
-            fail("status=" + result.exitValue() + "\n" + readOutput(result));
-        } else { // if (logOutput)
-            try {
-                try (final var stdout = result.getInputStream()) {
-                    System.out.println(new String(stdout.readAllBytes()));
-                }
-            } catch (final RuntimeException | IOException re) {
-                // ignore
-            }
-            try {
-                try (final var stderr = result.getErrorStream()) {
-                    System.err.println(new String(stderr.readAllBytes()));
-                }
-            } catch (final RuntimeException | IOException re) {
-                // ignore
-            }
-        }
-    }
-
-    private Stream<String> readTestsFromOutput(final Map<String, String> env, final Path go) throws IOException, InterruptedException {
-        final var list = go(env, go, "test", "-list", ".", "./...");
-        if (list.exitValue() != 0) {
-            fail("Can't list go tests: status=" + list.exitValue() + "\n" + readOutput(list));
-        }
-        try (final var reader = new BufferedReader(new InputStreamReader(list.getInputStream()))) {
-            final var allTests = reader.lines()
-                .filter(it -> !it.isBlank() && !it.contains(" ") && !it.contains("."))
-                .collect(toList()); // meterialize before closing the reader
-            return allTests.stream();
-        }
-    }
-
-    private String readOutput(final Process list) {
-        final var out = new StringBuilder();
-        try {
-            try (final var stdout = list.getInputStream()) {
-                out.append(new String(stdout.readAllBytes()));
-            }
-            out.append("\n");
-        } catch (final RuntimeException | IOException re) {
-            // ignore
-        }
-        try {
-            try (final var stderr = list.getErrorStream()) {
-                out.append(new String(stderr.readAllBytes()));
-            }
-        } catch (final RuntimeException | IOException re) {
-            // ignore
-        }
-        return out.toString();
-    }
-
-    private Process go(final Map<String, String> env, final Path go, final String... args) throws IOException, InterruptedException {
-        final var processBuilder = new ProcessBuilder(Stream.concat(Stream.of(go.toString()), Stream.of(args)).toArray(String[]::new));
-        processBuilder.environment().putAll(env);
-        final var process = processBuilder.start();
-        process.waitFor();
-        return process;
-    }
-}
\ No newline at end of file
diff --git a/plc4j/tools/ui/backend/storage/settings/README_DO_NOT_TOUCH_FILES.txt b/plc4j/tools/ui/backend/storage/settings/README_DO_NOT_TOUCH_FILES.txt
deleted file mode 100644
index a4bc145298..0000000000
--- a/plc4j/tools/ui/backend/storage/settings/README_DO_NOT_TOUCH_FILES.txt
+++ /dev/null
@@ -1,9 +0,0 @@
-
-# *************************************************************************
-# ***              DO NOT TOUCH FILES IN THIS DIRECTORY!                ***
-# *** FILES IN THIS DIRECTORY AND SUBDIRECTORIES CONSTITUTE A DERBY     ***
-# *** DATABASE, WHICH INCLUDES THE DATA (USER AND SYSTEM) AND THE       ***
-# *** FILES NECESSARY FOR DATABASE RECOVERY.                            ***
-# *** EDITING, ADDING, OR DELETING ANY OF THESE FILES MAY CAUSE DATA    ***
-# *** CORRUPTION AND LEAVE THE DATABASE IN A NON-RECOVERABLE STATE.     ***
-# *************************************************************************
\ No newline at end of file
diff --git a/plc4j/tools/ui/backend/storage/settings/db.lck b/plc4j/tools/ui/backend/storage/settings/db.lck
deleted file mode 100644
index cabbecca4b..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/db.lck and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/dbex.lck b/plc4j/tools/ui/backend/storage/settings/dbex.lck
deleted file mode 100644
index 720d64f4ba..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/dbex.lck and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/log/README_DO_NOT_TOUCH_FILES.txt b/plc4j/tools/ui/backend/storage/settings/log/README_DO_NOT_TOUCH_FILES.txt
deleted file mode 100644
index 56df292f65..0000000000
--- a/plc4j/tools/ui/backend/storage/settings/log/README_DO_NOT_TOUCH_FILES.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# *************************************************************************
-# ***              DO NOT TOUCH FILES IN THIS DIRECTORY!                ***
-# *** FILES IN THIS DIRECTORY ARE USED BY THE DERBY DATABASE RECOVERY   ***
-# *** SYSTEM. EDITING, ADDING, OR DELETING FILES IN THIS DIRECTORY      ***
-# *** WILL CAUSE THE DERBY RECOVERY SYSTEM TO FAIL, LEADING TO          ***
-# *** NON-RECOVERABLE CORRUPT DATABASES.                                ***
-# *************************************************************************
\ No newline at end of file
diff --git a/plc4j/tools/ui/backend/storage/settings/log/log.ctrl b/plc4j/tools/ui/backend/storage/settings/log/log.ctrl
deleted file mode 100644
index 6c881ad257..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/log/log.ctrl and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/log/log1.dat b/plc4j/tools/ui/backend/storage/settings/log/log1.dat
deleted file mode 100644
index 2bca2e344a..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/log/log1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/log/logmirror.ctrl b/plc4j/tools/ui/backend/storage/settings/log/logmirror.ctrl
deleted file mode 100644
index 6c881ad257..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/log/logmirror.ctrl and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/README_DO_NOT_TOUCH_FILES.txt b/plc4j/tools/ui/backend/storage/settings/seg0/README_DO_NOT_TOUCH_FILES.txt
deleted file mode 100644
index 2bdad06127..0000000000
--- a/plc4j/tools/ui/backend/storage/settings/seg0/README_DO_NOT_TOUCH_FILES.txt
+++ /dev/null
@@ -1,8 +0,0 @@
-
-# *************************************************************************
-# ***              DO NOT TOUCH FILES IN THIS DIRECTORY!                ***
-# *** FILES IN THIS DIRECTORY ARE USED BY THE DERBY DATABASE TO STORE   *** 
-# *** USER AND SYSTEM DATA. EDITING, ADDING, OR DELETING FILES IN THIS  ***
-# *** DIRECTORY WILL CORRUPT THE ASSOCIATED DERBY DATABASE AND MAKE     ***
-# *** IT NON-RECOVERABLE.                                               ***
-# *************************************************************************
\ No newline at end of file
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c10.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c10.dat
deleted file mode 100644
index 6abe074b19..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c10.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c101.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c101.dat
deleted file mode 100644
index baaafe3f94..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c101.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c111.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c111.dat
deleted file mode 100644
index e7acfddf33..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c111.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c121.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c121.dat
deleted file mode 100644
index 78585f26dc..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c121.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c130.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c130.dat
deleted file mode 100644
index 036b7f809c..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c130.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c141.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c141.dat
deleted file mode 100644
index 661ea3e26a..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c141.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c150.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c150.dat
deleted file mode 100644
index 62ba380b92..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c150.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c161.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c161.dat
deleted file mode 100644
index 8018dbb419..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c161.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c171.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c171.dat
deleted file mode 100644
index 4503f9d6fa..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c171.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c180.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c180.dat
deleted file mode 100644
index afec69a20f..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c180.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c191.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c191.dat
deleted file mode 100644
index 3ee2e8a994..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c191.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c1a1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c1a1.dat
deleted file mode 100644
index 16bb698986..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c1a1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c1b1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c1b1.dat
deleted file mode 100644
index 6c47f7e397..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c1b1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c1c0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c1c0.dat
deleted file mode 100644
index c5b91e2c3f..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c1c0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c1d1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c1d1.dat
deleted file mode 100644
index 451f02f45f..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c1d1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c1e0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c1e0.dat
deleted file mode 100644
index 761408d3b3..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c1e0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c1f1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c1f1.dat
deleted file mode 100644
index 78d701f455..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c1f1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c20.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c20.dat
deleted file mode 100644
index 145404e1ba..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c20.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c200.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c200.dat
deleted file mode 100644
index f26126cc0d..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c200.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c211.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c211.dat
deleted file mode 100644
index 67d6a3d1b2..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c211.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c221.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c221.dat
deleted file mode 100644
index a8a4deddca..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c221.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c230.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c230.dat
deleted file mode 100644
index 299017ee59..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c230.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c241.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c241.dat
deleted file mode 100644
index 99ebf44e8a..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c241.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c251.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c251.dat
deleted file mode 100644
index f2a385a2eb..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c251.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c260.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c260.dat
deleted file mode 100644
index 25f81fde78..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c260.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c271.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c271.dat
deleted file mode 100644
index 51cde573e7..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c271.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c281.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c281.dat
deleted file mode 100644
index cfed875dfc..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c281.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c290.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c290.dat
deleted file mode 100644
index a85589e545..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c290.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c2a1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c2a1.dat
deleted file mode 100644
index 8e2ed6afe9..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c2a1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c2b1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c2b1.dat
deleted file mode 100644
index 2a29692477..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c2b1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c2c1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c2c1.dat
deleted file mode 100644
index 5511575f62..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c2c1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c2d0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c2d0.dat
deleted file mode 100644
index 4adc6e4470..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c2d0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c2e1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c2e1.dat
deleted file mode 100644
index b37b9b2542..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c2e1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c2f0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c2f0.dat
deleted file mode 100644
index d854b4b482..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c2f0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c300.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c300.dat
deleted file mode 100644
index 2053e0105b..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c300.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c31.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c31.dat
deleted file mode 100644
index f76b54b161..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c31.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c311.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c311.dat
deleted file mode 100644
index f60c260f85..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c311.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c321.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c321.dat
deleted file mode 100644
index a9d745366d..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c321.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c331.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c331.dat
deleted file mode 100644
index 85ee72b313..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c331.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c340.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c340.dat
deleted file mode 100644
index d99b11a3f2..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c340.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c351.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c351.dat
deleted file mode 100644
index f822f4cb0c..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c351.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c361.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c361.dat
deleted file mode 100644
index b5c8f259d0..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c361.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c371.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c371.dat
deleted file mode 100644
index ad11f01b25..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c371.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c380.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c380.dat
deleted file mode 100644
index f5b6b3f87a..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c380.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c391.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c391.dat
deleted file mode 100644
index 92a43d2f31..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c391.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c3a1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c3a1.dat
deleted file mode 100644
index 2c1d876743..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c3a1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c3b1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c3b1.dat
deleted file mode 100644
index f67af18e46..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c3b1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c3c0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c3c0.dat
deleted file mode 100644
index 4d061cf060..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c3c0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c3d1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c3d1.dat
deleted file mode 100644
index 45c9fa244b..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c3d1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c3e1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c3e1.dat
deleted file mode 100644
index 48f53e682f..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c3e1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c3f1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c3f1.dat
deleted file mode 100644
index 08acdcee31..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c3f1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c400.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c400.dat
deleted file mode 100644
index 0b6f219532..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c400.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c41.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c41.dat
deleted file mode 100644
index 03f1cb74b9..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c41.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c411.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c411.dat
deleted file mode 100644
index 338433e59d..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c411.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c421.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c421.dat
deleted file mode 100644
index a4f06503ec..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c421.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c430.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c430.dat
deleted file mode 100644
index 55c948db34..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c430.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c441.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c441.dat
deleted file mode 100644
index 3948b2a3c5..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c441.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c451.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c451.dat
deleted file mode 100644
index fe1ab73e12..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c451.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c461.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c461.dat
deleted file mode 100644
index e6d98541fb..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c461.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c470.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c470.dat
deleted file mode 100644
index c9f2eb1cae..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c470.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c481.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c481.dat
deleted file mode 100644
index 397b291728..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c481.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c490.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c490.dat
deleted file mode 100644
index a134a2e244..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c490.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c4a1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c4a1.dat
deleted file mode 100644
index 8d4cc01a1f..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c4a1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c4b0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c4b0.dat
deleted file mode 100644
index 7f378b7eff..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c4b0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c4c1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c4c1.dat
deleted file mode 100644
index 430e73114d..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c4c1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c4d0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c4d0.dat
deleted file mode 100644
index d673d3d531..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c4d0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c4e1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c4e1.dat
deleted file mode 100644
index 93c0209a59..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c4e1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c4f1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c4f1.dat
deleted file mode 100644
index fa1063d4af..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c4f1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c501.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c501.dat
deleted file mode 100644
index 33572b5693..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c501.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c51.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c51.dat
deleted file mode 100644
index 3a5ba56638..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c51.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c60.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c60.dat
deleted file mode 100644
index 27fc913897..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c60.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c71.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c71.dat
deleted file mode 100644
index f5e31e0e85..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c71.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c81.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c81.dat
deleted file mode 100644
index 840990cc6a..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c81.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/c90.dat b/plc4j/tools/ui/backend/storage/settings/seg0/c90.dat
deleted file mode 100644
index cbd0a3ddf6..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/c90.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/ca1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/ca1.dat
deleted file mode 100644
index 67bad8dc11..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/ca1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/cb1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/cb1.dat
deleted file mode 100644
index d1e30b3e24..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/cb1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/cc0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/cc0.dat
deleted file mode 100644
index 849cb5079f..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/cc0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/cd1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/cd1.dat
deleted file mode 100644
index a6da6edac5..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/cd1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/ce1.dat b/plc4j/tools/ui/backend/storage/settings/seg0/ce1.dat
deleted file mode 100644
index 041b4c2aee..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/ce1.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/seg0/cf0.dat b/plc4j/tools/ui/backend/storage/settings/seg0/cf0.dat
deleted file mode 100644
index eae10c3f79..0000000000
Binary files a/plc4j/tools/ui/backend/storage/settings/seg0/cf0.dat and /dev/null differ
diff --git a/plc4j/tools/ui/backend/storage/settings/service.properties b/plc4j/tools/ui/backend/storage/settings/service.properties
deleted file mode 100644
index 9bf5951cfc..0000000000
--- a/plc4j/tools/ui/backend/storage/settings/service.properties
+++ /dev/null
@@ -1,23 +0,0 @@
-#/Users/cdutz/Projects/Apache/PLC4X/plc4x/plc4j/tools/ui/backend/storage/settings
-# ********************************************************************
-# ***                Please do NOT edit this file.                 ***
-# *** CHANGING THE CONTENT OF THIS FILE MAY CAUSE DATA CORRUPTION. ***
-# ********************************************************************
-#Tue Jan 02 21:28:48 CET 2024
-SyscolumnsIdentifier=144
-SyscolumnsIndex1Identifier=161
-SyscolumnsIndex2Identifier=177
-SysconglomeratesIdentifier=32
-SysconglomeratesIndex1Identifier=49
-SysconglomeratesIndex2Identifier=65
-SysconglomeratesIndex3Identifier=81
-SysschemasIdentifier=192
-SysschemasIndex1Identifier=209
-SysschemasIndex2Identifier=225
-SystablesIdentifier=96
-SystablesIndex1Identifier=113
-SystablesIndex2Identifier=129
-derby.serviceLocale=de_DE
-derby.serviceProtocol=org.apache.derby.database.Database
-derby.storage.propertiesId=16
-#--- last line, don't put anything after this line ---


(plc4x) 07/10: chore: Moved the generated ctrlx code into the main sources as it's not really generated.

Posted by cd...@apache.org.
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 d2c42c909b79ccc6c6296ff4d145b15761832341
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 13:42:22 2024 +0100

    chore: Moved the generated ctrlx code into the main sources as it's not really generated.
---
 .../ctrlx/readwrite/rest/datalayer/ApiClient.java  | 1028 ++++++++++++++++++++
 .../readwrite/rest/datalayer/ApiException.java     |  119 +++
 .../readwrite/rest/datalayer/Configuration.java    |   58 ++
 .../rest/datalayer/JavaTimeFormatter.java          |   83 ++
 .../java/ctrlx/readwrite/rest/datalayer/Pair.java  |   76 ++
 .../rest/datalayer/RFC3339DateFormat.java          |   76 ++
 .../rest/datalayer/ServerConfiguration.java        |   77 ++
 .../readwrite/rest/datalayer/ServerVariable.java   |   42 +
 .../ctrlx/readwrite/rest/datalayer/StringUtil.java |  102 ++
 .../rest/datalayer/api/BulkAccessApi.java          |  119 +++
 .../api/DataLayerInformationAndSettingsApi.java    |  326 +++++++
 .../readwrite/rest/datalayer/api/NodesApi.java     |  298 ++++++
 .../readwrite/rest/datalayer/api/RemotesApi.java   |  497 ++++++++++
 .../rest/datalayer/api/RetainMemoryApi.java        |  651 +++++++++++++
 .../api/SubscriptionInformationAndSettingsApi.java |  369 +++++++
 .../rest/datalayer/api/SubscriptionsApi.java       |  351 +++++++
 .../readwrite/rest/datalayer/api/TypesApi.java     |  122 +++
 .../readwrite/rest/datalayer/auth/ApiKeyAuth.java  |   96 ++
 .../rest/datalayer/auth/Authentication.java        |   49 +
 .../rest/datalayer/auth/HttpBasicAuth.java         |   71 ++
 .../rest/datalayer/auth/HttpBearerAuth.java        |   79 ++
 .../ctrlx/readwrite/rest/datalayer/auth/OAuth.java |   58 ++
 .../readwrite/rest/datalayer/auth/OAuthFlow.java   |   44 +
 .../readwrite/rest/datalayer/model/ARString.java   |  220 +++++
 .../rest/datalayer/model/AllowedOperations.java    |  335 +++++++
 .../readwrite/rest/datalayer/model/BrowseData.java |  223 +++++
 .../rest/datalayer/model/BulkRequestInner.java     |  343 +++++++
 .../rest/datalayer/model/BulkResponseInner.java    |  429 ++++++++
 .../datalayer/model/ChangeSubscriptionRequest.java |  222 +++++
 .../datalayer/model/CommDatalayerChangeEvents.java |  253 +++++
 .../datalayer/model/CommDatalayerCounting.java     |  169 ++++
 .../model/CommDatalayerDataChangeFilter.java       |  170 ++++
 .../model/CommDatalayerDataChangeTrigger.java      |   89 ++
 .../datalayer/model/CommDatalayerProperties.java   |   93 ++
 .../datalayer/model/CommDatalayerProperty.java     |  206 ++++
 .../datalayer/model/CommDatalayerPropertyRule.java |  468 +++++++++
 .../model/CommDatalayerQueueBehaviour.java         |   87 ++
 .../datalayer/model/CommDatalayerQueueing.java     |  213 ++++
 .../model/CommDatalayerRemoteConfigItem.java       |  211 ++++
 .../datalayer/model/CommDatalayerSampling.java     |  171 ++++
 .../model/CommDatalayerServerSettings.java         |  214 ++++
 .../model/CommDatalayerSubscriptionData.java       |  220 +++++
 .../model/CommDatalayerSubscriptionProperties.java |  353 +++++++
 .../rest/datalayer/model/CreateRemoteRequest.java  |  206 ++++
 .../datalayer/model/CreateSubscriptionRequest.java |  217 +++++
 .../model/CreateSubscriptionRequestAllOf.java      |  220 +++++
 .../readwrite/rest/datalayer/model/DLARString.java |  220 +++++
 .../readwrite/rest/datalayer/model/DLString.java   |  209 ++++
 .../readwrite/rest/datalayer/model/DLUInt32.java   |  211 ++++
 .../ctrlx/readwrite/rest/datalayer/model/Data.java |  251 +++++
 .../readwrite/rest/datalayer/model/Extension.java  |  209 ++++
 .../readwrite/rest/datalayer/model/JsonString.java |  209 ++++
 .../readwrite/rest/datalayer/model/Memory.java     |  204 ++++
 .../readwrite/rest/datalayer/model/MemoryType.java |   93 ++
 .../rest/datalayer/model/MemoryValue.java          |  253 +++++
 .../readwrite/rest/datalayer/model/MetaData.java   |  518 ++++++++++
 .../readwrite/rest/datalayer/model/NodeClass.java  |   89 ++
 .../readwrite/rest/datalayer/model/Problem.java    |  702 +++++++++++++
 .../rest/datalayer/model/ReadNode200Response.java  |  264 +++++
 .../readwrite/rest/datalayer/model/Reference.java  |  209 ++++
 .../readwrite/rest/datalayer/model/Reflection.java |  392 ++++++++
 .../rest/datalayer/model/ReflectionBaseType.java   |  117 +++
 .../rest/datalayer/model/ReflectionEnum.java       |  401 ++++++++
 .../rest/datalayer/model/ReflectionEnumVal.java    |  343 +++++++
 .../rest/datalayer/model/ReflectionField.java      |  613 ++++++++++++
 .../rest/datalayer/model/ReflectionKeyValue.java   |  211 ++++
 .../rest/datalayer/model/ReflectionObject.java     |  452 +++++++++
 .../rest/datalayer/model/ReflectionRPCCall.java    |  349 +++++++
 .../rest/datalayer/model/ReflectionSchema.java     |  394 ++++++++
 .../rest/datalayer/model/ReflectionService.java    |  325 +++++++
 .../rest/datalayer/model/ReflectionType.java       |  255 +++++
 .../rest/datalayer/model/RemoteConfig.java         |  204 ++++
 .../rest/datalayer/model/RetainStats.java          |  433 +++++++++
 .../readwrite/rest/datalayer/model/SSEEvent.java   |  287 ++++++
 .../rest/datalayer/model/SSEEventData.java         |  338 +++++++
 .../rest/datalayer/model/SSEEventData1.java        |  872 +++++++++++++++++
 .../rest/datalayer/model/ServerSettings.java       |  204 ++++
 .../readwrite/rest/datalayer/model/State.java      |   93 ++
 .../rest/datalayer/model/SubscriptionData.java     |  204 ++++
 .../rest/datalayer/model/SubscriptionID.java       |  167 ++++
 .../rest/datalayer/model/SubscriptionNodeList.java |  178 ++++
 .../datalayer/model/SubscriptionProperties.java    |  204 ++++
 .../model/SubscriptionPropertiesData.java          |  351 +++++++
 .../rest/datalayer/model/SubscriptionSettings.java |  303 ++++++
 .../ctrlx/readwrite/rest/datalayer/model/Task.java |  378 +++++++
 .../readwrite/rest/datalayer/model/UInt32.java     |  211 ++++
 86 files changed, 22043 insertions(+)

diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java
new file mode 100644
index 0000000000..54c40d4182
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiClient.java
@@ -0,0 +1,1028 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.core.type.TypeReference;
+import com.fasterxml.jackson.databind.DeserializationFeature;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import com.fasterxml.jackson.databind.SerializationFeature;
+import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
+import org.apache.http.*;
+import org.apache.http.client.config.RequestConfig;
+import org.apache.http.client.entity.UrlEncodedFormEntity;
+import org.apache.http.client.methods.CloseableHttpResponse;
+import org.apache.http.client.methods.RequestBuilder;
+import org.apache.http.client.protocol.HttpClientContext;
+import org.apache.http.cookie.Cookie;
+import org.apache.http.entity.ByteArrayEntity;
+import org.apache.http.entity.ContentType;
+import org.apache.http.entity.FileEntity;
+import org.apache.http.entity.StringEntity;
+import org.apache.http.entity.mime.MultipartEntityBuilder;
+import org.apache.http.impl.client.BasicCookieStore;
+import org.apache.http.impl.client.CloseableHttpClient;
+import org.apache.http.impl.client.HttpClients;
+import org.apache.http.impl.cookie.BasicClientCookie;
+import org.apache.http.message.BasicNameValuePair;
+import org.apache.http.util.EntityUtils;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth.Authentication;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth.HttpBearerAuth;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth.OAuth;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.UnsupportedEncodingException;
+import java.lang.reflect.Type;
+import java.net.URI;
+import java.net.URLEncoder;
+import java.nio.charset.Charset;
+import java.nio.file.Files;
+import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
+import java.text.DateFormat;
+import java.time.OffsetDateTime;
+import java.util.*;
+import java.util.Map.Entry;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class ApiClient extends JavaTimeFormatter {
+  private Map<String, String> defaultHeaderMap = new HashMap<String, String>();
+  private Map<String, String> defaultCookieMap = new HashMap<String, String>();
+  private String basePath = "/automation/api/v2";
+  protected List<ServerConfiguration> servers = new ArrayList<ServerConfiguration>(Arrays.asList(
+    new ServerConfiguration(
+      "/automation/api/v2",
+      "No description provided",
+      new HashMap<String, ServerVariable>()
+    ),
+    new ServerConfiguration(
+      "https://[fe80::dcad:beff:fe00:1]/automation/api/v2",
+      "No description provided",
+      new HashMap<String, ServerVariable>()
+    ),
+    new ServerConfiguration(
+      "https://{host}/automation/api/v2",
+      "No description provided",
+      new HashMap<String, ServerVariable>() {{
+        put("host", new ServerVariable(
+          "Hostname or ip address of the ctrlX device",
+          "192.168.1.1",
+          new HashSet<String>(
+          )
+        ));
+      }}
+    )
+  ));
+  protected Integer serverIndex = 0;
+  protected Map<String, String> serverVariables = null;
+  private boolean debugging = false;
+  private int connectionTimeout = 0;
+
+  private CloseableHttpClient httpClient;
+  private ObjectMapper objectMapper;
+  protected String tempFolderPath = null;
+
+  private Map<String, Authentication> authentications;
+
+  private int statusCode;
+  private Map<String, List<String>> responseHeaders;
+
+  private DateFormat dateFormat;
+
+  // Methods that can have a request body
+  private static List<String> bodyMethods = Arrays.asList("POST", "PUT", "DELETE", "PATCH");
+
+  public ApiClient(CloseableHttpClient httpClient) {
+    objectMapper = new ObjectMapper();
+    objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL);
+    objectMapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
+    objectMapper.configure(DeserializationFeature.FAIL_ON_INVALID_SUBTYPE, false);
+    objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS);
+    objectMapper.enable(SerializationFeature.WRITE_ENUMS_USING_TO_STRING);
+    objectMapper.enable(DeserializationFeature.READ_ENUMS_USING_TO_STRING);
+    objectMapper.registerModule(new JavaTimeModule());
+    objectMapper.setDateFormat(ApiClient.buildDefaultDateFormat());
+
+    dateFormat = ApiClient.buildDefaultDateFormat();
+
+    // Set default User-Agent.
+    setUserAgent("OpenAPI-Generator/2.1.0/java");
+
+    // Setup authentications (key: authentication name, value: authentication).
+    authentications = new HashMap<String, Authentication>();
+    authentications.put("Bearer", new HttpBearerAuth("bearer"));
+    authentications.put("UsernamePassword", new OAuth());
+    // Prevent the authentications from being modified.
+    authentications = Collections.unmodifiableMap(authentications);
+
+    this.httpClient = httpClient;
+  }
+
+  public ApiClient() {
+    this(HttpClients.createDefault());
+  }
+
+  public static DateFormat buildDefaultDateFormat() {
+    return new RFC3339DateFormat();
+  }
+
+  /**
+   * Returns the current object mapper used for JSON serialization/deserialization.
+   * <p>
+   * Note: If you make changes to the object mapper, remember to set it back via
+   * <code>setObjectMapper</code> in order to trigger HTTP client rebuilding.
+   * </p>
+   * @return Object mapper
+   */
+  public ObjectMapper getObjectMapper() {
+    return objectMapper;
+  }
+
+  /**
+   * Sets the object mapper.
+   *
+   * @param objectMapper object mapper
+   * @return API client
+   */
+  public ApiClient setObjectMapper(ObjectMapper objectMapper) {
+    this.objectMapper = objectMapper;
+    return this;
+  }
+
+  public CloseableHttpClient getHttpClient() {
+    return httpClient;
+  }
+
+  /**
+   * Sets the HTTP client.
+   *
+   * @param httpClient HTTP client
+   * @return API client
+   */
+  public ApiClient setHttpClient(CloseableHttpClient httpClient) {
+    this.httpClient = httpClient;
+    return this;
+  }
+
+  public String getBasePath() {
+    return basePath;
+  }
+
+  /**
+   * Sets the base path.
+   *
+   * @param basePath base path
+   * @return API client
+   */
+  public ApiClient setBasePath(String basePath) {
+    this.basePath = basePath;
+    this.serverIndex = null;
+    return this;
+  }
+
+  public List<ServerConfiguration> getServers() {
+    return servers;
+  }
+
+  /**
+   * Sets the server.
+   *
+   * @param servers a list of server configuration
+   * @return API client
+   */
+  public ApiClient setServers(List<ServerConfiguration> servers) {
+    this.servers = servers;
+    return this;
+  }
+
+  public Integer getServerIndex() {
+    return serverIndex;
+  }
+
+  /**
+   * Sets the server index.
+   *
+   * @param serverIndex server index
+   * @return API client
+   */
+  public ApiClient setServerIndex(Integer serverIndex) {
+    this.serverIndex = serverIndex;
+    return this;
+  }
+
+  public Map<String, String> getServerVariables() {
+    return serverVariables;
+  }
+
+  /**
+   * Sets the server variables.
+   *
+   * @param serverVariables server variables
+   * @return API client
+   */
+  public ApiClient setServerVariables(Map<String, String> serverVariables) {
+    this.serverVariables = serverVariables;
+    return this;
+  }
+
+  /**
+   * Gets the status code of the previous request
+   *
+   * @return Status code
+   */
+  public int getStatusCode() {
+    return statusCode;
+  }
+
+  /**
+   * Gets the response headers of the previous request
+   * @return Response headers
+   */
+  public Map<String, List<String>> getResponseHeaders() {
+    return responseHeaders;
+  }
+
+  /**
+   * Get authentications (key: authentication name, value: authentication).
+   * @return Map of authentication
+   */
+  public Map<String, Authentication> getAuthentications() {
+    return authentications;
+  }
+
+  /**
+   * Get authentication for the given name.
+   *
+   * @param authName The authentication name
+   * @return The authentication, null if not found
+   */
+  public Authentication getAuthentication(String authName) {
+    return authentications.get(authName);
+  }
+
+  /**
+   * The path of temporary folder used to store downloaded files from endpoints
+   * with file response. The default value is <code>null</code>, i.e. using
+   * the system's default temporary folder.
+   *
+   * @return Temp folder path
+   */
+  public String getTempFolderPath() {
+    return tempFolderPath;
+  }
+
+  /**
+   * Helper method to set access token for the first Bearer authentication.
+   * @param bearerToken Bearer token
+   * @return API client
+   */
+  public ApiClient setBearerToken(String bearerToken) {
+    for (Authentication auth : authentications.values()) {
+      if (auth instanceof HttpBearerAuth) {
+        ((HttpBearerAuth) auth).setBearerToken(bearerToken);
+        return this;
+      }
+    }
+    throw new RuntimeException("No Bearer authentication configured!");
+  }
+
+
+
+
+  /**
+   * Helper method to set access token for the first OAuth2 authentication.
+   * @param accessToken Access token
+   * @return API client
+   */
+  public ApiClient setAccessToken(String accessToken) {
+    for (Authentication auth : authentications.values()) {
+      if (auth instanceof OAuth) {
+        ((OAuth) auth).setAccessToken(accessToken);
+        return this;
+      }
+    }
+    throw new RuntimeException("No OAuth2 authentication configured!");
+  }
+
+
+  /**
+   * Set the User-Agent header's value (by adding to the default header map).
+   * @param userAgent User agent
+   * @return API client
+   */
+  public ApiClient setUserAgent(String userAgent) {
+    addDefaultHeader("User-Agent", userAgent);
+    return this;
+  }
+
+  /**
+   * Set temp folder path
+   * @param tempFolderPath Temp folder path
+   * @return API client
+   */
+  public ApiClient setTempFolderPath(String tempFolderPath) {
+    this.tempFolderPath = tempFolderPath;
+    return this;
+  }
+
+  /**
+   * Add a default header.
+   *
+   * @param key The header's key
+   * @param value The header's value
+   * @return API client
+   */
+  public ApiClient addDefaultHeader(String key, String value) {
+    defaultHeaderMap.put(key, value);
+    return this;
+  }
+
+  /**
+   * Add a default cookie.
+   *
+   * @param key The cookie's key
+   * @param value The cookie's value
+   * @return API client
+   */
+  public ApiClient addDefaultCookie(String key, String value) {
+    defaultCookieMap.put(key, value);
+    return this;
+  }
+
+  /**
+   * Check that whether debugging is enabled for this API client.
+   * @return True if debugging is on
+   */
+  public boolean isDebugging() {
+    return debugging;
+  }
+
+  /**
+   * Enable/disable debugging for this API client.
+   *
+   * @param debugging To enable (true) or disable (false) debugging
+   * @return API client
+   */
+  public ApiClient setDebugging(boolean debugging) {
+    // TODO: implement debugging mode
+    this.debugging = debugging;
+    return this;
+  }
+
+  /**
+   * Connect timeout (in milliseconds).
+   * @return Connection timeout
+   */
+  public int getConnectTimeout() {
+    return connectionTimeout;
+  }
+
+  /**
+   * Set the connect timeout (in milliseconds).
+   * A value of 0 means no timeout, otherwise values must be between 1 and
+   * {@link Integer#MAX_VALUE}.
+   * @param connectionTimeout Connection timeout in milliseconds
+   * @return API client
+   */
+   public ApiClient setConnectTimeout(int connectionTimeout) {
+     this.connectionTimeout = connectionTimeout;
+     return this;
+   }
+
+  /**
+   * Get the date format used to parse/format date parameters.
+   * @return Date format
+   */
+  public DateFormat getDateFormat() {
+    return dateFormat;
+  }
+
+  /**
+   * Set the date format used to parse/format date parameters.
+   * @param dateFormat Date format
+   * @return API client
+   */
+  public ApiClient setDateFormat(DateFormat dateFormat) {
+    this.dateFormat = dateFormat;
+    // Also set the date format for model (de)serialization with Date properties.
+    this.objectMapper.setDateFormat((DateFormat) dateFormat.clone());
+    return this;
+  }
+
+  /**
+   * Parse the given string into Date object.
+   * @param str String
+   * @return Date
+   */
+  public Date parseDate(String str) {
+    try {
+      return dateFormat.parse(str);
+    } catch (java.text.ParseException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
+  /**
+   * Format the given Date object into string.
+   * @param date Date
+   * @return Date in string format
+   */
+  public String formatDate(Date date) {
+    return dateFormat.format(date);
+  }
+
+  /**
+   * Format the given parameter object into string.
+   * @param param Object
+   * @return Object in string format
+   */
+  public String parameterToString(Object param) {
+    if (param == null) {
+      return "";
+    } else if (param instanceof Date) {
+      return formatDate((Date) param);
+    } else if (param instanceof OffsetDateTime) {
+      return formatOffsetDateTime((OffsetDateTime) param);
+    } else if (param instanceof Collection) {
+      StringBuilder b = new StringBuilder();
+      for(Object o : (Collection<?>)param) {
+        if(b.length() > 0) {
+          b.append(',');
+        }
+        b.append(String.valueOf(o));
+      }
+      return b.toString();
+    } else {
+      return String.valueOf(param);
+    }
+  }
+
+  /**
+   * Formats the specified query parameter to a list containing a single {@code Pair} object.
+   *
+   * Note that {@code value} must not be a collection.
+   *
+   * @param name The name of the parameter.
+   * @param value The value of the parameter.
+   * @return A list containing a single {@code Pair} object.
+   */
+  public List<Pair> parameterToPair(String name, Object value) {
+    List<Pair> params = new ArrayList<Pair>();
+
+    // preconditions
+    if (name == null || name.isEmpty() || value == null || value instanceof Collection) {
+      return params;
+    }
+
+    params.add(new Pair(name, escapeString(parameterToString(value))));
+    return params;
+  }
+
+  /**
+   * Formats the specified collection query parameters to a list of {@code Pair} objects.
+   *
+   * Note that the values of each of the returned Pair objects are percent-encoded.
+   *
+   * @param collectionFormat The collection format of the parameter.
+   * @param name The name of the parameter.
+   * @param value The value of the parameter.
+   * @return A list of {@code Pair} objects.
+   */
+  public List<Pair> parameterToPairs(String collectionFormat, String name, Collection value) {
+    List<Pair> params = new ArrayList<Pair>();
+
+    // preconditions
+    if (name == null || name.isEmpty() || value == null) {
+      return params;
+    }
+
+    // create the params based on the collection format
+    if ("multi".equals(collectionFormat)) {
+      for (Object item : value) {
+        params.add(new Pair(name, escapeString(parameterToString(item))));
+      }
+      return params;
+    }
+
+    // collectionFormat is assumed to be "csv" by default
+    String delimiter = ",";
+
+    // escape all delimiters except commas, which are URI reserved
+    // characters
+    if ("ssv".equals(collectionFormat)) {
+      delimiter = escapeString(" ");
+    } else if ("tsv".equals(collectionFormat)) {
+      delimiter = escapeString("\t");
+    } else if ("pipes".equals(collectionFormat)) {
+      delimiter = escapeString("|");
+    }
+
+    StringBuilder sb = new StringBuilder() ;
+    for (Object item : value) {
+      sb.append(delimiter);
+      sb.append(escapeString(parameterToString(item)));
+    }
+
+    params.add(new Pair(name, sb.substring(delimiter.length())));
+
+    return params;
+  }
+
+  /**
+   * Check if the given MIME is a JSON MIME.
+   * JSON MIME examples:
+   *   application/json
+   *   application/json; charset=UTF8
+   *   APPLICATION/JSON
+   *   application/vnd.company+json
+   * @param mime MIME
+   * @return True if MIME type is boolean
+   */
+  public boolean isJsonMime(String mime) {
+    String jsonMime = "(?i)^(application/json|[^;/ \t]+/[^;/ \t]+[+]json)[ \t]*(;.*)?$";
+    return mime != null && (mime.matches(jsonMime) || mime.equals("*/*"));
+  }
+
+  /**
+   * Select the Accept header's value from the given accepts array:
+   *   if JSON exists in the given array, use it;
+   *   otherwise use all of them (joining into a string)
+   *
+   * @param accepts The accepts array to select from
+   * @return The Accept header to use. If the given array is empty,
+   *   null will be returned (not to set the Accept header explicitly).
+   */
+  public String selectHeaderAccept(String[] accepts) {
+    if (accepts.length == 0) {
+      return null;
+    }
+    for (String accept : accepts) {
+      if (isJsonMime(accept)) {
+        return accept;
+      }
+    }
+    return StringUtil.join(accepts, ",");
+  }
+
+  /**
+   * Select the Content-Type header's value from the given array:
+   *   if JSON exists in the given array, use it;
+   *   otherwise use the first one of the array.
+   *
+   * @param contentTypes The Content-Type array to select from
+   * @return The Content-Type header to use. If the given array is empty,
+   *   or matches "any", JSON will be used.
+   */
+  public String selectHeaderContentType(String[] contentTypes) {
+    if (contentTypes.length == 0 || contentTypes[0].equals("*/*")) {
+      return "application/json";
+    }
+    for (String contentType : contentTypes) {
+      if (isJsonMime(contentType)) {
+        return contentType;
+      }
+    }
+    return contentTypes[0];
+  }
+
+  /**
+   * Escape the given string to be used as URL query value.
+   * @param str String
+   * @return Escaped string
+   */
+  public String escapeString(String str) {
+    try {
+      return URLEncoder.encode(str, "utf8").replaceAll("\\+", "%20");
+    } catch (UnsupportedEncodingException e) {
+      return str;
+    }
+  }
+
+  /**
+   * Transforms response headers into map.
+   *
+   * @param headers HTTP headers
+   * @return a map of string array
+   */
+  protected Map<String, List<String>> transformResponseHeaders(Header[] headers) {
+    Map<String, List<String>> headersMap = new HashMap<>();
+    for (Header header : headers) {
+      List<String> valuesList = headersMap.get(header.getName());
+      if (valuesList != null) {
+        valuesList.add(header.getValue());
+      } else {
+        valuesList = new ArrayList<>();
+        valuesList.add(header.getValue());
+        headersMap.put(header.getName(), valuesList);
+      }
+    }
+    return headersMap;
+  }
+
+  /**
+   * Parse content type object from header value
+   */
+  private ContentType getContentType(String headerValue) throws ApiException {
+    try {
+      return ContentType.parse(headerValue);
+    } catch (ParseException e) {
+      throw new ApiException("Could not parse content type " + headerValue);
+    }
+  }
+
+  /**
+   * Get content type of a response or null if one was not provided
+   */
+  private String getResponseMimeType(HttpResponse response) throws ApiException {
+    Header contentTypeHeader = response.getFirstHeader("Content-Type");
+    if (contentTypeHeader != null) {
+      return getContentType(contentTypeHeader.getValue()).getMimeType();
+    }
+    return null;
+  }
+
+  /**
+   * Serialize the given Java object into string according the given
+   * Content-Type (only JSON is supported for now).
+   * @param obj Object
+   * @param contentType Content type
+   * @param formParams Form parameters
+   * @return Object
+   * @throws ApiException API exception
+   */
+  public HttpEntity serialize(Object obj, Map<String, Object> formParams, ContentType contentType) throws ApiException {
+    String mimeType = contentType.getMimeType();
+    if (isJsonMime(mimeType)) {
+      try {
+        return new StringEntity(objectMapper.writeValueAsString(obj), contentType);
+      } catch (JsonProcessingException e) {
+        throw new ApiException(e);
+      }
+    } else if (mimeType.equals(ContentType.MULTIPART_FORM_DATA.getMimeType())) {
+      MultipartEntityBuilder multiPartBuilder = MultipartEntityBuilder.create();
+      for (Entry<String, Object> paramEntry : formParams.entrySet()) {
+        Object value = paramEntry.getValue();
+        if (value instanceof File) {
+          multiPartBuilder.addBinaryBody(paramEntry.getKey(), (File) value);
+        } else if (value instanceof byte[]) {
+          multiPartBuilder.addBinaryBody(paramEntry.getKey(), (byte[]) value);
+        } else {
+          Charset charset = contentType.getCharset();
+          if (charset != null) {
+            ContentType customContentType = ContentType.create(ContentType.TEXT_PLAIN.getMimeType(), charset);
+            multiPartBuilder.addTextBody(paramEntry.getKey(), parameterToString(paramEntry.getValue()),
+                    customContentType);
+          } else {
+            multiPartBuilder.addTextBody(paramEntry.getKey(), parameterToString(paramEntry.getValue()));
+          }
+        }
+      }
+      return multiPartBuilder.build();
+    } else if (mimeType.equals(ContentType.APPLICATION_FORM_URLENCODED.getMimeType())) {
+      List<NameValuePair> formValues = new ArrayList<>();
+      for (Entry<String, Object> paramEntry : formParams.entrySet()) {
+        formValues.add(new BasicNameValuePair(paramEntry.getKey(), parameterToString(paramEntry.getValue())));
+      }
+      return new UrlEncodedFormEntity(formValues, contentType.getCharset());
+    } else {
+      // Handle files with unknown content type
+      if (obj instanceof File) {
+        return new FileEntity((File) obj, contentType);
+      } else if (obj instanceof byte[]) {
+        return new ByteArrayEntity((byte[]) obj, contentType);
+      }
+      throw new ApiException("Serialization for content type '" + contentType + "' not supported");
+    }
+  }
+
+  /**
+   * Deserialize response body to Java object according to the Content-Type.
+   *
+   * @param <T> Type
+   * @param response Response
+   * @param valueType Return type
+   * @return Deserialized object
+   * @throws ApiException API exception
+   * @throws IOException IO exception
+   */
+  @SuppressWarnings("unchecked")
+  public <T> T deserialize(HttpResponse response, TypeReference<T> valueType) throws ApiException, IOException {
+    if (valueType == null) {
+      return null;
+    }
+    HttpEntity entity = response.getEntity();
+    Type valueRawType = valueType.getType();
+    if (valueRawType.equals(byte[].class)) {
+      return (T) EntityUtils.toByteArray(entity);
+    } else if (valueRawType.equals(File.class)) {
+      return (T) downloadFileFromResponse(response);
+    }
+    String mimeType = getResponseMimeType(response);
+    if (mimeType == null || isJsonMime(mimeType)) {
+      // Assume json if no mime type
+      // convert input stream to string
+      Scanner s = new Scanner(entity.getContent()).useDelimiter("\\A");
+      String content = (String) (s.hasNext() ? s.next() : "");
+
+      if ("".equals(content)) { // returns null for empty body
+        return null;
+      }
+
+      return objectMapper.readValue(content, valueType);
+    } else if ("text/plain".equalsIgnoreCase(mimeType)) {
+      // convert input stream to string
+      Scanner s = new Scanner(entity.getContent()).useDelimiter("\\A");
+      return (T) (s.hasNext() ? s.next() : "");
+    } else {
+      throw new ApiException(
+          "Deserialization for content type '" + mimeType + "' not supported for type '" + valueType + "'",
+          response.getStatusLine().getStatusCode(),
+          responseHeaders,
+          EntityUtils.toString(entity)
+      );
+    }
+  }
+
+  private File downloadFileFromResponse(HttpResponse response) throws IOException {
+    Header contentDispositionHeader = response.getFirstHeader("Content-Disposition");
+    String contentDisposition = contentDispositionHeader == null ? null : contentDispositionHeader.getValue();
+    File file = prepareDownloadFile(contentDisposition);
+    Files.copy(response.getEntity().getContent(), file.toPath(), StandardCopyOption.REPLACE_EXISTING);
+    return file;
+  }
+
+  protected File prepareDownloadFile(String contentDisposition) throws IOException {
+    String filename = null;
+    if (contentDisposition != null && !"".equals(contentDisposition)) {
+      // Get filename from the Content-Disposition header.
+      Pattern pattern = Pattern.compile("filename=['\"]?([^'\"\\s]+)['\"]?");
+      Matcher matcher = pattern.matcher(contentDisposition);
+      if (matcher.find())
+        filename = matcher.group(1);
+    }
+
+    String prefix;
+    String suffix = null;
+    if (filename == null) {
+      prefix = "download-";
+      suffix = "";
+    } else {
+      int pos = filename.lastIndexOf('.');
+      if (pos == -1) {
+        prefix = filename + "-";
+      } else {
+        prefix = filename.substring(0, pos) + "-";
+        suffix = filename.substring(pos);
+      }
+      // Files.createTempFile requires the prefix to be at least three characters long
+      if (prefix.length() < 3)
+        prefix = "download-";
+    }
+
+    if (tempFolderPath == null)
+      return Files.createTempFile(prefix, suffix).toFile();
+    else
+      return Files.createTempFile(Paths.get(tempFolderPath), prefix, suffix).toFile();
+  }
+
+  /**
+   * Build full URL by concatenating base path, the given sub path and query parameters.
+   *
+   * @param path The sub path
+   * @param queryParams The query parameters
+   * @param collectionQueryParams The collection query parameters
+   * @param urlQueryDeepObject URL query string of the deep object parameters
+   * @return The full URL
+   */
+  private String buildUrl(String path, List<Pair> queryParams, List<Pair> collectionQueryParams, String urlQueryDeepObject) {
+    String baseURL;
+    if (serverIndex != null) {
+      if (serverIndex < 0 || serverIndex >= servers.size()) {
+        throw new ArrayIndexOutOfBoundsException(String.format(
+          "Invalid index %d when selecting the host settings. Must be less than %d", serverIndex, servers.size()
+        ));
+      }
+      baseURL = servers.get(serverIndex).URL(serverVariables);
+    } else {
+      baseURL = basePath;
+    }
+
+    final StringBuilder url = new StringBuilder();
+    url.append(baseURL).append(path);
+
+    if (queryParams != null && !queryParams.isEmpty()) {
+      // support (constant) query string in `path`, e.g. "/posts?draft=1"
+      String prefix = path.contains("?") ? "&" : "?";
+      for (Pair param : queryParams) {
+        if (param.getValue() != null) {
+          if (prefix != null) {
+            url.append(prefix);
+            prefix = null;
+          } else {
+            url.append("&");
+          }
+          String value = parameterToString(param.getValue());
+          // query parameter value already escaped as part of parameterToPair
+          url.append(escapeString(param.getName())).append("=").append(value);
+        }
+      }
+    }
+
+    if (collectionQueryParams != null && !collectionQueryParams.isEmpty()) {
+      String prefix = url.toString().contains("?") ? "&" : "?";
+      for (Pair param : collectionQueryParams) {
+        if (param.getValue() != null) {
+          if (prefix != null) {
+            url.append(prefix);
+            prefix = null;
+          } else {
+            url.append("&");
+          }
+          String value = parameterToString(param.getValue());
+          // collection query parameter value already escaped as part of parameterToPairs
+          url.append(escapeString(param.getName())).append("=").append(value);
+        }
+      }
+    }
+
+    if (urlQueryDeepObject != null && urlQueryDeepObject.length() > 0) {
+      url.append(url.toString().contains("?") ? "&" : "?");
+      url.append(urlQueryDeepObject);
+    }
+
+    return url.toString();
+  }
+
+  protected boolean isSuccessfulStatus(int statusCode) {
+    return statusCode >= 200 && statusCode < 300;
+  }
+
+  protected boolean isBodyAllowed(String method) {
+    return bodyMethods.contains(method);
+  }
+
+  protected Cookie buildCookie(String key, String value, URI uri) {
+    BasicClientCookie cookie = new BasicClientCookie(key, value);
+    cookie.setDomain(uri.getHost());
+    cookie.setPath("/");
+    return cookie;
+  }
+
+  protected <T> T processResponse(CloseableHttpResponse response, TypeReference<T> returnType) throws ApiException, IOException {
+    statusCode = response.getStatusLine().getStatusCode();
+    if (statusCode == HttpStatus.SC_NO_CONTENT) {
+      return null;
+    }
+
+    responseHeaders = transformResponseHeaders(response.getAllHeaders());
+    if (isSuccessfulStatus(statusCode)) {
+      return this.deserialize(response, returnType);
+    } else {
+      String message = EntityUtils.toString(response.getEntity());
+      throw new ApiException(message, statusCode, responseHeaders, message);
+    }
+  }
+
+  /**
+   * Invoke API by sending HTTP request with the given options.
+   *
+   * @param <T> Type
+   * @param path The sub-path of the HTTP URL
+   * @param method The request method, one of "GET", "POST", "PUT", and "DELETE"
+   * @param queryParams The query parameters
+   * @param collectionQueryParams The collection query parameters
+   * @param urlQueryDeepObject A URL query string for deep object parameters
+   * @param body The request body object - if it is not binary, otherwise null
+   * @param headerParams The header parameters
+   * @param cookieParams The cookie parameters
+   * @param formParams The form parameters
+   * @param accept The request's Accept header
+   * @param contentType The request's Content-Type header
+   * @param authNames The authentications to apply
+   * @param returnType Return type
+   * @return The response body in type of string
+   * @throws ApiException API exception
+   */
+   public <T> T invokeAPI(
+       String path,
+       String method,
+       List<Pair> queryParams,
+       List<Pair> collectionQueryParams,
+       String urlQueryDeepObject,
+       Object body,
+       Map<String, String> headerParams,
+       Map<String, String> cookieParams,
+       Map<String, Object> formParams,
+       String accept,
+       String contentType,
+       String[] authNames,
+       TypeReference<T> returnType) throws ApiException {
+    if (body != null && !formParams.isEmpty()) {
+      throw new ApiException("Cannot have body and form params");
+    }
+
+    updateParamsForAuth(authNames, queryParams, headerParams, cookieParams);
+    final String url = buildUrl(path, queryParams, collectionQueryParams, urlQueryDeepObject);
+
+    RequestBuilder builder = RequestBuilder.create(method);
+    builder.setUri(url);
+
+    RequestConfig config = RequestConfig.custom()
+      .setConnectionRequestTimeout(connectionTimeout)
+      .build();
+    builder.setConfig(config);
+
+    if (accept != null) {
+      builder.addHeader("Accept", accept);
+    }
+    for (Entry<String, String> keyValue : headerParams.entrySet()) {
+      builder.addHeader(keyValue.getKey(), keyValue.getValue());
+    }
+    for (Entry<String,String> keyValue : defaultHeaderMap.entrySet()) {
+      if (!headerParams.containsKey(keyValue.getKey())) {
+        builder.addHeader(keyValue.getKey(), keyValue.getValue());
+      }
+    }
+
+    BasicCookieStore store = new BasicCookieStore();
+    for (Entry<String, String> keyValue : cookieParams.entrySet()) {
+      store.addCookie(buildCookie(keyValue.getKey(), keyValue.getValue(), builder.getUri()));
+    }
+    for (Entry<String,String> keyValue : defaultCookieMap.entrySet()) {
+      if (!cookieParams.containsKey(keyValue.getKey())) {
+        store.addCookie(buildCookie(keyValue.getKey(), keyValue.getValue(), builder.getUri()));
+      }
+    }
+
+    HttpClientContext context = HttpClientContext.create();
+    context.setCookieStore(store);
+
+    ContentType contentTypeObj = getContentType(contentType);
+    if (body != null || !formParams.isEmpty()) {
+      if (isBodyAllowed(method)) {
+        // Add entity if we have content and a valid method
+        builder.setEntity(serialize(body, formParams, contentTypeObj));
+      } else {
+        throw new ApiException("method " + method + " does not support a request body");
+      }
+    } else {
+      // for empty body
+      builder.setEntity(new StringEntity("", contentTypeObj));
+    }
+
+    try (CloseableHttpResponse response = httpClient.execute(builder.build(), context)) {
+      return processResponse(response, returnType);
+    } catch (IOException e) {
+      throw new ApiException(e);
+    }
+  }
+
+  /**
+   * Update query and header parameters based on authentication settings.
+   *
+   * @param authNames The authentications to apply
+   * @param queryParams Query parameters
+   * @param headerParams Header parameters
+   * @param cookieParams Cookie parameters
+   */
+  private void updateParamsForAuth(String[] authNames, List<Pair> queryParams, Map<String, String> headerParams, Map<String, String> cookieParams) {
+    for (String authName : authNames) {
+      Authentication auth = authentications.get(authName);
+      if (auth == null) throw new RuntimeException("Authentication undefined: " + authName);
+      auth.applyToParams(queryParams, headerParams, cookieParams);
+    }
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java
new file mode 100644
index 0000000000..0ba36e4edf
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ApiException.java
@@ -0,0 +1,119 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+import java.util.List;
+import java.util.Map;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class ApiException extends Exception {
+    private int code = 0;
+    private Map<String, List<String>> responseHeaders = null;
+    private String responseBody = null;
+
+    public ApiException() {}
+
+    public ApiException(Throwable throwable) {
+        super(throwable);
+    }
+
+    public ApiException(String message) {
+        super(message);
+    }
+
+    public ApiException(String message, Throwable throwable, int code, Map<String, List<String>> responseHeaders, String responseBody) {
+        super(message, throwable);
+        this.code = code;
+        this.responseHeaders = responseHeaders;
+        this.responseBody = responseBody;
+    }
+
+    public ApiException(String message, int code, Map<String, List<String>> responseHeaders, String responseBody) {
+        this(message, (Throwable) null, code, responseHeaders, responseBody);
+    }
+
+    public ApiException(String message, Throwable throwable, int code, Map<String, List<String>> responseHeaders) {
+        this(message, throwable, code, responseHeaders, null);
+    }
+
+    public ApiException(int code, Map<String, List<String>> responseHeaders, String responseBody) {
+        this("Response Code: " + code + " Response Body: " + responseBody, (Throwable) null, code, responseHeaders, responseBody);
+    }
+
+    public ApiException(int code, String message) {
+        super(message);
+        this.code = code;
+    }
+
+    public ApiException(int code, String message, Map<String, List<String>> responseHeaders, String responseBody) {
+        this(code, message);
+        this.responseHeaders = responseHeaders;
+        this.responseBody = responseBody;
+    }
+
+    /**
+     * Get the HTTP status code.
+     *
+     * @return HTTP status code
+     */
+    public int getCode() {
+        return code;
+    }
+
+    /**
+     * Get the HTTP response headers.
+     *
+     * @return A map of list of string
+     */
+    public Map<String, List<String>> getResponseHeaders() {
+        return responseHeaders;
+    }
+
+    /**
+     * Get the HTTP response body.
+     *
+     * @return Response body in the form of string
+     */
+    public String getResponseBody() {
+        return responseBody;
+    }
+
+    @Override
+    public String toString() {
+        return "ApiException{" +
+                "code=" + code +
+                ", responseHeaders=" + responseHeaders +
+                ", responseBody='" + responseBody + '\'' +
+                '}';
+    }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java
new file mode 100644
index 0000000000..f47763e31b
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Configuration.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class Configuration {
+    private static ApiClient defaultApiClient = new ApiClient();
+
+    /**
+     * Get the default API client, which would be used when creating API
+     * instances without providing an API client.
+     *
+     * @return Default API client
+     */
+    public static ApiClient getDefaultApiClient() {
+        return defaultApiClient;
+    }
+
+    /**
+     * Set the default API client, which would be used when creating API
+     * instances without providing an API client.
+     *
+     * @param apiClient API client
+     */
+    public static void setDefaultApiClient(ApiClient apiClient) {
+        defaultApiClient = apiClient;
+    }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java
new file mode 100644
index 0000000000..2818715a07
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/JavaTimeFormatter.java
@@ -0,0 +1,83 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+import java.time.OffsetDateTime;
+import java.time.format.DateTimeFormatter;
+import java.time.format.DateTimeParseException;
+
+/**
+ * Class that add parsing/formatting support for Java 8+ {@code OffsetDateTime} class.
+ * It's generated for java clients when {@code AbstractJavaCodegen#dateLibrary} specified as {@code java8}.
+ */
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class JavaTimeFormatter {
+
+    private DateTimeFormatter offsetDateTimeFormatter = DateTimeFormatter.ISO_OFFSET_DATE_TIME;
+
+    /**
+     * Get the date format used to parse/format {@code OffsetDateTime} parameters.
+     * @return DateTimeFormatter
+     */
+    public DateTimeFormatter getOffsetDateTimeFormatter() {
+        return offsetDateTimeFormatter;
+    }
+
+    /**
+     * Set the date format used to parse/format {@code OffsetDateTime} parameters.
+     * @param offsetDateTimeFormatter {@code DateTimeFormatter}
+     */
+    public void setOffsetDateTimeFormatter(DateTimeFormatter offsetDateTimeFormatter) {
+        this.offsetDateTimeFormatter = offsetDateTimeFormatter;
+    }
+
+    /**
+     * Parse the given string into {@code OffsetDateTime} object.
+     * @param str String
+     * @return {@code OffsetDateTime}
+     */
+    public OffsetDateTime parseOffsetDateTime(String str) {
+        try {
+            return OffsetDateTime.parse(str, offsetDateTimeFormatter);
+        } catch (DateTimeParseException e) {
+            throw new RuntimeException(e);
+        }
+    }
+    /**
+     * Format the given {@code OffsetDateTime} object into string.
+     * @param offsetDateTime {@code OffsetDateTime}
+     * @return {@code OffsetDateTime} in string format
+     */
+    public String formatOffsetDateTime(OffsetDateTime offsetDateTime) {
+        return offsetDateTimeFormatter.format(offsetDateTime);
+    }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java
new file mode 100644
index 0000000000..cbd78240ec
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/Pair.java
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class Pair {
+    private String name = "";
+    private String value = "";
+
+    public Pair (String name, String value) {
+        setName(name);
+        setValue(value);
+    }
+
+    private void setName(String name) {
+        if (!isValidString(name)) {
+            return;
+        }
+
+        this.name = name;
+    }
+
+    private void setValue(String value) {
+        if (!isValidString(value)) {
+            return;
+        }
+
+        this.value = value;
+    }
+
+    public String getName() {
+        return this.name;
+    }
+
+    public String getValue() {
+        return this.value;
+    }
+
+    private boolean isValidString(String arg) {
+        if (arg == null) {
+            return false;
+        }
+
+        return true;
+    }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java
new file mode 100644
index 0000000000..4c38af5131
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/RFC3339DateFormat.java
@@ -0,0 +1,76 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+import com.fasterxml.jackson.databind.util.StdDateFormat;
+
+import java.text.DateFormat;
+import java.text.DecimalFormat;
+import java.text.FieldPosition;
+import java.text.ParsePosition;
+import java.util.Date;
+import java.util.GregorianCalendar;
+import java.util.TimeZone;
+
+public class RFC3339DateFormat extends DateFormat {
+  private static final long serialVersionUID = 1L;
+  private static final TimeZone TIMEZONE_Z = TimeZone.getTimeZone("UTC");
+
+  private final StdDateFormat fmt = new StdDateFormat()
+          .withTimeZone(TIMEZONE_Z)
+          .withColonInTimeZone(true);
+
+  public RFC3339DateFormat() {
+    this.calendar = new GregorianCalendar();
+    this.numberFormat = new DecimalFormat();
+  }
+
+  @Override
+  public Date parse(String source) {
+    return parse(source, new ParsePosition(0));
+  }
+
+  @Override
+  public Date parse(String source, ParsePosition pos) {
+    return fmt.parse(source, pos);
+  }
+
+  @Override
+  public StringBuffer format(Date date, StringBuffer toAppendTo, FieldPosition fieldPosition) {
+    return fmt.format(date, toAppendTo, fieldPosition);
+  }
+
+  @Override
+  public Object clone() {
+    return super.clone();
+  }
+}
\ No newline at end of file
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java
new file mode 100644
index 0000000000..670cc07f26
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerConfiguration.java
@@ -0,0 +1,77 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   https://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied.  See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+import java.util.Map;
+
+/**
+ * Representing a Server configuration.
+ */
+public class ServerConfiguration {
+    public String URL;
+    public String description;
+    public Map<String, ServerVariable> variables;
+
+    /**
+     * @param URL A URL to the target host.
+     * @param description A description of the host designated by the URL.
+     * @param variables A map between a variable name and its value. The value is used for substitution in the server's URL template.
+     */
+    public ServerConfiguration(String URL, String description, Map<String, ServerVariable> variables) {
+        this.URL = URL;
+        this.description = description;
+        this.variables = variables;
+    }
+
+    /**
+     * Format URL template using given variables.
+     *
+     * @param variables A map between a variable name and its value.
+     * @return Formatted URL.
+     */
+    public String URL(Map<String, String> variables) {
+        String url = this.URL;
+
+        // go through variables and replace placeholders
+        for (Map.Entry<String, ServerVariable> variable: this.variables.entrySet()) {
+            String name = variable.getKey();
+            ServerVariable serverVariable = variable.getValue();
+            String value = serverVariable.defaultValue;
+
+            if (variables != null && variables.containsKey(name)) {
+                value = variables.get(name);
+                if (serverVariable.enumValues.size() > 0 && !serverVariable.enumValues.contains(value)) {
+                    throw new IllegalArgumentException("The variable " + name + " in the server URL has invalid value " + value + ".");
+                }
+            }
+            url = url.replace("{" + name + "}", value);
+        }
+        return url;
+    }
+
+    /**
+     * Format URL template using default server variables.
+     *
+     * @return Formatted URL.
+     */
+    public String URL() {
+        return URL(null);
+    }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java
new file mode 100644
index 0000000000..66554e2e6c
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/ServerVariable.java
@@ -0,0 +1,42 @@
+/*
+ * 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.ctrlx.readwrite.rest.datalayer;
+
+import java.util.HashSet;
+
+/**
+ * Representing a Server Variable for server URL template substitution.
+ */
+public class ServerVariable {
+    public String description;
+    public String defaultValue;
+    public HashSet<String> enumValues = null;
+
+    /**
+     * @param description A description for the server variable.
+     * @param defaultValue The default value to use for substitution.
+     * @param enumValues An enumeration of string values to be used if the substitution options are from a limited set.
+     */
+    public ServerVariable(String description, String defaultValue, HashSet<String> enumValues) {
+        this.description = description;
+        this.defaultValue = defaultValue;
+        this.enumValues = enumValues;
+    }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java
new file mode 100644
index 0000000000..fbb78cd37e
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/StringUtil.java
@@ -0,0 +1,102 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer;
+
+import java.util.Collection;
+import java.util.Iterator;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class StringUtil {
+  /**
+   * Check if the given array contains the given value (with case-insensitive comparison).
+   *
+   * @param array The array
+   * @param value The value to search
+   * @return true if the array contains the value
+   */
+  public static boolean containsIgnoreCase(String[] array, String value) {
+    for (String str : array) {
+      if (value == null && str == null) {
+        return true;
+      }
+      if (value != null && value.equalsIgnoreCase(str)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  /**
+   * Join an array of strings with the given separator.
+   * <p>
+   * Note: This might be replaced by utility method from commons-lang or guava someday
+   * if one of those libraries is added as dependency.
+   * </p>
+   *
+   * @param array     The array of strings
+   * @param separator The separator
+   * @return the resulting string
+   */
+  public static String join(String[] array, String separator) {
+    int len = array.length;
+    if (len == 0) {
+      return "";
+    }
+
+    StringBuilder out = new StringBuilder();
+    out.append(array[0]);
+    for (int i = 1; i < len; i++) {
+      out.append(separator).append(array[i]);
+    }
+    return out.toString();
+  }
+
+  /**
+   * Join a list of strings with the given separator.
+   *
+   * @param list      The list of strings
+   * @param separator The separator
+   * @return the resulting string
+   */
+  public static String join(Collection<String> list, String separator) {
+    Iterator<String> iterator = list.iterator();
+    StringBuilder out = new StringBuilder();
+    if (iterator.hasNext()) {
+      out.append(iterator.next());
+    }
+    while (iterator.hasNext()) {
+      out.append(separator).append(iterator.next());
+    }
+    return out.toString();
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java
new file mode 100644
index 0000000000..9456d4569b
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/BulkAccessApi.java
@@ -0,0 +1,119 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.BulkRequestInner;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.BulkResponseInner;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class BulkAccessApi {
+  private ApiClient apiClient;
+
+  public BulkAccessApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public BulkAccessApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Access to multiple datalayer nodes
+   * Requests to multiple datalayer nodes with one request
+   * @param type  (optional, default to read)
+   * @param bulkRequestInner The data for the bulk request (optional
+   * @return List&lt;BulkResponseInner&gt;
+   * @throws ApiException if fails to make API call
+   */
+  public List<BulkResponseInner> bulkRequest(String type, List<BulkRequestInner> bulkRequestInner) throws ApiException {
+    Object localVarPostBody = bulkRequestInner;
+    
+    // create path and map variables
+    String localVarPath = "/bulk";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    localVarQueryParams.addAll(apiClient.parameterToPair("type", type));
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<List<BulkResponseInner>> localVarReturnType = new TypeReference<List<BulkResponseInner>>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "PUT",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java
new file mode 100644
index 0000000000..1e0705fdfb
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/DataLayerInformationAndSettingsApi.java
@@ -0,0 +1,326 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.BrowseData;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.DLString;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.ServerSettings;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class DataLayerInformationAndSettingsApi {
+  private ApiClient apiClient;
+
+  public DataLayerInformationAndSettingsApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public DataLayerInformationAndSettingsApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Data Layer Server Settings
+   * 
+   * @return ServerSettings
+   * @throws ApiException if fails to make API call
+   */
+  public ServerSettings getDatalayerServerSettings() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/server/settings";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<ServerSettings> localVarReturnType = new TypeReference<ServerSettings>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * List of registered non-realtime data (Data Layer NRT) node names
+   * List of registered non-realtime data (Data Layer NRT) node names.
+   * @return BrowseData
+   * @throws ApiException if fails to make API call
+   */
+  public BrowseData getNodeNames() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/nodes";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<BrowseData> localVarReturnType = new TypeReference<BrowseData>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Public key for Data Layer communication
+   * The public key used for secure Data Layer communication.
+   * @return DLString
+   * @throws ApiException if fails to make API call
+   */
+  public DLString getPublicKey() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/curvemq/publickey";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLString> localVarReturnType = new TypeReference<DLString>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * List of registered realtime data (Data Layer RT) node names
+   * List of registered realtime data (Data Layer RT) node names.
+   * @return BrowseData
+   * @throws ApiException if fails to make API call
+   */
+  public BrowseData getRealtimeNodeNames() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/nodesrt";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<BrowseData> localVarReturnType = new TypeReference<BrowseData>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Change Data Layer Server Settings
+   * Change Data Layer Server Settings. For debug purposes of provider it&#39;s necessary to increase timeout values to prevent a provider to be disconnected from broker.
+   * @param serverSettings The data of the new node (optional)
+   * @return ServerSettings
+   * @throws ApiException if fails to make API call
+   */
+  public ServerSettings putDatalayerServerSettings(ServerSettings serverSettings) throws ApiException {
+    Object localVarPostBody = serverSettings;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/server/settings";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<ServerSettings> localVarReturnType = new TypeReference<ServerSettings>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "PUT",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java
new file mode 100644
index 0000000000..5c6f0eb6ed
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/NodesApi.java
@@ -0,0 +1,298 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.Data;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.ReadNode200Response;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class NodesApi {
+  private ApiClient apiClient;
+
+  public NodesApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public NodesApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Execute a create operation on a node
+   * Execute a create operation on a path. The values for the new node are posted as payload.
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @param data The data for the create operation (optional)
+   * @throws ApiException if fails to make API call
+   */
+  public void createNode(String path, Data data) throws ApiException {
+    Object localVarPostBody = data;
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling createNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/{Path}"
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "POST",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Execute a delete operation on a node
+   * Execute a delete operation on a node. Not every node is deletable.
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @throws ApiException if fails to make API call
+   */
+  public void deleteNode(String path) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling deleteNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/{Path}"
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "DELETE",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Execute a read operation on a node to get data
+   * Returns the data, browse-information or metadata of a requested node. Depends on the query parameter.
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @param type  (optional, default to null)
+   * @return ReadNode200Response
+   * @throws ApiException if fails to make API call
+   */
+  public ReadNode200Response readNode(String path, String type) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling readNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/{Path}"
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    localVarQueryParams.addAll(apiClient.parameterToPair("type", type));
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<ReadNode200Response> localVarReturnType = new TypeReference<ReadNode200Response>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Execute a write operation on a node to change data
+   * Execute a write operation. The written values are posted as payload.
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @param data The data of the node to be updated or the data of the command to be executed. (optional)
+   * @throws ApiException if fails to make API call
+   */
+  public void writeNode(String path, Data data) throws ApiException {
+    Object localVarPostBody = data;
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling writeNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/{Path}"
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "PUT",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java
new file mode 100644
index 0000000000..2f3af751c5
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RemotesApi.java
@@ -0,0 +1,497 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.CreateRemoteRequest;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.Data;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.ReadNode200Response;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.RemoteConfig;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class RemotesApi {
+  private ApiClient apiClient;
+
+  public RemotesApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public RemotesApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Creates an access to a remote Data Layer
+   * By adding a remote Data Layer, the content of the Data Layer is mapped into the address space of the current Data Layer. Requests are forwarded to the remote Data Layer.
+   * @param createRemoteRequest Desciption of new remote connection (optional)
+   * @return RemoteConfig
+   * @throws ApiException if fails to make API call
+   */
+  public RemoteConfig createRemote(CreateRemoteRequest createRemoteRequest) throws ApiException {
+    Object localVarPostBody = createRemoteRequest;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/devices/remotes";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<RemoteConfig> localVarReturnType = new TypeReference<RemoteConfig>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "POST",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Execute a create operation on a remote Data Layer
+   * Execute a create operation on a remote node. The values for the new node are posted as payload.
+   * @param remoteName The name of the remote (required)
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @param data The data for the create operation (optional)
+   * @throws ApiException if fails to make API call
+   */
+  public void createRemoteNode(String remoteName, String path, Data data) throws ApiException {
+    Object localVarPostBody = data;
+    
+    // verify the required parameter 'remoteName' is set
+    if (remoteName == null) {
+      throw new ApiException(400, "Missing the required parameter 'remoteName' when calling createRemoteNode");
+    }
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling createRemoteNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/devices/remotes/{RemoteName}/{Path}"
+      .replaceAll("\\{" + "RemoteName" + "\\}", apiClient.escapeString(remoteName.toString()))
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "POST",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Delete a remote configuration
+   * Delete a remote configuration.
+   * @param remoteName The name of the remote (required)
+   * @throws ApiException if fails to make API call
+   */
+  public void deleteRemoteConfig(String remoteName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'remoteName' is set
+    if (remoteName == null) {
+      throw new ApiException(400, "Missing the required parameter 'remoteName' when calling deleteRemoteConfig");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/devices/remotes/{RemoteName}"
+      .replaceAll("\\{" + "RemoteName" + "\\}", apiClient.escapeString(remoteName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "DELETE",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Execute a delete operation on a remote Data Layer
+   * Execute a delete operation on a remote Data Layer.
+   * @param remoteName The name of the remote (required)
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @throws ApiException if fails to make API call
+   */
+  public void deleteRemoteNode(String remoteName, String path) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'remoteName' is set
+    if (remoteName == null) {
+      throw new ApiException(400, "Missing the required parameter 'remoteName' when calling deleteRemoteNode");
+    }
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling deleteRemoteNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/devices/remotes/{RemoteName}/{Path}"
+      .replaceAll("\\{" + "RemoteName" + "\\}", apiClient.escapeString(remoteName.toString()))
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "DELETE",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Access the remote configuration
+   * Access the remote configuration.
+   * @param remoteName The name of the remote (required)
+   * @return RemoteConfig
+   * @throws ApiException if fails to make API call
+   */
+  public RemoteConfig getRemote(String remoteName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'remoteName' is set
+    if (remoteName == null) {
+      throw new ApiException(400, "Missing the required parameter 'remoteName' when calling getRemote");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/devices/remotes/{RemoteName}"
+      .replaceAll("\\{" + "RemoteName" + "\\}", apiClient.escapeString(remoteName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<RemoteConfig> localVarReturnType = new TypeReference<RemoteConfig>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Execute a read operation to get data from a remote Data Layer
+   * Returns the data, browse-information or metadata of a requested node. Depends on the query parameter.
+   * @param remoteName The name of the remote (required)
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @param type  (optional, default to null)
+   * @return ReadNode200Response
+   * @throws ApiException if fails to make API call
+   */
+  public ReadNode200Response readRemoteNode(String remoteName, String path, String type) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'remoteName' is set
+    if (remoteName == null) {
+      throw new ApiException(400, "Missing the required parameter 'remoteName' when calling readRemoteNode");
+    }
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling readRemoteNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/devices/remotes/{RemoteName}/{Path}"
+      .replaceAll("\\{" + "RemoteName" + "\\}", apiClient.escapeString(remoteName.toString()))
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    localVarQueryParams.addAll(apiClient.parameterToPair("type", type));
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<ReadNode200Response> localVarReturnType = new TypeReference<ReadNode200Response>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Execute a write operation on a remote Data Layer
+   * Execute a write operation. The written values are posted as payload.
+   * @param remoteName The name of the remote (required)
+   * @param path The path is a string which contains the full access path in the data layer tree. The sub elements in the path are separated by &#39;/&#39;. To query the root node use &#39;/&#39; as path. (required)
+   * @param data The data of the node to be updated or the data of the command to be executed. (optional)
+   * @throws ApiException if fails to make API call
+   */
+  public void writeRemoteNode(String remoteName, String path, Data data) throws ApiException {
+    Object localVarPostBody = data;
+    
+    // verify the required parameter 'remoteName' is set
+    if (remoteName == null) {
+      throw new ApiException(400, "Missing the required parameter 'remoteName' when calling writeRemoteNode");
+    }
+    
+    // verify the required parameter 'path' is set
+    if (path == null) {
+      throw new ApiException(400, "Missing the required parameter 'path' when calling writeRemoteNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/devices/remotes/{RemoteName}/{Path}"
+      .replaceAll("\\{" + "RemoteName" + "\\}", apiClient.escapeString(remoteName.toString()))
+      .replaceAll("\\{" + "Path" + "\\}", apiClient.escapeString(path.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "PUT",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java
new file mode 100644
index 0000000000..ffd2aa9ad4
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/RetainMemoryApi.java
@@ -0,0 +1,651 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.DLString;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.DLUInt32;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.Memory;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.RetainStats;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class RetainMemoryApi {
+  private ApiClient apiClient;
+
+  public RetainMemoryApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public RetainMemoryApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Create a new retain memory chunk
+   * Create a new retain memory chunk. The values for the new chunk are posted as payload. Chunk will survive reboot.
+   * @param memory Desciption of new chunk (optional)
+   * @return Memory
+   * @throws ApiException if fails to make API call
+   */
+  public Memory createRetainChunk(Memory memory) throws ApiException {
+    Object localVarPostBody = memory;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/chunks";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<Memory> localVarReturnType = new TypeReference<Memory>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "POST",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Delete a retain memory chunk
+   * Delete a retain memory chunk. Memory is not available after reboot anymore.
+   * @param chunkName The ChunkName is a string which contains the name of the chunk. (required)
+   * @throws ApiException if fails to make API call
+   */
+  public void deleteRetainChunk(String chunkName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'chunkName' is set
+    if (chunkName == null) {
+      throw new ApiException(400, "Missing the required parameter 'chunkName' when calling deleteRetainChunk");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/chunks/{ChunkName}"
+      .replaceAll("\\{" + "ChunkName" + "\\}", apiClient.escapeString(chunkName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "DELETE",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Get information about a retain memory chunk
+   * Get information about a retain memory chunk.
+   * @param chunkName The ChunkName is a string which contains the name of the chunk. (required)
+   * @return Memory
+   * @throws ApiException if fails to make API call
+   */
+  public Memory getRetainChunk(String chunkName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'chunkName' is set
+    if (chunkName == null) {
+      throw new ApiException(400, "Missing the required parameter 'chunkName' when calling getRetainChunk");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/chunks/{ChunkName}"
+      .replaceAll("\\{" + "ChunkName" + "\\}", apiClient.escapeString(chunkName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<Memory> localVarReturnType = new TypeReference<Memory>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statitics
+   * Biggest Free, Free, Used, and Total (Unit Byte).
+   * @return RetainStats
+   * @throws ApiException if fails to make API call
+   */
+  public RetainStats getRetainStats() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<RetainStats> localVarReturnType = new TypeReference<RetainStats>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statitics - biggest free
+   * Biggest free chunk of memory in bytes.
+   * @return DLUInt32
+   * @throws ApiException if fails to make API call
+   */
+  public DLUInt32 getRetainStatsBiggestFree() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats/biggest-free";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLUInt32> localVarReturnType = new TypeReference<DLUInt32>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statitics - free
+   * Total size of free memory in bytes.
+   * @return DLUInt32
+   * @throws ApiException if fails to make API call
+   */
+  public DLUInt32 getRetainStatsFree() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats/free";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLUInt32> localVarReturnType = new TypeReference<DLUInt32>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statistics - info
+   * Detailed information about the NvRam.
+   * @return DLString
+   * @throws ApiException if fails to make API call
+   */
+  public DLString getRetainStatsInfo() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats/info";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLString> localVarReturnType = new TypeReference<DLString>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statistics - last used
+   * Last used byte offset of nvram memory.
+   * @return DLUInt32
+   * @throws ApiException if fails to make API call
+   */
+  public DLUInt32 getRetainStatsLastUsed() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats/last-used";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLUInt32> localVarReturnType = new TypeReference<DLUInt32>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statistics - sync counter
+   * Count of synchronization to hardware NvRam.
+   * @return DLUInt32
+   * @throws ApiException if fails to make API call
+   */
+  public DLUInt32 getRetainStatsSyncCounter() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats/sync-counter";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLUInt32> localVarReturnType = new TypeReference<DLUInt32>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statitics - total
+   * Total size of memory in bytes
+   * @return DLUInt32
+   * @throws ApiException if fails to make API call
+   */
+  public DLUInt32 getRetainStatsTotal() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats/total";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLUInt32> localVarReturnType = new TypeReference<DLUInt32>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Retain Data Statitics - used
+   * Used memory in bytes.
+   * @return DLUInt32
+   * @throws ApiException if fails to make API call
+   */
+  public DLUInt32 getRetainStatsUsed() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/retain/stats/used";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLUInt32> localVarReturnType = new TypeReference<DLUInt32>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java
new file mode 100644
index 0000000000..27a5fab40b
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionInformationAndSettingsApi.java
@@ -0,0 +1,369 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.DLARString;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.SubscriptionData;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.SubscriptionProperties;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.SubscriptionSettings;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class SubscriptionInformationAndSettingsApi {
+  private ApiClient apiClient;
+
+  public SubscriptionInformationAndSettingsApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public SubscriptionInformationAndSettingsApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Get all information about a subscription
+   * Get all information about a subscription. It contains subscribed nodes and subscription properties.
+   * @param clientName The ClientName is a string which contains the identification of the client. (required)
+   * @param subscriptionName The SubscriptionName is a string which contains the identification of the subscription. (required)
+   * @return SubscriptionData
+   * @throws ApiException if fails to make API call
+   */
+  public SubscriptionData getClientSubscription(String clientName, String subscriptionName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'clientName' is set
+    if (clientName == null) {
+      throw new ApiException(400, "Missing the required parameter 'clientName' when calling getClientSubscription");
+    }
+    
+    // verify the required parameter 'subscriptionName' is set
+    if (subscriptionName == null) {
+      throw new ApiException(400, "Missing the required parameter 'subscriptionName' when calling getClientSubscription");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/subscriptions/clients/{ClientName}/subscriptions/{SubscriptionName}"
+      .replaceAll("\\{" + "ClientName" + "\\}", apiClient.escapeString(clientName.toString()))
+      .replaceAll("\\{" + "SubscriptionName" + "\\}", apiClient.escapeString(subscriptionName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<SubscriptionData> localVarReturnType = new TypeReference<SubscriptionData>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Get list of subscribed nodes for this client and subscription
+   * Get list of subscribed nodes for this client and subscription.
+   * @param clientName The ClientName is a string which contains the identification of the client. (required)
+   * @param subscriptionName The SubscriptionName is a string which contains the identification of the subscription. (required)
+   * @return DLARString
+   * @throws ApiException if fails to make API call
+   */
+  public DLARString getClientSubscriptionNodes(String clientName, String subscriptionName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'clientName' is set
+    if (clientName == null) {
+      throw new ApiException(400, "Missing the required parameter 'clientName' when calling getClientSubscriptionNodes");
+    }
+    
+    // verify the required parameter 'subscriptionName' is set
+    if (subscriptionName == null) {
+      throw new ApiException(400, "Missing the required parameter 'subscriptionName' when calling getClientSubscriptionNodes");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/subscriptions/clients/{ClientName}/subscriptions/{SubscriptionName}/nodes"
+      .replaceAll("\\{" + "ClientName" + "\\}", apiClient.escapeString(clientName.toString()))
+      .replaceAll("\\{" + "SubscriptionName" + "\\}", apiClient.escapeString(subscriptionName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<DLARString> localVarReturnType = new TypeReference<DLARString>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Get properties for this client and subscription.
+   * Get properties for this client and subscription.
+   * @param clientName The ClientName is a string which contains the identification of the client. (required)
+   * @param subscriptionName The SubscriptionName is a string which contains the identification of the subscription. (required)
+   * @return SubscriptionProperties
+   * @throws ApiException if fails to make API call
+   */
+  public SubscriptionProperties getClientSubscriptionProperties(String clientName, String subscriptionName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'clientName' is set
+    if (clientName == null) {
+      throw new ApiException(400, "Missing the required parameter 'clientName' when calling getClientSubscriptionProperties");
+    }
+    
+    // verify the required parameter 'subscriptionName' is set
+    if (subscriptionName == null) {
+      throw new ApiException(400, "Missing the required parameter 'subscriptionName' when calling getClientSubscriptionProperties");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/subscriptions/clients/{ClientName}/subscriptions/{SubscriptionName}/properties"
+      .replaceAll("\\{" + "ClientName" + "\\}", apiClient.escapeString(clientName.toString()))
+      .replaceAll("\\{" + "SubscriptionName" + "\\}", apiClient.escapeString(subscriptionName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<SubscriptionProperties> localVarReturnType = new TypeReference<SubscriptionProperties>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Data Layer Subscriptions - Global Settings
+   * Global settings for Data Layer subscriptions.
+   * @return SubscriptionSettings
+   * @throws ApiException if fails to make API call
+   */
+  public SubscriptionSettings getSubscriptionSettings() throws ApiException {
+    Object localVarPostBody = null;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/subscriptions/settings";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<SubscriptionSettings> localVarReturnType = new TypeReference<SubscriptionSettings>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Sets Data Layer Subscriptions - Global Settings
+   * Sets global settings for Data Layer subscriptions. Global settings change will not affect existing subscriptions.
+   * @param subscriptionSettings New global subscription settings. (optional)
+   * @return SubscriptionSettings
+   * @throws ApiException if fails to make API call
+   */
+  public SubscriptionSettings setSubscriptionSettings(SubscriptionSettings subscriptionSettings) throws ApiException {
+    Object localVarPostBody = subscriptionSettings;
+    
+    // create path and map variables
+    String localVarPath = "/nodes/datalayer/subscriptions/settings";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<SubscriptionSettings> localVarReturnType = new TypeReference<SubscriptionSettings>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "PUT",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java
new file mode 100644
index 0000000000..fd538a6560
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/SubscriptionsApi.java
@@ -0,0 +1,351 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.ChangeSubscriptionRequest;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.CreateSubscriptionRequest;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.SSEEvent;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class SubscriptionsApi {
+  private ApiClient apiClient;
+
+  public SubscriptionsApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public SubscriptionsApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Change node list of existing subscription.
+   * Change node list of existing subscription. All opened SSE connections for this subscription are changed.
+   * @param subscriptionName The SubscriptionName is a string which contains the identification of the subscription. (required)
+   * @param changeSubscriptionRequest The data for the new subscription (optional)
+   * @throws ApiException if fails to make API call
+   */
+  public void changeSubscription(String subscriptionName, ChangeSubscriptionRequest changeSubscriptionRequest) throws ApiException {
+    Object localVarPostBody = changeSubscriptionRequest;
+    
+    // verify the required parameter 'subscriptionName' is set
+    if (subscriptionName == null) {
+      throw new ApiException(400, "Missing the required parameter 'subscriptionName' when calling changeSubscription");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/events/{SubscriptionName}"
+      .replaceAll("\\{" + "SubscriptionName" + "\\}", apiClient.escapeString(subscriptionName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "PUT",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Create a new subscription as separate resource
+   * Create a new subscription. You can later make GET request on this created subscription to start the subscription. If subscription is not used within one minute, subscription will be deleted automatically. You can start a created subscription multiple times. &lt;br&gt;&lt;br&gt; To create a subscription in this way allows to setup more complex settings within the subscription (queueing, data change filter, ...).
+   * @param createSubscriptionRequest The data for the new subscription (optional)
+   * @throws ApiException if fails to make API call
+   */
+  public void createSubscription(CreateSubscriptionRequest createSubscriptionRequest) throws ApiException {
+    Object localVarPostBody = createSubscriptionRequest;
+    
+    // create path and map variables
+    String localVarPath = "/events";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      "application/json"
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "POST",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Deletes an existing subscription resource.
+   * Deletes an existing subscription. A subscription can only be deleted if there are no open SSE connections for this SubscriptionName.
+   * @param subscriptionName The SubscriptionName is a string which contains the identification of the subscription. (required)
+   * @throws ApiException if fails to make API call
+   */
+  public void deleteSubscription(String subscriptionName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'subscriptionName' is set
+    if (subscriptionName == null) {
+      throw new ApiException(400, "Missing the required parameter 'subscriptionName' when calling deleteSubscription");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/events/{SubscriptionName}"
+      .replaceAll("\\{" + "SubscriptionName" + "\\}", apiClient.escapeString(subscriptionName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    apiClient.invokeAPI(
+        localVarPath,
+        "DELETE",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        null
+    );
+  }
+  /**
+   * Create a new subscription and starts server send event (SSE) stream.
+   * Create a new subscription and starts server send event (SSE) stream. You can specify a bunch of paths to be observed for changes. &lt;br&gt; &lt;br&gt; Unfortunately, SSE is not compatible to OpenAPI specs and can therefore not be properly specified within this API description. An SSE event contains three parts separated by linebreaks: event, id and data. Different events are separated by empty lines. The event field can be one of these types: keepalive, update, browse, metadata, er [...]
+   * @param nodes Comma sepearted list of nodes (required)
+   * @param publishIntervalMs Publish interval for notifications. Internal poll interval. (optional, default to 1000)
+   * @return List&lt;SSEEvent&gt;
+   * @throws ApiException if fails to make API call
+   */
+  public List<SSEEvent> eventsGet(String nodes, Integer publishIntervalMs) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'nodes' is set
+    if (nodes == null) {
+      throw new ApiException(400, "Missing the required parameter 'nodes' when calling eventsGet");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/events";
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    localVarQueryParams.addAll(apiClient.parameterToPair("nodes", nodes));
+    localVarQueryParams.addAll(apiClient.parameterToPair("publishIntervalMs", publishIntervalMs));
+    
+    
+    
+    final String[] localVarAccepts = {
+      "text/event-stream", "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<List<SSEEvent>> localVarReturnType = new TypeReference<List<SSEEvent>>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+  /**
+   * Starts a server send event stream (SSE) on a given subscription
+   * Starts a server send event stream (SSE) for a given subscription. You have to create this subscription before. &lt;br&gt; &lt;br&gt; Unfortunately, SSE is not compatible to OpenAPI specs and can therefore not be properly specified within this API description. An SSE event contains three parts separated by linebreaks: event, id and data. Different events are separated by empty lines. The event field can be one of these types: keepalive, update, browse, metadata, error. The data field [...]
+   * @param subscriptionName The SubscriptionName is a string which contains the identification of the subscription. (required)
+   * @return List&lt;SSEEvent&gt;
+   * @throws ApiException if fails to make API call
+   */
+  public List<SSEEvent> getCreatedSubscription(String subscriptionName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'subscriptionName' is set
+    if (subscriptionName == null) {
+      throw new ApiException(400, "Missing the required parameter 'subscriptionName' when calling getCreatedSubscription");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/events/{SubscriptionName}"
+      .replaceAll("\\{" + "SubscriptionName" + "\\}", apiClient.escapeString(subscriptionName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "text/event-stream", "application/json"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<List<SSEEvent>> localVarReturnType = new TypeReference<List<SSEEvent>>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java
new file mode 100644
index 0000000000..9f9f440cfe
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/api/TypesApi.java
@@ -0,0 +1,122 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.api;
+
+import com.fasterxml.jackson.core.type.TypeReference;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiClient;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.ApiException;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Configuration;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model.Reflection;
+
+import java.util.*;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class TypesApi {
+  private ApiClient apiClient;
+
+  public TypesApi() {
+    this(Configuration.getDefaultApiClient());
+  }
+
+  public TypesApi(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  public ApiClient getApiClient() {
+    return apiClient;
+  }
+
+  public void setApiClient(ApiClient apiClient) {
+    this.apiClient = apiClient;
+  }
+
+  /**
+   * Generic type access
+   * Returns a type definition. Types can be referenced by nodes. A type describes the layout and structure of a complex node value.
+   * @param typeName The TypeName is a string. It can be separated by &#39;/&#39; (required)
+   * @return Reflection
+   * @throws ApiException if fails to make API call
+   */
+  public Reflection readTypeNode(String typeName) throws ApiException {
+    Object localVarPostBody = null;
+    
+    // verify the required parameter 'typeName' is set
+    if (typeName == null) {
+      throw new ApiException(400, "Missing the required parameter 'typeName' when calling readTypeNode");
+    }
+    
+    // create path and map variables
+    String localVarPath = "/types/{TypeName}"
+      .replaceAll("\\{" + "TypeName" + "\\}", apiClient.escapeString(typeName.toString()));
+
+    StringJoiner localVarQueryStringJoiner = new StringJoiner("&");
+    String localVarQueryParameterBaseName;
+    List<Pair> localVarQueryParams = new ArrayList<Pair>();
+    List<Pair> localVarCollectionQueryParams = new ArrayList<Pair>();
+    Map<String, String> localVarHeaderParams = new HashMap<String, String>();
+    Map<String, String> localVarCookieParams = new HashMap<String, String>();
+    Map<String, Object> localVarFormParams = new HashMap<String, Object>();
+
+    
+    
+    
+    final String[] localVarAccepts = {
+      "application/json", "application/octet-stream", "plain/text"
+    };
+    final String localVarAccept = apiClient.selectHeaderAccept(localVarAccepts);
+
+    final String[] localVarContentTypes = {
+      
+    };
+    final String localVarContentType = apiClient.selectHeaderContentType(localVarContentTypes);
+
+    String[] localVarAuthNames = new String[] { "Bearer", "UsernamePassword" };
+
+    TypeReference<Reflection> localVarReturnType = new TypeReference<Reflection>() {};
+    return apiClient.invokeAPI(
+        localVarPath,
+        "GET",
+        localVarQueryParams,
+        localVarCollectionQueryParams,
+        localVarQueryStringJoiner.toString(),
+        localVarPostBody,
+        localVarHeaderParams,
+        localVarCookieParams,
+        localVarFormParams,
+        localVarAccept,
+        localVarContentType,
+        localVarAuthNames,
+        localVarReturnType
+    );
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java
new file mode 100644
index 0000000000..7a8d1864c5
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/ApiKeyAuth.java
@@ -0,0 +1,96 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth;
+
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+
+import java.util.List;
+import java.util.Map;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class ApiKeyAuth implements Authentication {
+  private final String location;
+  private final String paramName;
+
+  private String apiKey;
+  private String apiKeyPrefix;
+
+  public ApiKeyAuth(String location, String paramName) {
+    this.location = location;
+    this.paramName = paramName;
+  }
+
+  public String getLocation() {
+    return location;
+  }
+
+  public String getParamName() {
+    return paramName;
+  }
+
+  public String getApiKey() {
+    return apiKey;
+  }
+
+  public void setApiKey(String apiKey) {
+    this.apiKey = apiKey;
+  }
+
+  public String getApiKeyPrefix() {
+    return apiKeyPrefix;
+  }
+
+  public void setApiKeyPrefix(String apiKeyPrefix) {
+    this.apiKeyPrefix = apiKeyPrefix;
+  }
+
+  @Override
+  public void applyToParams(List<Pair> queryParams, Map<String, String> headerParams, Map<String, String> cookieParams) {
+    if (apiKey == null) {
+      return;
+    }
+    String value;
+    if (apiKeyPrefix != null) {
+      value = apiKeyPrefix + " " + apiKey;
+    } else {
+      value = apiKey;
+    }
+    if ("query".equals(location)) {
+      queryParams.add(new Pair(paramName, value));
+    } else if ("header".equals(location)) {
+      headerParams.put(paramName, value);
+    } else if ("cookie".equals(location)) {
+      cookieParams.put(paramName, value);
+    }
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java
new file mode 100644
index 0000000000..75fd125539
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/Authentication.java
@@ -0,0 +1,49 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth;
+
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+
+import java.util.List;
+import java.util.Map;
+
+public interface Authentication {
+    /**
+     * Apply authentication settings to header and query params.
+     *
+     * @param queryParams List of query parameters
+     * @param headerParams Map of header parameters
+     * @param cookieParams Map of cookie parameters
+     */
+    void applyToParams(List<Pair> queryParams, Map<String, String> headerParams, Map<String, String> cookieParams);
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java
new file mode 100644
index 0000000000..2006c50214
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBasicAuth.java
@@ -0,0 +1,71 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth;
+
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+
+import java.nio.charset.StandardCharsets;
+import java.util.Base64;
+import java.util.List;
+import java.util.Map;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class HttpBasicAuth implements Authentication {
+  private String username;
+  private String password;
+
+  public String getUsername() {
+    return username;
+  }
+
+  public void setUsername(String username) {
+    this.username = username;
+  }
+
+  public String getPassword() {
+    return password;
+  }
+
+  public void setPassword(String password) {
+    this.password = password;
+  }
+
+  @Override
+  public void applyToParams(List<Pair> queryParams, Map<String, String> headerParams, Map<String, String> cookieParams) {
+    if (username == null && password == null) {
+      return;
+    }
+    String str = (username == null ? "" : username) + ":" + (password == null ? "" : password);
+    headerParams.put("Authorization", "Basic " + Base64.getEncoder().encodeToString(str.getBytes(StandardCharsets.UTF_8)));
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java
new file mode 100644
index 0000000000..baffa98183
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/HttpBearerAuth.java
@@ -0,0 +1,79 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth;
+
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+
+import java.util.List;
+import java.util.Map;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class HttpBearerAuth implements Authentication {
+  private final String scheme;
+  private String bearerToken;
+
+  public HttpBearerAuth(String scheme) {
+    this.scheme = scheme;
+  }
+
+  /**
+   * Gets the token, which together with the scheme, will be sent as the value of the Authorization header.
+   *
+   * @return The bearer token
+   */
+  public String getBearerToken() {
+    return bearerToken;
+  }
+
+  /**
+   * Sets the token, which together with the scheme, will be sent as the value of the Authorization header.
+   *
+   * @param bearerToken The bearer token to send in the Authorization header
+   */
+  public void setBearerToken(String bearerToken) {
+    this.bearerToken = bearerToken;
+  }
+
+  @Override
+  public void applyToParams(List<Pair> queryParams, Map<String, String> headerParams, Map<String, String> cookieParams) {
+    if(bearerToken == null) {
+      return;
+    }
+
+    headerParams.put("Authorization", (scheme != null ? upperCaseBearer(scheme) + " " : "") + bearerToken);
+  }
+
+  private static String upperCaseBearer(String scheme) {
+    return ("bearer".equalsIgnoreCase(scheme)) ? "Bearer" : scheme;
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java
new file mode 100644
index 0000000000..febbe0bb01
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuth.java
@@ -0,0 +1,58 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth;
+
+import org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.Pair;
+
+import java.util.List;
+import java.util.Map;
+
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class OAuth implements Authentication {
+  private String accessToken;
+
+  public String getAccessToken() {
+    return accessToken;
+  }
+
+  public void setAccessToken(String accessToken) {
+    this.accessToken = accessToken;
+  }
+
+  @Override
+  public void applyToParams(List<Pair> queryParams, Map<String, String> headerParams, Map<String, String> cookieParams) {
+    if (accessToken != null) {
+      headerParams.put("Authorization", "Bearer " + accessToken);
+    }
+  }
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java
new file mode 100644
index 0000000000..0bc8fe0c90
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/auth/OAuthFlow.java
@@ -0,0 +1,44 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.auth;
+
+/**
+ * OAuth flows that are supported by this client
+ */
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public enum OAuthFlow {
+    ACCESS_CODE, //called authorizationCode  in OpenAPI 3.0
+    IMPLICIT,
+    PASSWORD,
+    APPLICATION //called clientCredentials in OpenAPI 3.0
+}
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java
new file mode 100644
index 0000000000..5faa0c3a95
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ARString.java
@@ -0,0 +1,220 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * JSON serialized string object.
+ */
+@JsonPropertyOrder({
+  ARString.JSON_PROPERTY_TYPE,
+  ARString.JSON_PROPERTY_VALUE
+})
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class ARString {
+  public static final String JSON_PROPERTY_TYPE = "type";
+  private String type;
+
+  public static final String JSON_PROPERTY_VALUE = "value";
+  private List<String> value = new ArrayList<>();
+
+  public ARString() {
+  }
+
+  public ARString type(String type) {
+    
+    this.type = type;
+    return this;
+  }
+
+   /**
+   * The type of the returned value
+   * @return type
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public String getType() {
+    return type;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setType(String type) {
+    this.type = type;
+  }
+
+
+  public ARString value(List<String> value) {
+    
+    this.value = value;
+    return this;
+  }
+
+  public ARString addValueItem(String valueItem) {
+    this.value.add(valueItem);
+    return this;
+  }
+
+   /**
+   * Get value
+   * @return value
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public List<String> getValue() {
+    return value;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setValue(List<String> value) {
+    this.value = value;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ARString arString = (ARString) o;
+    return Objects.equals(this.type, arString.type) &&
+        Objects.equals(this.value, arString.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(type, value);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ARString {\n");
+    sb.append("    type: ").append(toIndentedString(type)).append("\n");
+    sb.append("    value: ").append(toIndentedString(value)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `type` to the URL query string
+    if (getType() != null) {
+      try {
+        joiner.add(String.format("%stype%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getType()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `value` to the URL query string
+    if (getValue() != null) {
+      for (int i = 0; i < getValue().size(); i++) {
+        try {
+          joiner.add(String.format("%svalue%s%s=%s", prefix, suffix,
+              "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
+              URLEncoder.encode(String.valueOf(getValue().get(i)), "UTF-8").replaceAll("\\+", "%20")));
+        } catch (UnsupportedEncodingException e) {
+          // Should never happen, UTF-8 is always supported
+          throw new RuntimeException(e);
+        }
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java
new file mode 100644
index 0000000000..f28bc48514
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/AllowedOperations.java
@@ -0,0 +1,335 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * List of available operations
+ */
+@JsonPropertyOrder({
+  AllowedOperations.JSON_PROPERTY_READ,
+  AllowedOperations.JSON_PROPERTY_WRITE,
+  AllowedOperations.JSON_PROPERTY_CREATE,
+  AllowedOperations.JSON_PROPERTY_DELETE,
+  AllowedOperations.JSON_PROPERTY_BROWSE
+})
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class AllowedOperations {
+  public static final String JSON_PROPERTY_READ = "read";
+  private Boolean read;
+
+  public static final String JSON_PROPERTY_WRITE = "write";
+  private Boolean write;
+
+  public static final String JSON_PROPERTY_CREATE = "create";
+  private Boolean create;
+
+  public static final String JSON_PROPERTY_DELETE = "delete";
+  private Boolean delete;
+
+  public static final String JSON_PROPERTY_BROWSE = "browse";
+  private Boolean browse;
+
+  public AllowedOperations() {
+  }
+
+  public AllowedOperations read(Boolean read) {
+    
+    this.read = read;
+    return this;
+  }
+
+   /**
+   * Node can be read
+   * @return read
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_READ)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public Boolean getRead() {
+    return read;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_READ)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setRead(Boolean read) {
+    this.read = read;
+  }
+
+
+  public AllowedOperations write(Boolean write) {
+    
+    this.write = write;
+    return this;
+  }
+
+   /**
+   * Node can be written
+   * @return write
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_WRITE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public Boolean getWrite() {
+    return write;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_WRITE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setWrite(Boolean write) {
+    this.write = write;
+  }
+
+
+  public AllowedOperations create(Boolean create) {
+    
+    this.create = create;
+    return this;
+  }
+
+   /**
+   * Node can be created
+   * @return create
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_CREATE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public Boolean getCreate() {
+    return create;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_CREATE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setCreate(Boolean create) {
+    this.create = create;
+  }
+
+
+  public AllowedOperations delete(Boolean delete) {
+    
+    this.delete = delete;
+    return this;
+  }
+
+   /**
+   * Node can be deleted
+   * @return delete
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_DELETE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public Boolean getDelete() {
+    return delete;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_DELETE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setDelete(Boolean delete) {
+    this.delete = delete;
+  }
+
+
+  public AllowedOperations browse(Boolean browse) {
+    
+    this.browse = browse;
+    return this;
+  }
+
+   /**
+   * Node can be browsed
+   * @return browse
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_BROWSE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public Boolean getBrowse() {
+    return browse;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_BROWSE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setBrowse(Boolean browse) {
+    this.browse = browse;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    AllowedOperations allowedOperations = (AllowedOperations) o;
+    return Objects.equals(this.read, allowedOperations.read) &&
+        Objects.equals(this.write, allowedOperations.write) &&
+        Objects.equals(this.create, allowedOperations.create) &&
+        Objects.equals(this.delete, allowedOperations.delete) &&
+        Objects.equals(this.browse, allowedOperations.browse);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(read, write, create, delete, browse);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class AllowedOperations {\n");
+    sb.append("    read: ").append(toIndentedString(read)).append("\n");
+    sb.append("    write: ").append(toIndentedString(write)).append("\n");
+    sb.append("    create: ").append(toIndentedString(create)).append("\n");
+    sb.append("    delete: ").append(toIndentedString(delete)).append("\n");
+    sb.append("    browse: ").append(toIndentedString(browse)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `read` to the URL query string
+    if (getRead() != null) {
+      try {
+        joiner.add(String.format("%sread%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getRead()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `write` to the URL query string
+    if (getWrite() != null) {
+      try {
+        joiner.add(String.format("%swrite%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getWrite()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `create` to the URL query string
+    if (getCreate() != null) {
+      try {
+        joiner.add(String.format("%screate%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getCreate()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `delete` to the URL query string
+    if (getDelete() != null) {
+      try {
+        joiner.add(String.format("%sdelete%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getDelete()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `browse` to the URL query string
+    if (getBrowse() != null) {
+      try {
+        joiner.add(String.format("%sbrowse%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getBrowse()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java
new file mode 100644
index 0000000000..3490cdbaf2
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BrowseData.java
@@ -0,0 +1,223 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * Browse information about child nodes
+ */
+@JsonPropertyOrder({
+  BrowseData.JSON_PROPERTY_TYPE,
+  BrowseData.JSON_PROPERTY_VALUE
+})
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class BrowseData {
+  public static final String JSON_PROPERTY_TYPE = "type";
+  private String type;
+
+  public static final String JSON_PROPERTY_VALUE = "value";
+  private List<String> value = new ArrayList<>();
+
+  public BrowseData() {
+  }
+
+  public BrowseData type(String type) {
+    
+    this.type = type;
+    return this;
+  }
+
+   /**
+   * The type of the returned value
+   * @return type
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public String getType() {
+    return type;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setType(String type) {
+    this.type = type;
+  }
+
+
+  public BrowseData value(List<String> value) {
+    
+    this.value = value;
+    return this;
+  }
+
+  public BrowseData addValueItem(String valueItem) {
+    if (this.value == null) {
+      this.value = new ArrayList<>();
+    }
+    this.value.add(valueItem);
+    return this;
+  }
+
+   /**
+   * Array of child node names
+   * @return value
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public List<String> getValue() {
+    return value;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setValue(List<String> value) {
+    this.value = value;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    BrowseData browseData = (BrowseData) o;
+    return Objects.equals(this.type, browseData.type) &&
+        Objects.equals(this.value, browseData.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(type, value);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class BrowseData {\n");
+    sb.append("    type: ").append(toIndentedString(type)).append("\n");
+    sb.append("    value: ").append(toIndentedString(value)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `type` to the URL query string
+    if (getType() != null) {
+      try {
+        joiner.add(String.format("%stype%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getType()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `value` to the URL query string
+    if (getValue() != null) {
+      for (int i = 0; i < getValue().size(); i++) {
+        try {
+          joiner.add(String.format("%svalue%s%s=%s", prefix, suffix,
+              "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
+              URLEncoder.encode(String.valueOf(getValue().get(i)), "UTF-8").replaceAll("\\+", "%20")));
+        } catch (UnsupportedEncodingException e) {
+          // Should never happen, UTF-8 is always supported
+          throw new RuntimeException(e);
+        }
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java
new file mode 100644
index 0000000000..2307b1be51
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkRequestInner.java
@@ -0,0 +1,343 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.*;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * BulkRequestInner
+ */
+@JsonPropertyOrder({
+  BulkRequestInner.JSON_PROPERTY_ADDRESS,
+  BulkRequestInner.JSON_PROPERTY_TYPE,
+  BulkRequestInner.JSON_PROPERTY_VALUE
+})
+@JsonTypeName("BulkRequest_inner")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class BulkRequestInner {
+  public static final String JSON_PROPERTY_ADDRESS = "address";
+  private String address;
+
+  /**
+   * The type of the value
+   */
+  public enum TypeEnum {
+    BOOL8("bool8"),
+    
+    INT8("int8"),
+    
+    UINT8("uint8"),
+    
+    INT16("int16"),
+    
+    UINT16("uint16"),
+    
+    INT32("int32"),
+    
+    UINT32("uint32"),
+    
+    INT64("int64"),
+    
+    UINT64("uint64"),
+    
+    FLOAT("float"),
+    
+    DOUBLE("double"),
+    
+    FLOAT32("float32"),
+    
+    FLOAT64("float64"),
+    
+    STRING("string"),
+    
+    ARBOOL8("arbool8"),
+    
+    ARINT8("arint8"),
+    
+    ARUINT8("aruint8"),
+    
+    ARINT16("arint16"),
+    
+    ARUINT16("aruint16"),
+    
+    ARINT32("arint32"),
+    
+    ARUINT32("aruint32"),
+    
+    ARINT64("arint64"),
+    
+    ARUINT64("aruint64"),
+    
+    ARFLOAT("arfloat"),
+    
+    ARDOUBLE("ardouble"),
+    
+    ARFLOAT32("arfloat32"),
+    
+    ARFLOAT64("arfloat64"),
+    
+    ARSTRING("arstring"),
+    
+    TIMESTAMP("timestamp"),
+    
+    ARTIMESTAMP("artimestamp"),
+    
+    OBJECT("object");
+
+    private String value;
+
+    TypeEnum(String value) {
+      this.value = value;
+    }
+
+    @JsonValue
+    public String getValue() {
+      return value;
+    }
+
+    @Override
+    public String toString() {
+      return String.valueOf(value);
+    }
+
+    @JsonCreator
+    public static TypeEnum fromValue(String value) {
+      for (TypeEnum b : TypeEnum.values()) {
+        if (b.value.equals(value)) {
+          return b;
+        }
+      }
+      throw new IllegalArgumentException("Unexpected value '" + value + "'");
+    }
+  }
+
+  public static final String JSON_PROPERTY_TYPE = "type";
+  private TypeEnum type;
+
+  public static final String JSON_PROPERTY_VALUE = "value";
+  private Object value;
+
+  public BulkRequestInner() {
+  }
+
+  public BulkRequestInner address(String address) {
+    
+    this.address = address;
+    return this;
+  }
+
+   /**
+   * Requested Data Layer address
+   * @return address
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_ADDRESS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public String getAddress() {
+    return address;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_ADDRESS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setAddress(String address) {
+    this.address = address;
+  }
+
+
+  public BulkRequestInner type(TypeEnum type) {
+    
+    this.type = type;
+    return this;
+  }
+
+   /**
+   * The type of the value
+   * @return type
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public TypeEnum getType() {
+    return type;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setType(TypeEnum type) {
+    this.type = type;
+  }
+
+
+  public BulkRequestInner value(Object value) {
+    
+    this.value = value;
+    return this;
+  }
+
+   /**
+   * Value of the node
+   * @return value
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Object getValue() {
+    return value;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setValue(Object value) {
+    this.value = value;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    BulkRequestInner bulkRequestInner = (BulkRequestInner) o;
+    return Objects.equals(this.address, bulkRequestInner.address) &&
+        Objects.equals(this.type, bulkRequestInner.type) &&
+        Objects.equals(this.value, bulkRequestInner.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(address, type, value);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class BulkRequestInner {\n");
+    sb.append("    address: ").append(toIndentedString(address)).append("\n");
+    sb.append("    type: ").append(toIndentedString(type)).append("\n");
+    sb.append("    value: ").append(toIndentedString(value)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `address` to the URL query string
+    if (getAddress() != null) {
+      try {
+        joiner.add(String.format("%saddress%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getAddress()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `type` to the URL query string
+    if (getType() != null) {
+      try {
+        joiner.add(String.format("%stype%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getType()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `value` to the URL query string
+    if (getValue() != null) {
+      try {
+        joiner.add(String.format("%svalue%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getValue()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java
new file mode 100644
index 0000000000..3bfef2b63d
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/BulkResponseInner.java
@@ -0,0 +1,429 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.*;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * BulkResponseInner
+ */
+@JsonPropertyOrder({
+  BulkResponseInner.JSON_PROPERTY_ADDRESS,
+  BulkResponseInner.JSON_PROPERTY_TIMESTAMP,
+  BulkResponseInner.JSON_PROPERTY_RESULT,
+  BulkResponseInner.JSON_PROPERTY_TYPE,
+  BulkResponseInner.JSON_PROPERTY_VALUE
+})
+@JsonTypeName("BulkResponse_inner")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class BulkResponseInner {
+  public static final String JSON_PROPERTY_ADDRESS = "address";
+  private String address;
+
+  public static final String JSON_PROPERTY_TIMESTAMP = "timestamp";
+  private Integer timestamp;
+
+  public static final String JSON_PROPERTY_RESULT = "result";
+  private String result;
+
+  /**
+   * The type of the value
+   */
+  public enum TypeEnum {
+    BOOL8("bool8"),
+    
+    INT8("int8"),
+    
+    UINT8("uint8"),
+    
+    INT16("int16"),
+    
+    UINT16("uint16"),
+    
+    INT32("int32"),
+    
+    UINT32("uint32"),
+    
+    INT64("int64"),
+    
+    UINT64("uint64"),
+    
+    FLOAT("float"),
+    
+    DOUBLE("double"),
+    
+    FLOAT32("float32"),
+    
+    FLOAT64("float64"),
+    
+    STRING("string"),
+    
+    ARBOOL8("arbool8"),
+    
+    ARINT8("arint8"),
+    
+    ARUINT8("aruint8"),
+    
+    ARINT16("arint16"),
+    
+    ARUINT16("aruint16"),
+    
+    ARINT32("arint32"),
+    
+    ARUINT32("aruint32"),
+    
+    ARINT64("arint64"),
+    
+    ARUINT64("aruint64"),
+    
+    ARFLOAT("arfloat"),
+    
+    ARDOUBLE("ardouble"),
+    
+    ARFLOAT32("arfloat32"),
+    
+    ARFLOAT64("arfloat64"),
+    
+    ARSTRING("arstring"),
+    
+    TIMESTAMP("timestamp"),
+    
+    ARTIMESTAMP("artimestamp"),
+    
+    OBJECT("object"),
+    
+    ERROR("error");
+
+    private String value;
+
+    TypeEnum(String value) {
+      this.value = value;
+    }
+
+    @JsonValue
+    public String getValue() {
+      return value;
+    }
+
+    @Override
+    public String toString() {
+      return String.valueOf(value);
+    }
+
+    @JsonCreator
+    public static TypeEnum fromValue(String value) {
+      for (TypeEnum b : TypeEnum.values()) {
+        if (b.value.equals(value)) {
+          return b;
+        }
+      }
+      throw new IllegalArgumentException("Unexpected value '" + value + "'");
+    }
+  }
+
+  public static final String JSON_PROPERTY_TYPE = "type";
+  private TypeEnum type;
+
+  public static final String JSON_PROPERTY_VALUE = "value";
+  private Object value;
+
+  public BulkResponseInner() {
+  }
+
+  public BulkResponseInner address(String address) {
+    
+    this.address = address;
+    return this;
+  }
+
+   /**
+   * Requested Data Layer address
+   * @return address
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_ADDRESS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public String getAddress() {
+    return address;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_ADDRESS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setAddress(String address) {
+    this.address = address;
+  }
+
+
+  public BulkResponseInner timestamp(Integer timestamp) {
+    
+    this.timestamp = timestamp;
+    return this;
+  }
+
+   /**
+   * Timestamp of request of this entry
+   * @return timestamp
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_TIMESTAMP)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getTimestamp() {
+    return timestamp;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_TIMESTAMP)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setTimestamp(Integer timestamp) {
+    this.timestamp = timestamp;
+  }
+
+
+  public BulkResponseInner result(String result) {
+    
+    this.result = result;
+    return this;
+  }
+
+   /**
+   * Result of this request
+   * @return result
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_RESULT)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public String getResult() {
+    return result;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_RESULT)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setResult(String result) {
+    this.result = result;
+  }
+
+
+  public BulkResponseInner type(TypeEnum type) {
+    
+    this.type = type;
+    return this;
+  }
+
+   /**
+   * The type of the value
+   * @return type
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public TypeEnum getType() {
+    return type;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setType(TypeEnum type) {
+    this.type = type;
+  }
+
+
+  public BulkResponseInner value(Object value) {
+    
+    this.value = value;
+    return this;
+  }
+
+   /**
+   * Value of the node
+   * @return value
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Object getValue() {
+    return value;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setValue(Object value) {
+    this.value = value;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    BulkResponseInner bulkResponseInner = (BulkResponseInner) o;
+    return Objects.equals(this.address, bulkResponseInner.address) &&
+        Objects.equals(this.timestamp, bulkResponseInner.timestamp) &&
+        Objects.equals(this.result, bulkResponseInner.result) &&
+        Objects.equals(this.type, bulkResponseInner.type) &&
+        Objects.equals(this.value, bulkResponseInner.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(address, timestamp, result, type, value);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class BulkResponseInner {\n");
+    sb.append("    address: ").append(toIndentedString(address)).append("\n");
+    sb.append("    timestamp: ").append(toIndentedString(timestamp)).append("\n");
+    sb.append("    result: ").append(toIndentedString(result)).append("\n");
+    sb.append("    type: ").append(toIndentedString(type)).append("\n");
+    sb.append("    value: ").append(toIndentedString(value)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `address` to the URL query string
+    if (getAddress() != null) {
+      try {
+        joiner.add(String.format("%saddress%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getAddress()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `timestamp` to the URL query string
+    if (getTimestamp() != null) {
+      try {
+        joiner.add(String.format("%stimestamp%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getTimestamp()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `result` to the URL query string
+    if (getResult() != null) {
+      try {
+        joiner.add(String.format("%sresult%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getResult()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `type` to the URL query string
+    if (getType() != null) {
+      try {
+        joiner.add(String.format("%stype%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getType()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `value` to the URL query string
+    if (getValue() != null) {
+      try {
+        joiner.add(String.format("%svalue%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getValue()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.java
new file mode 100644
index 0000000000..dcbbfd5a12
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/ChangeSubscriptionRequest.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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * ChangeSubscriptionRequest
+ */
+@JsonPropertyOrder({
+  ChangeSubscriptionRequest.JSON_PROPERTY_ID,
+  ChangeSubscriptionRequest.JSON_PROPERTY_NODES
+})
+@JsonTypeName("ChangeSubscription_request")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class ChangeSubscriptionRequest {
+  public static final String JSON_PROPERTY_ID = "id";
+  private String id;
+
+  public static final String JSON_PROPERTY_NODES = "nodes";
+  private List<String> nodes = new ArrayList<>();
+
+  public ChangeSubscriptionRequest() {
+  }
+
+  public ChangeSubscriptionRequest id(String id) {
+    
+    this.id = id;
+    return this;
+  }
+
+   /**
+   * Get id
+   * @return id
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_ID)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public String getId() {
+    return id;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_ID)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setId(String id) {
+    this.id = id;
+  }
+
+
+  public ChangeSubscriptionRequest nodes(List<String> nodes) {
+    
+    this.nodes = nodes;
+    return this;
+  }
+
+  public ChangeSubscriptionRequest addNodesItem(String nodesItem) {
+    this.nodes.add(nodesItem);
+    return this;
+  }
+
+   /**
+   * Get nodes
+   * @return nodes
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_NODES)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public List<String> getNodes() {
+    return nodes;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_NODES)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setNodes(List<String> nodes) {
+    this.nodes = nodes;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    ChangeSubscriptionRequest changeSubscriptionRequest = (ChangeSubscriptionRequest) o;
+    return Objects.equals(this.id, changeSubscriptionRequest.id) &&
+        Objects.equals(this.nodes, changeSubscriptionRequest.nodes);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, nodes);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class ChangeSubscriptionRequest {\n");
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    nodes: ").append(toIndentedString(nodes)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `id` to the URL query string
+    if (getId() != null) {
+      try {
+        joiner.add(String.format("%sid%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getId()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `nodes` to the URL query string
+    if (getNodes() != null) {
+      for (int i = 0; i < getNodes().size(); i++) {
+        try {
+          joiner.add(String.format("%snodes%s%s=%s", prefix, suffix,
+              "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
+              URLEncoder.encode(String.valueOf(getNodes().get(i)), "UTF-8").replaceAll("\\+", "%20")));
+        } catch (UnsupportedEncodingException e) {
+          // Should never happen, UTF-8 is always supported
+          throw new RuntimeException(e);
+        }
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java
new file mode 100644
index 0000000000..8e34737efc
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerChangeEvents.java
@@ -0,0 +1,253 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerChangeEvents
+ */
+@JsonPropertyOrder({
+  CommDatalayerChangeEvents.JSON_PROPERTY_VALUE_CHANGE,
+  CommDatalayerChangeEvents.JSON_PROPERTY_BROWSELIST_CHANGE,
+  CommDatalayerChangeEvents.JSON_PROPERTY_METADATA_CHANGE
+})
+@JsonTypeName("comm_datalayer_ChangeEvents")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerChangeEvents {
+  public static final String JSON_PROPERTY_VALUE_CHANGE = "valueChange";
+  private CommDatalayerDataChangeTrigger valueChange;
+
+  public static final String JSON_PROPERTY_BROWSELIST_CHANGE = "browselistChange";
+  private Boolean browselistChange;
+
+  public static final String JSON_PROPERTY_METADATA_CHANGE = "metadataChange";
+  private Boolean metadataChange;
+
+  public CommDatalayerChangeEvents() {
+  }
+
+  public CommDatalayerChangeEvents valueChange(CommDatalayerDataChangeTrigger valueChange) {
+    
+    this.valueChange = valueChange;
+    return this;
+  }
+
+   /**
+   * Get valueChange
+   * @return valueChange
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_VALUE_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public CommDatalayerDataChangeTrigger getValueChange() {
+    return valueChange;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_VALUE_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setValueChange(CommDatalayerDataChangeTrigger valueChange) {
+    this.valueChange = valueChange;
+  }
+
+
+  public CommDatalayerChangeEvents browselistChange(Boolean browselistChange) {
+    
+    this.browselistChange = browselistChange;
+    return this;
+  }
+
+   /**
+   * Get browselistChange
+   * @return browselistChange
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_BROWSELIST_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Boolean getBrowselistChange() {
+    return browselistChange;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_BROWSELIST_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setBrowselistChange(Boolean browselistChange) {
+    this.browselistChange = browselistChange;
+  }
+
+
+  public CommDatalayerChangeEvents metadataChange(Boolean metadataChange) {
+    
+    this.metadataChange = metadataChange;
+    return this;
+  }
+
+   /**
+   * Get metadataChange
+   * @return metadataChange
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_METADATA_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Boolean getMetadataChange() {
+    return metadataChange;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_METADATA_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setMetadataChange(Boolean metadataChange) {
+    this.metadataChange = metadataChange;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerChangeEvents commDatalayerChangeEvents = (CommDatalayerChangeEvents) o;
+    return Objects.equals(this.valueChange, commDatalayerChangeEvents.valueChange) &&
+        Objects.equals(this.browselistChange, commDatalayerChangeEvents.browselistChange) &&
+        Objects.equals(this.metadataChange, commDatalayerChangeEvents.metadataChange);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(valueChange, browselistChange, metadataChange);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerChangeEvents {\n");
+    sb.append("    valueChange: ").append(toIndentedString(valueChange)).append("\n");
+    sb.append("    browselistChange: ").append(toIndentedString(browselistChange)).append("\n");
+    sb.append("    metadataChange: ").append(toIndentedString(metadataChange)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `valueChange` to the URL query string
+    if (getValueChange() != null) {
+      try {
+        joiner.add(String.format("%svalueChange%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getValueChange()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `browselistChange` to the URL query string
+    if (getBrowselistChange() != null) {
+      try {
+        joiner.add(String.format("%sbrowselistChange%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getBrowselistChange()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `metadataChange` to the URL query string
+    if (getMetadataChange() != null) {
+      try {
+        joiner.add(String.format("%smetadataChange%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getMetadataChange()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java
new file mode 100644
index 0000000000..92b364f893
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerCounting.java
@@ -0,0 +1,169 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerCounting
+ */
+@JsonPropertyOrder({
+  CommDatalayerCounting.JSON_PROPERTY_COUNT_SUBSCRIPTIONS
+})
+@JsonTypeName("comm_datalayer_Counting")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerCounting {
+  public static final String JSON_PROPERTY_COUNT_SUBSCRIPTIONS = "countSubscriptions";
+  private Boolean countSubscriptions;
+
+  public CommDatalayerCounting() {
+  }
+
+  public CommDatalayerCounting countSubscriptions(Boolean countSubscriptions) {
+    
+    this.countSubscriptions = countSubscriptions;
+    return this;
+  }
+
+   /**
+   * Get countSubscriptions
+   * @return countSubscriptions
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_COUNT_SUBSCRIPTIONS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Boolean getCountSubscriptions() {
+    return countSubscriptions;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_COUNT_SUBSCRIPTIONS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setCountSubscriptions(Boolean countSubscriptions) {
+    this.countSubscriptions = countSubscriptions;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerCounting commDatalayerCounting = (CommDatalayerCounting) o;
+    return Objects.equals(this.countSubscriptions, commDatalayerCounting.countSubscriptions);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(countSubscriptions);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerCounting {\n");
+    sb.append("    countSubscriptions: ").append(toIndentedString(countSubscriptions)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `countSubscriptions` to the URL query string
+    if (getCountSubscriptions() != null) {
+      try {
+        joiner.add(String.format("%scountSubscriptions%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getCountSubscriptions()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java
new file mode 100644
index 0000000000..7c18c36107
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeFilter.java
@@ -0,0 +1,170 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerDataChangeFilter
+ */
+@JsonPropertyOrder({
+  CommDatalayerDataChangeFilter.JSON_PROPERTY_DEAD_BAND_VALUE
+})
+@JsonTypeName("comm_datalayer_DataChangeFilter")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerDataChangeFilter {
+  public static final String JSON_PROPERTY_DEAD_BAND_VALUE = "deadBandValue";
+  private BigDecimal deadBandValue;
+
+  public CommDatalayerDataChangeFilter() {
+  }
+
+  public CommDatalayerDataChangeFilter deadBandValue(BigDecimal deadBandValue) {
+    
+    this.deadBandValue = deadBandValue;
+    return this;
+  }
+
+   /**
+   * Get deadBandValue
+   * @return deadBandValue
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_DEAD_BAND_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public BigDecimal getDeadBandValue() {
+    return deadBandValue;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_DEAD_BAND_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setDeadBandValue(BigDecimal deadBandValue) {
+    this.deadBandValue = deadBandValue;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerDataChangeFilter commDatalayerDataChangeFilter = (CommDatalayerDataChangeFilter) o;
+    return Objects.equals(this.deadBandValue, commDatalayerDataChangeFilter.deadBandValue);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(deadBandValue);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerDataChangeFilter {\n");
+    sb.append("    deadBandValue: ").append(toIndentedString(deadBandValue)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `deadBandValue` to the URL query string
+    if (getDeadBandValue() != null) {
+      try {
+        joiner.add(String.format("%sdeadBandValue%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getDeadBandValue()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java
new file mode 100644
index 0000000000..adc4ddc058
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerDataChangeTrigger.java
@@ -0,0 +1,89 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Gets or Sets comm_datalayer_DataChangeTrigger
+ */
+public enum CommDatalayerDataChangeTrigger {
+  
+  STATUS("Status"),
+  
+  STATUSVALUE("StatusValue"),
+  
+  STATUSVALUETIMESTAMP("StatusValueTimestamp");
+
+  private String value;
+
+  CommDatalayerDataChangeTrigger(String value) {
+    this.value = value;
+  }
+
+  @JsonValue
+  public String getValue() {
+    return value;
+  }
+
+  @Override
+  public String toString() {
+    return String.valueOf(value);
+  }
+
+  @JsonCreator
+  public static CommDatalayerDataChangeTrigger fromValue(String value) {
+    for (CommDatalayerDataChangeTrigger b : CommDatalayerDataChangeTrigger.values()) {
+      if (b.value.equals(value)) {
+        return b;
+      }
+    }
+    throw new IllegalArgumentException("Unexpected value '" + value + "'");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    if (prefix == null) {
+      prefix = "";
+    }
+
+    return String.format("%s=%s", prefix, this.toString());
+  }
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java
new file mode 100644
index 0000000000..f7ff3a6a00
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperties.java
@@ -0,0 +1,93 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * Gets or Sets comm_datalayer_Properties
+ */
+public enum CommDatalayerProperties {
+  
+  SAMPLING("Sampling"),
+  
+  QUEUEING("Queueing"),
+  
+  DATACHANGEFILTER("DataChangeFilter"),
+  
+  CHANGEEVENTS("ChangeEvents"),
+  
+  COUNTING("Counting");
+
+  private String value;
+
+  CommDatalayerProperties(String value) {
+    this.value = value;
+  }
+
+  @JsonValue
+  public String getValue() {
+    return value;
+  }
+
+  @Override
+  public String toString() {
+    return String.valueOf(value);
+  }
+
+  @JsonCreator
+  public static CommDatalayerProperties fromValue(String value) {
+    for (CommDatalayerProperties b : CommDatalayerProperties.values()) {
+      if (b.value.equals(value)) {
+        return b;
+      }
+    }
+    throw new IllegalArgumentException("Unexpected value '" + value + "'");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    if (prefix == null) {
+      prefix = "";
+    }
+
+    return String.format("%s=%s", prefix, this.toString());
+  }
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java
new file mode 100644
index 0000000000..9d7a8c3b10
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerProperty.java
@@ -0,0 +1,206 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerProperty
+ */
+@JsonPropertyOrder({
+  CommDatalayerProperty.JSON_PROPERTY_RULE_TYPE,
+  CommDatalayerProperty.JSON_PROPERTY_RULE
+})
+@JsonTypeName("comm_datalayer_Property")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerProperty {
+  public static final String JSON_PROPERTY_RULE_TYPE = "rule_type";
+  private CommDatalayerProperties ruleType;
+
+  public static final String JSON_PROPERTY_RULE = "rule";
+  private CommDatalayerPropertyRule rule;
+
+  public CommDatalayerProperty() {
+  }
+
+  public CommDatalayerProperty ruleType(CommDatalayerProperties ruleType) {
+    
+    this.ruleType = ruleType;
+    return this;
+  }
+
+   /**
+   * Get ruleType
+   * @return ruleType
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_RULE_TYPE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public CommDatalayerProperties getRuleType() {
+    return ruleType;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_RULE_TYPE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setRuleType(CommDatalayerProperties ruleType) {
+    this.ruleType = ruleType;
+  }
+
+
+  public CommDatalayerProperty rule(CommDatalayerPropertyRule rule) {
+    
+    this.rule = rule;
+    return this;
+  }
+
+   /**
+   * Get rule
+   * @return rule
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_RULE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public CommDatalayerPropertyRule getRule() {
+    return rule;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_RULE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setRule(CommDatalayerPropertyRule rule) {
+    this.rule = rule;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerProperty commDatalayerProperty = (CommDatalayerProperty) o;
+    return Objects.equals(this.ruleType, commDatalayerProperty.ruleType) &&
+        Objects.equals(this.rule, commDatalayerProperty.rule);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(ruleType, rule);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerProperty {\n");
+    sb.append("    ruleType: ").append(toIndentedString(ruleType)).append("\n");
+    sb.append("    rule: ").append(toIndentedString(rule)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `rule_type` to the URL query string
+    if (getRuleType() != null) {
+      try {
+        joiner.add(String.format("%srule_type%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getRuleType()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `rule` to the URL query string
+    if (getRule() != null) {
+      joiner.add(getRule().toUrlQueryString(prefix + "rule" + suffix));
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java
new file mode 100644
index 0000000000..c98faed6f6
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerPropertyRule.java
@@ -0,0 +1,468 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.math.BigDecimal;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerPropertyRule
+ */
+@JsonPropertyOrder({
+  CommDatalayerPropertyRule.JSON_PROPERTY_SAMPLING_INTERVAL,
+  CommDatalayerPropertyRule.JSON_PROPERTY_QUEUE_SIZE,
+  CommDatalayerPropertyRule.JSON_PROPERTY_BEHAVIOUR,
+  CommDatalayerPropertyRule.JSON_PROPERTY_DEAD_BAND_VALUE,
+  CommDatalayerPropertyRule.JSON_PROPERTY_VALUE_CHANGE,
+  CommDatalayerPropertyRule.JSON_PROPERTY_BROWSELIST_CHANGE,
+  CommDatalayerPropertyRule.JSON_PROPERTY_METADATA_CHANGE,
+  CommDatalayerPropertyRule.JSON_PROPERTY_COUNT_SUBSCRIPTIONS
+})
+@JsonTypeName("comm_datalayer_Property_rule")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerPropertyRule {
+  public static final String JSON_PROPERTY_SAMPLING_INTERVAL = "samplingInterval";
+  private Integer samplingInterval = 1000000;
+
+  public static final String JSON_PROPERTY_QUEUE_SIZE = "queueSize";
+  private Integer queueSize = 10;
+
+  public static final String JSON_PROPERTY_BEHAVIOUR = "behaviour";
+  private CommDatalayerQueueBehaviour behaviour;
+
+  public static final String JSON_PROPERTY_DEAD_BAND_VALUE = "deadBandValue";
+  private BigDecimal deadBandValue;
+
+  public static final String JSON_PROPERTY_VALUE_CHANGE = "valueChange";
+  private CommDatalayerDataChangeTrigger valueChange;
+
+  public static final String JSON_PROPERTY_BROWSELIST_CHANGE = "browselistChange";
+  private Boolean browselistChange;
+
+  public static final String JSON_PROPERTY_METADATA_CHANGE = "metadataChange";
+  private Boolean metadataChange;
+
+  public static final String JSON_PROPERTY_COUNT_SUBSCRIPTIONS = "countSubscriptions";
+  private Boolean countSubscriptions;
+
+  public CommDatalayerPropertyRule() {
+  }
+
+  public CommDatalayerPropertyRule samplingInterval(Integer samplingInterval) {
+    
+    this.samplingInterval = samplingInterval;
+    return this;
+  }
+
+   /**
+   * sample time in ยต seconds for minimum sampling of data - currently only multiples of 1000 are supported
+   * minimum: 0
+   * maximum: 384
+   * @return samplingInterval
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_SAMPLING_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getSamplingInterval() {
+    return samplingInterval;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_SAMPLING_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setSamplingInterval(Integer samplingInterval) {
+    this.samplingInterval = samplingInterval;
+  }
+
+
+  public CommDatalayerPropertyRule queueSize(Integer queueSize) {
+    
+    this.queueSize = queueSize;
+    return this;
+  }
+
+   /**
+   * size of buffer
+   * minimum: 0
+   * maximum: 4294967295
+   * @return queueSize
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_QUEUE_SIZE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getQueueSize() {
+    return queueSize;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_QUEUE_SIZE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setQueueSize(Integer queueSize) {
+    this.queueSize = queueSize;
+  }
+
+
+  public CommDatalayerPropertyRule behaviour(CommDatalayerQueueBehaviour behaviour) {
+    
+    this.behaviour = behaviour;
+    return this;
+  }
+
+   /**
+   * Get behaviour
+   * @return behaviour
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_BEHAVIOUR)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public CommDatalayerQueueBehaviour getBehaviour() {
+    return behaviour;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_BEHAVIOUR)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setBehaviour(CommDatalayerQueueBehaviour behaviour) {
+    this.behaviour = behaviour;
+  }
+
+
+  public CommDatalayerPropertyRule deadBandValue(BigDecimal deadBandValue) {
+    
+    this.deadBandValue = deadBandValue;
+    return this;
+  }
+
+   /**
+   * Get deadBandValue
+   * @return deadBandValue
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_DEAD_BAND_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public BigDecimal getDeadBandValue() {
+    return deadBandValue;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_DEAD_BAND_VALUE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setDeadBandValue(BigDecimal deadBandValue) {
+    this.deadBandValue = deadBandValue;
+  }
+
+
+  public CommDatalayerPropertyRule valueChange(CommDatalayerDataChangeTrigger valueChange) {
+    
+    this.valueChange = valueChange;
+    return this;
+  }
+
+   /**
+   * Get valueChange
+   * @return valueChange
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_VALUE_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public CommDatalayerDataChangeTrigger getValueChange() {
+    return valueChange;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_VALUE_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setValueChange(CommDatalayerDataChangeTrigger valueChange) {
+    this.valueChange = valueChange;
+  }
+
+
+  public CommDatalayerPropertyRule browselistChange(Boolean browselistChange) {
+    
+    this.browselistChange = browselistChange;
+    return this;
+  }
+
+   /**
+   * Get browselistChange
+   * @return browselistChange
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_BROWSELIST_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Boolean getBrowselistChange() {
+    return browselistChange;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_BROWSELIST_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setBrowselistChange(Boolean browselistChange) {
+    this.browselistChange = browselistChange;
+  }
+
+
+  public CommDatalayerPropertyRule metadataChange(Boolean metadataChange) {
+    
+    this.metadataChange = metadataChange;
+    return this;
+  }
+
+   /**
+   * Get metadataChange
+   * @return metadataChange
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_METADATA_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Boolean getMetadataChange() {
+    return metadataChange;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_METADATA_CHANGE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setMetadataChange(Boolean metadataChange) {
+    this.metadataChange = metadataChange;
+  }
+
+
+  public CommDatalayerPropertyRule countSubscriptions(Boolean countSubscriptions) {
+    
+    this.countSubscriptions = countSubscriptions;
+    return this;
+  }
+
+   /**
+   * Get countSubscriptions
+   * @return countSubscriptions
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_COUNT_SUBSCRIPTIONS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Boolean getCountSubscriptions() {
+    return countSubscriptions;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_COUNT_SUBSCRIPTIONS)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setCountSubscriptions(Boolean countSubscriptions) {
+    this.countSubscriptions = countSubscriptions;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerPropertyRule commDatalayerPropertyRule = (CommDatalayerPropertyRule) o;
+    return Objects.equals(this.samplingInterval, commDatalayerPropertyRule.samplingInterval) &&
+        Objects.equals(this.queueSize, commDatalayerPropertyRule.queueSize) &&
+        Objects.equals(this.behaviour, commDatalayerPropertyRule.behaviour) &&
+        Objects.equals(this.deadBandValue, commDatalayerPropertyRule.deadBandValue) &&
+        Objects.equals(this.valueChange, commDatalayerPropertyRule.valueChange) &&
+        Objects.equals(this.browselistChange, commDatalayerPropertyRule.browselistChange) &&
+        Objects.equals(this.metadataChange, commDatalayerPropertyRule.metadataChange) &&
+        Objects.equals(this.countSubscriptions, commDatalayerPropertyRule.countSubscriptions);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(samplingInterval, queueSize, behaviour, deadBandValue, valueChange, browselistChange, metadataChange, countSubscriptions);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerPropertyRule {\n");
+    sb.append("    samplingInterval: ").append(toIndentedString(samplingInterval)).append("\n");
+    sb.append("    queueSize: ").append(toIndentedString(queueSize)).append("\n");
+    sb.append("    behaviour: ").append(toIndentedString(behaviour)).append("\n");
+    sb.append("    deadBandValue: ").append(toIndentedString(deadBandValue)).append("\n");
+    sb.append("    valueChange: ").append(toIndentedString(valueChange)).append("\n");
+    sb.append("    browselistChange: ").append(toIndentedString(browselistChange)).append("\n");
+    sb.append("    metadataChange: ").append(toIndentedString(metadataChange)).append("\n");
+    sb.append("    countSubscriptions: ").append(toIndentedString(countSubscriptions)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `samplingInterval` to the URL query string
+    if (getSamplingInterval() != null) {
+      try {
+        joiner.add(String.format("%ssamplingInterval%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getSamplingInterval()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `queueSize` to the URL query string
+    if (getQueueSize() != null) {
+      try {
+        joiner.add(String.format("%squeueSize%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getQueueSize()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `behaviour` to the URL query string
+    if (getBehaviour() != null) {
+      try {
+        joiner.add(String.format("%sbehaviour%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getBehaviour()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `deadBandValue` to the URL query string
+    if (getDeadBandValue() != null) {
+      try {
+        joiner.add(String.format("%sdeadBandValue%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getDeadBandValue()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `valueChange` to the URL query string
+    if (getValueChange() != null) {
+      try {
+        joiner.add(String.format("%svalueChange%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getValueChange()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `browselistChange` to the URL query string
+    if (getBrowselistChange() != null) {
+      try {
+        joiner.add(String.format("%sbrowselistChange%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getBrowselistChange()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `metadataChange` to the URL query string
+    if (getMetadataChange() != null) {
+      try {
+        joiner.add(String.format("%smetadataChange%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getMetadataChange()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `countSubscriptions` to the URL query string
+    if (getCountSubscriptions() != null) {
+      try {
+        joiner.add(String.format("%scountSubscriptions%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getCountSubscriptions()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java
new file mode 100644
index 0000000000..8e18bdb160
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueBehaviour.java
@@ -0,0 +1,87 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonCreator;
+import com.fasterxml.jackson.annotation.JsonValue;
+
+/**
+ * The queing strategy. Decided what data should be sent or disarded when the queue runs full before it could be sent.
+ */
+public enum CommDatalayerQueueBehaviour {
+  
+  DISCARDOLDEST("DiscardOldest"),
+  
+  DISCARDNEWEST("DiscardNewest");
+
+  private String value;
+
+  CommDatalayerQueueBehaviour(String value) {
+    this.value = value;
+  }
+
+  @JsonValue
+  public String getValue() {
+    return value;
+  }
+
+  @Override
+  public String toString() {
+    return String.valueOf(value);
+  }
+
+  @JsonCreator
+  public static CommDatalayerQueueBehaviour fromValue(String value) {
+    for (CommDatalayerQueueBehaviour b : CommDatalayerQueueBehaviour.values()) {
+      if (b.value.equals(value)) {
+        return b;
+      }
+    }
+    throw new IllegalArgumentException("Unexpected value '" + value + "'");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    if (prefix == null) {
+      prefix = "";
+    }
+
+    return String.format("%s=%s", prefix, this.toString());
+  }
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java
new file mode 100644
index 0000000000..0cab021388
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerQueueing.java
@@ -0,0 +1,213 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerQueueing
+ */
+@JsonPropertyOrder({
+  CommDatalayerQueueing.JSON_PROPERTY_QUEUE_SIZE,
+  CommDatalayerQueueing.JSON_PROPERTY_BEHAVIOUR
+})
+@JsonTypeName("comm_datalayer_Queueing")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerQueueing {
+  public static final String JSON_PROPERTY_QUEUE_SIZE = "queueSize";
+  private Integer queueSize = 10;
+
+  public static final String JSON_PROPERTY_BEHAVIOUR = "behaviour";
+  private CommDatalayerQueueBehaviour behaviour;
+
+  public CommDatalayerQueueing() {
+  }
+
+  public CommDatalayerQueueing queueSize(Integer queueSize) {
+    
+    this.queueSize = queueSize;
+    return this;
+  }
+
+   /**
+   * size of buffer
+   * minimum: 0
+   * maximum: 4294967295
+   * @return queueSize
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_QUEUE_SIZE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getQueueSize() {
+    return queueSize;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_QUEUE_SIZE)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setQueueSize(Integer queueSize) {
+    this.queueSize = queueSize;
+  }
+
+
+  public CommDatalayerQueueing behaviour(CommDatalayerQueueBehaviour behaviour) {
+    
+    this.behaviour = behaviour;
+    return this;
+  }
+
+   /**
+   * Get behaviour
+   * @return behaviour
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_BEHAVIOUR)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public CommDatalayerQueueBehaviour getBehaviour() {
+    return behaviour;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_BEHAVIOUR)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setBehaviour(CommDatalayerQueueBehaviour behaviour) {
+    this.behaviour = behaviour;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerQueueing commDatalayerQueueing = (CommDatalayerQueueing) o;
+    return Objects.equals(this.queueSize, commDatalayerQueueing.queueSize) &&
+        Objects.equals(this.behaviour, commDatalayerQueueing.behaviour);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(queueSize, behaviour);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerQueueing {\n");
+    sb.append("    queueSize: ").append(toIndentedString(queueSize)).append("\n");
+    sb.append("    behaviour: ").append(toIndentedString(behaviour)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `queueSize` to the URL query string
+    if (getQueueSize() != null) {
+      try {
+        joiner.add(String.format("%squeueSize%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getQueueSize()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `behaviour` to the URL query string
+    if (getBehaviour() != null) {
+      try {
+        joiner.add(String.format("%sbehaviour%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getBehaviour()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java
new file mode 100644
index 0000000000..672091f04a
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerRemoteConfigItem.java
@@ -0,0 +1,211 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerRemoteConfigItem
+ */
+@JsonPropertyOrder({
+  CommDatalayerRemoteConfigItem.JSON_PROPERTY_NAME,
+  CommDatalayerRemoteConfigItem.JSON_PROPERTY_ADDRESS
+})
+@JsonTypeName("comm_datalayer_remote_ConfigItem")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerRemoteConfigItem {
+  public static final String JSON_PROPERTY_NAME = "name";
+  private String name;
+
+  public static final String JSON_PROPERTY_ADDRESS = "address";
+  private String address;
+
+  public CommDatalayerRemoteConfigItem() {
+  }
+
+  public CommDatalayerRemoteConfigItem name(String name) {
+    
+    this.name = name;
+    return this;
+  }
+
+   /**
+   * Name of the remote
+   * @return name
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_NAME)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public String getName() {
+    return name;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_NAME)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setName(String name) {
+    this.name = name;
+  }
+
+
+  public CommDatalayerRemoteConfigItem address(String address) {
+    
+    this.address = address;
+    return this;
+  }
+
+   /**
+   * Address of the remote
+   * @return address
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_ADDRESS)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public String getAddress() {
+    return address;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_ADDRESS)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setAddress(String address) {
+    this.address = address;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerRemoteConfigItem commDatalayerRemoteConfigItem = (CommDatalayerRemoteConfigItem) o;
+    return Objects.equals(this.name, commDatalayerRemoteConfigItem.name) &&
+        Objects.equals(this.address, commDatalayerRemoteConfigItem.address);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(name, address);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerRemoteConfigItem {\n");
+    sb.append("    name: ").append(toIndentedString(name)).append("\n");
+    sb.append("    address: ").append(toIndentedString(address)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `name` to the URL query string
+    if (getName() != null) {
+      try {
+        joiner.add(String.format("%sname%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getName()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `address` to the URL query string
+    if (getAddress() != null) {
+      try {
+        joiner.add(String.format("%saddress%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getAddress()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java
new file mode 100644
index 0000000000..4bd830d6e3
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSampling.java
@@ -0,0 +1,171 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerSampling
+ */
+@JsonPropertyOrder({
+  CommDatalayerSampling.JSON_PROPERTY_SAMPLING_INTERVAL
+})
+@JsonTypeName("comm_datalayer_Sampling")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerSampling {
+  public static final String JSON_PROPERTY_SAMPLING_INTERVAL = "samplingInterval";
+  private Integer samplingInterval = 1000000;
+
+  public CommDatalayerSampling() {
+  }
+
+  public CommDatalayerSampling samplingInterval(Integer samplingInterval) {
+    
+    this.samplingInterval = samplingInterval;
+    return this;
+  }
+
+   /**
+   * sample time in ยต seconds for minimum sampling of data - currently only multiples of 1000 are supported
+   * minimum: 0
+   * maximum: 384
+   * @return samplingInterval
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_SAMPLING_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getSamplingInterval() {
+    return samplingInterval;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_SAMPLING_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setSamplingInterval(Integer samplingInterval) {
+    this.samplingInterval = samplingInterval;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerSampling commDatalayerSampling = (CommDatalayerSampling) o;
+    return Objects.equals(this.samplingInterval, commDatalayerSampling.samplingInterval);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(samplingInterval);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerSampling {\n");
+    sb.append("    samplingInterval: ").append(toIndentedString(samplingInterval)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `samplingInterval` to the URL query string
+    if (getSamplingInterval() != null) {
+      try {
+        joiner.add(String.format("%ssamplingInterval%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getSamplingInterval()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java
new file mode 100644
index 0000000000..bd1cd429e2
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerServerSettings.java
@@ -0,0 +1,214 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerServerSettings
+ */
+@JsonPropertyOrder({
+  CommDatalayerServerSettings.JSON_PROPERTY_SERVER_IDLE_PING_TIMEOUT,
+  CommDatalayerServerSettings.JSON_PROPERTY_SERVER_WAIT_RESPONSE_TIMEOUT
+})
+@JsonTypeName("comm_datalayer_ServerSettings")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerServerSettings {
+  public static final String JSON_PROPERTY_SERVER_IDLE_PING_TIMEOUT = "serverIdlePingTimeout";
+  private Integer serverIdlePingTimeout = 30000;
+
+  public static final String JSON_PROPERTY_SERVER_WAIT_RESPONSE_TIMEOUT = "serverWaitResponseTimeout";
+  private Integer serverWaitResponseTimeout = 3000;
+
+  public CommDatalayerServerSettings() {
+  }
+
+  public CommDatalayerServerSettings serverIdlePingTimeout(Integer serverIdlePingTimeout) {
+    
+    this.serverIdlePingTimeout = serverIdlePingTimeout;
+    return this;
+  }
+
+   /**
+   * after this time send a ping to not used provider is send to test if provider is still alive
+   * minimum: 0
+   * maximum: 4294967295
+   * @return serverIdlePingTimeout
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_SERVER_IDLE_PING_TIMEOUT)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getServerIdlePingTimeout() {
+    return serverIdlePingTimeout;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_SERVER_IDLE_PING_TIMEOUT)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setServerIdlePingTimeout(Integer serverIdlePingTimeout) {
+    this.serverIdlePingTimeout = serverIdlePingTimeout;
+  }
+
+
+  public CommDatalayerServerSettings serverWaitResponseTimeout(Integer serverWaitResponseTimeout) {
+    
+    this.serverWaitResponseTimeout = serverWaitResponseTimeout;
+    return this;
+  }
+
+   /**
+   * after this time a response from provider is expected - if there is no answer a provider is assumed to be dead --&gt; kick provider out of routing
+   * maximum: 4294967295
+   * @return serverWaitResponseTimeout
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_SERVER_WAIT_RESPONSE_TIMEOUT)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getServerWaitResponseTimeout() {
+    return serverWaitResponseTimeout;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_SERVER_WAIT_RESPONSE_TIMEOUT)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setServerWaitResponseTimeout(Integer serverWaitResponseTimeout) {
+    this.serverWaitResponseTimeout = serverWaitResponseTimeout;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerServerSettings commDatalayerServerSettings = (CommDatalayerServerSettings) o;
+    return Objects.equals(this.serverIdlePingTimeout, commDatalayerServerSettings.serverIdlePingTimeout) &&
+        Objects.equals(this.serverWaitResponseTimeout, commDatalayerServerSettings.serverWaitResponseTimeout);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(serverIdlePingTimeout, serverWaitResponseTimeout);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerServerSettings {\n");
+    sb.append("    serverIdlePingTimeout: ").append(toIndentedString(serverIdlePingTimeout)).append("\n");
+    sb.append("    serverWaitResponseTimeout: ").append(toIndentedString(serverWaitResponseTimeout)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `serverIdlePingTimeout` to the URL query string
+    if (getServerIdlePingTimeout() != null) {
+      try {
+        joiner.add(String.format("%sserverIdlePingTimeout%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getServerIdlePingTimeout()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `serverWaitResponseTimeout` to the URL query string
+    if (getServerWaitResponseTimeout() != null) {
+      try {
+        joiner.add(String.format("%sserverWaitResponseTimeout%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getServerWaitResponseTimeout()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java
new file mode 100644
index 0000000000..a5c92afa89
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionData.java
@@ -0,0 +1,220 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerSubscriptionData
+ */
+@JsonPropertyOrder({
+  CommDatalayerSubscriptionData.JSON_PROPERTY_PROPERTIES,
+  CommDatalayerSubscriptionData.JSON_PROPERTY_NODES
+})
+@JsonTypeName("comm_datalayer_SubscriptionData")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerSubscriptionData {
+  public static final String JSON_PROPERTY_PROPERTIES = "properties";
+  private CommDatalayerSubscriptionProperties properties;
+
+  public static final String JSON_PROPERTY_NODES = "nodes";
+  private List<String> nodes = new ArrayList<>();
+
+  public CommDatalayerSubscriptionData() {
+  }
+
+  public CommDatalayerSubscriptionData properties(CommDatalayerSubscriptionProperties properties) {
+    
+    this.properties = properties;
+    return this;
+  }
+
+   /**
+   * Get properties
+   * @return properties
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_PROPERTIES)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public CommDatalayerSubscriptionProperties getProperties() {
+    return properties;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_PROPERTIES)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setProperties(CommDatalayerSubscriptionProperties properties) {
+    this.properties = properties;
+  }
+
+
+  public CommDatalayerSubscriptionData nodes(List<String> nodes) {
+    
+    this.nodes = nodes;
+    return this;
+  }
+
+  public CommDatalayerSubscriptionData addNodesItem(String nodesItem) {
+    if (this.nodes == null) {
+      this.nodes = new ArrayList<>();
+    }
+    this.nodes.add(nodesItem);
+    return this;
+  }
+
+   /**
+   * Get nodes
+   * @return nodes
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_NODES)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public List<String> getNodes() {
+    return nodes;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_NODES)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setNodes(List<String> nodes) {
+    this.nodes = nodes;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerSubscriptionData commDatalayerSubscriptionData = (CommDatalayerSubscriptionData) o;
+    return Objects.equals(this.properties, commDatalayerSubscriptionData.properties) &&
+        Objects.equals(this.nodes, commDatalayerSubscriptionData.nodes);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(properties, nodes);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerSubscriptionData {\n");
+    sb.append("    properties: ").append(toIndentedString(properties)).append("\n");
+    sb.append("    nodes: ").append(toIndentedString(nodes)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `properties` to the URL query string
+    if (getProperties() != null) {
+      joiner.add(getProperties().toUrlQueryString(prefix + "properties" + suffix));
+    }
+
+    // add `nodes` to the URL query string
+    if (getNodes() != null) {
+      for (int i = 0; i < getNodes().size(); i++) {
+        try {
+          joiner.add(String.format("%snodes%s%s=%s", prefix, suffix,
+              "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix),
+              URLEncoder.encode(String.valueOf(getNodes().get(i)), "UTF-8").replaceAll("\\+", "%20")));
+        } catch (UnsupportedEncodingException e) {
+          // Should never happen, UTF-8 is always supported
+          throw new RuntimeException(e);
+        }
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java
new file mode 100644
index 0000000000..268d512497
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CommDatalayerSubscriptionProperties.java
@@ -0,0 +1,353 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CommDatalayerSubscriptionProperties
+ */
+@JsonPropertyOrder({
+  CommDatalayerSubscriptionProperties.JSON_PROPERTY_ID,
+  CommDatalayerSubscriptionProperties.JSON_PROPERTY_KEEPALIVE_INTERVAL,
+  CommDatalayerSubscriptionProperties.JSON_PROPERTY_PUBLISH_INTERVAL,
+  CommDatalayerSubscriptionProperties.JSON_PROPERTY_RULES,
+  CommDatalayerSubscriptionProperties.JSON_PROPERTY_ERROR_INTERVAL
+})
+@JsonTypeName("comm_datalayer_SubscriptionProperties")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CommDatalayerSubscriptionProperties {
+  public static final String JSON_PROPERTY_ID = "id";
+  private String id;
+
+  public static final String JSON_PROPERTY_KEEPALIVE_INTERVAL = "keepaliveInterval";
+  private Integer keepaliveInterval = 60000;
+
+  public static final String JSON_PROPERTY_PUBLISH_INTERVAL = "publishInterval";
+  private Integer publishInterval = 1000;
+
+  public static final String JSON_PROPERTY_RULES = "rules";
+  private List<CommDatalayerProperty> rules = new ArrayList<>();
+
+  public static final String JSON_PROPERTY_ERROR_INTERVAL = "errorInterval";
+  private Integer errorInterval = 10000;
+
+  public CommDatalayerSubscriptionProperties() {
+  }
+
+  public CommDatalayerSubscriptionProperties id(String id) {
+    
+    this.id = id;
+    return this;
+  }
+
+   /**
+   * User identification for subscribtion. Use it update and dispose the old subscription
+   * @return id
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_ID)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public String getId() {
+    return id;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_ID)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setId(String id) {
+    this.id = id;
+  }
+
+
+  public CommDatalayerSubscriptionProperties keepaliveInterval(Integer keepaliveInterval) {
+    
+    this.keepaliveInterval = keepaliveInterval;
+    return this;
+  }
+
+   /**
+   * keepalive in milli seconds for subscription time in seconds the subscriptions
+   * minimum: 0
+   * maximum: 4294967295
+   * @return keepaliveInterval
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_KEEPALIVE_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getKeepaliveInterval() {
+    return keepaliveInterval;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_KEEPALIVE_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setKeepaliveInterval(Integer keepaliveInterval) {
+    this.keepaliveInterval = keepaliveInterval;
+  }
+
+
+  public CommDatalayerSubscriptionProperties publishInterval(Integer publishInterval) {
+    
+    this.publishInterval = publishInterval;
+    return this;
+  }
+
+   /**
+   * time in milli seconds for upper limit of publish messages to not get flooded with new messages
+   * minimum: 0
+   * maximum: 4294967295
+   * @return publishInterval
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_PUBLISH_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getPublishInterval() {
+    return publishInterval;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_PUBLISH_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setPublishInterval(Integer publishInterval) {
+    this.publishInterval = publishInterval;
+  }
+
+
+  public CommDatalayerSubscriptionProperties rules(List<CommDatalayerProperty> rules) {
+    
+    this.rules = rules;
+    return this;
+  }
+
+  public CommDatalayerSubscriptionProperties addRulesItem(CommDatalayerProperty rulesItem) {
+    if (this.rules == null) {
+      this.rules = new ArrayList<>();
+    }
+    this.rules.add(rulesItem);
+    return this;
+  }
+
+   /**
+   * Additional rules for subscription
+   * @return rules
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_RULES)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public List<CommDatalayerProperty> getRules() {
+    return rules;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_RULES)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setRules(List<CommDatalayerProperty> rules) {
+    this.rules = rules;
+  }
+
+
+  public CommDatalayerSubscriptionProperties errorInterval(Integer errorInterval) {
+    
+    this.errorInterval = errorInterval;
+    return this;
+  }
+
+   /**
+   * time in milli seconds to re-read data if an error was received for a node
+   * minimum: 0
+   * maximum: 4294967295
+   * @return errorInterval
+  **/
+  @jakarta.annotation.Nullable
+  @JsonProperty(JSON_PROPERTY_ERROR_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+
+  public Integer getErrorInterval() {
+    return errorInterval;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_ERROR_INTERVAL)
+  @JsonInclude(value = JsonInclude.Include.USE_DEFAULTS)
+  public void setErrorInterval(Integer errorInterval) {
+    this.errorInterval = errorInterval;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CommDatalayerSubscriptionProperties commDatalayerSubscriptionProperties = (CommDatalayerSubscriptionProperties) o;
+    return Objects.equals(this.id, commDatalayerSubscriptionProperties.id) &&
+        Objects.equals(this.keepaliveInterval, commDatalayerSubscriptionProperties.keepaliveInterval) &&
+        Objects.equals(this.publishInterval, commDatalayerSubscriptionProperties.publishInterval) &&
+        Objects.equals(this.rules, commDatalayerSubscriptionProperties.rules) &&
+        Objects.equals(this.errorInterval, commDatalayerSubscriptionProperties.errorInterval);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(id, keepaliveInterval, publishInterval, rules, errorInterval);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CommDatalayerSubscriptionProperties {\n");
+    sb.append("    id: ").append(toIndentedString(id)).append("\n");
+    sb.append("    keepaliveInterval: ").append(toIndentedString(keepaliveInterval)).append("\n");
+    sb.append("    publishInterval: ").append(toIndentedString(publishInterval)).append("\n");
+    sb.append("    rules: ").append(toIndentedString(rules)).append("\n");
+    sb.append("    errorInterval: ").append(toIndentedString(errorInterval)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @param prefix prefix of the query string
+   * @return URL query string
+   */
+  public String toUrlQueryString(String prefix) {
+    String suffix = "";
+    String containerSuffix = "";
+    String containerPrefix = "";
+    if (prefix == null) {
+      // style=form, explode=true, e.g. /pet?name=cat&type=manx
+      prefix = "";
+    } else {
+      // deepObject style e.g. /pet?id[name]=cat&id[type]=manx
+      prefix = prefix + "[";
+      suffix = "]";
+      containerSuffix = "]";
+      containerPrefix = "[";
+    }
+
+    StringJoiner joiner = new StringJoiner("&");
+
+    // add `id` to the URL query string
+    if (getId() != null) {
+      try {
+        joiner.add(String.format("%sid%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getId()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `keepaliveInterval` to the URL query string
+    if (getKeepaliveInterval() != null) {
+      try {
+        joiner.add(String.format("%skeepaliveInterval%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getKeepaliveInterval()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `publishInterval` to the URL query string
+    if (getPublishInterval() != null) {
+      try {
+        joiner.add(String.format("%spublishInterval%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getPublishInterval()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    // add `rules` to the URL query string
+    if (getRules() != null) {
+      for (int i = 0; i < getRules().size(); i++) {
+        if (getRules().get(i) != null) {
+          joiner.add(getRules().get(i).toUrlQueryString(String.format("%srules%s%s", prefix, suffix,
+              "".equals(suffix) ? "" : String.format("%s%d%s", containerPrefix, i, containerSuffix))));
+        }
+      }
+    }
+
+    // add `errorInterval` to the URL query string
+    if (getErrorInterval() != null) {
+      try {
+        joiner.add(String.format("%serrorInterval%s=%s", prefix, suffix, URLEncoder.encode(String.valueOf(getErrorInterval()), "UTF-8").replaceAll("\\+", "%20")));
+      } catch (UnsupportedEncodingException e) {
+        // Should never happen, UTF-8 is always supported
+        throw new RuntimeException(e);
+      }
+    }
+
+    return joiner.toString();
+  }
+
+}
+
diff --git a/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java
new file mode 100644
index 0000000000..3e4ce5d856
--- /dev/null
+++ b/plc4j/drivers/ctrlx/src/main/java/org/apache/plc4x/java/ctrlx/readwrite/rest/datalayer/model/CreateRemoteRequest.java
@@ -0,0 +1,206 @@
+/*
+ * 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.
+ */
+
+/*
+ * ctrlX CORE - Data Layer API
+ * This is the base API for the ctrlX Data Layer access on ctrlX CORE devices <ul> <li>Click 'Authorize' to open the 'Available authorizations' dialog.</li> <li>Enter 'username' and 'password'. The 'Client credentials location' selector together with the 'client_id' and 'client_secret' fields as well as the 'Bearer' section can be ignored.</li> <li>Click 'Authorize' and then 'Close' to close the 'Available authorizations' dialog.</li> <li>Try out those GET, PUT, ... operations you're int [...]
+ *
+ * The version of the OpenAPI document: 2.1.0
+ * Contact: support@boschrexroth.com
+ *
+ * NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
+ * https://openapi-generator.tech
+ * Do not edit the class manually.
+ */
+
+
+package org.apache.plc4x.java.ctrlx.readwrite.rest.datalayer.model;
+
+import com.fasterxml.jackson.annotation.JsonInclude;
+import com.fasterxml.jackson.annotation.JsonProperty;
+import com.fasterxml.jackson.annotation.JsonPropertyOrder;
+import com.fasterxml.jackson.annotation.JsonTypeName;
+
+import java.io.UnsupportedEncodingException;
+import java.net.URLEncoder;
+import java.util.Objects;
+import java.util.StringJoiner;
+
+/**
+ * CreateRemoteRequest
+ */
+@JsonPropertyOrder({
+  CreateRemoteRequest.JSON_PROPERTY_TYPE,
+  CreateRemoteRequest.JSON_PROPERTY_VALUE
+})
+@JsonTypeName("CreateRemote_request")
+@jakarta.annotation.Generated(value = "org.openapitools.codegen.languages.JavaClientCodegen", date = "2023-11-18T13:34:36.056861+01:00[Europe/Berlin]")
+public class CreateRemoteRequest {
+  public static final String JSON_PROPERTY_TYPE = "type";
+  private String type;
+
+  public static final String JSON_PROPERTY_VALUE = "value";
+  private CommDatalayerRemoteConfigItem value;
+
+  public CreateRemoteRequest() {
+  }
+
+  public CreateRemoteRequest type(String type) {
+    
+    this.type = type;
+    return this;
+  }
+
+   /**
+   * Type of the returned value
+   * @return type
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public String getType() {
+    return type;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_TYPE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setType(String type) {
+    this.type = type;
+  }
+
+
+  public CreateRemoteRequest value(CommDatalayerRemoteConfigItem value) {
+    
+    this.value = value;
+    return this;
+  }
+
+   /**
+   * Get value
+   * @return value
+  **/
+  @jakarta.annotation.Nonnull
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+
+  public CommDatalayerRemoteConfigItem getValue() {
+    return value;
+  }
+
+
+  @JsonProperty(JSON_PROPERTY_VALUE)
+  @JsonInclude(value = JsonInclude.Include.ALWAYS)
+  public void setValue(CommDatalayerRemoteConfigItem value) {
+    this.value = value;
+  }
+
+
+  @Override
+  public boolean equals(Object o) {
+    if (this == o) {
+      return true;
+    }
+    if (o == null || getClass() != o.getClass()) {
+      return false;
+    }
+    CreateRemoteRequest createRemoteRequest = (CreateRemoteRequest) o;
+    return Objects.equals(this.type, createRemoteRequest.type) &&
+        Objects.equals(this.value, createRemoteRequest.value);
+  }
+
+  @Override
+  public int hashCode() {
+    return Objects.hash(type, value);
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder sb = new StringBuilder();
+    sb.append("class CreateRemoteRequest {\n");
+    sb.append("    type: ").append(toIndentedString(type)).append("\n");
+    sb.append("    value: ").append(toIndentedString(value)).append("\n");
+    sb.append("}");
+    return sb.toString();
+  }
+
+  /**
+   * Convert the given object to string with each line indented by 4 spaces
+   * (except the first line).
+   */
+  private String toIndentedString(Object o) {
+    if (o == null) {
+      return "null";
+    }
+    return o.toString().replace("\n", "\n    ");
+  }
+
+  /**
+   * Convert the instance into URL query string.
+   *
+   * @return URL query string
+   */
+  public String toUrlQueryString() {
+    return toUrlQueryString(null);
... 12654 lines suppressed ...


(plc4x) 03/10: feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.

Posted by cd...@apache.org.
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 991c59ea942cba72b496c49aab688f989dae4d39
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 13:31:34 2024 +0100

    feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
---
 tools/release-0-update-generated-code.sh | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/tools/release-0-update-generated-code.sh b/tools/release-0-update-generated-code.sh
index df11bad1d7..7eb86eb15b 100755
--- a/tools/release-0-update-generated-code.sh
+++ b/tools/release-0-update-generated-code.sh
@@ -20,6 +20,13 @@
 # ----------------------------------------------------------------------------
 DIRECTORY=..
 
+# 0. Check if there are uncommited changes as these would automatically be committed
+if [[ `git status --porcelain` ]]; then
+  # Changes
+  echo "There are untracked files or changed files, aborting."
+  exit 1
+fi
+
 # 1. Delete the pre-exising "out" driectory that contains the maven local repo and deployments. (localhost)
 echo "Deleting the maven local repo and previous deployments"
 #rm -r $DIRECTORY/out
@@ -33,9 +40,14 @@ do
 done
 
 # 3. Run the maven build for all modules with "update-generated-code" enabled (Docker container)
-docker compose run --rm releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,update-generated-code -Dmaven.repo.local=/ws/out/.repository clean package
+docker compose run --rm --abort-on-container-exit releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,update-generated-code -Dmaven.repo.local=/ws/out/.repository clean package
+if [ $? -ne 0 ]; then
+    echo "Got non-0 exit code from docker compose, aborting."
+    exit 1
+done
 
 # 4. Add all new files to Git (localhost)
+# TODO: Possibly only add items in a generated directory ...
 git add --all
 
 # 5. Commit and push all changes to Git (localhost)


(plc4x) 05/10: feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.

Posted by cd...@apache.org.
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 59eb441e06d3189037ea9607cad3c8b8535e0f4f
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 13:33:02 2024 +0100

    feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
---
 tools/release-0-update-generated-code.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/release-0-update-generated-code.sh b/tools/release-0-update-generated-code.sh
index abaf150067..f10bbba5d4 100755
--- a/tools/release-0-update-generated-code.sh
+++ b/tools/release-0-update-generated-code.sh
@@ -40,7 +40,7 @@ do
 done
 
 # 3. Run the maven build for all modules with "update-generated-code" enabled (Docker container)
-docker compose run --rm --abort-on-container-exit releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,update-generated-code -Dmaven.repo.local=/ws/out/.repository clean package
+docker compose run --rm --exit-code-from releaser releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,update-generated-code -Dmaven.repo.local=/ws/out/.repository clean package
 if [ $? -ne 0 ]; then
     echo "Got non-0 exit code from docker compose, aborting."
     exit 1


(plc4x) 06/10: feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.

Posted by cd...@apache.org.
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 82b564692b652f72000974d1c891b64b6f73fa28
Author: Christofer Dutz <cd...@apache.org>
AuthorDate: Sat Jan 6 13:34:50 2024 +0100

    feat: Improved the script to check unstaged changes and to handle exit-codes of the docker build.
---
 tools/release-0-update-generated-code.sh | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/tools/release-0-update-generated-code.sh b/tools/release-0-update-generated-code.sh
index f10bbba5d4..e39481a964 100755
--- a/tools/release-0-update-generated-code.sh
+++ b/tools/release-0-update-generated-code.sh
@@ -40,7 +40,7 @@ do
 done
 
 # 3. Run the maven build for all modules with "update-generated-code" enabled (Docker container)
-docker compose run --rm --exit-code-from releaser releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,update-generated-code -Dmaven.repo.local=/ws/out/.repository clean package
+docker compose run --rm releaser bash /ws/mvnw -e -P with-c,with-dotnet,with-go,with-python,with-sandbox,enable-all-checks,update-generated-code -Dmaven.repo.local=/ws/out/.repository clean package
 if [ $? -ne 0 ]; then
     echo "Got non-0 exit code from docker compose, aborting."
     exit 1