You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2020/01/29 12:50:36 UTC

[plc4x] 01/01: Revert "Merge remote-tracking branch 'origin/develop' into develop"

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

jfeinauer pushed a commit to branch fixes-mathi
in repository https://gitbox.apache.org/repos/asf/plc4x.git

commit 6c355914eaf93bd44f5a708b7728c23a2b5c050a
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Wed Jan 29 13:50:02 2020 +0100

    Revert "Merge remote-tracking branch 'origin/develop' into develop"
    
    This reverts commit 3d5ef14cb1cc82ff73193b5df324b17f1ac5c15c, reversing
    changes made to ae46fff55a395637aae04bdb421505438aa730b6.
---
 .gitignore                                         |    5 +-
 Jenkinsfile                                        |    6 +-
 README.md                                          |    2 +-
 RELEASE_NOTES                                      |    2 +-
 Sometimes-Failling-Tests.md                        |   11 +-
 build-utils/language-base-freemarker/pom.xml       |    2 +-
 .../freemarker/FreemarkerLanguageOutput.java       |  116 +--
 build-utils/language-java/pom.xml                  |    4 +-
 .../plc4x/language/java/JavaLanguageOutput.java    |   15 -
 .../language/java/JavaLanguageTemplateHelper.java  |  385 ++-----
 .../resources/templates/java/data-io-template.ftlh |  278 ------
 .../templates/java/enum-package-info-template.ftlh |   39 -
 .../resources/templates/java/enum-template.ftlh    |  115 ++-
 .../main/resources/templates/java/io-template.ftlh |  226 ++---
 .../resources/templates/java/pojo-template.ftlh    |  169 +---
 build-utils/pom.xml                                |    2 +-
 build-utils/protocol-base-mspec/pom.xml            |   39 +-
 .../plugins/codegenerator/language/mspec/MSpec.g4  |  103 +-
 .../language/mspec/expression/Expression.g4        |    3 -
 .../mspec/expression/ExpressionStringListener.java |   65 +-
 .../mspec/expression/ExpressionStringParser.java   |   14 +-
 .../definitions/DefaultComplexTypeDefinition.java  |    8 +-
 .../definitions/DefaultDataIoTypeDefinition.java   |   38 -
 .../DefaultDiscriminatedComplexTypeDefinition.java |    2 +-
 .../definitions/DefaultEnumTypeDefinition.java     |    2 +-
 .../mspec/model/fields/DefaultAbstractField.java   |   52 -
 .../mspec/model/fields/DefaultImplicitField.java   |   10 +-
 .../model/fields/DefaultManualArrayField.java      |   18 +-
 .../mspec/model/fields/DefaultManualField.java     |   18 +-
 .../references/DefaultFloatTypeReference.java      |   45 -
 .../references/DefaultIntegerTypeReference.java    |   30 -
 .../references/DefaultSimpleTypeReference.java     |   12 +-
 .../DefaultSimpleVarLengthTypeReference.java       |    2 +-
 .../references/DefaultStringTypeReference.java     |   38 -
 .../references/DefaultTemporalTypeReference.java   |   30 -
 .../mspec/parser/MessageFormatListener.java        |  203 ++--
 .../language/mspec/parser/MessageFormatParser.java |   17 +-
 .../expression/ExpressionStringParserTest.java     |  177 ----
 .../mspec/parser/MessageFormatParserTest.java      |   43 -
 .../src/test/resources/mspec.example               |  358 -------
 build-utils/protocol-test/pom.xml                  |    6 +-
 .../src/main/resources/protocols/test/test.mspec   |    2 +-
 jenkins.pom                                        |   18 +-
 plc4j/api/pom.xml                                  |   42 +-
 .../org/apache/plc4x/java/PlcDriverManager.java    |   50 +-
 .../org/apache/plc4x/java/api/Experimental.java    |   26 -
 .../org/apache/plc4x/java/api/PlcConnection.java   |   35 +-
 .../plc4x/java/api/PlcConnectionExtension.java     |   82 --
 .../java/org/apache/plc4x/java/api/PlcDriver.java  |   60 --
 .../java/api/authentication/PlcAuthentication.java |   34 +-
 .../PlcUsernamePasswordAuthentication.java         |   34 +-
 .../api/exceptions/PlcConnectionException.java     |   34 +-
 .../plc4x/java/api/exceptions/PlcException.java    |   34 +-
 .../api/exceptions/PlcFieldRangeException.java     |   32 +-
 .../PlcIncompatibleDatatypeException.java          |   39 +-
 .../api/exceptions/PlcInvalidFieldException.java   |   32 +-
 .../plc4x/java/api/exceptions/PlcIoException.java  |   34 +-
 .../api/exceptions/PlcNotImplementedException.java |   32 +-
 .../java/api/exceptions/PlcProtocolException.java  |   34 +-
 .../PlcProtocolPayloadTooBigException.java         |   34 +-
 .../exceptions/PlcProtocolTimeoutException.java    |   39 -
 .../java/api/exceptions/PlcRuntimeException.java   |   34 +-
 .../java/api/exceptions/PlcTimeoutException.java   |   32 +-
 .../PlcUnsupportedDataTypeException.java           |   32 +-
 .../PlcUnsupportedOperationException.java          |   34 +-
 .../PlcUnsupportedProtocolException.java           |   32 +-
 .../plc4x/java/api/messages/PlcFieldRequest.java   |   34 +-
 .../plc4x/java/api/messages/PlcFieldResponse.java  |   34 +-
 .../apache/plc4x/java/api/messages/PlcMessage.java |   34 +-
 .../plc4x/java/api/messages/PlcReadRequest.java    |   34 +-
 .../plc4x/java/api/messages/PlcReadResponse.java   |   50 +-
 .../apache/plc4x/java/api/messages/PlcRequest.java |   34 +-
 .../plc4x/java/api/messages/PlcRequestBuilder.java |   34 +-
 .../plc4x/java/api/messages/PlcResponse.java       |   34 +-
 .../java/api/messages/PlcSubscriptionEvent.java    |   34 +-
 .../java/api/messages/PlcSubscriptionRequest.java  |   34 +-
 .../java/api/messages/PlcSubscriptionResponse.java |   34 +-
 .../api/messages/PlcUnsubscriptionRequest.java     |   34 +-
 .../api/messages/PlcUnsubscriptionResponse.java    |   34 +-
 .../plc4x/java/api/messages/PlcWriteRequest.java   |   38 +-
 .../plc4x/java/api/messages/PlcWriteResponse.java  |   34 +-
 .../java/api/metadata/PlcConnectionMetadata.java   |   34 +-
 .../java/api/model/PlcConsumerRegistration.java    |   32 +-
 .../org/apache/plc4x/java/api/model/PlcField.java  |   34 +-
 .../java/api/model/PlcSubscriptionHandle.java      |   34 +-
 .../plc4x/java/api/types/PlcClientDatatype.java    |   34 +-
 .../plc4x/java/api/types/PlcResponseCode.java      |   34 +-
 .../plc4x/java/api/types/PlcSubscriptionType.java  |   34 +-
 .../apache/plc4x/java/api/value/PlcBigDecimal.java |  136 ---
 .../apache/plc4x/java/api/value/PlcBigInteger.java |  136 ---
 .../apache/plc4x/java/api/value/PlcBoolean.java    |  130 ---
 .../org/apache/plc4x/java/api/value/PlcDate.java   |   55 -
 .../apache/plc4x/java/api/value/PlcDateTime.java   |   77 --
 .../org/apache/plc4x/java/api/value/PlcDouble.java |  140 ---
 .../org/apache/plc4x/java/api/value/PlcFloat.java  |  140 ---
 .../apache/plc4x/java/api/value/PlcInteger.java    |  156 ---
 .../org/apache/plc4x/java/api/value/PlcList.java   |   72 --
 .../org/apache/plc4x/java/api/value/PlcLong.java   |  140 ---
 .../plc4x/java/api/value/PlcSimpleValue.java       |   57 --
 .../org/apache/plc4x/java/api/value/PlcString.java |   68 --
 .../org/apache/plc4x/java/api/value/PlcStruct.java |   70 --
 .../org/apache/plc4x/java/api/value/PlcTime.java   |   55 -
 .../org/apache/plc4x/java/api/value/PlcValue.java  |  142 ---
 .../plc4x/java/api/value/PlcValueAdapter.java      |  248 -----
 .../org/apache/plc4x/java/api/value/PlcValues.java |  382 -------
 .../java/org/apache/plc4x/java/spi/PlcDriver.java  |   61 ++
 .../apache/plc4x/java/PlcDriverManagerTest.java    |   47 +-
 .../PlcUsernamePasswordAuthenticationTest.java     |   39 +-
 .../plc4x/java/api/connection/PlcReaderTest.java   |   32 +-
 .../plc4x/java/api/connection/PlcWriterTest.java   |   32 +-
 .../api/exceptions/PlcConnectionExceptionTest.java |   32 +-
 .../java/api/exceptions/PlcExceptionTest.java      |   32 +-
 .../api/exceptions/PlcFieldRangeExceptionTest.java |   32 +-
 .../PlcIncompatibleDatatypeExceptionTest.java      |   32 +-
 .../exceptions/PlcInvalidFieldExceptionTest.java   |   32 +-
 .../java/api/exceptions/PlcIoExceptionTest.java    |   32 +-
 .../exceptions/PlcNotImplementedExceptionTest.java |   32 +-
 .../api/exceptions/PlcProtocolExceptionTest.java   |   32 +-
 .../PlcProtocolPayloadTooBigExceptionTest.java     |   32 +-
 .../api/exceptions/PlcRuntimeExceptionTest.java    |   32 +-
 .../api/exceptions/PlcTimeoutExceptionTest.java    |   32 +-
 .../PlcUnsupportedDataTypeExceptionTest.java       |   32 +-
 .../PlcUnsupportedOperationExceptionTest.java      |   32 +-
 .../plc4x/java/api/messages/APIMessageTests.java   |   34 +-
 .../api/messages/PlcProprietaryRequestTest.java    |   32 +-
 .../api/messages/PlcProprietaryResponseTest.java   |   32 +-
 .../java/api/messages/PlcReadRequestTest.java      |   32 +-
 .../java/api/messages/PlcReadResponseTest.java     |   32 +-
 .../plc4x/java/api/messages/PlcRequestTest.java    |   32 +-
 .../plc4x/java/api/messages/PlcResponseTest.java   |   32 +-
 .../api/messages/PlcSubscriptionEventTest.java     |   32 +-
 .../api/messages/PlcSubscriptionRequestTest.java   |   32 +-
 .../api/messages/PlcSubscriptionResponseTest.java  |   32 +-
 .../api/messages/PlcUnsubscriptionRequestTest.java |   32 +-
 .../messages/PlcUnsubscriptionResponseTest.java    |   32 +-
 .../java/api/messages/PlcWriteRequestTest.java     |   32 +-
 .../java/api/messages/PlcWriteResponseTest.java    |   32 +-
 .../plc4x/java/api/messages/mock/MockField.java    |   34 +-
 .../specific/TypeSafePlcReadRequestTest.java       |   32 +-
 .../specific/TypeSafePlcReadResponseTest.java      |   32 +-
 .../specific/TypeSafePlcWriteRequestTest.java      |   32 +-
 .../specific/TypeSafePlcWriteResponseTest.java     |   32 +-
 .../java/api/types/PlcClientDatatypeTest.java      |   32 +-
 .../plc4x/java/api/types/PlcResponseCodeTest.java  |   32 +-
 .../java/api/types/PlcSubscriptionTypeTest.java    |   32 +-
 .../apache/plc4x/java/api/types/PlcValueTest.java  |   53 -
 .../apache/plc4x/java/api/value/PlcValuesTest.java |   52 -
 .../org/apache/plc4x/java/mock/ApiMockDriver.java  |   55 -
 .../plc4x/java/mock/DuplicateMockDriver.java       |   34 +-
 .../org/apache/plc4x/java/mock/MockDriver.java     |   55 +
 .../apache/plc4x/java/mock/MockPlcConnection.java  |   32 +-
 .../services/org.apache.plc4x.java.api.PlcDriver   |   38 -
 .../services/org.apache.plc4x.java.spi.PlcDriver}  |    0
 .../services/org.apache.plc4x.java.api.PlcDriver   |   38 -
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   19 +
 plc4j/drivers/ab-eth/pom.xml                       |   38 +-
 .../org/apache/plc4x/java/abeth/AbEthDriver.java   |   61 +-
 .../abeth/configuration/AbEthConfiguration.java    |   44 -
 .../java/abeth/connection/AbEthFieldHandler.java   |   36 +
 .../java/abeth/connection/AbEthPlcConnection.java  |  159 +++
 .../apache/plc4x/java/abeth/field/AbEthField.java  |  105 --
 .../plc4x/java/abeth/field/AbEthFieldHandler.java  |   35 -
 .../apache/plc4x/java/abeth/model/AbEthField.java  |  105 ++
 .../plc4x/java/abeth/model/types/FileType.java     |   65 ++
 .../plc4x/java/abeth/protocol/AbEthProtocol.java   |   61 ++
 .../java/abeth/protocol/AbEthProtocolLogic.java    |  221 -----
 .../java/abeth/protocol/Plc4xAbEthProtocol.java    |   51 +-
 .../apache/plc4x/java/abeth/types/FileType.java    |   65 --
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 .../org/apache/plc4x/protocol/abeth/AbEthTest.java |    2 +-
 .../test/resources/testsuite/AbEthTestsuite.xml    |    2 +-
 plc4j/drivers/ads/pom.xml                          |   31 +-
 .../org/apache/plc4x/java/ads/AdsPlcDriver.java    |    2 +-
 .../ads/connection/AdsAbstractPlcConnection.java   |   39 +-
 .../ads/connection/AdsSerialPlcConnection.java     |    4 +-
 .../java/ads/connection/AdsTcpPlcConnection.java   |   23 +-
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 .../apache/plc4x/java/ads/adslib/AmsRequest.java   |    4 +-
 .../apache/plc4x/java/ads/adslib/AmsRouter.java    |    4 +-
 .../connection/AdsAbstractPlcConnectionTest.java   |   16 +-
 .../ads/connection/AdsConnectionFactoryTest.java   |    6 +-
 .../ads/connection/AdsSerialPlcConnectionTest.java |    6 +-
 .../ads/connection/AdsTcpPlcConnectionTests.java   |    6 +-
 plc4j/drivers/ethernet-ip/pom.xml                  |   19 +-
 .../plc4x/java/ethernetip/EtherNetIpPlcDriver.java |    2 +-
 .../connection/BaseEtherNetIpPlcConnection.java    |    6 +-
 .../connection/EtherNetIpTcpPlcConnection.java     |    9 +-
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 plc4j/drivers/knxnetip/README.adoc                 |   48 -
 plc4j/drivers/knxnetip/pom.xml                     |  148 ---
 .../apache/plc4x/java/knxnetip/KnxNetIpDriver.java |   97 --
 .../configuration/KnxNetIpConfiguration.java       |   65 --
 .../plc4x/java/knxnetip/ets5/Ets5Parser.java       |  166 ----
 .../java/knxnetip/ets5/model/AddressType.java      |   96 --
 .../plc4x/java/knxnetip/ets5/model/Ets5Model.java  |  114 ---
 .../plc4x/java/knxnetip/ets5/model/Function.java   |   96 --
 .../java/knxnetip/ets5/model/GroupAddress.java     |   96 --
 .../plc4x/java/knxnetip/field/KnxNetIpField.java   |   86 --
 .../java/knxnetip/field/KnxNetIpFieldHandler.java  |   35 -
 .../knxnetip/protocol/KnxNetIpProtocolLogic.java   |  370 -------
 .../plc4x/java/knxnetip/utils/KnxHelper.java       |   65 --
 .../services/org.apache.plc4x.java.api.PlcDriver   |   19 -
 .../org/apache/plc4x/java/knxnetip/IOTest.java     |  102 --
 .../apache/plc4x/java/knxnetip/KNXNetIpTest.java   |   30 -
 .../apache/plc4x/java/knxnetip/ManualKnxNetIp.java |   72 --
 .../java/knxnetip/ManualKnxNetIpWithEts5.java      |  149 ---
 .../knxnetip/src/test/resources/logback.xml        |   36 -
 .../test/resources/testsuite/KNXNetIPTestsuite.xml |  402 --------
 plc4j/drivers/mock/pom.xml                         |   74 --
 .../org/apache/plc4x/java/mock/MockDriver.java     |   63 --
 .../plc4x/java/mock/connection/MockConnection.java |  207 ----
 .../plc4x/java/mock/connection/MockDevice.java     |   51 -
 .../apache/plc4x/java/mock/field/MockField.java    |   62 --
 .../plc4x/java/mock/field/MockFieldHandler.java    |   98 --
 .../apache/plc4x/java/mock/field/MockPlcValue.java |   36 -
 plc4j/drivers/modbus/pom.xml                       |   31 +-
 .../apache/plc4x/java/modbus/ModbusPlcDriver.java  |    2 +-
 .../modbus/connection/BaseModbusPlcConnection.java |   14 +-
 .../connection/ModbusSerialPlcConnection.java      |    2 +-
 .../modbus/connection/ModbusTcpPlcConnection.java  |    7 +-
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 .../connection/BaseModbusPlcConnectionTest.java    |    6 +-
 .../connection/ModbusConnectionFactoryTest.java    |    6 +-
 .../connection/ModbusSerialPlcConnectionTest.java  |    6 +-
 plc4j/drivers/opcua/pom.xml                        |   61 +-
 .../apache/plc4x/java/opcua/OpcuaPlcDriver.java    |    7 +-
 .../opcua/connection/BaseOpcuaPlcConnection.java   |    9 +-
 .../opcua/connection/OpcuaConnectionFactory.java   |    1 +
 .../opcua/connection/OpcuaTcpPlcConnection.java    |   60 +-
 .../plc4x/java/opcua/protocol/OpcuaField.java      |    1 +
 .../java/opcua/protocol/OpcuaPlcFieldHandler.java  |   95 +-
 .../opcua/protocol/OpcuaSubsriptionHandle.java     |   13 +-
 .../java/opcua/protocol/model/OpcuaDataTypes.java  |    1 +
 .../opcua/protocol/model/OpcuaIdentifierType.java  |    1 +
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 .../apache/plc4x/java/opcua/ManualPLC4XOpcua.java  |   19 +-
 .../plc4x/java/opcua/OpcuaPlcDriverTest.java       |    3 +-
 .../org/apache/plc4x/java/opcua/UtilsTest.java     |    1 +
 .../connection/OpcuaTcpPlcConnectionTest.java      |    6 +-
 .../plc4x/java/opcua/protocol/OpcuaFieldTest.java  |    1 +
 .../opcua/protocol/OpcuaPlcFieldHandlerTest.java   |    1 +
 .../protocol/OpcuaSubscriptionHandleTest.java      |    1 +
 plc4j/drivers/pom.xml                              |   12 +-
 plc4j/drivers/s7/pom.xml                           |   35 +-
 .../java/org/apache/plc4x/java/s7/S7PlcDriver.java |    2 +-
 .../plc4x/java/s7/connection/S7PlcConnection.java  |   33 +-
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 .../java/org/apache/plc4x/java/s7/BenchmarkS7.java |    5 +-
 .../java/s7/connection/S7PlcTestConnection.java    |    2 +-
 plc4j/drivers/simulated/pom.xml                    |   16 +-
 .../plc4x/java/simulated/SimulatedDriver.java      |   65 --
 .../plc4x/java/simulated/SimulatedPlcDriver.java   |   65 ++
 .../simulated/connection/SimulatedConnection.java  |  254 -----
 .../java/simulated/connection/SimulatedDevice.java |  194 ----
 .../connection/SimulatedPlcConnection.java         |  219 ++++
 .../java/simulated/connection/TestDevice.java      |  199 ++++
 .../plc4x/java/simulated/connection/TestField.java |  128 +++
 .../simulated/connection/TestFieldHandler.java     |  174 ++++
 .../java/simulated/connection/TestFieldItem.java   |   35 +
 .../plc4x/java/simulated/connection/TestType.java  |   28 +
 .../plc4x/java/simulated/field/SimulatedField.java |  129 ---
 .../simulated/field/SimulatedFieldHandler.java     |  214 ----
 .../java/simulated/types/SimulatedFieldType.java   |   28 -
 .../services/org.apache.plc4x.java.api.PlcDriver   |   19 -
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   38 +
 .../plc4x/java/simulated/SimulatedDriverTest.java  |   58 --
 .../java/simulated/SimulatedPlcDriverTest.java     |   57 ++
 .../connection/SimulatedConnectionTest.java        |  245 -----
 .../simulated/connection/SimulatedDeviceTest.java  |   57 --
 .../connection/SimulatedPlcConnectionTest.java     |  245 +++++
 .../java/simulated/connection/TestDeviceTest.java  |   56 ++
 .../simulated/connection/TestFieldHandlerTest.java |  133 +++
 .../simulated/connection/TestFieldItemTest.java    |   31 +
 .../java/simulated/connection/TestFieldTest.java   |   61 ++
 .../simulated/field/SimularedFieldHandlerTest.java |  128 ---
 .../java/simulated/field/SimulatedFieldTest.java   |   62 --
 plc4j/examples/dummy-driver/pom.xml                |   13 +-
 .../java/examples/dummydriver/DummyDriver.java     |    2 +-
 .../dummydriver/connection/DummyConnection.java    |   14 +-
 .../examples/dummydriver/netty/DummyProtocol.java  |    2 +-
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 plc4j/examples/hello-cloud-azure/pom.xml           |   24 +-
 plc4j/examples/hello-cloud-google/pom.xml          |   24 +-
 plc4j/examples/hello-connectivity-kafka/pom.xml    |   26 +-
 plc4j/examples/hello-connectivity-mqtt/pom.xml     |   24 +-
 plc4j/examples/hello-integration-edgent/pom.xml    |   24 +-
 plc4j/examples/hello-integration-iotdb/pom.xml     |   24 +-
 .../java/examples/integration/iotdb/PlcLogger.java |    2 +-
 plc4j/examples/hello-opm/pom.xml                   |   26 +-
 plc4j/examples/hello-storage-elasticsearch/pom.xml |   26 +-
 plc4j/examples/hello-webapp/client/pom.xml         |    2 +-
 plc4j/examples/hello-webapp/pom.xml                |    2 +-
 plc4j/examples/hello-webapp/service/pom.xml        |   24 +-
 plc4j/examples/hello-webapp/webapp/pom.xml         |    6 +-
 plc4j/examples/hello-world-plc4x/pom.xml           |   33 +-
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java |   13 +-
 .../src/main/resources/logback.xml                 |    2 +-
 plc4j/examples/pom.xml                             |    4 +-
 plc4j/integrations/apache-calcite/pom.xml          |    9 +-
 .../java/org/apache/plc4x/DriverManagerTest.java   |    1 +
 .../java/org/apache/plc4x/Plc4XBaseTableTest.java  |    2 +-
 .../apache-calcite/src/test/resources/example.yml  |    4 +-
 plc4j/integrations/apache-camel/pom.xml            |   14 +-
 .../java/org/apache/plc4x/camel/MockDriver.java    |   15 +-
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 plc4j/integrations/apache-edgent/pom.xml           |   29 +-
 .../apache/plc4x/edgent/PlcConnectionAdapter.java  |    4 +-
 .../plc4x/edgent/PlcConnectionAdapterTest.java     |  551 ----------
 .../org/apache/plc4x/edgent/PlcFunctionsTest.java  |  144 ---
 .../plc4x/edgent/PlcConnectionAdapterTest.java     |  552 +++++++++++
 .../org/apache/plc4x/edgent/PlcFunctionsTest.java  |  144 +++
 .../apache/plc4x/edgent/mock/MockConnection.java   |  155 +++
 .../org/apache/plc4x/edgent/mock/MockDriver.java   |   48 +
 .../org/apache/plc4x/edgent/mock/MockField.java    |   62 ++
 .../apache/plc4x/edgent/mock/MockFieldHandler.java |  104 ++
 .../apache/plc4x/edgent/mock/MockFieldItem.java    |   34 +
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   19 +
 plc4j/integrations/apache-kafka/README.md          |    2 +-
 plc4j/integrations/apache-kafka/pom.xml            |   28 +-
 .../apache-nifi/nifi-plc4x-nar/pom.xml             |   24 +-
 .../apache-nifi/nifi-plc4x-processors/pom.xml      |    4 +-
 plc4j/integrations/apache-nifi/pom.xml             |    2 +-
 plc4j/integrations/logstash-plugin/pom.xml         |   36 +-
 plc4j/integrations/pom.xml                         |    2 +-
 plc4j/karaf-features/karaf-itest/pom.xml           |    6 +-
 plc4j/karaf-features/pom.xml                       |    6 +-
 plc4j/karaf-features/s7/pom.xml                    |    2 +-
 .../karaf-features/s7/src/main/feature/feature.xml |    5 +-
 .../java/org/apache/plc4x/karaf/FeatureTest.java   |   91 ++
 plc4j/pom.xml                                      |   11 +-
 plc4j/protocols/ads/pom.xml                        |   17 +-
 .../plc4x/java/ads/api/serial/AmsSerialFrame.java  |    2 +-
 .../plc4x/java/ads/model/AdsPlcFieldHandler.java   |  168 ++--
 .../java/ads/model/AdsSubscriptionHandle.java      |    4 +-
 .../java/ads/protocol/Ads2PayloadProtocol.java     |  107 +-
 .../java/ads/protocol/Payload2TcpProtocol.java     |   30 +-
 .../plc4x/java/ads/protocol/Plc4x2AdsProtocol.java |   29 +-
 .../ads/protocol/util/LittleEndianDecoder.java     |  206 +---
 .../protocol/util/SingleMessageRateLimiter.java    |    2 +-
 .../protocol/util/LittleEndianDecoderSpec.groovy   |   99 ++
 .../util/LittleEndianDecoderSpecHurz.groovy        |   99 --
 .../protocol/util/LittleEndianEncoderSpec.groovy   |   53 +
 .../util/LittleEndianEncoderSpecHurz.groovy        |   53 -
 .../java/ads/model/AdsPlcFieldHandlerTest.java     |    5 +-
 ...load2SerialProtocolExampleConversationTest.java |    8 +-
 .../java/ads/protocol/Payload2TcpProtocolTest.java |   20 -
 .../java/ads/protocol/Plc4x2AdsProtocolTest.java   |    4 +-
 .../java/ads/protocol/util/DigestUtilTest.java     |    5 +-
 plc4j/protocols/benchmarks/pom.xml                 |    4 +-
 plc4j/protocols/delta-v/pom.xml                    |    2 +-
 plc4j/protocols/driver-bases/base/pom.xml          |  101 ++
 .../base/GeneratedDriverByteToMessageCodec.java    |   79 ++
 .../plc4x/java/base/PlcByteToMessageCodec.java     |   59 ++
 .../plc4x/java/base/PlcMessageToMessageCodec.java  |   60 ++
 .../base/connection/AbstractPlcConnection.java     |  105 ++
 .../plc4x/java/base/connection/ChannelFactory.java |   33 +
 .../base/connection/DefaultPlcFieldHandler.java    |  101 ++
 .../java/base/connection/NettyPlcConnection.java   |  132 +++
 .../java/base/connection/PlcFieldHandler.java      |   60 ++
 .../plc4x/java/base/events/ConnectEvent.java       |   22 +
 .../plc4x/java/base/events/ConnectedEvent.java     |   22 +
 .../messages/DefaultPlcProprietaryRequest.java     |   43 +
 .../messages/DefaultPlcProprietaryResponse.java    |   42 +
 .../java/base/messages/DefaultPlcReadRequest.java  |  113 +++
 .../java/base/messages/DefaultPlcReadResponse.java |  583 +++++++++++
 .../base/messages/DefaultPlcSubscriptionEvent.java |   55 +
 .../messages/DefaultPlcSubscriptionRequest.java    |  168 ++++
 .../messages/DefaultPlcSubscriptionResponse.java   |   90 ++
 .../messages/DefaultPlcUnsubscriptionRequest.java  |   90 ++
 .../messages/DefaultPlcUnsubscriptionResponse.java |   36 +
 .../java/base/messages/DefaultPlcWriteRequest.java |  275 +++++
 .../base/messages/DefaultPlcWriteResponse.java     |   62 ++
 .../base/messages/InternalPlcFieldRequest.java     |   31 +
 .../base/messages/InternalPlcFieldResponse.java    |   26 +
 .../java/base/messages/InternalPlcMessage.java     |   23 +
 .../messages/InternalPlcProprietaryRequest.java    |   22 +
 .../messages/InternalPlcProprietaryResponse.java   |   22 +
 .../java/base/messages/InternalPlcReadRequest.java |   26 +
 .../base/messages/InternalPlcReadResponse.java     |   31 +
 .../java/base/messages/InternalPlcRequest.java     |   24 +
 .../java/base/messages/InternalPlcResponse.java    |   25 +
 .../messages/InternalPlcSubscriptionEvent.java     |   25 +
 .../messages/InternalPlcSubscriptionRequest.java   |   36 +
 .../messages/InternalPlcSubscriptionResponse.java  |   30 +
 .../messages/InternalPlcUnsubscriptionRequest.java |   29 +
 .../InternalPlcUnsubscriptionResponse.java         |   25 +
 .../base/messages/InternalPlcWriteRequest.java     |   36 +
 .../base/messages/InternalPlcWriteResponse.java    |   28 +
 .../java/base/messages/PlcProprietaryRequest.java  |   25 +
 .../java/base/messages/PlcProprietaryResponse.java |   25 +
 .../java/base/messages/PlcProprietarySender.java   |   25 +
 .../java/base/messages/PlcProtocolMessage.java     |   25 +
 .../plc4x/java/base/messages/PlcRawMessage.java    |   46 +
 .../apache/plc4x/java/base/messages/PlcReader.java |   40 +
 .../java/base/messages/PlcRequestContainer.java    |   85 ++
 .../plc4x/java/base/messages/PlcSubscriber.java    |   63 ++
 .../apache/plc4x/java/base/messages/PlcWriter.java |   40 +
 .../base/messages/items/BaseDefaultFieldItem.java  |  193 ++++
 .../messages/items/DefaultBigDecimalFieldItem.java |  171 ++++
 .../messages/items/DefaultBigIntegerFieldItem.java |  171 ++++
 .../messages/items/DefaultBooleanFieldItem.java    |  184 ++++
 .../messages/items/DefaultByteArrayFieldItem.java  |   58 ++
 .../base/messages/items/DefaultByteFieldItem.java  |  151 +++
 .../messages/items/DefaultDoubleFieldItem.java     |  158 +++
 .../base/messages/items/DefaultFloatFieldItem.java |  156 +++
 .../messages/items/DefaultIntegerFieldItem.java    |  153 +++
 .../messages/items/DefaultLocalDateFieldItem.java  |   50 +
 .../items/DefaultLocalDateTimeFieldItem.java       |   78 ++
 .../messages/items/DefaultLocalTimeFieldItem.java  |   50 +
 .../base/messages/items/DefaultLongFieldItem.java  |  154 +++
 .../base/messages/items/DefaultShortFieldItem.java |  151 +++
 .../messages/items/DefaultStringFieldItem.java     |   48 +
 .../base/model/DefaultPlcConsumerRegistration.java |   85 ++
 .../base/model/DefaultPlcSubscriptionHandle.java   |   62 ++
 .../model/InternalPlcConsumerRegistration.java     |   32 +
 .../base/model/InternalPlcSubscriptionHandle.java  |   25 +
 .../java/base/model/SubscriptionPlcField.java      |   55 +
 .../SingleItemToSingleRequestProtocol.java         |  645 ++++++++++++
 .../messages/DefaultPlcReadResponseSpec.groovy     |   86 ++
 .../base/messages/items/DefaultItemsSpec.groovy    |  217 ++++
 .../base/connection/AbstractPlcConnectionTest.java |  101 ++
 .../base/connection/NettyPlcConnectionTest.java    |   92 ++
 .../messages/DefaultPlcProprietaryRequestTest.java |   48 +
 .../DefaultPlcProprietaryResponseTest.java         |   50 +
 .../base/messages/DefaultPlcReadRequestTest.java   |  116 +++
 .../base/messages/DefaultPlcReadResponseTest.java  |  120 +++
 .../messages/DefaultPlcSubscriptionEventTest.java  |   68 ++
 .../DefaultPlcSubscriptionRequestTest.java         |  157 +++
 .../DefaultPlcSubscriptionResponseTest.java        |  124 +++
 .../DefaultPlcUnsubscriptionRequestTest.java       |   91 ++
 .../DefaultPlcUnsubscriptionResponseTest.java      |   48 +
 .../base/messages/DefaultPlcWriteRequestTest.java  |   70 ++
 .../base/messages/DefaultPlcWriteResponseTest.java |   91 ++
 .../java/base/messages/PlcRawMessageTest.java      |   57 ++
 .../base/messages/PlcRequestContainerTest.java     |   82 ++
 .../messages/items/DefaultLongFieldItemTest.java   |  114 +++
 .../model/DefaultPlcConsumerRegistrationTest.java  |   88 ++
 .../model/DefaultPlcSubscriptionHandleTest.java    |   73 ++
 .../java/base/model/SubscriptionPlcFieldTest.java  |   68 ++
 .../SingleItemToSingleRequestProtocolTest.java     |  729 ++++++++++++++
 ...spockframework.report.IReportCreator.properties |    0
 plc4j/protocols/driver-bases/pcap-socket/pom.xml   |   67 ++
 .../java/base/connection/PcapChannelFactory.java   |  101 ++
 plc4j/protocols/driver-bases/pom.xml               |   46 +
 plc4j/protocols/driver-bases/raw-socket/pom.xml    |   67 ++
 .../base/connection/RawSocketChannelFactory.java   |  110 ++
 plc4j/protocols/driver-bases/serial/pom.xml        |   81 ++
 .../connection/connection/SerialChannel.java       |  635 ++++++++++++
 .../connection/SerialChannelFactory.java           |   83 ++
 .../connection/SerialChannelHandler.java           |  172 ++++
 .../connection/SerialPollingSelector.java          |  176 ++++
 .../connection/connection/SerialSelectionKey.java  |   80 ++
 .../connection/SerialSelectorProvider.java         |   68 ++
 .../connection/connection/SerialSocketAddress.java |   47 +
 .../connection/connection/SerialSocketChannel.java |  158 +++
 .../base/connection/SerialChannelFactoryTest.java  |  111 +++
 plc4j/protocols/driver-bases/tcp/pom.xml           |   62 ++
 .../tcp/connection/TcpSocketChannelFactory.java    |  112 +++
 plc4j/protocols/driver-bases/test/pom.xml          |   97 ++
 .../org/apache/plc4x/java/mock/MockDevice.java     |   50 +
 .../java/org/apache/plc4x/java/mock/MockField.java |   49 +
 .../apache/plc4x/java/mock/MockFieldHandler.java   |  103 ++
 .../org/apache/plc4x/java/mock/MockFieldItem.java  |   34 +
 .../apache/plc4x/java/mock/PlcMockConnection.java  |  193 ++++
 .../org/apache/plc4x/java/mock/PlcMockDriver.java  |   62 ++
 .../plc4x/java/mock/connection/MockConnection.java |   41 +
 .../java/mock/connection/TestChannelFactory.java   |   45 +
 .../java/mock/connection/tcp/TcpHexDumper.java     |    0
 .../mock/protocol/Plc4XSupportedDataTypes.java     |    0
 .../org/apache/plc4x/java/mock/util/Assert.java    |    0
 .../org/apache/plc4x/java/mock/util/HexUtil.java   |    0
 ...spockframework.report.IReportCreator.properties |    0
 .../services/org.apache.plc4x.java.spi.PlcDriver}  |    0
 .../plc4x/java/mock/MockFieldHandlerTest.java      |  111 +++
 .../apache/plc4x/java/mock/MockFieldItemTest.java  |   31 +
 .../org/apache/plc4x/java/mock/MockFieldTest.java  |   48 +
 .../plc4x/java/mock/PlcMockConnectionTest.java     |  164 +++
 .../apache/plc4x/java/mock/PlcMockDriverTest.java  |   96 ++
 plc4j/protocols/driver-bases/udp/pom.xml           |   62 ++
 .../base/connection/UdpSocketChannelFactory.java   |  110 ++
 plc4j/protocols/ethernet-ip/pom.xml                |    8 +-
 .../ethernetip/netty/Plc4XEtherNetIpProtocol.java  |   16 +-
 .../ethernetip/netty/util/EnipPlcFieldHandler.java |   28 +-
 plc4j/protocols/iso-on-tcp/pom.xml                 |   14 +-
 .../java/isoontcp/protocol/IsoOnTcpProtocol.java   |    4 +-
 .../isoontcp/protocol/model/IsoOnTcpMessage.java   |    2 +-
 plc4j/protocols/iso-tp/pom.xml                     |   13 +-
 .../plc4x/java/isotp/protocol/IsoTPProtocol.java   |    4 +-
 .../java/isotp/protocol/model/IsoTPMessage.java    |    2 +-
 .../java/isotp/protocol/model/tpdus/DataTpdu.java  |    2 +-
 .../java/isotp/protocol/model/tpdus/Tpdu.java      |    4 +-
 plc4j/protocols/modbus/pom.xml                     |   17 +-
 .../items/DefaultModbusByteArrayFieldItem.java     |  220 ++++
 .../items/DefaultModbusByteArrayPlcList.java       |  218 ----
 .../java/modbus/netty/Plc4XModbusProtocol.java     |   82 +-
 .../java/modbus/util/ModbusPlcFieldHandler.java    |   33 +-
 .../plc4x/java/modbus/ManualPlc4XModbusTest.java   |    6 +-
 .../items/DefaultModbusByteArrayFieldItemTest.java |  136 +++
 .../items/DefaultModbusByteArrayPlcValueTest.java  |  170 ----
 .../java/modbus/netty/Plc4XModbusProtocolTest.java |   57 +-
 plc4j/protocols/pom.xml                            |    7 +-
 plc4j/protocols/s7/pom.xml                         |   13 +-
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       |  337 +++----
 .../java/s7/netty/model/messages/S7Message.java    |    4 +-
 .../s7/netty/model/messages/S7RequestMessage.java  |    2 +-
 .../messages/SetupCommunicationRequestMessage.java |    2 +-
 .../strategies/DefaultS7MessageProcessor.java      |    2 +-
 .../java/s7/netty/util/S7PlcFieldHandler.java      |  142 ++-
 .../plc4x/java/s7/netty/Plc4XS7ProtocolSpec.groovy |   14 +-
 .../plc4x/java/s7/netty/Plc4XS7ProtocolTest.java   |    2 +-
 .../java/s7/netty/util/S7PlcFieldHandlerTest.java  |   44 +-
 plc4j/spi/pom.xml                                  |   86 --
 .../apache/plc4x/java/spi/ConversationContext.java |  102 --
 .../spi/GeneratedDriverByteToMessageCodec.java     |   98 --
 .../apache/plc4x/java/spi/Plc4xNettyWrapper.java   |  224 -----
 .../apache/plc4x/java/spi/Plc4xProtocolBase.java   |   80 --
 .../plc4x/java/spi/PlcMessageToMessageCodec.java   |   60 --
 .../java/spi/configuration/Configuration.java      |   23 -
 .../spi/configuration/ConfigurationFactory.java    |  241 -----
 .../java/spi/configuration/HasConfiguration.java   |   38 -
 .../annotations/ConfigurationParameter.java        |   33 -
 .../spi/configuration/annotations/Required.java    |   30 -
 .../annotations/defaults/BooleanDefaultValue.java  |   33 -
 .../annotations/defaults/DoubleDefaultValue.java   |   33 -
 .../annotations/defaults/IntDefaultValue.java      |   33 -
 .../annotations/defaults/LongDefaultValue.java     |   33 -
 .../annotations/defaults/StringDefaultValue.java   |   33 -
 .../java/spi/connection/AbstractPlcConnection.java |  193 ----
 .../plc4x/java/spi/connection/ChannelFactory.java  |   37 -
 .../spi/connection/DefaultNettyPlcConnection.java  |  187 ----
 .../spi/connection/DefaultPlcFieldHandler.java     |   97 --
 .../java/spi/connection/GeneratedDriverBase.java   |  131 ---
 .../connection/GeneratedProtocolMessageCodec.java  |   62 --
 .../java/spi/connection/NettyChannelFactory.java   |  157 ---
 .../plc4x/java/spi/connection/PlcFieldHandler.java |   58 --
 .../spi/connection/ProtocolStackConfigurer.java    |   31 -
 .../connection/SingleProtocolStackConfigurer.java  |  156 ---
 .../java/spi/events/CloseConnectionEvent.java      |   23 -
 .../apache/plc4x/java/spi/events/ConnectEvent.java |   22 -
 .../plc4x/java/spi/events/ConnectedEvent.java      |   22 -
 .../plc4x/java/spi/events/DisconnectEvent.java     |   39 -
 .../plc4x/java/spi/events/DisconnectedEvent.java   |   22 -
 .../exceptions/InternalPlcRuntimeException.java    |   41 -
 .../java/spi/generation/EvaluationHelper.java      |   58 --
 .../apache/plc4x/java/spi/generation/Message.java  |   30 -
 .../plc4x/java/spi/generation/MessageIO.java       |   23 -
 .../plc4x/java/spi/generation/MessageInput.java    |   25 -
 .../plc4x/java/spi/generation/MessageOutput.java   |   25 -
 .../plc4x/java/spi/generation/ParseException.java  |   32 -
 .../plc4x/java/spi/generation/ReadBuffer.java      |  272 -----
 .../plc4x/java/spi/generation/StaticHelper.java    |  139 ---
 .../plc4x/java/spi/generation/WriteBuffer.java     |  222 -----
 .../java/spi/generation/io/MyDefaultBitInput.java  |   38 -
 .../java/spi/generation/io/MyDefaultBitOutput.java |   37 -
 .../spi/internal/DefaultExpectRequestContext.java  |  128 ---
 .../spi/internal/DefaultSendRequestContext.java    |  138 ---
 .../java/spi/internal/HandlerRegistration.java     |   86 --
 .../spi/messages/DefaultPlcProprietaryRequest.java |   43 -
 .../messages/DefaultPlcProprietaryResponse.java    |   42 -
 .../java/spi/messages/DefaultPlcReadRequest.java   |  118 ---
 .../java/spi/messages/DefaultPlcReadResponse.java  |  616 ------------
 .../spi/messages/DefaultPlcSubscriptionEvent.java  |   55 -
 .../messages/DefaultPlcSubscriptionRequest.java    |  173 ----
 .../messages/DefaultPlcSubscriptionResponse.java   |   90 --
 .../messages/DefaultPlcUnsubscriptionRequest.java  |   90 --
 .../messages/DefaultPlcUnsubscriptionResponse.java |   36 -
 .../java/spi/messages/DefaultPlcWriteRequest.java  |  276 ------
 .../java/spi/messages/DefaultPlcWriteResponse.java |   62 --
 .../java/spi/messages/InternalPlcFieldRequest.java |   31 -
 .../spi/messages/InternalPlcFieldResponse.java     |   26 -
 .../java/spi/messages/InternalPlcMessage.java      |   23 -
 .../messages/InternalPlcProprietaryRequest.java    |   22 -
 .../messages/InternalPlcProprietaryResponse.java   |   22 -
 .../java/spi/messages/InternalPlcReadRequest.java  |   26 -
 .../java/spi/messages/InternalPlcReadResponse.java |   32 -
 .../java/spi/messages/InternalPlcRequest.java      |   24 -
 .../java/spi/messages/InternalPlcResponse.java     |   25 -
 .../spi/messages/InternalPlcSubscriptionEvent.java |   25 -
 .../messages/InternalPlcSubscriptionRequest.java   |   36 -
 .../messages/InternalPlcSubscriptionResponse.java  |   30 -
 .../messages/InternalPlcUnsubscriptionRequest.java |   29 -
 .../InternalPlcUnsubscriptionResponse.java         |   25 -
 .../java/spi/messages/InternalPlcWriteRequest.java |   36 -
 .../spi/messages/InternalPlcWriteResponse.java     |   28 -
 .../java/spi/messages/PlcProprietaryRequest.java   |   25 -
 .../java/spi/messages/PlcProprietaryResponse.java  |   25 -
 .../java/spi/messages/PlcProprietarySender.java    |   25 -
 .../java/spi/messages/PlcProtocolMessage.java      |   25 -
 .../plc4x/java/spi/messages/PlcRawMessage.java     |   46 -
 .../apache/plc4x/java/spi/messages/PlcReader.java  |   40 -
 .../java/spi/messages/PlcRequestContainer.java     |   85 --
 .../plc4x/java/spi/messages/PlcSubscriber.java     |   63 --
 .../apache/plc4x/java/spi/messages/PlcWriter.java  |   40 -
 .../spi/model/DefaultPlcConsumerRegistration.java  |   85 --
 .../spi/model/DefaultPlcSubscriptionHandle.java    |   62 --
 .../spi/model/InternalPlcConsumerRegistration.java |   32 -
 .../spi/model/InternalPlcSubscriptionHandle.java   |   25 -
 .../plc4x/java/spi/model/SubscriptionPlcField.java |   55 -
 .../spi/optimizer/RequestTransactionManager.java   |  194 ----
 .../SingleItemToSingleRequestProtocol.java         |  668 -------------
 .../apache/plc4x/java/spi/request/PlcRequest.java  |   28 -
 .../apache/plc4x/java/spi/transport/Transport.java |   32 -
 .../java/spi/transport/TransportConfiguration.java |   25 -
 .../org/apache/plc4x/java/spi/types/FieldType.java |   47 -
 .../internal/DefaultSendRequestContextTest.java    |  116 ---
 .../optimizer/RequestTransactionManagerTest.java   |  170 ----
 .../java/spi/parser/ConnectionParserTest.java      |   72 --
 plc4j/src/site/asciidoc/index.adoc                 |  100 ++
 .../src/site/asciidoc/users}/gettingstarted.adoc   |    0
 plc4j/tools/connection-pool/pom.xml                |   52 -
 .../utils/connectionpool/PooledDummyDriver.java    |   52 -
 .../connectionpool/PooledPlcDriverManagerTest.java |  367 -------
 plc4j/tools/interop/pom.xml                        |  217 ----
 .../org/apache/plc4x/interop/impl/Handler.java     |  163 ---
 .../java/org/apache/plc4x/interop/impl/Server.java |   97 --
 plc4j/tools/opm/pom.xml                            |   94 --
 .../plc4x/java/opm/PlcEntityInterceptor.java       |  565 -----------
 .../apache/plc4x/java/opm/ConnectedEntityTest.java |  119 ---
 .../plc4x/java/opm/PlcEntityInterceptorTest.java   |  233 -----
 .../java/opm/PlcEntityManagerComplexTest.java      |  470 ---------
 .../plc4x/java/opm/PlcEntityManagerTest.java       |  318 ------
 plc4j/tools/pom.xml                                |   52 -
 plc4j/tools/scraper/pom.xml                        |  133 ---
 .../triggeredscraper/TriggeredScraperImpl.java     |  366 -------
 .../triggerhandler/TriggerConfiguration.java       |  722 --------------
 .../apache/plc4x/java/scraper/ScraperTaskTest.java |  113 ---
 .../org/apache/plc4x/java/scraper/ScraperTest.java |  175 ----
 .../java/scraper/TriggeredScraperRunnerModbus.java |   62 --
 .../triggeredscraper/TriggeredScraperImplTest.java |  118 ---
 .../triggerhandler/TriggerConfigurationTest.java   |  150 ---
 plc4j/transports/pcap-socket/pom.xml               |   63 --
 .../java/transport/pcap/PcapChannelFactory.java    |   68 --
 .../plc4x/java/transport/pcap/PcapTransport.java   |   50 -
 .../transport/pcap/PcapTransportConfiguration.java |   34 -
 .../org.apache.plc4x.java.spi.transport.Transport  |   20 -
 plc4j/transports/pom.xml                           |   45 -
 plc4j/transports/raw-socket/pom.xml                |   58 --
 .../rawsocket/RawSocketChannelFactory.java         |   57 --
 .../transport/rawsocket/RawSocketTransport.java    |   43 -
 .../rawsocket/RawSocketTransportConfiguration.java |   27 -
 .../org.apache.plc4x.java.spi.transport.Transport  |   20 -
 plc4j/transports/serial/pom.xml                    |   83 --
 .../plc4x/java/transport/serial/SerialChannel.java |  636 ------------
 .../transport/serial/SerialChannelFactory.java     |   65 --
 .../transport/serial/SerialChannelHandler.java     |  181 ----
 .../transport/serial/SerialPollingSelector.java    |  176 ----
 .../java/transport/serial/SerialSelectionKey.java  |   86 --
 .../transport/serial/SerialSelectorProvider.java   |   68 --
 .../java/transport/serial/SerialSocketAddress.java |   50 -
 .../java/transport/serial/SerialSocketChannel.java |  158 ---
 .../java/transport/serial/SerialTransport.java     |   42 -
 .../serial/SerialTransportConfiguration.java       |   25 -
 .../org.apache.plc4x.java.spi.transport.Transport  |   20 -
 .../base/connection/SerialChannelFactoryTest.java  |  116 ---
 plc4j/transports/tcp/pom.xml                       |   58 --
 .../java/transport/tcp/TcpChannelFactory.java      |   62 --
 .../plc4x/java/transport/tcp/TcpTransport.java     |   81 --
 .../transport/tcp/TcpTransportConfiguration.java   |   49 -
 .../org.apache.plc4x.java.spi.transport.Transport  |   20 -
 plc4j/transports/test/pom.xml                      |   84 --
 .../java/transport/test/TestChannelFactory.java    |   58 --
 .../java/transport/test/TestSocketAddress.java     |   29 -
 .../plc4x/java/transport/test/TestTransport.java   |   42 -
 .../transport/test/TestTransportConfiguration.java |   25 -
 .../org.apache.plc4x.java.spi.transport.Transport  |   20 -
 plc4j/transports/udp/pom.xml                       |   66 --
 .../java/transport/udp/UdpChannelFactory.java      |   65 --
 .../plc4x/java/transport/udp/UdpTransport.java     |   81 --
 .../transport/udp/UdpTransportConfiguration.java   |   31 -
 .../udp/protocol/DatagramUnpackingHandler.java     |   39 -
 .../org.apache.plc4x.java.spi.transport.Transport  |   20 -
 plc4j/utils/connection-pool/pom.xml                |   51 +
 .../plc4x/java/utils/connectionpool/PoolKey.java   |    0
 .../java/utils/connectionpool/PoolKeyFactory.java  |    0
 .../connectionpool/PooledPlcConnectionFactory.java |    0
 .../connectionpool/PooledPlcDriverManager.java     |    0
 .../utils/connectionpool/PoolKeyFactoryTest.java   |    0
 .../utils/connectionpool/PooledDummyDriver.java    |   52 +
 .../connectionpool/PooledPlcDriverManagerTest.java |  367 +++++++
 .../services/org.apache.plc4x.java.spi.PlcDriver}  |    0
 .../connection-pool/src/test/resources/logback.xml |    0
 plc4j/utils/driver-base-java/pom.xml               |   42 +
 .../github/jinahya/bit/io/MyDefaultBitInput.java   |   35 +
 .../apache/plc4x/java/utils/EvaluationHelper.java  |   53 +
 .../java/org/apache/plc4x/java/utils/Message.java  |   26 +
 .../org/apache/plc4x/java/utils/MessageIO.java     |   23 +
 .../org/apache/plc4x/java/utils/MessageInput.java  |   25 +
 .../org/apache/plc4x/java/utils/MessageOutput.java |   25 +
 .../apache/plc4x/java/utils/ParseException.java    |   32 +
 .../org/apache/plc4x/java/utils/ReadBuffer.java    |  219 ++++
 .../org/apache/plc4x/java/utils/WriteBuffer.java   |  208 ++++
 plc4j/utils/interop/pom.xml                        |  216 ++++
 .../interop/src/assembly/assembly.xml              |    0
 .../java/org/apache/plc4x/interop/impl/Client.java |    0
 .../org/apache/plc4x/interop/impl/Handler.java     |  160 +++
 .../java/org/apache/plc4x/interop/impl/Server.java |   91 ++
 plc4j/utils/opm/pom.xml                            |  103 ++
 .../org/apache/plc4x/java/opm/AliasRegistry.java   |    0
 .../org/apache/plc4x/java/opm/OPMException.java    |    0
 .../java/org/apache/plc4x/java/opm/OpmUtils.java   |    0
 .../java/org/apache/plc4x/java/opm/PlcEntity.java  |    0
 .../plc4x/java/opm/PlcEntityInterceptor.java       |  569 +++++++++++
 .../apache/plc4x/java/opm/PlcEntityManager.java    |    0
 .../java/org/apache/plc4x/java/opm/PlcField.java   |    0
 .../apache/plc4x/java/opm/SimpleAliasRegistry.java |    0
 .../opm/src/site/asciidoc/opm/using-opm.adoc       |    0
 plc4j/{tools => utils}/opm/src/site/site.xml       |    0
 .../apache/plc4x/java/opm/ConnectedEntityTest.java |  119 +++
 .../apache/plc4x/java/opm/OPMExceptionTest.java    |    0
 .../org/apache/plc4x/java/opm/OpmUtilsTest.java    |    0
 .../plc4x/java/opm/PlcEntityInterceptorTest.java   |  214 ++++
 .../java/opm/PlcEntityManagerComplexTest.java      |  460 +++++++++
 .../plc4x/java/opm/PlcEntityManagerTest.java       |  318 ++++++
 .../plc4x/java/opm/SimpleAliasRegistryTest.java    |    0
 .../opm/src/test/resources/logback.xml             |    0
 plc4j/utils/pcap-sockets/pom.xml                   |    2 +-
 .../utils/pcapsockets/netty/PacketHandler.java     |   27 +
 .../utils/pcapsockets/netty/PcapSocketAddress.java |   21 +-
 .../utils/pcapsockets/netty/PcapSocketChannel.java |   20 +-
 .../pcapsockets/netty/PcapSocketChannelConfig.java |   52 +-
 .../pcapsockets/netty/PcapSocketChannelOption.java |   21 +-
 .../pcapsockets/netty/TcpIpPacketHandler.java      |   41 +
 .../pcapsockets/netty/UdpIpPacketHandler.java      |   41 +
 .../pcapsockets/netty/handlers/PacketHandler.java  |   27 -
 .../netty/handlers/TcpIpPacketHandler.java         |   41 -
 .../netty/handlers/UdpIpPacketHandler.java         |   41 -
 plc4j/utils/pom.xml                                |   22 +-
 plc4j/utils/protocol-test-utils/pom.xml            |   72 ++
 .../protocol/test/ProtocolTestsuiteRunner.java     |  175 ++++
 .../exceptions/ProtocolTestsuiteException.java     |   32 +
 .../protocol/test/model/ProtocolTestsuite.java     |   48 +
 .../apache/plc4x/protocol/test/model/Testcase.java |   61 ++
 .../src/main/resources/schemas/testsuite.xsd       |   55 +
 plc4j/utils/raw-sockets/pom.xml                    |    4 +-
 .../utils/rawsockets/netty/RawSocketAddress.java   |    1 -
 .../utils/rawsockets/netty/RawSocketChannel.java   |    3 +-
 plc4j/{tools => utils}/scraper/README.md           |    0
 plc4j/utils/scraper/pom.xml                        |  145 +++
 .../apache/plc4x/java/scraper/ResultHandler.java   |    0
 .../org/apache/plc4x/java/scraper/ScrapeJob.java   |    0
 .../apache/plc4x/java/scraper/ScrapeJobImpl.java   |    0
 .../org/apache/plc4x/java/scraper/Scraper.java     |    0
 .../org/apache/plc4x/java/scraper/ScraperImpl.java |    0
 .../org/apache/plc4x/java/scraper/ScraperTask.java |    0
 .../apache/plc4x/java/scraper/ScraperTaskImpl.java |    0
 .../java/scraper/config/JobConfiguration.java      |    0
 .../config/JobConfigurationClassicImpl.java        |    0
 .../config/JobConfigurationClassicImplBuilder.java |    0
 .../java/scraper/config/JobConfigurationImpl.java  |    0
 .../java/scraper/config/ScraperConfiguration.java  |    0
 .../config/ScraperConfigurationClassicImpl.java    |    0
 .../ScraperConfigurationClassicImplBuilder.java    |    0
 .../JobConfigurationTriggeredImpl.java             |    0
 .../JobConfigurationTriggeredImplBuilder.java      |    0
 .../ScraperConfigurationTriggeredImpl.java         |    0
 .../ScraperConfigurationTriggeredImplBuilder.java  |    0
 .../exception/ScraperConfigurationException.java   |    0
 .../java/scraper/exception/ScraperException.java   |    0
 .../triggeredscraper/TriggeredScrapeJobImpl.java   |    0
 .../triggeredscraper/TriggeredScraperImpl.java     |  367 +++++++
 .../triggeredscraper/TriggeredScraperMBean.java    |    0
 .../triggeredscraper/TriggeredScraperTask.java     |    0
 .../TriggeredScraperTaskMBean.java                 |    0
 .../triggerhandler/TriggerConfiguration.java       |  722 ++++++++++++++
 .../triggerhandler/TriggerHandler.java             |    0
 .../triggerhandler/TriggerHandlerImpl.java         |    0
 .../triggerhandler/collector/TriggerCollector.java |    0
 .../collector/TriggerCollectorImpl.java            |    0
 .../scraper/util/PercentageAboveThreshold.java     |    0
 .../apache/plc4x/java/s7/ManualS7PlcDriverMT.java  |    0
 .../java/scraper/ScraperConfigurationTest.java     |    0
 .../apache/plc4x/java/scraper/ScraperRunner.java   |    0
 .../apache/plc4x/java/scraper/ScraperTaskTest.java |  113 +++
 .../org/apache/plc4x/java/scraper/ScraperTest.java |  175 ++++
 .../plc4x/java/scraper/TriggeredScraperRunner.java |    0
 .../java/scraper/TriggeredScraperRunnerModbus.java |   69 ++
 .../config/ScraperConfigurationBuilderTest.java    |    0
 .../triggeredscraper/TriggeredScraperImplTest.java |  118 +++
 .../triggerhandler/TriggerConfigurationTest.java   |  151 +++
 .../scraper/src/test/resources/config.json         |    0
 .../scraper/src/test/resources/config.yml          |    0
 .../scraper/src/test/resources/example.yml         |    0
 .../test/resources/example_triggered_scraper.yml   |    0
 .../resources/example_triggered_scraper_modbus.yml |    0
 .../src/test/resources/example_with_strings.yml    |    0
 .../scraper/src/test/resources/logback-test.xml    |    0
 .../scraper/src/test/resources/logback.xml         |    0
 .../src/test/resources/mock-scraper-config.yml     |    0
 plc4j/utils/test-utils/pom.xml                     |   39 +-
 .../test/protocol/ProtocolTestsuiteRunner.java     |  238 -----
 .../exceptions/ProtocolTestsuiteException.java     |   32 -
 .../test/protocol/model/ProtocolTestsuite.java     |   48 -
 .../apache/plc4x/test/protocol/model/Testcase.java |   68 --
 .../src/main/resources/schemas/testsuite.xsd       |   63 --
 pom.xml                                            |  215 +++-
 protocols/ab-eth/pom.xml                           |    4 +-
 protocols/amsads/pom.xml                           |   43 -
 .../plc4x/protocol/amsads/AMSADSProtocol.java      |   46 -
 ...e.plc4x.plugins.codegenerator.protocol.Protocol |   38 -
 .../main/resources/protocols/amsads/amsads.mspec   |  350 -------
 protocols/bacnetip/pom.xml                         |    4 +-
 .../resources/protocols/bacnetip/bacnetip.mspec    |  176 ++--
 protocols/df1/pom.xml                              |    4 +-
 protocols/knxnetip/pom.xml                         |    4 +-
 ...e.plc4x.plugins.codegenerator.protocol.Protocol |    2 +-
 .../resources/protocols/knxnetip/knxnetip.mspec    |  352 +------
 protocols/modbus/pom.xml                           |   43 -
 .../plc4x/protocol/modbus/ModbusProtocol.java      |   46 -
 ...e.plc4x.plugins.codegenerator.protocol.Protocol |   19 -
 .../main/resources/protocols/modbus/modbus.mspec   |  269 -----
 protocols/pom.xml                                  |   20 +-
 protocols/proxy/pom.xml                            |    2 +-
 protocols/s7/pom.xml                               |    4 +-
 ...e.plc4x.plugins.codegenerator.protocol.Protocol |    2 +-
 .../s7/src/main/resources/protocols/s7/s7.mspec    |  208 +---
 sandbox/.gitignore                                 |    1 -
 sandbox/code-gen/pom.xml                           |    2 +-
 .../plc4x/codegen/ast/AssignementExpression.java   |    6 +-
 .../apache/plc4x/codegen/ast/BinaryExpression.java |    6 +-
 .../java/org/apache/plc4x/codegen/ast/Block.java   |    6 +-
 .../apache/plc4x/codegen/ast/CallExpression.java   |    6 +-
 .../apache/plc4x/codegen/ast/ClassDeclaration.java |    6 +-
 .../plc4x/codegen/ast/ConstantExpression.java      |    6 +-
 .../plc4x/codegen/ast/ConstructorDeclaration.java  |    6 +-
 .../plc4x/codegen/ast/DeclarationStatement.java    |    6 +-
 .../apache/plc4x/codegen/ast/FieldDeclaration.java |    6 +-
 .../apache/plc4x/codegen/ast/FieldReference.java   |    6 +-
 .../org/apache/plc4x/codegen/ast/FileNode.java     |    6 +-
 .../org/apache/plc4x/codegen/ast/IfStatement.java  |    6 +-
 .../apache/plc4x/codegen/ast/JavaGenerator.java    |   69 +-
 .../org/apache/plc4x/codegen/ast/LineComment.java  |    6 +-
 .../java/org/apache/plc4x/codegen/ast/Method.java  |    6 +-
 .../apache/plc4x/codegen/ast/MethodDefinition.java |    6 +-
 .../apache/plc4x/codegen/ast/NewExpression.java    |    6 +-
 .../plc4x/codegen/ast/ParameterExpression.java     |    6 +-
 .../org/apache/plc4x/codegen/ast/Primitive.java    |    6 +-
 .../apache/plc4x/codegen/ast/PythonGenerator.java  |   69 +-
 .../apache/plc4x/codegen/ast/ReturnStatement.java  |    6 +-
 .../apache/plc4x/codegen/ast/TypeDefinition.java   |    6 +-
 .../plc4x/codegen/python/AbstractNodeVisitor.java  |   96 +-
 .../org/apache/plc4x/codegen/python/AddNode.java   |    3 +-
 .../org/apache/plc4x/codegen/python/AliasNode.java |    3 +-
 .../plc4x/codegen/python/AnnAssignerNode.java      |    3 +-
 .../org/apache/plc4x/codegen/python/ArgNode.java   |    3 +-
 .../apache/plc4x/codegen/python/ArgumentsNode.java |    3 +-
 .../apache/plc4x/codegen/python/AssignNode.java    |    3 +-
 .../apache/plc4x/codegen/python/AttributeNode.java |    3 +-
 .../apache/plc4x/codegen/python/AugAssignNode.java |    3 +-
 .../org/apache/plc4x/codegen/python/BinOpNode.java |    3 +-
 .../org/apache/plc4x/codegen/python/CallNode.java  |    3 +-
 .../apache/plc4x/codegen/python/ClassDefNode.java  |    3 +-
 .../apache/plc4x/codegen/python/CompareNode.java   |    3 +-
 .../org/apache/plc4x/codegen/python/EqNode.java    |    3 +-
 .../org/apache/plc4x/codegen/python/ExprNode.java  |    3 +-
 .../plc4x/codegen/python/FunctionDefNode.java      |    3 +-
 .../org/apache/plc4x/codegen/python/IfNode.java    |    3 +-
 .../plc4x/codegen/python/ImportFromNode.java       |    3 +-
 .../apache/plc4x/codegen/python/KeywordNode.java   |    3 +-
 .../org/apache/plc4x/codegen/python/ListNode.java  |    3 +-
 .../org/apache/plc4x/codegen/python/LoadNode.java  |    3 +-
 .../apache/plc4x/codegen/python/ModuleNode.java    |    3 +-
 .../org/apache/plc4x/codegen/python/MultNode.java  |    3 +-
 .../plc4x/codegen/python/NameConstantNode.java     |    3 +-
 .../org/apache/plc4x/codegen/python/NameNode.java  |    3 +-
 .../org/apache/plc4x/codegen/python/NotEqNode.java |    3 +-
 .../org/apache/plc4x/codegen/python/NumNode.java   |    3 +-
 .../org/apache/plc4x/codegen/python/PassNode.java  |    3 +-
 .../apache/plc4x/codegen/python/ReturnNode.java    |    3 +-
 .../org/apache/plc4x/codegen/python/StoreNode.java |    3 +-
 .../org/apache/plc4x/codegen/python/StrNode.java   |    3 +-
 .../org/apache/plc4x/codegen/python/TupleNode.java |    3 +-
 .../org/apache/plc4x/codegen/python/WhileNode.java |    3 +-
 .../org/apache/plc4x/codegen/ModuleNodeTest.java   |   33 +-
 sandbox/plc-simulator/pom.xml                      |   22 +-
 .../apache/plc4x/java/s7/utils/StaticHelper.java   |  137 ---
 .../server/s7/protocol/S7Step7Protocol.java        |   20 +-
 .../server/s7/protocol/S7Step7ServerProtocol.java  |    2 +-
 sandbox/plc4cpp/pom.xml                            |    4 +-
 sandbox/plc4net/api/pom.xml                        |    2 +-
 sandbox/plc4net/plc4net.driver/pom.xml             |    2 +-
 sandbox/plc4net/pom.xml                            |    2 +-
 sandbox/plc4py/pom.xml                             |    8 +-
 sandbox/pom.xml                                    |   18 +-
 .../READMME.adoc                                   |    0
 sandbox/streampipes-connectors/env/development     |   27 +
 sandbox/streampipes-connectors/pom.xml             |  199 ++++
 .../java/streampipes/bacnetip/BacNetIpAdapter.java |  372 +++++++
 .../streampipes/bacnetip/config/ConfigKeys.java    |   31 +
 .../bacnetip/config/ConnectWorkerConfig.java       |   83 ++
 sandbox/test-java-amsads-driver/README.adoc        |   35 -
 sandbox/test-java-amsads-driver/pom.xml            |  178 ----
 .../apache/plc4x/java/amsads/AMSADSPlcDriver.java  |   90 --
 .../amsads/configuration/AdsConfiguration.java     |   74 --
 .../connection/AdsAbstractPlcConnection.java       |  231 -----
 .../amsads/connection/AdsConnectionFactory.java    |   58 --
 .../amsads/connection/AdsSerialPlcConnection.java  |   60 --
 .../amsads/connection/AdsTcpPlcConnection.java     |  365 -------
 .../apache/plc4x/java/amsads/field/AdsField.java   |   27 -
 .../plc4x/java/amsads/field/AdsFieldHandler.java   | 1047 --------------------
 .../plc4x/java/amsads/field/DirectAdsField.java    |  142 ---
 .../plc4x/java/amsads/field/SymbolicAdsField.java  |  106 --
 .../java/amsads/model/AdsSubscriptionHandle.java   |   85 --
 .../java/amsads/protocol/Ads2PayloadProtocol.java  |   93 --
 .../java/amsads/protocol/AdsProtocolLogic.java     |   41 -
 .../amsads/protocol/Payload2SerialProtocol.java    |  114 ---
 .../java/amsads/protocol/Payload2TcpProtocol.java  |   94 --
 .../java/amsads/protocol/Plc4x2AdsProtocol.java    |  334 -------
 .../amsads/protocol/exception/AdsException.java    |   56 --
 .../exception/AdsProtocolOverflowException.java    |   32 -
 .../java/amsads/protocol/util/DigestUtil.java      |   46 -
 .../amsads/protocol/util/LittleEndianDecoder.java  |  489 ---------
 .../amsads/protocol/util/LittleEndianEncoder.java  |  285 ------
 .../protocol/util/SingleMessageRateLimiter.java    |  124 ---
 .../java/amsads/protocol/util/package-info.java    |   22 -
 .../plc4x/java/amsads/types/AdsDataType.java       |  577 -----------
 .../services/org.apache.plc4x.java.api.PlcDriver   |   38 -
 .../plc4x/java/amsads/AMSADSPlcDriverTest.java     |   42 -
 .../protocol/amsads/BenchmarkGeneratedDf1.java     |   76 --
 .../plc4x/protocol/amsads/BenchmarkManualDf1.java  |  239 -----
 .../org/apache/plc4x/protocol/amsads/Df1Test.java  |   31 -
 .../apache/plc4x/protocol/amsads/EndToEndTest.java |   56 --
 .../org/apache/plc4x/protocol/amsads/IOTest.java   |   91 --
 .../src/test/resources/testsuite/Df1Testsuite.xml  |  101 --
 sandbox/test-java-bacnetip-driver/pom.xml          |   42 +-
 .../plc4x/java/bacnetip/PassiveBacNetIpDriver.java |  101 +-
 .../PassiveBacNetIpConfiguration.java              |   73 --
 .../bacnetip/connection/BacNetIpFieldHandler.java  |   36 +
 .../connection/PassiveBacNetIpPlcConnection.java   |  118 +++
 .../apache/plc4x/java/bacnetip/ede/EdeParser.java  |  101 --
 .../plc4x/java/bacnetip/ede/model/Datapoint.java   |  135 ---
 .../plc4x/java/bacnetip/ede/model/EdeModel.java    |   37 -
 .../plc4x/java/bacnetip/field/BacNetIpField.java   |  121 ---
 .../java/bacnetip/field/BacNetIpFieldHandler.java  |   35 -
 .../plc4x/java/bacnetip/model/BacNetIpField.java   |   47 +
 .../java/bacnetip/protocol/BacNetIpProtocol.java   |   62 ++
 .../java/bacnetip/protocol/HelloWorldProtocol.java |   72 ++
 .../protocol/PassiveBacNetIpProtocolLogic.java     |  229 -----
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 .../plc4x/java/bacnetip/ManualBacNetDecoder.java   |    4 +-
 .../java/bacnetip/PassiveBacNetIpDriverManual.java |   25 +-
 .../src/test/resources/logback.xml                 |   36 -
 sandbox/test-java-df1-driver/pom.xml               |   39 +-
 .../org/apache/plc4x/java/df1/DF1PlcDriver.java    |   60 +-
 .../java/org/apache/plc4x/java/df1/Df1Field.java   |   62 ++
 .../java/df1/configuration/Df1Configuration.java   |   33 -
 .../java/df1/connection/BaseDf1Connection.java     |   34 +
 .../java/df1/connection/SerialDf1Connection.java   |  148 +++
 .../org/apache/plc4x/java/df1/field/Df1Field.java  |   61 --
 .../plc4x/java/df1/field/Df1FieldHandler.java      |   39 -
 .../org/apache/plc4x/java/df1/fields/DataType.java |   44 +
 .../plc4x/java/df1/protocol/Df1Protocol.java       |   14 +-
 .../plc4x/java/df1/protocol/Df1ProtocolLogic.java  |   43 -
 .../plc4x/java/df1/protocol/Plc4XDf1Protocol.java  |   23 +-
 .../org/apache/plc4x/java/df1/types/DataType.java  |   44 -
 .../org/apache/plc4x/java/df1/util/DF1Utils.java   |   14 +-
 .../plc4x/java/df1/util/Df1FieldHandler.java       |   39 +
 ...cDriver => org.apache.plc4x.java.spi.PlcDriver} |    0
 .../apache/plc4x/java/df1/DF1PlcDriverTest.java    |   44 +
 .../plc4x/protocol/df1/BenchmarkGeneratedDf1.java  |    5 +
 .../org/apache/plc4x/protocol/df1/Df1Test.java     |    2 +-
 .../java/org/apache/plc4x/protocol/df1/IOTest.java |    2 +-
 .../src/test/resources/testsuite/Df1Testsuite.xml  |    8 +-
 sandbox/test-java-knxnetip-driver/pom.xml          |  116 +++
 .../org/apache/plc4x/java/knxnetip/IOTest.java     |  102 ++
 .../apache/plc4x/java/knxnetip/KNXNetIpTest.java   |   30 +
 .../test/resources/testsuite/KNXNetIPTestsuite.xml |  544 ++++++++++
 sandbox/test-java-modbus-driver/pom.xml            |  136 ---
 .../org/apache/plc4x/java/modbus/ModbusDriver.java |   95 --
 .../java/modbus/config/ModbusConfiguration.java    |   64 --
 .../plc4x/java/modbus/field/ModbusField.java       |   74 --
 .../plc4x/java/modbus/field/ModbusFieldCoil.java   |   45 -
 .../modbus/field/ModbusFieldDiscreteInput.java     |   46 -
 .../java/modbus/field/ModbusFieldHandler.java      |  115 ---
 .../modbus/field/ModbusFieldHoldingRegister.java   |   46 -
 .../modbus/field/ModbusFieldInputRegister.java     |   45 -
 .../modbus/field/ModbusFieldMaskWriteRegister.java |   98 --
 .../java/modbus/field/ModbusFieldRegister.java     |   47 -
 .../java/modbus/protocol/ModbusProtocolLogic.java  |  130 ---
 .../services/org.apache.plc4x.java.api.PlcDriver   |   19 -
 .../org/apache/plc4x/java/modbus/ModbusIOTest.java |   29 -
 .../test/resources/testsuite/ModbusTestsuite.xml   |   64 --
 sandbox/test-java-passive-s7-driver/pom.xml        |  100 ++
 .../plc4x/javapassive/s7/PassiveS7PlcDriver.java   |   90 ++
 .../s7/connection/PassiveS7PlcConnection.java      |   99 ++
 .../s7/protocol/HelloWorldProtocol.java            |   48 +
 .../javapassive/s7/protocol/PassiveS7Protocol.java |   62 ++
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   19 +
 .../src/test/java/BenchmarkGeneratedPassiveS7.java |   45 +
 sandbox/test-java-s7-driver/pom.xml                |   46 +-
 .../apache/plc4x/java/s7/readwrite/S7Driver.java   |  107 --
 .../readwrite/configuration/S7Configuration.java   |  148 ---
 .../plc4x/java/s7/readwrite/field/S7Field.java     |  265 -----
 .../java/s7/readwrite/field/S7PlcFieldHandler.java |  584 -----------
 .../optimizer/DefaultS7MessageProcessor.java       |  290 ------
 .../s7/readwrite/optimizer/S7MessageProcessor.java |   40 -
 .../s7/readwrite/protocol/S7ProtocolLogic.java     |  693 -------------
 .../java/s7/readwrite/types/S7ControllerType.java  |   30 -
 .../java/s7/readwrite/utils/S7TsapIdEncoder.java   |   48 -
 .../apache/plc4x/java/s7/utils/StaticHelper.java   |  138 ---
 .../services/org.apache.plc4x.java.api.PlcDriver   |   19 -
 .../src/main/resources/logback.xml                 |   36 -
 .../src/test/java/BenchmarkGeneratedS7.java        |    8 +-
 .../java/s7/readwrite/ManualS7DriverTest.java      |   33 -
 sandbox/test-streampipes-plc4x-adapters/Dockerfile |   24 -
 .../test-streampipes-plc4x-adapters/READMME.adoc   |   49 -
 .../env/development                                |   26 -
 sandbox/test-streampipes-plc4x-adapters/pom.xml    |  241 -----
 .../java/streampipes/adapters/Plc4xAdapters.java   |   43 -
 .../streampipes/adapters/config/ConfigKeys.java    |   31 -
 .../adapters/config/ConnectWorkerConfig.java       |   84 --
 .../adapters/source/bacnetip/BacNetIpAdapter.java  |  381 -------
 .../adapters/source/knxnetip/KnxNetIpAdapter.java  |  222 -----
 .../test-streampipes-plc4x-processors/Dockerfile   |   24 -
 .../env/development                                |   24 -
 sandbox/test-streampipes-plc4x-processors/pom.xml  |  281 ------
 .../processors/Plc4xProcessorsInit.java            |   55 -
 .../java/streampipes/processors/config/Config.java |   86 --
 .../streampipes/processors/config/ConfigKeys.java  |   33 -
 .../ede/BacNetIpEdeDataEnrichmentController.java   |   88 --
 .../enrich/knxnetip/ets5/Ets5DataEnrichment.java   |  106 --
 .../ets5/Ets5DataEnrichmentController.java         |   93 --
 .../ets5/Ets5DataEnrichmentParameters.java         |   43 -
 .../strings.en                                     |   27 -
 .../strings.en                                     |   30 -
 sandbox/test-streampipes-plc4x-shared/pom.xml      |   32 -
 .../shared/source/bacnetip/Constants.java          |   22 -
 .../shared/source/knxnetip/Constants.java          |   24 -
 src/main/script/prerequisiteCheck.groovy           |   38 -
 src/site/asciidoc/apache/index.adoc                |   20 -
 .../developers/code-gen/protocol/mspec.adoc        |    2 -
 src/site/asciidoc/developers/index.adoc            |   20 -
 src/site/asciidoc/index.adoc                       |  318 ++----
 src/site/asciidoc/plc4j/index.adoc                 |  100 --
 src/site/asciidoc/plc4j/users/gettingstarted.adoc  |  178 ----
 src/site/asciidoc/users/download.adoc              |    6 +-
 src/site/asciidoc/users/gettingstarted.adoc        |    2 +-
 src/site/asciidoc/users/index.adoc                 |   61 --
 .../users/integrations/apache-calcite.adoc         |   24 -
 .../asciidoc/users/integrations/apache-camel.adoc  |   20 -
 .../asciidoc/users/integrations/apache-edgent.adoc |   20 -
 .../asciidoc/users/integrations/apache-iotdb.adoc  |   20 -
 .../asciidoc/users/integrations/apache-kafka.adoc  |   24 -
 .../asciidoc/users/integrations/apache-nifi.adoc   |   20 -
 .../users/integrations/apache-streampipes.adoc     |   20 -
 .../asciidoc/users/integrations/eclipse-ditto.adoc |   25 -
 .../users/integrations/elastic-logstash.adoc       |   20 -
 src/site/asciidoc/users/integrations/index.adoc    |   20 -
 src/site/asciidoc/users/protocols/ab-eth.adoc      |   20 -
 src/site/asciidoc/users/protocols/ads.adoc         |   20 -
 src/site/asciidoc/users/protocols/bacnetip.adoc    |   20 -
 src/site/asciidoc/users/protocols/deltav.adoc      |   20 -
 src/site/asciidoc/users/protocols/df1.adoc         |   20 -
 src/site/asciidoc/users/protocols/ethernet-ip.adoc |   20 -
 src/site/asciidoc/users/protocols/index.adoc       |   20 -
 src/site/asciidoc/users/protocols/knxnetip.adoc    |   20 -
 src/site/asciidoc/users/protocols/modbus.adoc      |   20 -
 src/site/asciidoc/users/protocols/opc-ua.adoc      |   20 -
 src/site/asciidoc/users/protocols/s7.adoc          |   20 -
 src/site/asciidoc/users/protocols/simulated.adoc   |   20 -
 src/site/asciidoc/users/testing.adoc               |   12 +-
 src/site/asciidoc/users/tools/connection-pool.adoc |   20 -
 src/site/asciidoc/users/tools/index.adoc           |   20 -
 src/site/asciidoc/users/tools/opm.adoc             |   73 --
 src/site/asciidoc/users/tools/scraper.adoc         |   20 -
 src/site/asciidoc/users/tools/testing.adoc         |  165 ---
 src/site/resources-filtered/plc4x-doap.rdf         |   17 +-
 src/site/resources/css/site.css                    |    2 +
 src/site/resources/images/apache_calcite_logo.svg  |  346 -------
 src/site/resources/images/apache_iotdb_logo.png    |  Bin 22055 -> 0 bytes
 src/site/resources/images/apache_logo_small.png    |  Bin 7763 -> 0 bytes
 .../resources/images/apache_plc4x_logo_small.png   |  Bin 10460 -> 0 bytes
 .../resources/images/apache_streampipes_logo.png   |  Bin 16928 -> 0 bytes
 src/site/resources/images/background-index-3.png   |  Bin 1258500 -> 0 bytes
 src/site/resources/images/eclipse_ditto_logo.png   |  Bin 3371 -> 0 bytes
 .../resources/images/elastic_logstash_logo.png     |  Bin 9241 -> 0 bytes
 src/site/site.xml                                  |  122 ++-
 tools/boost/pom.xml                                |    2 +-
 tools/logstash/pom.xml                             |    2 +-
 tools/pom.xml                                      |    2 +-
 tools/thrift/pom.xml                               |   14 +-
 1080 files changed, 28483 insertions(+), 46089 deletions(-)

diff --git a/.gitignore b/.gitignore
index 282586c..124d53f 100644
--- a/.gitignore
+++ b/.gitignore
@@ -167,7 +167,4 @@ build-iPhoneSimulator/
 # .ruby-gemset
 
 # unless supporting rvm < 1.11.0 or doing something fancy, ignore this:
-.rvmrc
-
-# When running the cpp module in clion, it adds another ".idea" directory.
-/sandbox/plc4cpp/.idea/
+.rvmrc
\ No newline at end of file
diff --git a/Jenkinsfile b/Jenkinsfile
index 4b81a0c..989f011 100644
--- a/Jenkinsfile
+++ b/Jenkinsfile
@@ -173,7 +173,7 @@ pipeline {
             steps {
                 echo 'Building Site'
                 //sh 'mvn -P${JENKINS_PROFILE},skip-prerequisite-check,with-proxies,with-logstash site'
-                sh 'mvn -P${JENKINS_PROFILE},skip-prerequisite-check,with-logstash site -pl .'
+                sh 'mvn -P${JENKINS_PROFILE},skip-prerequisite-check,with-logstash site'
             }
         }
 
@@ -185,11 +185,11 @@ pipeline {
                 echo 'Staging Site'
                 // Build a directory containing the aggregated website.
                 //sh 'mvn -P${JENKINS_PROFILE},skip-prerequisite-check,with-proxies,with-logstash site:stage'
-                sh 'mvn -P${JENKINS_PROFILE},skip-prerequisite-check,with-logstash site:stage -pl .'
+                sh 'mvn -P${JENKINS_PROFILE},skip-prerequisite-check,with-logstash site:stage'
                 // Make sure the script is executable.
                 sh 'chmod +x tools/clean-site.sh'
                 // Remove some redundant resources, which shouldn't be required.
-                //sh 'tools/clean-site.sh'
+                sh 'tools/clean-site.sh'
                 // Stash the generated site so we can publish it on the 'git-website' node.
                 stash includes: 'target/staging/**/*', name: 'plc4x-site'
             }
diff --git a/README.md b/README.md
index 88b7efd..80504de 100644
--- a/README.md
+++ b/README.md
@@ -101,7 +101,7 @@ On a clean Ubuntu 18.04 the following software needs to be installed:
 If you're building a source-distribution and haven't installed git yet, be sure to do so:
 
 ```
-    sudo apt install git
+    sudo get install git
 ```
 
 In order to build the .Net version, please install the .Net package according to this guide:
diff --git a/RELEASE_NOTES b/RELEASE_NOTES
index e620b77..80528f8 100644
--- a/RELEASE_NOTES
+++ b/RELEASE_NOTES
@@ -14,7 +14,7 @@ Bug Fixes
 ---------
 
 ==============================================================
-Apache PLC4X 0.5.0
+Apache PLC4X 0.6.0-SNAPSHOT
 ==============================================================
 
 This is the first release containing our new generaed drivers (AB-ETH)
diff --git a/Sometimes-Failling-Tests.md b/Sometimes-Failling-Tests.md
index 3544668..818bfa3 100644
--- a/Sometimes-Failling-Tests.md
+++ b/Sometimes-Failling-Tests.md
@@ -22,6 +22,11 @@
 This File contains the names and outputs of some tests that have been seen to fail without direct code-changes.
 It's sort of a collection of places we should keep an eye out for improving tests-
 
-## Module: plc4j-spi
-
-RequestTransactionManagerTest.abortTransactionFromExternally
\ No newline at end of file
+## Module: plc4l-opm
+
+[ERROR]   ConnectedEntityTest.useCache_timeout_refetches:83
+mockDevice.read(<any>);
+Wanted 2 times:
+-> at org.apache.plc4x.java.opm.ConnectedEntityTest.useCache_timeout_refetches(ConnectedEntityTest.java:83)
+But was 1 time:
+-> at org.apache.plc4x.java.mock.PlcMockConnection.lambda$null$0(PlcMockConnection.java:111)
diff --git a/build-utils/language-base-freemarker/pom.xml b/build-utils/language-base-freemarker/pom.xml
index ce87043..6d01362 100644
--- a/build-utils/language-base-freemarker/pom.xml
+++ b/build-utils/language-base-freemarker/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x</groupId>
     <artifactId>plc4x-build-utils</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
+    <version>0.6.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4x-build-utils-language-base-freemarker</artifactId>
diff --git a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
index 98e364d..5ca25bc 100644
--- a/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
+++ b/build-utils/language-base-freemarker/src/main/java/org/apache/plc4x/plugins/codegenerator/protocol/freemarker/FreemarkerLanguageOutput.java
@@ -24,7 +24,6 @@ import freemarker.core.ParseException;
 import freemarker.template.*;
 import org.apache.plc4x.plugins.codegenerator.language.LanguageOutput;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.EnumTypeDefinition;
-import org.apache.plc4x.plugins.codegenerator.types.definitions.DataIoTypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.exceptions.GenerationException;
 import org.slf4j.Logger;
@@ -53,31 +52,13 @@ public abstract class FreemarkerLanguageOutput implements LanguageOutput {
             freemarkerConfiguration.setTemplateLoader(classTemplateLoader);
 
             // Initialize all templates
-            List<Template> specTemplates = getSpecTemplates(freemarkerConfiguration);
             List<Template> complexTypesTemplateList = getComplexTypeTemplates(freemarkerConfiguration);
             List<Template> enumTypesTemplateList = getEnumTypeTemplates(freemarkerConfiguration);
-            List<Template> dataIoTemplateList = getDataIoTemplates(freemarkerConfiguration);
-
-            // Generate output that's global for the entire mspec
-            if(!specTemplates.isEmpty()) {
-                Map<String, Object> typeContext = new HashMap<>();
-                typeContext.put("languageName", languageName);
-                typeContext.put("protocolName", protocolName);
-                typeContext.put("outputFlavor", outputFlavor);
-                typeContext.put("helper", getHelper(types));
-
-                for(Template template : specTemplates) {
-                    try {
-                        renderTemplate(outputDir, template, typeContext);
-                    } catch (TemplateNotFoundException | TemplateException | MalformedTemplateNameException |
-                            ParseException e) {
-                        throw new GenerationException("Error generating global protocol output.", e);
-                    }
-                }
-            }
 
             // Iterate over the types and have content generated for each one
             for (Map.Entry<String, TypeDefinition> typeEntry : types.entrySet()) {
+                LOGGER.info("Generating type " + typeEntry.getKey());
+
                 // Prepare a new generation context
                 Map<String, Object> typeContext = new HashMap<>();
                 typeContext.put("languageName", languageName);
@@ -87,71 +68,48 @@ public abstract class FreemarkerLanguageOutput implements LanguageOutput {
                 typeContext.put("type", typeEntry.getValue());
                 typeContext.put("helper", getHelper(types));
 
-                // Depending on the type, get the corresponding list of templates.
-                List<Template> templateList;
-                if (typeEntry.getValue() instanceof EnumTypeDefinition) {
-                    templateList = enumTypesTemplateList;
-                } else if (typeEntry.getValue() instanceof DataIoTypeDefinition) {
-                    templateList = dataIoTemplateList;
-                } else {
-                    // Skip outputting the sub-types of io-types.
-                    if(typeEntry.getValue().getParentType() instanceof DataIoTypeDefinition) {
-                        continue;
-                    }
-                    templateList = complexTypesTemplateList;
-                }
-
-                // Generate the output for the given type.
-                LOGGER.info(String.format("Generating type %s", typeEntry.getKey()));
+                List<Template> templateList = (typeEntry.getValue() instanceof EnumTypeDefinition) ?
+                    enumTypesTemplateList : complexTypesTemplateList;
                 for(Template template : templateList) {
-                    try {
-                        renderTemplate(outputDir, template, typeContext);
-                    } catch (TemplateNotFoundException | TemplateException | MalformedTemplateNameException |
-                            ParseException e) {
-                        throw new GenerationException(
-                            "Error generating output for type '" + typeEntry.getKey() + "'", e);
+                    // Create a variable size output location where the template can generate it's content to
+                    ByteArrayOutputStream output = new ByteArrayOutputStream();
+
+                    // Have Freemarker generate the output
+                    template.process(typeContext, new OutputStreamWriter(output));
+
+                    // Create the means to read in the generated output back in again
+                    try(BufferedReader input = new BufferedReader(new InputStreamReader(
+                            new ByteArrayInputStream(output.toByteArray())))) {
+
+                        // Extract the output path from the first line of the generated content
+                        String outputFileName = input.readLine();
+                        File outputFile = new File(outputDir, outputFileName);
+
+                        // Create any missing directories
+                        if (!outputFile.getParentFile().exists() && !outputFile.getParentFile().mkdirs()) {
+                            throw new GenerationException(
+                                "Unable to create output directory " + outputFile.getParent());
+                        }
+
+                        // Output the rest to that file
+                        BufferedWriter outputFileWriter = Files.newBufferedWriter(
+                            outputFile.toPath(), StandardCharsets.UTF_8);
+                        String line;
+                        while ((line = input.readLine()) != null) {
+                            outputFileWriter.write(line);
+                            outputFileWriter.newLine();
+                        }
+                        outputFileWriter.flush();
                     }
                 }
             }
+        } catch (TemplateNotFoundException | TemplateException | MalformedTemplateNameException | ParseException e) {
+            throw new GenerationException("Error resolving template", e);
         } catch (IOException e) {
             throw new GenerationException("Error generating sources", e);
         }
     }
 
-    protected void renderTemplate(File outputDir, Template template, Map<String, Object> context)
-        throws TemplateException, IOException, GenerationException {
-        // Create a variable size output location where the template can generate it's content to
-        ByteArrayOutputStream output = new ByteArrayOutputStream();
-
-        // Have Freemarker generate the output
-        template.process(context, new OutputStreamWriter(output));
-
-        // Create the means to read in the generated output back in again
-        try(BufferedReader input = new BufferedReader(new InputStreamReader(
-            new ByteArrayInputStream(output.toByteArray())))) {
-
-            // Extract the output path from the first line of the generated content
-            String outputFileName = input.readLine();
-            File outputFile = new File(outputDir, outputFileName);
-
-            // Create any missing directories
-            if (!outputFile.getParentFile().exists() && !outputFile.getParentFile().mkdirs()) {
-                throw new GenerationException(
-                    "Unable to create output directory " + outputFile.getParent());
-            }
-
-            // Output the rest to that file
-            BufferedWriter outputFileWriter = Files.newBufferedWriter(
-                outputFile.toPath(), StandardCharsets.UTF_8);
-            String line;
-            while ((line = input.readLine()) != null) {
-                outputFileWriter.write(line);
-                outputFileWriter.newLine();
-            }
-            outputFileWriter.flush();
-        }
-    }
-
     private Configuration getFreemarkerConfiguration() throws IOException {
         Configuration configuration = new Configuration(Configuration.VERSION_2_3_28);
         configuration.setDefaultEncoding("UTF-8");
@@ -162,14 +120,10 @@ public abstract class FreemarkerLanguageOutput implements LanguageOutput {
         return configuration;
     }
 
-    protected abstract List<Template> getSpecTemplates(Configuration freemarkerConfiguration) throws IOException;
-
     protected abstract List<Template> getComplexTypeTemplates(Configuration freemarkerConfiguration) throws IOException;
 
     protected abstract List<Template> getEnumTypeTemplates(Configuration freemarkerConfiguration) throws IOException;
 
-    protected abstract List<Template> getDataIoTemplates(Configuration freemarkerConfiguration) throws IOException;
-
     protected abstract FreemarkerLanguageTemplateHelper getHelper(Map<String, TypeDefinition> types);
 
 }
diff --git a/build-utils/language-java/pom.xml b/build-utils/language-java/pom.xml
index 2d4225f..2152416 100644
--- a/build-utils/language-java/pom.xml
+++ b/build-utils/language-java/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x</groupId>
     <artifactId>plc4x-build-utils</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
+    <version>0.6.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4x-build-utils-language-java</artifactId>
@@ -37,7 +37,7 @@
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4x-build-utils-language-base-freemarker</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
+      <version>0.6.0-SNAPSHOT</version>
     </dependency>
 
     <dependency>
diff --git a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
index 534765a..82a79d7 100644
--- a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
+++ b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageOutput.java
@@ -39,32 +39,17 @@ public class JavaLanguageOutput extends FreemarkerLanguageOutput {
         return Arrays.asList("read-write", "read-only", "passive");
     }
 
-    @Override
-    protected List<Template> getSpecTemplates(Configuration freemarkerConfiguration) throws IOException {
-        return Collections.singletonList(
-            freemarkerConfiguration.getTemplate("templates/java/enum-package-info-template.ftlh"));
-    }
-
-    @Override
     protected List<Template> getComplexTypeTemplates(Configuration freemarkerConfiguration) throws IOException {
         return Arrays.asList(
             freemarkerConfiguration.getTemplate("templates/java/pojo-template.ftlh"),
             freemarkerConfiguration.getTemplate("templates/java/io-template.ftlh"));
     }
 
-    @Override
     protected List<Template> getEnumTypeTemplates(Configuration freemarkerConfiguration) throws IOException {
         return Collections.singletonList(
             freemarkerConfiguration.getTemplate("templates/java/enum-template.ftlh"));
     }
 
-    @Override
-    protected List<Template> getDataIoTemplates(Configuration freemarkerConfiguration) throws IOException {
-        return Collections.singletonList(
-            freemarkerConfiguration.getTemplate("templates/java/data-io-template.ftlh"));
-    }
-
-    @Override
     protected FreemarkerLanguageTemplateHelper getHelper(Map<String, TypeDefinition> types) {
         return new JavaLanguageTemplateHelper(types);
     }
diff --git a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
index ad867e0..0fc603f 100644
--- a/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
+++ b/build-utils/language-java/src/main/java/org/apache/plc4x/language/java/JavaLanguageTemplateHelper.java
@@ -24,15 +24,18 @@ import org.apache.commons.text.WordUtils;
 import org.apache.plc4x.plugins.codegenerator.protocol.freemarker.FreemarkerLanguageTemplateHelper;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.*;
 import org.apache.plc4x.plugins.codegenerator.types.fields.*;
-import org.apache.plc4x.plugins.codegenerator.types.references.*;
+import org.apache.plc4x.plugins.codegenerator.types.references.ComplexTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
+import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.terms.*;
 
-import java.util.*;
+import java.util.Collection;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.function.Function;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-@SuppressWarnings({"unused", "WeakerAccess"})
 public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHelper {
 
     private final Map<String, TypeDefinition> types;
@@ -49,17 +52,6 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
 
     public String getLanguageTypeNameForField(TypedField field) {
         boolean optional = field instanceof OptionalField;
-        // If the referenced type is a DataIo type, the value is of type PlcValue.
-        if(field instanceof PropertyField) {
-            PropertyField propertyField = (PropertyField) field;
-            if(propertyField.getType() instanceof ComplexTypeReference) {
-                ComplexTypeReference complexTypeReference = (ComplexTypeReference) propertyField.getType();
-                final TypeDefinition typeDefinition = types.get(complexTypeReference.getName());
-                if(typeDefinition instanceof DataIoTypeDefinition) {
-                    return "PlcValue";
-                }
-            }
-        }
         return getLanguageTypeNameForField(field, !optional);
     }
 
@@ -84,46 +76,40 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                     return allowPrimitive ? "boolean" : "Boolean";
                 }
                 case UINT: {
-                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                    if (integerTypeReference.getSizeInBits() <= 4) {
+                    if (simpleTypeReference.getSize() <= 4) {
                         return allowPrimitive ? "byte" : "Byte";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 8) {
+                    if (simpleTypeReference.getSize() <= 8) {
                         return allowPrimitive ? "short" : "Short";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 16) {
+                    if (simpleTypeReference.getSize() <= 16) {
                         return allowPrimitive ? "int" : "Integer";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 32) {
+                    if (simpleTypeReference.getSize() <= 32) {
                         return allowPrimitive ? "long" : "Long";
                     }
                     return "BigInteger";
                 }
                 case INT: {
-                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                    if (integerTypeReference.getSizeInBits() <= 8) {
+                    if (simpleTypeReference.getSize() <= 8) {
                         return allowPrimitive ? "byte" : "Byte";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 16) {
+                    if (simpleTypeReference.getSize() <= 16) {
                         return allowPrimitive ? "short" : "Short";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 32) {
+                    if (simpleTypeReference.getSize() <= 32) {
                         return allowPrimitive ? "int" : "Integer";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 64) {
+                    if (simpleTypeReference.getSize() <= 64) {
                         return allowPrimitive ? "long" : "Long";
                     }
                     return "BigInteger";
                 }
-                case FLOAT:
-                case UFLOAT: {
-                    FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
-                    int sizeInBits = ((floatTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.FLOAT) ? 1 : 0) +
-                        floatTypeReference.getExponent() + floatTypeReference.getMantissa();
-                    if (sizeInBits <= 32) {
+                case FLOAT: {
+                    if (simpleTypeReference.getSize() <= 32) {
                         return allowPrimitive ? "float" : "Float";
                     }
-                    if (sizeInBits <= 64) {
+                    if (simpleTypeReference.getSize() <= 64) {
                         return allowPrimitive ? "double" : "Double";
                     }
                     return "BigDecimal";
@@ -131,15 +117,6 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                 case STRING: {
                     return "String";
                 }
-                case TIME: {
-                    return "LocalTime";
-                }
-                case DATE: {
-                    return "LocalDate";
-                }
-                case DATETIME: {
-                    return "LocalDateTime";
-                }
             }
             return "Hurz";
         } else {
@@ -155,33 +132,28 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                     return "false";
                 }
                 case UINT: {
-                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                    if (integerTypeReference.getSizeInBits() <= 16) {
+                    if (simpleTypeReference.getSize() <= 16) {
                         return "0";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 32) {
+                    if (simpleTypeReference.getSize() <= 32) {
                         return "0l";
                     }
                     return "null";
                 }
                 case INT: {
-                    IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                    if (integerTypeReference.getSizeInBits() <= 32) {
+                    if (simpleTypeReference.getSize() <= 32) {
                         return "0";
                     }
-                    if (integerTypeReference.getSizeInBits() <= 64) {
+                    if (simpleTypeReference.getSize() <= 64) {
                         return "0l";
                     }
                     return "null";
                 }
                 case FLOAT: {
-                    FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
-                    int sizeInBits = ((floatTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.FLOAT) ? 1 : 0) +
-                        floatTypeReference.getExponent() + floatTypeReference.getMantissa();
-                    if (sizeInBits <= 32) {
+                    if (simpleTypeReference.getSize() <= 32) {
                         return "0.0f";
                     }
-                    if (sizeInBits <= 64) {
+                    if (simpleTypeReference.getSize() <= 64) {
                         return "0.0";
                     }
                     return "null";
@@ -211,84 +183,52 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         return "Hurz";
     }
 
-    public int getNumBits(SimpleTypeReference simpleTypeReference) {
-        switch (simpleTypeReference.getBaseType()) {
-            case BIT: {
-                return 1;
-            }
-            case UINT:
-            case INT: {
-                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                return integerTypeReference.getSizeInBits();
-            }
-            case FLOAT: {
-                FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
-                return floatTypeReference.getSizeInBits();
-            }
-            case STRING: {
-                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                return integerTypeReference.getSizeInBits();
-            }
-            default: {
-                return 0;
-            }
-        }
-    }
-
     public String getReadBufferReadMethodCall(SimpleTypeReference simpleTypeReference) {
         switch (simpleTypeReference.getBaseType()) {
             case BIT: {
-                return "io.readBit()";
+                return "readBit()";
             }
             case UINT: {
-                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                if (integerTypeReference.getSizeInBits() <= 4) {
-                    return "io.readUnsignedByte(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 4) {
+                    return "readUnsignedByte(" + simpleTypeReference.getSize() + ")";
                 }
-                if (integerTypeReference.getSizeInBits() <= 8) {
-                    return "io.readUnsignedShort(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 8) {
+                    return "readUnsignedShort(" + simpleTypeReference.getSize() + ")";
                 }
-                if (integerTypeReference.getSizeInBits() <= 16) {
-                    return "io.readUnsignedInt(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 16) {
+                    return "readUnsignedInt(" + simpleTypeReference.getSize() + ")";
                 }
-                if (integerTypeReference.getSizeInBits() <= 32) {
-                    return "io.readUnsignedLong(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 32) {
+                    return "readUnsignedLong(" + simpleTypeReference.getSize() + ")";
                 }
-                return "io.readUnsignedBigInteger(" + integerTypeReference.getSizeInBits() + ")";
+                return "readUnsignedBigInteger" + simpleTypeReference.getSize() + ")";
             }
             case INT: {
-                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                if (integerTypeReference.getSizeInBits() <= 8) {
-                    return "io.readByte(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 8) {
+                    return "readByte(" + simpleTypeReference.getSize() + ")";
                 }
-                if (integerTypeReference.getSizeInBits() <= 16) {
-                    return "io.readShort(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 16) {
+                    return "readShort(" + simpleTypeReference.getSize() + ")";
                 }
-                if (integerTypeReference.getSizeInBits() <= 32) {
-                    return "io.readInt(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 32) {
+                    return "readInt(" + simpleTypeReference.getSize() + ")";
                 }
-                if (integerTypeReference.getSizeInBits() <= 64) {
-                    return "io.readLong(" + integerTypeReference.getSizeInBits() + ")";
+                if (simpleTypeReference.getSize() <= 64) {
+                    return "readLong(" + simpleTypeReference.getSize() + ")";
                 }
-                return "io.readBigInteger(" + integerTypeReference.getSizeInBits() + ")";
+                return "readBigInteger(" + simpleTypeReference.getSize() + ")";
             }
             case FLOAT: {
-                FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
-                String type = (floatTypeReference.getSizeInBits() <= 32) ? "Float" : "Double";
-                String typeCast = (floatTypeReference.getSizeInBits() <= 32) ? "float" : "double";
-                String defaultNull = (floatTypeReference.getSizeInBits() <= 32) ? "0.0f" : "0.0";
-                StringBuilder sb = new StringBuilder("((Supplier<").append(type).append(">) (() -> {");
-                sb.append("\n            return (").append(typeCast).append(") toFloat(io, ").append(
-                    (floatTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.FLOAT) ? "true" : "false")
-                    .append(", ").append(floatTypeReference.getExponent()).append(", ")
-                    .append(floatTypeReference.getMantissa()).append(");");
-                sb.append("\n        })).get()");
-                return sb.toString();
+                if (simpleTypeReference.getSize() <= 32) {
+                    return "readFloat(" + simpleTypeReference.getSize() + ")";
+                }
+                if (simpleTypeReference.getSize() <= 64) {
+                    return "readDouble(" + simpleTypeReference.getSize() + ")";
+                }
+                return "readBigDecimal(" + simpleTypeReference.getSize() + ")";
             }
             case STRING: {
-                StringTypeReference stringTypeReference = (StringTypeReference) simpleTypeReference;
-                return "io.readString(" + stringTypeReference.getSizeInBits() + ", \"" +
-                    stringTypeReference.getEncoding() + "\")";
+                return "readString(" + simpleTypeReference.getSize() + ")";
             }
         }
         return "Hurz";
@@ -297,58 +237,49 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
     public String getWriteBufferReadMethodCall(SimpleTypeReference simpleTypeReference, String fieldName) {
         switch (simpleTypeReference.getBaseType()) {
             case BIT: {
-                return "io.writeBit((boolean) " + fieldName + ")";
+                return "writeBit((boolean) " + fieldName + ")";
             }
             case UINT: {
-                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                if (integerTypeReference.getSizeInBits() <= 4) {
-                    return "io.writeUnsignedByte(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())";
+                if (simpleTypeReference.getSize() <= 4) {
+                    return "writeUnsignedByte(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").byteValue())";
                 }
-                if (integerTypeReference.getSizeInBits() <= 8) {
-                    return "io.writeUnsignedShort(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())";
+                if (simpleTypeReference.getSize() <= 8) {
+                    return "writeUnsignedShort(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").shortValue())";
                 }
-                if (integerTypeReference.getSizeInBits() <= 16) {
-                    return "io.writeUnsignedInt(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())";
+                if (simpleTypeReference.getSize() <= 16) {
+                    return "writeUnsignedInt(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").intValue())";
                 }
-                if (integerTypeReference.getSizeInBits() <= 32) {
-                    return "io.writeUnsignedLong(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())";
+                if (simpleTypeReference.getSize() <= 32) {
+                    return "writeUnsignedLong(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").longValue())";
                 }
-                return "io.writeUnsignedBigInteger(" + integerTypeReference.getSizeInBits() + ", (BigInteger) " + fieldName + ")";
+                return "writeUnsignedBigInteger" + simpleTypeReference.getSize() + ", (BigInteger) " + fieldName + ")";
             }
             case INT: {
-                IntegerTypeReference integerTypeReference = (IntegerTypeReference) simpleTypeReference;
-                if (integerTypeReference.getSizeInBits() <= 8) {
-                    return "io.writeByte(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").byteValue())";
+                if (simpleTypeReference.getSize() <= 8) {
+                    return "writeByte(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").byteValue())";
                 }
-                if (integerTypeReference.getSizeInBits() <= 16) {
-                    return "io.writeShort(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").shortValue())";
+                if (simpleTypeReference.getSize() <= 16) {
+                    return "writeShort(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").shortValue())";
                 }
-                if (integerTypeReference.getSizeInBits() <= 32) {
-                    return "io.writeInt(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").intValue())";
+                if (simpleTypeReference.getSize() <= 32) {
+                    return "writeInt(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").intValue())";
                 }
-                if (integerTypeReference.getSizeInBits() <= 64) {
-                    return "io.writeLong(" + integerTypeReference.getSizeInBits() + ", ((Number) " + fieldName + ").longValue())";
+                if (simpleTypeReference.getSize() <= 64) {
+                    return "writeLong(" + simpleTypeReference.getSize() + ", ((Number) " + fieldName + ").longValue())";
                 }
-                return "io.writeBigInteger(" + integerTypeReference.getSizeInBits() + ", BigInteger.valueOf( " + fieldName + "))";
+                return "writeBigInteger(" + simpleTypeReference.getSize() + ", (BigInteger) " + fieldName + ")";
             }
-            case FLOAT:
-            case UFLOAT: {
-                FloatTypeReference floatTypeReference = (FloatTypeReference) simpleTypeReference;
-                StringBuilder sb = new StringBuilder();
-                if(simpleTypeReference.getBaseType() == SimpleTypeReference.SimpleBaseType.FLOAT) {
-                    sb.append("\n        boolean negative = value < 0;");
-                    sb.append("\n        io.writeBit(negative);");
-                }
-                sb.append("\n        final int exponent = Math.getExponent(value);");
-                sb.append("\n        final double mantissa = value / Math.pow(2, exponent);");
-                sb.append("\n        io.writeInt(").append(floatTypeReference.getExponent()).append(", exponent);");
-                sb.append("\n        io.writeDouble(").append(floatTypeReference.getMantissa()).append(", mantissa)");
-                return sb.toString().substring(9);
+            case FLOAT: {
+                if (simpleTypeReference.getSize() <= 32) {
+                    return "writeFloat(" + simpleTypeReference.getSize() + ", (float) " + fieldName + ")";
+                }
+                if (simpleTypeReference.getSize() <= 64) {
+                    return "writeDouble(" + simpleTypeReference.getSize() + ", (double) " + fieldName + ")";
+                }
+                return "writeBigDecimal(" + simpleTypeReference.getSize() + ", (BigDecimal) " + fieldName + ")";
             }
             case STRING: {
-                StringTypeReference stringTypeReference = (StringTypeReference) simpleTypeReference;
-                return "io.writeString(" + stringTypeReference.getSizeInBits() + ", \"" +
-                    stringTypeReference.getEncoding() + "\", (String) " + fieldName + ")";
+                return "writeString(" + simpleTypeReference.getSize() + ", (String) " + fieldName + ")";
             }
         }
         return "Hurz";
@@ -361,15 +292,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             return "readUnsigned" + languageTypeName;
         } else {
             return "read" + languageTypeName;
-        }
-    }
 
-    public String getReservedValue(ReservedField reservedField) {
-        final String languageTypeName = getLanguageTypeName(reservedField.getType(), true);
-        if("BigInteger".equals(languageTypeName)) {
-            return "BigInteger.valueOf(" + reservedField.getReferenceValue() + ")";
-        } else {
-            return "(" + languageTypeName + ") " + reservedField.getReferenceValue();
         }
     }
 
@@ -428,10 +351,6 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         return typeDefinition instanceof DiscriminatedComplexTypeDefinition;
     }
 
-    public boolean isAbstractField(Field field) {
-        return field instanceof AbstractField;
-    }
-
     public boolean isCountArray(ArrayField arrayField) {
         return arrayField.getLoopType() == ArrayField.LoopType.COUNT;
     }
@@ -470,15 +389,15 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         return sb.toString();
     }
 
-    public String toParseExpression(TypedField field, Term term, Argument[] parserArguments) {
-        return toExpression(field, term, term1 -> toVariableParseExpression(field, term1, parserArguments));
+    public String toDeserializationExpression(Term term, Argument[] parserArguments) {
+        return toExpression(term, term1 -> toVariableDeserializationExpression(term1, parserArguments));
     }
 
-    public String toSerializationExpression(TypedField field, Term term, Argument[] parserArguments) {
-        return toExpression(field, term, term1 -> toVariableSerializationExpression(field, term1, parserArguments));
+    public String toSerializationExpression(Term term, Argument[] parserArguments) {
+        return toExpression(term, term1 -> toVariableSerializationExpression(term1, parserArguments));
     }
 
-    private String toExpression(TypedField field, Term term, Function<Term, String> variableExpressionGenerator) {
+    private String toExpression(Term term, Function<Term, String> variableExpressionGenerator) {
         if(term == null) {
             return "";
         }
@@ -492,13 +411,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             } else if(term instanceof StringLiteral) {
                 return "\"" + ((StringLiteral) term).getValue() + "\"";
             } else if(term instanceof VariableLiteral) {
-                VariableLiteral variableLiteral = (VariableLiteral) term;
-                // If this literal references an Enum type, then we have to output it differently.
-                if(types.get(variableLiteral.getName()) instanceof EnumTypeDefinition) {
-                    return variableLiteral.getName() + "." + variableLiteral.getChild().getName();
-                } else {
-                    return variableExpressionGenerator.apply(term);
-                }
+                return variableExpressionGenerator.apply(term);
             } else {
                 throw new RuntimeException("Unsupported Literal type " + term.getClass().getName());
             }
@@ -507,11 +420,11 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             Term a = ut.getA();
             switch(ut.getOperation()) {
                 case "!":
-                    return "!(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "!(" + toExpression(a, variableExpressionGenerator) + ")";
                 case "-":
-                    return "-(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "-(" + toExpression(a, variableExpressionGenerator) + ")";
                 case "()":
-                    return "(" + toExpression(field, a, variableExpressionGenerator) + ")";
+                    return "(" + toExpression(a, variableExpressionGenerator) + ")";
                 default:
                     throw new RuntimeException("Unsupported unary operation type " + ut.getOperation());
             }
@@ -520,19 +433,14 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             Term a = bt.getA();
             Term b = bt.getB();
             String operation = bt.getOperation();
-            switch (operation) {
-                case "^":
-                    return "Math.pow((" + toExpression(field, a, variableExpressionGenerator) + "), (" + toExpression(field, b, variableExpressionGenerator) + "))";
-                default:
-                    return "(" + toExpression(field, a, variableExpressionGenerator) + ") " + operation + " (" + toExpression(field, b, variableExpressionGenerator) + ")";
-            }
+            return "(" + toExpression(a, variableExpressionGenerator) + ") " + operation + " (" + toExpression(b, variableExpressionGenerator) + ")";
         } else if (term instanceof TernaryTerm) {
             TernaryTerm tt = (TernaryTerm) term;
             if("if".equals(tt.getOperation())) {
                 Term a = tt.getA();
                 Term b = tt.getB();
                 Term c = tt.getC();
-                return "((" +  toExpression(field, a, variableExpressionGenerator) + ") ? " + toExpression(field, b, variableExpressionGenerator) + " : " + toExpression(field, c, variableExpressionGenerator) + ")";
+                return "((" +  toExpression(a, variableExpressionGenerator) + ") ? " + toExpression(b, variableExpressionGenerator) + " : " + toExpression(c, variableExpressionGenerator) + ")";
             } else {
                 throw new RuntimeException("Unsupported ternary operation type " + tt.getOperation());
             }
@@ -541,7 +449,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         }
     }
 
-    private String toVariableParseExpression(TypedField field, Term term, Argument[] parserArguments) {
+    private String toVariableDeserializationExpression(Term term, Argument[] parserArguments) {
         VariableLiteral vl = (VariableLiteral) term;
         // CAST expressions are special as we need to add a ".class" to the second parameter in Java.
         if("CAST".equals(vl.getName())) {
@@ -549,7 +457,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             if((vl.getArgs() == null) || (vl.getArgs().size() != 2)) {
                 throw new RuntimeException("A CAST expression expects exactly two arguments.");
             }
-            sb.append("(").append(toVariableParseExpression(field, vl.getArgs().get(0), parserArguments))
+            sb.append("(").append(toVariableDeserializationExpression(vl.getArgs().get(0), parserArguments))
                 .append(", ").append(((VariableLiteral) vl.getArgs().get(1)).getName()).append(".class)");
             return sb.toString() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
         }
@@ -581,7 +489,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                     if(isDeserializerArg) {
                         sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
                     } else {
-                        sb.append(toVariableParseExpression(field, va, null));
+                        sb.append(toVariableDeserializationExpression(va, null));
                     }
                 } else if(arg instanceof StringLiteral) {
                     sb.append(((StringLiteral) arg).getValue());
@@ -600,7 +508,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                     if(!firstArg) {
                         sb.append(", ");
                     }
-                    sb.append(toParseExpression(field, arg, parserArguments));
+                    sb.append(toVariableDeserializationExpression(arg, parserArguments));
                     firstArg = false;
                 }
                 sb.append(")");
@@ -613,7 +521,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
     }
 
-    private String toVariableSerializationExpression(TypedField field, Term term, Argument[] parserArguments) {
+    private String toVariableSerializationExpression(Term term, Argument[] parserArguments) {
         VariableLiteral vl = (VariableLiteral) term;
         if("STATIC_CALL".equals(vl.getName())) {
             StringBuilder sb = new StringBuilder();
@@ -630,8 +538,8 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                 }
                 if(arg instanceof VariableLiteral) {
                     VariableLiteral va = (VariableLiteral) arg;
-                    // "io" and "_value" are always available in every parser.
-                    boolean isSerializerArg = "io".equals(va.getName()) || "_value".equals(va.getName()) || "element".equals(va.getName());
+                    // "io" and "value" are always available in every parser.
+                    boolean isSerializerArg = "io".equals(va.getName()) || "value".equals(va.getName()) || "element".equals(va.getName());
                     if(parserArguments != null) {
                         for (Argument parserArgument : parserArguments) {
                             if (parserArgument.getName().equals(va.getName())) {
@@ -643,7 +551,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                     if(isSerializerArg) {
                         sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
                     } else {
-                        sb.append(toVariableSerializationExpression(field, va, null));
+                        sb.append(toVariableSerializationExpression(va, null));
                     }
                 } else if(arg instanceof StringLiteral) {
                     sb.append(((StringLiteral) arg).getValue());
@@ -652,26 +560,6 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             sb.append(")");
             return sb.toString();
         }
-        // Discriminator values have to be handled a little differently.
-        else if(vl.getName().equals("DISCRIMINATOR_VALUES")) {
-            final String typeName = getLanguageTypeNameForSpecType(field.getType());
-            switch (typeName) {
-                case "byte":
-                    return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).byteValue()";
-                case "short":
-                    return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).shortValue()";
-                case "int":
-                    return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).intValue()";
-                case "long":
-                    return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).longValue()";
-                case "float":
-                    return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).floatValue()";
-                case "double":
-                    return "((Number) _value.getDiscriminatorValues()[" + vl.getIndex() + "]).doubleValue()";
-                default:
-                    return "_value.getDiscriminatorValues()[" + vl.getIndex() + "]";
-            }
-        }
         // All uppercase names are not fields, but utility methods.
         else if(vl.getName().equals(vl.getName().toUpperCase())) {
             StringBuilder sb = new StringBuilder(vl.getName());
@@ -697,7 +585,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
                         if(isSerializerArg) {
                             sb.append(va.getName() + ((va.getChild() != null) ? "." + toVariableExpressionRest(va.getChild()) : ""));
                         } else {
-                            sb.append(toVariableSerializationExpression(field, va, null));
+                            sb.append(toVariableSerializationExpression(va, null));
                         }
                     } else if(arg instanceof StringLiteral) {
                         sb.append(((StringLiteral) arg).getValue());
@@ -709,10 +597,6 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             return sb.toString();
         }
         boolean isSerializerArg = false;
-        // The synthetic checksumRawData is a local field and should not be accessed as bean property.
-        if(vl.getName().equals("checksumRawData")) {
-            isSerializerArg = true;
-        }
         if(parserArguments != null) {
             for (Argument parserArgument : parserArguments) {
                 if (parserArgument.getName().equals(vl.getName())) {
@@ -724,7 +608,7 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         if(isSerializerArg) {
             return vl.getName() + ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : "");
         } else {
-            return "_value." + toVariableExpressionRest(vl);
+            return "value." + toVariableExpressionRest(vl);
         }
     }
 
@@ -733,42 +617,6 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
             ((vl.getChild() != null) ? "." + toVariableExpressionRest(vl.getChild()) : ""));
     }
 
-    public String getSizeInBits(ComplexTypeDefinition complexTypeDefinition) {
-        int sizeInBits = 0;
-        StringBuilder sb = new StringBuilder("");
-        for (Field field : complexTypeDefinition.getFields()) {
-            if(field instanceof ArrayField) {
-                ArrayField arrayField = (ArrayField) field;
-                final SimpleTypeReference type = (SimpleTypeReference) arrayField.getType();
-                switch (arrayField.getLoopType()) {
-                    case COUNT:
-                        sb.append("(").append(toSerializationExpression(null, arrayField.getLoopExpression(), null)).append(" * ").append(type.getSizeInBits()).append(") + ");
-                        break;
-                    case LENGTH:
-                        sb.append("(").append(toSerializationExpression(null, arrayField.getLoopExpression(), null)).append(" * 8) + ");
-                        break;
-                    case TERMINATED:
-                        // No terminated.
-                        break;
-                }
-            } else if(field instanceof TypedField) {
-                TypedField typedField = (TypedField) field;
-                final TypeReference type = typedField.getType();
-                if(field instanceof ManualField) {
-                    ManualField manualField = (ManualField) field;
-                    sb.append("(").append(toSerializationExpression(null, manualField.getLengthExpression(), null)).append(") + ");
-                }
-                else if(type instanceof SimpleTypeReference) {
-                    SimpleTypeReference simpleTypeReference = (SimpleTypeReference) type;
-                    sizeInBits += simpleTypeReference.getSizeInBits();
-                } else {
-                    // No ComplexTypeReference supported.
-                }
-            }
-        }
-        return sb.toString() + sizeInBits;
-    }
-
     public String escapeValue(TypeReference typeReference, String valueString) {
         if(valueString == null) {
             return null;
@@ -799,39 +647,4 @@ public class JavaLanguageTemplateHelper implements FreemarkerLanguageTemplateHel
         return (SimpleTypeReference) enumTypeDefinition.getType();
     }
 
-    public List<Argument> getSerializerArguments(Argument[] arguments) {
-        List<Argument> serializerArguments = new LinkedList<>();
-        if(arguments != null) {
-            for (Argument argument : arguments) {
-                if ("lastItem".equals(argument.getName())) {
-                    serializerArguments.add(argument);
-                }
-            }
-        }
-        return serializerArguments;
-    }
-
-    public boolean hasLastItemTerm(Term[] terms) {
-        if(terms != null) {
-            for (Term term : terms) {
-                if (term.contains("lastItem")) {
-                    return true;
-                }
-            }
-        }
-        return false;
-    }
-
-    public List<Term> getSerializerTerms(Term[] terms) {
-        List<Term> serializerTerms = new LinkedList<>();
-        if(terms != null) {
-            for (Term term : terms) {
-                if (term.contains("lastItem")) {
-                    serializerTerms.add(term);
-                }
-            }
-        }
-        return serializerTerms;
-    }
-
 }
diff --git a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
deleted file mode 100644
index d9a5a49..0000000
--- a/build-utils/language-java/src/main/resources/templates/java/data-io-template.ftlh
+++ /dev/null
@@ -1,278 +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.
--->
-${helper.packageName(protocolName, languageName, outputFlavor)?replace(".", "/")}/io/${typeName}IO.java
-/*
-  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 ${helper.packageName(protocolName, languageName, outputFlavor)}.io;
-
-import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
-
-import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.api.value.*;
-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.WriteBuffer;
-import ${helper.packageName(protocolName, languageName, outputFlavor)}.*;
-import ${helper.packageName(protocolName, languageName, outputFlavor)}.types.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.InvocationTargetException;
-import java.lang.reflect.Method;
-import java.math.BigInteger;
-import java.time.*;
-import java.util.*;
-import java.util.function.Supplier;
-
-public class ${typeName}IO {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(${typeName}IO.class);
-
-    public static PlcValue staticParse(ReadBuffer io<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${helper.getLanguageTypeName(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) throws ParseException {
-        <#list type.switchField.cases as case><#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toSwitchExpression(type.switchField.discriminatorNames[discriminatorValue?index])}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{ // ${case.name}
-            <#assign skipReturn=false>
-            <#list case.fields as field>
-                <#switch field.typeName>
-                    <#case "array">
-
-            // Array field (${field.name})
-            <#-- Only update curPos if the length expression uses it -->
-                        <#if field.loopExpression.contains("curPos")>
-            curPos = io.getPos() - startPos;
-                        </#if>
-            <#-- If this is a count array, we can directly initialize an array with the given size -->
-                        <#if helper.isCountArray(field)>
-            // Count array
-            if(${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc} > Integer.MAX_VALUE) {
-                throw new ParseException("Array count of " + (${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc}) + " exceeds the maximum allowed count of " + Integer.MAX_VALUE);
-            }
-            ${helper.getNonPrimitiveLanguageTypeNameForField(field)}[] ${field.name};
-            {
-                int itemCount = (int) ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc};
-                ${field.name} = new ${helper.getNonPrimitiveLanguageTypeNameForField(field)}[itemCount];
-                for(int curItem = 0; curItem < itemCount; curItem++) {
-                    ${field.name}[curItem] = <#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>;
-                }
-            }
-            <#-- In all other cases do we have to work with a list, that is later converted to an array -->
-                        <#else>
-            <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
-                            <#if helper.isLengthArray(field)>
-            // Length array
-            int _${field.name}Length = ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc};
-            List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
-            int ${field.name}EndPos = io.getPos() + _${field.name}Length;
-            while(io.getPos() < ${field.name}EndPos) {
-                _${field.name}List.add(<#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>);
-                <#-- After parsing, update the current position, but only if it's needed -->
-                                <#if field.loopExpression.contains("curPos")>
-                curPos = io.getPos() - startPos;
-                                </#if>
-            }
-            <#-- A terminated array keeps on reading data as long as the termination expression evaluates to false -->
-                            <#elseif helper.isTerminatedArray(field)>
-            // Terminated array
-            List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
-            while(!((boolean) (${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc}))) {
-                _${field.name}List.add(<#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>);
-
-                <#-- After parsing, update the current position, but only if it's needed -->
-                                <#if field.loopExpression.contains("curPos")>
-                curPos = io.getPos() - startPos;
-                                </#if>
-            }
-                            </#if>
-            <#--
-                Convert the list into an array. However if the array is of a primitive
-                type we have to iterate over it's elements and explicitly cast them.
-                Otherwise a simple toArray call is fine.
-            -->
-                            <#if helper.isSimpleType(field.type)>
-            ${helper.getNonPrimitiveLanguageTypeNameForField(field)}[] ${field.name} = new ${helper.getNonPrimitiveLanguageTypeNameForField(field)}[_${field.name}List.size()];
-            for(int i = 0; i < _${field.name}List.size(); i++) {
-                ${field.name}[i] = (${helper.getNonPrimitiveLanguageTypeNameForField(field)}) _${field.name}List.get(i);
-            }
-                            <#else>
-            ${helper.getNonPrimitiveLanguageTypeNameForField(field)}[] ${field.name} = _${field.name}List.toArray(new ${helper.getNonPrimitiveLanguageTypeNameForField(field)}[0]);
-                            </#if>
-                        </#if>
-                    <#break>
-                    <#case "const">
-
-            // Const Field (${field.name})
-            ${helper.getNonPrimitiveLanguageTypeNameForField(field)} ${field.name} = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
-            if(${field.name} != ${typeName}.${field.name?upper_case}) {
-                throw new ParseException("Expected constant value " + ${typeName}.${field.name?upper_case} + " but got " + ${field.name});
-            }
-                    <#break>
-                    <#case "enum">
-
-            // Enum field (${field.name})
-            ${helper.getNonPrimitiveLanguageTypeNameForField(field)} ${field.name} = ${helper.getNonPrimitiveLanguageTypeNameForField(field)}.valueOf(${helper.getReadBufferReadMethodCall(helper.getEnumBaseType(field.type))?no_esc});
-                    <#break>
-                    <#case "manual">
-
-            // Manual Field (${field.name})
-            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.parseExpression, type.parserArguments)});
-                        <#-- If a manual field is detected, the value returned by this is instantly treated as the value -->
-                        <#switch case.name>
-                            <#case "Time">
-            return new PlcTime(${field.name});
-                            <#break>
-                            <#case "Date">
-            return new PlcDate(${field.name});
-                            <#break>
-                            <#case "DateTime">
-            return new PlcDateTime(${field.name});
-                            <#break>
-                            <#case "Struct">
-            return new PlcStruct(${field.name});
-                            <#break>
-                            <#-- Disable this for now -->
-                            <#case "String">
-            //return new PlcStruct(${field.name});
-                            <#break>
-                            <#default>
-            return new Plc${case.name}(${field.name});
-                        </#switch>
-                        <#-- As we returned early, skip outputting a return at the end -->
-                        <#assign skipReturn=true>
-                    <#break>
-                    <#case "reserved">
-
-            // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
-            {
-                ${helper.getLanguageTypeNameForField(field)} reserved = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
-                if(reserved != ${helper.getReservedValue(field)}) {
-                    LOGGER.info("Expected constant value " + ${field.referenceValue} + " but got " + reserved + " for reserved field.");
-                }
-            }
-                    <#break>
-                    <#case "simple">
-
-            // Simple Field (${field.name})
-            ${helper.getNonPrimitiveLanguageTypeNameForField(field)} ${field.name} = <#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>;
-                    <#break>
-                </#switch>
-            </#list>
-            <#if case.name == "Struct">
-            Map<String, PlcValue> _map = new HashMap<>();
-                <#list case.fields as field>
-            _map.put("${field.name}", PlcValues.of(${field.name}));
-                </#list>
-            </#if>
-            <#if !skipReturn>
-                <#switch case.name>
-                    <#case "Time">
-            return new PlcTime(LocalTime.of((int) hours, (int) minutes, (int) seconds));
-                    <#break>
-                    <#case "Date">
-            return new PlcDate(LocalDate.of((int) year, (int) month, (int) day));
-                    <#break>
-                    <#case "DateTime">
-            return new PlcDateTime(LocalDateTime.of((int) year, (int) month, (int) day, (int) hours, (int) minutes, (int) seconds));
-                    <#break>
-                    <#case "Struct">
-            return new PlcStruct(_map);
-                    <#break>
-                    <#case "List">
-            return new PlcList(Arrays.asList(value));
-                    <#break>
-            <#-- Disable this for now -->
-                    <#case "String">
-            //return new PlcStruct(_map);
-                    <#break>
-                    <#default>
-            return new Plc${case.name}(value);
-                </#switch>
-            </#if>
-        }<#sep> else </#sep></#list>
-        return null;
-    }
-
-<#if outputFlavor != "passive">
-    public static WriteBuffer staticSerialize(PlcValue _value<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${helper.getLanguageTypeName(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) throws ParseException {
-        <#list type.switchField.cases as case><#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toSwitchExpression(type.switchField.discriminatorNames[discriminatorValue?index])}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{ // ${case.name}
-            WriteBuffer io = new WriteBuffer(${helper.getSizeInBits(case)} / 8 );
-            <#list case.fields as field>
-                <#switch field.typeName>
-                    <#case "array">
-                    <#break>
-                    <#case "const">
-            // Const Field (${field.name})
-            ${helper.getWriteBufferReadMethodCall(field.type, field.referenceValue)?no_esc};
-                    <#break>
-                    <#case "enum">
-            // Enum field (${field.name})
-            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${field.name?cap_first}();
-            ${helper.getWriteBufferReadMethodCall(helper.getEnumBaseType(field.type), "(" + field.name + ".getValue())")?no_esc};
-                    <#break>
-                    <#case "manual">
-            // Manual Field (${field.name})
-            ${helper.toSerializationExpression(field, field.serializeExpression, type.parserArguments)};
-                    <#break>
-                    <#case "reserved">
-            // Reserved Field
-            ${helper.getWriteBufferReadMethodCall(field.type, helper.getReservedValue(field))?no_esc};
-                    <#break>
-                    <#case "simple">
-            // Simple Field (${field.name})
-                        <#if case.name == "Struct">
-            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.getStruct().get("${field.name}").get${helper.getLanguageTypeNameForField(field)?cap_first}();
-                        <#else>
-                            <#if field.name == "value">
-            ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${case.name}();
-                            <#else>
-                                <#-- Just for now -->
-            ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getNullValueForType(field.type)};
-                            </#if>
-                        </#if>
-                        <#if helper.isSimpleType(field.type)>
-            ${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
-                        <#else>
-            ${field.type.name}IO.staticSerialize(io, ${field.name});
-                        </#if>
-                    <#break>
-                </#switch>
-            </#list>
-            return io;
-        }<#sep> else </#sep></#list>
-        return null;
-    }
-</#if>
-
-}
\ No newline at end of file
diff --git a/build-utils/language-java/src/main/resources/templates/java/enum-package-info-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/enum-package-info-template.ftlh
deleted file mode 100644
index 27bf875..0000000
--- a/build-utils/language-java/src/main/resources/templates/java/enum-package-info-template.ftlh
+++ /dev/null
@@ -1,39 +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.
--->
-${helper.packageName(protocolName, languageName, outputFlavor)?replace(".", "/")}/types/package-info.java
-/*
-  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 ${helper.packageName(protocolName, languageName, outputFlavor)}.types;
diff --git a/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
index 8ab5ce2..62c4f34 100644
--- a/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/enum-template.ftlh
@@ -1,5 +1,4 @@
 <#--
-<#--
   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
@@ -19,27 +18,27 @@
 -->
 ${helper.packageName(protocolName, languageName, outputFlavor)?replace(".", "/")}/types/${typeName}.java
 /*
-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.
+  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 ${helper.packageName(protocolName, languageName, outputFlavor)}.types;
 
-import org.apache.plc4x.java.spi.generation.Message;
+import org.apache.plc4x.java.utils.Message;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -49,52 +48,52 @@ import java.util.Map;
 public enum ${typeName} {
 
 <#list type.enumValues as enumValue>
-${enumValue.name}((${helper.getLanguageTypeName(type.type, true)}) ${enumValue.value}<#if type.constantNames?has_content>, <#list type.constantNames as constantName>(${helper.getLanguageTypeName(type.getConstantType(constantName), true)}) ${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName))?no_esc}<#sep>, </#sep></#list></#if>)<#sep>,
+    ${enumValue.name}((${helper.getLanguageTypeName(type.type, true)}) ${enumValue.value}<#if type.constantNames?has_content>, <#list type.constantNames as constantName>(${helper.getLanguageTypeName(type.getConstantType(constantName), true)}) ${helper.escapeValue(type.getConstantType(constantName), enumValue.getConstant(constantName))?no_esc}<#sep>, </#sep></#list></#if>)<#sep>,
 </#sep></#list>;
 
-private static final Logger logger = LoggerFactory.getLogger(${typeName}.class);
-
-private static final Map<${helper.getLanguageTypeName(type.type, false)}, ${typeName}> map;
-static {
-map = new HashMap<>();
-for (${typeName} value : ${typeName}.values()) {
-map.put((${helper.getLanguageTypeName(type.type, true)}) value.getValue(), value);
-}
-}
-
-private ${helper.getLanguageTypeName(type.type, true)} value;
-<#if type.constantNames?has_content>
-    <#list type.constantNames as constantName>
-        private ${helper.getLanguageTypeName(type.getConstantType(constantName), true)} ${constantName};
-    </#list>
-</#if>
-
-${typeName}(${helper.getLanguageTypeName(type.type, true)} value<#if type.constantNames?has_content>, <#list type.constantNames as constantName>${helper.getLanguageTypeName(type.getConstantType(constantName), true)} ${constantName}<#sep>, </#sep></#list></#if>) {
-this.value = value;
-<#if type.constantNames?has_content>
-    <#list type.constantNames as constantName>
+    private static final Logger logger = LoggerFactory.getLogger(${typeName}.class);
+
+    private static final Map<${helper.getLanguageTypeName(type.type, false)}, ${typeName}> map;
+    static {
+        map = new HashMap<>();
+        for (${typeName} value : ${typeName}.values()) {
+            map.put((${helper.getLanguageTypeName(type.type, true)}) value.getValue(), value);
+        }
+    }
+
+    private ${helper.getLanguageTypeName(type.type, true)} value;
+    <#if type.constantNames?has_content>
+        <#list type.constantNames as constantName>
+    private ${helper.getLanguageTypeName(type.getConstantType(constantName), true)} ${constantName};
+        </#list>
+    </#if>
+
+    ${typeName}(${helper.getLanguageTypeName(type.type, true)} value<#if type.constantNames?has_content>, <#list type.constantNames as constantName>${helper.getLanguageTypeName(type.getConstantType(constantName), true)} ${constantName}<#sep>, </#sep></#list></#if>) {
+        this.value = value;
+        <#if type.constantNames?has_content>
+            <#list type.constantNames as constantName>
         this.${constantName} = ${constantName};
-    </#list>
-</#if>
-}
+            </#list>
+        </#if>
+    }
 
-public ${helper.getLanguageTypeName(type.type, true)} getValue() {
-return value;
-}
+    public ${helper.getLanguageTypeName(type.type, true)} getValue() {
+        return value;
+    }
 
-<#if type.constantNames?has_content>
-    <#list type.constantNames as constantName>
-        public ${helper.getLanguageTypeName(type.getConstantType(constantName), true)} get${constantName?cap_first}() {
+    <#if type.constantNames?has_content>
+        <#list type.constantNames as constantName>
+    public ${helper.getLanguageTypeName(type.getConstantType(constantName), true)} get${constantName?cap_first}() {
         return ${constantName};
-        }
+    }
 
-    </#list>
-</#if>
-public static ${typeName} valueOf(${helper.getLanguageTypeName(type.type, true)} value) {
-if (!map.containsKey(value)) {
-logger.error("No ${typeName} for value {}", value);
-}
-return map.get(value);
-}
+        </#list>
+    </#if>
+    public static ${typeName} valueOf(${helper.getLanguageTypeName(type.type, true)} value) {
+        if (!map.containsKey(value)) {
+            logger.error("No ${typeName} for value {}", value);
+        }
+        return map.get(value);
+    }
 
 }
\ No newline at end of file
diff --git a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
index 98fecb3..b718935 100644
--- a/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/io-template.ftlh
@@ -38,65 +38,22 @@ ${helper.packageName(protocolName, languageName, outputFlavor)?replace(".", "/")
 
 package ${helper.packageName(protocolName, languageName, outputFlavor)}.io;
 
-import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
-
 import ${helper.packageName(protocolName, languageName, outputFlavor)}.*;
 <#if helper.getComplexTypes(type)?has_content>import ${helper.packageName(protocolName, languageName, outputFlavor)}.io.*;</#if>
-import ${helper.packageName(protocolName, languageName, outputFlavor)}.types.*;
-import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
-import org.apache.plc4x.java.spi.generation.*;
-import org.apache.plc4x.java.api.value.PlcValue;
+<#if helper.getEnumTypes(type)?has_content>import ${helper.packageName(protocolName, languageName, outputFlavor)}.types.*;</#if>
+import org.apache.plc4x.java.utils.*;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
-import java.math.BigInteger;
-import java.time.*;
 import java.util.*;
-import java.util.function.Supplier;
 
-public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#if outputFlavor != "passive">MessageIO<${typeName}, ${typeName}><#else>MessageInput<${typeName}></#if></#if> {
+public class ${typeName}IO {
 
     private static final Logger LOGGER = LoggerFactory.getLogger(${typeName}IO.class);
 
-<#if !helper.isDiscriminatedType(type)>
-    @Override
-    public ${typeName} parse(ReadBuffer io, Object... args) throws ParseException {
-        <#if type.parserArguments?has_content>
-        if((args == null) || (args.length != ${type.parserArguments?size})) {
-            throw new PlcRuntimeException("Wrong number of arguments, expected ${type.parserArguments?size}, but got " + args.length);
-        }
-        <#list type.parserArguments as parserArgument>
-        if(!(args[${parserArgument?index}] instanceof ${helper.getLanguageTypeName(parserArgument.type, false)})) {
-            throw new PlcRuntimeException("Argument ${parserArgument?index} expected to be of type ${helper.getLanguageTypeName(parserArgument.type, false)} but was " + args[${parserArgument?index}].getClass().getName());
-        }
-        ${helper.getLanguageTypeName(parserArgument.type, false)} ${parserArgument.name} = (${helper.getLanguageTypeName(parserArgument.type, false)}) args[${parserArgument?index}];
-        </#list>
-        </#if>
-        return ${typeName}IO.staticParse(io<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);
-    }
-
-    <#if outputFlavor != "passive">
-    @Override
-    public void serialize(WriteBuffer io, ${typeName} value, Object... args) throws ParseException {
-        <#if helper.getSerializerArguments(type.parserArguments)?has_content>
-        if((args == null) || (args.length != ${type.parserArguments?size})) {
-            throw new PlcRuntimeException("Wrong number of arguments, expected ${type.parserArguments?size}, but got " + args.length);
-        }
-        <#list helper.getSerializerArguments(type.parserArguments) as serializerArgument>
-        if(!(args[${serializerArgument?index}] instanceof ${helper.getLanguageTypeName(serializerArgument.type, false)})) {
-            throw new PlcRuntimeException("Argument ${serializerArgument?index} expected to be of type ${helper.getLanguageTypeName(serializerArgument.type, false)} but was " + args[${serializerArgument?index}].getClass().getName());
-        }
-        ${helper.getLanguageTypeName(serializerArgument.type, false)} ${serializerArgument.name} = (${helper.getLanguageTypeName(serializerArgument.type, false)}) args[${serializerArgument?index}];
-        </#list>
-        </#if>
-        ${typeName}IO.staticSerialize(io, value<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);
-    }
-
-    </#if>
-</#if>
-    public static ${typeName}<#if helper.isDiscriminatedType(type)>Builder</#if> staticParse(ReadBuffer io<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${helper.getLanguageTypeName(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) throws ParseException {
+    public static ${typeName}<#if helper.isDiscriminatedType(type)>Builder</#if> parse(ReadBuffer io<#if type.parserArguments?has_content>, <#list type.parserArguments as parserArgument>${helper.getLanguageTypeName(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) throws ParseException {
         int startPos = io.getPos();
         int curPos;
 <#list type.fields as field>
@@ -111,28 +68,21 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
         <#-- If this is a count array, we can directly initialize an array with the given size -->
         <#if helper.isCountArray(field)>
         // Count array
-        if(${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc} > Integer.MAX_VALUE) {
-            throw new ParseException("Array count of " + (${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc}) + " exceeds the maximum allowed count of " + Integer.MAX_VALUE);
-        }
-        ${helper.getLanguageTypeNameForField( field)}[] ${field.name};
-        {
-            int itemCount = (int) ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc};
-            ${field.name} = new ${helper.getLanguageTypeNameForField(field)}[itemCount];
-            for(int curItem = 0; curItem < itemCount; curItem++) {
-                <#if !helper.isSimpleType(field.type)>boolean lastItem = curItem == (itemCount - 1);</#if>
-                ${field.name}[curItem] = <#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>;
-            }
+        int _${field.name}Count = ${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)?no_esc};
+        ${helper.getLanguageTypeNameForField(field)}[] ${field.name} = new ${helper.getLanguageTypeNameForField(field)}[_${field.name}Count];
+        for(int i = 0; i < _${field.name}Count; i++) {
+            ${field.name}[i] = <#if helper.isSimpleType(field.type)>io.${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toDeserializationExpression(parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>;
         }
         <#-- In all other cases do we have to work with a list, that is later converted to an array -->
         <#else>
             <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
             <#if helper.isLengthArray(field)>
         // Length array
-        int _${field.name}Length = ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc};
+        int _${field.name}Length = ${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)?no_esc};
         List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
         int ${field.name}EndPos = io.getPos() + _${field.name}Length;
         while(io.getPos() < ${field.name}EndPos) {
-            _${field.name}List.add(<#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>);
+            _${field.name}List.add(<#if helper.isSimpleType(field.type)>io.${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toDeserializationExpression(parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>);
             <#-- After parsing, update the current position, but only if it's needed -->
             <#if field.loopExpression.contains("curPos")>
             curPos = io.getPos() - startPos;
@@ -142,8 +92,8 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
             <#elseif helper.isTerminatedArray(field)>
         // Terminated array
         List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
-        while(!((boolean) (${helper.toParseExpression(field, field.loopExpression, type.parserArguments)?no_esc}))) {
-            _${field.name}List.add(<#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>);
+        while(!((boolean) (${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)?no_esc}))) {
+            _${field.name}List.add(<#if helper.isSimpleType(field.type)>io.${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toDeserializationExpression(parserArgument, type.parserArguments)?no_esc})<#sep>, </#sep></#list></#if>)</#if>);
 
             <#-- After parsing, update the current position, but only if it's needed -->
             <#if field.loopExpression.contains("curPos")>
@@ -169,21 +119,16 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
     <#case "checksum">
 
         // Checksum Field (${field.name})
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getNullValueForType(field.type)};
-        {
-            // Create an array of all the bytes read in this message element so far.
-            byte[] checksumRawData = io.getBytes(startPos, io.getPos());
-            ${helper.getLanguageTypeNameForField(field)} _${field.name}Ref = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
-            ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.checksumExpression, type.parserArguments)});
-            if(${field.name} != _${field.name}Ref) {
-                throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_${field.name}Ref & 0xFFFF, ${field.name} & 0xFFFF));
-            }
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = io.${helper.getReadMethodName(field.type)}(${field.type.size});
+        ${helper.getLanguageTypeNameForField(field)} _${field.name}Ref = (${helper.getLanguageTypeNameForField(field)}) (${helper.toDeserializationExpression(field.checksumExpression, type.parserArguments)});
+        if(${field.name} != _${field.name}Ref) {
+            throw new ParseException(String.format("Checksum verification failed. Expected %04X but got %04X",_${field.name}Ref & 0xFFFF, ${field.name} & 0xFFFF));
         }
         <#break>
     <#case "const">
 
         // Const Field (${field.name})
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = io.${helper.getReadMethodName(field.type)}(${field.type.size});
         if(${field.name} != ${typeName}.${field.name?upper_case}) {
             throw new ParseException("Expected constant value " + ${typeName}.${field.name?upper_case} + " but got " + ${field.name});
         }
@@ -191,17 +136,17 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
     <#case "enum">
 
         // Enum field (${field.name})
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getLanguageTypeNameForField(field)}.valueOf(${helper.getReadBufferReadMethodCall(helper.getEnumBaseType(field.type))?no_esc});
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getLanguageTypeNameForField(field)}.valueOf(io.${helper.getReadMethodName(helper.getEnumBaseType(field.type))}(${helper.getEnumBaseType(field.type).size}));
         <#break>
     <#case "discriminator">
 
         // Discriminator Field (${field.name}) (Used as input to a switch field)
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = io.${helper.getReadMethodName(field.type)}(${field.type.size});
         <#break>
     <#case "implicit">
 
         // Implicit Field (${field.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = io.${helper.getReadMethodName(field.type)}(${field.type.size});
         <#break>
     <#case "manualArray">
 
@@ -213,21 +158,21 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
         <#-- If this is a count array, we can directly initialize an array with the given size -->
         <#if helper.isCountArray(field)>
         // Count array
-        int _${field.name}Count = ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)};
+        int _${field.name}Count = ${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)};
         ${helper.getLanguageTypeNameForField(field)}[] ${field.name} = new ${helper.getLanguageTypeNameForField(field)}[_${field.name}Count];
         for(int i = 0; i < _${field.name}Count; i++) {
-            ${field.name}[i] = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.parseExpression, type.parserArguments)});
+            ${field.name}[i] = (${helper.getLanguageTypeNameForField(field)}) (${helper.toDeserializationExpression(field.deserializationExpression, type.parserArguments)});
         }
         <#-- In all other cases do we have to work with a list, that is later converted to an array -->
         <#else>
             <#-- For a length array, we read data till the read position of the buffer reaches a given position -->
             <#if helper.isLengthArray(field)>
         // Length array
-        int _${field.name}Length = ${helper.toParseExpression(field, field.loopExpression, type.parserArguments)};
+        int _${field.name}Length = ${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)};
         List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
         int ${field.name}EndPos = io.getPos() + _${field.name}Length;
         while(io.getPos() < ${field.name}EndPos) {
-            _${field.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.parseExpression, type.parserArguments)}));
+            _${field.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toDeserializationExpression(field.deserializationExpression, type.parserArguments)}));
             <#-- After parsing, update the current position, but only if it's needed -->
             <#if field.loopExpression.contains("curPos")>
             curPos = io.getPos() - startPos;
@@ -237,8 +182,8 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
             <#elseif helper.isTerminatedArray(field)>
         // Terminated array
         List<${helper.getNonPrimitiveLanguageTypeNameForField(field)}> _${field.name}List = new LinkedList<>();
-        while(!((boolean) (${helper.toParseExpression(field, field.loopExpression, type.parserArguments)}))) {
-            _${field.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.parseExpression, type.parserArguments)}));
+        while(!((boolean) (${helper.toDeserializationExpression(field.loopExpression, type.parserArguments)}))) {
+            _${field.name}List.add((${helper.getLanguageTypeNameForField(field)}) (${helper.toDeserializationExpression(field.deserializationExpression, type.parserArguments)}));
 
             <#-- After parsing, update the current position, but only if it's needed -->
             <#if field.loopExpression.contains("curPos")>
@@ -264,7 +209,7 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
     <#case "manual">
 
         // Manual Field (${field.name})
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.parseExpression, type.parserArguments)});
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toDeserializationExpression(field.deserializationExpression, type.parserArguments)});
         <#break>
     <#case "optional">
 
@@ -273,25 +218,25 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
         curPos = io.getPos() - startPos;
         </#if>
         ${helper.getLanguageTypeNameForField(field)} ${field.name} = null;
-        if(${helper.toParseExpression(field, field.conditionExpression, type.parserArguments)?no_esc}) {
-            ${field.name} = <#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>;
+        if(${helper.toDeserializationExpression(field.conditionExpression, type.parserArguments)?no_esc}) {
+            ${field.name} = <#if helper.isSimpleType(field.type)>io.${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toDeserializationExpression(parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>;
         }
         <#break>
     <#case "padding">
 
         // Padding Field (${field.name})
-        boolean _${field.name}NeedsPadding = (boolean) ((io.hasMore(${helper.getNumBits(field.type)})) && (${helper.toParseExpression(field, field.paddingCondition, type.parserArguments)?no_esc}));
+        boolean _${field.name}NeedsPadding = (boolean) (${helper.toDeserializationExpression(field.paddingCondition, type.parserArguments)});
         if(_${field.name}NeedsPadding) {
             // Just read the padding data and ignore it
-            ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
+            io.${helper.getReadBufferReadMethodCall(field.type)};
         }
         <#break>
     <#case "reserved">
 
         // Reserved Field (Compartmentalized so the "reserved" variable can't leak)
         {
-            ${helper.getLanguageTypeNameForField(field)} reserved = ${helper.getReadBufferReadMethodCall(field.type)?no_esc};
-            if(reserved != ${helper.getReservedValue(field)}) {
+            ${helper.getLanguageTypeNameForField(field)} reserved = io.${helper.getReadBufferReadMethodCall(field.type)};
+            if(reserved != ${field.referenceValue}) {
                 LOGGER.info("Expected constant value " + ${field.referenceValue} + " but got " + reserved + " for reserved field.");
             }
         }
@@ -299,27 +244,21 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
     <#case "simple">
 
         // Simple Field (${field.name})
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = <#if helper.isSimpleType(field.type)>${helper.getReadBufferReadMethodCall(field.type)?no_esc}<#else>${field.type.name}IO.staticParse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toParseExpression(field, parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>;
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = <#if helper.isSimpleType(field.type)>io.${helper.getReadBufferReadMethodCall(field.type)}<#else>${field.type.name}IO.parse(io<#if field.params?has_content>, <#list field.params as parserArgument>(${helper.getArgumentType(field.type, parserArgument?index)}) (${helper.toDeserializationExpression(parserArgument, type.parserArguments)})<#sep>, </#sep></#list></#if>)</#if>;
         <#break>
     <#case "switch">
 
         // Switch Field (Depending on the discriminator values, passes the instantiation to a sub-type)
         ${typeName}Builder builder = null;
         <#list field.cases as case>
-        <#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toSwitchExpression(field.discriminatorNames[discriminatorValue?index])?no_esc}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{
-            builder = ${case.name}IO.staticParse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);
+        <#if case.discriminatorValues?has_content>if(<#list case.discriminatorValues as discriminatorValue>EvaluationHelper.equals(${helper.toSwitchExpression(field.discriminatorNames[discriminatorValue?index])}, ${discriminatorValue})<#sep> && </#sep></#list>) </#if>{
+            builder = ${case.name}IO.parse(io<#if case.parserArguments?has_content>, <#list case.parserArguments as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);
         }<#sep> else </#sep>
         </#list>
         if (builder == null) {
             throw new ParseException("Unsupported case for discriminated type");
         }
         <#break>
-
-    <#case "virtual">
-
-        // Virtual field (Just declare a local variable so we can access it in the parser)
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.valueExpression, type.parserArguments)});
-        <#break>
 </#switch>
 </#list>
 
@@ -334,119 +273,109 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
     }
 
 <#if outputFlavor != "passive">
-    public static void staticSerialize(WriteBuffer io, ${typeName} _value<#if helper.getSerializerArguments(type.parserArguments)?has_content>, <#list helper.getSerializerArguments(type.parserArguments) as parserArgument>${helper.getLanguageTypeName(parserArgument.type, false)} ${parserArgument.name}<#sep>, </#sep></#list></#if>) throws ParseException {
-        int startPos = io.getPos();
-
+    public static void serialize(WriteBuffer io, ${typeName} value) throws ParseException {
 <#list type.fields as field>
 <#switch field.typeName>
     <#case "array">
 
         // Array Field (${field.name})
-        if(_value.get${field.name?cap_first}() != null) {
-            int itemCount = (int) _value.get${field.name?cap_first}().length;
-            int curItem = 0;
-            for(${helper.getLanguageTypeNameForField(field)} element : _value.get${field.name?cap_first}()) {
+        if(value.get${field.name?cap_first}() != null) {
+            for(${helper.getLanguageTypeNameForField(field)} element : value.get${field.name?cap_first}()) {
                 <#if helper.isSimpleType(field.type)>
-                ${helper.getWriteBufferReadMethodCall(field.type, "element")?no_esc};
+                io.${helper.getWriteBufferReadMethodCall(field.type, "element")};
                 <#else>
-                boolean lastItem = curItem == (itemCount - 1);
-                ${field.type.name}IO.staticSerialize(io, element<#if helper.getSerializerTerms(field.params)?has_content>, <#list helper.getSerializerTerms(field.params) as parserArgument>${parserArgument.name}<#sep>, </#sep></#list></#if>);
+                ${field.type.name}IO.serialize(io, element);
                 </#if>
-                curItem++;
             }
         }
         <#break>
     <#case "checksum">
 
         // Checksum Field (${field.name}) (Calculated)
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = ${helper.getNullValueForType(field.type)};
-        {
-            // Create an array of all the bytes written in this message element so far.
-            byte[] checksumRawData = io.getBytes(startPos, io.getPos());
-            ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(field, field.checksumExpression, type.parserArguments)?no_esc});
-            ${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
-        }
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(field.checksumExpression, type.parserArguments)});
+        io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
         <#break>
     <#case "const">
 
         // Const Field (${field.name})
-        ${helper.getWriteBufferReadMethodCall(field.type, field.referenceValue)?no_esc};
+        io.${helper.getWriteBufferReadMethodCall(field.type, field.referenceValue)};
         <#break>
     <#case "discriminator">
 
         // Discriminator Field (${field.name}) (Used as input to a switch field)
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.getDiscriminatorValues()[0];
-        ${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) value.getDiscriminatorValues()[0];
+        io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")};
         <#break>
     <#case "enum">
 
         // Enum field (${field.name})
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${field.name?cap_first}();
-        ${helper.getWriteBufferReadMethodCall(helper.getEnumBaseType(field.type), "(" + field.name + ".getValue())")?no_esc};
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) value.get${field.name?cap_first}();
+        io.${helper.getWriteBufferReadMethodCall(helper.getEnumBaseType(field.type), "(" + field.name + ".getValue())")};
         <#break>
     <#case "implicit">
 
         // Implicit Field (${field.name}) (Used for parsing, but it's value is not stored as it's implicitly given by the objects content)
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(field, field.serializeExpression, type.parserArguments)?no_esc});
-        ${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(field.serializationExpression, type.parserArguments)});
+        io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
         <#break>
     <#case "manualArray">
 
         // Manual Array Field (${field.name})
-        if(_value.get${field.name?cap_first}() != null) {
-            for(${helper.getLanguageTypeNameForField(field)} element : _value.get${field.name?cap_first}()) {
-                ${helper.toSerializationExpression(field ,field.serializeExpression, type.parserArguments)?no_esc};
+        if(value.get${field.name?cap_first}() != null) {
+            for(${helper.getLanguageTypeNameForField(field)} element : value.get${field.name?cap_first}()) {
+                ${helper.toSerializationExpression(field.serializationExpression, type.parserArguments)};
             }
         }
         <#break>
     <#case "manual">
 
         // Manual Field (${field.name})
-        ${helper.toSerializationExpression(field ,field.serializeExpression, type.parserArguments)?no_esc};
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(field.serializationExpression, type.parserArguments)});
+         io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
        <#break>
     <#case "optional">
 
         // Optional Field (${field.name}) (Can be skipped, if the value is null)
         ${helper.getLanguageTypeNameForField(field)} ${field.name} = null;
-        if(_value.get${field.name?cap_first}() != null) {
-            ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${field.name?cap_first}();
+        if(value.get${field.name?cap_first}() != null) {
+            ${field.name} = (${helper.getLanguageTypeNameForField(field)}) value.get${field.name?cap_first}();
             <#if helper.isSimpleType(field.type)>
-            ${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
+            io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")};
             <#else>
-            ${field.type.name}IO.staticSerialize(io, ${field.name});
+            ${field.type.name}IO.serialize(io, ${field.name});
             </#if>
         }
         <#break>
     <#case "padding">
 
         // Padding Field (${field.name})
-        boolean _${field.name}NeedsPadding = (boolean) (${helper.toSerializationExpression(field, field.paddingCondition, type.parserArguments)?no_esc});
+        boolean _${field.name}NeedsPadding = (boolean) (${helper.toSerializationExpression(field.paddingCondition, type.parserArguments)});
         if(_${field.name}NeedsPadding) {
-            ${helper.getLanguageTypeNameForField(field)} _${field.name}PaddingValue = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(field, field.paddingValue, type.parserArguments)?no_esc});
-            ${helper.getWriteBufferReadMethodCall(field.type, "(_" + field.name + "PaddingValue)")?no_esc};
+            ${helper.getLanguageTypeNameForField(field)} _${field.name}PaddingValue = (${helper.getLanguageTypeNameForField(field)}) (${helper.toSerializationExpression(field.paddingValue, type.parserArguments)});
+            io.${helper.getWriteBufferReadMethodCall(field.type, "(_" + field.name + "PaddingValue)")?no_esc};
         }
         <#break>
     <#case "reserved">
 
         // Reserved Field
-        ${helper.getWriteBufferReadMethodCall(field.type, helper.getReservedValue(field))?no_esc};
+        io.${helper.getWriteBufferReadMethodCall(field.type, field.referenceValue)};
         <#break>
     <#case "simple">
 
         // Simple Field (${field.name})
-        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) _value.get${field.name?cap_first}();
+        ${helper.getLanguageTypeNameForField(field)} ${field.name} = (${helper.getLanguageTypeNameForField(field)}) value.get${field.name?cap_first}();
         <#if helper.isSimpleType(field.type)>
-        ${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")?no_esc};
+        io.${helper.getWriteBufferReadMethodCall(field.type, "(" + field.name + ")")};
         <#else>
-        ${field.type.name}IO.staticSerialize(io, ${field.name});
+        ${field.type.name}IO.serialize(io, ${field.name});
         </#if>
         <#break>
     <#case "switch">
 
         // Switch field (Depending on the discriminator values, passes the instantiation to a sub-type)
         <#list field.cases as case>
-        if(_value instanceof ${case.name}) {
-            ${case.name}IO.staticSerialize(io, (${case.name}) _value);
+        if(value instanceof ${case.name}) {
+            ${case.name}IO.serialize(io, (${case.name}) value);
         }<#sep> else </#sep>
         </#list>
         <#break>
@@ -455,6 +384,25 @@ public class ${typeName}IO <#if !helper.isDiscriminatedType(type)>implements <#i
     }
 </#if>
 
+    private static int COUNT(Object obj) {
+        if(obj.getClass().isArray()) {
+            Object[] arr = (Object[]) obj;
+            return arr.length;
+        } else if(obj instanceof Collection) {
+            Collection col = (Collection) obj;
+            return col.size();
+        }
+        throw new RuntimeException("Unable to count object of type " + obj.getClass().getName());
+    }
+
+    private static <T> T CAST(Object obj, Class<T> clazz) {
+        try {
+            return clazz.cast(obj);
+        } catch(ClassCastException e) {
+            throw new RuntimeException("Unable to cast object of type " + obj.getClass().getName() + " to " + clazz.getName());
+        }
+    }
+
 <#if type.abstract>
     public static interface ${typeName}Builder {
         ${typeName} build(<#list type.propertyFields as field>${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> ${field.name}<#sep>, </#sep></#list>);
diff --git a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
index 5713f50..a5c1e60 100644
--- a/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
+++ b/build-utils/language-java/src/main/resources/templates/java/pojo-template.ftlh
@@ -38,21 +38,12 @@ ${helper.packageName(protocolName, languageName, outputFlavor)?replace(".", "/")
 
 package ${helper.packageName(protocolName, languageName, outputFlavor)};
 
-import static org.apache.plc4x.java.spi.generation.StaticHelper.*;
-
-import ${helper.packageName(protocolName, languageName, outputFlavor)}.types.*;
+<#if helper.getEnumTypes(type)?has_content>import ${helper.packageName(protocolName, languageName, outputFlavor)}.types.*;</#if>
 
 import com.fasterxml.jackson.annotation.*;
-import org.apache.commons.lang3.builder.ToStringBuilder;
-import org.apache.commons.lang3.builder.ToStringStyle;
-import org.apache.plc4x.java.api.value.*;
-import org.apache.plc4x.java.spi.generation.Message;
-
-import java.time.*;
-import java.util.*;
-import java.math.BigInteger;
+import org.apache.plc4x.java.utils.Message;
 
-@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "className")
+<#if type.abstract>@JsonTypeInfo(use = JsonTypeInfo.Id.CLASS, include = JsonTypeInfo.As.PROPERTY, property = "className")</#if>
 public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??> extends ${type.parentType.name}</#if> implements Message {
 
 <#if helper.isDiscriminatedType(type)>
@@ -104,18 +95,14 @@ public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??
 </#if>
 
 <#list type.propertyFields as field>
-    <#if helper.isAbstractField(field)>
-    public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> abstract get${field.name?cap_first}();
-    <#else>
     public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
         return ${field.name};
     }
-    </#if>
 
 </#list>
 <#list type.virtualFields as field>
     public ${helper.getLanguageTypeNameForField(field)}<#if field.loopType??>[]</#if> get${field.name?cap_first}() {
-        return (${helper.getLanguageTypeNameForField(field)}) (${helper.toParseExpression(field, field.valueExpression, type.parserArguments)});
+        return (${helper.getLanguageTypeNameForField(field)}) (${helper.toDeserializationExpression(field.valueExpression, type.parserArguments)});
     }
 
 </#list>
@@ -129,7 +116,7 @@ public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??
 
         // Array field
         <#if helper.isSimpleType(field.type)>
-        lengthInBits += ${field.type.sizeInBits} * ${field.name}.length;
+        lengthInBits += ${field.type.size} * ${field.name}.length;
         <#else>
         if(${field.name} != null) {
             for(Message element : ${field.name}) {
@@ -141,44 +128,44 @@ public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??
     <#case "checksum">
 
         // Checksum Field (${field.name})
-        lengthInBits += ${field.type.sizeInBits};
+        lengthInBits += ${field.type.size};
         <#break>
     <#case "const">
 
         // Const Field (${field.name})
-        lengthInBits += ${field.type.sizeInBits};
+        lengthInBits += ${field.type.size};
         <#break>
     <#case "discriminator">
 
         // Discriminator Field (${field.name})
-        lengthInBits += ${field.type.sizeInBits};
+        lengthInBits += ${field.type.size};
         <#break>
     <#case "enum">
 
         // Enum Field (${field.name})
-        lengthInBits += ${helper.getEnumBaseType(field.type).sizeInBits};
+        lengthInBits += ${helper.getEnumBaseType(field.type).size};
         <#break>
     <#case "implicit">
 
         // Implicit Field (${field.name})
-        lengthInBits += ${field.type.sizeInBits};
+        lengthInBits += ${field.type.size};
         <#break>
     <#case "manualArray">
 
         // Manual Array Field (${field.name})
-        lengthInBits += ${helper.toParseExpression(field, field.lengthExpression, null)} * 8;
+        lengthInBits += ${helper.toDeserializationExpression(field.lengthExpression, null)} * 8;
         <#break>
     <#case "manual">
 
         // Manual Field (${field.name})
-        lengthInBits += ${helper.toParseExpression(field, field.lengthExpression, null)} * 8;
+        lengthInBits += ${helper.toDeserializationExpression(field.lengthExpression, null)} * 8;
         <#break>
     <#case "optional">
 
         // Optional Field (${field.name})
         if(${field.name} != null) {
         <#if helper.isSimpleType(field.type)>
-            lengthInBits += ${field.type.sizeInBits};
+            lengthInBits += ${field.type.size};
         <#else>
             lengthInBits += ${field.name}.getLengthInBytes() * 8;
         </#if>
@@ -187,21 +174,20 @@ public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??
     <#case "padding">
 
         // Padding Field (${field.name})
-        <#-- We're replacing the "lastItem" with 'false' here as the item itself can't know if it is the last -->
-        if((boolean) (${helper.toParseExpression(field, field.paddingCondition, type.parserArguments)?replace("lastItem", "false")?no_esc})) {
-            lengthInBits += ${field.type.sizeInBits};
+        if((boolean) (${helper.toDeserializationExpression(field.paddingCondition, type.parserArguments)})) {
+            lengthInBits += ${field.type.size};
         }
         <#break>
     <#case "reserved">
 
         // Reserved Field
-        lengthInBits += ${field.type.sizeInBits};
+        lengthInBits += ${field.type.size};
         <#break>
     <#case "simple">
 
         // Simple field (${field.name})
         <#if helper.isSimpleType(field.type)>
-        lengthInBits += ${field.type.sizeInBits};
+        lengthInBits += ${field.type.size};
         <#else>
         lengthInBits += ${field.name}.getLengthInBytes() * 8;
         </#if>
@@ -220,125 +206,4 @@ public<#if type.abstract> abstract</#if> class ${typeName}<#if type.parentType??
         return lengthInBits / 8;
     }
 
-    public PlcValue toPlcValue() {
-<#if type.propertyFields?has_content>
-        Map<String, PlcValue> fieldValues = new TreeMap<>();
-<#list type.propertyFields as field>
-<#switch field.typeName>
-<#case "array">
-<#case "manualArray">
-
-        {
-            List<PlcValue> plcValues = new ArrayList<>(${field.name}.length);
-            for(${helper.getLanguageTypeNameForField(field)} item : ${field.name}) {
-                <#if helper.isSimpleType(field.type)>
-                plcValues.add(PlcValues.of(item));
-                <#else>
-                plcValues.add(item.toPlcValue());
-                </#if>
-            }
-            fieldValues.put("${field.name}", new PlcList(plcValues));
-        }
-<#break>
-<#case "enum">
-
-        fieldValues.put("${field.name}", new PlcString(${field.name}.name()));
-<#break>
-<#case "manual">
-<#case "simple">
-
-    <#if helper.isSimpleType(field.type)>
-        fieldValues.put("${field.name}", PlcValues.of(${field.name}));
-    <#else>
-        fieldValues.put("${field.name}", ${field.name}.toPlcValue());
-    </#if>
-<#break>
-<#case "optional">
-
-        if(${field.name} != null) {
-            <#if helper.isSimpleType(field.type)>
-            fieldValues.put("${field.name}", PlcValues.of(${field.name}));
-            <#else>
-            fieldValues.put("${field.name}", ${field.name}.toPlcValue());
-            </#if>
-        } else {
-            fieldValues.put("${field.name}", null);
-        }
-<#break>
-<#case "switch">
-
-        PlcStruct superStruct = (PlcStruct) super.toPlcValue();
-        fieldValues.putAll(superStruct.getStruct());
-<#break>
-<#case "virtual">
-    <#if helper.isSimpleType(field.type)>
-
-        fieldValues.put("${field.name}", PlcValues.of(${field.name}));
-    </#if>
-<#break>
-</#switch>
-</#list>
-
-        return new PlcStruct(fieldValues);
-<#else>
-        return null;
-</#if>
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof ${typeName})) {
-            return false;
-        }
-        ${typeName} that = (${typeName}) o;
-        return
-            <#if type.propertyFields?has_content>
-            <#list type.propertyFields as field>
-            (get${field.name?cap_first}() == that.get${field.name?cap_first}()) &&
-            </#list>
-            </#if>
-            <#if type.parentType??>
-            super.equals(that) &&
-            </#if>
-            true;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(
-            <#if type.parentType??>
-            super.hashCode()<#if type.propertyFields?has_content>,</#if>
-            </#if>
-            <#if type.propertyFields?has_content>
-            <#list type.propertyFields as field>
-            get${field.name?cap_first}()<#sep>,</#sep>
-            </#list>
-            </#if>
-        );
-    }
-
-    @Override
-    public String toString() {
-        return toString(ToStringStyle.SHORT_PREFIX_STYLE);
-    }
-
-    public String toString(ToStringStyle style) {
-        return new ToStringBuilder(this, style)
-            <#if type.parentType??>
-            .appendSuper(super.toString(style))
-            </#if>
-            <#if type.propertyFields?has_content>
-            <#list type.propertyFields as field>
-            .append("${field.name}", get${field.name?cap_first}())
-            </#list>
-            </#if>
-            <#list type.virtualFields as field>
-            .append("${field.name}", get${field.name?cap_first}())
-            </#list>
-            .toString();
-    }
-
 }
\ No newline at end of file
diff --git a/build-utils/pom.xml b/build-utils/pom.xml
index b30368f..c0564b2 100644
--- a/build-utils/pom.xml
+++ b/build-utils/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x</groupId>
     <artifactId>plc4x-parent</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
+    <version>0.6.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4x-build-utils</artifactId>
diff --git a/build-utils/protocol-base-mspec/pom.xml b/build-utils/protocol-base-mspec/pom.xml
index b8b0ee3..db361a8 100644
--- a/build-utils/protocol-base-mspec/pom.xml
+++ b/build-utils/protocol-base-mspec/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x</groupId>
     <artifactId>plc4x-build-utils</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
+    <version>0.6.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4x-build-utils-protocol-base-mspec</artifactId>
@@ -64,43 +64,6 @@
       <groupId>org.antlr</groupId>
       <artifactId>antlr4-runtime</artifactId>
     </dependency>
-
-    <!-- Testing -->
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter-api</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter-params</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.junit.jupiter</groupId>
-      <artifactId>junit-jupiter-engine</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.junit.vintage</groupId>
-      <artifactId>junit-vintage-engine</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-junit-jupiter</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.hamcrest</groupId>
-      <artifactId>hamcrest-library</artifactId>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4 b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
index 1e51322..8d058ca 100644
--- a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
+++ b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/MSpec.g4
@@ -23,27 +23,23 @@ file
  ;
 
 complexTypeDefinition
- : (COMMENT.*?)? LBRACKET complexType RBRACKET
+ : COMMENT
+ | LBRACKET complexType RBRACKET
  ;
 
 complexType
- : 'type' name=idExpression (LBRACKET params=argumentList RBRACKET)? fieldDefinition*
+ : 'type' name=idExpression (LBRACKET params=argumentList RBRACKET)? fieldDefinition+
  | 'discriminatedType' name=idExpression (LBRACKET params=argumentList RBRACKET)? fieldDefinition+
  | 'enum' type=typeReference name=idExpression (LBRACKET params=argumentList RBRACKET)? enumValues=enumValueDefinition+
- | 'dataIo' name=idExpression (LBRACKET params=argumentList RBRACKET)? dataIoTypeSwitch=dataIoDefinition
  ;
 
-fieldDefinition
- : (COMMENT.*?)? LBRACKET field (LBRACKET params=multipleExpressions RBRACKET)? RBRACKET
- ;
 
-dataIoDefinition
- : (COMMENT.*?)? LBRACKET typeSwitchField (LBRACKET params=multipleExpressions RBRACKET)? RBRACKET
+fieldDefinition
+ : LBRACKET field (LBRACKET params=multipleExpressions RBRACKET)? RBRACKET
  ;
 
 field
- : abstractField
- | arrayField
+ : arrayField
  | checksumField
  | constField
  | discriminatorField
@@ -59,10 +55,6 @@ field
  | virtualField
  ;
 
-abstractField
- : 'abstract' type=typeReference name=idExpression
- ;
-
 arrayField
  : 'array' type=typeReference name=idExpression loopType=arrayType loopExpression=expression
  ;
@@ -84,15 +76,15 @@ enumField
  ;
 
 implicitField
- : 'implicit' type=dataType name=idExpression serializeExpression=expression
+ : 'implicit' type=dataType name=idExpression serializationExpression=expression
  ;
 
 manualArrayField
- : 'manualArray' type=typeReference name=idExpression loopType=arrayType loopExpression=expression parseExpression=expression serializeExpression=expression lengthExpression=expression
+ : 'manualArray' type=typeReference name=idExpression loopType=arrayType loopExpression=expression deserializationExpression=expression serializationExpression=expression lengthExpression=expression
  ;
 
 manualField
- : 'manual' type=typeReference name=idExpression parseExpression=expression serializeExpression=expression lengthExpression=expression
+ : 'manual' type=typeReference name=idExpression deserializationExpression=expression serializationExpression=expression lengthExpression=expression
  ;
 
 optionalField
@@ -120,12 +112,9 @@ virtualField
  ;
 
 enumValueDefinition
- : (COMMENT.*?)? LBRACKET valueExpression=expression name=IDENTIFIER (LBRACKET constantValueExpressions=multipleExpressions RBRACKET)? RBRACKET
+ : LBRACKET valueExpression=expression name=IDENTIFIER (LBRACKET constantValueExpressions=multipleExpressions RBRACKET)? RBRACKET
  ;
 
-bitmaskValueDefinition
- : (COMMENT.*?)? LBRACKET valueExpression=expression name=IDENTIFIER (LBRACKET constantValueExpressions=multipleExpressions RBRACKET)? RBRACKET
- ;
 
 typeReference
  : complexTypeReference=IDENTIFIER
@@ -133,20 +122,15 @@ typeReference
  ;
 
 caseStatement
- : (COMMENT.*?)? LBRACKET (discriminatorValues=multipleExpressions)? name=IDENTIFIER (LBRACKET params=argumentList RBRACKET)? fieldDefinition* RBRACKET
+ : LBRACKET (discriminatorValues=multipleExpressions)? name=IDENTIFIER (LBRACKET params=argumentList RBRACKET)? fieldDefinition* RBRACKET
  ;
 
 dataType
  : base='bit'
  | base='int' size=INTEGER_LITERAL
  | base='uint' size=INTEGER_LITERAL
- | base='float' exponent=INTEGER_LITERAL '.' mantissa=INTEGER_LITERAL
- | base='ufloat' exponent=INTEGER_LITERAL '.' mantissa=INTEGER_LITERAL
-/* For the following types the parsing/serialization has to be handled manually */
- | base='string' size=INTEGER_LITERAL encoding=idExpression
- | base='time'
- | base='date'
- | base='dateTime'
+ | base='float' size=INTEGER_LITERAL
+ | base='string'
  ;
 
 argument
@@ -180,9 +164,8 @@ innerExpression
  ;
 
 COMMENT
- : K_COMMENT [a-zA-Z0-9,.'":;()/ =@<>_?&`Ā“ā€™\t\r\n\u000C-]*
- | '//' [a-zA-Z0-9,.'":;()/ =@<>_?&`Ā“ā€™\t-]*
- | '/*' .*? '*/'
+ : K_COMMENT [a-zA-Z0-9,.'":;()/ \t\r\n\u000C-]*
+ | '//' [a-zA-Z0-9,.'":;()/ \t-]*
  ;
 
 INTEGER_LITERAL
@@ -201,23 +184,13 @@ fragment HexDigit
 ;
 
 arrayType
- : K_COUNT
- | K_LENGTH
- | K_TERMINATE
+ : 'count'
+ | 'length'
+ | 'terminated'
  ;
 
 idExpression
- : TICK id=idString TICK
- ;
-
-idString
- : IDENTIFIER
- | keywords
- ;
-
-keywords
- : K_TERMINATE
- | K_LENGTH
+ : TICK id=IDENTIFIER TICK
  ;
 
 fragment K_COMMENT : '<--';
@@ -229,28 +202,19 @@ RBRACKET : ']';
 LCBRACKET : '{';
 RCBRACKET : '}';
 
-K_COUNT : C O U N T;
-K_LENGTH : L E N G T H;
-K_TERMINATE : T E R M I N A T E D;
-
 BinaryOperator
  : '+'
  | '-'
  | '/'
  | '*'
- | '^'
  | '=='
  | '!='
- | '>>'
- | '<<'
  | '>'
  | '<'
  | '>='
  | '<='
  | '&&'
  | '||'
- | '&'
- | '|'
  | '%'
  ;
 
@@ -261,32 +225,5 @@ IDENTIFIER
  : [A-Za-z0-9_-]+
  ;
 
-fragment A : [aA];
-fragment B : [bB];
-fragment C : [cC];
-fragment D : [dD];
-fragment E : [eE];
-fragment F : [fF];
-fragment G : [gG];
-fragment H : [hH];
-fragment I : [iI];
-fragment J : [jJ];
-fragment K : [kK];
-fragment L : [lL];
-fragment M : [mM];
-fragment N : [nN];
-fragment O : [oO];
-fragment P : [pP];
-fragment Q : [qQ];
-fragment R : [rR];
-fragment S : [sS];
-fragment T : [tT];
-fragment U : [uU];
-fragment V : [vV];
-fragment W : [wW];
-fragment X : [xX];
-fragment Y : [yY];
-fragment Z : [zZ];
-
 WS  :  [ \t\r\n\u000C]+ -> skip
-;
+;
\ No newline at end of file
diff --git a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/Expression.g4 b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/Expression.g4
index 5f12672..7e8c288 100644
--- a/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/Expression.g4
+++ b/build-utils/protocol-base-mspec/src/main/antlr4/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/Expression.g4
@@ -41,13 +41,10 @@ expression
  | <assoc=right> expression '^' expression              #powerExpression
  | expression op=( '*' | '/' | '%' ) expression         #multExpression
  | expression op=( '+' | '-' ) expression               #addExpression
- | expression op=( '>>' | '<<' ) expression             #bitShiftExpression
  | expression op=( '>=' | '<=' | '>' | '<' ) expression #compExpression
  | expression op=( '==' | '!=' ) expression             #eqExpression
  | expression '&&' expression                           #andExpression
- | expression '&' expression                            #bitAndExpression
  | expression '||' expression                           #orExpression
- | expression '|' expression                            #bitOrExpression
  | expression '?' expression ':' expression             #ifExpression
  | Number                                               #numberExpression
  | Bool                                                 #boolExpression
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
index d593c2d..bec1f9d 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringListener.java
@@ -45,10 +45,10 @@ public class ExpressionStringListener extends ExpressionBaseListener {
     @Override
     public void exitExpressionString(ExpressionParser.ExpressionStringContext ctx) {
         List<Term> roots = parserContexts.pop();
-        if (roots.isEmpty()) {
+        if(roots.isEmpty()) {
             throw new RuntimeException("Empty Expression not supported.");
         }
-        if (roots.size() != 1) {
+        if(roots.size() != 1) {
             throw new RuntimeException("Expression can only contain one root term.");
         }
         root = roots.get(0);
@@ -65,13 +65,13 @@ public class ExpressionStringListener extends ExpressionBaseListener {
 
     @Override
     public void exitBoolExpression(ExpressionParser.BoolExpressionContext ctx) {
-        parserContexts.peek().add(new BooleanLiteral(Boolean.parseBoolean(ctx.getText())));
+        parserContexts.peek().add(new BooleanLiteral(Boolean.valueOf(ctx.getText())));
     }
 
     @Override
     public void exitNumberExpression(ExpressionParser.NumberExpressionContext ctx) {
         String strValue = ctx.Number().getText();
-        if (strValue.contains(".")) {
+        if(strValue.contains(".")) {
             parserContexts.peek().add(new NumericLiteral(Double.valueOf(strValue)));
         } else {
             parserContexts.peek().add(new NumericLiteral(Long.valueOf(strValue)));
@@ -95,11 +95,11 @@ public class ExpressionStringListener extends ExpressionBaseListener {
         IndexContext indexContext = null;
         RestContext restContext = null;
         for (Term arg : args) {
-            if (arg instanceof ArgsContext) {
+            if(arg instanceof ArgsContext) {
                 argsContext = (ArgsContext) arg;
-            } else if (arg instanceof IndexContext) {
+            } else if(arg instanceof IndexContext) {
                 indexContext = (IndexContext) arg;
-            } else if (arg instanceof RestContext) {
+            } else if(arg instanceof RestContext) {
                 restContext = (RestContext) arg;
             }
         }
@@ -107,11 +107,11 @@ public class ExpressionStringListener extends ExpressionBaseListener {
         String name = ctx.name.getText();
 
         int index = VariableLiteral.NO_INDEX;
-        if (indexContext != null) {
+        if(indexContext != null) {
             index = indexContext.getFirst().getNumber().intValue();
         }
         VariableLiteral rest = null;
-        if (restContext != null) {
+        if(restContext != null) {
             rest = restContext.getFirst();
         }
         parserContexts.peek().add(new VariableLiteral(name, argsContext, index, rest));
@@ -247,39 +247,6 @@ public class ExpressionStringListener extends ExpressionBaseListener {
     }
 
     @Override
-    public void enterBitShiftExpression(ExpressionParser.BitShiftExpressionContext ctx) {
-        parserContexts.push(new LinkedList<>());
-    }
-
-    @Override
-    public void exitBitShiftExpression(ExpressionParser.BitShiftExpressionContext ctx) {
-        BinaryTerm bt = getBinaryTerm(ctx.op.getText(), parserContexts.pop());
-        parserContexts.peek().add(bt);
-    }
-
-    @Override
-    public void enterBitAndExpression(ExpressionParser.BitAndExpressionContext ctx) {
-        parserContexts.push(new LinkedList<>());
-    }
-
-    @Override
-    public void exitBitAndExpression(ExpressionParser.BitAndExpressionContext ctx) {
-        BinaryTerm bt = getBinaryTerm("&", parserContexts.pop());
-        parserContexts.peek().add(bt);
-    }
-
-    @Override
-    public void enterBitOrExpression(ExpressionParser.BitOrExpressionContext ctx) {
-        parserContexts.push(new LinkedList<>());
-    }
-
-    @Override
-    public void exitBitOrExpression(ExpressionParser.BitOrExpressionContext ctx) {
-        BinaryTerm bt = getBinaryTerm("|", parserContexts.pop());
-        parserContexts.peek().add(bt);
-    }
-
-    @Override
     public void enterCompExpression(ExpressionParser.CompExpressionContext ctx) {
         parserContexts.push(new LinkedList<>());
     }
@@ -321,7 +288,7 @@ public class ExpressionStringListener extends ExpressionBaseListener {
     /////////////////////////////////////////////////////////////////////////////////////////
 
     private UnaryTerm getUnaryTerm(String op, List<Term> terms) {
-        if (terms.size() != 1) {
+        if(terms.size() != 1) {
             throw new RuntimeException(op + " should be a unary operation");
         }
         Term a = terms.get(0);
@@ -329,7 +296,7 @@ public class ExpressionStringListener extends ExpressionBaseListener {
     }
 
     private BinaryTerm getBinaryTerm(String op, List<Term> terms) {
-        if (terms.size() != 2) {
+        if(terms.size() != 2) {
             throw new RuntimeException(op + " should be a binary operation");
         }
         Term a = terms.get(0);
@@ -338,7 +305,7 @@ public class ExpressionStringListener extends ExpressionBaseListener {
     }
 
     private TernaryTerm getTernaryTerm(String op, List<Term> terms) {
-        if (terms.size() != 3) {
+        if(terms.size() != 3) {
             throw new RuntimeException(op + " should be a ternary operation");
         }
         Term a = terms.get(0);
@@ -348,7 +315,7 @@ public class ExpressionStringListener extends ExpressionBaseListener {
     }
 
     static class ArgsContext extends LinkedList<Term> implements Term {
-        ArgsContext(Collection c) {
+        public ArgsContext(Collection c) {
             super(c);
         }
 
@@ -357,9 +324,8 @@ public class ExpressionStringListener extends ExpressionBaseListener {
             return false;
         }
     }
-
     static class IndexContext extends LinkedList<NumericLiteral> implements Term {
-        IndexContext(Collection c) {
+        public IndexContext(Collection c) {
             super(c);
         }
 
@@ -368,9 +334,8 @@ public class ExpressionStringListener extends ExpressionBaseListener {
             return false;
         }
     }
-
     static class RestContext extends LinkedList<VariableLiteral> implements Term {
-        RestContext(Collection c) {
+        public RestContext(Collection c) {
             super(c);
         }
 
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParser.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParser.java
index 7b9f124..76c131d 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParser.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParser.java
@@ -21,6 +21,7 @@ package org.apache.plc4x.plugins.codegenerator.language.mspec.expression;
 
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
 import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
 
@@ -30,15 +31,18 @@ import java.io.InputStream;
 public class ExpressionStringParser {
 
     public Term parse(InputStream source) {
-        ExpressionLexer lexer;
         try {
-            lexer = new ExpressionLexer(CharStreams.fromStream(source));
+            ExpressionLexer lexer = new ExpressionLexer(CharStreams.fromStream(source));
+            CommonTokenStream tokens = new CommonTokenStream(lexer);
+            ExpressionParser parser = new ExpressionParser(tokens);
+            ParseTree tree = parser.expressionString();
+            ParseTreeWalker walker = new ParseTreeWalker();
+            ExpressionStringListener listener = new ExpressionStringListener();
+            walker.walk(listener, tree);
+            return listener.getRoot();
         } catch (IOException e) {
             throw new RuntimeException(e);
         }
-        ExpressionStringListener listener = new ExpressionStringListener();
-        new ParseTreeWalker().walk(listener, new ExpressionParser(new CommonTokenStream(lexer)).expressionString());
-        return listener.getRoot();
     }
 
 }
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
index 39d87f4..4dbf73d 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultComplexTypeDefinition.java
@@ -74,8 +74,8 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
     @Override
     public List<PropertyField> getAllPropertyFields() {
         List<PropertyField> fields = new LinkedList<>();
-        if (getParentType() != null) {
-            fields.addAll(((ComplexTypeDefinition) getParentType()).getAllPropertyFields());
+        if(getParentType() != null) {
+            fields.addAll(((ComplexTypeDefinition)getParentType()).getAllPropertyFields());
         }
         fields.addAll(getPropertyFields());
         return fields;
@@ -83,8 +83,8 @@ public class DefaultComplexTypeDefinition extends DefaultTypeDefinition implemen
 
     @Override
     public List<PropertyField> getParentPropertyFields() {
-        if (getParentType() != null) {
-            return ((ComplexTypeDefinition) getParentType()).getAllPropertyFields();
+        if(getParentType() != null) {
+            return ((ComplexTypeDefinition)getParentType()).getAllPropertyFields();
         }
         return Collections.emptyList();
     }
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
deleted file mode 100644
index 0e6e2fd..0000000
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDataIoTypeDefinition.java
+++ /dev/null
@@ -1,38 +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.plugins.codegenerator.language.mspec.model.definitions;
-
-import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
-import org.apache.plc4x.plugins.codegenerator.types.definitions.DataIoTypeDefinition;
-import org.apache.plc4x.plugins.codegenerator.types.fields.SwitchField;
-
-public class DefaultDataIoTypeDefinition extends DefaultTypeDefinition implements DataIoTypeDefinition {
-
-    private final SwitchField switchField;
-
-    public DefaultDataIoTypeDefinition(String name, Argument[] parserArguments, String[] tags, SwitchField switchField) {
-        super(name, parserArguments, tags);
-        this.switchField = switchField;
-    }
-
-    public SwitchField getSwitchField() {
-        return switchField;
-    }
-
-}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
index 8d64b08..65aac2b 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultDiscriminatedComplexTypeDefinition.java
@@ -40,7 +40,7 @@ public class DefaultDiscriminatedComplexTypeDefinition extends DefaultComplexTyp
         // which is always a DefaultComplexTypeDefinition instance.
         return ((DefaultComplexTypeDefinition) getParentType()).getFields().stream().filter(
             field -> field instanceof DiscriminatorField).map(
-            field -> (DiscriminatorField) field).findFirst().orElse(null);
+                field -> (DiscriminatorField) field).findFirst().orElse(null);
     }
 
     public String[] getDiscriminatorValues() {
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
index 67d0d60..b81136c 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/definitions/DefaultEnumTypeDefinition.java
@@ -39,7 +39,7 @@ public class DefaultEnumTypeDefinition extends DefaultTypeDefinition implements
         this.type = type;
         this.enumValues = enumValues;
         this.constants = new HashMap<>();
-        if (constants != null) {
+        if(constants != null) {
             for (Argument constant : constants) {
                 this.constants.put(constant.getName(), constant.getType());
             }
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
deleted file mode 100644
index 79d017f..0000000
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultAbstractField.java
+++ /dev/null
@@ -1,52 +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.plugins.codegenerator.language.mspec.model.fields;
-
-import org.apache.plc4x.plugins.codegenerator.types.fields.AbstractField;
-import org.apache.plc4x.plugins.codegenerator.types.fields.SimpleField;
-import org.apache.plc4x.plugins.codegenerator.types.references.TypeReference;
-import org.apache.plc4x.plugins.codegenerator.types.terms.Term;
-
-public class DefaultAbstractField extends DefaultTaggedField implements AbstractField {
-
-    private final TypeReference type;
-    private final String name;
-    private final Term[] params;
-
-    public DefaultAbstractField(String[] tags, TypeReference type, String name, Term[] params) {
-        super(tags);
-        this.type = type;
-        this.name = name;
-        this.params = params;
-    }
-
-    public TypeReference getType() {
-        return type;
-    }
-
-    public String getName() {
-        return name;
-    }
-
-    public Term[] getParams() {
-        return params;
-    }
-
-}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
index 36d6206..02c416e 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultImplicitField.java
@@ -27,13 +27,13 @@ public class DefaultImplicitField extends DefaultTaggedField implements Implicit
 
     private final TypeReference type;
     private final String name;
-    private final Term serializeExpression;
+    private final Term serializationExpression;
 
-    public DefaultImplicitField(String[] tags, TypeReference type, String name, Term serializeExpression) {
+    public DefaultImplicitField(String[] tags, TypeReference type, String name, Term serializationExpression) {
         super(tags);
         this.type = type;
         this.name = name;
-        this.serializeExpression = serializeExpression;
+        this.serializationExpression = serializationExpression;
     }
 
     public TypeReference getType() {
@@ -44,8 +44,8 @@ public class DefaultImplicitField extends DefaultTaggedField implements Implicit
         return name;
     }
 
-    public Term getSerializeExpression() {
-        return serializeExpression;
+    public Term getSerializationExpression() {
+        return serializationExpression;
     }
 
     public Term[] getParams() {
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
index c46759f..a108d3e 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualArrayField.java
@@ -29,19 +29,19 @@ public class DefaultManualArrayField extends DefaultTaggedField implements Manua
     private final String name;
     private final LoopType loopType;
     private final Term loopExpression;
-    private final Term parseExpression;
-    private final Term serializeExpression;
+    private final Term serializationExpression;
+    private final Term deserializationExpression;
     private final Term lengthExpression;
     private final Term[] params;
 
-    public DefaultManualArrayField(String[] tags, TypeReference type, String name, LoopType loopType, Term loopExpression, Term parseExpression, Term serializeExpression, Term lengthExpression, Term[] params) {
+    public DefaultManualArrayField(String[] tags, TypeReference type, String name, LoopType loopType, Term loopExpression, Term serializationExpression, Term deserializationExpression, Term lengthExpression, Term[] params) {
         super(tags);
         this.type = type;
         this.name = name;
         this.loopType = loopType;
         this.loopExpression = loopExpression;
-        this.parseExpression = parseExpression;
-        this.serializeExpression = serializeExpression;
+        this.serializationExpression = serializationExpression;
+        this.deserializationExpression = deserializationExpression;
         this.lengthExpression = lengthExpression;
         this.params = params;
     }
@@ -62,12 +62,12 @@ public class DefaultManualArrayField extends DefaultTaggedField implements Manua
         return loopExpression;
     }
 
-    public Term getParseExpression() {
-        return parseExpression;
+    public Term getSerializationExpression() {
+        return serializationExpression;
     }
 
-    public Term getSerializeExpression() {
-        return serializeExpression;
+    public Term getDeserializationExpression() {
+        return deserializationExpression;
     }
 
     public Term getLengthExpression() {
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
index 05239a6..3cbd337 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/fields/DefaultManualField.java
@@ -27,17 +27,17 @@ public class DefaultManualField extends DefaultTaggedField implements ManualFiel
 
     private final TypeReference type;
     private final String name;
-    private final Term parseExpression;
-    private final Term serializeExpression;
+    private final Term serializationExpression;
+    private final Term deserializationExpression;
     private final Term lengthExpression;
     private final Term[] params;
 
-    public DefaultManualField(String[] tags, TypeReference type, String name, Term parseExpression, Term serializeExpression, Term lengthExpression, Term[] params) {
+    public DefaultManualField(String[] tags, TypeReference type, String name, Term serializationExpression, Term deserializationExpression, Term lengthExpression, Term[] params) {
         super(tags);
         this.type = type;
         this.name = name;
-        this.parseExpression = parseExpression;
-        this.serializeExpression = serializeExpression;
+        this.serializationExpression = serializationExpression;
+        this.deserializationExpression = deserializationExpression;
         this.lengthExpression = lengthExpression;
         this.params = params;
     }
@@ -50,12 +50,12 @@ public class DefaultManualField extends DefaultTaggedField implements ManualFiel
         return name;
     }
 
-    public Term getParseExpression() {
-        return parseExpression;
+    public Term getSerializationExpression() {
+        return serializationExpression;
     }
 
-    public Term getSerializeExpression() {
-        return serializeExpression;
+    public Term getDeserializationExpression() {
+        return deserializationExpression;
     }
 
     public Term getLengthExpression() {
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultFloatTypeReference.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultFloatTypeReference.java
deleted file mode 100644
index 07d2db4..0000000
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultFloatTypeReference.java
+++ /dev/null
@@ -1,45 +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.plugins.codegenerator.language.mspec.model.references;
-
-import org.apache.plc4x.plugins.codegenerator.types.references.FloatTypeReference;
-
-public class DefaultFloatTypeReference extends DefaultSimpleTypeReference implements FloatTypeReference {
-
-    private final int exponent;
-    private final int mantissa;
-
-    public DefaultFloatTypeReference(SimpleBaseType baseType, int exponent, int mantissa) {
-        super(baseType, (baseType == SimpleBaseType.FLOAT ? 1 : 0) + exponent + mantissa);
-        this.exponent = exponent;
-        this.mantissa = mantissa;
-    }
-
-    @Override
-    public int getExponent() {
-        return exponent;
-    }
-
-    @Override
-    public int getMantissa() {
-        return mantissa;
-    }
-
-}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultIntegerTypeReference.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultIntegerTypeReference.java
deleted file mode 100644
index 793cc0e..0000000
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultIntegerTypeReference.java
+++ /dev/null
@@ -1,30 +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.plugins.codegenerator.language.mspec.model.references;
-
-import org.apache.plc4x.plugins.codegenerator.types.references.IntegerTypeReference;
-
-public class DefaultIntegerTypeReference extends DefaultSimpleTypeReference implements IntegerTypeReference {
-
-    public DefaultIntegerTypeReference(SimpleBaseType baseType, int sizeInBits) {
-        super(baseType, sizeInBits);
-    }
-
-}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleTypeReference.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleTypeReference.java
index 87e5290..a1f3aea 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleTypeReference.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleTypeReference.java
@@ -21,14 +21,14 @@ package org.apache.plc4x.plugins.codegenerator.language.mspec.model.references;
 
 import org.apache.plc4x.plugins.codegenerator.types.references.SimpleTypeReference;
 
-public abstract class DefaultSimpleTypeReference implements SimpleTypeReference {
+public class DefaultSimpleTypeReference implements SimpleTypeReference {
 
     private final SimpleBaseType baseType;
-    private final int sizeInBits;
+    private final int size;
 
-    public DefaultSimpleTypeReference(SimpleBaseType baseType, int sizeInBits) {
+    public DefaultSimpleTypeReference(SimpleBaseType baseType, int size) {
         this.baseType = baseType;
-        this.sizeInBits = sizeInBits;
+        this.size = size;
     }
 
     @Override
@@ -37,8 +37,8 @@ public abstract class DefaultSimpleTypeReference implements SimpleTypeReference
     }
 
     @Override
-    public int getSizeInBits() {
-        return sizeInBits;
+    public int getSize() {
+        return size;
     }
 
 }
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleVarLengthTypeReference.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleVarLengthTypeReference.java
index f4febf5..dd3f8e4 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleVarLengthTypeReference.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultSimpleVarLengthTypeReference.java
@@ -21,7 +21,7 @@ package org.apache.plc4x.plugins.codegenerator.language.mspec.model.references;
 
 import org.apache.plc4x.plugins.codegenerator.types.references.SimpleVarLengthTypeReference;
 
-public class DefaultSimpleVarLengthTypeReference extends DefaultIntegerTypeReference implements SimpleVarLengthTypeReference {
+public class DefaultSimpleVarLengthTypeReference extends DefaultSimpleTypeReference implements SimpleVarLengthTypeReference {
 
     public DefaultSimpleVarLengthTypeReference(SimpleBaseType baseType) {
         super(baseType, -1);
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultStringTypeReference.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultStringTypeReference.java
deleted file mode 100644
index 8631c4d..0000000
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultStringTypeReference.java
+++ /dev/null
@@ -1,38 +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.plugins.codegenerator.language.mspec.model.references;
-
-import org.apache.plc4x.plugins.codegenerator.types.references.StringTypeReference;
-
-public class DefaultStringTypeReference extends DefaultSimpleTypeReference implements StringTypeReference {
-
-    private final String encoding;
-
-    public DefaultStringTypeReference(SimpleBaseType baseType, int sizeInBits, String encoding) {
-        super(baseType, sizeInBits);
-        this.encoding = encoding;
-    }
-
-    @Override
-    public String getEncoding() {
-        return encoding;
-    }
-
-}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultTemporalTypeReference.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultTemporalTypeReference.java
deleted file mode 100644
index b69c5c6..0000000
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/model/references/DefaultTemporalTypeReference.java
+++ /dev/null
@@ -1,30 +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.plugins.codegenerator.language.mspec.model.references;
-
-import org.apache.plc4x.plugins.codegenerator.types.references.TemporalTypeReference;
-
-public class DefaultTemporalTypeReference extends DefaultSimpleTypeReference implements TemporalTypeReference {
-
-    public DefaultTemporalTypeReference(SimpleBaseType baseType) {
-        super(baseType, -1);
-    }
-
-}
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
index 62c701c..74ff1cf 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatListener.java
@@ -23,9 +23,13 @@ import org.apache.commons.io.IOUtils;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecBaseListener;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecParser;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.expression.ExpressionStringParser;
-import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.*;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultDiscriminatedComplexTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultEnumTypeDefinition;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.definitions.DefaultEnumValue;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.model.fields.*;
-import org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.*;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.DefaultComplexTypeReference;
+import org.apache.plc4x.plugins.codegenerator.language.mspec.model.references.DefaultSimpleTypeReference;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.Argument;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.DiscriminatedComplexTypeDefinition;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
@@ -51,14 +55,6 @@ public class MessageFormatListener extends MSpecBaseListener {
 
     private Map<String, TypeDefinition> types;
 
-    public Deque<List<Field>> getParserContexts() {
-        return parserContexts;
-    }
-
-    public Deque<List<EnumValue>> getEnumContexts() {
-        return enumContexts;
-    }
-
     public Map<String, TypeDefinition> getTypes() {
         return types;
     }
@@ -72,7 +68,7 @@ public class MessageFormatListener extends MSpecBaseListener {
 
     @Override
     public void enterComplexType(MSpecParser.ComplexTypeContext ctx) {
-        if (ctx.enumValues != null) {
+        if(ctx.enumValues != null) {
             List<EnumValue> enumContext = new LinkedList<>();
             enumContexts.push(enumContext);
         } else {
@@ -85,40 +81,18 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void exitComplexType(MSpecParser.ComplexTypeContext ctx) {
         String typeName = ctx.name.id.getText();
         Argument[] parserArguments = null;
-        if (ctx.params != null) {
+        if(ctx.params != null) {
             parserArguments = getParserArguments(ctx.params.argument());
         }
 
-        // Handle enum types.
-        if (ctx.enumValues != null) {
+        if(ctx.enumValues != null) {
             TypeReference type = getTypeReference(ctx.type);
             EnumValue[] enumValues = getEnumValues();
             DefaultEnumTypeDefinition enumType = new DefaultEnumTypeDefinition(typeName, type, enumValues,
                 parserArguments, null);
             types.put(typeName, enumType);
             enumContexts.pop();
-        }
-
-        // Handle data-io types.
-        else if (ctx.dataIoTypeSwitch != null) {
-            SwitchField switchField = getSwitchField();
-            DefaultDataIoTypeDefinition type = new DefaultDataIoTypeDefinition(
-                typeName, parserArguments, null, switchField);
-            types.put(typeName, type);
-
-            // Set the parent type for all sub-types.
-            if (switchField != null) {
-                for (DiscriminatedComplexTypeDefinition subtype : switchField.getCases()) {
-                    if (subtype instanceof DefaultDiscriminatedComplexTypeDefinition) {
-                        ((DefaultDiscriminatedComplexTypeDefinition) subtype).setParentType(type);
-                    }
-                }
-            }
-            parserContexts.pop();
-        }
-
-        // Handle all other types.
-        else {
+        } else {
             // If the type has sub-types it's an abstract type.
             SwitchField switchField = getSwitchField();
             boolean abstractType = switchField != null;
@@ -139,26 +113,15 @@ public class MessageFormatListener extends MSpecBaseListener {
     }
 
     @Override
-    public void enterAbstractField(MSpecParser.AbstractFieldContext ctx) {
-        TypeReference type = getTypeReference(ctx.type);
-        String name = ctx.name.id.getText();
-        Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
-        Field field = new DefaultAbstractField(null, type, name, params);
-        if (parserContexts.peek() != null) {
-            parserContexts.peek().add(field);
-        }
-    }
-
-    @Override
     public void enterArrayField(MSpecParser.ArrayFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         ArrayField.LoopType loopType = ArrayField.LoopType.valueOf(ctx.loopType.getText().toUpperCase());
         String loopExpressionString = ctx.loopExpression.expr.getText();
-        Term loopExpression = getExpressionTerm(loopExpressionString);
+        Term loopExpression =  getExpressionTerm(loopExpressionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultArrayField(null, type, name, loopType, loopExpression, params);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -170,7 +133,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         String checksumExpressionString = ctx.checksumExpression.expr.getText();
         Term checksumExpression = getExpressionTerm(checksumExpressionString);
         Field field = new DefaultChecksumField(null, type, name, checksumExpression);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -181,7 +144,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         String name = ctx.name.id.getText();
         String expected = ctx.expected.expr.getText();
         Field field = new DefaultConstField(null, type, name, expected);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -191,7 +154,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = ctx.name.id.getText();
         Field field = new DefaultDiscriminatorField(null, type, name);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -202,7 +165,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         String name = ctx.name.id.getText();
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultEnumField(null, type, name, params);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -211,10 +174,10 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterImplicitField(MSpecParser.ImplicitFieldContext ctx) {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String name = ctx.name.id.getText();
-        String serializeExpressionString = ctx.serializeExpression.expr.getText();
-        Term serializeExpression = getExpressionTerm(serializeExpressionString);
-        Field field = new DefaultImplicitField(null, type, name, serializeExpression);
-        if (parserContexts.peek() != null) {
+        String serializationExpressionString = ctx.serializationExpression.expr.getText();
+        Term serializationExpression = getExpressionTerm(serializationExpressionString);
+        Field field = new DefaultImplicitField(null, type, name, serializationExpression);
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -226,17 +189,17 @@ public class MessageFormatListener extends MSpecBaseListener {
         ManualArrayField.LoopType loopType = ManualArrayField.LoopType.valueOf(
             ctx.loopType.getText().toUpperCase());
         String loopExpressionString = ctx.loopExpression.expr.getText();
-        Term loopExpression = getExpressionTerm(loopExpressionString);
-        String parseExpressionString = ctx.parseExpression.expr.getText();
-        Term parseExpression = getExpressionTerm(parseExpressionString);
-        String serializeExpressionString = ctx.serializeExpression.expr.getText();
-        Term serializeExpression = getExpressionTerm(serializeExpressionString);
+        Term loopExpression =  getExpressionTerm(loopExpressionString);
+        String serializationExpressionString = ctx.serializationExpression.expr.getText();
+        Term serializationExpression = getExpressionTerm(serializationExpressionString);
+        String deserializationExpressionString = ctx.deserializationExpression.expr.getText();
+        Term deserializationExpression = getExpressionTerm(deserializationExpressionString);
         String lengthExpressionString = ctx.lengthExpression.expr.getText();
-        Term lengthExpression = getExpressionTerm(lengthExpressionString);
+        Term lengthExpression =  getExpressionTerm(lengthExpressionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
-        Field field = new DefaultManualArrayField(null, type, name, loopType, loopExpression,
-            parseExpression, serializeExpression, lengthExpression, params);
-        if (parserContexts.peek() != null) {
+        Field field = new DefaultManualArrayField(null, type, name, loopType, loopExpression, serializationExpression,
+            deserializationExpression, lengthExpression, params);
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -245,16 +208,16 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterManualField(MSpecParser.ManualFieldContext ctx) {
         TypeReference type = getTypeReference(ctx.type);
         String name = ctx.name.id.getText();
-        String parseExpressionString = ctx.parseExpression.expr.getText();
-        Term parseExpression = getExpressionTerm(parseExpressionString);
-        String serializeExpressionString = ctx.serializeExpression.expr.getText();
-        Term serializeExpression = getExpressionTerm(serializeExpressionString);
+        String serializationExpressionString = ctx.serializationExpression.expr.getText();
+        Term serializationExpression = getExpressionTerm(serializationExpressionString);
+        String deserializationExpressionString = ctx.deserializationExpression.expr.getText();
+        Term deserializationExpression = getExpressionTerm(deserializationExpressionString);
         String lengthExpressionString = ctx.lengthExpression.expr.getText();
-        Term lengthExpression = getExpressionTerm(lengthExpressionString);
+        Term lengthExpression =  getExpressionTerm(lengthExpressionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
-        Field field = new DefaultManualField(null, type, name, parseExpression, serializeExpression,
+        Field field = new DefaultManualField(null, type, name, serializationExpression, deserializationExpression,
             lengthExpression, params);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -267,7 +230,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         Term conditionExpression = getExpressionTerm(conditionExpressionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultOptionalField(null, type, name, conditionExpression, params);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -282,7 +245,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         Term paddingCondition = getExpressionTerm(paddingConditionString);
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultPaddingField(null, type, name, paddingValue, paddingCondition, params);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -292,7 +255,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         SimpleTypeReference type = getSimpleTypeReference(ctx.type);
         String expected = ctx.expected.expr.getText();
         Field field = new DefaultReservedField(null, type, expected);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -303,7 +266,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         String name = ctx.name.id.getText();
         Term[] params = getFieldParams((MSpecParser.FieldDefinitionContext) ctx.parent.parent);
         Field field = new DefaultSimpleField(null, type, name, params);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -312,11 +275,11 @@ public class MessageFormatListener extends MSpecBaseListener {
     public void enterTypeSwitchField(MSpecParser.TypeSwitchFieldContext ctx) {
         int numDiscriminators = ctx.discriminators.expression().size();
         String[] discriminatorNames = new String[numDiscriminators];
-        for (int i = 0; i < numDiscriminators; i++) {
+        for(int i = 0; i < numDiscriminators; i++) {
             discriminatorNames[i] = ctx.discriminators.expression().get(i).expr.getText();
         }
         DefaultSwitchField field = new DefaultSwitchField(discriminatorNames);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -328,7 +291,7 @@ public class MessageFormatListener extends MSpecBaseListener {
         String valueExpressionString = ctx.valueExpression.expr.getText();
         Term valueExpression = getExpressionTerm(valueExpressionString);
         Field field = new DefaultVirtualField(null, type, name, valueExpression);
-        if (parserContexts.peek() != null) {
+        if(parserContexts.peek() != null) {
             parserContexts.peek().add(field);
         }
     }
@@ -344,26 +307,17 @@ public class MessageFormatListener extends MSpecBaseListener {
         String typeName = ctx.name.getText();
         List<Argument> parserArguments = new LinkedList<>();
         // Add all the arguments from the parent type.
-        if(ctx.parent.parent.parent.parent instanceof MSpecParser.ComplexTypeContext) {
-            if (((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params != null) {
-                parserArguments.addAll(Arrays.asList(getParserArguments(
-                    ((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params.argument())));
-            }
-        }
-        // For dataIo there is one level less to navigate.
-        else {
-            if (((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent).params != null) {
-                parserArguments.addAll(Arrays.asList(getParserArguments(
-                    ((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent).params.argument())));
-            }
+        if(((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params != null) {
+            parserArguments.addAll(Arrays.asList(getParserArguments(
+                ((MSpecParser.ComplexTypeContext) ctx.parent.parent.parent.parent).params.argument())));
         }
         // Add all eventually existing local arguments.
-        if (ctx.argumentList() != null) {
+        if(ctx.argumentList() != null) {
             parserArguments.addAll(Arrays.asList(getParserArguments(ctx.argumentList().argument())));
         }
 
         String[] discriminatorValues;
-        if (ctx.discriminatorValues != null) {
+        if(ctx.discriminatorValues != null) {
             List<MSpecParser.ExpressionContext> expressions = ctx.discriminatorValues.expression();
             discriminatorValues = new String[expressions.size()];
             for (int i = 0; i < expressions.size(); i++) {
@@ -378,7 +332,7 @@ public class MessageFormatListener extends MSpecBaseListener {
 
         // Add the type to the switch field definition.
         DefaultSwitchField switchField = getSwitchField();
-        if (switchField == null) {
+        if(switchField == null) {
             throw new RuntimeException("This shouldn't have happened");
         }
         switchField.addCase(type);
@@ -392,12 +346,12 @@ public class MessageFormatListener extends MSpecBaseListener {
         String value = unquoteString(ctx.valueExpression.getText());
         String name = ctx.name.getText();
         Map<String, String> constants = null;
-        if (ctx.constantValueExpressions != null) {
+        if(ctx.constantValueExpressions != null) {
             MSpecParser.ComplexTypeContext parentCtx = (MSpecParser.ComplexTypeContext) ctx.parent;
             int numConstantValues = parentCtx.params.argument().size();
             int numExpressionValues = ctx.constantValueExpressions.expression().size();
             // This only works if we provide exactly the same number of expressions as we defined constants
-            if (numConstantValues != numExpressionValues) {
+            if(numConstantValues != numExpressionValues) {
                 throw new RuntimeException("Number of constant value expressions doesn't match the number of " +
                     "defined constants. Expecting " + numConstantValues + " but got " + numExpressionValues);
             }
@@ -428,8 +382,15 @@ public class MessageFormatListener extends MSpecBaseListener {
     }
 
     private TypeReference getTypeReference(MSpecParser.TypeReferenceContext ctx) {
-        if (ctx.simpleTypeReference != null) {
-            return getSimpleTypeReference (ctx.simpleTypeReference);
+        if(ctx.simpleTypeReference != null) {
+            SimpleTypeReference.SimpleBaseType simpleBaseType = SimpleTypeReference.SimpleBaseType.valueOf(
+                ctx.simpleTypeReference.base.getText().toUpperCase());
+            if(ctx.simpleTypeReference.size != null) {
+                int size = Integer.parseInt(ctx.simpleTypeReference.size.getText());
+                return new DefaultSimpleTypeReference(simpleBaseType, size);
+            } else {
+                return new DefaultSimpleTypeReference(simpleBaseType, 1);
+            }
         } else {
             return new DefaultComplexTypeReference(ctx.complexTypeReference.getText());
         }
@@ -438,37 +399,17 @@ public class MessageFormatListener extends MSpecBaseListener {
     private SimpleTypeReference getSimpleTypeReference(MSpecParser.DataTypeContext ctx) {
         SimpleTypeReference.SimpleBaseType simpleBaseType =
             SimpleTypeReference.SimpleBaseType.valueOf(ctx.base.getText().toUpperCase());
-        // String types need an additional "encoding" field.
-        if ((ctx.size != null) && (ctx.encoding != null)) {
-            int size = Integer.parseInt(ctx.size.getText());
-            String encoding = ctx.encoding.getText();
-            return new DefaultStringTypeReference(simpleBaseType, size, encoding);
-        }
-        // If a size it specified its a simple integer length based type.
-        if (ctx.size != null) {
+        if(ctx.size != null) {
             int size = Integer.parseInt(ctx.size.getText());
-            return new DefaultIntegerTypeReference(simpleBaseType, size);
-        }
-        // If exponent and mantissa are present, it's a floating point representation.
-        else if((ctx.exponent != null) && (ctx.mantissa != null)) {
-            int exponent = Integer.parseInt(ctx.exponent.getText());
-            int mantissa = Integer.parseInt(ctx.mantissa.getText());
-            return new DefaultFloatTypeReference(simpleBaseType, exponent, mantissa);
-        }
-        else if((simpleBaseType == SimpleTypeReference.SimpleBaseType.TIME) ||
-            (simpleBaseType == SimpleTypeReference.SimpleBaseType.DATE) ||
-            (simpleBaseType == SimpleTypeReference.SimpleBaseType.DATETIME)) {
-            return new DefaultTemporalTypeReference(simpleBaseType);
-        }
-        // In all other cases (bit) it's just assume it's length it 1.
-        else {
-            return new DefaultIntegerTypeReference(simpleBaseType, 1);
+            return new DefaultSimpleTypeReference(simpleBaseType, size);
+        } else {
+            return new DefaultSimpleTypeReference(simpleBaseType, 1);
         }
     }
 
     private DefaultSwitchField getSwitchField() {
         for (Field field : Objects.requireNonNull(parserContexts.peek())) {
-            if (field instanceof DefaultSwitchField) {
+            if(field instanceof DefaultSwitchField) {
                 return (DefaultSwitchField) field;
             }
         }
@@ -491,9 +432,9 @@ public class MessageFormatListener extends MSpecBaseListener {
 
     private Term[] getFieldParams(MSpecParser.FieldDefinitionContext parentCtx) {
         Term[] params = null;
-        if (parentCtx.params != null) {
+        if(parentCtx.params != null) {
             params = new Term[parentCtx.params.expression().size()];
-            for (int i = 0; i < parentCtx.params.expression().size(); i++) {
+            for(int i = 0; i < parentCtx.params.expression().size(); i++) {
                 params[i] = parseExpression(parentCtx.params.expression().get(i).expr.getText());
             }
         }
@@ -511,10 +452,18 @@ public class MessageFormatListener extends MSpecBaseListener {
     }
 
     private String unquoteString(String quotedString) {
-        if (quotedString != null && quotedString.length() > 2) {
+        if(quotedString != null && quotedString.length() > 2) {
             return quotedString.substring(1, quotedString.length() - 1);
         }
         return quotedString;
     }
 
+    public static void main(String[] args) {
+        //Term term = new ExpressionStringParser().parse(IOUtils.toInputStream("CAST(CAST(parameter,S7ParameterUserData).items(hurz)[0],S7ParameterUserDataItemCPUFunctions).cpuFunctionType", Charset.defaultCharset()));
+        //Term term = new ExpressionStringParser().parse(IOUtils.toInputStream("CAST(parameter,S7ParameterUserData).items(hurz)[0]", Charset.defaultCharset()));
+        Term term = new ExpressionStringParser().parse(IOUtils.toInputStream("payload.lengthInBytes+4", Charset.defaultCharset()));
+
+        System.out.println(term);
+    }
+
 }
diff --git a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
index cc6f9df..bdd99fb 100644
--- a/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
+++ b/build-utils/protocol-base-mspec/src/main/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParser.java
@@ -21,27 +21,30 @@ package org.apache.plc4x.plugins.codegenerator.language.mspec.parser;
 
 import org.antlr.v4.runtime.CharStreams;
 import org.antlr.v4.runtime.CommonTokenStream;
+import org.antlr.v4.runtime.tree.ParseTree;
 import org.antlr.v4.runtime.tree.ParseTreeWalker;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecLexer;
 import org.apache.plc4x.plugins.codegenerator.language.mspec.MSpecParser;
 import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
 
-import java.io.IOException;
 import java.io.InputStream;
 import java.util.Map;
 
 public class MessageFormatParser {
 
     public Map<String, TypeDefinition> parse(InputStream source) {
-        MSpecLexer lexer;
         try {
-            lexer = new MSpecLexer(CharStreams.fromStream(source));
-        } catch (IOException e) {
+            MSpecLexer lexer = new MSpecLexer(CharStreams.fromStream(source));
+            CommonTokenStream tokens = new CommonTokenStream(lexer);
+            MSpecParser parser = new MSpecParser(tokens);
+            ParseTree tree = parser.file();
+            ParseTreeWalker walker = new ParseTreeWalker();
+            MessageFormatListener listener = new MessageFormatListener();
+            walker.walk(listener, tree);
+            return listener.getTypes();
+        } catch (Exception e) {
             throw new RuntimeException(e);
         }
-        MessageFormatListener listener = new MessageFormatListener();
-        new ParseTreeWalker().walk(listener, new MSpecParser(new CommonTokenStream(lexer)).file());
-        return listener.getTypes();
     }
 
 }
diff --git a/build-utils/protocol-base-mspec/src/test/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParserTest.java b/build-utils/protocol-base-mspec/src/test/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParserTest.java
deleted file mode 100644
index d703b1f..0000000
--- a/build-utils/protocol-base-mspec/src/test/java/org/apache/plc4x/plugins/codegenerator/language/mspec/expression/ExpressionStringParserTest.java
+++ /dev/null
@@ -1,177 +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.plugins.codegenerator.language.mspec.expression;
-
-import org.apache.commons.io.IOUtils;
-import org.apache.plc4x.plugins.codegenerator.types.terms.*;
-import org.junit.jupiter.api.Test;
-
-import java.nio.charset.Charset;
-import java.util.List;
-import java.util.function.Consumer;
-
-import static org.hamcrest.MatcherAssert.assertThat;
-import static org.hamcrest.Matchers.*;
-
-class ExpressionStringParserTest {
-
-    ExpressionStringParser SUT = new ExpressionStringParser();
-
-    @Test
-    void parseSimple() {
-        Term term = SUT.parse(IOUtils.toInputStream("payload.lengthInBytes+4", Charset.defaultCharset()));
-        assertThat(term, not(nullValue()));
-        assertThat(term, instanceOf(BinaryTerm.class));
-        BinaryTerm binaryTerm = (BinaryTerm) term;
-        assertVariableLiteral(
-            binaryTerm.getA(),
-            "payload",
-            null,
-            lengthInBytesVariableLiteral -> assertVariableLiteral(
-                lengthInBytesVariableLiteral,
-                "lengthInBytes"
-            )
-        );
-        assertNumericLiteral(binaryTerm.getB(), 4L);
-        assertThat(binaryTerm.getOperation(), is("+"));
-    }
-
-
-    @Test
-    void parseDoubleCast() {
-        Term term = SUT.parse(IOUtils.toInputStream("CAST(CAST(parameter,S7ParameterUserData).items(hurz)[0],S7ParameterUserDataItemCPUFunctions).cpuFunctionType", Charset.defaultCharset()));
-        assertVariableLiteral(
-            term,
-            "CAST",
-            outerCast -> {
-                assertThat(outerCast, hasSize(2));
-                assertVariableLiteral(
-                    outerCast.get(0),
-                    "CAST",
-                    innerCast -> {
-                        assertThat(innerCast, hasSize(2));
-                        assertVariableLiteral(
-                            innerCast.get(0),
-                            "parameter"
-                        );
-                        assertVariableLiteral(
-                            innerCast.get(1),
-                            "S7ParameterUserData"
-                        );
-                    },
-                    items -> {
-                        assertVariableLiteral(
-                            items,
-                            "items",
-                            hurzes -> {
-                                assertThat(hurzes, hasSize(1));
-                                assertVariableLiteral(
-                                    hurzes.get(0),
-                                    "hurz"
-                                );
-                            },
-                            null,
-                            0
-                        );
-                    });
-                assertVariableLiteral(
-                    outerCast.get(1),
-                    "S7ParameterUserDataItemCPUFunctions"
-                );
-            },
-            variableLiteral -> {
-                assertVariableLiteral(
-                    variableLiteral,
-                    "cpuFunctionType"
-                );
-            }
-        );
-    }
-
-    @Test
-    void parseCast() {
-        Term term = SUT.parse(IOUtils.toInputStream("CAST(parameter,S7ParameterUserData).items(hurz)[0]", Charset.defaultCharset()));
-        assertVariableLiteral(
-            term,
-            "CAST",
-            terms -> {
-                assertThat(terms, hasSize(2));
-                assertVariableLiteral(
-                    terms.get(0),
-                    "parameter"
-                );
-                assertVariableLiteral(
-                    terms.get(1),
-                    "S7ParameterUserData"
-                );
-            },
-            variableLiteral -> {
-                assertVariableLiteral(
-                    variableLiteral,
-                    "items",
-                    terms -> {
-                        assertThat(terms, hasSize(1));
-                        assertVariableLiteral(
-                            terms.get(0),
-                            "hurz"
-                        );
-                    },
-                    null,
-                    0
-                );
-            }
-        );
-    }
-
-    void assertNumericLiteral(Term term, Number number) {
-        assertThat(term, not(nullValue()));
-        assertThat(term, instanceOf(NumericLiteral.class));
-        NumericLiteral numericLiteral = (NumericLiteral) term;
-        assertThat(numericLiteral.getNumber(), is(number));
-    }
-
-    void assertVariableLiteral(Term term, String name) {
-        assertVariableLiteral(term, name, null, null, -1);
-    }
-
-    void assertVariableLiteral(Term term, String name, Consumer<List<Term>> argsAsserter, Consumer<VariableLiteral> childAsserter) {
-        assertVariableLiteral(term, name, argsAsserter, childAsserter, -1);
-    }
-
-    void assertVariableLiteral(Term term, String name, Consumer<List<Term>> argsAsserter, Consumer<VariableLiteral> childAsserter, int index) {
-        assertThat(term, not(nullValue()));
-        assertThat(term, instanceOf(VariableLiteral.class));
-        VariableLiteral variableLiteral = (VariableLiteral) term;
-        assertThat(variableLiteral.getName(), is(name));
-        assertThat(variableLiteral.getIndex(), is(index));
-        if (argsAsserter != null) {
-            argsAsserter.accept(variableLiteral.getArgs());
-        } else {
-            assertThat(variableLiteral.getArgs(), nullValue());
-        }
-        if (childAsserter != null) {
-            childAsserter.accept(variableLiteral.getChild());
-        } else {
-            assertThat(variableLiteral.getChild(), nullValue());
-        }
-    }
-
-
-}
\ No newline at end of file
diff --git a/build-utils/protocol-base-mspec/src/test/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParserTest.java b/build-utils/protocol-base-mspec/src/test/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParserTest.java
deleted file mode 100644
index 127a2d2..0000000
--- a/build-utils/protocol-base-mspec/src/test/java/org/apache/plc4x/plugins/codegenerator/language/mspec/parser/MessageFormatParserTest.java
+++ /dev/null
@@ -1,43 +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.plugins.codegenerator.language.mspec.parser;
-
-import org.apache.plc4x.plugins.codegenerator.types.definitions.TypeDefinition;
-import org.junit.jupiter.api.Test;
-
-import java.util.Map;
-
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-class MessageFormatParserTest {
-
-    MessageFormatParser SUT = new MessageFormatParser();
-
-    @Test
-    void parseNull() {
-        assertThrows(NullPointerException.class, () -> SUT.parse(null));
-    }
-
-    @Test
-    void parseSomething() {
-        Map<String, TypeDefinition> parse = SUT.parse(getClass().getResourceAsStream("/mspec.example"));
-        System.out.println(parse);
-    }
-}
\ No newline at end of file
diff --git a/build-utils/protocol-base-mspec/src/test/resources/mspec.example b/build-utils/protocol-base-mspec/src/test/resources/mspec.example
deleted file mode 100644
index 9cb94d8..0000000
--- a/build-utils/protocol-base-mspec/src/test/resources/mspec.example
+++ /dev/null
@@ -1,358 +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.
- */
-
-////////////////////////////////////////////////////////////////
-// AMS/TCP Packet
-////////////////////////////////////////////////////////////////
-
-[type 'AmsTCPPacket'
-    // The ams - tcp to be sent.
-    [simple AmsTcpHeader 'amsTcpHeader']
-    // The AMS packet to be sent.
-    [simple AmsPacket    'userdata'    ]
-]
-
-// AMS/TCP Header	6 bytes	contains the tcpLength of the data packet.
-[type 'AmsTcpHeader'
-    // These bytes must be set to 0.
-    [reserved   uint       16       '0x0000' ]
-    // This array contains the length of the data packet.
-    // It consists of the AMS-Header and the enclosed ADS data. The unit is bytes.
-    [simple     uint       32       'length']
-]
-
-////////////////////////////////////////////////////////////////
-// AMS/Serial Packet
-////////////////////////////////////////////////////////////////
-
-/*
- * If an AMS serial frame has been received and the frame is OK (magic cookie OK, CRC OK, correct fragment number etc.),
- * then the receiver has to send an acknowledge frame, to inform the transmitter that the frame has arrived.
- *
- * @see <a href="https://infosys.beckhoff.com/content/1033/tcadsamsserialspec/html/tcamssericalspec_amsframe.htm?id=8115637053270715044">TwinCAT AMS via RS232 Specification</a>
- */
-[type 'AmsSerialAcknowledgeFrame'
-    // Id for detecting an AMS serial frame.
-    [simple     uint        16  'magicCookie'        ]
-    // Address of the sending participant. This value can always be set to 0 for an RS232 communication,
-    // since it is a 1 to 1 connection and hence the participants are unique.
-    [simple     int          8  'transmitterAddress' ]
-    // Receiverā€™s address. This value can always be set to 0 for an RS232 communication, since it is a 1 to 1
-    // connection and hence the participants are unique.
-    [simple     int          8  'receiverAddress'    ]
-    // Number of the frame sent. Once the number 255 has been sent, it starts again from 0. The receiver checks this
-    // number with an internal counter.
-    [simple     int          8  'fragmentNumber'     ]
-    // The max. length of the AMS packet to be sent is 255. If larger AMS packets are to be sent then they have to be
-    // fragmented (not published at the moment).
-    [simple     int          8  'length'     ]
-    [simple     uint        16  'crc'                ]
-]
-
-/*
- * An AMS packet can be transferred via RS232 with the help of an AMS serial frame.
- * The actual AMS packet is in the user data field of the frame.
- * The max. length of the AMS packet is limited to 255 bytes.
- * Therefore the max. size of an AMS serial frame is 263 bytes.
- * The fragment number is compared with an internal counter by the receiver.
- * The frame number is simply accepted and not checked when receiving the first AMS frame or in case a timeout is
- * exceeded. The CRC16 algorithm is used for calculating the checksum.
- * @see <a href="https://infosys.beckhoff.com/content/1033/tcadsamsserialspec/html/tcamssericalspec_amsframe.htm?id=8115637053270715044">TwinCAT AMS via RS232 Specification</a>
- */
-[type 'AmsSerialFrame'
-    // Id for detecting an AMS serial frame.
-    [simple     uint        16  'magicCookie'        ]
-    // Address of the sending participant. This value can always be set to 0 for an RS232 communication,
-    // since it is a 1 to 1 connection and hence the participants are unique.
-    [simple     int          8  'transmitterAddress' ]
-    // Receiverā€™s address. This value can always be set to 0 for an RS232 communication, since it is a 1 to 1
-    // connection and hence the participants are unique.
-    [simple     int          8  'receiverAddress'    ]
-    // Number of the frame sent. Once the number 255 has been sent, it starts again from 0. The receiver checks this
-    // number with an internal counter.
-    [simple     int          8  'fragmentNumber'     ]
-    // The max. length of the AMS packet to be sent is 255. If larger AMS packets are to be sent then they have to be
-    // fragmented (not published at the moment).
-    [simple     int          8  'length'     ]
-    // The AMS packet to be sent.
-    [simple AmsPacket           'userdata'           ]
-    [simple     uint        16  'crc'                ]
-]
-
-/*
- * In case the transmitter does not receive a valid acknowledgement after multiple transmission, then a reset frame is
- * sent. In this way the receiver is informed that a new communication is running and the receiver then accepts the
- * fragment number during the next AMS-Frame, without carrying out a check.
- */
-[type 'AmsSerialResetFrame'
-    // Id for detecting an AMS serial frame.
-    [simple     uint        16  'magicCookie'        ]
-    // Address of the sending participant. This value can always be set to 0 for an RS232 communication,
-    // since it is a 1 to 1 connection and hence the participants are unique.
-    [simple     int          8  'transmitterAddress' ]
-    // Receiverā€™s address. This value can always be set to 0 for an RS232 communication, since it is a 1 to 1
-    // connection and hence the participants are unique.
-    [simple     int          8  'receiverAddress'    ]
-    // Number of the frame sent. Once the number 255 has been sent, it starts again from 0. The receiver checks this
-    // number with an internal counter.
-    [simple     int          8  'fragmentNumber'     ]
-    // The max. length of the AMS packet to be sent is 255. If larger AMS packets are to be sent then they have to be
-    // fragmented (not published at the moment).
-    [simple     int          8  'length'     ]
-    [simple     uint        16  'crc'                ]
-]
-
-////////////////////////////////////////////////////////////////
-// AMS Common
-////////////////////////////////////////////////////////////////
-
-[type 'AmsPacket'
-    [simple     AmsHeader  'amsHeader'                                                            ]
-    [simple     ADSData    'data'   ['amsHeader.commandId', 'amsHeader.state.response']              ]
-]
-
-// AMS Header	32 bytes	The AMS/TCP-Header contains the addresses of the transmitter and receiver. In addition the AMS error code , the ADS command Id and some other information.
-[type 'AmsHeader'
-    // This is the AmsNetId of the station, for which the packet is intended. Remarks see below.
-    [simple     AmsNetId        'targetAmsNetId'                            ]
-    // This is the AmsPort of the station, for which the packet is intended.
-    [simple     uint        16  'targetAmsPort'                             ]
-    // This contains the AmsNetId of the station, from which the packet was sent.
-    [simple     AmsNetId        'sourceAmsNetId'                            ]
-    // This contains the AmsPort of the station, from which the packet was sent.
-    [simple     uint        16  'sourceAmsPort'                             ]
-    // 2 bytes.
-    [enum       CommandId       'commandId'                                 ]
-    // 2 bytes.
-    [simple     State           'state'                                     ]
-    // 4 bytes	Size of the data range. The unit is byte.
-    [simple     uint        32  'length'                                ]
-    // 4 bytes	AMS error number. See ADS Return Codes.
-    [simple     uint        32  'errorCode'                                 ]
-    // free usable field of 4 bytes
-    // 4 bytes	Free usable 32 bit array. Usually this array serves to send an Id. This Id makes is possible to assign a received response to a request, which was sent before.
-    [simple      uint        32  'invokeId'                                 ]
-]
-
-[enum uint 16 'CommandId'
-    ['0x00' INVALID]
-    ['0x01' ADS_READ_DEVICE_INFO]
-    ['0x02' ADS_READ]
-    ['0x03' ADS_WRITE]
-    ['0x04' ADS_READ_STATE]
-    ['0x05' ADS_WRITE_CONTROL]
-    ['0x06' ADS_ADD_DEVICE_NOTIFICATION]
-    ['0x07' ADS_DELETE_DEVICE_NOTIFICATION]
-    ['0x08' ADS_DEVICE_NOTIFICATION]
-    ['0x09' ADS_READ_WRITE]
-]
-
-[type 'State'
-    [simple     bit 'broadcast'             ]
-    [reserved   int 7 '0x0'                 ]
-    [simple     bit 'initCommand'           ]
-    [simple     bit 'updCommand'            ]
-    [simple     bit 'timestampAdded'        ]
-    [simple     bit 'highPriorityCommand'   ]
-    [simple     bit 'systemCommand'         ]
-    [simple     bit 'adsCommand'            ]
-    [simple     bit 'noReturn'              ]
-    [simple     bit 'response'              ]
-]
-
-/*
- * It is not only possible to exchange data between TwinCAT modules on one PC, it is even possible to do so by ADS
- * methods between multiple TwinCAT PC's on the network.
- * <p>
- * Every PC on the network can be uniquely identified by a TCP/IP address, such as "172.1.2.16". The AdsAmsNetId is an
- * extension of the TCP/IP address and identifies a TwinCAT message router, e.g. "172.1.2.16.1.1". TwinCAT message
- * routers exist on every TwinCAT PC, and on every Beckhoff BCxxxx bus controller (e.g. BC3100, BC8100, BC9000, ...).
- * <p>
- * The AmsNetId consists of 6 bytes and addresses the transmitter or receiver. One possible AmsNetId would be e.g.
- * "172.16.17.10.1.1". The storage arrangement in this example is as follows:
- * <p>
- * _____0     1     2     3     4     5
- * __+-----------------------------------+
- * 0 | 127 |  16 |  17 |  10 |   1 |   1 |
- * __+-----------------------------------+
- * <p>
- * The AmsNetId is purely logical and has usually no relation to the IP address. The AmsNetId is configured at the
- * target system. At the PC for this the TwinCAT System Control is used. If you use other hardware, see the considering
- * documentation for notes about settings of the AMS NetId.
- * @see <a href="https://infosys.beckhoff.com/content/1033/tcadscommon/html/tcadscommon_identadsdevice.htm?id=3991659524769593444">ADS device identification</a>
- */
-[type 'AmsNetId'
-    [simple     uint        8   'octet1'            ]
-    [simple     uint        8   'octet2'            ]
-    [simple     uint        8   'octet3'            ]
-    [simple     uint        8   'octet4'            ]
-    [simple     uint        8   'octet5'            ]
-    [simple     uint        8   'octet6'            ]
-]
-
-[discriminatedType 'ADSData' [CommandId 'commandId', bit 'response']
-    [typeSwitch 'commandId', 'response'
-        ['CommandId.INVALID', 'true' AdsInvalidResponse]
-        ['CommandId.INVALID', 'false' AdsInvalidRequest]
-        ['CommandId.ADS_READ_DEVICE_INFO', 'true' AdsReadDeviceInfoResponse
-            // 4 bytes	ADS error number.
-            [simple uint 32 'result']
-            // Version	1 byte	Major version number
-            [simple uint 8  'majorVersion']
-            // Version	1 byte	Minor version number
-            [simple uint 8  'minorVersion']
-            // Build	2 bytes	Build number
-            [simple uint 16  'version']
-            // Name	16 bytes	Name of ADS device
-            [array int 8  'device' count '16']
-        ]
-        ['CommandId.ADS_READ_DEVICE_INFO', 'false' AdsReadDeviceInfoRequest]
-        ['CommandId.ADS_READ', 'true' AdsReadResponse
-            // 4 bytes	ADS error number
-            [simple uint 32 'result']
-            // 4 bytes	Length of data which are supplied back.
-            [simple uint 32 'length']
-            // n bytes	Data which are supplied back.
-            [array int 8 'data' count 'length']
-        ]
-        ['CommandId.ADS_READ', 'false' AdsReadRequest
-            // 4 bytes	Index Group of the data which should be read.
-            [simple uint 32 'indexGroup']
-            // 4 bytes	Index Offset of the data which should be read.
-            [simple uint 32 'indexOffset']
-            // 4 bytes	Length of the data (in bytes) which should be read.
-            [simple uint 32 'length']
-        ]
-        ['CommandId.ADS_WRITE', 'true' AdsWriteResponse
-            // 4 bytes	ADS error number
-            [simple uint 32 'result']
-        ]
-        ['CommandId.ADS_WRITE', 'false' AdsWriteRequest
-            // 4 bytes	Index Group of the data which should be written.
-            [simple uint 32 'indexGroup']
-            // 4 bytes	Index Offset of the data which should be written.
-            [simple uint 32 'indexOffset']
-            // 4 bytes	Length of the data (in bytes) which should be written.
-            [simple uint 32 'length']
-            // n bytes	Data which are written in the ADS device.
-            [array int 8 'data' count 'length']
-        ]
-        ['CommandId.ADS_READ_STATE', 'true' AdsReadStateResponse
-            // 4 bytes	ADS error number
-            [simple uint 32 'result']
-            // 2 bytes	New ADS status (see data type ADSSTATE of the ADS-DLL).
-            [simple uint 16 'adsState']
-            // 2 bytes	New device status.
-            [simple uint 16 'deviceState']
-        ]
-        ['CommandId.ADS_READ_STATE', 'false' AdsReadStateRequest]
-        ['CommandId.ADS_WRITE_CONTROL', 'true' AdsWriteControlResponse
-            // 4 bytes	ADS error number
-            [simple uint 32 'result']
-        ]
-        ['CommandId.ADS_WRITE_CONTROL', 'false' AdsWriteControlRequest
-            // 2 bytes	New ADS status (see data type ADSSTATE of the ADS-DLL).
-            [simple uint 16 'adsState']
-            // 2 bytes	New device status.
-            [simple uint 16 'deviceState']
-            // 4 bytes	Length of data in byte.
-            [simple uint 32 'length']
-            // n bytes	Additional data which are sent to the ADS device
-            [array int 8 'data' count 'length']
-        ]
-        ['CommandId.ADS_ADD_DEVICE_NOTIFICATION', 'true' AdsAddDeviceNotificationResponse
-            // 4 bytes	ADS error number
-            [simple uint 32 'result']
-            // 4 bytes	Handle of notification
-            [simple uint 32 'notificationHandle']
-        ]
-        ['CommandId.ADS_ADD_DEVICE_NOTIFICATION', 'false' AdsAddDeviceNotificationRequest
-            // 4 bytes	Index Group of the data, which should be sent per notification.
-            [simple uint 32 'indexGroup']
-            // 4 bytes	Index Offset of the data, which should be sent per notification.
-            [simple uint 32 'indexOffset']
-            // 4 bytes	Index Offset of the data, which should be sent per notification.
-            // 4 bytes	Length of data in bytes, which should be sent per notification.
-            [simple uint 32 'length']
-            // 4 bytes	See description of the structure ADSTRANSMODE at the ADS-DLL.
-            [simple uint 32 'transmissionMode']
-            // 4 bytes	At the latest after this time, the ADS Device Notification is called. The unit is 1ms.
-            [simple uint 32 'maxDelay']
-            // 4 bytes	The ADS server checks if the value changes in this time slice. The unit is 1ms
-            [simple uint 32 'cycleTime']
-            // 16bytes	Must be set to 0
-            [reserved   uint       128       '0x0000' ]
-        ]
-        ['CommandId.ADS_DELETE_DEVICE_NOTIFICATION', 'true' AdsDeleteDeviceNotificationResponse
-            // 4 bytes	ADS error number
-            [simple uint 32 'result']
-        ]
-        ['CommandId.ADS_DELETE_DEVICE_NOTIFICATION', 'false' AdsDeleteDeviceNotificationRequest
-            // 4 bytes	Handle of notification
-            [simple uint 32 'notificationHandle']
-        ]
-        ['CommandId.ADS_DEVICE_NOTIFICATION', 'true' AdsDeviceNotificationResponse]
-        ['CommandId.ADS_DEVICE_NOTIFICATION', 'false' AdsDeviceNotificationRequest
-            // 4 bytes	Size of data in byte.
-            [simple uint 32 'length']
-            // 4 bytes	Number of elements of type AdsStampHeader.
-            [simple uint 32 'stamps']
-            // n bytes	Array with elements of type AdsStampHeader.
-            [array AdsStampHeader 'adsStampHeaders' count 'stamps']
-        ]
-        ['CommandId.ADS_READ_WRITE', 'true' AdsReadWriteResponse
-            // 4 bytes	ADS error number
-            [simple uint 32 'result']
-            // 4 bytes	Length of data in byte.
-            [simple uint 32 'length']
-            // n bytes	Additional data which are sent to the ADS device
-            [array int 8 'data' count 'length']
-        ]
-        ['CommandId.ADS_READ_WRITE', 'false' AdsReadWriteRequest
-            // 4 bytes	Index Group of the data which should be written.
-            [simple uint 32 'indexGroup']
-            // 4 bytes	Index Offset of the data which should be written.
-            [simple uint 32 'indexOffset']
-            // 4 bytes	Length of data in bytes, which should be read.
-            [simple uint 32 'readLength']
-            // 4 bytes	Length of the data (in bytes) which should be written.
-            [simple uint 32 'writeLength']
-            // n bytes	Data which are written in the ADS device.
-            [array int 8 'data' count 'writeLength']
-        ]
-    ]
-]
-
-[type 'AdsStampHeader'
-    // 8 bytes	The timestamp is coded after the Windows FILETIME format. I.e. the value contains the number of the nano seconds, which passed since 1.1.1601. In addition, the local time change is not considered. Thus the time stamp is present as universal Coordinated time (UTC).
-    [simple uint 64 'timestamp']
-    // 4 bytes	Number of elements of type AdsNotificationSample.
-    [simple uint 32 'samples']
-    // n bytes	Array with elements of type AdsNotificationSample.
-    [array AdsNotificationSample 'adsNotificationSamples' count 'samples']
-]
-
-[type 'AdsNotificationSample'
-    // 4 bytes	Handle of notification
-    [simple uint 32 'notificationHandle']
-    // 4 Bytes	Size of data range in bytes.
-    [simple uint 32 'sampleSize']
-    // n Bytes	Data
-    [array int 8 'data' count 'sampleSize']
-]
\ No newline at end of file
diff --git a/build-utils/protocol-test/pom.xml b/build-utils/protocol-test/pom.xml
index cb45b5a..a21801a 100644
--- a/build-utils/protocol-test/pom.xml
+++ b/build-utils/protocol-test/pom.xml
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x</groupId>
     <artifactId>plc4x-build-utils</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
+    <version>0.6.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4x-build-utils-protocol-test</artifactId>
@@ -71,13 +71,13 @@
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4x-build-utils-protocol-base-mspec</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
+      <version>0.6.0-SNAPSHOT</version>
     </dependency>
 
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4x-build-utils-language-java</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
+      <version>0.6.0-SNAPSHOT</version>
       <!-- Scope is 'provided' as this way it's not shipped with the driver -->
       <scope>provided</scope>
     </dependency>
diff --git a/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec b/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec
index 325b2a7..1b9713f 100644
--- a/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec
+++ b/build-utils/protocol-test/src/main/resources/protocols/test/test.mspec
@@ -27,7 +27,7 @@
     [array         uint 8 'arrTerm'       terminated                'terminationExpression']
     [checksum      uint 8 'crc'           'checksumExpression']
     [const         uint 8 'con'           '0x03']
-    [implicit      uint 8 'impl'          'serializeExpression']
+    [implicit      uint 8 'impl'          'serializationExpression']
     [manualArray   uint 8 'manArrayCount' count                     'loopExpression'            'serializationExpression' 'deserializationExpression' 'lengthExpression']
     [manualArray   uint 8 'manArrayLen'   length                    'loopExpression'            'serializationExpression' 'deserializationExpression' 'lengthExpression']
     [manualArray   uint 8 'manArrayTerm'  terminated                'loopExpression'            'serializationExpression' 'deserializationExpression' 'lengthExpression']
diff --git a/jenkins.pom b/jenkins.pom
index 3fa5bdb..8fd4a3e 100644
--- a/jenkins.pom
+++ b/jenkins.pom
@@ -26,7 +26,7 @@
     <parent>
         <groupId>org.apache</groupId>
         <artifactId>apache</artifactId>
-        <version>22</version>
+        <version>21</version>
     </parent>
 
     <groupId>org.apache.plc4x</groupId>
@@ -82,22 +82,6 @@
                         </configuration>
                     </plugin>
                 </plugins>
-                <pluginManagement>
-                    <plugins>
-                        <plugin>
-                            <groupId>org.apache.maven.plugins</groupId>
-                            <artifactId>maven-scm-publish-plugin</artifactId>
-                            <version>3.0.0</version>
-                            <dependencies>
-                                <dependency>
-                                    <groupId>org.apache.maven.scm</groupId>
-                                    <artifactId>maven-scm-provider-gitexe</artifactId>
-                                    <version>1.10.0</version>
-                                </dependency>
-                            </dependencies>
-                        </plugin>
-                    </plugins>
-                </pluginManagement>
             </build>
         </profile>
     </profiles>
diff --git a/plc4j/api/pom.xml b/plc4j/api/pom.xml
index 3106c62..83195fd 100644
--- a/plc4j/api/pom.xml
+++ b/plc4j/api/pom.xml
@@ -1,22 +1,22 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  ~ Licensed to the Apache Software Foundation (ASF) under one
-  ~ or more contributor license agreements.  See the NOTICE file
-  ~ distributed with this work for additional information
-  ~ regarding copyright ownership.  The ASF licenses this file
-  ~ to you under the Apache License, Version 2.0 (the
-  ~ "License"); you may not use this file except in compliance
-  ~ with the License.  You may obtain a copy of the License at
-  ~
-  ~   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.
-  -->
+
+  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.
+
+-->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 
   <modelVersion>4.0.0</modelVersion>
@@ -24,7 +24,7 @@
   <parent>
     <groupId>org.apache.plc4x</groupId>
     <artifactId>plc4j</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
+    <version>0.6.0-SNAPSHOT</version>
   </parent>
 
   <artifactId>plc4j-api</artifactId>
@@ -33,8 +33,10 @@
 
   <dependencies>
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-utils-test-utils</artifactId>
+      <version>0.6.0-SNAPSHOT</version>
+      <scope>test</scope>
     </dependency>
 
     <dependency>
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java b/plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
index 608f639..fb6b09a 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
@@ -1,28 +1,27 @@
 /*
- * 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.
- */
+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.java;
 
-import org.apache.plc4x.java.api.Experimental;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.PlcDriver;
+import org.apache.plc4x.java.spi.PlcDriver;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -70,7 +69,7 @@ public class PlcDriverManager {
      */
     public PlcConnection getConnection(String url) throws PlcConnectionException {
         PlcDriver driver = getDriver(url);
-        PlcConnection connection = driver.getConnection(url);
+        PlcConnection connection = driver.connect(url);
         connection.connect();
         return connection;
     }
@@ -85,19 +84,12 @@ public class PlcDriverManager {
      */
     public PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException {
         PlcDriver driver = getDriver(url);
-        PlcConnection connection = driver.getConnection(url, authentication);
+        PlcConnection connection = driver.connect(url, authentication);
         connection.connect();
         return connection;
     }
 
-    /**
-     * Returns suitble driver for protocol or throws an Exception.
-     * @param url Uri to use
-     * @return Driver instance for the given protocol
-     * @throws PlcConnectionException If no Suitable Driver can be found
-     */
-    @Experimental
-    public PlcDriver getDriver(String url) throws PlcConnectionException {
+    private PlcDriver getDriver(String url) throws PlcConnectionException {
         try {
             URI connectionUri = new URI(url);
             String protocol = connectionUri.getScheme();
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/Experimental.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/Experimental.java
deleted file mode 100644
index 8d2d8d3..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/Experimental.java
+++ /dev/null
@@ -1,26 +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.java.api;
-
-/**
- * Indicates that this is a recent API Change.
- */
-public @interface Experimental {
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
index 9ce9425..3838594 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnection.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api;
 
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
@@ -62,7 +62,6 @@ public interface PlcConnection extends AutoCloseable {
      *
      * @throws PlcRuntimeException If the string cannot be parsed
      */
-    @Deprecated
     default PlcField prepareField(String fieldQuery) throws PlcInvalidFieldException {
         throw new PlcRuntimeException("Parse method is not implemented for this connection / driver");
     }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionExtension.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionExtension.java
deleted file mode 100644
index 208a155..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcConnectionExtension.java
+++ /dev/null
@@ -1,82 +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.java.api;
-
-import org.apache.commons.lang3.NotImplementedException;
-
-import java.util.concurrent.Future;
-
-/**
- * Suggestion for new API
- */
-@Experimental
-public interface PlcConnectionExtension {
-
-    /**
-     * <code>
-     *     "%DB400.xxx"
-     * </code>
-     * <code>
-     *     ["%DB400.xxx", ""]
-     * </code>
-     * <code>
-     *     { "item1": "%DB400.xxx", "item2": "xx" }
-     * </code>
-     * Prepared Statement
-     * <code>
-     *     { "item1": ?, "item2": ? }
-     * </code>
-     *
-     * @param s
-     * @return
-     */
-    @Experimental
-    default Future<NewPlcResponse> query(String s, Object... args) {
-        throw new NotImplementedException("Not implemented");
-    }
-
-    /**
-     * <code>
-     *     define { "item1": "%DB400.xxx", "item2": "xx" } AS my_pymƩl_struct
-     * </code>
-     * <code>
-     *     define %DN4ƟƟ" AS "my_structure"
-     * </code>
-     * @param pql
-     * @return
-     */
-    @Experimental
-    default Future<Boolean> execute(String pql) {
-        throw new NotImplementedException("Not implemented");
-    }
-
-    /**
-     * Planned successor for
-     * {@link org.apache.plc4x.java.api.messages.PlcResponse}
-     * {@link org.apache.plc4x.java.api.messages.PlcReadResponse}
-     * {@link org.apache.plc4x.java.api.messages.PlcWriteResponse}
-     * {@link org.apache.plc4x.java.api.messages.PlcSubscriptionResponse}
-     * {@link org.apache.plc4x.java.api.messages.PlcUnsubscriptionResponse}
-     */
-    @Experimental
-    interface NewPlcResponse {
-
-    }
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java
deleted file mode 100644
index 9fda101..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/PlcDriver.java
+++ /dev/null
@@ -1,60 +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.java.api;
-
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-
-/**
- * General interface defining the minimal methods required for adding a new type of driver to the PLC4J system.
- *
- * <b>Note that each driver has to add a service file called org.apache.plc4x.java.spi.PlcDriver to
- * src/main/resources/META-INF which contains the fully qualified classname in order to get loaded
- * by the PlcDriverManager instances.</b>
- */
-public interface PlcDriver {
-
-    /**
-     * @return code of the implemented protocol. This is usually a lot shorter than the String returned by @seeĀ #getProtocolName().
-     */
-    String getProtocolCode();
-
-    /**
-     * @return name of the implemented protocol.
-     */
-    String getProtocolName();
-
-    /**
-     * Connects to a PLC using the given plc connection string.
-     * @param url plc connection string.
-     * @return PlcConnection object.
-     * @throws PlcConnectionException an exception if the connection attempt failed.
-     */
-    PlcConnection getConnection(String url) throws PlcConnectionException;
-
-    /**
-     * Connects to a PLC using the given plc connection string using given authentication credentials.
-     * @param url plc connection string.
-     * @param authentication authentication credentials.
-     * @return PlcConnection object.
-     * @throws PlcConnectionException an exception if the connection attempt failed.
-     */
-    PlcConnection getConnection(String url, PlcAuthentication authentication) throws PlcConnectionException;
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcAuthentication.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcAuthentication.java
index fdd90df..1008954 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcAuthentication.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcAuthentication.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.authentication;
 
 public interface PlcAuthentication {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthentication.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthentication.java
index b793d21..a02b24e 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthentication.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthentication.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.authentication;
 
 import java.util.Objects;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcConnectionException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcConnectionException.java
index 202f17b..db627b2 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcConnectionException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcConnectionException.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.exceptions;
 
 public class PlcConnectionException extends PlcException {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcException.java
index 551a850..6f4bd4c 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcException.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.exceptions;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcFieldRangeException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcFieldRangeException.java
index f3908f4..1d7fc8d 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcFieldRangeException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcFieldRangeException.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.exceptions;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIncompatibleDatatypeException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIncompatibleDatatypeException.java
index 64ee10d..cb779df 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIncompatibleDatatypeException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIncompatibleDatatypeException.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.exceptions;
@@ -25,11 +25,4 @@ public class PlcIncompatibleDatatypeException extends PlcRuntimeException {
         super("Incompatible Datatype " + datatype.getName() + " at index " + index);
     }
 
-    public PlcIncompatibleDatatypeException(Class<?> datatype) {
-        super("Incompatible Datatype " + datatype.getName());
-    }
-
-    public PlcIncompatibleDatatypeException(String message) {
-        super(message);
-    }
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
index 637c9ee..5eba89a 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.exceptions;
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIoException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIoException.java
index c7d8adc..1c3b17b 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIoException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcIoException.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.exceptions;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcNotImplementedException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcNotImplementedException.java
index acd516b..1eea2b0 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcNotImplementedException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcNotImplementedException.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.exceptions;
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolException.java
index 4d8ff5c..9dee077 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolException.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.exceptions;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolPayloadTooBigException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolPayloadTooBigException.java
index ba291af..a8878db 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolPayloadTooBigException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolPayloadTooBigException.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.exceptions;
 
 public class PlcProtocolPayloadTooBigException extends PlcProtocolException {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolTimeoutException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolTimeoutException.java
deleted file mode 100644
index 193e97f..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcProtocolTimeoutException.java
+++ /dev/null
@@ -1,39 +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.java.api.exceptions;
-
-public class PlcProtocolTimeoutException extends PlcProtocolException {
-
-    public PlcProtocolTimeoutException(String message) {
-        super(message);
-    }
-
-    public PlcProtocolTimeoutException(String message, Throwable cause) {
-        super(message, cause);
-    }
-
-    public PlcProtocolTimeoutException(Throwable cause) {
-        super(cause);
-    }
-
-    public PlcProtocolTimeoutException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
-        super(message, cause, enableSuppression, writableStackTrace);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcRuntimeException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcRuntimeException.java
index b2dfc72..372d70f 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcRuntimeException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcRuntimeException.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.exceptions;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcTimeoutException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcTimeoutException.java
index ed83dd5..ddba534 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcTimeoutException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcTimeoutException.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.exceptions;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedDataTypeException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedDataTypeException.java
index c79fc23..54ca86b 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedDataTypeException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedDataTypeException.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.exceptions;
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedOperationException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedOperationException.java
index 6f1b824..3efa838 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedOperationException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedOperationException.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.exceptions;
 
 public class PlcUnsupportedOperationException extends PlcRuntimeException {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedProtocolException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedProtocolException.java
index 2ec7db9..f897d75 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedProtocolException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcUnsupportedProtocolException.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.exceptions;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldRequest.java
index 8833e05..2ef86cc 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldRequest.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import org.apache.plc4x.java.api.model.PlcField;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
index f430a68..cf2be49 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcFieldResponse.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import org.apache.plc4x.java.api.model.PlcField;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
index bdbae0c..aed337d 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcMessage.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
index 0fa6f4e..e60afc3 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadRequest.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import java.util.concurrent.CompletableFuture;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
index 3514a48..e160b16 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcReadResponse.java
@@ -1,26 +1,23 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
-import org.apache.plc4x.java.api.Experimental;
-import org.apache.plc4x.java.api.value.PlcValue;
-
 import java.math.BigDecimal;
 import java.math.BigInteger;
 import java.time.LocalDate;
@@ -36,9 +33,6 @@ public interface PlcReadResponse extends PlcFieldResponse {
     @Override
     PlcReadRequest getRequest();
 
-    @Experimental
-    PlcValue getAsPlcValue();
-
     int getNumberOfValues(String name);
 
     Object getObject(String name);
@@ -177,4 +171,14 @@ public interface PlcReadResponse extends PlcFieldResponse {
 
     Collection<LocalDateTime> getAllDateTimes(String name);
 
+    boolean isValidByteArray(String name);
+
+    boolean isValidByteArray(String name, int index);
+
+    Byte[] getByteArray(String name);
+
+    Byte[] getByteArray(String name, int index);
+
+    Collection<Byte[]> getAllByteArrays(String name);
+
 }
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
index ae5c4ce..4b40bf1 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequest.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import java.util.concurrent.CompletableFuture;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestBuilder.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestBuilder.java
index 2b8d968..b5f9b80 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestBuilder.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcRequestBuilder.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 public interface PlcRequestBuilder {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java
index 0dda746..7fdcffc 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcResponse.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionEvent.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionEvent.java
index df45762..7192390 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionEvent.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionEvent.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import java.time.Instant;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java
index 0b53e85..3e51d6f 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionRequest.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import java.time.Duration;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionResponse.java
index 93c01a3..30b802a 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcSubscriptionResponse.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionRequest.java
index 1fc024a..8fb2979 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionRequest.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import org.apache.plc4x.java.api.model.PlcSubscriptionHandle;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionResponse.java
index 46c0f3b..705ee8d 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcUnsubscriptionResponse.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 public interface PlcUnsubscriptionResponse extends PlcResponse {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
index 556cfcb..95de458 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteRequest.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 import java.math.BigDecimal;
@@ -63,6 +63,10 @@ public interface PlcWriteRequest extends PlcFieldRequest {
 
         PlcWriteRequest.Builder addItem(String name, String fieldQuery, LocalDateTime... values);
 
+        PlcWriteRequest.Builder addItem(String name, String fieldQuery, byte[]... values);
+
+        PlcWriteRequest.Builder addItem(String name, String fieldQuery, Byte[]... values);
+
         <T> PlcWriteRequest.Builder addItem(String name, String fieldQuery, T... values);
     }
 
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
index d940c3f..035a3d7 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/messages/PlcWriteResponse.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.messages;
 
 public interface PlcWriteResponse extends PlcFieldResponse {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java
index cd5dc97a..263aec9 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/metadata/PlcConnectionMetadata.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.metadata;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcConsumerRegistration.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcConsumerRegistration.java
index 2abbe85..a0a8c52 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcConsumerRegistration.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcConsumerRegistration.java
@@ -1,20 +1,20 @@
 /*
- * 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.
+ 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.java.api.model;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java
index 76865de..6851667 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcField.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.model;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
index 285ded8..a9338ed 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/model/PlcSubscriptionHandle.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.model;
 
 import org.apache.plc4x.java.api.messages.PlcSubscriptionEvent;
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcClientDatatype.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcClientDatatype.java
index 47b82ad..ed36ad5 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcClientDatatype.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcClientDatatype.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.types;
 
 public enum PlcClientDatatype {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java
index d1b593d..dbd4be5 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcResponseCode.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.types;
 
 public enum PlcResponseCode {
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcSubscriptionType.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcSubscriptionType.java
index 8db7b5c..4b0d972 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcSubscriptionType.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/types/PlcSubscriptionType.java
@@ -1,21 +1,21 @@
 /*
- * 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.
- */
+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.java.api.types;
 
 /**
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBigDecimal.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBigDecimal.java
deleted file mode 100644
index bcc28a0..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBigDecimal.java
+++ /dev/null
@@ -1,136 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public class PlcBigDecimal extends PlcSimpleValue<BigDecimal> {
-
-    public PlcBigDecimal(BigDecimal value) {
-        super(value, true);
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return true;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return (value != null) && !value.equals(BigDecimal.ZERO);
-    }
-
-    @Override
-    public boolean isByte() {
-        return true;
-    }
-
-    @Override
-    public byte getByte() {
-        return value.byteValue();
-    }
-
-    @Override
-    public boolean isShort() {
-        return true;
-    }
-
-    @Override
-    public short getShort() {
-        return value.shortValue();
-    }
-
-    @Override
-    public boolean isInteger() {
-        return true;
-    }
-
-    @Override
-    public int getInteger() {
-        return value.intValue();
-    }
-
-    @Override
-    public boolean isLong() {
-        return true;
-    }
-
-    @Override
-    public long getLong() {
-        return value.longValue();
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return true;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        return BigInteger.valueOf(value.longValue());
-    }
-
-    @Override
-    public boolean isFloat() {
-        return true;
-    }
-
-    @Override
-    public float getFloat() {
-        return value.floatValue();
-    }
-
-    @Override
-    public boolean isDouble() {
-        return true;
-    }
-
-    @Override
-    public double getDouble() {
-        return value.doubleValue();
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return true;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        return value;
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return toString();
-    }
-
-    @Override
-    public String toString() {
-        return value.toString();
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBigInteger.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBigInteger.java
deleted file mode 100644
index a323d76..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBigInteger.java
+++ /dev/null
@@ -1,136 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public class PlcBigInteger extends PlcSimpleValue<BigInteger> {
-
-    public PlcBigInteger(BigInteger value) {
-        super(value, true);
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return true;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return (value != null) && !value.equals(BigInteger.ZERO);
-    }
-
-    @Override
-    public boolean isByte() {
-        return true;
-    }
-
-    @Override
-    public byte getByte() {
-        return value.byteValue();
-    }
-
-    @Override
-    public boolean isShort() {
-        return true;
-    }
-
-    @Override
-    public short getShort() {
-        return value.shortValue();
-    }
-
-    @Override
-    public boolean isInteger() {
-        return true;
-    }
-
-    @Override
-    public int getInteger() {
-        return value.intValue();
-    }
-
-    @Override
-    public boolean isLong() {
-        return true;
-    }
-
-    @Override
-    public long getLong() {
-        return value.longValue();
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return true;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        return value;
-    }
-
-    @Override
-    public boolean isFloat() {
-        return true;
-    }
-
-    @Override
-    public float getFloat() {
-        return value.floatValue();
-    }
-
-    @Override
-    public boolean isDouble() {
-        return true;
-    }
-
-    @Override
-    public double getDouble() {
-        return value.doubleValue();
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return true;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        return new BigDecimal(value);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return toString();
-    }
-
-    @Override
-    public String toString() {
-        return value.toString();
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBoolean.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBoolean.java
deleted file mode 100644
index eabd18b..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcBoolean.java
+++ /dev/null
@@ -1,130 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public class PlcBoolean extends PlcSimpleValue<Boolean> {
-
-    public PlcBoolean(Boolean value) {
-        super(value, true);
-    }
-
-    public PlcBoolean(boolean bool) {
-        super(bool, false);
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return true;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return (value != null) && value;
-    }
-
-    @Override
-    public boolean isByte() {
-        return true;
-    }
-
-    @Override
-    public byte getByte() {
-        return (byte) (((value != null) && value) ? 1 : 0);
-    }
-
-    @Override
-    public boolean isShort() {
-        return true;
-    }
-
-    @Override
-    public short getShort() {
-        return (short) (((value != null) && value) ? 1 : 0);
-    }
-
-    @Override
-    public boolean isLong() {
-        return true;
-    }
-
-    @Override
-    public long getLong() {
-        return ((value != null) && value) ? 1 : 0;
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return true;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        return value ? BigInteger.ONE : BigInteger.ZERO;
-    }
-
-    @Override
-    public boolean isFloat() {
-        return true;
-    }
-
-    @Override
-    public float getFloat() {
-        return ((value != null) && value) ? 1.0f : 0.0f;
-    }
-
-    @Override
-    public boolean isDouble() {
-        return true;
-    }
-
-    @Override
-    public double getDouble() {
-        return ((value != null) && value) ? 1.0 : 0.0;
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return true;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        return value ? BigDecimal.ONE : BigDecimal.ZERO;
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return toString();
-    }
-
-    @Override
-    public String toString() {
-        return Boolean.toString(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDate.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDate.java
deleted file mode 100644
index 4ec540d..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDate.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
- *
- *   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.java.api.value;
-
-import java.time.LocalDate;
-
-public class PlcDate extends PlcSimpleValue<LocalDate> {
-
-    public PlcDate(LocalDate value) {
-        super(value, true);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return value.toString();
-    }
-
-    @Override
-    public boolean isDate() {
-        return true;
-    }
-
-    @Override
-    public LocalDate getDate() {
-        return value;
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDateTime.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDateTime.java
deleted file mode 100644
index 7f98dae..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDateTime.java
+++ /dev/null
@@ -1,77 +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.java.api.value;
-
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-
-public class PlcDateTime extends PlcSimpleValue<LocalDateTime> {
-
-    public PlcDateTime(LocalDateTime value) {
-        super(value, true);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return value.toString();
-    }
-
-    @Override
-    public boolean isTime() {
-        return true;
-    }
-
-    @Override
-    public LocalTime getTime() {
-        return value.toLocalTime();
-    }
-
-    @Override
-    public boolean isDate() {
-        return true;
-    }
-
-    @Override
-    public LocalDate getDate() {
-        return value.toLocalDate();
-    }
-
-    @Override
-    public boolean isDateTime() {
-        return true;
-    }
-
-    @Override
-    public LocalDateTime getDateTime() {
-        return value;
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDouble.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDouble.java
deleted file mode 100644
index 4f4cf64..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcDouble.java
+++ /dev/null
@@ -1,140 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public class PlcDouble extends PlcSimpleValue<Double> {
-
-    public PlcDouble(Double value) {
-        super(value, true);
-    }
-
-    public PlcDouble(double value) {
-        super(value, false);
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return true;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return (value != null) && !value.equals(0.0);
-    }
-
-    @Override
-    public boolean isByte() {
-        return true;
-    }
-
-    @Override
-    public byte getByte() {
-        return value.byteValue();
-    }
-
-    @Override
-    public boolean isShort() {
-        return true;
-    }
-
-    @Override
-    public short getShort() {
-        return value.shortValue();
-    }
-
-    @Override
-    public boolean isInteger() {
-        return true;
-    }
-
-    @Override
-    public int getInteger() {
-        return value.intValue();
-    }
-
-    @Override
-    public boolean isLong() {
-        return true;
-    }
-
-    @Override
-    public long getLong() {
-        return value.longValue();
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return true;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        return BigInteger.valueOf(value.longValue());
-    }
-
-    @Override
-    public boolean isFloat() {
-        return true;
-    }
-
-    @Override
-    public float getFloat() {
-        return value.floatValue();
-    }
-
-    @Override
-    public boolean isDouble() {
-        return true;
-    }
-
-    @Override
-    public double getDouble() {
-        return value;
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return true;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        return new BigDecimal(value);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return toString();
-    }
-
-    @Override
-    public String toString() {
-        return Double.toString(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcFloat.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcFloat.java
deleted file mode 100644
index a9635c3..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcFloat.java
+++ /dev/null
@@ -1,140 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public class PlcFloat extends PlcSimpleValue<Float> {
-
-    public PlcFloat(Float value) {
-        super(value, true);
-    }
-
-    public PlcFloat(float value) {
-        super(value, false);
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return true;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return (value != null) && !value.equals(0.0F);
-    }
-
-    @Override
-    public boolean isByte() {
-        return true;
-    }
-
-    @Override
-    public byte getByte() {
-        return value.byteValue();
-    }
-
-    @Override
-    public boolean isShort() {
-        return true;
-    }
-
-    @Override
-    public short getShort() {
-        return value.shortValue();
-    }
-
-    @Override
-    public boolean isInteger() {
-        return true;
-    }
-
-    @Override
-    public int getInteger() {
-        return value.intValue();
-    }
-
-    @Override
-    public boolean isLong() {
-        return true;
-    }
-
-    @Override
-    public long getLong() {
-        return value.longValue();
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return true;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        return BigInteger.valueOf(value.longValue());
-    }
-
-    @Override
-    public boolean isFloat() {
-        return true;
-    }
-
-    @Override
-    public float getFloat() {
-        return value;
-    }
-
-    @Override
-    public boolean isDouble() {
-        return true;
-    }
-
-    @Override
-    public double getDouble() {
-        return value.doubleValue();
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return true;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        return new BigDecimal(value);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return toString();
-    }
-
-    @Override
-    public String toString() {
-        return Float.toString(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcInteger.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcInteger.java
deleted file mode 100644
index 1b5f18b..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcInteger.java
+++ /dev/null
@@ -1,156 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public class PlcInteger extends PlcSimpleValue<Integer> {
-
-    public PlcInteger(Byte value) {
-        super(value.intValue(), true);
-    }
-
-    public PlcInteger(byte value) {
-        super(((Byte) value).intValue(), false);
-    }
-
-    public PlcInteger(Short value) {
-        super(value.intValue(), true);
-    }
-
-    public PlcInteger(short value) {
-        super(((Short) value).intValue(), false);
-    }
-
-    public PlcInteger(Integer value) {
-        super(value, true);
-    }
-
-    public PlcInteger(int value) {
-        super(value, false);
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return true;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return (value != null) && !value.equals(0);
-    }
-
-    @Override
-    public boolean isByte() {
-        return true;
-    }
-
-    @Override
-    public byte getByte() {
-        return value.byteValue();
-    }
-
-    @Override
-    public boolean isShort() {
-        return true;
-    }
-
-    @Override
-    public short getShort() {
-        return value.shortValue();
-    }
-
-    @Override
-    public boolean isInteger() {
-        return true;
-    }
-
-    @Override
-    public int getInteger() {
-        return value;
-    }
-
-    @Override
-    public boolean isLong() {
-        return true;
-    }
-
-    @Override
-    public long getLong() {
-        return value.longValue();
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return true;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        return BigInteger.valueOf((long) value);
-    }
-
-    @Override
-    public boolean isFloat() {
-        return true;
-    }
-
-    @Override
-    public float getFloat() {
-        return value.floatValue();
-    }
-
-    @Override
-    public boolean isDouble() {
-        return true;
-    }
-
-    @Override
-    public double getDouble() {
-        return value.doubleValue();
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return true;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        return new BigDecimal(value);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return toString();
-    }
-
-    @Override
-    public String toString() {
-        return Integer.toString(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcList.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcList.java
deleted file mode 100644
index 1cfb684..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcList.java
+++ /dev/null
@@ -1,72 +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.java.api.value;
-
-import java.util.Collections;
-import java.util.List;
-import java.util.stream.Collectors;
-
-public class PlcList extends PlcValueAdapter {
-
-    private final List<PlcValue> listItems;
-
-    public PlcList(List<?> listItems) {
-        List<PlcValue> safelist = listItems.stream().map(plcValue -> {
-            // to avoid unwrapped list cause of type erasure
-            if (plcValue instanceof PlcValue) {
-                return (PlcValue)plcValue;
-            } else {
-                return PlcValues.of(plcValue);
-            }
-        }).collect(Collectors.toList());
-        this.listItems = Collections.unmodifiableList(safelist);
-    }
-
-    @Override
-    public Object getObject() {
-        return listItems;
-    }
-
-    @Override
-    public boolean isList() {
-        return true;
-    }
-
-    @Override
-    public int getNumberOfValues() {
-        return listItems.size();
-    }
-
-    @Override
-    public PlcValue getIndex(int i) {
-        return listItems.get(i);
-    }
-
-    @Override
-    public List<? extends PlcValue> getList() {
-        return listItems;
-    }
-
-    @Override
-    public String toString() {
-        return "[" + listItems.stream().map(PlcValue::toString).collect(Collectors.joining(",")) + "]";
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcLong.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcLong.java
deleted file mode 100644
index f133891..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcLong.java
+++ /dev/null
@@ -1,140 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-
-public class PlcLong extends PlcSimpleValue<Long> {
-
-    public PlcLong(Long value) {
-        super(value, true);
-    }
-
-    public PlcLong(long value) {
-        super(value, false);
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return true;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return (value != null) && !value.equals(0L);
-    }
-
-    @Override
-    public boolean isByte() {
-        return true;
-    }
-
-    @Override
-    public byte getByte() {
-        return value.byteValue();
-    }
-
-    @Override
-    public boolean isShort() {
-        return true;
-    }
-
-    @Override
-    public short getShort() {
-        return value.shortValue();
-    }
-
-    @Override
-    public boolean isInteger() {
-        return true;
-    }
-
-    @Override
-    public int getInteger() {
-        return value.intValue();
-    }
-
-    @Override
-    public boolean isLong() {
-        return true;
-    }
-
-    @Override
-    public long getLong() {
-        return value;
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return true;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        return BigInteger.valueOf(value);
-    }
-
-    @Override
-    public boolean isFloat() {
-        return true;
-    }
-
-    @Override
-    public float getFloat() {
-        return value.floatValue();
-    }
-
-    @Override
-    public boolean isDouble() {
-        return true;
-    }
-
-    @Override
-    public double getDouble() {
-        return value.doubleValue();
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return true;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        return new BigDecimal(value);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return toString();
-    }
-
-    @Override
-    public String toString() {
-        return Long.toString(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcSimpleValue.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcSimpleValue.java
deleted file mode 100644
index d51bdaf..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcSimpleValue.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
- *
- *   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.java.api.value;
-
-public abstract class PlcSimpleValue<T> extends PlcValueAdapter {
-
-    final T value;
-    final boolean isNullable;
-
-    PlcSimpleValue(T value, boolean isNullable) {
-        this.value = value;
-        this.isNullable = isNullable;
-    }
-
-    @Override
-    public Object getObject() {
-        return value;
-    }
-
-    @Override
-    public int getNumberOfValues() {
-        return 1;
-    }
-
-    @Override
-    public boolean isSimple() {
-        return true;
-    }
-
-    @Override
-    public boolean isNullable() {
-        return isNullable;
-    }
-
-    @Override
-    public boolean isNull() {
-        return isNullable && value == null;
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcString.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcString.java
deleted file mode 100644
index 6d17296..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcString.java
+++ /dev/null
@@ -1,68 +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.java.api.value;
-
-public class PlcString extends PlcSimpleValue<String> {
-
-    public PlcString(String value) {
-        super(value, true);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return value;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        return Boolean.parseBoolean(value);
-    }
-
-    @Override
-    public double getDouble() {
-        return Double.parseDouble(value);
-    }
-
-    @Override
-    public float getFloat() {
-        return Float.parseFloat(value);
-    }
-
-    @Override
-    public long getLong() {
-        return Long.parseLong(value);
-    }
-
-    @Override
-    public int getInteger() {
-        return Integer.parseInt(value);
-    }
-
-    @Override
-    public String toString() {
-        return "\"" + value + "\"";
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcStruct.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcStruct.java
deleted file mode 100644
index 95b950d..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcStruct.java
+++ /dev/null
@@ -1,70 +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.java.api.value;
-
-import java.util.Collections;
-import java.util.Map;
-import java.util.Set;
-import java.util.stream.Collectors;
-
-public class PlcStruct extends PlcValueAdapter {
-
-    private final Map<String, PlcValue> map;
-
-    public PlcStruct(Map<String, PlcValue> map) {
-        this.map = Collections.unmodifiableMap(map);
-    }
-
-    @Override
-    public int getNumberOfValues() {
-        return 1;
-    }
-
-    @Override
-    public boolean isStruct() {
-        return true;
-    }
-
-    @Override
-    public Set<String> getKeys() {
-        return map.keySet();
-    }
-
-    @Override
-    public boolean hasKey(String key) {
-        return map.containsKey(key);
-    }
-
-    @Override
-    public PlcValue getValue(String key) {
-        return map.get(key);
-    }
-
-    @Override
-    public Map<String, ? extends PlcValue> getStruct() {
-        return map;
-    }
-
-    @Override
-    public String toString() {
-        return "{" + map.entrySet().stream().map(entry -> String.format("\"%s\": %s", entry.getKey(), entry.getValue())).collect(Collectors.joining(",")) + "}";
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcTime.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcTime.java
deleted file mode 100644
index c33bd39..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcTime.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
- *
- *   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.java.api.value;
-
-import java.time.LocalTime;
-
-public class PlcTime extends PlcSimpleValue<LocalTime> {
-
-    public PlcTime(LocalTime value) {
-        super(value, true);
-    }
-
-    @Override
-    public boolean isString() {
-        return true;
-    }
-
-    @Override
-    public String getString() {
-        return value.toString();
-    }
-
-    @Override
-    public boolean isTime() {
-        return true;
-    }
-
-    @Override
-    public LocalTime getTime() {
-        return value;
-    }
-
-    @Override
-    public String toString() {
-        return String.valueOf(value);
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValue.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValue.java
deleted file mode 100644
index f818c13..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValue.java
+++ /dev/null
@@ -1,142 +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.java.api.value;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-/**
- * Base Type of all Types.
- */
-public interface PlcValue {
-    
-    Object getObject();
-
-    // Simple Types
-
-    boolean isSimple();
-
-    boolean isNullable();
-
-    boolean isNull();
-
-    // Generic (\o/ Sebastian)
-
-    boolean is(Class<?> clazz);
-
-    boolean isConvertibleTo(Class<?> clazz);
-
-    <T> T get(Class<T> clazz);
-
-    // Boolean
-
-    boolean isBoolean();
-
-    boolean getBoolean();
-
-    // Integer
-
-    boolean isByte();
-
-    byte getByte();
-
-    boolean isShort();
-
-    short getShort();
-
-    boolean isInteger();
-
-    int getInteger();
-
-    boolean isLong();
-
-    long getLong();
-
-    boolean isBigInteger();
-
-    BigInteger getBigInteger();
-
-    // Floating Point
-
-    boolean isFloat();
-
-    float getFloat();
-
-    boolean isDouble();
-
-    double getDouble();
-
-    boolean isBigDecimal();
-
-    BigDecimal getBigDecimal();
-
-    // String
-
-    boolean isString();
-
-    String getString();
-
-    // Time
-
-    boolean isTime();
-
-    LocalTime getTime();
-
-    boolean isDate();
-
-    LocalDate getDate();
-
-    boolean isDateTime();
-
-    LocalDateTime getDateTime();
-
-    // Raw Access
-
-    byte[] getRaw();
-
-    // List Methods
-
-    boolean isList();
-
-    int getNumberOfValues();
-
-    PlcValue getIndex(int i);
-
-    List<? extends PlcValue> getList();
-
-    // Struct Methods
-
-    boolean isStruct();
-
-    Set<String> getKeys();
-
-    boolean hasKey(String key);
-
-    PlcValue getValue(String key);
-
-    Map<String, ? extends PlcValue> getStruct();
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueAdapter.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueAdapter.java
deleted file mode 100644
index c852e67..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValueAdapter.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
- *
- *   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.java.api.value;
-
-import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
-
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-
-public class PlcValueAdapter implements PlcValue {
-
-    @Override
-    public Object getObject() {
-        return null;
-    }
-
-    @Override
-    public boolean isSimple() {
-        return false;
-    }
-
-    @Override
-    public boolean isNullable() {
-        return false;
-    }
-
-    @Override
-    public boolean isNull() {
-        return false;
-    }
-
-    @Override
-    public boolean is(Class<?> clazz) {
-        return false;
-    }
-
-    @Override
-    public boolean isConvertibleTo(Class<?> clazz) {
-        return false;
-    }
-
-    @Override
-    public <T> T get(Class<T> clazz) {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isBoolean() {
-        return false;
-    }
-
-    @Override
-    public boolean getBoolean() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    public boolean isByte() {
-        return false;
-    }
-
-    @Override
-    public byte getByte() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isShort() {
-        return false;
-    }
-
-    @Override
-    public short getShort() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isInteger() {
-        return false;
-    }
-
-    @Override
-    public int getInteger() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isLong() {
-        return false;
-    }
-
-    @Override
-    public long getLong() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isBigInteger() {
-        return false;
-    }
-
-    @Override
-    public BigInteger getBigInteger() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isFloat() {
-        return false;
-    }
-
-    @Override
-    public float getFloat() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isDouble() {
-        return false;
-    }
-
-    @Override
-    public double getDouble() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isBigDecimal() {
-        return false;
-    }
-
-    @Override
-    public BigDecimal getBigDecimal() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isString() {
-        return false;
-    }
-
-    @Override
-    public String getString() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isTime() {
-        return false;
-    }
-
-    @Override
-    public LocalTime getTime() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isDate() {
-        return false;
-    }
-
-    @Override
-    public LocalDate getDate() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isDateTime() {
-        return false;
-    }
-
-    @Override
-    public LocalDateTime getDateTime() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public byte[] getRaw() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isList() {
-        return false;
-    }
-
-    @Override
-    public int getNumberOfValues() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public PlcValue getIndex(int i) {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public List<? extends PlcValue> getList() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean isStruct() {
-        return false;
-    }
-
-    @Override
-    public Set<String> getKeys() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public boolean hasKey(String key) {
-        return false;
-    }
-
-    @Override
-    public PlcValue getValue(String key) {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-    @Override
-    public Map<String, ? extends PlcValue> getStruct() {
-        throw new PlcIncompatibleDatatypeException("");
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValues.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValues.java
deleted file mode 100644
index e008c87..0000000
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/value/PlcValues.java
+++ /dev/null
@@ -1,382 +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.java.api.value;
-
-import org.apache.plc4x.java.api.exceptions.PlcIncompatibleDatatypeException;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Constructor;
-import java.lang.reflect.InvocationTargetException;
-import java.math.BigDecimal;
-import java.math.BigInteger;
-import java.time.LocalDate;
-import java.time.LocalDateTime;
-import java.time.LocalTime;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-import java.util.Map;
-
-public class PlcValues {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(PlcValues.class);
-
-    public static PlcValue of(Boolean b) {
-        return new PlcBoolean(b);
-    }
-
-    public static PlcValue of(boolean b) {
-        return new PlcBoolean(b);
-    }
-
-    public static PlcValue of(Boolean[] b) {
-        if(b != null) {
-            if(b.length == 1) {
-                return new PlcBoolean(b[0]);
-            } else if(b.length > 1) {
-                return new PlcList(Arrays.asList(b));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(boolean[] b) {
-        if(b != null) {
-            if(b.length == 1) {
-                return new PlcBoolean(b[0]);
-            } else if(b.length > 1) {
-                return new PlcList(Arrays.asList(b));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(Byte i) {
-        return new PlcInteger(i);
-    }
-
-    public static PlcValue of(byte i) {
-        return new PlcInteger(i);
-    }
-
-    public static PlcValue of(Byte[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcInteger(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(byte[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcInteger(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(Short i) {
-        return new PlcInteger(i);
-    }
-
-    public static PlcValue of(short i) {
-        return new PlcInteger(i);
-    }
-
-    public static PlcValue of(Short[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcInteger(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(short[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcInteger(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(Integer i) {
-        return new PlcInteger(i);
-    }
-
-    public static PlcValue of(int i) {
-        return new PlcInteger(i);
-    }
-
-    public static PlcValue of(Integer[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcInteger(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(int[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcInteger(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(Long i) {
-        return new PlcLong(i);
-    }
-
-    public static PlcValue of(long i) {
-        return new PlcLong(i);
-    }
-
-    public static PlcValue of(Long[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcLong(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(long[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcLong(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(BigInteger i) {
-        return new PlcBigInteger(i);
-    }
-
-    public static PlcValue of(BigInteger[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcBigInteger(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(Float i) {
-        return new PlcFloat(i);
-    }
-
-    public static PlcValue of(float i) {
-        return new PlcFloat(i);
-    }
-
-    public static PlcValue of(Float[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcFloat(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(float[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcFloat(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(Double i) {
-        return new PlcDouble(i);
-    }
-
-    public static PlcValue of(double i) {
-        return new PlcDouble(i);
-    }
-
-    public static PlcValue of(Double[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcDouble(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(double[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcDouble(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(BigDecimal i) {
-        return new PlcBigDecimal(i);
-    }
-
-    public static PlcValue of(BigDecimal[] i) {
-        if(i != null) {
-            if(i.length == 1) {
-                return new PlcBigDecimal(i[0]);
-            } else if(i.length > 1) {
-                return new PlcList(Arrays.asList(i));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(String s) {
-        return new PlcString(s);
-    }
-
-    public static PlcValue of(String[] s) {
-        if(s != null) {
-            if(s.length == 1) {
-                return new PlcString(s[0]);
-            } else if(s.length > 1) {
-                return new PlcList(Arrays.asList(s));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(LocalTime s) {
-        return new PlcTime(s);
-    }
-
-    public static PlcValue of(LocalTime[] s) {
-        if(s != null) {
-            if(s.length == 1) {
-                return new PlcTime(s[0]);
-            } else if(s.length > 1) {
-                return new PlcList(Arrays.asList(s));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(LocalDate s) {
-        return new PlcDate(s);
-    }
-
-    public static PlcValue of(LocalDate[] s) {
-        if(s != null) {
-            if(s.length == 1) {
-                return new PlcDate(s[0]);
-            } else if(s.length > 1) {
-                return new PlcList(Arrays.asList(s));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(LocalDateTime s) {
-        return new PlcDateTime(s);
-    }
-
-    public static PlcValue of(LocalDateTime[] s) {
-        if(s != null) {
-            if(s.length == 1) {
-                return new PlcDateTime(s[0]);
-            } else if(s.length > 1) {
-                return new PlcList(Arrays.asList(s));
-            }
-        }
-        return null;
-    }
-
-    public static PlcValue of(List<PlcValue> list) {
-        return new PlcList(list);
-    }
-
-    public static PlcValue of(PlcValue... items) {
-        return new PlcList(Arrays.asList(items));
-    }
-
-    public static PlcValue of(String key, PlcValue value) {
-        return new PlcStruct(Collections.singletonMap(key, value));
-    }
-
-    public static PlcValue of(Map<String, PlcValue> map) {
-        return new PlcStruct(map);
-    }
-
-    public static PlcValue of(Object o) {
-        if(o == null) {
-            return null;
-        }
-        try {
-            String simpleName = o.getClass().getSimpleName();
-            Class<?> clazz = o.getClass();
-            if (o instanceof  List) {
-                simpleName = "List";
-                clazz = List.class;
-            } else if(clazz.isArray()) {
-                simpleName = "List";
-                clazz = List.class;
-                Object[] objectArray = (Object[]) o;
-                o = Arrays.asList(objectArray);
-            }
-            Constructor<?> constructor = Class.forName(PlcValues.class.getPackage().getName() + ".Plc" + simpleName).getDeclaredConstructor(clazz);
-            return ((PlcValue) constructor.newInstance(o));
-        } catch (InstantiationException | IllegalAccessException | InvocationTargetException | NoSuchMethodException | ClassNotFoundException e) {
-            LOGGER.warn("Cannot wrap", e);
-            throw new PlcIncompatibleDatatypeException(o.getClass());
-        }
-    }
-
-}
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/spi/PlcDriver.java b/plc4j/api/src/main/java/org/apache/plc4x/java/spi/PlcDriver.java
new file mode 100644
index 0000000..6247f17
--- /dev/null
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/spi/PlcDriver.java
@@ -0,0 +1,61 @@
+/*
+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.java.spi;
+
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.authentication.PlcAuthentication;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+
+/**
+ * General interface defining the minimal methods required for adding a new type of driver to the PLC4J system.
+ *
+ * <b>Note that each driver has to add a service file called org.apache.plc4x.java.spi.PlcDriver to
+ * src/main/resources/META-INF which contains the fully qualified classname in order to get loaded
+ * by the PlcDriverManager instances.</b>
+ */
+public interface PlcDriver {
+
+    /**
+     * @return code of the implemented protocol. This is usually a lot shorter than the String returned by @seeĀ #getProtocolName().
+     */
+    String getProtocolCode();
+
+    /**
+     * @return name of the implemented protocol.
+     */
+    String getProtocolName();
+
+    /**
+     * Connects to a PLC using the given plc connection string.
+     * @param url plc connection string.
+     * @return PlcConnection object.
+     * @throws PlcConnectionException an exception if the connection attempt failed.
+     */
+    PlcConnection connect(String url) throws PlcConnectionException;
+
+    /**
+     * Connects to a PLC using the given plc connection string using given authentication credentials.
+     * @param url plc connection string.
+     * @param authentication authentication credentials.
+     * @return PlcConnection object.
+     * @throws PlcConnectionException an exception if the connection attempt failed.
+     */
+    PlcConnection connect(String url, PlcAuthentication authentication) throws PlcConnectionException;
+
+}
diff --git a/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java b/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
index a2c3b9e..38cb8cf 100644
--- a/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
@@ -1,28 +1,30 @@
 /*
- * 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.
- */
+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.java;
 
 import org.apache.plc4x.java.api.authentication.PlcUsernamePasswordAuthentication;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.mock.MockPlcConnection;
+import org.apache.plc4x.test.FastTests;
 import org.junit.Test;
+import org.junit.experimental.categories.Category;
 
 import java.io.File;
 import java.net.MalformedURLException;
@@ -43,8 +45,9 @@ public class PlcDriverManagerTest {
      * @throws PlcException something went wrong
      */
     @Test
+    @Category(FastTests.class)
     public void getExistingDriverTest() throws PlcException {
-        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("api-mock://some-cool-url");
+        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("spi-mock://some-cool-url");
 
         assertThat(mockConnection.getAuthentication(), nullValue());
         assertThat(mockConnection.isConnected(), is(true));
@@ -56,10 +59,11 @@ public class PlcDriverManagerTest {
      * @throws PlcException something went wrong
      */
     @Test
+    @Category(FastTests.class)
     public void getExistingDriverWithAuthenticationTest() throws PlcException {
         PlcUsernamePasswordAuthentication authentication =
             new PlcUsernamePasswordAuthentication("user", "pass");
-        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("api-mock://some-cool-url", authentication);
+        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("spi-mock://some-cool-url", authentication);
 
         assertThat(mockConnection.getAuthentication(), notNullValue());
         assertThat(mockConnection.getAuthentication(), instanceOf(PlcUsernamePasswordAuthentication.class));
@@ -72,6 +76,7 @@ public class PlcDriverManagerTest {
      * @throws PlcConnectionException something went wrong
      */
     @Test(expected = PlcConnectionException.class)
+    @Category(FastTests.class)
     public void getNotExistingDriverTest() throws PlcConnectionException {
         new PlcDriverManager().getConnection("non-existing-protocol://some-cool-url");
     }
@@ -82,6 +87,7 @@ public class PlcDriverManagerTest {
      * @throws PlcConnectionException something went wrong
      */
     @Test(expected = PlcConnectionException.class)
+    @Category(FastTests.class)
     public void getInvalidUriTest() throws PlcConnectionException {
         new PlcDriverManager().getConnection("The quick brown fox jumps over the lazy dog");
     }
@@ -95,6 +101,7 @@ public class PlcDriverManagerTest {
      * @throws PlcConnectionException something went wrong
      */
     @Test(expected = IllegalStateException.class)
+    @Category(FastTests.class)
     public void getDuplicateDriver() throws MalformedURLException, PlcConnectionException {
         // Save and replace the context classloader as we need to force the ServiceLoader to
         // use a different service file.
@@ -104,7 +111,7 @@ public class PlcDriverManagerTest {
         ClassLoader fakeClassLoader = new URLClassLoader(urls, originalClassloader);
 
         // expect exception
-        new PlcDriverManager(fakeClassLoader).getConnection("api-mock://some-cool-url");
+        new PlcDriverManager(fakeClassLoader).getConnection("spi-mock://some-cool-url");
     }
 
 }
diff --git a/plc4j/api/src/test/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthenticationTest.java b/plc4j/api/src/test/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthenticationTest.java
index 0e1e92c..0b2c62d 100644
--- a/plc4j/api/src/test/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthenticationTest.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/api/authentication/PlcUsernamePasswordAuthenticationTest.java
@@ -1,27 +1,29 @@
 /*
- * 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
... 79612 lines suppressed ...