You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by cd...@apache.org on 2020/02/18 10:38:13 UTC

[plc4x] branch develop updated (e1dc816 -> 685e746)

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

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


    from e1dc816  - Addressed some major SonarCloud issues.
     new 5aa8469  - Moved the S7 and the Modbus drivers out of the sandbox and deleted the old versions
     new 685e746  - Added some checklists to the release and validation documentation

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


Summary of changes:
 plc4j/drivers/modbus/pom.xml                       |  94 ++-
 .../org/apache/plc4x/java/modbus/ModbusDriver.java |   0
 .../apache/plc4x/java/modbus/ModbusPlcDriver.java  |  95 ---
 .../java/modbus/config/ModbusConfiguration.java    |   0
 .../modbus/connection/BaseModbusPlcConnection.java | 125 ---
 .../modbus/connection/ModbusConnectionFactory.java |  40 -
 .../connection/ModbusSerialPlcConnection.java      |  47 --
 .../modbus/connection/ModbusTcpPlcConnection.java  |  80 --
 .../plc4x/java/modbus/field/ModbusField.java       |   0
 .../plc4x/java/modbus/field/ModbusFieldCoil.java   |   0
 .../modbus/field/ModbusFieldDiscreteInput.java     |   0
 .../java/modbus/field/ModbusFieldHandler.java      |   0
 .../modbus/field/ModbusFieldHoldingRegister.java   |   0
 .../modbus/field/ModbusFieldInputRegister.java     |   0
 .../modbus/field/ModbusFieldMaskWriteRegister.java |   0
 .../java/modbus/field/ModbusFieldRegister.java     |   0
 .../java/modbus/protocol/ModbusProtocolLogic.java  |   0
 .../services/org.apache.plc4x.java.api.PlcDriver   |   2 +-
 .../org/apache/plc4x/java/modbus/ModbusIOTest.java |   0
 .../plc4x/java/modbus/ModbusPlcDriverTest.java     | 134 ---
 .../connection/BaseModbusPlcConnectionTest.java    | 156 ----
 .../connection/ModbusConnectionFactoryTest.java    |  95 ---
 .../connection/ModbusSerialPlcConnectionTest.java  | 217 -----
 .../connection/ModbusTcpPlcConnectionTests.java    |  60 --
 .../test/resources/testsuite/ModbusTestsuite.xml   |   4 +-
 plc4j/drivers/pom.xml                              |   4 +-
 plc4j/drivers/s7/README.md                         |  33 -
 plc4j/drivers/s7/pom.xml                           | 130 ++-
 .../java/org/apache/plc4x/java/s7/S7PlcDriver.java |  83 --
 .../plc4x/java/s7/connection/S7PlcConnection.java  | 315 -------
 .../apache/plc4x/java/s7/readwrite/S7Driver.java   |   0
 .../readwrite/configuration/S7Configuration.java   |   0
 .../plc4x/java/s7/readwrite/field/S7Field.java     |   0
 .../java/s7/readwrite/field/S7PlcFieldHandler.java |   0
 .../optimizer/DefaultS7MessageProcessor.java       |   0
 .../s7/readwrite/optimizer/S7MessageProcessor.java |   0
 .../s7/readwrite/protocol/S7ProtocolLogic.java     |   0
 .../java/s7/readwrite/types/S7ControllerType.java  |   0
 .../java/s7/readwrite/utils/S7TsapIdEncoder.java   |   0
 .../apache/plc4x/java/s7/utils/StaticHelper.java   |   0
 .../services/org.apache.plc4x.java.api.PlcDriver   |   2 +-
 .../drivers/s7}/src/main/resources/logback.xml     |   0
 .../s7}/src/test/java/BenchmarkGeneratedS7.java    |   0
 .../java/org/apache/plc4x/java/s7/BenchmarkS7.java |  89 --
 .../org/apache/plc4x/java/s7/S7PlcDriverTest.java  |  81 --
 .../java/s7/connection/S7PlcConnectionIT.java      | 137 ---
 .../java/s7/connection/S7PlcConnectionTests.java   |  93 --
 .../java/s7/connection/S7PlcTestConnection.java    | 204 -----
 .../java/s7/connection/issues/PLC4X47Test.java     |  51 --
 .../java/s7/readwrite/ManualS7DriverTest.java      |   0
 .../s7/connection/iso-tp-connect-response.pcap     | Bin 116 -> 0 bytes
 .../s7/connection/s7-cpu-functions-response.pcap   | Bin 219 -> 0 bytes
 .../java/s7/connection/s7-read-large-response.pcap | Bin 652 -> 0 bytes
 .../java/s7/connection/s7-read-var-request.pcap    | Bin 125 -> 0 bytes
 .../java/s7/connection/s7-read-var-response.pcap   | Bin 120 -> 0 bytes
 .../s7-setup-communication-response.pcap           | Bin 121 -> 0 bytes
 .../java/s7/connection/s7-write-var-request.pcap   | Bin 130 -> 0 bytes
 .../java/s7/connection/s7-write-var-response.pcap  | Bin 116 -> 0 bytes
 plc4j/examples/hello-cloud-azure/pom.xml           |  57 --
 plc4j/examples/hello-cloud-google/pom.xml          |  44 -
 plc4j/examples/hello-connectivity-kafka/pom.xml    |  57 --
 plc4j/examples/hello-connectivity-mqtt/pom.xml     |  57 --
 .../examples/hello-influx-data-collection/pom.xml  |  24 -
 plc4j/examples/hello-integration-edgent/pom.xml    |  57 --
 plc4j/examples/hello-integration-iotdb/pom.xml     |  57 --
 plc4j/examples/hello-opm/pom.xml                   |  44 -
 plc4j/examples/hello-storage-elasticsearch/pom.xml |  44 -
 plc4j/examples/hello-webapp/service/pom.xml        |  57 --
 plc4j/examples/hello-world-plc4x/pom.xml           |  65 --
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java |  28 +-
 plc4j/examples/pom.xml                             |  69 ++
 plc4j/integrations/apache-camel/pom.xml            |   4 +-
 plc4j/integrations/apache-kafka/pom.xml            |  25 +-
 .../apache-nifi/nifi-plc4x-nar/pom.xml             |  30 +-
 plc4j/integrations/logstash-plugin/pom.xml         |  32 +-
 plc4j/karaf-features/karaf-itest/pom.xml           |  25 +-
 plc4j/karaf-features/pom.xml                       |   8 +-
 .../karaf-features/s7/src/main/feature/feature.xml |   3 -
 plc4j/protocols/iso-on-tcp/pom.xml                 |  79 --
 .../java/isoontcp/protocol/IsoOnTcpProtocol.java   | 119 ---
 .../isoontcp/protocol/model/IsoOnTcpMessage.java   |  30 -
 .../isoontcp/protocol/IsoOnTcpProtocolTest.java    | 169 ----
 plc4j/protocols/iso-tp/pom.xml                     |  75 --
 .../plc4x/java/isotp/protocol/IsoTPProtocol.java   | 446 ----------
 .../isotp/protocol/events/IsoTPConnectedEvent.java |  22 -
 .../java/isotp/protocol/model/IsoTPMessage.java    |  38 -
 .../protocol/model/params/CalledTsapParameter.java |  34 -
 .../model/params/CallingTsapParameter.java         |  34 -
 .../protocol/model/params/ChecksumParameter.java   |  40 -
 .../DisconnectAdditionalInformationParameter.java  |  41 -
 .../isotp/protocol/model/params/Parameter.java     |  27 -
 .../protocol/model/params/TpduSizeParameter.java   |  41 -
 .../isotp/protocol/model/params/TsapParameter.java |  36 -
 .../model/tpdus/ConnectionConfirmTpdu.java         |  34 -
 .../model/tpdus/ConnectionRequestTpdu.java         |  34 -
 .../isotp/protocol/model/tpdus/ConnectionTpdu.java |  53 --
 .../isotp/protocol/model/tpdus/CustomTpdu.java     |  33 -
 .../java/isotp/protocol/model/tpdus/DataTpdu.java  |  51 --
 .../model/tpdus/DisconnectConfirmTpdu.java         |  33 -
 .../model/tpdus/DisconnectRequestTpdu.java         |  41 -
 .../isotp/protocol/model/tpdus/DisconnectTpdu.java |  46 -
 .../java/isotp/protocol/model/tpdus/ErrorTpdu.java |  47 --
 .../java/isotp/protocol/model/tpdus/Tpdu.java      |  64 --
 .../isotp/protocol/model/types/DeviceGroup.java    |  51 --
 .../protocol/model/types/DisconnectReason.java     |  64 --
 .../isotp/protocol/model/types/ParameterCode.java  |  75 --
 .../isotp/protocol/model/types/ProtocolClass.java  |  53 --
 .../isotp/protocol/model/types/RejectCause.java    |  52 --
 .../java/isotp/protocol/model/types/TpduCode.java  |  62 --
 .../java/isotp/protocol/model/types/TpduSize.java  |  78 --
 .../java/isotp/protocol/IsoTPProtocolTest.java     | 635 --------------
 .../isotp/protocol/model/IsoTPMessageTests.java    |  61 --
 .../protocol/model/params/ParameterTests.java      |  62 --
 .../protocol/model/params/TsapParameterTests.java  |  60 --
 .../protocol/model/tpdus/IsotpModelTests.java      | 185 ----
 .../isotp/protocol/model/types/IsotpTypeTests.java | 216 -----
 plc4j/protocols/modbus/pom.xml                     | 130 ---
 .../items/DefaultModbusByteArrayPlcList.java       | 218 -----
 .../plc4x/java/modbus/model/CoilModbusField.java   |  45 -
 .../modbus/model/MaskWriteRegisterModbusField.java |  91 --
 .../plc4x/java/modbus/model/ModbusField.java       |  74 --
 .../model/ReadDiscreteInputsModbusField.java       |  45 -
 .../model/ReadHoldingRegistersModbusField.java     |  45 -
 .../model/ReadInputRegistersModbusField.java       |  45 -
 .../java/modbus/model/RegisterModbusField.java     |  46 -
 .../java/modbus/netty/Plc4XModbusProtocol.java     | 562 -------------
 .../java/modbus/util/ModbusPlcFieldHandler.java    | 123 ---
 .../plc4x/java/modbus/ManualPlc4XModbusTest.java   | 138 ---
 .../items/DefaultModbusByteArrayPlcValueTest.java  | 170 ----
 .../java/modbus/netty/Plc4XModbusProtocolTest.java | 441 ----------
 .../modbus/src/test/resources/logback.xml          |  38 -
 plc4j/protocols/pom.xml                            |   4 -
 plc4j/protocols/s7/LINKS.md                        |  25 -
 plc4j/protocols/s7/pom.xml                         | 104 ---
 .../org/apache/plc4x/java/s7/model/S7Field.java    | 274 ------
 .../plc4x/java/s7/netty/Plc4XNettyException.java   |  37 -
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       | 935 ---------------------
 .../org/apache/plc4x/java/s7/netty/S7Protocol.java | 877 -------------------
 .../java/s7/netty/events/S7ConnectedEvent.java     |  22 -
 .../java/s7/netty/model/messages/S7Message.java    |  99 ---
 .../s7/netty/model/messages/S7RequestMessage.java  |  51 --
 .../s7/netty/model/messages/S7ResponseMessage.java |  50 --
 .../messages/SetupCommunicationRequestMessage.java |  35 -
 .../netty/model/params/CpuServicesParameter.java   |  54 --
 .../model/params/CpuServicesRequestParameter.java  |  30 -
 .../model/params/CpuServicesResponseParameter.java |  50 --
 .../java/s7/netty/model/params/S7Parameter.java    |  27 -
 .../model/params/SetupCommunicationParameter.java  |  52 --
 .../java/s7/netty/model/params/VarParameter.java   |  54 --
 .../model/params/items/S7AnyVarParameterItem.java  |  94 ---
 .../netty/model/params/items/VarParameterItem.java |  27 -
 .../netty/model/payloads/CpuServicesPayload.java   |  71 --
 .../java/s7/netty/model/payloads/S7Payload.java    |  27 -
 .../java/s7/netty/model/payloads/VarPayload.java   |  60 --
 .../netty/model/payloads/items/VarPayloadItem.java |  48 --
 .../netty/model/payloads/ssls/SslDataRecord.java   |  25 -
 .../ssls/SslModuleIdentificationDataRecord.java    |  66 --
 .../types/CpuServicesParameterFunctionGroup.java   |  58 --
 .../CpuServicesParameterSubFunctionGroup.java      |  58 --
 .../netty/model/types/DataTransportErrorCode.java  |  62 --
 .../s7/netty/model/types/DataTransportSize.java    |  64 --
 .../s7/netty/model/types/HeaderErrorClass.java     |  55 --
 .../java/s7/netty/model/types/MemoryArea.java      |  83 --
 .../java/s7/netty/model/types/MessageType.java     |  55 --
 .../java/s7/netty/model/types/ParameterError.java  |  70 --
 .../java/s7/netty/model/types/ParameterType.java   |  71 --
 .../s7/netty/model/types/SpecificationType.java    |  52 --
 .../plc4x/java/s7/netty/model/types/SslId.java     |  97 ---
 .../java/s7/netty/model/types/TransportSize.java   | 196 -----
 .../netty/model/types/VariableAddressingMode.java  |  63 --
 .../strategies/DefaultS7MessageProcessor.java      | 496 -----------
 .../s7/netty/strategies/S7MessageProcessor.java    |  38 -
 .../java/s7/netty/util/S7PlcFieldHandler.java      | 590 -------------
 .../s7/netty/util/S7RequestSizeCalculator.java     | 158 ----
 .../s7/netty/util/S7ResponseSizeEstimator.java     | 171 ----
 .../plc4x/java/s7/netty/util/S7SizeHelper.java     | 143 ----
 .../plc4x/java/s7/types/S7ControllerType.java      |  30 -
 .../plc4x/java/s7/utils/S7TsapIdEncoder.java       |  48 --
 plc4j/protocols/s7/src/site/asciidoc/index.adoc    | 101 ---
 .../plc4x/java/s7/netty/Plc4XS7ProtocolSpec.groovy | 288 -------
 .../java/org/apache/plc4x/java/issues/PLC4X56.java |  81 --
 .../org/apache/plc4x/java/s7/PcapGenerator.java    | 318 -------
 .../apache/plc4x/java/s7/model/S7FieldTests.java   | 107 ---
 .../plc4x/java/s7/netty/Plc4XS7ProtocolTest.java   | 184 ----
 .../apache/plc4x/java/s7/netty/S7ProtocolTest.java | 424 ----------
 .../s7/netty/model/messages/S7MessageTests.java    | 191 -----
 .../s7/netty/model/params/S7ParameterTests.java    |  80 --
 .../s7/netty/model/payloads/S7PayloadTests.java    | 132 ---
 .../java/s7/netty/model/types/S7TypeTests.java     | 150 ----
 .../strategies/DefaultS7MessageProcessorTest.java  | 931 --------------------
 .../java/s7/netty/util/S7PlcFieldHandlerTest.java  | 367 --------
 .../s7/netty/util/S7RequestSizeCalculatorTest.java | 141 ----
 .../s7/netty/util/S7ResponseSizeEstimatorTest.java | 122 ---
 .../plc4x/java/s7/netty/util/S7SizeHelperTest.java | 119 ---
 .../apache/plc4x/java/s7/types/S7DataTypeTest.java |  57 --
 .../plc4x/java/s7/utils/S7TsapIdEncoderTest.java   |  68 --
 ...spockframework.report.IReportCreator.properties |  66 --
 plc4j/protocols/s7/src/test/resources/logback.xml  |  36 -
 plc4j/spi/pom.xml                                  |   1 -
 pom.xml                                            |   5 +
 sandbox/pom.xml                                    |   3 +-
 sandbox/test-java-modbus-driver/pom.xml            | 136 ---
 .../services/org.apache.plc4x.java.api.PlcDriver   |  19 -
 sandbox/test-java-s7-driver/pom.xml                | 124 ---
 .../services/org.apache.plc4x.java.api.PlcDriver   |  19 -
 src/site/asciidoc/developers/release/release.adoc  |  38 +
 .../asciidoc/developers/release/validation.adoc    |  44 +-
 207 files changed, 376 insertions(+), 18522 deletions(-)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/ModbusDriver.java (100%)
 delete mode 100644 plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusPlcDriver.java
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/config/ModbusConfiguration.java (100%)
 delete mode 100644 plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
 delete mode 100644 plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactory.java
 delete mode 100644 plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
 delete mode 100644 plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldCoil.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldDiscreteInput.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHandler.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHoldingRegister.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldInputRegister.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldMaskWriteRegister.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldRegister.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/main/java/org/apache/plc4x/java/modbus/protocol/ModbusProtocolLogic.java (100%)
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/test/java/org/apache/plc4x/java/modbus/ModbusIOTest.java (100%)
 delete mode 100644 plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
 delete mode 100644 plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java
 delete mode 100644 plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
 delete mode 100644 plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
 delete mode 100644 plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java
 rename {sandbox/test-java-modbus-driver => plc4j/drivers/modbus}/src/test/resources/testsuite/ModbusTestsuite.xml (96%)
 delete mode 100644 plc4j/drivers/s7/README.md
 delete mode 100644 plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/S7PlcDriver.java
 delete mode 100644 plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7PlcFieldHandler.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7MessageProcessor.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7ControllerType.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7TsapIdEncoder.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/main/resources/logback.xml (100%)
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/test/java/BenchmarkGeneratedS7.java (100%)
 delete mode 100644 plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/BenchmarkS7.java
 delete mode 100644 plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcDriverTest.java
 delete mode 100644 plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionIT.java
 delete mode 100644 plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
 delete mode 100644 plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcTestConnection.java
 delete mode 100644 plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/issues/PLC4X47Test.java
 rename {sandbox/test-java-s7-driver => plc4j/drivers/s7}/src/test/java/org/apache/plc4x/java/s7/readwrite/ManualS7DriverTest.java (100%)
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/iso-tp-connect-response.pcap
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-cpu-functions-response.pcap
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-large-response.pcap
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcap
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcap
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-setup-communication-response.pcap
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcap
 delete mode 100644 plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcap
 delete mode 100644 plc4j/protocols/iso-on-tcp/pom.xml
 delete mode 100644 plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
 delete mode 100644 plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java
 delete mode 100644 plc4j/protocols/iso-on-tcp/src/test/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocolTest.java
 delete mode 100644 plc4j/protocols/iso-tp/pom.xml
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocol.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/events/IsoTPConnectedEvent.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessage.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CalledTsapParameter.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CallingTsapParameter.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/ChecksumParameter.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/DisconnectAdditionalInformationParameter.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/Parameter.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TpduSizeParameter.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameter.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionConfirmTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionRequestTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/CustomTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DataTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectConfirmTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectRequestTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ErrorTpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/Tpdu.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DeviceGroup.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DisconnectReason.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ParameterCode.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ProtocolClass.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/RejectCause.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduCode.java
 delete mode 100644 plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduSize.java
 delete mode 100644 plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocolTest.java
 delete mode 100644 plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessageTests.java
 delete mode 100644 plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/ParameterTests.java
 delete mode 100644 plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameterTests.java
 delete mode 100644 plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/IsotpModelTests.java
 delete mode 100644 plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/types/IsotpTypeTests.java
 delete mode 100644 plc4j/protocols/modbus/pom.xml
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcList.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusField.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusField.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ModbusField.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusField.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusField.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusField.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusField.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
 delete mode 100644 plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
 delete mode 100644 plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
 delete mode 100644 plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcValueTest.java
 delete mode 100644 plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java
 delete mode 100644 plc4j/protocols/modbus/src/test/resources/logback.xml
 delete mode 100644 plc4j/protocols/s7/LINKS.md
 delete mode 100644 plc4j/protocols/s7/pom.xml
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/model/S7Field.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XNettyException.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/Plc4XS7Protocol.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/events/S7ConnectedEvent.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/messages/S7Message.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/messages/S7RequestMessage.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/messages/S7ResponseMessage.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/messages/SetupCommunicationRequestMessage.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/CpuServicesParameter.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/CpuServicesRequestParameter.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/CpuServicesResponseParameter.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/S7Parameter.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/SetupCommunicationParameter.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/VarParameter.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/items/S7AnyVarParameterItem.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/params/items/VarParameterItem.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/payloads/CpuServicesPayload.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/payloads/S7Payload.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/payloads/VarPayload.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/payloads/items/VarPayloadItem.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/payloads/ssls/SslDataRecord.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/payloads/ssls/SslModuleIdentificationDataRecord.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/CpuServicesParameterFunctionGroup.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/CpuServicesParameterSubFunctionGroup.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportErrorCode.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/DataTransportSize.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/HeaderErrorClass.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/MemoryArea.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/MessageType.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/ParameterError.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/ParameterType.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/SpecificationType.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/SslId.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/TransportSize.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/model/types/VariableAddressingMode.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessor.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/strategies/S7MessageProcessor.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandler.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculator.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimator.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/util/S7SizeHelper.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/types/S7ControllerType.java
 delete mode 100644 plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoder.java
 delete mode 100644 plc4j/protocols/s7/src/site/asciidoc/index.adoc
 delete mode 100644 plc4j/protocols/s7/src/test/groovy/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolSpec.groovy
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/issues/PLC4X56.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/PcapGenerator.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/model/S7FieldTests.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/messages/S7MessageTests.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/params/S7ParameterTests.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/payloads/S7PayloadTests.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/model/types/S7TypeTests.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/strategies/DefaultS7MessageProcessorTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7PlcFieldHandlerTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7RequestSizeCalculatorTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7ResponseSizeEstimatorTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/util/S7SizeHelperTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/types/S7DataTypeTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoderTest.java
 delete mode 100644 plc4j/protocols/s7/src/test/resources/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties
 delete mode 100644 plc4j/protocols/s7/src/test/resources/logback.xml
 delete mode 100644 sandbox/test-java-modbus-driver/pom.xml
 delete mode 100644 sandbox/test-java-modbus-driver/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
 delete mode 100644 sandbox/test-java-s7-driver/pom.xml
 delete mode 100644 sandbox/test-java-s7-driver/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver


[plc4x] 01/02: - Moved the S7 and the Modbus drivers out of the sandbox and deleted the old versions

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 5aa84694728d073566c1a3ec5b35ea259759b29b
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Feb 18 11:37:35 2020 +0100

    - Moved the S7 and the Modbus drivers out of the sandbox and deleted the old versions
---
 plc4j/drivers/modbus/pom.xml                       |  94 ++-
 .../org/apache/plc4x/java/modbus/ModbusDriver.java |   0
 .../apache/plc4x/java/modbus/ModbusPlcDriver.java  |  95 ---
 .../java/modbus/config/ModbusConfiguration.java    |   0
 .../modbus/connection/BaseModbusPlcConnection.java | 125 ---
 .../modbus/connection/ModbusConnectionFactory.java |  40 -
 .../connection/ModbusSerialPlcConnection.java      |  47 --
 .../modbus/connection/ModbusTcpPlcConnection.java  |  80 --
 .../plc4x/java/modbus/field/ModbusField.java       |   0
 .../plc4x/java/modbus/field/ModbusFieldCoil.java   |   0
 .../modbus/field/ModbusFieldDiscreteInput.java     |   0
 .../java/modbus/field/ModbusFieldHandler.java      |   0
 .../modbus/field/ModbusFieldHoldingRegister.java   |   0
 .../modbus/field/ModbusFieldInputRegister.java     |   0
 .../modbus/field/ModbusFieldMaskWriteRegister.java |   0
 .../java/modbus/field/ModbusFieldRegister.java     |   0
 .../java/modbus/protocol/ModbusProtocolLogic.java  |   0
 .../services/org.apache.plc4x.java.api.PlcDriver   |   2 +-
 .../org/apache/plc4x/java/modbus/ModbusIOTest.java |   0
 .../plc4x/java/modbus/ModbusPlcDriverTest.java     | 134 ---
 .../connection/BaseModbusPlcConnectionTest.java    | 156 ----
 .../connection/ModbusConnectionFactoryTest.java    |  95 ---
 .../connection/ModbusSerialPlcConnectionTest.java  | 217 -----
 .../connection/ModbusTcpPlcConnectionTests.java    |  60 --
 .../test/resources/testsuite/ModbusTestsuite.xml   |   4 +-
 plc4j/drivers/pom.xml                              |   4 +-
 plc4j/drivers/s7/README.md                         |  33 -
 plc4j/drivers/s7/pom.xml                           | 130 ++-
 .../java/org/apache/plc4x/java/s7/S7PlcDriver.java |  83 --
 .../plc4x/java/s7/connection/S7PlcConnection.java  | 315 -------
 .../apache/plc4x/java/s7/readwrite/S7Driver.java   |   0
 .../readwrite/configuration/S7Configuration.java   |   0
 .../plc4x/java/s7/readwrite/field/S7Field.java     |   0
 .../java/s7/readwrite/field/S7PlcFieldHandler.java |   0
 .../optimizer/DefaultS7MessageProcessor.java       |   0
 .../s7/readwrite/optimizer/S7MessageProcessor.java |   0
 .../s7/readwrite/protocol/S7ProtocolLogic.java     |   0
 .../java/s7/readwrite/types/S7ControllerType.java  |   0
 .../java/s7/readwrite/utils/S7TsapIdEncoder.java   |   0
 .../apache/plc4x/java/s7/utils/StaticHelper.java   |   0
 .../services/org.apache.plc4x.java.api.PlcDriver   |   2 +-
 .../s7/src/main}/resources/logback.xml             |   0
 .../s7}/src/test/java/BenchmarkGeneratedS7.java    |   0
 .../java/org/apache/plc4x/java/s7/BenchmarkS7.java |  89 --
 .../org/apache/plc4x/java/s7/S7PlcDriverTest.java  |  81 --
 .../java/s7/connection/S7PlcConnectionIT.java      | 137 ---
 .../java/s7/connection/S7PlcConnectionTests.java   |  93 --
 .../java/s7/connection/S7PlcTestConnection.java    | 204 -----
 .../java/s7/connection/issues/PLC4X47Test.java     |  51 --
 .../java/s7/readwrite/ManualS7DriverTest.java      |   0
 .../s7/connection/iso-tp-connect-response.pcap     | Bin 116 -> 0 bytes
 .../s7/connection/s7-cpu-functions-response.pcap   | Bin 219 -> 0 bytes
 .../java/s7/connection/s7-read-large-response.pcap | Bin 652 -> 0 bytes
 .../java/s7/connection/s7-read-var-request.pcap    | Bin 125 -> 0 bytes
 .../java/s7/connection/s7-read-var-response.pcap   | Bin 120 -> 0 bytes
 .../s7-setup-communication-response.pcap           | Bin 121 -> 0 bytes
 .../java/s7/connection/s7-write-var-request.pcap   | Bin 130 -> 0 bytes
 .../java/s7/connection/s7-write-var-response.pcap  | Bin 116 -> 0 bytes
 plc4j/examples/hello-cloud-azure/pom.xml           |  57 --
 plc4j/examples/hello-cloud-google/pom.xml          |  44 -
 plc4j/examples/hello-connectivity-kafka/pom.xml    |  57 --
 plc4j/examples/hello-connectivity-mqtt/pom.xml     |  57 --
 .../examples/hello-influx-data-collection/pom.xml  |  24 -
 plc4j/examples/hello-integration-edgent/pom.xml    |  57 --
 plc4j/examples/hello-integration-iotdb/pom.xml     |  57 --
 plc4j/examples/hello-opm/pom.xml                   |  44 -
 plc4j/examples/hello-storage-elasticsearch/pom.xml |  44 -
 plc4j/examples/hello-webapp/service/pom.xml        |  57 --
 plc4j/examples/hello-world-plc4x/pom.xml           |  65 --
 .../plc4x/java/examples/helloplc4x/HelloPlc4x.java |  28 +-
 plc4j/examples/pom.xml                             |  69 ++
 plc4j/integrations/apache-camel/pom.xml            |   4 +-
 plc4j/integrations/apache-kafka/pom.xml            |  25 +-
 .../apache-nifi/nifi-plc4x-nar/pom.xml             |  30 +-
 plc4j/integrations/logstash-plugin/pom.xml         |  32 +-
 plc4j/karaf-features/karaf-itest/pom.xml           |  25 +-
 plc4j/karaf-features/pom.xml                       |   8 +-
 .../karaf-features/s7/src/main/feature/feature.xml |   3 -
 plc4j/protocols/iso-on-tcp/pom.xml                 |  79 --
 .../java/isoontcp/protocol/IsoOnTcpProtocol.java   | 119 ---
 .../isoontcp/protocol/model/IsoOnTcpMessage.java   |  30 -
 .../isoontcp/protocol/IsoOnTcpProtocolTest.java    | 169 ----
 plc4j/protocols/iso-tp/pom.xml                     |  75 --
 .../plc4x/java/isotp/protocol/IsoTPProtocol.java   | 446 ----------
 .../isotp/protocol/events/IsoTPConnectedEvent.java |  22 -
 .../java/isotp/protocol/model/IsoTPMessage.java    |  38 -
 .../protocol/model/params/CalledTsapParameter.java |  34 -
 .../model/params/CallingTsapParameter.java         |  34 -
 .../protocol/model/params/ChecksumParameter.java   |  40 -
 .../DisconnectAdditionalInformationParameter.java  |  41 -
 .../isotp/protocol/model/params/Parameter.java     |  27 -
 .../protocol/model/params/TpduSizeParameter.java   |  41 -
 .../isotp/protocol/model/params/TsapParameter.java |  36 -
 .../model/tpdus/ConnectionConfirmTpdu.java         |  34 -
 .../model/tpdus/ConnectionRequestTpdu.java         |  34 -
 .../isotp/protocol/model/tpdus/ConnectionTpdu.java |  53 --
 .../isotp/protocol/model/tpdus/CustomTpdu.java     |  33 -
 .../java/isotp/protocol/model/tpdus/DataTpdu.java  |  51 --
 .../model/tpdus/DisconnectConfirmTpdu.java         |  33 -
 .../model/tpdus/DisconnectRequestTpdu.java         |  41 -
 .../isotp/protocol/model/tpdus/DisconnectTpdu.java |  46 -
 .../java/isotp/protocol/model/tpdus/ErrorTpdu.java |  47 --
 .../java/isotp/protocol/model/tpdus/Tpdu.java      |  64 --
 .../isotp/protocol/model/types/DeviceGroup.java    |  51 --
 .../protocol/model/types/DisconnectReason.java     |  64 --
 .../isotp/protocol/model/types/ParameterCode.java  |  75 --
 .../isotp/protocol/model/types/ProtocolClass.java  |  53 --
 .../isotp/protocol/model/types/RejectCause.java    |  52 --
 .../java/isotp/protocol/model/types/TpduCode.java  |  62 --
 .../java/isotp/protocol/model/types/TpduSize.java  |  78 --
 .../java/isotp/protocol/IsoTPProtocolTest.java     | 635 --------------
 .../isotp/protocol/model/IsoTPMessageTests.java    |  61 --
 .../protocol/model/params/ParameterTests.java      |  62 --
 .../protocol/model/params/TsapParameterTests.java  |  60 --
 .../protocol/model/tpdus/IsotpModelTests.java      | 185 ----
 .../isotp/protocol/model/types/IsotpTypeTests.java | 216 -----
 plc4j/protocols/modbus/pom.xml                     | 130 ---
 .../items/DefaultModbusByteArrayPlcList.java       | 218 -----
 .../plc4x/java/modbus/model/CoilModbusField.java   |  45 -
 .../modbus/model/MaskWriteRegisterModbusField.java |  91 --
 .../plc4x/java/modbus/model/ModbusField.java       |  74 --
 .../model/ReadDiscreteInputsModbusField.java       |  45 -
 .../model/ReadHoldingRegistersModbusField.java     |  45 -
 .../model/ReadInputRegistersModbusField.java       |  45 -
 .../java/modbus/model/RegisterModbusField.java     |  46 -
 .../java/modbus/netty/Plc4XModbusProtocol.java     | 562 -------------
 .../java/modbus/util/ModbusPlcFieldHandler.java    | 123 ---
 .../plc4x/java/modbus/ManualPlc4XModbusTest.java   | 138 ---
 .../items/DefaultModbusByteArrayPlcValueTest.java  | 170 ----
 .../java/modbus/netty/Plc4XModbusProtocolTest.java | 441 ----------
 .../modbus/src/test/resources/logback.xml          |  38 -
 plc4j/protocols/pom.xml                            |   4 -
 plc4j/protocols/s7/LINKS.md                        |  25 -
 plc4j/protocols/s7/pom.xml                         | 104 ---
 .../org/apache/plc4x/java/s7/model/S7Field.java    | 274 ------
 .../plc4x/java/s7/netty/Plc4XNettyException.java   |  37 -
 .../plc4x/java/s7/netty/Plc4XS7Protocol.java       | 935 ---------------------
 .../org/apache/plc4x/java/s7/netty/S7Protocol.java | 877 -------------------
 .../java/s7/netty/events/S7ConnectedEvent.java     |  22 -
 .../java/s7/netty/model/messages/S7Message.java    |  99 ---
 .../s7/netty/model/messages/S7RequestMessage.java  |  51 --
 .../s7/netty/model/messages/S7ResponseMessage.java |  50 --
 .../messages/SetupCommunicationRequestMessage.java |  35 -
 .../netty/model/params/CpuServicesParameter.java   |  54 --
 .../model/params/CpuServicesRequestParameter.java  |  30 -
 .../model/params/CpuServicesResponseParameter.java |  50 --
 .../java/s7/netty/model/params/S7Parameter.java    |  27 -
 .../model/params/SetupCommunicationParameter.java  |  52 --
 .../java/s7/netty/model/params/VarParameter.java   |  54 --
 .../model/params/items/S7AnyVarParameterItem.java  |  94 ---
 .../netty/model/params/items/VarParameterItem.java |  27 -
 .../netty/model/payloads/CpuServicesPayload.java   |  71 --
 .../java/s7/netty/model/payloads/S7Payload.java    |  27 -
 .../java/s7/netty/model/payloads/VarPayload.java   |  60 --
 .../netty/model/payloads/items/VarPayloadItem.java |  48 --
 .../netty/model/payloads/ssls/SslDataRecord.java   |  25 -
 .../ssls/SslModuleIdentificationDataRecord.java    |  66 --
 .../types/CpuServicesParameterFunctionGroup.java   |  58 --
 .../CpuServicesParameterSubFunctionGroup.java      |  58 --
 .../netty/model/types/DataTransportErrorCode.java  |  62 --
 .../s7/netty/model/types/DataTransportSize.java    |  64 --
 .../s7/netty/model/types/HeaderErrorClass.java     |  55 --
 .../java/s7/netty/model/types/MemoryArea.java      |  83 --
 .../java/s7/netty/model/types/MessageType.java     |  55 --
 .../java/s7/netty/model/types/ParameterError.java  |  70 --
 .../java/s7/netty/model/types/ParameterType.java   |  71 --
 .../s7/netty/model/types/SpecificationType.java    |  52 --
 .../plc4x/java/s7/netty/model/types/SslId.java     |  97 ---
 .../java/s7/netty/model/types/TransportSize.java   | 196 -----
 .../netty/model/types/VariableAddressingMode.java  |  63 --
 .../strategies/DefaultS7MessageProcessor.java      | 496 -----------
 .../s7/netty/strategies/S7MessageProcessor.java    |  38 -
 .../java/s7/netty/util/S7PlcFieldHandler.java      | 590 -------------
 .../s7/netty/util/S7RequestSizeCalculator.java     | 158 ----
 .../s7/netty/util/S7ResponseSizeEstimator.java     | 171 ----
 .../plc4x/java/s7/netty/util/S7SizeHelper.java     | 143 ----
 .../plc4x/java/s7/types/S7ControllerType.java      |  30 -
 .../plc4x/java/s7/utils/S7TsapIdEncoder.java       |  48 --
 plc4j/protocols/s7/src/site/asciidoc/index.adoc    | 101 ---
 .../plc4x/java/s7/netty/Plc4XS7ProtocolSpec.groovy | 288 -------
 .../java/org/apache/plc4x/java/issues/PLC4X56.java |  81 --
 .../org/apache/plc4x/java/s7/PcapGenerator.java    | 318 -------
 .../apache/plc4x/java/s7/model/S7FieldTests.java   | 107 ---
 .../plc4x/java/s7/netty/Plc4XS7ProtocolTest.java   | 184 ----
 .../apache/plc4x/java/s7/netty/S7ProtocolTest.java | 424 ----------
 .../s7/netty/model/messages/S7MessageTests.java    | 191 -----
 .../s7/netty/model/params/S7ParameterTests.java    |  80 --
 .../s7/netty/model/payloads/S7PayloadTests.java    | 132 ---
 .../java/s7/netty/model/types/S7TypeTests.java     | 150 ----
 .../strategies/DefaultS7MessageProcessorTest.java  | 931 --------------------
 .../java/s7/netty/util/S7PlcFieldHandlerTest.java  | 367 --------
 .../s7/netty/util/S7RequestSizeCalculatorTest.java | 141 ----
 .../s7/netty/util/S7ResponseSizeEstimatorTest.java | 122 ---
 .../plc4x/java/s7/netty/util/S7SizeHelperTest.java | 119 ---
 .../apache/plc4x/java/s7/types/S7DataTypeTest.java |  57 --
 .../plc4x/java/s7/utils/S7TsapIdEncoderTest.java   |  68 --
 ...spockframework.report.IReportCreator.properties |  66 --
 plc4j/spi/pom.xml                                  |   1 -
 pom.xml                                            |   5 +
 sandbox/pom.xml                                    |   3 +-
 sandbox/test-java-modbus-driver/pom.xml            | 136 ---
 .../services/org.apache.plc4x.java.api.PlcDriver   |  19 -
 sandbox/test-java-s7-driver/pom.xml                | 124 ---
 .../services/org.apache.plc4x.java.api.PlcDriver   |  19 -
 .../src/main/resources/logback.xml                 |  36 -
 205 files changed, 316 insertions(+), 18500 deletions(-)

diff --git a/plc4j/drivers/modbus/pom.xml b/plc4j/drivers/modbus/pom.xml
index 8d1db9f..ceecc37 100644
--- a/plc4j/drivers/modbus/pom.xml
+++ b/plc4j/drivers/modbus/pom.xml
@@ -18,7 +18,6 @@
   under the License.
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
@@ -29,7 +28,42 @@
 
   <artifactId>plc4j-driver-modbus</artifactId>
   <name>PLC4J: Driver: Modbus</name>
-  <description>Implementation of a PLC4X driver able to speak with devices using the Modbus protocol.</description>
+  <description>Implementation of a PLC4X driver for the Modbus protocol.</description>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.plc4x.plugins</groupId>
+        <artifactId>plc4x-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>generate-driver</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>generate-driver</goal>
+            </goals>
+            <configuration>
+              <protocolName>modbus</protocolName>
+              <languageName>java</languageName>
+              <outputFlavor>read-write</outputFlavor>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4j-transport-serial</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-transport-raw-socket</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4x-build-utils-language-java</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4x-protocols-modbus</usedDependency>
+          </usedDependencies>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
 
   <dependencies>
     <dependency>
@@ -42,61 +76,71 @@
       <artifactId>plc4j-spi</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
+
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-modbus</artifactId>
+      <artifactId>plc4j-transport-tcp</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
-
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-transport-tcp</artifactId>
+      <artifactId>plc4j-transport-serial</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-trannsport-serial</artifactId>
+      <artifactId>plc4j-transport-raw-socket</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
 
-
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-common</artifactId>
-    </dependency>
     <dependency>
       <groupId>io.netty</groupId>
-      <artifactId>netty-transport</artifactId>
+      <artifactId>netty-buffer</artifactId>
     </dependency>
     <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-buffer</artifactId>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
     </dependency>
-
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
 
     <dependency>
-      <groupId>com.digitalpetri.modbus</groupId>
-      <artifactId>modbus-codec</artifactId>
-      <version>1.1.0</version>
+      <groupId>org.osgi</groupId>
+      <artifactId>osgi.cmpn</artifactId>
+      <version>6.0.0</version>
+      <scope>provided</scope>
     </dependency>
 
-    <!--dependency>
+    <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-transport-test</artifactId>
+      <artifactId>plc4j-utils-test-utils</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>test</scope>
-    </dependency-->
+    </dependency>
 
     <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>osgi.cmpn</artifactId>
-      <version>6.0.0</version>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-build-utils-language-java</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <!-- Scope is 'provided' as this way it's not shipped with the driver -->
+      <scope>provided</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-protocols-modbus</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <!-- Scope is 'provided' as this way it's not shipped with the driver -->
       <scope>provided</scope>
     </dependency>
   </dependencies>
 
-</project>
\ No newline at end of file
+</project>
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/ModbusDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusDriver.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/ModbusDriver.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusDriver.java
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusPlcDriver.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusPlcDriver.java
deleted file mode 100644
index 7fba2f7..0000000
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusPlcDriver.java
+++ /dev/null
@@ -1,95 +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.modbus;
-
-import org.apache.commons.lang3.StringUtils;
-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.modbus.connection.ModbusConnectionFactory;
-import org.apache.plc4x.java.api.PlcDriver;
-import org.osgi.service.component.annotations.Component;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Implementation of the Modbus protocol, based on:
- * - Modbus Protocol (http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf)
- */
-@Component(service = PlcDriver.class, immediate = true)
-public class ModbusPlcDriver implements PlcDriver {
-
-    public static final Pattern INET_ADDRESS_PATTERN = Pattern.compile("tcp://(?<host>[\\w.]+)(:(?<port>\\d*))?");
-    public static final Pattern SERIAL_PATTERN = Pattern.compile("serial://(?<serialDefinition>((?!/\\d).)*)");
-    public static final Pattern MODBUS_URI_PATTERN = Pattern.compile("^modbus:(" + INET_ADDRESS_PATTERN + "|" + SERIAL_PATTERN + ")/?" + "(?<params>\\?.*)?");
-
-    private ModbusConnectionFactory modbusConnectionFactory;
-
-    public ModbusPlcDriver() {
-        this.modbusConnectionFactory = new ModbusConnectionFactory();
-    }
-
-    public ModbusPlcDriver(ModbusConnectionFactory modbusConnectionFactory) {
-        this.modbusConnectionFactory = modbusConnectionFactory;
-    }
-
-    @Override
-    public String getProtocolCode() {
-        return "modbus";
-    }
-
-    @Override
-    public String getProtocolName() {
-        return "Modbus (TCP / Serial)";
-    }
-
-    @Override
-    public PlcConnection connect(String url) throws PlcConnectionException {
-        Matcher matcher = MODBUS_URI_PATTERN.matcher(url);
-        if (!matcher.matches()) {
-            throw new PlcConnectionException(
-                "Connection url doesn't match the format 'modbus:{type}//{port|host}'");
-        }
-
-        String host = matcher.group("host");
-        String serialDefinition = matcher.group("serialDefinition");
-        String portString = matcher.group("port");
-        Integer port = StringUtils.isNotBlank(portString) ? Integer.parseInt(portString) : null;
-        String params = matcher.group("params") != null ? matcher.group("params").substring(1) : null;
-
-        if (serialDefinition != null) {
-            return modbusConnectionFactory.modbusSerialPlcConnectionOf(serialDefinition, params);
-        } else {
-            try {
-                return modbusConnectionFactory.modbusTcpPlcConnectionOf(InetAddress.getByName(host), port, params);
-            } catch (UnknownHostException e) {
-                throw new PlcConnectionException(e);
-            }
-        }
-    }
-
-    @Override
-    public PlcConnection connect(String url, PlcAuthentication authentication) throws PlcConnectionException {
-        throw new PlcConnectionException("Modbus connections don't support authentication.");
-    }
-
-}
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/config/ModbusConfiguration.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/config/ModbusConfiguration.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/config/ModbusConfiguration.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/config/ModbusConfiguration.java
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
deleted file mode 100644
index 20012d1..0000000
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
+++ /dev/null
@@ -1,125 +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.modbus.connection;
-
-import org.apache.commons.lang3.StringUtils;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.spi.connection.ChannelFactory;
-import org.apache.plc4x.java.spi.connection.NettyPlcConnection;
-import org.apache.plc4x.java.modbus.util.ModbusPlcFieldHandler;
-import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcReadResponse;
-import org.apache.plc4x.java.spi.messages.InternalPlcWriteRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcWriteResponse;
-import org.apache.plc4x.java.spi.messages.PlcReader;
-import org.apache.plc4x.java.spi.messages.PlcRequestContainer;
-import org.apache.plc4x.java.spi.messages.PlcWriter;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.CompletableFuture;
-
-public abstract class BaseModbusPlcConnection extends NettyPlcConnection implements PlcReader, PlcWriter {
-
-    private static final Logger logger = LoggerFactory.getLogger(BaseModbusPlcConnection.class);
-
-    // This slaveId defaults to 0 which is a broadcast.
-    private short slaveId = 0;
-
-    BaseModbusPlcConnection(ChannelFactory channelFactory, String params) {
-        super(channelFactory);
-
-        if (!StringUtils.isEmpty(params)) {
-            for (String param : params.split("&")) {
-                String[] paramElements = param.split("=");
-                String paramName = paramElements[0];
-                if (paramElements.length == 2) {
-                    String paramValue = paramElements[1];
-                    switch (paramName) {
-                        case "slaveId": {
-                            slaveId = Short.parseShort(paramValue);
-                        }
-                        default:
-                            logger.debug("Unknown parameter {} with value {}", paramName, paramValue);
-                    }
-                } else {
-                    logger.debug("Unknown no-value parameter {}", paramName);
-                }
-            }
-        }
-    }
-
-    @Override
-    public boolean canRead() {
-        return true;
-    }
-
-    @Override
-    public boolean canWrite() {
-        return true;
-    }
-
-    @Override
-    public PlcReadRequest.Builder readRequestBuilder() {
-        return new DefaultPlcReadRequest.Builder(this, new ModbusPlcFieldHandler());
-    }
-
-    @Override
-    public PlcWriteRequest.Builder writeRequestBuilder() {
-        return new DefaultPlcWriteRequest.Builder(this, new ModbusPlcFieldHandler());
-    }
-
-    @Override
-    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
-        CompletableFuture<InternalPlcReadResponse> future = new CompletableFuture<>();
-        PlcRequestContainer<InternalPlcReadRequest, InternalPlcReadResponse> container =
-            new PlcRequestContainer<>((InternalPlcReadRequest) readRequest, future);
-        channel.writeAndFlush(container).addListener(f -> {
-            if (!f.isSuccess()) {
-                future.completeExceptionally(f.cause());
-            }
-        });
-        return future
-            .thenApply(PlcReadResponse.class::cast);
-    }
-
-    @Override
-    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
-        CompletableFuture<InternalPlcWriteResponse> future = new CompletableFuture<>();
-        PlcRequestContainer<InternalPlcWriteRequest, InternalPlcWriteResponse> container =
-            new PlcRequestContainer<>((InternalPlcWriteRequest) writeRequest, future);
-        channel.writeAndFlush(container).addListener(f -> {
-            if (!f.isSuccess()) {
-                future.completeExceptionally(f.cause());
-            }
-        });
-        return future
-            .thenApply(PlcWriteResponse.class::cast);
-    }
-
-    public short getSlaveId() {
-        return slaveId;
-    }
-
-}
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactory.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactory.java
deleted file mode 100644
index bf23c5d..0000000
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactory.java
+++ /dev/null
@@ -1,40 +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.modbus.connection;
-
-import java.net.InetAddress;
-import java.util.Objects;
-
-public class ModbusConnectionFactory {
-
-    public ModbusTcpPlcConnection modbusTcpPlcConnectionOf(InetAddress address, Integer port, String params) {
-        Objects.requireNonNull(address);
-
-        if (port == null) {
-            return ModbusTcpPlcConnection.of(address, params);
-        } else {
-            return ModbusTcpPlcConnection.of(address, port, params);
-        }
-    }
-
-    public ModbusSerialPlcConnection modbusSerialPlcConnectionOf(String serialPort, String params) {
-        Objects.requireNonNull(serialPort);
-        return ModbusSerialPlcConnection.of(serialPort, params);
-    }
-}
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
deleted file mode 100644
index 0e13b16..0000000
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
+++ /dev/null
@@ -1,47 +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.modbus.connection;
-
-import io.netty.channel.ChannelHandler;
-import org.apache.commons.lang3.NotImplementedException;
-import org.apache.plc4x.java.transport.serial.SerialChannelFactory;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.CompletableFuture;
-
-public class ModbusSerialPlcConnection extends BaseModbusPlcConnection {
-
-    private static final Logger logger = LoggerFactory.getLogger(ModbusSerialPlcConnection.class);
-
-    private ModbusSerialPlcConnection(String port, String params) {
-        super(new SerialChannelFactory(port), params);
-        logger.info("Configured ModbusSerialPlcConnection with: serial-port {}", port);
-    }
-
-    public static ModbusSerialPlcConnection of(String serialPort, String params) {
-        return new ModbusSerialPlcConnection(serialPort, params);
-    }
-
-    @Override
-    protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
-        throw new NotImplementedException("Not implemented yet");
-    }
-
-}
diff --git a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
deleted file mode 100644
index bc1cc2f..0000000
--- a/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
+++ /dev/null
@@ -1,80 +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.modbus.connection;
-
-import com.digitalpetri.modbus.codec.ModbusRequestEncoder;
-import com.digitalpetri.modbus.codec.ModbusResponseDecoder;
-import com.digitalpetri.modbus.codec.ModbusTcpCodec;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelInitializer;
-import org.apache.plc4x.java.spi.connection.ChannelFactory;
-import org.apache.plc4x.java.transport.tcp.TcpSocketChannelFactory;
-import org.apache.plc4x.java.spi.protocol.SingleItemToSingleRequestProtocol;
-import org.apache.plc4x.java.modbus.netty.Plc4XModbusProtocol;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetAddress;
-import java.util.concurrent.CompletableFuture;
-
-public class ModbusTcpPlcConnection extends BaseModbusPlcConnection {
-
-    private static final int MODBUS_TCP_PORT = 502;
-
-    private static final Logger logger = LoggerFactory.getLogger(ModbusTcpPlcConnection.class);
-
-    private ModbusTcpPlcConnection(InetAddress address, String params) {
-        this(new TcpSocketChannelFactory(address, MODBUS_TCP_PORT), params);
-        logger.info("Configured ModbusTcpPlcConnection with: host-name {}", address.getHostAddress());
-    }
-
-    public ModbusTcpPlcConnection(InetAddress address, int port, String params) {
-        this(new TcpSocketChannelFactory(address, port), params);
-        logger.info("Configured ModbusTcpPlcConnection with: host-name {}", address.getHostAddress());
-    }
-
-    public ModbusTcpPlcConnection(ChannelFactory channelFactory, String params) {
-        super(channelFactory, params);
-    }
-
-    public static ModbusTcpPlcConnection of(InetAddress address, String params) {
-        return new ModbusTcpPlcConnection(address, params);
-    }
-
-    public static ModbusTcpPlcConnection of(InetAddress address, int port, String params) {
-        return new ModbusTcpPlcConnection(address, port, params);
-    }
-
-    @Override
-    protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
-        return new ChannelInitializer() {
-            @Override
-            protected void initChannel(Channel channel) {
-                channel.pipeline().addLast(new ModbusTcpCodec(new ModbusRequestEncoder(), new ModbusResponseDecoder()));
-                channel.pipeline().addLast(new Plc4XModbusProtocol(getSlaveId()));
-                channel.pipeline().addLast(new SingleItemToSingleRequestProtocol(ModbusTcpPlcConnection.this, ModbusTcpPlcConnection.this, null, timer, null, false));
-            }
-        };
-    }
-
-    public InetAddress getRemoteAddress() {
-        return ((TcpSocketChannelFactory) channelFactory).getAddress();
-    }
-}
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusField.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldCoil.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldCoil.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldCoil.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldCoil.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldDiscreteInput.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldDiscreteInput.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldDiscreteInput.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldDiscreteInput.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHandler.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHandler.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHandler.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHandler.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHoldingRegister.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHoldingRegister.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHoldingRegister.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldHoldingRegister.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldInputRegister.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldInputRegister.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldInputRegister.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldInputRegister.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldMaskWriteRegister.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldMaskWriteRegister.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldMaskWriteRegister.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldMaskWriteRegister.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldRegister.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldRegister.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldRegister.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/field/ModbusFieldRegister.java
diff --git a/sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/protocol/ModbusProtocolLogic.java b/plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/protocol/ModbusProtocolLogic.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/main/java/org/apache/plc4x/java/modbus/protocol/ModbusProtocolLogic.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/protocol/ModbusProtocolLogic.java
diff --git a/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver b/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
index 8df2ee4..abed59a 100644
--- a/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
+++ b/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
@@ -16,4 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.plc4x.java.modbus.ModbusPlcDriver
+org.apache.plc4x.java.modbus.ModbusDriver
diff --git a/sandbox/test-java-modbus-driver/src/test/java/org/apache/plc4x/java/modbus/ModbusIOTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusIOTest.java
similarity index 100%
rename from sandbox/test-java-modbus-driver/src/test/java/org/apache/plc4x/java/modbus/ModbusIOTest.java
rename to plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusIOTest.java
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
deleted file mode 100644
index cfeface..0000000
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
+++ /dev/null
@@ -1,134 +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.modbus;
-
-
-import org.apache.plc4x.java.PlcDriverManager;
-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.api.exceptions.PlcRuntimeException;
-import org.apache.plc4x.java.mock.connection.tcp.TcpHexDumper;
-import org.apache.plc4x.java.modbus.connection.ModbusConnectionFactory;
-import org.apache.plc4x.java.modbus.connection.ModbusTcpPlcConnection;
-import org.junit.Rule;
-import org.junit.Test;
-
-import java.util.regex.Pattern;
-import java.util.stream.Stream;
-
-import static org.apache.plc4x.java.modbus.ModbusPlcDriver.INET_ADDRESS_PATTERN;
-import static org.apache.plc4x.java.modbus.ModbusPlcDriver.SERIAL_PATTERN;
-import static org.hamcrest.Matchers.is;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-import static org.mockito.Mockito.mock;
-
-public class ModbusPlcDriverTest {
-
-    @Rule
-    public TcpHexDumper tcpHexDumper = new TcpHexDumper(0, 2);
-
-    @Test
-    public void testModbusAddressPattern() {
-        assertMatching(INET_ADDRESS_PATTERN, "tcp://localhost");
-        assertMatching(INET_ADDRESS_PATTERN, "tcp://localhost:3131");
-        assertMatching(INET_ADDRESS_PATTERN, "tcp://www.google.de");
-        assertMatching(INET_ADDRESS_PATTERN, "tcp://www.google.de:443");
-
-        assertMatching(SERIAL_PATTERN, "serial:///dev/com1");
-        assertMatching(SERIAL_PATTERN, "serial://COM1");
-        assertMatching(SERIAL_PATTERN, "serial:///dev/ttyUSB0");
-    }
-
-    @Test
-    public void testDriverWithCompleteUrls() {
-        ModbusPlcDriver SUT = new ModbusPlcDriver(mock(ModbusConnectionFactory.class));
-        Stream.of(
-            "modbus:tcp://localhost",
-            "modbus:tcp://localhost:443",
-            "modbus:serial:///dev/com1",
-            "modbus:serial://COM1",
-            "modbus:serial:///dev/ttyUSB0"
-        ).forEach(url -> {
-            try {
-                SUT.connect(url);
-            } catch (PlcConnectionException e) {
-                throw new PlcRuntimeException(e);
-            }
-        });
-    }
-
-    private void assertMatching(Pattern pattern, String match) {
-        if (!pattern.matcher(match).matches()) {
-            fail(pattern + "doesn't match " + match);
-        }
-    }
-
-    @Test
-    public void getConnection() throws Exception {
-        ModbusTcpPlcConnection modbusConnection = (ModbusTcpPlcConnection)
-            new PlcDriverManager().getConnection("modbus:tcp://localhost:" + tcpHexDumper.getPort());
-        assertThat(modbusConnection.getSlaveId(), is((short) 0));
-        modbusConnection.close();
-    }
-
-    @Test
-    public void getConnectionWithSlaveId() throws Exception {
-        ModbusTcpPlcConnection modbusConnection = (ModbusTcpPlcConnection)
-            new PlcDriverManager().getConnection("modbus:tcp://localhost:" + tcpHexDumper.getPort() + "?slaveId=42");
-        assertThat(modbusConnection.getSlaveId(), is((short) 42));
-        modbusConnection.close();
-    }
-
-    @Test(expected = PlcConnectionException.class)
-    public void getConnectionNoAuthSupported() throws Exception {
-        new PlcDriverManager().getConnection("modbus:tcp://localhost:" + tcpHexDumper.getPort(),
-            new PlcUsernamePasswordAuthentication("admin", "admin"));
-    }
-
-    @Test(expected = PlcConnectionException.class)
-    public void getConnectionUnknownHost() throws Exception {
-        new PlcDriverManager().getConnection("modbus:tcp://IHopeThisHostDoesntExistAAAAAAAAhhhhhhh:8080");
-    }
-
-    @Test(expected = PlcConnectionException.class)
-    public void getConnectionUnknownPort() throws Exception {
-        new PlcDriverManager().getConnection("modbus:tcp://localhost:unknown");
-    }
-
-    /**
-     * In this test case the 'modbus' driver should report an invalid url format.
-     *
-     * @throws PlcException something went wrong
-     */
-    @Test(expected = PlcConnectionException.class)
-    public void getConnectionInvalidUrl() throws PlcException {
-        new PlcDriverManager().getConnection("modbus:tcp://localhost/hurz/2");
-    }
-
-    @Test
-    public void getProtocol() {
-        ModbusPlcDriver driver = new ModbusPlcDriver();
-        assertThat(driver.getProtocolCode(), is("modbus"));
-        assertThat(driver.getProtocolName(), is("Modbus (TCP / Serial)"));
-    }
-
-
-}
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java
deleted file mode 100644
index 3b989fc..0000000
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.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.modbus.connection;
-
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelHandler;
-import io.netty.util.concurrent.Future;
-import io.netty.util.concurrent.GenericFutureListener;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.spi.connection.ChannelFactory;
-import org.apache.plc4x.java.spi.messages.InternalPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcWriteRequest;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.Answers;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.Assert.assertNotNull;
-import static org.junit.Assert.fail;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
-
-@RunWith(MockitoJUnitRunner.class)
-@SuppressWarnings("unchecked")
-public class BaseModbusPlcConnectionTest {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(BaseModbusPlcConnectionTest.class);
-
-    private BaseModbusPlcConnection SUT;
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private ChannelFactory channelFactory;
-
-    @Mock(answer = Answers.RETURNS_DEEP_STUBS)
-    private Channel channel;
-
-    @Before
-    public void setUp() throws Exception {
-        SUT = new BaseModbusPlcConnection(channelFactory, null) {
-            @Override
-            protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
-                return null;
-            }
-        };
-
-        when(channelFactory.createChannel(any())).thenReturn(channel);
-
-        SUT.connect();
-    }
-
-    @Test
-    public void lazyConstructor() {
-        new BaseModbusPlcConnection(channelFactory, null) {
-            @Override
-            protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
-                return null;
-            }
-        };
-    }
-
-    @Test
-    public void read() {
-        CompletableFuture<PlcReadResponse> read = SUT.read(mock(InternalPlcReadRequest.class));
-        assertNotNull(read);
-
-        simulatePipelineError(() -> SUT.read(mock(InternalPlcReadRequest.class)));
-    }
-
-    @Test
-    public void write() {
-        CompletableFuture<PlcWriteResponse> write = SUT.write(mock(InternalPlcWriteRequest.class));
-        assertNotNull(write);
-
-        simulatePipelineError(() -> SUT.write(mock(InternalPlcWriteRequest.class)));
-    }
-
-    public void simulatePipelineError(FutureProducingTestRunnable futureProducingTestRunnable) {
-        ChannelFuture channelFuture = mock(ChannelFuture.class);
-        // Simulate error in the pipeline
-        when(channelFuture.addListener(any())).thenAnswer(invocation -> {
-            Future future = mock(Future.class);
-            when(future.isSuccess()).thenReturn(false);
-            when(future.cause()).thenReturn(new DummyException());
-            GenericFutureListener genericFutureListener = invocation.getArgument(0);
-            genericFutureListener.operationComplete(future);
-            return mock(ChannelFuture.class);
-        });
-        when(channel.writeAndFlush(any())).thenReturn(channelFuture);
-        assertThrows(DummyException.class, () -> {
-            CompletableFuture completableFuture = futureProducingTestRunnable.run();
-            try {
-                completableFuture.get(3, TimeUnit.SECONDS);
-                fail("Should have thrown a ExecutionException");
-            } catch (ExecutionException e) {
-                if (e.getCause() instanceof DummyException) {
-                    throw (DummyException) e.getCause();
-                }
-                throw e;
-            }
-        });
-    }
-
-    @Test
-    public void testToString() {
-        String s = SUT.toString();
-        assertNotNull(s);
-    }
-
-    /**
-     * Variant of {@link Runnable} which adds a {@code throws Exception} to the {@code run} signature.
-     */
-    private interface TestRunnable {
-        /**
-         * @throws Exception when the test throws a exception.
-         * @see Runnable#run()
-         */
-        void run() throws Exception;
-    }
-
-    private static class DummyException extends Exception {
-
-    }
-
-    @FunctionalInterface
-    private interface FutureProducingTestRunnable {
-        CompletableFuture run() throws Exception;
-    }
-}
\ No newline at end of file
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
deleted file mode 100644
index 1b6f01d..0000000
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
+++ /dev/null
@@ -1,95 +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.modbus.connection;
-
-import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.plc4x.java.spi.connection.NettyPlcConnection;
-import org.apache.plc4x.java.transport.serial.SerialChannelFactory;
-import org.apache.plc4x.java.transport.tcp.TcpSocketChannelFactory;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.mockito.InjectMocks;
-import org.mockito.Mock;
-import org.mockito.junit.MockitoJUnitRunner;
-
-import java.net.InetAddress;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-@RunWith(MockitoJUnitRunner.class)
-public class ModbusConnectionFactoryTest {
-
-    @InjectMocks
-    private ModbusConnectionFactory SUT;
-
-    @Mock
-    private InetAddress inetAddress;
-
-
-    @Test
-    public void modbusTcpPlcConnectionOf() throws Exception {
-        {
-            assertThrows(NullPointerException.class, () -> SUT.modbusTcpPlcConnectionOf(null, null, null));
-        }
-        {
-            ModbusTcpPlcConnection modbusTcpPlcConnection = SUT.modbusTcpPlcConnectionOf(inetAddress, null, null);
-            assertGeneratedPort(modbusTcpPlcConnection);
-        }
-        {
-            ModbusTcpPlcConnection modbusTcpPlcConnection = SUT.modbusTcpPlcConnectionOf(inetAddress, 13, null);
-            assertEquals(inetAddress, modbusTcpPlcConnection.getRemoteAddress());
-            assertPort(modbusTcpPlcConnection, 13);
-        }
-        {
-            ModbusTcpPlcConnection modbusTcpPlcConnection = SUT.modbusTcpPlcConnectionOf(inetAddress, null, "xyz");
-            assertEquals(inetAddress, modbusTcpPlcConnection.getRemoteAddress());
-            assertGeneratedPort(modbusTcpPlcConnection);
-        }
-    }
-
-    public void assertGeneratedPort(ModbusTcpPlcConnection modbusTcpPlcConnection) throws Exception {
-        assertPort(modbusTcpPlcConnection, 502);
-    }
-
-    public void assertPort(ModbusTcpPlcConnection modbusTcpPlcConnection, int port) throws Exception {
-        TcpSocketChannelFactory channelFactory = (TcpSocketChannelFactory) FieldUtils
-            .getDeclaredField(NettyPlcConnection.class, "channelFactory", true)
-            .get(modbusTcpPlcConnection);
-        assertEquals(port, channelFactory.getPort());
-    }
-
-    @Test
-    public void modbusSerialPlcConnectionOf() throws Exception {
-        {
-            assertThrows(NullPointerException.class, () -> SUT.modbusSerialPlcConnectionOf(null, null));
-        }
-        {
-            ModbusSerialPlcConnection modbusSerialPlcConnection = SUT.modbusSerialPlcConnectionOf("/dev/ttyS01", null);
-            assertPort(modbusSerialPlcConnection, "/dev/ttyS01");
-        }
-    }
-
-    public void assertPort(ModbusSerialPlcConnection modbusSerialPlcConnection, String serialPort) throws Exception {
-        SerialChannelFactory channelFactory = (SerialChannelFactory) FieldUtils
-            .getDeclaredField(NettyPlcConnection.class, "channelFactory", true)
-            .get(modbusSerialPlcConnection);
-        assertEquals(serialPort, channelFactory.getSerialPort());
-    }
-}
\ No newline at end of file
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
deleted file mode 100644
index e221ae4..0000000
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
+++ /dev/null
@@ -1,217 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-   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.modbus.connection;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.embedded.EmbeddedChannel;
-import org.apache.commons.lang3.reflect.FieldUtils;
-import org.apache.commons.lang3.reflect.MethodUtils;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.spi.connection.NettyPlcConnection;
-import org.apache.plc4x.java.transport.serial.SerialChannelFactory;
-import org.apache.plc4x.java.transport.serial.SerialSocketAddress;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.lang.reflect.Field;
-import java.lang.reflect.InvocationTargetException;
-import java.util.Arrays;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-
-import static org.junit.Assert.assertNotNull;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.Mockito.doReturn;
-import static org.mockito.Mockito.spy;
-
-@Ignore("Not yet implemented in modbus")
-public class ModbusSerialPlcConnectionTest {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ModbusSerialPlcConnectionTest.class);
-
-    private ModbusSerialPlcConnection SUT;
-
-    @Before
-    public void setUp() {
-        SUT = ModbusSerialPlcConnection.of("/dev/tty0", null);
-    }
-
-    @After
-    public void tearDown() {
-        SUT = null;
-    }
-
-    @Test
-    public void testRead() throws Exception {
-        prepareSerialSimulator();
-        PlcReadRequest readRequest = SUT.readRequestBuilder().addItem("randomRead", "0/0").build();
-        CompletableFuture<PlcReadResponse> read = SUT.read(readRequest);
-        PlcReadResponse plcReadResponse = read.get(30, TimeUnit.SECONDS);
-        assertNotNull(plcReadResponse);
-    }
-
-    private void prepareSerialSimulator() throws Exception {
-        Field channelFactoryField = FieldUtils.getField(NettyPlcConnection.class, "channelFactory", true);
-        SerialChannelFactory serialChannelFactory = (SerialChannelFactory) channelFactoryField.get(SUT);
-        SerialChannelFactory serialChannelFactorySpied = spy(serialChannelFactory);
-        EmbeddedChannel embeddedChannel = new EmbeddedChannel(SUT.getChannelHandler(null));
-        embeddedChannel.connect(new SerialSocketAddress("/dev/tty0"));
-        doReturn(embeddedChannel).when(serialChannelFactorySpied).createChannel(any());
-        channelFactoryField.set(SUT, serialChannelFactorySpied);
-        SUT.connect();
-        new SerialSimulator(embeddedChannel).start();
-    }
-
-    private class SerialSimulator extends Thread {
-
-        private EmbeddedChannel embeddedChannel;
-
-        private SimulatorState state = SimulatorState.RECEIVE_REQUEST;
-
-        private byte[] currentInvokeId = new byte[0];
-
-        public SerialSimulator(EmbeddedChannel embeddedChannel) {
-            super("Serial Simulator");
-            this.embeddedChannel = embeddedChannel;
-        }
-
-        @Override
-        public void run() {
-            while (true) {
-                LOGGER.trace("in state {}. CurrentInvokeId: {}", state, currentInvokeId);
-                switch (state) {
-                    // Receiving state
-                    case RECEIVE_REQUEST: {
-                        LOGGER.info("Waiting for normal message");
-                        ByteBuf outputBuffer;
-                        while ((outputBuffer = embeddedChannel.readOutbound()) == null) {
-                            LOGGER.trace("No buffer available yet");
-                            if (!trySleep()) {
-                                return;
-                            }
-                        }
-                        // TODO
-                        int headerBytes = 4711;
-                        LOGGER.info("Skipping " + headerBytes + " bytes");
-                        outputBuffer.skipBytes(headerBytes);
-                        short dataLength = outputBuffer.readUnsignedByte();
-                        LOGGER.info("Expect at least " + dataLength + "bytes");
-                        while (outputBuffer.readableBytes() < dataLength) {
-                            if (!trySleep()) {
-                                return;
-                            }
-                        }
-                        byte[] bytes = new byte[dataLength];
-                        LOGGER.info("Read " + dataLength + "bytes. Having " + outputBuffer.readableBytes() + "bytes");
-                        outputBuffer.readBytes(bytes);
-                        currentInvokeId = Arrays.copyOfRange(bytes, 28, 32);
-                        // TODO
-                        outputBuffer.skipBytes(4711);
-                        LOGGER.info("Wrote Inbound");
-                        state = SimulatorState.ACK_MESSAGE;
-                        if (!trySleep()) {
-                            return;
-                        }
-                    }
-                    break;
-                    case ACK_MESSAGE: {
-                        // TODO
-                        ByteBuf byteBuf = Unpooled.buffer();
-                        try {
-                            MethodUtils.invokeMethod(byteBuf, true, "setRefCnt", 2);
-                        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-                            throw new RuntimeException(e);
-                        }
-                        embeddedChannel.writeOneInbound(byteBuf);
-                        LOGGER.info("Acked Message");
-                        state = SimulatorState.SEND_RESPONSE;
-                    }
-                    case SEND_RESPONSE: {
-                        LOGGER.info("Sending data message");
-                        //TODO:
-                        ByteBuf byteBuf = Unpooled.buffer();
-                        try {
-                            MethodUtils.invokeMethod(byteBuf, true, "setRefCnt", 2);
-                        } catch (NoSuchMethodException | IllegalAccessException | InvocationTargetException e) {
-                            throw new RuntimeException(e);
-                        }
-                        embeddedChannel.writeOneInbound(byteBuf);
-                        LOGGER.info("Wrote Inbound");
-                        state = SimulatorState.WAIT_FOR_ACK;
-                        if (!trySleep()) {
-                            return;
-                        }
-                    }
-                    break;
-                    case WAIT_FOR_ACK: {
-                        LOGGER.info("Waiting for ack message");
-                        ByteBuf outputBuffer;
-                        while ((outputBuffer = embeddedChannel.readOutbound()) == null) {
-                            if (!trySleep()) {
-                                return;
-                            }
-                        }
-                        //TODO:
-                        int headerBytes = 4711;
-                        LOGGER.info("Skipping " + headerBytes + " bytes");
-                        outputBuffer.skipBytes(headerBytes);
-                        short dataLength = outputBuffer.readUnsignedByte();
-                        LOGGER.info("Expect " + dataLength + "bytes");
-                        state = SimulatorState.DONE;
-                        if (!trySleep()) {
-                            return;
-                        }
-                    }
-                    case DONE: {
-                        LOGGER.info("Plc is Done. Goodbye");
-                        return;
-                    }
-                    default:
-                        throw new IllegalStateException("Illegal state number" + state);
-                }
-            }
-
-        }
-
-        private boolean trySleep() {
-            try {
-                TimeUnit.MILLISECONDS.sleep(10);
-            } catch (InterruptedException e) {
-                e.printStackTrace();
-                Thread.currentThread().interrupt();
-                return false;
-            }
-            return true;
-        }
-    }
-
-    private enum SimulatorState {
-        RECEIVE_REQUEST,
-        ACK_MESSAGE,
-        SEND_RESPONSE,
-        WAIT_FOR_ACK,
-        DONE
-    }
-}
\ No newline at end of file
diff --git a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java b/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java
deleted file mode 100644
index 90b67f9..0000000
--- a/plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.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.modbus.connection;
-
-import io.netty.channel.Channel;
-import org.apache.commons.lang3.reflect.FieldUtils;
-import org.junit.After;
-import org.junit.Before;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetAddress;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Executors;
-
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-
-public class ModbusTcpPlcConnectionTests {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(ModbusTcpPlcConnectionTests.class);
-
-    private ModbusTcpPlcConnection SUT;
-
-    private Channel channelMock;
-
-    private ExecutorService executorService;
-
-    @Before
-    public void setUp() throws Exception {
-        SUT = ModbusTcpPlcConnection.of(InetAddress.getByName("localhost"), null);
-        channelMock = mock(Channel.class, RETURNS_DEEP_STUBS);
-        FieldUtils.writeField(SUT, "channel", channelMock, true);
-        executorService = Executors.newFixedThreadPool(10);
-    }
-
-    @After
-    public void tearDown() {
-        executorService.shutdownNow();
-        SUT = null;
-    }
-
-}
\ No newline at end of file
diff --git a/sandbox/test-java-modbus-driver/src/test/resources/testsuite/ModbusTestsuite.xml b/plc4j/drivers/modbus/src/test/resources/testsuite/ModbusTestsuite.xml
similarity index 96%
rename from sandbox/test-java-modbus-driver/src/test/resources/testsuite/ModbusTestsuite.xml
rename to plc4j/drivers/modbus/src/test/resources/testsuite/ModbusTestsuite.xml
index 7befd30..a134e8e 100644
--- a/sandbox/test-java-modbus-driver/src/test/resources/testsuite/ModbusTestsuite.xml
+++ b/plc4j/drivers/modbus/src/test/resources/testsuite/ModbusTestsuite.xml
@@ -32,7 +32,7 @@
       <ModbusTcpADU className="org.apache.plc4x.java.modbus.readwrite.ModbusTcpADU">
         <transactionIdentifier>0</transactionIdentifier>
         <unitIdentifier>255</unitIdentifier>
-        <pdu className="org.apache.plc4x.java.modbus.readwrite.ModbusPDUReadDiscreteInputsRequest">
+        <pdu className="org.apache.plc4x.java.modbus.readwrite.ModbusPDUReadInputRegistersRequest">
           <startingAddress>2258</startingAddress>
           <quantity>2</quantity>
         </pdu>
@@ -51,7 +51,7 @@
       <ModbusTcpADU className="org.apache.plc4x.java.modbus.readwrite.ModbusTcpADU">
         <transactionIdentifier>31998</transactionIdentifier>
         <unitIdentifier>255</unitIdentifier>
-        <pdu className="org.apache.plc4x.java.modbus.readwrite.ModbusPDUReadDiscreteInputsResponse">
+        <pdu className="org.apache.plc4x.java.modbus.readwrite.ModbusPDUReadInputRegistersResponse">
           <value>AAAAAAAAAAAAAAAAAAAAAAAAAAAAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAABAAAABAAAAAAAAAAAAAAAAAAAAdsAAAHWAABKOAAAAAAAAAAA
 AAAAAAAAAAAAAAAAAAAAAAAAAAAAAGRhaW0AbgAAAAAAAAAAAAAAAAAAMDEAMAAAAAAAAAAAAAAA
diff --git a/plc4j/drivers/pom.xml b/plc4j/drivers/pom.xml
index 5fc0404..f0e7cb1 100644
--- a/plc4j/drivers/pom.xml
+++ b/plc4j/drivers/pom.xml
@@ -39,9 +39,9 @@
     <module>ethernet-ip</module-->
     <module>knxnetip</module>
     <module>mock</module>
-    <!--module>modbus</module>
+    <module>modbus</module>
     <module>s7</module>
-	  <module>opcua</module-->
+	  <!--module>opcua</module-->
     <module>simulated</module>
   </modules>
 
diff --git a/plc4j/drivers/s7/README.md b/plc4j/drivers/s7/README.md
deleted file mode 100644
index 048dcc5..0000000
--- a/plc4j/drivers/s7/README.md
+++ /dev/null
@@ -1,33 +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.
-
--->
-# S7 Driver
-
-## Siemens LOGO
-
-The S7 driver supports communication with Siemens LOGO devices, if the S7 communication is enabled.
-
-However the implementation seems to be not as advanced as the normal S7 devices. 
-In case of an unexpected message, the PLC doesn't resond with an error message, but it just closes the connection without and error message.
-Therefore we need to provide the type of controller as part of the connection string.
-
-A valid Siemens LOGO connection string looks as follows:
-
-   s7://10.10.64.21/0/0?controller-type=LOGO
-   
-By specifying the controller-type, the driver doesn't try to read the CPU Services Data. 
\ No newline at end of file
diff --git a/plc4j/drivers/s7/pom.xml b/plc4j/drivers/s7/pom.xml
index cdd9e25..e23aa13 100644
--- a/plc4j/drivers/s7/pom.xml
+++ b/plc4j/drivers/s7/pom.xml
@@ -18,7 +18,6 @@
   under the License.
   -->
 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
@@ -28,8 +27,41 @@
   </parent>
 
   <artifactId>plc4j-driver-s7</artifactId>
-  <name>PLC4J: Driver: S7</name>
-  <description>Implementation of a PLC4X driver able to speak with S7 devices using the S7 protocol.</description>
+  <name>PLC4J: Driver: S7 (Step7)</name>
+  <description>Implementation of a PLC4X driver for the classic Step7 S7 protocol.</description>
+
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.plc4x.plugins</groupId>
+        <artifactId>plc4x-maven-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>generate-driver</id>
+            <phase>generate-sources</phase>
+            <goals>
+              <goal>generate-driver</goal>
+            </goals>
+            <configuration>
+              <protocolName>s7</protocolName>
+              <languageName>java</languageName>
+              <outputFlavor>read-write</outputFlavor>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4x-build-utils-language-java</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4x-protocols-s7</usedDependency>
+          </usedDependencies>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
 
   <dependencies>
     <dependency>
@@ -45,100 +77,60 @@
 
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-iso-on-tcp</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-iso-tp</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-transport-tcp</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
 
     <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-common</artifactId>
+      <groupId>com.fasterxml.jackson.core</groupId>
+      <artifactId>jackson-annotations</artifactId>
     </dependency>
     <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-transport</artifactId>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
     <dependency>
       <groupId>io.netty</groupId>
       <artifactId>netty-buffer</artifactId>
     </dependency>
-
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-configuration2</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
+      <groupId>io.vavr</groupId>
+      <artifactId>vavr</artifactId>
     </dependency>
+
     <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
+      <groupId>org.osgi</groupId>
+      <artifactId>osgi.cmpn</artifactId>
+      <version>6.0.0</version>
+      <scope>provided</scope>
     </dependency>
 
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-transport-test</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>test</scope>
-    </dependency-->
     <dependency>
-      <groupId>org.pcap4j</groupId>
-      <artifactId>pcap4j-core</artifactId>
+      <groupId>commons-codec</groupId>
+      <artifactId>commons-codec</artifactId>
       <scope>test</scope>
     </dependency>
+
     <dependency>
-      <groupId>org.pcap4j</groupId>
-      <artifactId>pcap4j-packetfactory-static</artifactId>
-      <scope>test</scope>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4x-build-utils-language-java</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <!-- Scope is 'provided' as this way it's not shipped with the driver -->
+      <scope>provided</scope>
     </dependency>
+
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-utils-test-utils</artifactId>
+      <artifactId>plc4x-protocols-s7</artifactId>
       <version>0.7.0-SNAPSHOT</version>
-      <scope>test</scope>
+      <!-- Scope is 'provided' as this way it's not shipped with the driver -->
+      <scope>provided</scope>
     </dependency>
     <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <version>1.12</version>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.osgi</groupId>
-      <artifactId>osgi.cmpn</artifactId>
-      <version>6.0.0</version>
-      <scope>provided</scope>
-    </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies combine.children="append">
-            <usedDependency>org.pcap4j:pcap4j-packetfactory-static</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
\ No newline at end of file
+</project>
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/S7PlcDriver.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/S7PlcDriver.java
deleted file mode 100644
index 4780e34..0000000
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/S7PlcDriver.java
+++ /dev/null
@@ -1,83 +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.s7;
-
-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.s7.connection.S7PlcConnection;
-import org.apache.plc4x.java.api.PlcDriver;
-import org.osgi.service.component.annotations.Component;
-
-import java.net.InetAddress;
-import java.net.UnknownHostException;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-/**
- * Implementation of the S7 protocol, based on:
- * - S7 Protocol
- * - ISO Transport Protocol (Class 0) (https://tools.ietf.org/html/rfc905)
- * - ISO on TCP (https://tools.ietf.org/html/rfc1006)
- * - TCP
- */
-@Component(service = PlcDriver.class, immediate = true)
-public class S7PlcDriver implements PlcDriver {
-
-    private static final Pattern S7_URI_PATTERN = Pattern.compile("^s7://(?<host>.*)/(?<rack>\\d{1,4})/(?<slot>\\d{1,4})(?<params>\\?.*)?");
-
-    @Override
-    public String getProtocolCode() {
-        return "s7";
-    }
-
-    @Override
-    public String getProtocolName() {
-        return "Siemens S7 (Basic)";
-    }
-
-    @Override
-    public PlcConnection connect(String url) throws PlcConnectionException {
-        Matcher matcher = S7_URI_PATTERN.matcher(url);
-        if (!matcher.matches()) {
-            throw new PlcConnectionException(
-                "Connection url doesn't match the format 's7://{host|ip}/{rack}/{slot}'");
-        }
-        String host = matcher.group("host");
-
-        int rack = Integer.parseInt(matcher.group("rack"));
-        int slot = Integer.parseInt(matcher.group("slot"));
-        String params = matcher.group("params") != null ? matcher.group("params").substring(1) : null;
-
-        try {
-            InetAddress serverInetAddress = InetAddress.getByName(host);
-            return new S7PlcConnection(serverInetAddress, rack, slot, params);
-        } catch (UnknownHostException e) {
-            throw new PlcConnectionException("Error parsing address", e);
-        } catch (Exception e) {
-            throw new PlcConnectionException("Error connecting to host", e);
-        }
-    }
-
-    @Override
-    public PlcConnection connect(String url, PlcAuthentication authentication) throws PlcConnectionException {
-        throw new PlcConnectionException("Basic S7 connections don't support authentication.");
-    }
-
-}
diff --git a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
deleted file mode 100644
index 0dfcc74..0000000
--- a/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
+++ /dev/null
@@ -1,315 +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.s7.connection;
-
-import io.netty.buffer.Unpooled;
-import io.netty.channel.*;
-import org.apache.commons.configuration2.Configuration;
-import org.apache.commons.configuration2.SystemConfiguration;
-import org.apache.commons.lang3.StringUtils;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.s7.model.S7Field;
-import org.apache.plc4x.java.s7.netty.Plc4XS7Protocol;
-import org.apache.plc4x.java.s7.netty.S7Protocol;
-import org.apache.plc4x.java.s7.netty.strategies.DefaultS7MessageProcessor;
-import org.apache.plc4x.java.s7.netty.util.S7PlcFieldHandler;
-import org.apache.plc4x.java.s7.types.S7ControllerType;
-import org.apache.plc4x.java.s7.utils.S7TsapIdEncoder;
-import org.apache.plc4x.java.spi.connection.ChannelFactory;
-import org.apache.plc4x.java.spi.connection.NettyPlcConnection;
-import org.apache.plc4x.java.spi.messages.*;
-import org.apache.plc4x.java.transport.tcp.TcpSocketChannelFactory;
-import org.apache.plc4x.java.spi.events.ConnectEvent;
-import org.apache.plc4x.java.spi.events.ConnectedEvent;
-import org.apache.plc4x.java.isoontcp.protocol.IsoOnTcpProtocol;
-import org.apache.plc4x.java.isotp.protocol.IsoTPProtocol;
-import org.apache.plc4x.java.isotp.protocol.model.tpdus.DisconnectRequestTpdu;
-import org.apache.plc4x.java.isotp.protocol.model.types.DeviceGroup;
-import org.apache.plc4x.java.isotp.protocol.model.types.DisconnectReason;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduSize;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.net.InetAddress;
-import java.util.Collections;
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.TimeUnit;
-import java.util.concurrent.TimeoutException;
-
-/**
- * Class implementing the Connection handling for Siemens S7.
- * The adressing of Values in S7 works as follows:
- * <p>
- * For adressing values from Datablocks the following syntax is used:
- * <pre>
- *     DATA_BLOCKS/{blockNumer}/{byteOffset}
- * </pre>
- * <p>
- * For adressing data from other memory segments like I/O, Markers, ...
- * <pre>
- *     {memory area}/{byte offset}
- *     or
- *     {memory area}/{byte offset}/{bit offset}
- * </pre>
- * where the {bit-offset} is optional.
- * All Available Memory Areas for this mode are defined in the MemoryArea enum.
- */
-public class S7PlcConnection extends NettyPlcConnection implements PlcReader, PlcWriter {
-
-    private static final int ISO_ON_TCP_PORT = 102;
-
-    // Fetch values from configuration
-    private static final Configuration CONF = new SystemConfiguration();
-    private static final long CLOSE_DEVICE_TIMEOUT_MS = CONF.getLong("plc4x.s7connection.close.device,timeout", 1_000);
-
-    private static final Logger logger = LoggerFactory.getLogger(S7PlcConnection.class);
-
-    private final int rack;
-    private final int slot;
-
-    private final short paramPduSize;
-    private final short paramMaxAmqCaller;
-    private final short paramMaxAmqCallee;
-    private final S7ControllerType paramControllerType;
-
-    public S7PlcConnection(InetAddress address, int rack, int slot, String params) {
-        this(new TcpSocketChannelFactory(address, ISO_ON_TCP_PORT), rack, slot, params);
-
-        logger.info("Setting up S7 Connection with: host-name {}, rack {}, slot {}, pdu-size {}, max-amq-caller {}, " +
-                "max-amq-callee {}", address.getHostAddress(), rack, slot,
-            paramPduSize, paramMaxAmqCaller, paramMaxAmqCallee);
-    }
-
-    public S7PlcConnection(ChannelFactory channelFactory, int rack, int slot, String params) {
-        super(channelFactory, true);
-
-        this.rack = rack;
-        this.slot = slot;
-
-        short curParamPduSize = 1024;
-        short curParamMaxAmqCaller = 8;
-        short curParamMaxAmqCallee = 8;
-        S7ControllerType curParamControllerType = S7ControllerType.ANY;
-
-        if (!StringUtils.isEmpty(params)) {
-            for (String param : params.split("&")) {
-                String[] paramElements = param.split("=");
-                String paramName = paramElements[0];
-                if (paramElements.length == 2) {
-                    String paramValue = paramElements[1];
-                    switch (paramName) {
-                        case "pdu-size":
-                            curParamPduSize = Short.parseShort(paramValue);
-                            break;
-                        case "max-amq-caller":
-                            curParamMaxAmqCaller = Short.parseShort(paramValue);
-                            break;
-                        case "max-amq-callee":
-                            curParamMaxAmqCallee = Short.parseShort(paramValue);
-                            break;
-                        case "controller-type":
-                            curParamControllerType = S7ControllerType.valueOf(paramValue);
-                            break;
-                        default:
-                            logger.debug("Unknown parameter {} with value {}", paramName, paramValue);
-                    }
-                } else {
-                    logger.debug("Unknown no-value parameter {}", paramName);
-                }
-            }
-        }
-
-        // It seems that the LOGO devices are a little picky about the pdu-size.
-        // Instead of handling this out, they just hang up without any error message.
-        // So in case of a LOGO controller, set this to a known working value.
-        if(curParamControllerType == S7ControllerType.LOGO && curParamPduSize == 1024) {
-            curParamPduSize = 480;
-        }
-
-        // IsoTP uses pre defined sizes. Find the smallest box,
-        // that would be able to contain the requested pdu size.
-        this.paramPduSize = curParamPduSize;
-        this.paramMaxAmqCaller = curParamMaxAmqCaller;
-        this.paramMaxAmqCallee = curParamMaxAmqCallee;
-        this.paramControllerType = curParamControllerType;
-    }
-
-    @Override
-    public boolean canRead() {
-        return true;
-    }
-
-    @Override
-    public boolean canWrite() {
-        return true;
-    }
-
-    @Override
-    protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
-        short calledTsapId = S7TsapIdEncoder.encodeS7TsapId(DeviceGroup.OS, rack, slot);
-        short callingTsapId = S7TsapIdEncoder.encodeS7TsapId(DeviceGroup.PG_OR_PC, 0, 0);
-
-        return new ChannelInitializer<Channel>() {
-            @Override
-            protected void initChannel(Channel channel) {
-                // Build the protocol stack for communicating with the s7 protocol.
-                ChannelPipeline pipeline = channel.pipeline();
-                pipeline.addLast(new ChannelInboundHandlerAdapter() {
-                    @Override
-                    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-                        if (evt instanceof ConnectedEvent) {
-                            sessionSetupCompleteFuture.complete(null);
-                        } else {
-                            super.userEventTriggered(ctx, evt);
-                        }
-                    }
-                });
-                pipeline.addLast(new IsoOnTcpProtocol());
-                pipeline.addLast(new IsoTPProtocol(callingTsapId, calledTsapId, TpduSize.valueForGivenSize(paramPduSize)));
-                pipeline.addLast(new S7Protocol(paramMaxAmqCaller, paramMaxAmqCallee, paramPduSize, paramControllerType,
-                    new DefaultS7MessageProcessor()));
-                pipeline.addLast(new Plc4XS7Protocol());
-            }
-        };
-    }
-
-    @Override
-    protected void sendChannelCreatedEvent() {
-        // Send an event to the pipeline telling the Protocol filters what's going on.
-        channel.pipeline().fireUserEventTriggered(new ConnectEvent());
-    }
-
-    @Override
-    public PlcField prepareField(String fieldQuery) throws PlcInvalidFieldException {
-        return S7Field.of(fieldQuery);
-    }
-
-    public int getRack() {
-        return rack;
-    }
-
-    public int getSlot() {
-        return slot;
-    }
-
-    public short getParamPduSize() {
-        return paramPduSize;
-    }
-
-    public int getParamMaxAmqCaller() {
-        return paramMaxAmqCaller;
-    }
-
-    public int getParamMaxAmqCallee() {
-        return paramMaxAmqCallee;
-    }
-
-    public S7ControllerType getParamControllerType() {
-        return paramControllerType;
-    }
-
-    @Override
-    public void close() throws PlcConnectionException {
-        if ((channel != null) && channel.isOpen()) {
-            // Send the PLC a message that the connection is being closed.
-            DisconnectRequestTpdu disconnectRequest = new DisconnectRequestTpdu(
-                (short) 0x0000, (short) 0x000F, DisconnectReason.NORMAL, Collections.emptyList(),
-                Unpooled.EMPTY_BUFFER);
-
-            // In case of an ISO TP Class 0 connection, the remote is usually expected to actively
-            // close the connection. So we add a listener waiting for this to happen.
-            CompletableFuture<Void> disconnectFuture = new CompletableFuture<>();
-            channel.closeFuture().addListener(
-                (ChannelFutureListener) future -> disconnectFuture.complete(null));
-
-            // Send the disconnect request.
-            channel.writeAndFlush(disconnectRequest);
-            // Wait for the configured time for the remote to close the session.
-            try {
-                disconnectFuture.get(CLOSE_DEVICE_TIMEOUT_MS, TimeUnit.MILLISECONDS);
-            }
-            // If the remote didn't close the connection within the given time-frame, we have to take
-            // care of closing the connection.
-            catch (TimeoutException e) {
-                logger.debug("Remote didn't close connection within the configured timeout of {} ms, shutting down actively.", CLOSE_DEVICE_TIMEOUT_MS, e);
-                channel.close();
-            } catch (InterruptedException e) {
-                Thread.currentThread().interrupt();
-            } catch (ExecutionException e) {
-                throw new PlcConnectionException(e);
-            }
-
-            // Do some additional cleanup operations ...
-            // In normal operation, the channels event loop has a parent, however when running with
-            // the embedded channel for unit tests, parent is null.
-            if (channel.eventLoop().parent() != null) {
-                channel.eventLoop().parent().shutdownGracefully();
-            }
-        }
-        super.close();
-    }
-
-    @Override
-    public PlcReadRequest.Builder readRequestBuilder() {
-        return new DefaultPlcReadRequest.Builder(this, new S7PlcFieldHandler());
-    }
-
-    @Override
-    public PlcWriteRequest.Builder writeRequestBuilder() {
-        return new DefaultPlcWriteRequest.Builder(this, new S7PlcFieldHandler());
-    }
-
-    @Override
-    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
-        InternalPlcReadRequest internalReadRequest = checkInternal(readRequest, InternalPlcReadRequest.class);
-        CompletableFuture<InternalPlcReadResponse> future = new CompletableFuture<>();
-        PlcRequestContainer<InternalPlcReadRequest, InternalPlcReadResponse> container =
-            new PlcRequestContainer<>(internalReadRequest, future);
-        channel.writeAndFlush(container).addListener(f -> {
-            if (!f.isSuccess()) {
-                future.completeExceptionally(f.cause());
-            }
-        });
-        return future
-            .thenApply(PlcReadResponse.class::cast);
-    }
-
-    @Override
-    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest writeRequest) {
-        InternalPlcWriteRequest internalWriteRequest = checkInternal(writeRequest, InternalPlcWriteRequest.class);
-        CompletableFuture<InternalPlcWriteResponse> future = new CompletableFuture<>();
-        PlcRequestContainer<InternalPlcWriteRequest, InternalPlcWriteResponse> container =
-            new PlcRequestContainer<>(internalWriteRequest, future);
-        channel.writeAndFlush(container).addListener(f -> {
-            if (!f.isSuccess()) {
-                future.completeExceptionally(f.cause());
-            }
-        });
-        return future
-            .thenApply(PlcWriteResponse.class::cast);
-    }
-
-}
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/S7Driver.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/configuration/S7Configuration.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7Field.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7PlcFieldHandler.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7PlcFieldHandler.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7PlcFieldHandler.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/field/S7PlcFieldHandler.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/DefaultS7MessageProcessor.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7MessageProcessor.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7MessageProcessor.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7MessageProcessor.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/optimizer/S7MessageProcessor.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/protocol/S7ProtocolLogic.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7ControllerType.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7ControllerType.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7ControllerType.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/types/S7ControllerType.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7TsapIdEncoder.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7TsapIdEncoder.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7TsapIdEncoder.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/readwrite/utils/S7TsapIdEncoder.java
diff --git a/sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java b/plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/utils/StaticHelper.java
diff --git a/plc4j/drivers/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver b/plc4j/drivers/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
index 0998600..728a544 100644
--- a/plc4j/drivers/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
+++ b/plc4j/drivers/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
@@ -16,4 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.plc4x.java.s7.S7PlcDriver
+org.apache.plc4x.java.s7.readwrite.S7Driver
diff --git a/plc4j/protocols/s7/src/test/resources/logback.xml b/plc4j/drivers/s7/src/main/resources/logback.xml
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/logback.xml
rename to plc4j/drivers/s7/src/main/resources/logback.xml
diff --git a/sandbox/test-java-s7-driver/src/test/java/BenchmarkGeneratedS7.java b/plc4j/drivers/s7/src/test/java/BenchmarkGeneratedS7.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/test/java/BenchmarkGeneratedS7.java
rename to plc4j/drivers/s7/src/test/java/BenchmarkGeneratedS7.java
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/BenchmarkS7.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/BenchmarkS7.java
deleted file mode 100644
index 85d97fd..0000000
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/BenchmarkS7.java
+++ /dev/null
@@ -1,89 +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.s7;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.channel.embedded.EmbeddedChannel;
-import org.apache.commons.codec.binary.Hex;
-import org.apache.plc4x.java.spi.PlcMessageToMessageCodec;
-import org.apache.plc4x.java.spi.messages.PlcRequestContainer;
-import org.apache.plc4x.java.isoontcp.protocol.IsoOnTcpProtocol;
-import org.apache.plc4x.java.isotp.protocol.IsoTPProtocol;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduSize;
-import org.apache.plc4x.java.s7.netty.S7Protocol;
-import org.apache.plc4x.java.s7.netty.model.messages.S7Message;
-import org.apache.plc4x.java.s7.types.S7ControllerType;
-
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-
-public class BenchmarkS7 {
-
-    public static void main(String[] args) throws Exception {
-        byte[] data = Hex.decodeHex("0300006702f080320100000001005600000407120a10060001032b84000160120a10020001032b840001a0120a10010001032b840001a9120a10050001032b84000150120a10020001032b84000198120a10040001032b84000140120a10020001032b84000190");
-        TimedMessageCodec timedMessageCodec = new TimedMessageCodec();
-        EmbeddedChannel channel = new EmbeddedChannel(
-            new IsoOnTcpProtocol(),
-            new IsoTPProtocol((short) 0, (short) 0, TpduSize.SIZE_512),
-            new S7Protocol((short) 1, (short) 1, (short) 512, S7ControllerType.S7_1500, null),
-            timedMessageCodec
-            );
-
-        long start = System.currentTimeMillis();
-        int numRuns = 20000;
-        for(int i = 0; i < numRuns; i++) {
-            run(data, channel, timedMessageCodec);
-        }
-        long end = System.currentTimeMillis();
-        System.out.println("Parsed " + numRuns + " packets in " + (end - start) + "ms");
-        System.out.println("That's " + ((float) (end - start) / numRuns) + "ms per packet");
-    }
-
-    public static void run(byte[] data, EmbeddedChannel channel, TimedMessageCodec timedMessageCodec) {
-        CompletableFuture<S7Message> future = new CompletableFuture<>();
-        timedMessageCodec.setFuture(future);
-        channel.writeInbound(Unpooled.wrappedBuffer(data));
-        try {
-            future.get();
-        } catch (Exception e) {
-            e.printStackTrace();
-        }
-    }
-
-    private static class TimedMessageCodec extends PlcMessageToMessageCodec<S7Message, PlcRequestContainer> {
-
-        CompletableFuture<S7Message> future;
-
-        public void setFuture(CompletableFuture<S7Message> future) {
-            this.future = future;
-        }
-
-        @Override
-        protected void encode(ChannelHandlerContext ctx, PlcRequestContainer msg, List<Object> out) throws Exception {
-
-        }
-
-        @Override
-        protected void decode(ChannelHandlerContext ctx, S7Message msg, List<Object> out) throws Exception {
-            future.complete(msg);
-        }
-    }
-
-}
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcDriverTest.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcDriverTest.java
deleted file mode 100644
index 76329e9..0000000
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcDriverTest.java
+++ /dev/null
@@ -1,81 +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.s7;
-
-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.s7.connection.S7PlcConnection;
-import org.apache.plc4x.test.FastTests;
-import org.junit.Ignore;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-public class S7PlcDriverTest {
-
-    @Test
-    @Category(FastTests.class)
-    public void getProtocolCode() {
-        assertThat(new S7PlcDriver().getProtocolCode(), equalTo("s7"));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void getProtocolName() {
-        assertThat(new S7PlcDriver().getProtocolName(), equalTo("Siemens S7 (Basic)"));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void getConnection() throws PlcException {
-        S7PlcConnection s7Connection = (S7PlcConnection) new S7PlcDriver().connect("s7://localhost/1/2");
-        assertThat(s7Connection.getRack(), equalTo(1));
-        assertThat(s7Connection.getSlot(), equalTo(2));
-    }
-
-    @Test(expected = PlcConnectionException.class)
-    @Category(FastTests.class)
-    @Ignore("This test tends to fail on systems with DNS providers that proivde default IPs")
-    public void getConnectionToUnknownHost() throws PlcException {
-        new S7PlcDriver().connect("s7://IHopeThisHostDoesntExistAAAAAAAAhhhhhhh/1/2");
-    }
-
-    /**
-     * In this test case the 's7' driver should report an invalid url format.
-     */
-    @Test(expected = PlcConnectionException.class)
-    @Category(FastTests.class)
-    public void getConnectionInvalidUrl() throws PlcConnectionException {
-        new S7PlcDriver().connect("s7://localhost/hurz/2");
-    }
-
-    /**
-     * In this test case the 's7' driver should report an error as this protocol
-     * doesn't support authentication.
-     */
-    @Test(expected = PlcConnectionException.class)
-    @Category(FastTests.class)
-    public void getConnectionWithAuthentication() throws PlcConnectionException {
-        new S7PlcDriver().connect("s7://localhost/1/2", new PlcUsernamePasswordAuthentication("user", "pass"));
-    }
-
-}
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionIT.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionIT.java
deleted file mode 100644
index 66d58d2..0000000
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionIT.java
+++ /dev/null
@@ -1,137 +0,0 @@
-/*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  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.s7.connection;
-
-import io.netty.channel.embedded.EmbeddedChannel;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-import org.apache.plc4x.test.RequirePcapNg;
-import org.junit.Rule;
-import org.junit.jupiter.api.*;
-import org.junit.rules.Timeout;
-
-import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.TimeUnit;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsNull.notNullValue;
-import static org.junit.Assert.assertThat;
-
-public class S7PlcConnectionIT {
-
-    @Rule
-    public Timeout globalTimeout = Timeout.seconds(4); // 4 seconds max per method tested
-
-    private S7PlcTestConnection SUT;
-
-    @BeforeEach
-    public void setUp() {
-        SUT = new S7PlcTestConnection(1, 2,
-            "pdu-size=128&max-amq-caller=2&max-amq-callee=3&unknown=parameter&unknown-flag");
-    }
-
-    @AfterEach
-    public void tearDown() throws PlcConnectionException{
-        if(SUT.isConnected()) {
-            SUT.close();
-        }
-        SUT = null;
-    }
-
-    @Test
-    public void connectAndClose() throws Exception {
-        SUT.connect();
-        SUT.close();
-    }
-
-    @Test
-    @Disabled("Seems the RequirePcapNg doesn't work with Java 12")
-    @RequirePcapNg
-    public void read(TestInfo testInfo) throws Exception {
-        SUT.connect();
-        EmbeddedChannel channel = (EmbeddedChannel) SUT.getChannel();
-        assertThat("No outbound messages should exist.", channel.outboundMessages().size(), equalTo(0));
-
-        PlcReadRequest request = SUT.readRequestBuilder().addItem("test", "%Q0.4:BOOL").build();
-        CompletableFuture<PlcReadResponse> responseFuture = SUT.read(request);
-        // Check that one message has been sent.
-        assertThat("Exactly one outbound message should exist after sending.",
-            channel.outboundMessages().size(), equalTo(1));
-        SUT.verifyPcapFile("org/apache/plc4x/java/s7/connection/s7-read-var-request.pcap", testInfo);
-
-        // Manually feed a packet response into the channel.
-        SUT.sendPcapFile("org/apache/plc4x/java/s7/connection/s7-read-var-response.pcap");
-
-        // Now get the response as it was processed by the connection.
-        PlcReadResponse response = responseFuture.get(200, TimeUnit.MILLISECONDS);
-
-        assertThat(response, notNullValue());
-
-        SUT.close();
-    }
-
-    /**
-     * In case of a slow network connection Netty tends to call the IsoOnTcpProtocol decode method
-     * prior to reading the full packet. Therefor we usually check if enough bytes have been read.
-     * If not we give up and wait for Netty to call again.
-     *
-     * In case of a fast connection with large response sizes it seems that Netty splits up the
-     * responses into 512 byte chunks.
-     */
-    @Test
-    @Disabled
-    @RequirePcapNg
-    public void readLargeResponse() throws Exception {
-        SUT.connect();
-        EmbeddedChannel channel = (EmbeddedChannel) SUT.getChannel();
-        assertThat("No outbound messages should exist.", channel.outboundMessages().size(), equalTo(0));
-
-        SUT.sendPcapFile("org/apache/plc4x/java/s7/connection/s7-read-large-response.pcap");
-    }
-
-    @Test
-    @Disabled("Seems the RequirePcapNg doesn't work with Java 12")
-    @RequirePcapNg
-    public void write(TestInfo testInfo) throws Exception {
-        SUT.connect();
-        EmbeddedChannel channel = (EmbeddedChannel) SUT.getChannel();
-        assertThat("No outbound messages should exist.", channel.outboundMessages().size(), equalTo(0));
-
-        PlcWriteRequest request = SUT.writeRequestBuilder().addItem("test", "%Q0.4:BOOL", true).build();
-        CompletableFuture<PlcWriteResponse> responseFuture = SUT.write(request);
-        // Check that one message has been sent.
-        assertThat("Exactly one outbound message should exist after sending.",
-            channel.outboundMessages().size(), equalTo(1));
-        SUT.verifyPcapFile("org/apache/plc4x/java/s7/connection/s7-write-var-request.pcap", testInfo);
-
-        // Manually feed a packet response into the channel.
-        SUT.sendPcapFile("org/apache/plc4x/java/s7/connection/s7-write-var-response.pcap");
-
-        // Now get the response as it was processed by the connection.
-        PlcWriteResponse response = responseFuture.get(200, TimeUnit.MILLISECONDS);
-
-        assertThat(response, notNullValue());
-
-        SUT.close();
-    }
-
-}
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
deleted file mode 100644
index cb28cb0..0000000
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
+++ /dev/null
@@ -1,93 +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.s7.connection;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-import org.apache.plc4x.java.api.exceptions.PlcUnsupportedOperationException;
-import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.s7.model.S7Field;
-import org.apache.plc4x.java.s7.netty.model.types.TransportSize;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsNull.notNullValue;
-import static org.junit.Assert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertThrows;
-
-public class S7PlcConnectionTests {
-
-    private S7PlcTestConnection SUT;
-
-    @Before
-    public void setUp() {
-        SUT = new S7PlcTestConnection(1, 2,
-            "pdu-size=128&max-amq-caller=2&max-amq-callee=3&unknown=parameter&unknown-flag");
-    }
-
-    @After
-    public void tearDown() {
-        SUT = null;
-    }
-
-    @Test
-    public void initialState() {
-        assertThat("Rack is incorrect", SUT.getRack(), equalTo(1) );
-        assertThat("Slot is incorrect", SUT.getSlot(), equalTo(2) );
-        assertThat("Pdu size is incorrect", SUT.getParamPduSize(), equalTo((short) 128));
-        assertThat("Max AMQ Caller size is incorrect", SUT.getParamMaxAmqCaller(), equalTo(2) );
-        assertThat("Max AMQ Callee size is incorrect", SUT.getParamMaxAmqCallee(), equalTo(3) );
-    }
-
-    /**
-     * When configuring a connection to a LOGO device, then the pdu size has to be set to a different value.
-     */
-    @Test
-    public void initialStateLogo() {
-        SUT = new S7PlcTestConnection(1, 2, "controller-type=LOGO");
-        assertThat("Pdu size is incorrect", SUT.getParamPduSize(), equalTo((short) 480));
-    }
-
-    @Test
-    public void capabilities() {
-        assertThat(SUT.canRead(), equalTo(true));
-        assertThat(SUT.readRequestBuilder(), notNullValue());
-
-        assertThat(SUT.canWrite(), equalTo(true));
-        assertThat(SUT.writeRequestBuilder(), notNullValue());
-
-        assertThat(SUT.canSubscribe(), equalTo(false));
-        assertThrows(PlcUnsupportedOperationException.class, () -> SUT.subscriptionRequestBuilder());
-        assertThrows(PlcUnsupportedOperationException.class, () -> SUT.unsubscriptionRequestBuilder());
-    }
-
-    @Test
-    public void prepareField() {
-        final PlcField field = SUT.prepareField("%DB1.DBX38.1:BOOL");
-        assertThat(field.getClass(), equalTo(S7Field.class));
-        assertThat(((S7Field) field).getDataType(), equalTo(TransportSize.BOOL));
-    }
-
-    @Test(expected = PlcInvalidFieldException.class)
-    public void prepareFieldFails() {
-        SUT.prepareField("this is a bad field query");
-    }
-}
\ No newline at end of file
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcTestConnection.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcTestConnection.java
deleted file mode 100644
index cafec49..0000000
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcTestConnection.java
+++ /dev/null
@@ -1,204 +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.s7.connection;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.embedded.EmbeddedChannel;
-import org.apache.commons.io.IOUtils;
-import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
-import org.apache.plc4x.java.transport.test.TestChannelFactory;
-import org.junit.jupiter.api.TestInfo;
-import org.pcap4j.core.*;
-import org.pcap4j.packet.Packet;
-import org.pcap4j.packet.namednumber.DataLinkType;
-
-import java.io.EOFException;
-import java.io.File;
-import java.io.IOException;
-import java.io.InputStream;
-import java.lang.reflect.Method;
-import java.util.Arrays;
-import java.util.Objects;
-import java.util.concurrent.TimeoutException;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assert.fail;
-
-public class S7PlcTestConnection extends S7PlcConnection {
-
-    public S7PlcTestConnection(int rack, int slot, String params) {
-        super(new TestChannelFactory(), rack, slot, params);
-    }
-
-    /*
-            byte[] setupCommunicationResponse = toByteArray(
-            new int[] {
-                // ISO on TCP packet
-                0x03, 0x00,
-                0x00, 0x1B,
-                // ISO TP packet
-                0x02,
-                TpduCode.DATA.getCode(),
-                0x80,
-                S7Protocol.S7_PROTOCOL_MAGIC_NUMBER,
-                MessageType.ACK_DATA.getCode(), 0x00, 0x00,
-                0x00, 0x01,
-                // Parameter Length
-                0x00, 0x08,
-                // Data Length
-                0x00, 0x00,
-                // Error codes
-                0x00, 0x00,
-                // Parameters:
-                ParameterType.SETUP_COMMUNICATION.getCode(), 0x00, 0x00, 0x08, 0x00, 0x08, 0x01, 0x00
-            });
-        dumpArrayToPcapFile("s7-setup-communication-response.pcap", setupCommunicationResponse);
-     */
-
-    @Override
-    protected void sendChannelCreatedEvent() {
-        EmbeddedChannel channel = (EmbeddedChannel) getChannel();
-
-        // Send an event to the pipeline telling the Protocol filters what's going on.
-        super.sendChannelCreatedEvent();
-
-        ByteBuf writtenData = channel.readOutbound();
-        if(writtenData == null) {
-            throw new PlcRuntimeException("Error reading initial channel output");
-        }
-        byte[] connectionRequest = new byte[writtenData.readableBytes()];
-        writtenData.readBytes(connectionRequest);
-        // TODO: Check the content of the Iso TP connection request.
-
-        // Send an Iso TP connection response back to the pipeline.
-        byte[] connectionConfirm = readPcapFile("org/apache/plc4x/java/s7/connection/iso-tp-connect-response.pcap");
-        channel.writeInbound(Unpooled.wrappedBuffer(connectionConfirm));
-
-        // Read a S7 Setup Communication request.
-        writtenData = channel.readOutbound();
-        byte[] setupCommunicationRequest = new byte[writtenData.readableBytes()];
-        writtenData.readBytes(setupCommunicationRequest);
-        // TODO: Check the content of the S7 Setup Communication connection request.
-
-        // Send an S7 Setup Communication response back to the pipeline.
-        byte[] setupCommunicationResponse = readPcapFile(
-            "org/apache/plc4x/java/s7/connection/s7-setup-communication-response.pcap");
-        channel.writeInbound(Unpooled.wrappedBuffer(setupCommunicationResponse));
-
-        // Read a S7 CPU Functions request.
-        writtenData = channel.readOutbound();
-        byte[] cpuFunctionsRequest = new byte[writtenData.readableBytes()];
-        writtenData.readBytes(cpuFunctionsRequest);
-        // TODO: Check the content of the S7 Setup Communication connection request.
-
-        // Send an S7 CPU Functions response back to the pipeline.
-        byte[] cpuFunctionsResponse = readPcapFile(
-            "org/apache/plc4x/java/s7/connection/s7-cpu-functions-response.pcap");
-        // Override the type of reported S7 device.
-        switch (getParamControllerType()) {
-            case S7_1200:
-                cpuFunctionsResponse[48] = '2';
-                break;
-            case S7_1500:
-                cpuFunctionsResponse[48] = '5';
-                break;
-            case S7_300:
-                cpuFunctionsResponse[48] = '3';
-                break;
-            case S7_400:
-                cpuFunctionsResponse[48] = '4';
-                break;
-            default:
-                cpuFunctionsResponse[48] = '1';
-                break;
-        }
-        channel.writeInbound(Unpooled.wrappedBuffer(cpuFunctionsResponse));
-    }
-
-    public static byte[] readPcapFile(String filename) {
-        try {
-            InputStream in = S7PlcTestConnection.class.getClassLoader().getResourceAsStream(filename);
-            byte[] pcap = IOUtils.toByteArray(in);
-            byte[] data = new byte[pcap.length - 94];
-            System.arraycopy(pcap, 94, data, 0, pcap.length - 94);
-            return data;
-        } catch (IOException e) {
-            throw new RuntimeException(e);
-        }
-    }
-
-    public void sendPcapFile(String filename) {
-        try {
-            ClassLoader classLoader = getClass().getClassLoader();
-            File file = new File(Objects.requireNonNull(classLoader.getResource(filename)).getFile());
-            PcapHandle responsePcap = Pcaps.openOffline(file.getAbsolutePath());
-            Packet packet = responsePcap.getNextPacketEx();
-            byte[] data = packet.getPayload().getPayload().getPayload().getRawData();
-
-            EmbeddedChannel channel = (EmbeddedChannel) getChannel();
-            channel.writeInbound(Unpooled.wrappedBuffer(data));
-        } catch (PcapNativeException | EOFException | TimeoutException | NotOpenException e) {
-            throw new RuntimeException("Error sending pacap file " + filename, e);
-        }
-    }
-
-    public void verifyPcapFile(String filename, TestInfo testInfo) {
-        try {
-            ClassLoader classLoader = getClass().getClassLoader();
-            File file = new File(Objects.requireNonNull(classLoader.getResource(filename)).getFile());
-            PcapHandle responsePcap = Pcaps.openOffline(file.getAbsolutePath());
-            Packet packet = responsePcap.getNextPacketEx();
-            byte[] refData = packet.getPayload().getPayload().getPayload().getRawData();
-
-            // Get the systems output.
-            EmbeddedChannel channel = (EmbeddedChannel) getChannel();
-            ByteBuf request = channel.readOutbound();
-
-            // Check the sizes are equal.
-            assertThat(refData.length, equalTo(request.readableBytes()));
-
-            // Read the raw data sent to the output.
-            byte[] actData = new byte[request.readableBytes()];
-            request.readBytes(actData);
-
-            // Compare the actual output to the reference output
-            if(!Arrays.equals(actData, refData)) {
-                String currentWorkingDir = System.getProperty("user.dir");
-                Class<?> testClass = testInfo.getTestClass().orElse(Object.class);
-                Method testMethod = testInfo.getTestMethod().orElse(null);
-                String fileName = currentWorkingDir + "/target/failsafe-reports/failure-" + testClass.getSimpleName() + "-"  + testMethod.getName() + ".pcap";
-                try (PcapHandle handle = Pcaps.openDead(DataLinkType.EN10MB, 65536)) {
-                    PcapDumper dumper = handle.dumpOpen(fileName);
-                    dumper.dumpRaw(actData);
-                    dumper.flush();
-                }
-                for (int i = 0; i < actData.length; i++) {
-                    if (actData[i] != refData[i]) {
-                        fail("Mismatch at position " + i);
-                    }
-                }
-            }
-        } catch (Exception e) {
-            throw new RuntimeException("Error sending pacap file " + filename, e);
-        }
-    }
-
-}
\ No newline at end of file
diff --git a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/issues/PLC4X47Test.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/issues/PLC4X47Test.java
deleted file mode 100644
index 9509f4f..0000000
--- a/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/issues/PLC4X47Test.java
+++ /dev/null
@@ -1,51 +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.s7.connection.issues;
-
-import org.apache.plc4x.java.PlcDriverManager;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.s7.connection.S7PlcConnection;
-import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.Test;
-
-
-public class PLC4X47Test {
-
-    @Test
-    @Disabled
-    public void testLargeRequest() throws Exception {
-        /*TestChannelFactory channelFactory = new TestChannelFactory();
-        S7PlcConnection connection = new S7PlcConnection( channelFactory, 1, 1, "");
-        connection.connect();
-        EmbeddedChannel channel = channelFactory.getChannel();*/
-        S7PlcConnection connection = (S7PlcConnection) new PlcDriverManager().getConnection("s7://10.10.64.20/1/1");
-
-        PlcReadRequest.Builder builder = connection.readRequestBuilder();
-        for (int i = 1; i <= 30; i++) {
-            // just the first byte of each db
-            builder.addItem("field-" + i, "%DB3.DB" + i + ":SINT");
-        }
-        PlcReadRequest readRequest = builder.build();
-        PlcReadResponse readResponse = connection.read(readRequest).get();
-        System.out.println(readResponse.getFieldNames().size());
-    }
-
-}
diff --git a/sandbox/test-java-s7-driver/src/test/java/org/apache/plc4x/java/s7/readwrite/ManualS7DriverTest.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/ManualS7DriverTest.java
similarity index 100%
rename from sandbox/test-java-s7-driver/src/test/java/org/apache/plc4x/java/s7/readwrite/ManualS7DriverTest.java
rename to plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/readwrite/ManualS7DriverTest.java
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/iso-tp-connect-response.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/iso-tp-connect-response.pcap
deleted file mode 100644
index d0a56c9..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/iso-tp-connect-response.pcap and /dev/null differ
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-cpu-functions-response.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-cpu-functions-response.pcap
deleted file mode 100644
index c0a1c99..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-cpu-functions-response.pcap and /dev/null differ
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-large-response.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-large-response.pcap
deleted file mode 100644
index 4aed720..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-large-response.pcap and /dev/null differ
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcap
deleted file mode 100644
index abe336f..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcap and /dev/null differ
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcap
deleted file mode 100644
index 4225e4a..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcap and /dev/null differ
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-setup-communication-response.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-setup-communication-response.pcap
deleted file mode 100644
index bc79c91..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-setup-communication-response.pcap and /dev/null differ
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcap
deleted file mode 100644
index 04724ac..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcap and /dev/null differ
diff --git a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcap b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcap
deleted file mode 100644
index f69ec7f..0000000
Binary files a/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcap and /dev/null differ
diff --git a/plc4j/examples/hello-cloud-azure/pom.xml b/plc4j/examples/hello-cloud-azure/pom.xml
index d4fcad3..dacea92 100644
--- a/plc4j/examples/hello-cloud-azure/pom.xml
+++ b/plc4j/examples/hello-cloud-azure/pom.xml
@@ -51,44 +51,6 @@
       <artifactId>commons-cli</artifactId>
       <version>1.4</version>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <!-- Managed dependencies to eliminate transitively importing libraries with CVEs -->
@@ -123,23 +85,4 @@
     </dependencies>
   </dependencyManagement>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies>
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/plc4j/examples/hello-cloud-google/pom.xml b/plc4j/examples/hello-cloud-google/pom.xml
index 50d98ad..e6cb6d0 100644
--- a/plc4j/examples/hello-cloud-google/pom.xml
+++ b/plc4j/examples/hello-cloud-google/pom.xml
@@ -68,44 +68,6 @@
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <build>
@@ -115,12 +77,6 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
             <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
           </usedDependencies>
         </configuration>
diff --git a/plc4j/examples/hello-connectivity-kafka/pom.xml b/plc4j/examples/hello-connectivity-kafka/pom.xml
index 2b84c11..765b562 100644
--- a/plc4j/examples/hello-connectivity-kafka/pom.xml
+++ b/plc4j/examples/hello-connectivity-kafka/pom.xml
@@ -94,44 +94,6 @@
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <dependencyManagement>
@@ -179,23 +141,4 @@
     </dependencies>
   </dependencyManagement>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies>
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/plc4j/examples/hello-connectivity-mqtt/pom.xml b/plc4j/examples/hello-connectivity-mqtt/pom.xml
index d870856..fbc2527 100644
--- a/plc4j/examples/hello-connectivity-mqtt/pom.xml
+++ b/plc4j/examples/hello-connectivity-mqtt/pom.xml
@@ -79,65 +79,8 @@
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies>
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
   <repositories>
     <repository>
       <id>jfrog-snapshot</id>
diff --git a/plc4j/examples/hello-influx-data-collection/pom.xml b/plc4j/examples/hello-influx-data-collection/pom.xml
index 5a561c6..174a7e5 100644
--- a/plc4j/examples/hello-influx-data-collection/pom.xml
+++ b/plc4j/examples/hello-influx-data-collection/pom.xml
@@ -75,27 +75,6 @@
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <dependency>
-      <groupId>org.apache.plc4x.sandbox</groupId>
-      <artifactId>test-java-bacnetip-driver</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-transport-pcap-socket</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-transport-raw-socket</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <build>
@@ -105,9 +84,6 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <usedDependency>org.apache.plc4x.sandbox:test-java-bacnetip-driver</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-transport-pcap-socket</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-transport-raw-socket</usedDependency>
             <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
           </usedDependencies>
         </configuration>
diff --git a/plc4j/examples/hello-integration-edgent/pom.xml b/plc4j/examples/hello-integration-edgent/pom.xml
index 456da37..5ed08aa 100644
--- a/plc4j/examples/hello-integration-edgent/pom.xml
+++ b/plc4j/examples/hello-integration-edgent/pom.xml
@@ -67,63 +67,6 @@
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies>
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/plc4j/examples/hello-integration-iotdb/pom.xml b/plc4j/examples/hello-integration-iotdb/pom.xml
index 9a89b6c..41582ae 100644
--- a/plc4j/examples/hello-integration-iotdb/pom.xml
+++ b/plc4j/examples/hello-integration-iotdb/pom.xml
@@ -68,44 +68,6 @@
       <artifactId>logback-classic</artifactId>
     </dependency>
 
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-
     <!-- iotdb -->
     <dependency>
       <groupId>org.apache.iotdb</groupId>
@@ -114,23 +76,4 @@
     </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies>
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/plc4j/examples/hello-opm/pom.xml b/plc4j/examples/hello-opm/pom.xml
index 79ac79a..cff357c 100644
--- a/plc4j/examples/hello-opm/pom.xml
+++ b/plc4j/examples/hello-opm/pom.xml
@@ -60,44 +60,6 @@
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <build>
@@ -107,12 +69,6 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
             <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
           </usedDependencies>
         </configuration>
diff --git a/plc4j/examples/hello-storage-elasticsearch/pom.xml b/plc4j/examples/hello-storage-elasticsearch/pom.xml
index 31dc3dd..981e701 100644
--- a/plc4j/examples/hello-storage-elasticsearch/pom.xml
+++ b/plc4j/examples/hello-storage-elasticsearch/pom.xml
@@ -103,44 +103,6 @@
       <artifactId>log4j-slf4j-impl</artifactId>
       <version>2.11.2</version>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <build>
@@ -176,12 +138,6 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
             <usedDependency>org.apache.logging.log4j:log4j-slf4j-impl</usedDependency>
             <usedDependency>org.locationtech.spatial4j:spatial4j</usedDependency>
           </usedDependencies>
diff --git a/plc4j/examples/hello-webapp/service/pom.xml b/plc4j/examples/hello-webapp/service/pom.xml
index 378e77e..c83f335 100644
--- a/plc4j/examples/hello-webapp/service/pom.xml
+++ b/plc4j/examples/hello-webapp/service/pom.xml
@@ -31,25 +31,6 @@
 
   <name>PLC4J: Examples: Hello-Webapp: Service</name>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies>
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
   <dependencies>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
@@ -69,44 +50,6 @@
       <groupId>javax.annotation</groupId>
       <artifactId>javax.annotation-api</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/plc4j/examples/hello-world-plc4x/pom.xml b/plc4j/examples/hello-world-plc4x/pom.xml
index 631c2fc..84376d5 100644
--- a/plc4j/examples/hello-world-plc4x/pom.xml
+++ b/plc4j/examples/hello-world-plc4x/pom.xml
@@ -60,62 +60,6 @@
       <groupId>ch.qos.logback</groupId>
       <artifactId>logback-classic</artifactId>
     </dependency>
-
-    <!-- Required driver implementation -->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ab-eth</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-modbus</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-opcua</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-s7</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency-->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-simulated</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x.sandbox</groupId>
-      <artifactId>test-java-s7-driver</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x.sandbox</groupId>
-      <artifactId>test-java-modbus-driver</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
   </dependencies>
 
   <build>
@@ -125,15 +69,6 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <usedDependency>org.apache.plc4x:plc4j-driver-ab-eth</usedDependency>
-            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
-            <usedDependency>org.apache.plc4x.sandbox:test-java-s7-driver</usedDependency>
-            <usedDependency>org.apache.plc4x.sandbox:test-java-modbus-driver</usedDependency>
             <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
           </usedDependencies>
         </configuration>
diff --git a/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java b/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
index f9bed87..f1a3ef3 100644
--- a/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
+++ b/plc4j/examples/hello-world-plc4x/src/main/java/org/apache/plc4x/java/examples/helloplc4x/HelloPlc4x.java
@@ -22,6 +22,8 @@ import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.PlcConnection;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
+import org.apache.plc4x.java.api.messages.PlcWriteRequest;
+import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.types.PlcResponseCode;
 import org.apache.plc4x.java.api.value.PlcValue;
 import org.slf4j.Logger;
@@ -58,9 +60,9 @@ public class HelloPlc4x {
 
             // Create a new read request:
             // - Give the single item requested the alias name "value"
-            PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
+            /*PlcReadRequest.Builder builder = plcConnection.readRequestBuilder();
             for (int i = 0; i < options.getFieldAddress().length; i++) {
-                builder.addItem("value-" + i, options.getFieldAddress()[i]);
+                builder.addItem("r-" + i, options.getFieldAddress()[i]);
             }
             PlcReadRequest readRequest = builder.build();
 
@@ -72,22 +74,16 @@ public class HelloPlc4x {
             PlcReadResponse syncResponse = readRequest.execute().get();
             // Simply iterating over the field names returned in the response.
             printResponse(syncResponse);
-
             PlcValue asPlcValue = syncResponse.getAsPlcValue();
-            System.out.println(asPlcValue);
+            System.out.println(asPlcValue);*/
 
-            //////////////////////////////////////////////////////////
-            // Read asynchronously ...
-            // Register a callback executed as soon as a response arrives.
-            logger.info("Asynchronous request ...");
-            CompletionStage<? extends PlcReadResponse> asyncResponse = readRequest.execute();
-            asyncResponse.whenComplete((readResponse, throwable) -> {
-                if (readResponse != null) {
-                    printResponse(readResponse);
-                } else {
-                    logger.error("An error occurred: " + throwable.getMessage(), throwable);
-                }
-            });
+            final PlcWriteRequest.Builder writeRequestBuilder = plcConnection.writeRequestBuilder();
+            writeRequestBuilder.addItem("w-1", options.getFieldAddress()[0], 23, 42, 7);
+            PlcWriteRequest writeRequest = writeRequestBuilder.build();
+            System.out.println(writeRequest);
+
+            logger.info("Synchronous write ...");
+            final PlcWriteResponse plcWriteResponse = writeRequest.execute().get();
 
             // Give the async request a little time...
             TimeUnit.MILLISECONDS.sleep(1000);
diff --git a/plc4j/examples/pom.xml b/plc4j/examples/pom.xml
index 11f70b8..b21493e 100644
--- a/plc4j/examples/pom.xml
+++ b/plc4j/examples/pom.xml
@@ -85,6 +85,23 @@
           </execution>
         </executions>
       </plugin>
+
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4j-driver-ab-eth</usedDependency>
+            <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency-->
+            <usedDependency>org.apache.plc4x:plc4j-driver-knxnetip</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
+            <!--usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency-->
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
+          </usedDependencies>
+        </configuration>
+      </plugin>
     </plugins>
 
     <pluginManagement>
@@ -118,4 +135,56 @@
     </dependencies>
   </dependencyManagement>
 
+  <dependencies>
+    <!-- Required driver implementation -->
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-ab-eth</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency>
+    <!--dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-ads</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-ethernet-ip</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency-->
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-knxnetip</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-modbus</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency>
+    <!--dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-opcua</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency-->
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-s7</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-simulated</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
+    </dependency>
+  </dependencies>
+
 </project>
\ No newline at end of file
diff --git a/plc4j/integrations/apache-camel/pom.xml b/plc4j/integrations/apache-camel/pom.xml
index 57af4e5..7cff171 100644
--- a/plc4j/integrations/apache-camel/pom.xml
+++ b/plc4j/integrations/apache-camel/pom.xml
@@ -141,7 +141,7 @@
       </plugin>
       <!-- to generate the MANIFEST-FILE of the bundle -->
       <!-- TODO: Seems this plugin is messing up the jqassistant execution. Also it doesn't seem to have any effect on the output as it is not executed at all and there is no MANIFEST.MF in the output -->
-      <!--plugin>
+      <plugin>
         <groupId>org.apache.felix</groupId>
         <artifactId>maven-bundle-plugin</artifactId>
         <version>3.5.0</version>
@@ -152,7 +152,7 @@
             <Export-Service>org.apache.camel.spi.ComponentResolver;component=s7</Export-Service>
           </instructions>
         </configuration>
-      </plugin-->
+      </plugin>
       <plugin>
         <groupId>org.apache.maven.plugins</groupId>
         <artifactId>maven-dependency-plugin</artifactId>
diff --git a/plc4j/integrations/apache-kafka/pom.xml b/plc4j/integrations/apache-kafka/pom.xml
index b37b882..218fb08 100644
--- a/plc4j/integrations/apache-kafka/pom.xml
+++ b/plc4j/integrations/apache-kafka/pom.xml
@@ -56,12 +56,13 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4j-driver-ab-eth</usedDependency>
             <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency-->
+            <usedDependency>org.apache.plc4x:plc4j-driver-knxnetip</usedDependency>
             <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
-            <usedDependency>org.apache.plc4x.sandbox:test-java-s7-driver</usedDependency>
+            <!--usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency-->
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
             <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
           </usedDependencies>
         </configuration>
@@ -106,8 +107,8 @@
 
     <!-- Include all drivers -->
     <dependency>
-      <groupId>org.apache.plc4x.sandbox</groupId>
-      <artifactId>test-java-s7-driver</artifactId>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-ab-eth</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -122,6 +123,12 @@
       <artifactId>plc4j-driver-ethernet-ip</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
+    </dependency-->
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-knxnetip</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+      <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
@@ -129,18 +136,18 @@
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
-    <dependency>
+    <!--dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-opcua</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
-    </dependency>
+    </dependency-->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-s7</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
-    </dependency-->
+    </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-simulated</artifactId>
diff --git a/plc4j/integrations/apache-nifi/nifi-plc4x-nar/pom.xml b/plc4j/integrations/apache-nifi/nifi-plc4x-nar/pom.xml
index 9f2cbaf..79857aa 100644
--- a/plc4j/integrations/apache-nifi/nifi-plc4x-nar/pom.xml
+++ b/plc4j/integrations/apache-nifi/nifi-plc4x-nar/pom.xml
@@ -49,10 +49,13 @@
             <usedDependencies>
               <usedDependency>org.apache.plc4x:plc4j-nifi-plc4x-processors</usedDependency>
               <usedDependency>org.apache.plc4x:plc4j-api</usedDependency>
+              <usedDependency>org.apache.plc4x:plc4j-driver-ab-eth</usedDependency>
               <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-              <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
+              <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency-->
+              <usedDependency>org.apache.plc4x:plc4j-driver-knxnetip</usedDependency>
               <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-              <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
+              <!--usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency-->
+              <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
               <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
             </usedDependencies>
           </configuration>
@@ -74,14 +77,24 @@
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
     <!-- Bundle Drivers -->
-    <!--dependency>
+    <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
+      <artifactId>plc4j-driver-ab-eth</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
+    <!--dependency>
+        <groupId>org.apache.plc4x</groupId>
+        <artifactId>plc4j-driver-ads</artifactId>
+        <version>0.7.0-SNAPSHOT</version>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.plc4x</groupId>
+        <artifactId>plc4j-driver-ethernet-ip</artifactId>
+        <version>0.7.0-SNAPSHOT</version>
+      </dependency-->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
+      <artifactId>plc4j-driver-knxnetip</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
     <dependency>
@@ -89,11 +102,16 @@
       <artifactId>plc4j-driver-modbus</artifactId>
       <version>0.7.0-SNAPSHOT</version>
     </dependency>
+    <!--dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-driver-opcua</artifactId>
+      <version>0.7.0-SNAPSHOT</version>
+    </dependency-->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-s7</artifactId>
       <version>0.7.0-SNAPSHOT</version>
-    </dependency>-->
+    </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-simulated</artifactId>
diff --git a/plc4j/integrations/logstash-plugin/pom.xml b/plc4j/integrations/logstash-plugin/pom.xml
index f59d9b0..9eb71ce 100644
--- a/plc4j/integrations/logstash-plugin/pom.xml
+++ b/plc4j/integrations/logstash-plugin/pom.xml
@@ -197,11 +197,13 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4j-driver-ab-eth</usedDependency>
             <!--usedDependency>org.apache.plc4x:plc4j-driver-ads</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency>
+                  <usedDependency>org.apache.plc4x:plc4j-driver-ethernet-ip</usedDependency-->
+            <usedDependency>org.apache.plc4x:plc4j-driver-knxnetip</usedDependency>
             <usedDependency>org.apache.plc4x:plc4j-driver-modbus</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency-->
+            <!--usedDependency>org.apache.plc4x:plc4j-driver-opcua</usedDependency-->
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
             <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
           </usedDependencies>
         </configuration>
@@ -233,15 +235,27 @@
     </dependency>
 
     <!-- Include all drivers -->
-    <!--dependency>
+    <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ads</artifactId>
+      <artifactId>plc4j-driver-ab-eth</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
+    <!--dependency>
+        <groupId>org.apache.plc4x</groupId>
+        <artifactId>plc4j-driver-ads</artifactId>
+        <version>0.7.0-SNAPSHOT</version>
+        <scope>runtime</scope>
+      </dependency>
+      <dependency>
+        <groupId>org.apache.plc4x</groupId>
+        <artifactId>plc4j-driver-ethernet-ip</artifactId>
+        <version>0.7.0-SNAPSHOT</version>
+        <scope>runtime</scope>
+      </dependency-->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-driver-ethernet-ip</artifactId>
+      <artifactId>plc4j-driver-knxnetip</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -251,18 +265,18 @@
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
-    <dependency>
+    <!--dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-opcua</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
-    </dependency>
+    </dependency-->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-s7</artifactId>
       <version>0.7.0-SNAPSHOT</version>
       <scope>runtime</scope>
-    </dependency-->
+    </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-driver-simulated</artifactId>
diff --git a/plc4j/karaf-features/karaf-itest/pom.xml b/plc4j/karaf-features/karaf-itest/pom.xml
index 707ac73..61fdf30 100644
--- a/plc4j/karaf-features/karaf-itest/pom.xml
+++ b/plc4j/karaf-features/karaf-itest/pom.xml
@@ -31,7 +31,6 @@
   <name>PLC4J: Karaf-Features: Integration-Tests</name>
 
   <properties>
-    <karaf.version>4.2.6</karaf.version>
     <pax.version>4.13.1</pax.version>
   </properties>
 
@@ -120,6 +119,26 @@
     </dependency>
   </dependencies>
 
+  <dependencyManagement>
+    <dependencies>
+      <dependency>
+        <groupId>org.ops4j.base</groupId>
+        <artifactId>ops4j-base-lang</artifactId>
+        <version>1.5.1</version>
+      </dependency>
+      <dependency>
+        <groupId>org.ops4j.base</groupId>
+        <artifactId>ops4j-base-util-property</artifactId>
+        <version>1.5.1</version>
+      </dependency>
+      <dependency>
+        <groupId>com.sun.istack</groupId>
+        <artifactId>istack-commons-runtime</artifactId>
+        <version>3.0.10</version>
+      </dependency>
+    </dependencies>
+  </dependencyManagement>
+
   <build>
     <plugins>
       <plugin>
@@ -168,9 +187,9 @@
   <profiles>
     <profile>
       <id>java12andAbove</id>
-      <activation>
+      <!--activation>
         <jdk>(12,]</jdk>
-      </activation>
+      </activation-->
       <build>
         <plugins>
           <plugin>
diff --git a/plc4j/karaf-features/pom.xml b/plc4j/karaf-features/pom.xml
index eb51f02..45b6e5d 100644
--- a/plc4j/karaf-features/pom.xml
+++ b/plc4j/karaf-features/pom.xml
@@ -31,9 +31,13 @@
 
   <name>PLC4J: Karaf-Features</name>
 
+  <properties>
+    <karaf.version>4.2.8</karaf.version>
+  </properties>
+
   <modules>
-<!--    <module>s7</module>-->
-<!--    <module>karaf-itest</module>-->
+    <module>s7</module>
+    <module>karaf-itest</module>
   </modules>
 
   <dependencies>
diff --git a/plc4j/karaf-features/s7/src/main/feature/feature.xml b/plc4j/karaf-features/s7/src/main/feature/feature.xml
index ec1aab8..b4c7b0b 100644
--- a/plc4j/karaf-features/s7/src/main/feature/feature.xml
+++ b/plc4j/karaf-features/s7/src/main/feature/feature.xml
@@ -26,9 +26,6 @@
     <feature>scr</feature>
     <bundle>mvn:org.apache.plc4x/plc4j-driver-s7/${project.version}</bundle>
     <bundle>mvn:org.apache.plc4x/plc4j-api/${project.version}</bundle>
-    <bundle>mvn:org.apache.plc4x/plc4j-protocol-iso-on-tcp/${project.version}</bundle>
-    <bundle>mvn:org.apache.plc4x/plc4j-protocol-iso-tp/${project.version}</bundle>
-    <bundle>mvn:org.apache.plc4x/plc4j-protocol-s7/${project.version}</bundle>
     <bundle>mvn:org.apache.plc4x/plc4j-spi/${project.version}</bundle>
     <bundle>mvn:org.apache.plc4x/plc4j-transport-tcp/${project.version}</bundle>
     <bundle>mvn:io.netty/netty-codec/4.1.39.Final</bundle>
diff --git a/plc4j/protocols/iso-on-tcp/pom.xml b/plc4j/protocols/iso-on-tcp/pom.xml
deleted file mode 100644
index bc97924..0000000
--- a/plc4j/protocols/iso-on-tcp/pom.xml
+++ /dev/null
@@ -1,79 +0,0 @@
-<?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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.plc4x</groupId>
-    <artifactId>plc4j-protocols</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>plc4j-protocol-iso-on-tcp</artifactId>
-  <name>PLC4J: Protocol: ISO on TCP</name>
-  <description>Implementation of the ISO on TCP protocol layer.</description>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-api</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-spi</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-buffer</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-codec</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-transport</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-utils-test-utils</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
deleted file mode 100644
index 3615584..0000000
--- a/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
+++ /dev/null
@@ -1,119 +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.isoontcp.protocol;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufUtil;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.codec.ByteToMessageCodec;
-import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
-import org.apache.plc4x.java.isoontcp.protocol.model.IsoOnTcpMessage;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.List;
-
-public class IsoOnTcpProtocol extends ByteToMessageCodec<IsoOnTcpMessage> {
-
-    static final byte ISO_ON_TCP_MAGIC_NUMBER = 0x03;
-
-    private static final Logger logger = LoggerFactory.getLogger(IsoOnTcpProtocol.class);
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    // Encoding
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    protected void encode(ChannelHandlerContext ctx, IsoOnTcpMessage in, ByteBuf out) throws Exception {
-        logger.debug("ISO on TCP Message sent");
-        // At this point of processing all higher levels have already serialized their payload.
-        // This data is passed to the lower levels in form of an IoBuffer.
-        final ByteBuf userData = in.getUserData();
-
-        int packetSize = userData.readableBytes() + 4;
-
-        // Version (is always constant 0x03)
-        out.writeByte(ISO_ON_TCP_MAGIC_NUMBER);
-        // Reserved (is always constant 0x00)
-        out.writeByte((byte) 0x00);
-        // Packet length (including ISOonTCP header)
-        // ("remaining" returns the number of bytes left to read in this buffer.
-        // It is usually set to a read position of 0 and a limit at the end.
-        // So in general remaining is equivalent to a non-existing
-        // "userData.size()" method.)
-        out.writeShort((short) packetSize);
-
-        // Output the payload.
-        out.writeBytes(userData);
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    // Decoding
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception {
-        if(logger.isTraceEnabled()) {
-            logger.trace("Got Data: {}", ByteBufUtil.hexDump(in));
-        }
-        // If at least 4 bytes are readable, peek into them (without changing the read position)
-        // and get the packet length. Only if the available amount of readable bytes is larger or
-        // equal to this, continue processing the rest.
-        /*if(chunkedResponse != null) {
-            chunkedResponse.writeBytes(in);
-        } else*/ if(in.readableBytes() >= 4) {
-            logger.debug("ISO on TCP Message received");
-            // The ISO on TCP protocol is really simple and in this case the buffer length
-            // will take care of the higher levels not reading more than is in the packet.
-            // So we just gobble up the header and continue reading in higher levels.
-            if (in.getByte(0) != ISO_ON_TCP_MAGIC_NUMBER) {
-                logger.warn("Expecting ISO on TCP magic number: {}", ISO_ON_TCP_MAGIC_NUMBER);
-                if (logger.isDebugEnabled()) {
-                    logger.debug("Got Data: {}", ByteBufUtil.hexDump(in));
-                }
-                // Gobble up any garbage that might be still in the buffer until the buffer is
-                // empty or we reach the potential start of the next ISO on TCP packet.
-                while ((in.readableBytes() > 0) && (in.getByte(0) != ISO_ON_TCP_MAGIC_NUMBER)) {
-                    // Read and hereby remove the invalid byte.
-                    in.readByte();
-                }
-                // If there was nothing left, just give up.
-                if(in.readableBytes() == 0) {
-                    return;
-                }
-                exceptionCaught(ctx, new PlcProtocolException(
-                    String.format("Expecting ISO on TCP magic number: %02X", ISO_ON_TCP_MAGIC_NUMBER)));
-                return;
-            }
-            // Byte 1 is a reserved byte set to 0x00
-            short packetLength = in.getShort(2);
-            if(in.readableBytes() >= packetLength) {
-                // Skip the 4 bytes we peeked into manually.
-                in.skipBytes(4);
-                // Simply place the current buffer to the output ... the next handler will continue.
-                ByteBuf payload = in.readBytes(packetLength - 4);
-                out.add(new IsoOnTcpMessage(payload));
-            /*} else {
-                chunkedResponse = Unpooled.buffer(packetLength);
-                chunkedResponse.writeBytes(in, packetLength);*/
-            }
-        }
-    }
-
-}
diff --git a/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java
deleted file mode 100644
index 45f59af..0000000
--- a/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.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.java.isoontcp.protocol.model;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.spi.messages.PlcRawMessage;
-
-public class IsoOnTcpMessage extends PlcRawMessage {
-
-    public IsoOnTcpMessage(ByteBuf userData) {
-        super(userData);
-    }
-
-}
diff --git a/plc4j/protocols/iso-on-tcp/src/test/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocolTest.java b/plc4j/protocols/iso-on-tcp/src/test/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocolTest.java
deleted file mode 100644
index 8b158e4..0000000
--- a/plc4j/protocols/iso-on-tcp/src/test/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocolTest.java
+++ /dev/null
@@ -1,169 +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.isoontcp.protocol;
-
-import ch.qos.logback.classic.Level;
-import ch.qos.logback.classic.Logger;
-import ch.qos.logback.classic.spi.LoggingEvent;
-import ch.qos.logback.core.Appender;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.embedded.EmbeddedChannel;
-import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
-import org.apache.plc4x.java.isoontcp.protocol.model.IsoOnTcpMessage;
-import org.apache.plc4x.test.FastTests;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-import org.slf4j.LoggerFactory;
-
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.core.IsInstanceOf.instanceOf;
-import static org.hamcrest.core.IsNull.notNullValue;
-import static org.hamcrest.core.IsNull.nullValue;
-import static org.hamcrest.core.StringContains.containsString;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.*;
-
-
-public class IsoOnTcpProtocolTest {
-
-    @Test
-    @Category(FastTests.class)
-    public void encode() {
-        IsoOnTcpMessage isoOnTcpMessage = new IsoOnTcpMessage(
-            Unpooled.wrappedBuffer(new byte[]{(byte) 0x01, (byte) 0x02, (byte) 0x03}));
-        EmbeddedChannel channel = new EmbeddedChannel(new IsoOnTcpProtocol());
-        channel.writeOutbound(isoOnTcpMessage);
-        channel.checkException();
-        Object obj = channel.readOutbound();
-        assertThat(obj, instanceOf(ByteBuf.class));
-        ByteBuf byteBuf = (ByteBuf) obj;
-        assertThat("The TCP on ISO Header should add 4 bytes to the data sent", byteBuf.readableBytes(), equalTo(4 + 3));
-        assertThat(byteBuf.getByte(0), equalTo(IsoOnTcpProtocol.ISO_ON_TCP_MAGIC_NUMBER) );
-        assertThat("The length value in the packet should reflect the size of the entire data being sent", byteBuf.getShort(2), equalTo((short) (4 + 3)) );
-    }
-
-    /**
-     * Happy path test.
-     */
-    @Test
-    @Category(FastTests.class)
-    public void decode() {
-        EmbeddedChannel channel = new EmbeddedChannel(new IsoOnTcpProtocol());
-        channel.writeInbound(Unpooled.wrappedBuffer(new byte[]{IsoOnTcpProtocol.ISO_ON_TCP_MAGIC_NUMBER,
-            (byte) 0x00, (byte) 0x00, (byte) 0x0D,
-            (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09}));
-        channel.checkException();
-        Object obj = channel.readInbound();
-        assertThat(obj, instanceOf(IsoOnTcpMessage.class));
-        IsoOnTcpMessage isoOnTcpMessage = (IsoOnTcpMessage) obj;
-        assertThat(isoOnTcpMessage.getUserData(), notNullValue());
-        assertThat(isoOnTcpMessage.getUserData().readableBytes(), equalTo(9) );
-    }
-
-    /**
-     * If the packet doesn't start with the ISO on TCP magic byte 0x03
-     * an exception should be thrown.
-     */
-    @Test
-    @Category(FastTests.class)
-    public void decodeWrongMagicByte() {
-        try {
-            EmbeddedChannel channel = new EmbeddedChannel(new IsoOnTcpProtocol());
-            // TODO: Check this is done the same way as in the rest of the project
-
-            channel.writeInbound(Unpooled.wrappedBuffer(new byte[]{0x12,
-                (byte) 0x00, (byte) 0x00, (byte) 0x0D,
-                (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09}));
-        } catch( Throwable throwable )
-        {
-            assertThat(throwable.getMessage(), containsString("ISO on TCP magic number") );
-            assertThat(throwable, instanceOf(PlcProtocolException.class) );
-        }
-    }
-
-    /**
-     * If the available amount of data is so small we can't even find out how big
-     * the entire package should be, nothing should be read.
-     */
-    @Test
-    @Category(FastTests.class)
-    public void decodeWayTooShort() {
-        EmbeddedChannel channel = new EmbeddedChannel(new IsoOnTcpProtocol());
-        channel.writeInbound(Unpooled.wrappedBuffer(new byte[]{IsoOnTcpProtocol.ISO_ON_TCP_MAGIC_NUMBER,
-            (byte) 0x00, (byte) 0x00, (byte) 0x0D}));
-        channel.checkException();
-        Object obj = channel.readInbound();
-        assertThat(obj, nullValue() );
-    }
-
-    /**
-     * If the available amount of data is smaller than what the packet size says
-     * it should be, nothing should be read.
-     */
-    @Test
-    @Category(FastTests.class)
-    public void decodeTooShort() {
-        EmbeddedChannel channel = new EmbeddedChannel(new IsoOnTcpProtocol());
-        channel.writeInbound(Unpooled.wrappedBuffer(new byte[]{IsoOnTcpProtocol.ISO_ON_TCP_MAGIC_NUMBER,
-            (byte) 0x00, (byte) 0x00, (byte) 0x0D,
-            (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08}));
-        channel.checkException();
-        Object obj = channel.readInbound();
-        assertThat(obj, nullValue() );
-    }
-
-    /**
-     * If logging is set to `DEBUG` then a hexdump of the entire captured packet
-     * should be logged
-     */
-    @Test
-    @Category(FastTests.class)
-    public void decodeLogPacketIfTraceLogging() {
-        // Setup the mock logger.
-        Logger root = (Logger) LoggerFactory.getLogger(Logger.ROOT_LOGGER_NAME);
-        Appender mockAppender = mock(Appender.class);
-        when(mockAppender.getName()).thenReturn("MOCK");
-        root.addAppender(mockAppender);
-        // Save the current default logging level
-        Level defaultLevel = root.getLevel();
-        try {
-            // Change the logging to TRACE.
-            root.setLevel(Level.TRACE);
-
-            // Do some deserialization
-            EmbeddedChannel channel = new EmbeddedChannel(new IsoOnTcpProtocol());
-            channel.writeInbound(Unpooled.wrappedBuffer(new byte[]{IsoOnTcpProtocol.ISO_ON_TCP_MAGIC_NUMBER,
-                (byte) 0x00, (byte) 0x00, (byte) 0x0D,
-                (byte) 0x01, (byte) 0x02, (byte) 0x03, (byte) 0x04, (byte) 0x05, (byte) 0x06, (byte) 0x07, (byte) 0x08, (byte) 0x09}));
-            channel.checkException();
-            Object obj = channel.readInbound();
-            assertThat(obj, notNullValue());
-
-            // Check that the packet dump was logged.
-            verify(mockAppender).doAppend(argThat(argument ->
-                ((LoggingEvent) argument).getFormattedMessage().contains("Got Data: 0300000d010203040506070809")));
-        } finally {
-            // Reset the log level to the default.
-            root.setLevel(defaultLevel);
-        }
-    }
-
-
-}
diff --git a/plc4j/protocols/iso-tp/pom.xml b/plc4j/protocols/iso-tp/pom.xml
deleted file mode 100644
index 467cc59..0000000
--- a/plc4j/protocols/iso-tp/pom.xml
+++ /dev/null
@@ -1,75 +0,0 @@
-<?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.
-  -->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.plc4x</groupId>
-    <artifactId>plc4j-protocols</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>plc4j-protocol-iso-tp</artifactId>
-  <name>PLC4J: Protocol: ISO TP</name>
-  <description>Implementation of the ISO Transport Protocol layer.</description>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-api</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-spi</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-iso-on-tcp</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-buffer</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-transport</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-utils-test-utils</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>test</scope>
-    </dependency>
-  </dependencies>
-
-</project>
\ No newline at end of file
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocol.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocol.java
deleted file mode 100644
index 56773d1..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocol.java
+++ /dev/null
@@ -1,446 +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.isotp.protocol;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.ByteBufUtil;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelHandlerContext;
-import org.apache.plc4x.java.api.exceptions.PlcProtocolPayloadTooBigException;
-import org.apache.plc4x.java.spi.PlcMessageToMessageCodec;
-import org.apache.plc4x.java.spi.events.ConnectEvent;
-import org.apache.plc4x.java.isoontcp.protocol.IsoOnTcpProtocol;
-import org.apache.plc4x.java.isoontcp.protocol.model.IsoOnTcpMessage;
-import org.apache.plc4x.java.isotp.protocol.events.IsoTPConnectedEvent;
-import org.apache.plc4x.java.isotp.protocol.model.IsoTPMessage;
-import org.apache.plc4x.java.isotp.protocol.model.params.*;
-import org.apache.plc4x.java.isotp.protocol.model.tpdus.*;
-import org.apache.plc4x.java.isotp.protocol.model.types.*;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.util.Arrays;
-import java.util.LinkedList;
-import java.util.List;
-
-public class IsoTPProtocol extends PlcMessageToMessageCodec<IsoOnTcpMessage, Tpdu> {
-
-    private static final Logger logger = LoggerFactory.getLogger(IsoTPProtocol.class);
-
-    private short callingTsapId;
-    private short calledTsapId;
-    private TpduSize tpduSize;
-
-    public IsoTPProtocol(short callingTsapId, short calledTsapId, TpduSize tpduSize) {
-        this.callingTsapId = callingTsapId;
-        this.calledTsapId = calledTsapId;
-        this.tpduSize = tpduSize;
-    }
-
-    /**
-     * If the IsoTP protocol is used on top of the ISO on TCP protocol, then as soon as the pipeline receives the
-     * request to connect, an IsoTP connection request TPDU must be sent in order to initialize the connection.
-     *
-     * @param ctx the current protocol layers context
-     * @param evt the event
-     * @throws Exception throws an exception if something goes wrong internally
-     */
-    @Override
-    public void userEventTriggered(ChannelHandlerContext ctx, Object evt) throws Exception {
-        ChannelHandler prevHandler = getPrevChannelHandler(ctx);
-
-        // If the connection has just been established, start setting up the connection
-        // by sending a connection request to the plc.
-        if ((prevHandler instanceof IsoOnTcpProtocol) && (evt instanceof ConnectEvent)) {
-            logger.debug("ISO Transport Protocol Sending Connection Request");
-            // Open the session on ISO Transport Protocol first.
-            ConnectionRequestTpdu connectionRequest = new ConnectionRequestTpdu(
-                (short) 0x0000, (short) 0x000F, ProtocolClass.CLASS_0,
-                Arrays.asList(
-                    new CalledTsapParameter(calledTsapId),
-                    new CallingTsapParameter(callingTsapId),
-                    new TpduSizeParameter(tpduSize)),
-                Unpooled.buffer());
-            ctx.channel().writeAndFlush(connectionRequest);
-        } else {
-            super.userEventTriggered(ctx, evt);
-        }
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    // Encoding
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    protected void encode(ChannelHandlerContext ctx, Tpdu in, List<Object> out) {
-        logger.trace("ISO Transport Protocol Message sent");
-
-        if (in == null) {
-            return;
-        }
-
-        ByteBuf buf = Unpooled.buffer();
-
-        // Header length indicator field (The length byte doesn't count)
-        buf.writeByte((byte) (getHeaderLength(in) - 1));
-        // TPDU Code (First 4 bits), Initial Credit Allocation (Second 4 bits)
-        buf.writeByte(in.getTpduCode().getCode());
-        // The fixed header of a TCP TP Packet depends highly on the selected type.
-        switch (in.getTpduCode()) {
-            case CONNECTION_REQUEST:
-            case CONNECTION_CONFIRM:
-                encodeConnectionTpdu(in, buf);
-                break;
-            case DATA:
-                encodeDataTpdu((DataTpdu) in, buf);
-                break;
-            case DISCONNECT_REQUEST:
-            case DISCONNECT_CONFIRM:
-                encodeDisconnectTpdu(in, buf);
-                break;
-            case TPDU_ERROR:
-                encodeErrorTpdu(in, buf);
-                break;
-            default:
-                if (logger.isErrorEnabled()) {
-                    logger.error("TDPU Value {} not implemented yet", in.getTpduCode().name());
-                }
-                return;
-        }
-        // Add the user-data itself.
-        buf.writeBytes(in.getUserData());
-
-        // Check if the message doesn't exceed the negotiated maximum size.
-        if(buf.writerIndex() > tpduSize.getValue()) {
-            ctx.fireExceptionCaught(new PlcProtocolPayloadTooBigException(
-                "iso-tp", tpduSize.getValue(), buf.writerIndex(), in));
-        } else {
-            out.add(new IsoOnTcpMessage(buf));
-        }
-    }
-
-    private void encodeErrorTpdu(Tpdu in, ByteBuf buf) {
-        ErrorTpdu errorTpdu = (ErrorTpdu) in;
-        buf.writeShort(errorTpdu.getDestinationReference());
-        buf.writeByte(errorTpdu.getRejectCause().getCode());
-        encodeParameters(buf, in.getParameters());
-    }
-
-    private void encodeDisconnectTpdu(Tpdu in, ByteBuf buf) {
-        DisconnectTpdu disconnectTpdu = (DisconnectTpdu) in;
-        buf.writeShort(disconnectTpdu.getDestinationReference());
-        buf.writeShort(disconnectTpdu.getSourceReference());
-        if (disconnectTpdu instanceof DisconnectRequestTpdu) {
-            DisconnectRequestTpdu disconnectRequestTpdu = (DisconnectRequestTpdu) disconnectTpdu;
-            buf.writeByte(disconnectRequestTpdu.getDisconnectReason().getCode());
-        }
-        encodeParameters(buf, in.getParameters());
-    }
-
-    private void encodeDataTpdu(DataTpdu in, ByteBuf buf) {
-        // EOT (Bit 8 = 1) / TPDU (All other bits 0)
-        buf.writeByte((byte) (in.getTpduRef() | (in.isEot() ? 0x80 : 0x00)));
-        // Note: A Data TPDU in Class 0 doesn't have parameters
-    }
-
-    private void encodeConnectionTpdu(Tpdu in, ByteBuf buf) {
-        ConnectionTpdu connectionTpdu = (ConnectionTpdu) in;
-        buf.writeShort(connectionTpdu.getDestinationReference());
-        buf.writeShort(connectionTpdu.getSourceReference());
-        buf.writeByte(connectionTpdu.getProtocolClass().getCode());
-        encodeParameters(buf, in.getParameters());
-    }
-
-    private void encodeParameters(ByteBuf out, List<Parameter> parameters) {
-        if (parameters == null) {
-            return;
-        }
-
-        for (Parameter parameter : parameters) {
-            out.writeByte(parameter.getType().getCode());
-            out.writeByte((byte) (getParameterLength(parameter) - 2));
-            switch (parameter.getType()) {
-                case CALLED_TSAP:
-                case CALLING_TSAP:
-                    TsapParameter tsap = (TsapParameter) parameter;
-                    out.writeShort(tsap.getTsapId());
-                    break;
-                case CHECKSUM:
-                    ChecksumParameter checksum = (ChecksumParameter) parameter;
-                    out.writeByte(checksum.getChecksum());
-                    break;
-                case DISCONNECT_ADDITIONAL_INFORMATION:
-                    DisconnectAdditionalInformationParameter disconnectAdditionalInformation = (DisconnectAdditionalInformationParameter) parameter;
-                    out.writeBytes(disconnectAdditionalInformation.getData());
-                    break;
-                case TPDU_SIZE:
-                    TpduSizeParameter sizeParameter = (TpduSizeParameter) parameter;
-                    out.writeByte(sizeParameter.getTpduSize().getCode());
-                    break;
-                default:
-                    if (logger.isErrorEnabled()) {
-                        logger.error("TDPU tarameter type {} not implemented yet", parameter.getType().name());
-                    }
-                    return;
-            }
-        }
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    // Decoding
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    @Override
-    protected void decode(ChannelHandlerContext ctx, IsoOnTcpMessage in, List<Object> out) {
-        logger.trace("ISO TP Message received");
-        if (in == null) {
-            return;
-        }
-
-        if (logger.isDebugEnabled()) {
-            logger.debug("Got Data: {}", ByteBufUtil.hexDump(in.getUserData()));
-        }
-
-        ByteBuf userData = in.getUserData();
-        if (userData.writerIndex() < 1) {
-            return;
-        }
-
-        int packetStart = userData.readerIndex();
-        byte headerLength = userData.readByte();
-        int headerEnd = packetStart + headerLength;
-        TpduCode tpduCode = TpduCode.valueOf(userData.readByte());
-        // Read fixed header part.
-        Tpdu tpdu = null;
-        List<Parameter> parameters = new LinkedList<>();
-        switch (tpduCode) {
-            case CONNECTION_REQUEST:
-            case CONNECTION_CONFIRM:
-                tpdu = decodeConnectTpdu(ctx, userData, tpduCode, parameters);
-                break;
-            case DATA:
-                tpdu = decodeDataTpdu(userData, parameters);
-                break;
-            case DISCONNECT_REQUEST:
-            case DISCONNECT_CONFIRM:
-                tpdu = decodeDisconnectTpdu(userData, tpduCode, parameters);
-                break;
-            case TPDU_ERROR:
-                tpdu = decodeErrorTpdu(userData, parameters);
-                break;
-            default:
-                if (logger.isErrorEnabled()) {
-                    logger.error("Tpdu Code {} not implemented", tpduCode.name());
-                }
-                break;
-        }
-
-        // Read variable header parameters
-        while (userData.readerIndex() < headerEnd) {
-            Parameter parameter = decodeParameter(userData);
-            if (parameter != null) {
-                parameters.add(parameter);
-            }
-        }
-
-        if (tpdu != null) {
-            // If we got a ConnectionConfirmTpdu response we are currently
-            // in the process of establishing a connection with the PLC, so
-            // Save some of the information in the session and tell the next
-            // layer to negotiate the connection parameters.
-            if (tpdu instanceof ConnectionConfirmTpdu) {
-                tpdu.getParameter(CalledTsapParameter.class).ifPresent(
-                    calledTsapParameter -> calledTsapId = calledTsapParameter.getTsapId());
-                tpdu.getParameter(TpduSizeParameter.class).ifPresent(
-                    tpduSizeParameter -> tpduSize = tpduSizeParameter.getTpduSize());
-            }
-            out.add(new IsoTPMessage(tpdu, userData));
-        }
-    }
-
-    private Tpdu decodeErrorTpdu(ByteBuf userData, List<Parameter> parameters) {
-        Tpdu tpdu;
-        short destinationReference = userData.readShort();
-        RejectCause rejectCause = RejectCause.valueOf(userData.readByte());
-        tpdu = new ErrorTpdu(destinationReference, rejectCause, parameters, userData);
-        return tpdu;
-    }
-
-    private Tpdu decodeDisconnectTpdu(ByteBuf userData, TpduCode tpduCode, List<Parameter> parameters) {
-        Tpdu tpdu;
-        short destinationReference = userData.readShort();
-        short sourceReference = userData.readShort();
-        if (tpduCode == TpduCode.DISCONNECT_REQUEST) {
-            DisconnectReason disconnectReason = DisconnectReason.valueOf(userData.readByte());
-            tpdu = new DisconnectRequestTpdu(
-                destinationReference, sourceReference, disconnectReason, parameters, userData);
-        } else {  // TpduCode.DISCONNECT_CONFIRM
-            tpdu = new DisconnectConfirmTpdu(
-                destinationReference, sourceReference, parameters, userData);
-        }
-        return tpdu;
-    }
-
-    private Tpdu decodeDataTpdu(ByteBuf userData, List<Parameter> parameters) {
-        Tpdu tpdu;
-        byte tmp = userData.readByte();
-        // Bit 8 is the EOT indicator (1 = last TPDU)
-        boolean eot = (tmp & 0x80) == 0x80;
-        // The rest is simply a 7 bit number identifying the current request.
-        byte tpduRef = (byte) (tmp & 0x7F);
-        tpdu = new DataTpdu(eot, tpduRef, parameters, userData);
-        return tpdu;
-    }
-
-    private Tpdu decodeConnectTpdu(ChannelHandlerContext ctx, ByteBuf userData, TpduCode tpduCode, List<Parameter> parameters) {
-        Tpdu tpdu;
-        short destinationReference = userData.readShort();
-        short sourceReference = userData.readShort();
-        ProtocolClass protocolClass = ProtocolClass.valueOf(userData.readByte());
-
-        if (tpduCode == TpduCode.CONNECTION_REQUEST) {
-            tpdu = new ConnectionRequestTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
-
-        } else { // TpduCode.CONNECTION_CONFIRM
-            tpdu = new ConnectionConfirmTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
-            ctx.channel().pipeline().fireUserEventTriggered(new IsoTPConnectedEvent());
-        }
-        return tpdu;
-    }
-
-    private Parameter decodeParameter(ByteBuf out) {
-        ParameterCode parameterCode = ParameterCode.valueOf(out.readByte());
-        if (parameterCode == null) {
-            logger.error("Could not find parameter code");
-            return null;
-        }
-        byte length = out.readByte();
-        switch (parameterCode) {
-            case CALLING_TSAP:
-            case CALLED_TSAP:
-                return decodeTsapParameter(out, parameterCode);
-            case CHECKSUM:
-                byte checksum = out.readByte();
-                return new ChecksumParameter(checksum);
-            case DISCONNECT_ADDITIONAL_INFORMATION:
-                byte[] data = new byte[length];
-                out.readBytes(data);
-                return new DisconnectAdditionalInformationParameter(data);
-            case TPDU_SIZE:
-                TpduSize size = TpduSize.valueOf(out.readByte());
-                return new TpduSizeParameter(size);
-            default:
-                if (logger.isErrorEnabled()) {
-                    logger.error("Parameter not implemented yet {}", parameterCode.name());
-                }
-                return null;
-        }
-    }
-
-    private Parameter decodeTsapParameter(ByteBuf out, ParameterCode parameterCode) {
-        short tsapId = out.readShort();
-        switch (parameterCode) {
-            case CALLING_TSAP:
-                return new CallingTsapParameter(tsapId);
-            case CALLED_TSAP:
-                return new CalledTsapParameter(tsapId);
-            default:
-                if (logger.isErrorEnabled()) {
-                    logger.error("Parameter not implemented yet {}", parameterCode.name());
-                }
-                return null;
-        }
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-    // Helpers
-    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
-
-    /**
-     * Return the length of the entire header in bytes (including the size field itself)
-     * This is a sum of the fixed size header defined for the given tpdu type and the
-     * lengths of all parameters.
-     *
-     * @param tpdu Tpdu to get the header length for
-     * @return length of the iso tp header
-     */
-    private short getHeaderLength(Tpdu tpdu) {
-        if (tpdu == null) {
-            return 0;
-        }
-
-        short headerLength;
-        switch (tpdu.getTpduCode()) {
-            case CONNECTION_REQUEST:
-            case CONNECTION_CONFIRM:
-                headerLength = 7;
-                break;
-            case DATA:
-                headerLength = 3;
-                break;
-            case DISCONNECT_REQUEST:
-                headerLength = 7;
-                break;
-            case DISCONNECT_CONFIRM:
-                headerLength = 6;
-                break;
-            case TPDU_ERROR:
-                headerLength = 5;
-                break;
-            default:
-                headerLength = 0;
-                break;
-        }
-        return (short) (headerLength + getParametersLength(tpdu.getParameters()));
-    }
-
-    private short getParametersLength(List<Parameter> parameters) {
-        short length = 0;
-        if (parameters != null) {
-            for (Parameter parameter : parameters) {
-                length += getParameterLength(parameter);
-            }
-        }
-        return length;
-    }
-
-    private short getParameterLength(Parameter parameter) {
-        if (parameter == null) {
-            return 0;
-        }
-        switch (parameter.getType()) {
-            case CALLED_TSAP:
-            case CALLING_TSAP:
-                return 4;
-            case CHECKSUM:
-                return 3;
-            case DISCONNECT_ADDITIONAL_INFORMATION:
-                DisconnectAdditionalInformationParameter disconnectAdditionalInformationParameter =
-                    (DisconnectAdditionalInformationParameter) parameter;
-                return (short) (2 + ((disconnectAdditionalInformationParameter.getData() != null) ?
-                    disconnectAdditionalInformationParameter.getData().length : 0));
-            case TPDU_SIZE:
-                return 3;
-            default:
-                return 0;
-        }
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/events/IsoTPConnectedEvent.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/events/IsoTPConnectedEvent.java
deleted file mode 100644
index 4e9401c..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/events/IsoTPConnectedEvent.java
+++ /dev/null
@@ -1,22 +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.isotp.protocol.events;
-
-public class IsoTPConnectedEvent {
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessage.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessage.java
deleted file mode 100644
index 3aebf64..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessage.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.java.isotp.protocol.model;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.spi.messages.PlcRawMessage;
-import org.apache.plc4x.java.isotp.protocol.model.tpdus.Tpdu;
-
-public class IsoTPMessage extends PlcRawMessage {
-
-    private final Tpdu tpdu;
-
-    public IsoTPMessage(Tpdu tpdu, ByteBuf userData) {
-        super(userData);
-        this.tpdu = tpdu;
-    }
-
-    public Tpdu getTpdu() {
-        return tpdu;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CalledTsapParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CalledTsapParameter.java
deleted file mode 100644
index de7ce1e..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CalledTsapParameter.java
+++ /dev/null
@@ -1,34 +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.isotp.protocol.model.params;
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-
-public class CalledTsapParameter extends TsapParameter {
-
-    public CalledTsapParameter(short tsapId) {
-        super(tsapId);
-    }
-
-    @Override
-    public ParameterCode getType() {
-        return ParameterCode.CALLED_TSAP;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CallingTsapParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CallingTsapParameter.java
deleted file mode 100644
index ffc62dd..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CallingTsapParameter.java
+++ /dev/null
@@ -1,34 +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.isotp.protocol.model.params;
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-
-public class CallingTsapParameter extends TsapParameter {
-
-    public CallingTsapParameter(short tsapId) {
-        super(tsapId);
-    }
-
-    @Override
-    public ParameterCode getType() {
-        return ParameterCode.CALLING_TSAP;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/ChecksumParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/ChecksumParameter.java
deleted file mode 100644
index d2b876a..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/ChecksumParameter.java
+++ /dev/null
@@ -1,40 +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.isotp.protocol.model.params;
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-
-public class ChecksumParameter implements Parameter {
-
-    private final byte checksum;
-
-    public ChecksumParameter(byte checksum) {
-        this.checksum = checksum;
-    }
-
-    @Override
-    public ParameterCode getType() {
-        return ParameterCode.CHECKSUM;
-    }
-
-    public byte getChecksum() {
-        return checksum;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/DisconnectAdditionalInformationParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/DisconnectAdditionalInformationParameter.java
deleted file mode 100644
index 1d47c2d..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/DisconnectAdditionalInformationParameter.java
+++ /dev/null
@@ -1,41 +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.isotp.protocol.model.params;
-
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-
-public class DisconnectAdditionalInformationParameter implements Parameter {
-
-    private final byte[] data;
-
-    public DisconnectAdditionalInformationParameter(byte[] data) {
-        this.data = data;
-    }
-
-    @Override
-    public ParameterCode getType() {
-        return ParameterCode.DISCONNECT_ADDITIONAL_INFORMATION;
-    }
-
-    public byte[] getData() {
-        return data;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/Parameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/Parameter.java
deleted file mode 100644
index 4d1878d..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/Parameter.java
+++ /dev/null
@@ -1,27 +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.isotp.protocol.model.params;
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-
-public interface Parameter {
-
-    ParameterCode getType();
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TpduSizeParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TpduSizeParameter.java
deleted file mode 100644
index 7179273..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TpduSizeParameter.java
+++ /dev/null
@@ -1,41 +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.isotp.protocol.model.params;
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduSize;
-
-public class TpduSizeParameter implements Parameter {
-
-    private final TpduSize tpduSize;
-
-    public TpduSizeParameter(TpduSize tpduSize) {
-        this.tpduSize = tpduSize;
-    }
-
-    @Override
-    public ParameterCode getType() {
-        return ParameterCode.TPDU_SIZE;
-    }
-
-    public TpduSize getTpduSize() {
-        return tpduSize;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameter.java
deleted file mode 100644
index c8882fc..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameter.java
+++ /dev/null
@@ -1,36 +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.isotp.protocol.model.params;
-
-/**
- * Base class for calling and called TSAPs
- */
-public abstract class TsapParameter implements Parameter {
-
-    private final short tsapId;
-
-    public TsapParameter(short tsapId) {
-        this.tsapId = tsapId;
-    }
-
-    public short getTsapId() {
-        return tsapId;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionConfirmTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionConfirmTpdu.java
deleted file mode 100644
index 3931269..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionConfirmTpdu.java
+++ /dev/null
@@ -1,34 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.ProtocolClass;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public class ConnectionConfirmTpdu extends ConnectionTpdu {
-
-    public ConnectionConfirmTpdu(short destinationReference, short sourceReference, ProtocolClass protocolClass, List<Parameter> parameters, ByteBuf userData) {
-        super(TpduCode.CONNECTION_CONFIRM, destinationReference, sourceReference, protocolClass, parameters, userData);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionRequestTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionRequestTpdu.java
deleted file mode 100644
index 01218e3..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionRequestTpdu.java
+++ /dev/null
@@ -1,34 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.ProtocolClass;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public class ConnectionRequestTpdu extends ConnectionTpdu {
-
-    public ConnectionRequestTpdu(short destinationReference, short sourceReference, ProtocolClass protocolClass, List<Parameter> parameters, ByteBuf userData) {
-        super(TpduCode.CONNECTION_REQUEST, destinationReference, sourceReference, protocolClass, parameters, userData);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionTpdu.java
deleted file mode 100644
index 632effb..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionTpdu.java
+++ /dev/null
@@ -1,53 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.ProtocolClass;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public abstract class ConnectionTpdu extends Tpdu {
-
-    private final short destinationReference;
-    private final short sourceReference;
-    private final ProtocolClass protocolClass;
-
-    public ConnectionTpdu(TpduCode tpduCode, short destinationReference, short sourceReference, ProtocolClass protocolClass, List<Parameter> parameters, ByteBuf userData) {
-        super(tpduCode, parameters, userData);
-        this.destinationReference = destinationReference;
-        this.sourceReference = sourceReference;
-        this.protocolClass = protocolClass;
-    }
-
-    public short getDestinationReference() {
-        return destinationReference;
-    }
-
-    public short getSourceReference() {
-        return sourceReference;
-    }
-
-    public ProtocolClass getProtocolClass() {
-        return protocolClass;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/CustomTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/CustomTpdu.java
deleted file mode 100644
index c5cbae1..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/CustomTpdu.java
+++ /dev/null
@@ -1,33 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public class CustomTpdu extends Tpdu  {
-
-    public CustomTpdu(Byte tpduCode, List<Parameter> parameters, ByteBuf userData) {
-        super(TpduCode.valueOf(tpduCode), parameters, userData);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DataTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DataTpdu.java
deleted file mode 100644
index f76f7b2..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DataTpdu.java
+++ /dev/null
@@ -1,51 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.spi.messages.PlcProtocolMessage;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public class DataTpdu extends Tpdu {
-
-    private final boolean eot;
-    private final byte tpduRef;
-
-    public DataTpdu(boolean eot, byte tpduRef, List<Parameter> parameters, ByteBuf userData) {
-        this(eot, tpduRef, parameters, userData, null);
-    }
-
-    public DataTpdu(boolean eot, byte tpduRef, List<Parameter> parameters, ByteBuf userData, PlcProtocolMessage parent) {
-        super(TpduCode.DATA, parameters, userData, parent);
-        this.eot = eot;
-        this.tpduRef = tpduRef;
-    }
-
-    public boolean isEot() {
-        return eot;
-    }
-
-    public byte getTpduRef() {
-        return tpduRef;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectConfirmTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectConfirmTpdu.java
deleted file mode 100644
index e6d1815..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectConfirmTpdu.java
+++ /dev/null
@@ -1,33 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public class DisconnectConfirmTpdu extends DisconnectTpdu {
-
-    public DisconnectConfirmTpdu(short destinationReference, short sourceReference, List<Parameter> parameters, ByteBuf userData) {
-        super(TpduCode.DISCONNECT_CONFIRM, destinationReference, sourceReference, parameters, userData);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectRequestTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectRequestTpdu.java
deleted file mode 100644
index 149c366..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectRequestTpdu.java
+++ /dev/null
@@ -1,41 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.DisconnectReason;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public class DisconnectRequestTpdu extends DisconnectTpdu {
-
-    private final DisconnectReason disconnectReason;
-
-    public DisconnectRequestTpdu(short destinationReference, short sourceReference, DisconnectReason disconnectReason, List<Parameter> parameters, ByteBuf userData) {
-        super(TpduCode.DISCONNECT_REQUEST, destinationReference, sourceReference, parameters, userData);
-        this.disconnectReason = disconnectReason;
-    }
-
-    public DisconnectReason getDisconnectReason() {
-        return disconnectReason;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectTpdu.java
deleted file mode 100644
index 4596d2e..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectTpdu.java
+++ /dev/null
@@ -1,46 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public abstract class DisconnectTpdu extends Tpdu {
-
-    private final short destinationReference;
-    private final short sourceReference;
-
-    public DisconnectTpdu(TpduCode tpduCode, short destinationReference, short sourceReference, List<Parameter> parameters, ByteBuf userData) {
-        super(tpduCode, parameters, userData);
-        this.destinationReference = destinationReference;
-        this.sourceReference = sourceReference;
-    }
-
-    public short getDestinationReference() {
-        return destinationReference;
-    }
-
-    public short getSourceReference() {
-        return sourceReference;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ErrorTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ErrorTpdu.java
deleted file mode 100644
index a526f8a..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ErrorTpdu.java
+++ /dev/null
@@ -1,47 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.RejectCause;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-
-public class ErrorTpdu extends Tpdu {
-
-    private final short destinationReference;
-    private final RejectCause rejectCause;
-
-    public ErrorTpdu(short destinationReference, RejectCause rejectCause, List<Parameter> parameters, ByteBuf userData) {
-        super(TpduCode.TPDU_ERROR, parameters, userData);
-        this.destinationReference = destinationReference;
-        this.rejectCause = rejectCause;
-    }
-
-    public short getDestinationReference() {
-        return destinationReference;
-    }
-
-    public RejectCause getRejectCause() {
-        return rejectCause;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/Tpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/Tpdu.java
deleted file mode 100644
index 1bd9b3c..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/Tpdu.java
+++ /dev/null
@@ -1,64 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.spi.messages.PlcProtocolMessage;
-import org.apache.plc4x.java.spi.messages.PlcRawMessage;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-
-import java.util.List;
-import java.util.Optional;
-
-public abstract class Tpdu extends PlcRawMessage {
-
-    private final TpduCode tpduCode;
-    private final List<Parameter> parameters;
-
-    public Tpdu(TpduCode tpduCode, List<Parameter> parameters, ByteBuf userData) {
-        this(tpduCode, parameters, userData, null);
-    }
-
-    public Tpdu(TpduCode tpduCode, List<Parameter> parameters, ByteBuf userData, PlcProtocolMessage parent) {
-        super(userData, parent);
-        this.tpduCode = tpduCode;
-        this.parameters = parameters;
-    }
-
-    public TpduCode getTpduCode() {
-        return tpduCode;
-    }
-
-    public List<Parameter> getParameters() {
-        return parameters;
-    }
-
-    public <T extends Parameter> Optional<T> getParameter(Class<T> parameterClass) {
-        if (parameters != null) {
-            for (Parameter parameter : parameters) {
-                if (parameter.getClass() == parameterClass) {
-                    return Optional.of(parameterClass.cast(parameter));
-                }
-            }
-        }
-        return Optional.empty();
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DeviceGroup.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DeviceGroup.java
deleted file mode 100644
index a2ce863..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DeviceGroup.java
+++ /dev/null
@@ -1,51 +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.isotp.protocol.model.types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum DeviceGroup {
-    PG_OR_PC((byte) 0x01),
-    OS((byte) 0x02),
-    OTHERS((byte) 0x03);
-
-    private static final Map<Byte, DeviceGroup> map;
-    static {
-        map = new HashMap<>();
-        for (DeviceGroup deviceGroup : DeviceGroup.values()) {
-            map.put(deviceGroup.code, deviceGroup);
-        }
-    }
-
-    private final byte code;
-
-    DeviceGroup(byte code) {
-        this.code = code;
-    }
-
-    public byte getCode() {
-        return code;
-    }
-
-    public static DeviceGroup valueOf(byte code) {
-        return map.get(code);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DisconnectReason.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DisconnectReason.java
deleted file mode 100644
index a776909..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DisconnectReason.java
+++ /dev/null
@@ -1,64 +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.isotp.protocol.model.types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum DisconnectReason {
-    // Reasons available for all classes:
-    REASON_NOT_SPECIFIED((byte) 0x00),
-    CONGESTION_AT_TSAP((byte) 0x01),
-    SESSION_ENTITY_NOT_ATACHED_TO_TSAP((byte) 0x02),
-    ADDRESS_UNKNOWN((byte) 0x03),
-
-    // Reasons only available for classes 1 to 4:
-    NORMAL((byte) 0x80),
-    REMOTE_TRANSPORT_ENTITY_CONGESTION((byte) 0x81),
-    CONNECTION_NEGOTIATION_FAILED((byte) 0x82),
-    DUPLICATE_SOURCE_REFERENCE((byte) 0x83),
-    MISMATCHED_REFERENCES((byte) 0x84),
-    PROTOCOL_ERROR((byte) 0x85),
-    REFERENCE_OVERFLOW((byte) 0x87),
-    CONNECTION_REQUEST_REFUSED((byte) 0x88),
-    HEADER_OR_PARAMETER_LENGTH_INVALID((byte) 0x8A);
-
-    private static final Map<Byte, DisconnectReason> map;
-    static {
-        map = new HashMap<>();
-        for (DisconnectReason disconnectReason : DisconnectReason.values()) {
-            map.put(disconnectReason.code, disconnectReason);
-        }
-    }
-
-    private final byte code;
-
-    DisconnectReason(byte code) {
-        this.code = code;
-    }
-
-    public byte getCode() {
-        return code;
-    }
-
-    public static DisconnectReason valueOf(byte code) {
-        return map.get(code);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ParameterCode.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ParameterCode.java
deleted file mode 100644
index 98fdf36..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ParameterCode.java
+++ /dev/null
@@ -1,75 +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.isotp.protocol.model.types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-/**
- * Generally based upon RFC 905, but there were some inconsistencies in the spec:
- * - RESIDUAL_ERROR_RATE was defined twice with different codes
- * - The code 0x89 was defined for two types.
- * This version was extracted from information generated by the PcapGenerator.
- */
-public enum ParameterCode {
-    ATN_EXTENDED_CHECKSUM_32BIT((byte) 0x08),
-    ATN_EXTENDED_CHECKSUM_16BIT((byte) 0x09),
-    ACKNOWLEDGE_TIME((byte) 0x85),
-    RESIDUAL_ERROR_RATE((byte) 0x86),
-    PRIORITY((byte) 0x87),
-    TRANSIT_DELAY((byte) 0x88),
-    THROUGHPUT((byte) 0x89),
-    SEQUENCE_NUMBER((byte) 0x8A),
-    REASSIGNMENT((byte) 0x8B),
-    FLOW_CONTROL((byte) 0x8C),
-    TPDU_SIZE((byte) 0xC0),
-    CALLING_TSAP((byte) 0xC1),
-    CALLED_TSAP((byte) 0xC2),
-    CHECKSUM((byte) 0xC3),
-    VERSION((byte) 0xC4),
-    SECURITY_PARAMETERS((byte) 0xC5),
-    ADDITIONAL_OPTION_SELECTION((byte) 0xC6),
-    ALTERNATIVE_PROTOCOL_CLASS((byte) 0xC7),
-    DISCONNECT_ADDITIONAL_INFORMATION((byte) 0xE0),
-    PREFERRED_MAX_PDU_SIZE((byte) 0xF0),
-    INACTIVITY_TIMER((byte) 0xF2);
-
-    private static final Map<Byte, ParameterCode> map;
-    static {
-        map = new HashMap<>();
-        for (ParameterCode parameterCode : ParameterCode.values()) {
-            map.put(parameterCode.code, parameterCode);
-        }
-    }
-
-    private final byte code;
-
-    ParameterCode(byte code) {
-        this.code = code;
-    }
-
-    public byte getCode() {
-        return code;
-    }
-
-    public static ParameterCode valueOf(byte code) {
-        return map.get(code);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ProtocolClass.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ProtocolClass.java
deleted file mode 100644
index b8f1c6f..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ProtocolClass.java
+++ /dev/null
@@ -1,53 +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.isotp.protocol.model.types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum ProtocolClass {
-    CLASS_0((byte) 0x00),
-    CLASS_1((byte) 0x10),
-    CLASS_2((byte) 0x20),
-    CLASS_3((byte) 0x30),
-    CLASS_4((byte) 0x40);
-
-    private static final Map<Byte, ProtocolClass> map;
-    static {
-        map = new HashMap<>();
-        for (ProtocolClass protocolClass : ProtocolClass.values()) {
-            map.put(protocolClass.code, protocolClass);
-        }
-    }
-
-    private final byte code;
-
-    ProtocolClass(byte code) {
-        this.code = code;
-    }
-
-    public byte getCode() {
-        return code;
-    }
-
-    public static ProtocolClass valueOf(byte code) {
-        return map.get(code);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/RejectCause.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/RejectCause.java
deleted file mode 100644
index 0152bae..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/RejectCause.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.java.isotp.protocol.model.types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum RejectCause {
-    REASON_NOT_SPECIFIED((byte) 0x00),
-    INVALID_PARAMETER_CODE((byte) 0x01),
-    INVALID_TPDU_TYPE((byte) 0x02),
-    INVALID_PARAMETER_TYPE((byte) 0x03);
-
-    private static final Map<Byte, RejectCause> map;
-    static {
-        map = new HashMap<>();
-        for (RejectCause rejectCause : RejectCause.values()) {
-            map.put(rejectCause.code, rejectCause);
-        }
-    }
-
-    private final byte code;
-
-    RejectCause(byte code) {
-        this.code = code;
-    }
-
-    public byte getCode() {
-        return code;
-    }
-
-    public static RejectCause valueOf(byte code) {
-        return map.get(code);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduCode.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduCode.java
deleted file mode 100644
index 9f63059..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduCode.java
+++ /dev/null
@@ -1,62 +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.isotp.protocol.model.types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum TpduCode {
-    DATA((byte) 0xF0),
-    DATA_ACKNOWLEDGEMENT((byte) 0x60),
-    CONNECTION_REQUEST((byte) 0xE0),
-    CONNECTION_CONFIRM((byte) 0xD0),
-    DISCONNECT_REQUEST((byte) 0x80),
-    DISCONNECT_CONFIRM((byte) 0xC0),
-    EXPEDITED_DATA((byte) 0x10),
-    EXPEDITED_DATA_ACKNOWLEDGEMENT((byte) 0x20),
-    REJECT((byte) 0x50),
-    TPDU_ERROR((byte) 0x70),
-    TPDU_UNKNOWN((byte) 0xFF);
-
-    private static final Map<Byte, TpduCode> map;
-    static {
-        map = new HashMap<>();
-        for (TpduCode tpduCode : TpduCode.values()) {
-            map.put(tpduCode.code, tpduCode);
-        }
-    }
-
-    private final byte code;
-
-    TpduCode(byte code) {
-        this.code = code;
-    }
-
-    public byte getCode() {
-        return code;
-    }
-
-    public static TpduCode valueOf(byte code) {
-        if (map.containsKey(code)) {
-            return map.get(code);
-        }
-        return TpduCode.TPDU_UNKNOWN;
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduSize.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduSize.java
deleted file mode 100644
index d6386d2..0000000
--- a/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduSize.java
+++ /dev/null
@@ -1,78 +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.isotp.protocol.model.types;
-
-import java.util.HashMap;
-import java.util.Map;
-
-public enum TpduSize {
-    SIZE_128((byte) 0x07, 128),
-    SIZE_256((byte) 0x08, 256),
-    SIZE_512((byte) 0x09, 512),
-    SIZE_1024((byte) 0x0a, 1024),
-    SIZE_2048((byte) 0x0b, 2048),
-    SIZE_4096((byte) 0x0c, 4096),
-    SIZE_8192((byte) 0x0d, 8192);
-
-    private static final Map<Byte, TpduSize> map;
-    static {
-        map = new HashMap<>();
-        for (TpduSize tpduSize : TpduSize.values()) {
-            map.put(tpduSize.code, tpduSize);
-        }
-    }
-
-    private final byte code;
-    private final int value;
-
-    TpduSize(byte code, int value) {
-        this.code = code;
-        this.value = value;
-    }
-
-    public byte getCode() {
-        return code;
-    }
-
-    public int getValue() {
-        return value;
-    }
-
-    public static TpduSize valueForGivenSize(int pduSize) {
-        if(pduSize <= 0) {
-            throw new IllegalArgumentException("PduSize has to be greater than 0");
-        }
-        for (TpduSize tpduSize : values()) {
-            if(tpduSize.getValue() >= pduSize) {
-                return tpduSize;
-            }
-        }
-        // If the requested pdu size is greater than 8MB,
-        // Simply use that as the given size is simple a
-        // requested size, if the remote responds with a
-        // lower value the application has to live with
-        // this anyway.
-        return SIZE_8192;
-    }
-
-    public static TpduSize valueOf(byte code) {
-        return map.get(code);
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocolTest.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocolTest.java
deleted file mode 100644
index d1d0fff..0000000
--- a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocolTest.java
+++ /dev/null
@@ -1,635 +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.isotp.protocol;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.ChannelHandlerContext;
-import org.apache.plc4x.java.isoontcp.protocol.model.IsoOnTcpMessage;
-import org.apache.plc4x.java.isotp.protocol.model.IsoTPMessage;
-import org.apache.plc4x.java.isotp.protocol.model.params.*;
-import org.apache.plc4x.java.isotp.protocol.model.tpdus.*;
-import org.apache.plc4x.java.isotp.protocol.model.types.*;
-import org.apache.plc4x.test.FastTests;
-import org.junit.After;
-import org.junit.Before;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import java.util.ArrayList;
-import java.util.Collections;
-
-import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
-import static org.hamcrest.collection.IsEmptyCollection.empty;
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-import static org.mockito.Mockito.RETURNS_DEEP_STUBS;
-import static org.mockito.Mockito.mock;
-
-public class IsoTPProtocolTest {
-
-    private IsoTPProtocol isoTPProtocol;
-    private ChannelHandlerContext ctx;
-    private ByteBuf buf;
-    private ArrayList<Object> out;
-
-    @Before
-    public void setup() {
-        byte rackNo = 1;
-        byte slotNo = 4;
-        TpduSize tpduSize = TpduSize.SIZE_512;
-
-        isoTPProtocol = new IsoTPProtocol(rackNo, slotNo, tpduSize);
-        ctx = mock(ChannelHandlerContext.class, RETURNS_DEEP_STUBS);
-        buf = Unpooled.buffer();
-        out = new ArrayList<>();
-    }
-
-    @After
-    public void terDown() {
-        isoTPProtocol = null;
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeConnectionRequest() {
-        ConnectionRequestTpdu tpdu = new ConnectionRequestTpdu((short) 0x1, (short) (0x2), ProtocolClass.CLASS_0, Collections.emptyList(), buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("PlcRawMessage not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(7));
-        assertThat(userData.readByte(), equalTo((byte) 0x6));
-        assertThat(userData.readByte(), equalTo(TpduCode.CONNECTION_REQUEST.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readShort(), equalTo((short) 0x2));
-        assertThat(userData.readByte(), equalTo(ProtocolClass.CLASS_0.getCode()));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeConnectionRequest() {
-        buf.writeByte(0x6) // header length
-            .writeByte(TpduCode.CONNECTION_REQUEST.getCode())
-            .writeShort(0x01) // destination reference
-            .writeShort(0x02) // source reference
-            .writeByte(ProtocolClass.CLASS_0.getCode());
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ConnectionRequestTpdu requestTpdu = (ConnectionRequestTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(requestTpdu.getTpduCode(), equalTo(TpduCode.CONNECTION_REQUEST));
-        assertThat(requestTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(requestTpdu.getSourceReference(), equalTo((short) 0x2));
-        assertThat(requestTpdu.getProtocolClass(), equalTo(ProtocolClass.CLASS_0));
-        assertThat(requestTpdu.getParameters(), empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeDisconnectionRequest() {
-        DisconnectRequestTpdu tpdu = new DisconnectRequestTpdu((short) 0x1, (short) (0x2), DisconnectReason.NORMAL, Collections.emptyList(), buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(7));
-        assertThat(userData.readByte(), equalTo((byte) 0x6));
-        assertThat(userData.readByte(), equalTo(TpduCode.DISCONNECT_REQUEST.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readShort(), equalTo((short) 0x2));
-        assertThat(userData.readByte(), equalTo(DisconnectReason.NORMAL.getCode()));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeDisconnectionRequest() {
-        buf.writeByte(0x6) // header length
-            .writeByte(TpduCode.DISCONNECT_REQUEST.getCode())
-            .writeShort(0x01) // destination reference
-            .writeShort(0x02) // source reference
-            .writeByte(DisconnectReason.NORMAL.getCode());
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        DisconnectRequestTpdu requestTpdu = (DisconnectRequestTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(requestTpdu.getTpduCode(), equalTo(TpduCode.DISCONNECT_REQUEST));
-        assertThat(requestTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(requestTpdu.getSourceReference(), equalTo((short) 0x2));
-        assertThat(requestTpdu.getDisconnectReason(), equalTo(DisconnectReason.NORMAL));
-        assertThat(requestTpdu.getParameters(), empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeData() {
-        DataTpdu tpdu = new DataTpdu(true, (byte) 0x7, Collections.emptyList(), buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(3));
-        assertThat(userData.readByte(), equalTo((byte) 0x2));
-        assertThat(userData.readByte(), equalTo(TpduCode.DATA.getCode()));
-        assertThat(userData.readByte(), equalTo((byte) 0x87));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeDataEOT() {
-        buf.writeByte(0x3) // header length
-            .writeByte(TpduCode.DATA.getCode())
-            .writeByte((byte) 0x81); // Tpdu code + EOT
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        DataTpdu requestTpdu = (DataTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(requestTpdu.getTpduCode(), equalTo(TpduCode.DATA));
-        assertThat(requestTpdu.getTpduRef(), equalTo((byte) 0x1));
-        assertThat(requestTpdu.isEot(), is(true));
-        assertThat(requestTpdu.getParameters(), empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeData() {
-        buf.writeByte(0x3) // header length
-            .writeByte(TpduCode.DATA.getCode())
-            .writeByte((byte) 0x1); // Tpdu code
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        DataTpdu requestTpdu = (DataTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(requestTpdu.getTpduCode(), equalTo(TpduCode.DATA));
-        assertThat(requestTpdu.getTpduRef(), equalTo((byte) 0x1));
-        assertThat(!requestTpdu.isEot(), is(true));
-        assertThat(requestTpdu.getParameters(), empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeConnectionConfirm() {
-        ConnectionConfirmTpdu tpdu = new ConnectionConfirmTpdu((short) 0x1, (short) (0x2), ProtocolClass.CLASS_1, Collections.emptyList(), buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(7));
-        assertThat(userData.readByte(), equalTo((byte) 0x6));
-        assertThat(userData.readByte(), equalTo(TpduCode.CONNECTION_CONFIRM.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readShort(), equalTo((short) 0x2));
-        assertThat(userData.readByte(), equalTo(ProtocolClass.CLASS_1.getCode()));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeConnectionConfirm() {
-        buf.writeByte(0x6) // header length
-            .writeByte(TpduCode.CONNECTION_CONFIRM.getCode())
-            .writeShort(0x01) // destination reference
-            .writeShort(0x02) // source reference
-            .writeByte(ProtocolClass.CLASS_0.getCode());
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ConnectionConfirmTpdu requestTpdu = (ConnectionConfirmTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(requestTpdu.getTpduCode(), equalTo(TpduCode.CONNECTION_CONFIRM));
-        assertThat(requestTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(requestTpdu.getSourceReference(), equalTo((short) 0x2));
-        assertThat(requestTpdu.getProtocolClass(), equalTo(ProtocolClass.CLASS_0));
-        assertThat(requestTpdu.getParameters(), empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeDisconnectionConfirm() {
-        DisconnectConfirmTpdu tpdu = new DisconnectConfirmTpdu((short) 0x1, (short) (0x2), Collections.emptyList(), buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(6));
-        assertThat(userData.readByte(), equalTo((byte) 0x5));
-        assertThat(userData.readByte(), equalTo(TpduCode.DISCONNECT_CONFIRM.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readShort(), equalTo((short) 0x2));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeDisconnectionConfirm() {
-        buf.writeByte(0x5) // header length
-            .writeByte(TpduCode.DISCONNECT_CONFIRM.getCode())
-            .writeShort(0x01) // destination reference
-            .writeShort(0x02) // source reference
-            .writeByte(DisconnectReason.NORMAL.getCode());
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        DisconnectConfirmTpdu requestTpdu = (DisconnectConfirmTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(requestTpdu.getTpduCode(), equalTo(TpduCode.DISCONNECT_CONFIRM));
-        assertThat(requestTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(requestTpdu.getSourceReference(), equalTo((short) 0x2));
-        assertThat(requestTpdu.getParameters(), empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeError() {
-        ErrorTpdu tpdu = new ErrorTpdu((short) 0x1, RejectCause.REASON_NOT_SPECIFIED, Collections.emptyList(), buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(5));
-        assertThat(userData.readByte(), equalTo((byte) 0x4));
-        assertThat(userData.readByte(), equalTo(TpduCode.TPDU_ERROR.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readByte(), equalTo(RejectCause.REASON_NOT_SPECIFIED.getCode()));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeCallingParameter() {
-        ArrayList<Parameter> parmameters = new ArrayList<>();
-        short firstByte = (short) (DeviceGroup.PG_OR_PC.getCode() << 8);
-        short secondByte = (short) ((0x7 << 4) | (0xe1 & 0x0F));
-        CallingTsapParameter callingParameter = new CallingTsapParameter(
-            // slot number too big and overflows into rack
-            (short) (firstByte | secondByte));
-        parmameters.add(callingParameter);
-        ErrorTpdu tpdu = new ErrorTpdu((short) 0x1, RejectCause.REASON_NOT_SPECIFIED, parmameters, buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(9));
-        assertThat(userData.readByte(), equalTo((byte) 0x8));
-        assertThat(userData.readByte(), equalTo(TpduCode.TPDU_ERROR.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readByte(), equalTo(RejectCause.REASON_NOT_SPECIFIED.getCode()));
-        assertThat(userData.readByte(), equalTo(ParameterCode.CALLING_TSAP.getCode()));
-        assertThat(userData.readByte(), equalTo((byte) 0x2));
-        assertThat(userData.readByte(), equalTo(DeviceGroup.PG_OR_PC.getCode()));
-        byte rackAndSlot = userData.readByte();
-        assertThat((rackAndSlot & 0xf0) >> 4, equalTo(0x7));
-        assertThat((rackAndSlot & 0x0f), equalTo(0xe1 & 0x0f));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeChecksumParameter() {
-        ArrayList<Parameter> parmameters = new ArrayList<>();
-        ChecksumParameter checksumParameter = new ChecksumParameter((byte) 0x77);
-        parmameters.add(checksumParameter);
-        ErrorTpdu tpdu = new ErrorTpdu((short) 0x1, RejectCause.REASON_NOT_SPECIFIED, parmameters, buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(8));
-        assertThat(userData.readByte(), equalTo((byte) 0x7));
-        assertThat(userData.readByte(), equalTo(TpduCode.TPDU_ERROR.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readByte(), equalTo(RejectCause.REASON_NOT_SPECIFIED.getCode()));
-        assertThat(userData.readByte(), equalTo(ParameterCode.CHECKSUM.getCode()));
-        assertThat(userData.readByte(), equalTo((byte) 0x1));
-        assertThat(userData.readByte(), equalTo((byte) 0x77));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeAditionalInformationParameter() {
-        ArrayList<Parameter> parmameters = new ArrayList<>();
-        byte[] data = {'O', 'p', 'p', 's'};
-        DisconnectAdditionalInformationParameter informationParameter = new DisconnectAdditionalInformationParameter(data);
-        parmameters.add(informationParameter);
-        ErrorTpdu tpdu = new ErrorTpdu((short) 0x1, RejectCause.REASON_NOT_SPECIFIED, parmameters, buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(11));
-        assertThat(userData.readByte(), equalTo((byte) 0xA));
-        assertThat(userData.readByte(), equalTo(TpduCode.TPDU_ERROR.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readByte(), equalTo(RejectCause.REASON_NOT_SPECIFIED.getCode()));
-        assertThat(userData.readByte(), equalTo(ParameterCode.DISCONNECT_ADDITIONAL_INFORMATION.getCode()));
-        assertThat(userData.readByte(), equalTo((byte) 0x4));
-        assertThat(userData.readByte(), equalTo((byte) 'O'));
-        assertThat(userData.readByte(), equalTo((byte) 'p'));
-        assertThat(userData.readByte(), equalTo((byte) 'p'));
-        assertThat(userData.readByte(), equalTo((byte) 's'));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeSizeParameter() {
-        ArrayList<Parameter> parmameters = new ArrayList<>();
-        TpduSizeParameter sizeParameter = new TpduSizeParameter(TpduSize.SIZE_512);
-        parmameters.add(sizeParameter);
-        ErrorTpdu tpdu = new ErrorTpdu((short) 0x1, RejectCause.REASON_NOT_SPECIFIED, parmameters, buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ByteBuf userData = ((IsoOnTcpMessage) out.get(0)).getUserData();
-
-        assertThat(userData.writerIndex(), equalTo(8));
-        assertThat(userData.readByte(), equalTo((byte) 0x7));
-        assertThat(userData.readByte(), equalTo(TpduCode.TPDU_ERROR.getCode()));
-        assertThat(userData.readShort(), equalTo((short) 0x1));
-        assertThat(userData.readByte(), equalTo(RejectCause.REASON_NOT_SPECIFIED.getCode()));
-        assertThat(userData.readByte(), equalTo(ParameterCode.TPDU_SIZE.getCode()));
-        assertThat(userData.readByte(), equalTo((byte) 0x1));
-        assertThat(userData.readByte(), equalTo(TpduSize.SIZE_512.getCode()));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeError() {
-        buf.writeByte(0x4) // header length
-            .writeByte(TpduCode.TPDU_ERROR.getCode())
-            .writeShort(0x01) // destination reference
-            .writeByte(RejectCause.REASON_NOT_SPECIFIED.getCode());
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ErrorTpdu errorTpdu = (ErrorTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(errorTpdu.getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        assertThat(errorTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(errorTpdu.getRejectCause(), equalTo(RejectCause.REASON_NOT_SPECIFIED));
-        assertThat(errorTpdu.getParameters(), empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeNullRequest() {
-        isoTPProtocol.encode(ctx, null, out);
-        assertThat("Message not decoded", out, empty());
-
-        isoTPProtocol.encode(ctx, null, out);
-        assertThat("Message not decoded", out, empty());
-    }
-
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeNull() {
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-        assertThat("Message not decoded", out, empty());
-
-        isoTPProtocol.decode(ctx, null, out);
-        assertThat("Message not decoded", out, empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void encodeUnsupported() {
-        ArrayList<Parameter> parmameters = new ArrayList<>();
-        CustomTpdu tpdu = new CustomTpdu((byte) 0x7F, parmameters, buf);
-
-        isoTPProtocol.encode(ctx, tpdu, out);
-        assertThat("Message not decoded", out, empty());
-    }
-
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeUnsupported() {
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-        buf.writeByte(0x3) // header length
-            .writeByte(0x7F)
-            .writeShort(0x01); // destination reference
-        isoTPProtocol.decode(ctx, in, out);
-        assertThat("Message not decoded", out, empty());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeCallingParameter() {
-        buf.writeByte(0x8) // header length
-            .writeByte(TpduCode.TPDU_ERROR.getCode())
-            .writeShort(0x01) // destination reference
-            .writeByte(RejectCause.REASON_NOT_SPECIFIED.getCode()) // reject clause
-            .writeByte(ParameterCode.CALLING_TSAP.getCode())
-            .writeByte(0x2) // parameter length
-            .writeByte(DeviceGroup.PG_OR_PC.getCode())
-            .writeByte((byte) ((0x1 << 4) | 0x7));
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ErrorTpdu errorTpdu = (ErrorTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(errorTpdu.getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        assertThat(errorTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(errorTpdu.getRejectCause(), equalTo(RejectCause.REASON_NOT_SPECIFIED));
-        assertThat(errorTpdu.getParameters(), hasSize(1));
-        CallingTsapParameter parameter = (CallingTsapParameter) errorTpdu.getParameters().get(0);
-        assertThat(parameter.getType(), equalTo(ParameterCode.CALLING_TSAP));
-        short firstByte = (short) (DeviceGroup.PG_OR_PC.getCode() << 8);
-        short secondByte = (short) ((0x1 << 4) | (0x7 & 0x0F));
-        short expectedTsapId = (short) (firstByte | secondByte);
-        assertThat(parameter.getTsapId(), equalTo(expectedTsapId));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeCalledParameter() {
-        buf.writeByte(0x8) // header length
-            .writeByte(TpduCode.TPDU_ERROR.getCode())
-            .writeShort(0x01) // destination reference
-            .writeByte(RejectCause.REASON_NOT_SPECIFIED.getCode()) // reject clause
-            .writeByte(ParameterCode.CALLED_TSAP.getCode())
-            .writeByte(0x2) // parameter length
-            .writeByte(DeviceGroup.PG_OR_PC.getCode())
-            .writeByte((byte) ((0x2 << 4) | 0x3));
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ErrorTpdu errorTpdu = (ErrorTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(errorTpdu.getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        assertThat(errorTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(errorTpdu.getRejectCause(), equalTo(RejectCause.REASON_NOT_SPECIFIED));
-        assertThat(errorTpdu.getParameters(), hasSize(1));
-        CalledTsapParameter parameter = (CalledTsapParameter) errorTpdu.getParameters().get(0);
-        assertThat(parameter.getType(), equalTo(ParameterCode.CALLED_TSAP));
-        short firstByte = (short) (DeviceGroup.PG_OR_PC.getCode() << 8);
-        short secondByte = (short) ((0x2 << 4) | (0x3 & 0x0F));
-        short expectedTsapId = (short) (firstByte | secondByte);
-        assertThat(parameter.getTsapId(), equalTo(expectedTsapId));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeChecksumParameter() {
-        buf.writeByte(0x8) // header length
-            .writeByte(TpduCode.TPDU_ERROR.getCode())
-            .writeShort(0x01) // destination reference
-            .writeByte(RejectCause.REASON_NOT_SPECIFIED.getCode()) // reject clause
-            .writeByte(ParameterCode.CHECKSUM.getCode())
-            .writeByte(0x1) // parameter length
-            .writeByte(0x33); // checksum
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ErrorTpdu errorTpdu = (ErrorTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(errorTpdu.getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        assertThat(errorTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(errorTpdu.getRejectCause(), equalTo(RejectCause.REASON_NOT_SPECIFIED));
-        assertThat(errorTpdu.getParameters(), hasSize(1));
-        ChecksumParameter parameter = (ChecksumParameter) errorTpdu.getParameters().get(0);
-        assertThat(parameter.getType(), equalTo(ParameterCode.CHECKSUM));
-        assertThat(parameter.getChecksum(), equalTo((byte) 0x33));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeSizeParameter() {
-        buf.writeByte(0x8) // header length
-            .writeByte(TpduCode.TPDU_ERROR.getCode())
-            .writeShort(0x01) // destination reference
-            .writeByte(RejectCause.REASON_NOT_SPECIFIED.getCode()) // reject clause
-            .writeByte(ParameterCode.TPDU_SIZE.getCode())
-            .writeByte(0x1) // parameter length
-            .writeByte(TpduSize.SIZE_256.getCode());
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ErrorTpdu errorTpdu = (ErrorTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(errorTpdu.getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        assertThat(errorTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(errorTpdu.getRejectCause(), equalTo(RejectCause.REASON_NOT_SPECIFIED));
-        assertThat(errorTpdu.getParameters(), hasSize(1));
-        TpduSizeParameter parameter = (TpduSizeParameter) errorTpdu.getParameters().get(0);
-        assertThat(parameter.getType(), equalTo(ParameterCode.TPDU_SIZE));
-        assertThat(parameter.getTpduSize(), equalTo(TpduSize.SIZE_256));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void decodeAdditionalInformationParameter() {
-        buf.writeByte(0x8) // header length
-            .writeByte(TpduCode.TPDU_ERROR.getCode())
-            .writeShort(0x01) // destination reference
-            .writeByte(RejectCause.REASON_NOT_SPECIFIED.getCode()) // reject clause
-            .writeByte(ParameterCode.DISCONNECT_ADDITIONAL_INFORMATION.getCode())
-            .writeByte(0x5) // parameter length
-            .writeByte('E')
-            .writeByte('r')
-            .writeByte('r')
-            .writeByte('o')
-            .writeByte('r');
-        IsoOnTcpMessage in = new IsoOnTcpMessage(buf);
-
-        isoTPProtocol.decode(ctx, in, out);
-
-        assertThat("Message not decoded", out, hasSize(1));
-
-        ErrorTpdu errorTpdu = (ErrorTpdu) ((IsoTPMessage) out.get(0)).getTpdu();
-
-        assertThat(errorTpdu.getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        assertThat(errorTpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(errorTpdu.getRejectCause(), equalTo(RejectCause.REASON_NOT_SPECIFIED));
-        assertThat(errorTpdu.getParameters(), hasSize(1));
-        DisconnectAdditionalInformationParameter parameter = (DisconnectAdditionalInformationParameter) errorTpdu.getParameters().get(0);
-        assertThat(parameter.getType(), equalTo(ParameterCode.DISCONNECT_ADDITIONAL_INFORMATION));
-        byte[] data = parameter.getData();
-        assertThat(data[0], equalTo((byte) 'E'));
-        assertThat(data[1], equalTo((byte) 'r'));
-        assertThat(data[2], equalTo((byte) 'r'));
-        assertThat(data[3], equalTo((byte) 'o'));
-        assertThat(data[4], equalTo((byte) 'r'));
-    }
-
-}
diff --git a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessageTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessageTests.java
deleted file mode 100644
index e02cc26..0000000
--- a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessageTests.java
+++ /dev/null
@@ -1,61 +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.isotp.protocol.model;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.tpdus.ErrorTpdu;
-import org.apache.plc4x.java.isotp.protocol.model.types.RejectCause;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
-import org.apache.plc4x.test.FastTests;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import java.util.Collections;
-import java.util.List;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-public class IsoTPMessageTests {
-
-    @Test
-    @Category(FastTests.class)
-    public void isoTPMessage() {
-        short destinationReference = 0x1;
-        RejectCause rejectCause = RejectCause.REASON_NOT_SPECIFIED;
-        List<Parameter> parameters = Collections.emptyList();
-        ByteBuf errorData = Unpooled.buffer();
-        ErrorTpdu tpdu = new ErrorTpdu(destinationReference, rejectCause, parameters, errorData);
-        ByteBuf userData = Unpooled.buffer();
-        IsoTPMessage isoTpMessage = new IsoTPMessage(tpdu, userData);
-
-        errorData.writeByte(0x72);
-        userData.writeByte(0x32);
-
-        assertThat(isoTpMessage.getTpdu().getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        // Question: do we need two user data fields?
-        assertThat(tpdu.getUserData().readByte(), equalTo((byte) 0x72));
-        assertThat(isoTpMessage.getUserData().readByte(), equalTo((byte) 0x32));
-    }
-
-
-}
\ No newline at end of file
diff --git a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/ParameterTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/ParameterTests.java
deleted file mode 100644
index 584a76a..0000000
--- a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/ParameterTests.java
+++ /dev/null
@@ -1,62 +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.isotp.protocol.model.params;
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-import org.apache.plc4x.java.isotp.protocol.model.types.TpduSize;
-import org.apache.plc4x.test.FastTests;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-public class ParameterTests {
-
-    @Test
-    @Category(FastTests.class)
-    public void checksumParameter() {
-        ChecksumParameter checksumParameter = new ChecksumParameter((byte) 1);
-
-        assertThat("Checksum incorrect", checksumParameter.getChecksum(), equalTo((byte) 1));
-        assertThat(checksumParameter.getType(), equalTo(ParameterCode.CHECKSUM));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void disconnectAdditionalInformationParameter() {
-        byte[] data = {(byte) 1, (byte) 2};
-        DisconnectAdditionalInformationParameter disconnectParameter = new DisconnectAdditionalInformationParameter(data);
-
-        assertThat(disconnectParameter.getData()[0], equalTo((byte) 1));
-        assertThat(disconnectParameter.getData()[1], equalTo((byte) 2));
-        assertThat(disconnectParameter.getType(), equalTo(ParameterCode.DISCONNECT_ADDITIONAL_INFORMATION));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void tpduSizeParameter() {
-        TpduSizeParameter tpduSizeParameter = new TpduSizeParameter(TpduSize.SIZE_512);
-
-        assertThat("Tpdu size incorrect", tpduSizeParameter.getTpduSize(), equalTo(TpduSize.SIZE_512));
-        assertThat(tpduSizeParameter.getType(), equalTo(ParameterCode.TPDU_SIZE));
-    }
-
-}
\ No newline at end of file
diff --git a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameterTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameterTests.java
deleted file mode 100644
index bf663d5..0000000
--- a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameterTests.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.isotp.protocol.model.params;
-
-import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
-import org.apache.plc4x.test.FastTests;
-import org.junit.After;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-public class TsapParameterTests {
-
-    private TsapParameter tsapParameter;
-
-    @After
-    public void tearDown() {
-        tsapParameter = null;
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void calledParameter() {
-        short calledTsapId = 0x1234;
-        tsapParameter = new CalledTsapParameter(calledTsapId);
-
-        assertThat("TSAP Id incorrect", tsapParameter.getTsapId(), equalTo(calledTsapId));
-        assertThat(tsapParameter.getType(), equalTo(ParameterCode.CALLED_TSAP));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void callingParameter() {
-        short callingTsapId = 0x4321;
-        tsapParameter = new CallingTsapParameter(callingTsapId);
-
-        assertThat("TSAP Id incorrect", tsapParameter.getTsapId(), equalTo(callingTsapId));
-        assertThat(tsapParameter.getType(), equalTo(ParameterCode.CALLING_TSAP));
-    }
-
-}
\ No newline at end of file
diff --git a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/IsotpModelTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/IsotpModelTests.java
deleted file mode 100644
index 942ed75..0000000
--- a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/IsotpModelTests.java
+++ /dev/null
@@ -1,185 +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.isotp.protocol.model.tpdus;
-
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.apache.plc4x.java.isotp.protocol.model.params.CallingTsapParameter;
-import org.apache.plc4x.java.isotp.protocol.model.params.ChecksumParameter;
-import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
-import org.apache.plc4x.java.isotp.protocol.model.params.TpduSizeParameter;
-import org.apache.plc4x.java.isotp.protocol.model.types.*;
-import org.apache.plc4x.test.FastTests;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import java.util.ArrayList;
-import java.util.Collections;
-import java.util.List;
-
-import static org.hamcrest.collection.IsCollectionWithSize.hasSize;
-import static org.hamcrest.collection.IsEmptyCollection.empty;
-import static org.hamcrest.collection.IsIterableContainingInOrder.contains;
-import static org.hamcrest.core.Is.is;
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.junit.Assert.assertThat;
-
-public class IsotpModelTests {
-
-    @Test
-    @Category(FastTests.class)
-    public void errorTpdu() {
-        short destinationReference = 0x1;
-        RejectCause rejectCause = RejectCause.REASON_NOT_SPECIFIED;
-        List<Parameter> parameters = Collections.emptyList();
-        ByteBuf userData = Unpooled.buffer();
-
-        userData.writeByte(0x7F);
-
-        ErrorTpdu tpdu = new ErrorTpdu(destinationReference, rejectCause, parameters, userData);
-
-        assertThat(tpdu.getTpduCode(), equalTo(TpduCode.TPDU_ERROR));
-        assertThat("Unexpected destination reference", tpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat(tpdu.getRejectCause(), equalTo(RejectCause.REASON_NOT_SPECIFIED));
-        assertThat(tpdu.getParameters(), empty() );
-        assertThat("Unexpected user data", tpdu.getUserData().readByte(), equalTo((byte) 0x7F));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void errorTpduParameter() {
-        short destinationReference = 0x1;
-        RejectCause rejectCause = RejectCause.REASON_NOT_SPECIFIED;
-        ArrayList<Parameter> parameters = new ArrayList<>();
-        ByteBuf userData = Unpooled.buffer();
-
-        userData.writeByte(0x7F);
-
-        ErrorTpdu tpdu = new ErrorTpdu(destinationReference, rejectCause, parameters, userData);
-
-        parameters.add(new TpduSizeParameter(TpduSize.SIZE_1024));
-        parameters.add(new ChecksumParameter((byte) 0xFF));
-
-        assertThat("Unexpected number of parameters", tpdu.getParameters(), hasSize(2));
-        assertThat("Unexpected parameter", tpdu.getParameters(), contains(parameters.toArray()));
-        assertThat("Checksum parameter should exist", tpdu.getParameter(ChecksumParameter.class).isPresent(), is(true));
-        assertThat("CallingTsapParameter parameter should not exist", !tpdu.getParameter(CallingTsapParameter.class).isPresent(), is(true));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void dataTpdu() {
-        List<Parameter> parameters = Collections.emptyList();
-        ByteBuf userData = Unpooled.buffer();
-
-        userData.writeByte(0x66);
-
-        DataTpdu tpdu = new DataTpdu(true, (byte) 0x7F, parameters, userData);
-
-        assertThat(tpdu.getTpduCode(), equalTo(TpduCode.DATA));
-        assertThat("Unexpected eot reference", tpdu.isEot(), is(true));
-        assertThat(tpdu.getTpduRef(), equalTo((byte) 0x7F));
-        assertThat("Unexpected parameters", tpdu.getParameters().isEmpty(), is(true));
-        assertThat("Unexpected user data", tpdu.getUserData().readByte(), equalTo((byte) 0x66));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void connectionRequestTpdu() {
-        short destinationReference = 0x1;
-        short sourceReference = 0x2;
-        ProtocolClass protocolClass = ProtocolClass.CLASS_0;
-        List<Parameter> parameters = Collections.emptyList();
-        ByteBuf userData = Unpooled.buffer();
-
-        userData.writeByte(0x33);
-
-        ConnectionRequestTpdu tpdu = new ConnectionRequestTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
-
-        assertThat(tpdu.getTpduCode(), equalTo(TpduCode.CONNECTION_REQUEST));
-        assertThat("Unexpected destination reference", tpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat("Unexpected source reference", tpdu.getSourceReference(), equalTo((short) 0x2));
-        assertThat(tpdu.getProtocolClass(), equalTo(ProtocolClass.CLASS_0));
-        assertThat("Unexpected parameters", tpdu.getParameters().isEmpty(), is(true));
-        assertThat("Unexpected user data", tpdu.getUserData().readByte(), equalTo((byte) 0x33));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void connectionConfirmTpdu() {
-        short destinationReference = 0x3;
-        short sourceReference = 0x4;
-        ProtocolClass protocolClass = ProtocolClass.CLASS_1;
-        List<Parameter> parameters = Collections.emptyList();
-        ByteBuf userData = Unpooled.buffer();
-
-        userData.writeByte(0x44);
-
-        ConnectionConfirmTpdu tpdu = new ConnectionConfirmTpdu(destinationReference, sourceReference, protocolClass, parameters, userData);
-
-        assertThat(tpdu.getTpduCode(), equalTo(TpduCode.CONNECTION_CONFIRM));
-        assertThat("Unexpected destination reference", tpdu.getDestinationReference(), equalTo((short) 0x3));
-        assertThat("Unexpected source reference", tpdu.getSourceReference(), equalTo((short) 0x4));
-        assertThat(tpdu.getProtocolClass(), equalTo(ProtocolClass.CLASS_1));
-        assertThat("Unexpected parameters", tpdu.getParameters().isEmpty(), is(true));
-        assertThat("Unexpected user data", tpdu.getUserData().readByte(), equalTo((byte) 0x44));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void disconnectionRequestTpdu() {
-        short destinationReference = 0x1;
-        short sourceReference = 0x2;
-        DisconnectReason disconnectReason = DisconnectReason.ADDRESS_UNKNOWN;
-        List<Parameter> parameters = Collections.emptyList();
-        ByteBuf userData = Unpooled.buffer();
-
-        userData.writeByte(0x22);
-
-        DisconnectRequestTpdu tpdu = new DisconnectRequestTpdu(destinationReference, sourceReference, disconnectReason, parameters, userData);
-
-        assertThat(tpdu.getTpduCode(), equalTo(TpduCode.DISCONNECT_REQUEST));
-        assertThat("Unexpected destination reference", tpdu.getDestinationReference(), equalTo((short) 0x1));
-        assertThat("Unexpected source reference", tpdu.getSourceReference(), equalTo((short) 0x2));
-        assertThat(tpdu.getDisconnectReason(), equalTo(DisconnectReason.ADDRESS_UNKNOWN));
-        assertThat("Unexpected parameters", tpdu.getParameters(), empty());
-        assertThat("Unexpected user data", tpdu.getUserData().readByte(), equalTo((byte) 0x22));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void disconnectionConfirmTpdu() {
-        short destinationReference = 0x3;
-        short sourceReference = 0x4;
-        List<Parameter> parameters = Collections.emptyList();
-        ByteBuf userData = Unpooled.buffer();
-
-        userData.writeByte(0x11);
-
-        DisconnectConfirmTpdu tpdu = new DisconnectConfirmTpdu(destinationReference, sourceReference, parameters, userData);
-
-        assertThat(tpdu.getTpduCode(), equalTo(TpduCode.DISCONNECT_CONFIRM));
-        assertThat("Unexpected destination reference", tpdu.getDestinationReference(), equalTo((short) 0x3));
-        assertThat("Unexpected source reference", tpdu.getSourceReference(), equalTo((short) 0x4));
-        assertThat("Unexpected parameters", tpdu.getParameters().isEmpty(), is(true));
-        assertThat("Unexpected user data", tpdu.getUserData().readByte(), equalTo((byte) 0x11));
-    }
-
-}
\ No newline at end of file
diff --git a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/types/IsotpTypeTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/types/IsotpTypeTests.java
deleted file mode 100644
index 3b88a01..0000000
--- a/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/types/IsotpTypeTests.java
+++ /dev/null
@@ -1,216 +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.isotp.protocol.model.types;
-
-import org.apache.plc4x.test.FastTests;
-import org.junit.Test;
-import org.junit.experimental.categories.Category;
-
-import static org.hamcrest.core.IsEqual.equalTo;
-import static org.hamcrest.core.IsNot.not;
-import static org.hamcrest.core.IsNull.nullValue;
-import static org.junit.Assert.assertThat;
-
-public class IsotpTypeTests {
-
-    @Test
-    @Category(FastTests.class)
-    public void deviceGroup() {
-        DeviceGroup deviceGroup;
-
-        deviceGroup = DeviceGroup.PG_OR_PC;
-        assertThat(deviceGroup.getCode(), equalTo((byte) 1));
-
-        deviceGroup = DeviceGroup.OS;
-        assertThat(deviceGroup.getCode(), equalTo((byte) 2));
-
-        deviceGroup = DeviceGroup.OTHERS;
-        assertThat(deviceGroup.getCode(), equalTo((byte) 3));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void deviceGroupUnknown() {
-        DeviceGroup deviceGroup = DeviceGroup.valueOf((byte) 0x40);
-
-        assertThat(deviceGroup, nullValue());
-    }
-
-
-    @Test
-    @Category(FastTests.class)
-    public void disconnectReason() {
-        DisconnectReason disconnectReason = DisconnectReason.ADDRESS_UNKNOWN;
-
-        assertThat("3 incorrectly mapped", DisconnectReason.valueOf((byte) 3), equalTo(DisconnectReason.ADDRESS_UNKNOWN));
-        assertThat(disconnectReason.getCode(), equalTo((byte) 3));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void disconnectReasonUnknown() {
-        DisconnectReason disconnectReason = DisconnectReason.valueOf((byte) 4);
-
-        assertThat(disconnectReason, nullValue());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void parameterCode() {
-        ParameterCode parameterCode = ParameterCode.CALLING_TSAP;
-
-        assertThat(ParameterCode.valueOf((byte) 0xC1), equalTo(ParameterCode.CALLING_TSAP));
-        assertThat(parameterCode.getCode(), equalTo((byte) 0xC1));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void parameterCodeUnknown() {
-        ParameterCode parameterCode = ParameterCode.valueOf((byte) 0x90);
-
-        assertThat(parameterCode, nullValue());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void protocolClass() {
-        ProtocolClass protocolClass;
-
-        protocolClass = ProtocolClass.CLASS_1;
-        assertThat(protocolClass.getCode(), equalTo((byte) 0x10));
-
-        protocolClass = ProtocolClass.CLASS_2;
-        assertThat(protocolClass.getCode(), equalTo((byte) 0x20));
-
-        protocolClass = ProtocolClass.CLASS_3;
-        assertThat(protocolClass.getCode(), equalTo((byte) 0x30));
-
-        protocolClass = ProtocolClass.CLASS_4;
-        assertThat(protocolClass.getCode(), equalTo((byte) 0x40));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void protocolClassUnknown() {
-        ProtocolClass protocolClass = ProtocolClass.valueOf((byte) 0x50);
-
-        assertThat(protocolClass, nullValue());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void rejectCause() {
-        RejectCause rejectCause = RejectCause.INVALID_PARAMETER_TYPE;
-
-        assertThat(RejectCause.valueOf((byte) 0x03), equalTo(RejectCause.INVALID_PARAMETER_TYPE));
-        assertThat(rejectCause.getCode(), equalTo((byte) 0x03));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void rejectClauseUnknown() {
-        RejectCause rejectCause = RejectCause.valueOf((byte) 0x90);
-
-        assertThat(rejectCause, nullValue());
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void tpduCode() {
-        TpduCode tpduCode = TpduCode.DATA;
-
-        assertThat(TpduCode.valueOf((byte) 0xF0), equalTo(TpduCode.DATA));
-        assertThat(tpduCode.getCode(), equalTo((byte) 0xF0));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void tpduCodeUnknown() {
-        TpduCode tpduCode = TpduCode.valueOf((byte) 0x01);
-
-        assertThat(TpduCode.valueOf((byte) 0xFF), equalTo(TpduCode.TPDU_UNKNOWN));
-        assertThat(tpduCode.getCode(), equalTo((byte) 0xFF));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void typduSize() {
-        TpduSize tpduSize = TpduSize.SIZE_128;
-
-        assertThat(TpduSize.valueOf((byte) 0x07), equalTo(TpduSize.SIZE_128));
-        assertThat(tpduSize.getCode(), equalTo((byte) 0x07));
-        assertThat(tpduSize.getValue(), equalTo(128));
-    }
-
-    @Test
-    @Category(FastTests.class)
-    public void tpduSizeUnknown() {
-        TpduSize tpduSize = TpduSize.valueOf((byte) 0x06);
-
-        assertThat(tpduSize, nullValue());
-    }
-
-    /**
-     * If we are requesting exactly the size of one of the iso tp
-     * pdu sizes, then exactly that box should be returned.
-     */
-    @Test
-    @Category(FastTests.class)
-    public void tpduValueForGivenExactFit() {
-        TpduSize tpduSize = TpduSize.valueForGivenSize(256);
-
-        assertThat(tpduSize, equalTo(TpduSize.SIZE_256));
-    }
-
-    /**
-     * In this case we have a given value that is in-between the boundaries of
-     * a pdu box, the method should return the next larger box.
-     */
-    @Test
-    @Category(FastTests.class)
-    public void tpduValueForGivenIntermediateSize() {
-        TpduSize tpduSize = TpduSize.valueForGivenSize(222);
-
-        assertThat(tpduSize, equalTo(TpduSize.SIZE_256));
-        assertThat(tpduSize.getValue(), not(equalTo(222)));
-    }
-
-    /**
-     * This test should cause an exception as the tpdu size has to be greater
-     * than 0 in any case.
-     */
-    @Test(expected = IllegalArgumentException.class)
-    @Category(FastTests.class)
-    public void tpduValueForGivenTooSmallSize() {
-        TpduSize.valueForGivenSize(-1);
-    }
-
-    /**
-     * In this test the tpdu size is greater than the maximum defined by the iso tp
-     * protocol spec, so it is automatically downgraded to the maximum valid value.
-     */
-    @Test
-    @Category(FastTests.class)
-    public void tpduValueForGivenTooGreatSize() {
-        TpduSize tpduSize = TpduSize.valueForGivenSize(10000);
-        assertThat(tpduSize, equalTo(TpduSize.SIZE_8192));
-    }
-
-}
\ No newline at end of file
diff --git a/plc4j/protocols/modbus/pom.xml b/plc4j/protocols/modbus/pom.xml
deleted file mode 100644
index eea5440..0000000
--- a/plc4j/protocols/modbus/pom.xml
+++ /dev/null
@@ -1,130 +0,0 @@
-<?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.
-
--->
-<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
-
-  <modelVersion>4.0.0</modelVersion>
-
-  <parent>
-    <groupId>org.apache.plc4x</groupId>
-    <artifactId>plc4j-protocols</artifactId>
-    <version>0.7.0-SNAPSHOT</version>
-  </parent>
-
-  <artifactId>plc4j-protocol-modbus</artifactId>
-  <name>PLC4J: Protocol: Modbus</name>
-  <description>Implementation of a PLC4X driver able to speak with Modbus devices using the Modbus protocol.
-  </description>
-
-  <properties>
-    <modbus-driver.version>1.1.0</modbus-driver.version>
-  </properties>
-
-  <dependencies>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-api</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-spi</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-    </dependency>
-
-
-    <dependency>
-      <!-- Just for reference can be removed later-->
-      <groupId>com.digitalpetri.modbus</groupId>
-      <artifactId>modbus-master-tcp</artifactId>
-      <version>${modbus-driver.version}</version>
-      <scope>provided</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.digitalpetri.modbus</groupId>
-      <artifactId>modbus-core</artifactId>
-      <version>${modbus-driver.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.digitalpetri.modbus</groupId>
-      <artifactId>modbus-codec</artifactId>
-      <version>${modbus-driver.version}</version>
-    </dependency>
-
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-buffer</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-codec</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-transport</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-classic</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!--dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-transport-test</artifactId>
-      <version>0.7.0-SNAPSHOT</version>
-      <scope>test</scope>
-    </dependency-->
-  </dependencies>
-
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <executions>
-          <execution>
-            <id>check-dependencies</id>
-            <phase>verify</phase>
-            <goals>
-              <goal>analyze-only</goal>
-            </goals>
-            <configuration>
-              <failOnWarning>true</failOnWarning>
-              <ignoredDependencies combine.children="append">
-                <ignoredDependency>commons-io:commons-io</ignoredDependency>
-                <ignoredDependency>com.digitalpetri.modbus:modbus-master-tcp</ignoredDependency>
-              </ignoredDependencies>
-            </configuration>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
-
-</project>
\ No newline at end of file
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcList.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcList.java
deleted file mode 100644
index 6e2007a..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcList.java
+++ /dev/null
@@ -1,218 +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.modbus.messages.items;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.plc4x.java.api.value.PlcList;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.stream.Stream;
-
-/**
- * default implementation for PlcValue for Usage within Modbus module
- * default ByteOrder is set to BIG_ENDIAN, can be selected on regarding get-method explicitly from user if needed
- */
-public class DefaultModbusByteArrayPlcList extends PlcList {
-
-    private static final int SHORT_BYTES = 2;
-    private static final int INTEGER_BYTES = 4;
-    private static final int FLOAT_BYTES = 4;
-    private static final int LONG_BYTES = 8;
-    private static final ByteOrder DEFAULT_ENDIANNESS = ByteOrder.BIG_ENDIAN;
-
-    private ByteOrder byteOrder;
-
-    private Byte[] completeByteArray;
-
-    public DefaultModbusByteArrayPlcList(Byte[]... values) {
-        super(Arrays.asList(values));
-        this.byteOrder = DEFAULT_ENDIANNESS;
-        this.completeByteArray = Arrays.stream(values).flatMap(Stream::of).toArray(Byte[]::new);
-    }
-
-    public boolean isValidShort(int index) {
-        return this.completeByteArray.length >= shortIndexToByteIndex(index) + SHORT_BYTES;
-    }
-
-    /**
-     * returns the short result for the given index with explicit chose of ByteOrder
-     *
-     * @param index     index in relation to the requested data-type (here Short), see comment of regarding index-transformation
-     * @param byteOrder byte-order used for decoding of byte-array
-     * @return resulting short value if valid data is given, null otherwise
-     */
-    public Short getShort(int index, ByteOrder byteOrder) {
-        if (!isValidShort(index)) {
-            return null;
-        }
-        return ByteBuffer
-            .wrap(ArrayUtils.toPrimitive(getByteArrayFromIndex(shortIndexToByteIndex(index))))
-            .order(byteOrder)
-            .getShort();
-    }
-
-    /**
-     * converts the starting index of a short array to source type Byte
-     * e.g. user wants to request the 2nd long value --&gt; index=1 --&gt; byteIndex=2
-     *
-     * @param shortIndex index from users view
-     * @return resulting byteArrayIndex
-     */
-    private static int shortIndexToByteIndex(int shortIndex) {
-        return shortIndex * SHORT_BYTES;
-    }
-
-    public boolean isValidInteger(int index) {
-        return this.completeByteArray.length >= intIndexToByteIndex(index) + INTEGER_BYTES;
-    }
-
-    /**
-     * returns the int result for the given index with explicit chose of ByteOrder
-     *
-     * @param index     index in relation to the requested data-type (here Integer), see comment of regarding index-transformation
-     * @param byteOrder byte-order used for decoding of byte-array
-     * @return resulting int value if valid data is given, null otherwise
-     */
-    public Integer getInteger(int index, ByteOrder byteOrder) {
-        if (!isValidInteger(index)) {
-            return null;
-        }
-        return ByteBuffer
-            .wrap(ArrayUtils.toPrimitive(getByteArrayFromIndex(intIndexToByteIndex(index))))
-            .order(byteOrder)
-            .getInt();
-    }
-
-    /**
-     * converts the starting index of an int array to source type Byte
-     * e.g. user wants to request the 4th integer value --&gt; index=3 --&gt; byteIndex=12
-     *
-     * @param intIndex index from users view
-     * @return resulting byteArrayIndex
-     */
-    private static int intIndexToByteIndex(int intIndex) {
-        return intIndex * INTEGER_BYTES;
-    }
-
-    public boolean isValidLong(int index) {
-        return this.completeByteArray.length >= longIndexToByteIndex(index) + LONG_BYTES;
-    }
-
-    /**
-     * returns the long result for the given index with explicit chose of ByteOrder
-     *
-     * @param index     index in relation to the requested data-type (here Long), see comment of regarding index-transformation
-     * @param byteOrder byte-order used for decoding of byte-array
-     * @return resulting long value if valid data is given, null otherwise
-     */
-    public Long getLong(int index, ByteOrder byteOrder) {
-        if (!isValidLong(index)) {
-            return null;
-        }
-        return ByteBuffer
-            .wrap(ArrayUtils.toPrimitive(getByteArrayFromIndex(longIndexToByteIndex(index))))
-            .order(byteOrder)
-            .getLong();
-    }
-
-    /**
-     * converts the starting index of a long array to source type Byte
-     * e.g. user wants to request the 3rd long value --&gt; index=2 --&gt; byteIndex=16
-     *
-     * @param longIndex index from users view
-     * @return resulting byteArrayIndex
-     */
-    private static int longIndexToByteIndex(int longIndex) {
-        return longIndex * LONG_BYTES;
-    }
-
-    public boolean isValidFloat(int index) {
-        return this.completeByteArray.length >= floatIndexToByteIndex(index) + FLOAT_BYTES;
-    }
-
-    /**
-     * returns the float result for the given index with explicit chose of ByteOrder
-     *
-     * @param index     index in relation to the requested data-type (here Float), see comment of regarding index-transformation
-     * @param byteOrder byte-order used for decoding of byte-array
-     * @return resulting float value if valid data is given, null otherwise
-     */
-    public Float getFloat(int index, ByteOrder byteOrder) {
-        if (!isValidFloat(index)) {
-            return null;
-        }
-        return ByteBuffer
-            .wrap(ArrayUtils.toPrimitive(getByteArrayFromIndex(floatIndexToByteIndex(index))))
-            .order(byteOrder)
-            .getFloat();
-    }
-
-    /**
-     * converts the starting index of an float array to source type Byte
-     * e.g. user wants to request the 4th float value --&gt; index=3 --&gt; byteIndex=12
-     *
-     * @param floatIndex index from users view
-     * @return resulting byteArrayIndex
-     */
-    private static int floatIndexToByteIndex(int floatIndex) {
-        return floatIndex * FLOAT_BYTES;
-    }
-
-    /**
-     * returns a subarray with the wanted index first
-     *
-     * @param index start-index of wanted value
-     * @return the sub-array
-     */
-    private Byte[] getByteArrayFromIndex(int index) {
-        if (index > this.completeByteArray.length) {
-            return new Byte[0];
-        }
-        return Arrays.copyOfRange(this.completeByteArray, index, this.completeByteArray.length);
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (o == null || getClass() != o.getClass()) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-        DefaultModbusByteArrayPlcList that = (DefaultModbusByteArrayPlcList) o;
-        return Arrays.equals(completeByteArray, that.completeByteArray);
-    }
-
-    @Override
-    public int hashCode() {
-        int result = super.hashCode();
-        result = 31 * result + Arrays.hashCode(completeByteArray);
-        return result;
-    }
-
-    //ToDo: Implement conversion for Unsigned-Datatypes
-
-    //ToDo: Add exceptions to avoid unwanted states --> e.g. neg indexes
-
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusField.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusField.java
deleted file mode 100644
index adb7600..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/CoilModbusField.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.java.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class CoilModbusField extends ModbusField {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("coil:" + ModbusField.ADDRESS_PATTERN);
-
-    public CoilModbusField(int address, Integer quantity) {
-        super(address, quantity);
-    }
-
-    public static CoilModbusField of(String addressString) throws PlcInvalidFieldException {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcInvalidFieldException(addressString, ADDRESS_PATTERN);
-        }
-        int address = Integer.parseInt(matcher.group("address"));
-
-        String quantityString = matcher.group("quantity");
-        Integer quantity = quantityString != null ? Integer.valueOf(quantityString) : null;
-        return new CoilModbusField(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusField.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusField.java
deleted file mode 100644
index 2d4870d..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/MaskWriteRegisterModbusField.java
+++ /dev/null
@@ -1,91 +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.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-
-import java.util.Objects;
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class MaskWriteRegisterModbusField extends ModbusField {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("maskwrite:" + ModbusField.ADDRESS_PATTERN + "/" + "(?<andMask>\\d+)/(?<orMask>\\d+)");
-
-    private final int andMask;
-    private final int orMask;
-
-    protected MaskWriteRegisterModbusField(int address, int andMask, int orMask, Integer quantity) {
-        super(address, quantity);
-        this.andMask = andMask;
-        this.orMask = orMask;
-    }
-
-    public static MaskWriteRegisterModbusField of(String addressString) throws PlcInvalidFieldException {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcInvalidFieldException(addressString, ADDRESS_PATTERN);
-        }
-        int address = Integer.parseInt(matcher.group("address"));
-        int andMask = Integer.parseInt(matcher.group("andMask"));
-        int orMask = Integer.parseInt(matcher.group("orMask"));
-
-        String quantityString = matcher.group("quantity");
-        Integer quantity = quantityString != null ? Integer.valueOf(quantityString) : null;
-        return new MaskWriteRegisterModbusField(address, andMask, orMask, quantity);
-    }
-
-    public int getAndMask() {
-        return andMask;
-    }
-
-    public int getOrMask() {
-        return orMask;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof MaskWriteRegisterModbusField)) {
-            return false;
-        }
-        if (!super.equals(o)) {
-            return false;
-        }
-        MaskWriteRegisterModbusField that = (MaskWriteRegisterModbusField) o;
-        return andMask == that.andMask &&
-            orMask == that.orMask;
-    }
-
-    @Override
-    public int hashCode() {
-
-        return Objects.hash(super.hashCode(), andMask, orMask);
-    }
-
-    @Override
-    public String toString() {
-        return "MaskWriteRegisterModbusField{" +
-            "andMask=" + andMask +
-            ", orMask=" + orMask +
-            "} " + super.toString();
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ModbusField.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ModbusField.java
deleted file mode 100644
index 3254e02..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ModbusField.java
+++ /dev/null
@@ -1,74 +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.modbus.model;
-
-import org.apache.plc4x.java.api.model.PlcField;
-
-import java.util.Objects;
-import java.util.regex.Pattern;
-
-public abstract class ModbusField implements PlcField {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("(?<address>\\d+)(\\[(?<quantity>\\d)])?");
-
-    private final int address;
-
-    private final int quantity;
-
-    protected ModbusField(int address, Integer quantity) {
-        this.address = address;
-        this.quantity = quantity != null ? quantity : 1;
-        if (this.quantity <= 0) {
-            throw new IllegalArgumentException("quantity must be greater then zero. Was " + this.quantity);
-        }
-    }
-
-    public int getAddress() {
-        return address;
-    }
-
-    public int getQuantity() {
-        return quantity;
-    }
-
-    @Override
-    public boolean equals(Object o) {
-        if (this == o) {
-            return true;
-        }
-        if (!(o instanceof ModbusField)) {
-            return false;
-        }
-        ModbusField that = (ModbusField) o;
-        return address == that.address;
-    }
-
-    @Override
-    public int hashCode() {
-        return Objects.hash(address);
-    }
-
-    @Override
-    public String toString() {
-        return "ModbusField{" +
-            "address=" + address +
-            "quantity=" + quantity +
-            '}';
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusField.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusField.java
deleted file mode 100644
index 00cb495..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadDiscreteInputsModbusField.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.java.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class ReadDiscreteInputsModbusField extends ModbusField {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readdiscreteinputs:" + ModbusField.ADDRESS_PATTERN);
-
-    public ReadDiscreteInputsModbusField(int address, Integer quantity) {
-        super(address, quantity);
-    }
-
-    public static ReadDiscreteInputsModbusField of(String addressString) throws PlcInvalidFieldException {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcInvalidFieldException(addressString, ADDRESS_PATTERN);
-        }
-        int address = Integer.parseInt(matcher.group("address"));
-
-        String quantityString = matcher.group("quantity");
-        Integer quantity = quantityString != null ? Integer.valueOf(quantityString) : null;
-        return new ReadDiscreteInputsModbusField(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusField.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusField.java
deleted file mode 100644
index 9f51e1e..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadHoldingRegistersModbusField.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.java.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class ReadHoldingRegistersModbusField extends ModbusField {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readholdingregisters:" + ModbusField.ADDRESS_PATTERN);
-
-    protected ReadHoldingRegistersModbusField(int address, Integer quantity) {
-        super(address, quantity);
-    }
-
-    public static ReadHoldingRegistersModbusField of(String addressString) throws PlcInvalidFieldException {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcInvalidFieldException(addressString, ADDRESS_PATTERN);
-        }
-        int address = Integer.parseInt(matcher.group("address"));
-
-        String quantityString = matcher.group("quantity");
-        Integer quantity = quantityString != null ? Integer.valueOf(quantityString) : null;
-        return new ReadHoldingRegistersModbusField(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusField.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusField.java
deleted file mode 100644
index 3b61343..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ReadInputRegistersModbusField.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.java.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-public class ReadInputRegistersModbusField extends ModbusField {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("readinputregisters:" + ModbusField.ADDRESS_PATTERN);
-
-    protected ReadInputRegistersModbusField(int address, Integer quantity) {
-        super(address, quantity);
-    }
-
-    public static ReadInputRegistersModbusField of(String addressString) throws PlcInvalidFieldException {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcInvalidFieldException(addressString, ADDRESS_PATTERN);
-        }
-        int address = Integer.parseInt(matcher.group("address"));
-
-        String quantityString = matcher.group("quantity");
-        Integer quantity = quantityString != null ? Integer.valueOf(quantityString) : null;
-        return new ReadInputRegistersModbusField(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusField.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusField.java
deleted file mode 100644
index 0697364..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/RegisterModbusField.java
+++ /dev/null
@@ -1,46 +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.modbus.model;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-
-import java.util.regex.Matcher;
-import java.util.regex.Pattern;
-
-// TODO: Default to {@link ReadHoldingRegistersModbusField}
-public class RegisterModbusField extends ModbusField {
-
-    public static final Pattern ADDRESS_PATTERN = Pattern.compile("register:" + ModbusField.ADDRESS_PATTERN);
-
-    protected RegisterModbusField(int address, Integer quantity) {
-        super(address, quantity);
-    }
-
-    public static RegisterModbusField of(String addressString) throws PlcInvalidFieldException {
-        Matcher matcher = ADDRESS_PATTERN.matcher(addressString);
-        if (!matcher.matches()) {
-            throw new PlcInvalidFieldException(addressString, ADDRESS_PATTERN);
-        }
-        int address = Integer.parseInt(matcher.group("address"));
-
-        String quantityString = matcher.group("quantity");
-        Integer quantity = quantityString != null ? Integer.valueOf(quantityString) : null;
-        return new RegisterModbusField(address, quantity);
-    }
-}
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
deleted file mode 100644
index 0d85175..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
+++ /dev/null
@@ -1,562 +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.modbus.netty;
-
-import com.digitalpetri.modbus.ModbusPdu;
-import com.digitalpetri.modbus.codec.ModbusTcpPayload;
-import com.digitalpetri.modbus.requests.MaskWriteRegisterRequest;
-import com.digitalpetri.modbus.requests.ReadCoilsRequest;
-import com.digitalpetri.modbus.requests.ReadDiscreteInputsRequest;
-import com.digitalpetri.modbus.requests.ReadHoldingRegistersRequest;
-import com.digitalpetri.modbus.requests.ReadInputRegistersRequest;
-import com.digitalpetri.modbus.requests.WriteMultipleCoilsRequest;
-import com.digitalpetri.modbus.requests.WriteMultipleRegistersRequest;
-import com.digitalpetri.modbus.requests.WriteSingleCoilRequest;
-import com.digitalpetri.modbus.requests.WriteSingleRegisterRequest;
-import com.digitalpetri.modbus.responses.ExceptionResponse;
-import com.digitalpetri.modbus.responses.MaskWriteRegisterResponse;
-import com.digitalpetri.modbus.responses.ReadCoilsResponse;
-import com.digitalpetri.modbus.responses.ReadDiscreteInputsResponse;
-import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
-import com.digitalpetri.modbus.responses.ReadInputRegistersResponse;
-import com.digitalpetri.modbus.responses.WriteMultipleCoilsResponse;
-import com.digitalpetri.modbus.responses.WriteMultipleRegistersResponse;
-import com.digitalpetri.modbus.responses.WriteSingleCoilResponse;
-import com.digitalpetri.modbus.responses.WriteSingleRegisterResponse;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import io.netty.channel.ChannelHandlerContext;
-import io.netty.handler.codec.MessageToMessageCodec;
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.api.exceptions.PlcException;
-import org.apache.plc4x.java.api.exceptions.PlcNotImplementedException;
-import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
-import org.apache.plc4x.java.api.exceptions.PlcUnsupportedDataTypeException;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.api.value.PlcBoolean;
-import org.apache.plc4x.java.api.value.PlcList;
-import org.apache.plc4x.java.api.value.PlcValue;
-import org.apache.plc4x.java.modbus.model.CoilModbusField;
-import org.apache.plc4x.java.modbus.model.MaskWriteRegisterModbusField;
-import org.apache.plc4x.java.modbus.model.ModbusField;
-import org.apache.plc4x.java.modbus.model.ReadDiscreteInputsModbusField;
-import org.apache.plc4x.java.modbus.model.ReadHoldingRegistersModbusField;
-import org.apache.plc4x.java.modbus.model.ReadInputRegistersModbusField;
-import org.apache.plc4x.java.modbus.model.RegisterModbusField;
-import org.apache.plc4x.java.spi.messages.DefaultPlcReadResponse;
-import org.apache.plc4x.java.spi.messages.DefaultPlcWriteResponse;
-import org.apache.plc4x.java.spi.messages.InternalPlcFieldRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcResponse;
-import org.apache.plc4x.java.spi.messages.InternalPlcWriteRequest;
-import org.apache.plc4x.java.spi.messages.PlcRequestContainer;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigInteger;
-import java.util.*;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.concurrent.ConcurrentMap;
-import java.util.concurrent.atomic.AtomicInteger;
-
-
-public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusTcpPayload, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse>> {
-
-    private static final Logger LOGGER = LoggerFactory.getLogger(Plc4XModbusProtocol.class);
-
-    public final AtomicInteger transactionId = new AtomicInteger();
-
-    private final ConcurrentMap<Short, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse>> requestsMap = new ConcurrentHashMap<>();
-
-    private final short slaveId;
-
-    public Plc4XModbusProtocol(short slaveId) {
-        this.slaveId = slaveId;
-    }
-
-    @Override
-    protected void encode(ChannelHandlerContext ctx, PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws Exception {
-        LOGGER.trace("(<--OUT): {}, {}, {}", ctx, msg, out);
-        // Reset transactionId on overflow
-        transactionId.compareAndSet(Short.MAX_VALUE + 1, 0);
-        PlcRequest request = msg.getRequest();
-        if (request instanceof PlcReadRequest) {
-            encodeReadRequest(msg, out);
-        } else if (request instanceof PlcWriteRequest) {
-            encodeWriteRequest(msg, out);
-        }
-    }
-
-    private void encodeWriteRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcException {
-        InternalPlcWriteRequest request = (InternalPlcWriteRequest) msg.getRequest();
-
-        // TODO: support multiple requests
-        if (request.getFieldNames().size() != 1) {
-            throw new PlcNotImplementedException("Only single message supported for now");
-        }
-        // TODO: check if we can map like this. Implication is that we can only work with int, short, byte and boolean
-        // TODO: for higher data types float, double etc we might need to split the bytes into chunks
-        String fieldName = request.getFieldNames().iterator().next();
-        int quantity = request.getNumberOfValues(fieldName);
-        ModbusField field = (ModbusField) request.getField(fieldName);
-        if (quantity != field.getQuantity()) {
-            LOGGER.warn("Supplied number of values [{}] don't match t the addressed quantity of [{}]", field.getQuantity(), quantity);
-        }
-
-        /*
-         * It seems that in Modbus, there are only two types of resources, that can be accessed:
-         * - Register: 2 byte value
-         * - Coil: 1 bit value
-         *
-         * Registers:
-         * When writing a bit, byte or char (a one byte or less data types) into a register the value is filled up to
-         * fit the 2 bytes.
-         * When writing a data type that has more than 2 bytes, subsequent registers are written to automatically.
-         *
-         * Coils:
-         * When transferring data from/to a coil, 8 coil values can be transferred in a single byte.
-         * Naturally a coil is a boolean data type, however, similar to the registers bigger data types can be
-         * transported, by setting multiple subsequent coils: 32bit int -> 32 coils
-         *
-         * In all cases where we are accessing more than the natural size of the datatype, we have to keep this in mind
-         * when addressing them. So if reading 2 32bit integers, this is split up into four registers. So for the second
-         * int we have to increment the address accordingly.
-         */
-        ModbusPdu modbusRequest;
-        if (field instanceof RegisterModbusField) {
-            RegisterModbusField registerModbusField = (RegisterModbusField) field;
-            if (quantity > 1) {
-                byte[] bytesToWrite = produceRegisterValue(((PlcList) request.getPlcValue(fieldName)).getList());
-                // A register is a 16 bit (2 byte) value ... so every value needs 2 byte.
-                int requiredLength = 2 * quantity;
-                if (bytesToWrite.length != requiredLength) {
-                    throw new PlcProtocolException("Invalid register values created. Should be at least quantity * 2 = N bytes. Was " + bytesToWrite.length + ", expected " + requiredLength);
-                }
-                modbusRequest = new WriteMultipleRegistersRequest(registerModbusField.getAddress(), quantity, bytesToWrite);
-            } else {
-                byte[] register = produceRegisterValue(Collections.singletonList(request.getPlcValue(fieldName).getObject()));
-                if ((register == null) || (register.length != 2)) {
-                    throw new PlcProtocolException("Invalid register values created. Should be 2 bytes. Was " +
-                        ((register != null) ? register.length : 0));
-                }
-                // Reconvert the two bytes back to an int.
-                int intToWrite = register[0] << 8 | register[1] & 0xff;
-                modbusRequest = new WriteSingleRegisterRequest(registerModbusField.getAddress(), intToWrite);
-            }
-        } else if (field instanceof CoilModbusField) {
-            CoilModbusField coilModbusField = (CoilModbusField) field;
-            if (quantity > 1) {
-                byte[] bytesToWrite = produceCoilValues(((PlcList) request.getPlcValue(fieldName)).getList());
-                // As each coil value represents a bit, the number of bytes needed
-                // equals "ceil(quantity/8)" (a 3 bit shift is a division by 8 ... the +1 is the "ceil")
-                int requiredLength = (quantity >> 3) + 1;
-                if (bytesToWrite.length != requiredLength) {
-                    throw new PlcProtocolException(
-                        "Invalid coil values created. Should be big enough to transport N bits. Was " +
-                            bytesToWrite.length + ", expected " + requiredLength);
-                }
-                modbusRequest = new WriteMultipleCoilsRequest(coilModbusField.getAddress(), quantity, bytesToWrite);
-            } else {
-                boolean booleanToWrite = produceCoilValue(Collections.singletonList(request.getPlcValue(fieldName).getObject()));
-                modbusRequest = new WriteSingleCoilRequest(coilModbusField.getAddress(), booleanToWrite);
-            }
-        } else if (field instanceof MaskWriteRegisterModbusField) {
-            MaskWriteRegisterModbusField maskWriteRegisterModbusField = (MaskWriteRegisterModbusField) field;
-            if (quantity > 1) {
-                throw new PlcProtocolException("Mask write request can only write one value");
-            } else {
-                // TODO: this should be better part of the payload not the addressing.
-                int andMask = maskWriteRegisterModbusField.getAndMask();
-                int orMask = maskWriteRegisterModbusField.getOrMask();
-                modbusRequest = new MaskWriteRegisterRequest(maskWriteRegisterModbusField.getAddress(), andMask, orMask);
-            }
-        } else {
-            throw new PlcProtocolException("Unsupported field type " + field.getClass() + " for a write request.");
-        }
-        short transactionId = (short) this.transactionId.getAndIncrement();
-        requestsMap.put(transactionId, msg);
-        out.add(new ModbusTcpPayload(transactionId, slaveId, modbusRequest));
-    }
-
-    private void encodeReadRequest(PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> msg, List<Object> out) throws PlcException {
-        PlcReadRequest request = (PlcReadRequest) msg.getRequest();
-        // TODO: support multiple requests
-        if (request.getFieldNames().size() != 1) {
-            throw new PlcNotImplementedException("Only single message supported for now");
-        }
-        // TODO: check if we can map like this. Implication is that we can only work with int, short, byte and boolean
-        // TODO: for higher data types float, double etc we might need to split the bytes into chunks
-        String fieldName = request.getFieldNames().iterator().next();
-
-        ModbusField field = (ModbusField) request.getField(fieldName);
-        int quantity = field.getQuantity();
-
-        ModbusPdu modbusRequest;
-        if (field instanceof CoilModbusField) {
-            CoilModbusField coilModbusField = (CoilModbusField) field;
-            modbusRequest = new ReadCoilsRequest(coilModbusField.getAddress(), quantity);
-        } else if (field instanceof RegisterModbusField) {
-            RegisterModbusField registerModbusField = (RegisterModbusField) field;
-            modbusRequest = new ReadHoldingRegistersRequest(registerModbusField.getAddress(), quantity);
-        } else if (field instanceof ReadDiscreteInputsModbusField) {
-            ReadDiscreteInputsModbusField readDiscreteInputsModbusField = (ReadDiscreteInputsModbusField) field;
-            modbusRequest = new ReadDiscreteInputsRequest(readDiscreteInputsModbusField.getAddress(), quantity);
-        } else if (field instanceof ReadHoldingRegistersModbusField) {
-            ReadHoldingRegistersModbusField readHoldingRegistersModbusField = (ReadHoldingRegistersModbusField) field;
-            modbusRequest = new ReadHoldingRegistersRequest(readHoldingRegistersModbusField.getAddress(), quantity);
-        } else if (field instanceof ReadInputRegistersModbusField) {
-            ReadInputRegistersModbusField readInputRegistersModbusField = (ReadInputRegistersModbusField) field;
-            modbusRequest = new ReadInputRegistersRequest(readInputRegistersModbusField.getAddress(), quantity);
-        } else {
-            throw new PlcProtocolException("Unsupported field type " + field.getClass() + " for a read request.");
-        }
-        short transactionId = (short) this.transactionId.getAndIncrement();
-        requestsMap.put(transactionId, msg);
-        out.add(new ModbusTcpPayload(transactionId, slaveId, modbusRequest));
-    }
-
-    @SuppressWarnings("unchecked")
-    @Override
-    protected void decode(ChannelHandlerContext ctx, ModbusTcpPayload msg, List<Object> out) throws Exception {
-        LOGGER.trace("(-->IN): {}, {}, {}", ctx, msg, out);
-        LOGGER.debug("{}: transactionId: {}, unitId: {}, modbusPdu:{}", msg, msg.getTransactionId(), msg.getUnitId(), msg.getModbusPdu());
-        // TODO: implement me
-        short transactionId = msg.getTransactionId();
-        PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> plcRequestContainer = requestsMap.get(transactionId);
-        if (plcRequestContainer == null) {
-            throw new PlcProtocolException("Unrelated payload received. [transactionId: " + msg.getTransactionId() + ", unitId: " + msg.getUnitId() + ", modbusPdu: " + msg.getModbusPdu() + "]");
-        }
-
-        // TODO: only single Item supported for now
-        InternalPlcFieldRequest request = (InternalPlcFieldRequest) plcRequestContainer.getRequest();
-        // TODO: support multiple requests (Shouldn't be needed as the request wouldn't have been sent)
-        if (request.getFieldNames().size() != 1) {
-            throw new PlcNotImplementedException("Only single message supported for now");
-        }
-        String fieldName = request.getFieldNames().iterator().next();
-        ModbusField field = (ModbusField) request.getField(fieldName);
-
-        ModbusPdu modbusPdu = msg.getModbusPdu();
-        //short unitId = msg.getUnitId();
-
-        if (modbusPdu instanceof WriteMultipleCoilsResponse) {
-            // TODO: finish implementation
-            WriteMultipleCoilsResponse writeMultipleCoilsResponse = (WriteMultipleCoilsResponse) modbusPdu;
-            LOGGER.debug("{}: address:{}, quantity:{}", writeMultipleCoilsResponse, writeMultipleCoilsResponse.getAddress(), writeMultipleCoilsResponse.getQuantity());
-            Map<String, PlcResponseCode> responseValues = new HashMap<>();
-            responseValues.put(fieldName, PlcResponseCode.OK);
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcWriteResponse((InternalPlcWriteRequest) request, responseValues));
-        } else if (modbusPdu instanceof WriteMultipleRegistersResponse) {
-            // TODO: finish implementation
-            WriteMultipleRegistersResponse writeMultipleRegistersResponse = (WriteMultipleRegistersResponse) modbusPdu;
-            LOGGER.debug("{}: address:{}, quantity:{}", writeMultipleRegistersResponse, writeMultipleRegistersResponse.getAddress(), writeMultipleRegistersResponse.getQuantity());
-            Map<String, PlcResponseCode> responseValues = new HashMap<>();
-            responseValues.put(fieldName, PlcResponseCode.OK);
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcWriteResponse((InternalPlcWriteRequest) request, responseValues));
-        } else if (modbusPdu instanceof WriteSingleCoilResponse) {
-            // TODO: finish implementation
-            WriteSingleCoilResponse writeSingleCoilResponse = (WriteSingleCoilResponse) modbusPdu;
-            LOGGER.debug("{}: address:{}, value:{}", writeSingleCoilResponse, writeSingleCoilResponse.getAddress(), writeSingleCoilResponse.getValue());
-            Map<String, PlcResponseCode> responseValues = new HashMap<>();
-            responseValues.put(fieldName, PlcResponseCode.OK);
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcWriteResponse((InternalPlcWriteRequest) request, responseValues));
-        } else if (modbusPdu instanceof WriteSingleRegisterResponse) {
-            // TODO: finish implementation
-            WriteSingleRegisterResponse writeSingleRegisterResponse = (WriteSingleRegisterResponse) modbusPdu;
-            LOGGER.debug("{}: address:{}, value:{}", writeSingleRegisterResponse, writeSingleRegisterResponse.getAddress(), writeSingleRegisterResponse.getValue());
-            Map<String, PlcResponseCode> responseValues = new HashMap<>();
-            responseValues.put(fieldName, PlcResponseCode.OK);
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcWriteResponse((InternalPlcWriteRequest) request, responseValues));
-        } else if (modbusPdu instanceof ReadCoilsResponse) {
-            // TODO: finish implementation
-            ReadCoilsResponse readCoilsResponse = (ReadCoilsResponse) modbusPdu;
-            LOGGER.debug("{}: Nothing", readCoilsResponse);
-            ByteBuf byteBuf = readCoilsResponse.getCoilStatus();
-            PlcValue data = produceCoilValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, PlcValue>> responseValues = new HashMap<>();
-            responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
-        } else if (modbusPdu instanceof ReadDiscreteInputsResponse) {
-            // TODO: finish implementation
-            ReadDiscreteInputsResponse readDiscreteInputsResponse = (ReadDiscreteInputsResponse) modbusPdu;
-            LOGGER.debug("{}: Nothing", readDiscreteInputsResponse);
-            ByteBuf byteBuf = readDiscreteInputsResponse.getInputStatus();
-            PlcValue data = produceCoilValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, PlcValue>> responseValues = new HashMap<>();
-            responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
-        } else if (modbusPdu instanceof ReadHoldingRegistersResponse) {
-            // TODO: finish implementation
-            ReadHoldingRegistersResponse readHoldingRegistersResponse = (ReadHoldingRegistersResponse) modbusPdu;
-            LOGGER.debug("{}: Nothing", readHoldingRegistersResponse);
-            ByteBuf byteBuf = readHoldingRegistersResponse.getRegisters();
-            // TODO: use register method
-            PlcValue data = produceRegisterValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, PlcValue>> responseValues = new HashMap<>();
-            responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
-        } else if (modbusPdu instanceof ReadInputRegistersResponse) {
-            // TODO: finish implementation
-            ReadInputRegistersResponse readInputRegistersResponse = (ReadInputRegistersResponse) modbusPdu;
-            LOGGER.debug("{}: Nothing", readInputRegistersResponse);
-            ByteBuf byteBuf = readInputRegistersResponse.getRegisters();
-            // TODO: use register method
-            PlcValue data = produceRegisterValueList(byteBuf, field.getQuantity());
-            Map<String, Pair<PlcResponseCode, PlcValue>> responseValues = new HashMap<>();
-            responseValues.put(fieldName, new ImmutablePair<>(PlcResponseCode.OK, data));
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcReadResponse((InternalPlcReadRequest) request, responseValues));
-        } else if (modbusPdu instanceof MaskWriteRegisterResponse) {
-            // TODO: finish implementation
-            MaskWriteRegisterResponse maskWriteRegisterResponse = (MaskWriteRegisterResponse) modbusPdu;
-            LOGGER.debug("{}: Nothing", maskWriteRegisterResponse);
-            Map<String, PlcResponseCode> responseValues = new HashMap<>();
-            responseValues.put(fieldName, PlcResponseCode.OK);
-            plcRequestContainer.getResponseFuture().complete(new DefaultPlcWriteResponse((InternalPlcWriteRequest) request, responseValues));
-        } else if (modbusPdu instanceof ExceptionResponse) {
-            ExceptionResponse exceptionResponse = (ExceptionResponse) modbusPdu;
-            throw new PlcProtocolException("Error received " + exceptionResponse.getExceptionCode());
-        } else {
-            throw new PlcProtocolException("Unsupported messageTyp type" + modbusPdu.getClass());
-        }
-    }
-
-    @Override
-    public void exceptionCaught(ChannelHandlerContext ctx, Throwable cause) throws Exception {
-        LOGGER.trace("(-->ERR): {}", ctx, cause);
-        super.exceptionCaught(ctx, cause);
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////
-    // Encoding helpers.
-    ////////////////////////////////////////////////////////////////////////////////
-
-    private boolean produceCoilValue(List<?> values) throws PlcProtocolException {
-        if (values.size() != 1) {
-            throw new PlcProtocolException("Only one value allowed");
-        }
-        byte multiCoil = produceCoilValues(values)[0];
-        return multiCoil != 0;
-    }
-
-    private byte[] produceCoilValues(List<?> values) throws PlcProtocolException {
-        List<Byte> coils = new LinkedList<>();
-        byte actualCoil = 0;
-        int i = 7;
-        for (Object value : values) {
-            final boolean coilSet;
-            if (value.getClass() == Boolean.class) {
-                coilSet = (Boolean) value;
-            } else if (value.getClass() == Byte.class) {
-                if ((byte) value > 1) {
-                    throw new PlcProtocolException("Value to high to fit into Byte: " + value);
-                }
-                coilSet = (byte) value == 1;
-            } else if (value.getClass() == byte[].class) {
-                byte[] bytes = (byte[]) value;
-                if (bytes.length != 1) {
-                    throw new PlcProtocolException("Exactly one byte is allowed: " + bytes.length);
-                }
-                byte byteValue = bytes[0];
-                if (byteValue > 1) {
-                    throw new PlcProtocolException("Value to high to fit into Byte: " + value);
-                }
-                coilSet = byteValue == 1;
-            } else if (value.getClass() == Byte[].class) {
-                Byte[] bytes = (Byte[]) value;
-                if (bytes.length != 1) {
-                    throw new PlcProtocolException("Exactly one byte is allowed: " + bytes.length);
-                }
-                byte byteValue = bytes[0];
-                if (byteValue > 1) {
-                    throw new PlcProtocolException("Value to high to fit into Byte: " + value);
-                }
-                coilSet = byteValue == 1;
-            } else if (value.getClass() == Short.class) {
-                if ((short) value > 1) {
-                    throw new PlcProtocolException("Value to high to fit into Byte: " + value);
-                }
-                coilSet = (Short) value == 1;
-            } else if (value.getClass() == Integer.class) {
-                if ((int) value > 1) {
-                    throw new PlcProtocolException("Value to high to fit into Byte: " + value);
-                }
-                coilSet = (int) value == 1;
-            } else if (value.getClass() == BigInteger.class) {
-                coilSet = value.equals(BigInteger.ONE);
-            } else if (value.getClass() == Float.class) {
-                coilSet = value.equals(1.0f);
-            } else if (value.getClass() == Double.class) {
-                coilSet = value.equals(1.0d);
-            } else {
-                throw new PlcUnsupportedDataTypeException(value.getClass());
-            }
-            byte coilToSet = coilSet ? (byte) 1 : (byte) 0;
-            actualCoil = (byte) (actualCoil & 0xff | coilToSet << i);
-            i--;
-            if (i < 0) {
-                coils.add(actualCoil);
-                actualCoil = 0;
-                i = 8;
-            }
-        }
-        if (coils.isEmpty()) {
-            // We only have one coil
-            return new byte[]{actualCoil};
-        }
-        return ArrayUtils.toPrimitive(coils.toArray(new Byte[0]));
-    }
-
-    private byte[] produceRegisterValue(List<?> values) throws PlcProtocolException {
-        ByteBuf buffer = Unpooled.buffer();
-        long upperRegisterValue = 0xFFFFL;
-        for (Object value : values) {
-            if (value.getClass() == Boolean.class) {
-                buffer.writeByte(0);
-                buffer.writeByte((boolean) value ? 1 : 0);
-            } else if (value.getClass() == Byte.class) {
-                buffer.writeByte(0);
-                buffer.writeByte((byte) value);
-            } else if (value.getClass() == byte[].class) {
-                byte[] bytes = (byte[]) value;
-                if (bytes.length != 2) {
-                    throw new PlcProtocolException("Exactly two bytes are allowed: " + bytes.length);
-                }
-                buffer.writeBytes(bytes);
-            } else if (value.getClass() == Byte[].class) {
-                Byte[] bytes = (Byte[]) value;
-                if (bytes.length != 2) {
-                    throw new PlcProtocolException("Exactly two bytes are allowed: " + bytes.length);
-                }
-                buffer.writeBytes(ArrayUtils.toPrimitive(bytes));
-            } else if (value.getClass() == Short.class) {
-                if ((short) value < 0) {
-                    throw new PlcProtocolException("Only positive values are supported for Short: " + value);
-                }
-                buffer.writeShort((short) value);
-            } else if (value.getClass() == Integer.class) {
-                if ((int) value > upperRegisterValue) {
-                    throw new PlcProtocolException("Value to high to fit into register for Integer: " + value);
-                }
-                if ((int) value < 0) {
-                    throw new PlcProtocolException("Only positive values are supported for Integer: " + value);
-                }
-                buffer.writeShort((int) value);
-            } else if (value.getClass() == BigInteger.class) {
-                if (((BigInteger) value).compareTo(BigInteger.ZERO) < 0) {
-                    throw new PlcProtocolException("Only positive values are supported for BigInteger: " + value);
-                }
-                if (((BigInteger) value).compareTo(BigInteger.valueOf(0XFFFF_FFFFL)) > 0) {
-                    throw new PlcProtocolException("Value to high to fit into register for BigInteger: " + value);
-                }
-                // TODO: for now we can't support big values as we only write one register at once
-                if (((BigInteger) value).compareTo(BigInteger.valueOf(upperRegisterValue)) > 0) {
-                    throw new PlcProtocolException("Value to high to fit into register for BigInteger: " + value);
-                }
-                // TODO: Register has 2 bytes so we trim to 2 instead of 4 like the second if above
-                int maxBytes = 2;
-                byte[] bigIntegerBytes = ((BigInteger) value).toByteArray();
-                byte[] bytes = new byte[maxBytes];
-                int lengthToCopy = Math.min(bigIntegerBytes.length, maxBytes);
-                int srcPosition = Math.max(bigIntegerBytes.length - maxBytes, 0);
-                int destPosition = maxBytes - lengthToCopy;
-                System.arraycopy(bigIntegerBytes, srcPosition, bytes, destPosition, lengthToCopy);
-
-                // TODO: check if this is a good representation.
-                // TODO: can a big integer span multiple registers?
-                buffer.writeBytes(bytes);
-            } else if (value.getClass() == Float.class) {
-                if (((float) value) < 0) {
-                    throw new PlcProtocolException("Only positive values are supported for Float: " + value);
-                }
-                if (((float) value) > upperRegisterValue) {
-                    throw new PlcProtocolException("Value to high to fit into register for Float: " + value);
-                }
-                buffer.writeShort(Math.round((float) value));
-            } else if (value.getClass() == Double.class) {
-                if (((double) value) < 0) {
-                    throw new PlcProtocolException("Only positive values are supported for Double: " + value);
-                }
-                if (((double) value) > upperRegisterValue) {
-                    throw new PlcProtocolException("Value to high to fit into register for Double: " + value);
-                }
-                buffer.writeShort((int) Math.round((double) value));
-            } else {
-                throw new PlcUnsupportedDataTypeException(value.getClass());
-            }
-        }
-        byte[] result = new byte[buffer.writerIndex()];
-        buffer.readBytes(result);
-        return result;
-    }
-
-    ////////////////////////////////////////////////////////////////////////////////
-    // Decoding helpers.
-    ////////////////////////////////////////////////////////////////////////////////
-    private PlcValue produceCoilValueList(ByteBuf byteBuf, int expectedQuantity) {
-        if (byteBuf.readableBytes() < expectedQuantity / 8) {
-            LOGGER.warn("Expected to read {} coils but only max of {} can be supplied", expectedQuantity, byteBuf.readableBytes() * 8);
-        }
-        byte[] bytes = new byte[byteBuf.readableBytes()];
-        if (bytes.length < 1) {
-            return null;
-        }
-        byteBuf.readBytes(bytes);
-        List<Boolean> data = new LinkedList<>();
-        int bitIndex = 0;
-        int coilIndex = 0;
-        while (coilIndex < bytes.length && data.size() < expectedQuantity) {
-            if (bitIndex > 7) {
-                // Every 8 Coils we need to increase the access
-                coilIndex++;
-                bitIndex = 0;
-                if (coilIndex >= bytes.length) {
-                    break;
-                }
-            }
-            boolean coilSet = (bytes[coilIndex] & 0xff & (1L << bitIndex)) != 0;
-            data.add(coilSet);
-            bitIndex++;
-        }
-        if(data.size() == 1) {
-            return new PlcBoolean(data.get(0));
-        } else {
-            return new PlcList(data);
-        }
-    }
-
-    private PlcValue produceRegisterValueList(ByteBuf byteBuf, int expectedQuantity) throws PlcProtocolException {
-        int readableBytes = byteBuf.readableBytes();
-        if (readableBytes % 2 != 0) {
-            throw new PlcProtocolException("Readables bytes should even: " + readableBytes);
-        }
-        List<Byte[]> data = new LinkedList<>();
-        while (byteBuf.readableBytes() > 0) {
-            byte[] register = new byte[2];
-            byteBuf.readBytes(register);
-            data.add(ArrayUtils.toObject(register));
-        }
-        return null;//new DefaultModbusByteArrayPlcValue(data.toArray(new Byte[0][0]));
-    }
-}
\ No newline at end of file
diff --git a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
deleted file mode 100644
index 0d71f26..0000000
--- a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/util/ModbusPlcFieldHandler.java
+++ /dev/null
@@ -1,123 +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.modbus.util;
-
-import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
-import org.apache.plc4x.java.api.model.PlcField;
-import org.apache.plc4x.java.api.value.PlcBoolean;
-import org.apache.plc4x.java.api.value.PlcList;
-import org.apache.plc4x.java.api.value.PlcValue;
-import org.apache.plc4x.java.modbus.model.CoilModbusField;
-import org.apache.plc4x.java.modbus.model.MaskWriteRegisterModbusField;
-import org.apache.plc4x.java.modbus.model.ModbusField;
-import org.apache.plc4x.java.modbus.model.ReadDiscreteInputsModbusField;
-import org.apache.plc4x.java.modbus.model.ReadHoldingRegistersModbusField;
-import org.apache.plc4x.java.modbus.model.ReadInputRegistersModbusField;
-import org.apache.plc4x.java.modbus.model.RegisterModbusField;
-import org.apache.plc4x.java.spi.connection.DefaultPlcFieldHandler;
-
-import java.util.BitSet;
-import java.util.LinkedList;
-import java.util.List;
-
-public class ModbusPlcFieldHandler extends DefaultPlcFieldHandler {
-
-    @Override
-    public PlcField createField(String fieldQuery) throws PlcInvalidFieldException {
-        if (MaskWriteRegisterModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return MaskWriteRegisterModbusField.of(fieldQuery);
-        } else if (ReadDiscreteInputsModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return ReadDiscreteInputsModbusField.of(fieldQuery);
-        } else if (ReadHoldingRegistersModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return ReadHoldingRegistersModbusField.of(fieldQuery);
-        } else if (ReadInputRegistersModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return ReadInputRegistersModbusField.of(fieldQuery);
-        } else if (CoilModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return CoilModbusField.of(fieldQuery);
-        } else if (RegisterModbusField.ADDRESS_PATTERN.matcher(fieldQuery).matches()) {
-            return RegisterModbusField.of(fieldQuery);
-        }
-        throw new PlcInvalidFieldException(fieldQuery);
-    }
-
-    @Override
-    public PlcValue encodeBoolean(PlcField field, Object[] values) {
-        ModbusField modbusField = (ModbusField) field;
-        List<Boolean> booleanValues = new LinkedList<>();
-        for (Object value : values) {
-            if (value instanceof Boolean) {
-                Boolean booleanValue = (Boolean) value;
-                booleanValues.add(booleanValue);
-            } else if (value instanceof Byte) {
-                Byte byteValue = (Byte) value;
-                BitSet bitSet = BitSet.valueOf(new byte[]{byteValue});
-                for (int i = 0; i < 8; i++) {
-                    booleanValues.add(bitSet.get(i));
-                }
-            } else if (value instanceof Short) {
-                Short shortValue = (Short) value;
-                BitSet bitSet = BitSet.valueOf(new long[]{shortValue});
-                for (int i = 0; i < 16; i++) {
-                    booleanValues.add(bitSet.get(i));
-                }
-            } else if (value instanceof Integer) {
-                Integer integerValue = (Integer) value;
-                BitSet bitSet = BitSet.valueOf(new long[]{integerValue});
-                for (int i = 0; i < 32; i++) {
-                    booleanValues.add(bitSet.get(i));
-                }
-            } else if (value instanceof Long) {
-                long longValue = (Long) value;
-                BitSet bitSet = BitSet.valueOf(new long[]{longValue});
-                for (int i = 0; i < 64; i++) {
-                    booleanValues.add(bitSet.get(i));
-                }
-            } else {
-                throw new IllegalArgumentException(
-                    "Value of type " + value.getClass().getName() +
-                        " is not assignable to " + modbusField + " fields.");
-            }
-        }
-        if(booleanValues.size() == 1) {
-            return new PlcBoolean(booleanValues.get(0));
-        } else {
-            return new PlcList(booleanValues);
-        }
-    }
-
-    /*@Override
-    public PlcValue encodeByteArray(PlcField field, Object[] values) {
-        ModbusField modbusField = (ModbusField) field;
-        List<Byte[]> byteArrays = new LinkedList<>();
-        for (Object value : values) {
-            if (value instanceof byte[]) {
-                byte[] byteArray = (byte[]) value;
-                byteArrays.add(ArrayUtils.toObject(byteArray));
-            } else if (value instanceof Byte[]) {
-                Byte[] byteArray = (Byte[]) value;
-                byteArrays.add(byteArray);
-            } else {
-                throw new IllegalArgumentException(
-                    "Value of type " + value.getClass().getName() +
-                        " is not assignable to " + modbusField + " fields.");
-            }
-        }
-        return new DefaultModbusByteArrayPlcValue(byteArrays.toArray(new Byte[0][0]));
-    }*/
-}
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
deleted file mode 100644
index f9a925f..0000000
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ManualPlc4XModbusTest.java
+++ /dev/null
@@ -1,138 +0,0 @@
-/*
- Licensed to the Apache Software Foundation (ASF) under one
- or more contributor license agreements.  See the NOTICE file
- distributed with this work for additional information
- regarding copyright ownership.  The ASF licenses this file
- to you under the Apache License, Version 2.0 (the
- "License"); you may not use this file except in compliance
- with the License.  You may obtain a copy of the License at
-
-   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.modbus;
-
-import org.apache.commons.lang3.ArrayUtils;
-import org.apache.plc4x.java.PlcDriverManager;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.messages.PlcReadRequest;
-import org.apache.plc4x.java.api.messages.PlcReadResponse;
-import org.apache.plc4x.java.api.messages.PlcWriteRequest;
-import org.apache.plc4x.java.api.messages.PlcWriteResponse;
-//import org.apache.plc4x.java.mock.util.HexUtil;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.stream.IntStream;
-
-public class ManualPlc4XModbusTest {
-
-/*    public static void main(String... args) {
-        String connectionUrl;
-        if (args.length > 0 && "serial".equalsIgnoreCase(args[0])) {
-            System.out.println("Using serial");
-            connectionUrl = "modbus:serial:///dev/ttys003";
-        } else {
-            System.out.println("Using tcp");
-            connectionUrl = "modbus:tcp://localhost:5440";
-        }
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection(connectionUrl)) {
-            System.out.println("PlcConnection " + plcConnection);
-
-            {
-                PlcReadRequest readRequest = plcConnection.readRequestBuilder()
-                .addItem("randomRegister", "register:7[3]").build();
-                PlcReadResponse readResponse = readRequest.execute().get();
-                System.out.println("Response " + readResponse);
-                readResponse.getAllByteArrays("randomRegister").stream()
-                    .map(HexUtil::toHex)
-                    .map(hex -> "Register Value: " + hex)
-                    .forEach(System.out::println);
-            }
-
-            {
-                // Read an int from 2 registers
-
-                // Just dump the actual values
-                PlcReadRequest readRequest = plcConnection.readRequestBuilder()
-                    .addItem("randomRegister", "register:3[2]").build();
-                PlcReadResponse readResponse = readRequest.execute().get();
-                System.out.println("Response " + readResponse);
-                Collection<Byte[]> randomRegisters = readResponse.getAllByteArrays("randomRegister");
-                randomRegisters.stream()
-                    .map(HexUtil::toHex)
-                    .map(hex -> "Register Value: " + hex)
-                    .forEach(System.out::println);
-
-                // Read an actual int
-                Byte[] registerBytes = randomRegisters.stream()
-                    .flatMap(Arrays::stream)
-                    .toArray(Byte[]::new);
-                int readInt = ByteBuffer.wrap(ArrayUtils.toPrimitive(registerBytes))
-                    .order(ByteOrder.BIG_ENDIAN)
-                    .getInt();
-                System.out.println("Read int " + readInt + " from register");
-            }
-
-            {
-                // Read an int from 2 registers and multiple requests
-
-                // Just dump the actual values
-                PlcReadRequest readRequest = plcConnection.readRequestBuilder()
-                    .addItem("randomRegister1", "register:1[2]")
-                    .addItem("randomRegister2", "register:10[3]")
-                    .addItem("randomRegister3", "register:20[4]")
-                    .addItem("randomRegister4", "register:30[5]")
-                    .addItem("randomRegister5", "register:40[6]")
-                    .build();
-                PlcReadResponse readResponse = readRequest.execute().get();
-                System.out.println("Response " + readResponse);
-                IntStream.range(1, 6).forEach(i -> {
-                    Collection<Byte[]> randomRegisters = readResponse.getAllByteArrays("randomRegister" + i);
-                    randomRegisters.stream()
-                        .map(HexUtil::toHex)
-                        .map(hex -> "Register " + i + " Value: " + hex)
-                        .forEach(System.out::println);
-
-                    // Read an actual int
-                    Byte[] registerBytes = randomRegisters.stream()
-                        .flatMap(Arrays::stream)
-                        .toArray(Byte[]::new);
-                    int readInt = ByteBuffer.wrap(ArrayUtils.toPrimitive(registerBytes))
-                        .order(ByteOrder.BIG_ENDIAN)
-                        .getInt();
-                    System.out.println("Read int " + i + " " + readInt + " from register");
-                });
-            }
-
-            {
-                PlcReadRequest readRequest = plcConnection.readRequestBuilder()
-                    .addItem("randomCoil", "coil:1[9]").build();
-                PlcReadResponse readResponse = readRequest.execute().get();
-                System.out.println("Response " + readResponse);
-                readResponse.getAllBooleans("randomCoil").stream()
-                    .map(hex -> "Coil Value: " + hex)
-                    .forEach(System.out::println);
-            }
-
-            {
-                PlcWriteRequest writeRequest = plcConnection.writeRequestBuilder()
-                    .addItem("randomCoilField", "coil:1", true).build();
-                PlcWriteResponse writeResponse = writeRequest.execute().get();
-                System.out.println("Response " + writeResponse);
-            }
-        } catch (Exception e) {
-            e.printStackTrace();
-            System.exit(1);
-        }
-        System.exit(0);
-    }*/
-}
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcValueTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcValueTest.java
deleted file mode 100644
index a687a41..0000000
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/messages/items/DefaultModbusByteArrayPlcValueTest.java
+++ /dev/null
@@ -1,170 +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.modbus.messages.items;
-
-import org.apache.plc4x.java.api.value.PlcValue;
-import org.junit.Test;
-
-import java.nio.ByteBuffer;
-import java.nio.ByteOrder;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-@SuppressWarnings("unchecked")
-public class DefaultModbusByteArrayPlcValueTest {
-    /*@Test
-    public void convertByteArrayToIntegerTest() {
-        PlcValue fieldItem = getFieldItemForIntegerArray();
-
-        Integer itemInteger = fieldItem.getInteger(1);
-        assertEquals(456,itemInteger,0);
-    }
-
-    @Test
-    public void convertByteArrayToIntegerTestReturnsNull() {
-        PlcValue fieldItem = getFieldItemForIntegerArray();
-
-        Integer itemInteger = fieldItem.getInteger(17);
-        assertNull(itemInteger);
-    }
-
-    private static PlcValue getFieldItemForIntegerArray() {
-        int sizeIntByteBuffer = 12;
-        ByteBuffer byteBuffer = ByteBuffer.allocate(sizeIntByteBuffer);
-        byteBuffer.order(ByteOrder.BIG_ENDIAN);
-        byteBuffer.putInt(0,123);
-        byteBuffer.putInt(4,456);
-        byteBuffer.putInt(8,789);
-        Byte[][] byteArray = new Byte[sizeIntByteBuffer/2][2];
-        int cntByteBuffer=0;
-        for (byte b : byteBuffer.array()) {
-            int shortIndex=cntByteBuffer/2;
-            byteArray[shortIndex][cntByteBuffer%2] = b;
-            cntByteBuffer++;
-        }
-
-        return new DefaultModbusByteArrayFieldItem(byteArray);
-    }
-
-
-    @Test
-    public void convertByteArrayToShortTest() {
-        PlcValue fieldItem = getFieldItemForShortArray();
-
-        Short itemShort = fieldItem.getShort(3);
-        assertEquals(1011,itemShort,0);
-    }
-
-    @Test
-    public void convertByteArrayToShortTestReturnsNull() {
-        PlcValue fieldItem = getFieldItemForShortArray();
-
-        Short itemShort = fieldItem.getShort(7);
-        assertNull(itemShort);
-    }
-
-    private static PlcValue getFieldItemForShortArray() {
-        int sizeIntByteBuffer = 8;
-        ByteBuffer byteBuffer = ByteBuffer.allocate(sizeIntByteBuffer);
-        byteBuffer.order(ByteOrder.BIG_ENDIAN);
-        byteBuffer.putShort(0,(short)123);
-        byteBuffer.putShort(2,(short)456);
-        byteBuffer.putShort(4,(short)789);
-        byteBuffer.putShort(6,(short)1011);
-        Byte[][] byteArray = new Byte[sizeIntByteBuffer/2][2];
-        int cntByteBuffer=0;
-        for (byte b : byteBuffer.array()) {
-            int shortIndex=cntByteBuffer/2;
-            byteArray[shortIndex][cntByteBuffer%2] = b;
-            cntByteBuffer++;
-        }
-
-        return new DefaultModbusByteArrayFieldItem(byteArray);
-    }
-
-    @Test
-    public void convertByteArrayToLongTest() {
-        PlcValue fieldItem = getFieldItemForLongArray();
-
-        Long itemLong = fieldItem.getLong(1);
-        assertEquals(456789123L,itemLong,0);
-    }
-
-    @Test
-    public void convertByteArrayToLongTestReturnsNull() {
-        PlcValue fieldItem = getFieldItemForLongArray();
-
-        Long itemLong = fieldItem.getLong(4);
-        assertNull(itemLong);
-    }
-
-    private static PlcValue getFieldItemForLongArray() {
-        int sizeIntByteBuffer = 32;
-        ByteBuffer byteBuffer = ByteBuffer.allocate(sizeIntByteBuffer);
-        byteBuffer.order(ByteOrder.BIG_ENDIAN);
-        byteBuffer.putLong(0,123456789L);
-        byteBuffer.putLong(8,456789123L);
-        byteBuffer.putLong(16,789123456L);
-        byteBuffer.putLong(24,101110111011L);
-        Byte[][] byteArray = new Byte[sizeIntByteBuffer/2][2];
-        int cntByteBuffer=0;
-        for (byte b : byteBuffer.array()) {
-            int shortIndex=cntByteBuffer/2;
-            byteArray[shortIndex][cntByteBuffer%2] = b;
-            cntByteBuffer++;
-        }
-
-        return new DefaultModbusByteArrayFieldItem(byteArray);
-    }
-
-    @Test
-    public void convertByteArrayToFloatTest() {
-        PlcValue fieldItem = getFieldItemForFloatArray();
-
-        Float itemFloat = fieldItem.getFloat(1);
-        assertEquals(456.456f, itemFloat, 0);
-    }
-
-    @Test
-    public void convertByteArrayToFloatTestReturnsNull() {
-        PlcValue fieldItem = getFieldItemForFloatArray();
-
-        Float itemFloat = fieldItem.getFloat(17);
-        assertNull(itemFloat);
-    }
-
-    private static PlcValue getFieldItemForFloatArray() {
-        int sizeFloatByteBuffer = 12;
-        ByteBuffer byteBuffer = ByteBuffer.allocate(sizeFloatByteBuffer);
-        byteBuffer.order(ByteOrder.BIG_ENDIAN);
-        byteBuffer.putFloat(0,123.123f);
-        byteBuffer.putFloat(4,456.456f);
-        byteBuffer.putFloat(8,789.789f);
-        Byte[][] byteArray = new Byte[sizeFloatByteBuffer / 2][2];
-        int cntByteBuffer = 0;
-        for (byte b : byteBuffer.array()) {
-            int shortIndex=cntByteBuffer / 2;
-            byteArray[shortIndex][cntByteBuffer % 2] = b;
-            cntByteBuffer++;
-        }
-
-        return new DefaultModbusByteArrayFieldItem(byteArray);
-    }*/
-}
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java
deleted file mode 100644
index 97031f9..0000000
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocolTest.java
+++ /dev/null
@@ -1,441 +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.modbus.netty;
-
-import com.digitalpetri.modbus.ModbusPdu;
-import com.digitalpetri.modbus.codec.ModbusTcpPayload;
-import com.digitalpetri.modbus.requests.MaskWriteRegisterRequest;
-import com.digitalpetri.modbus.requests.ReadCoilsRequest;
-import com.digitalpetri.modbus.requests.ReadDiscreteInputsRequest;
-import com.digitalpetri.modbus.requests.ReadHoldingRegistersRequest;
-import com.digitalpetri.modbus.requests.ReadInputRegistersRequest;
-import com.digitalpetri.modbus.requests.WriteMultipleCoilsRequest;
-import com.digitalpetri.modbus.requests.WriteMultipleRegistersRequest;
-import com.digitalpetri.modbus.requests.WriteSingleCoilRequest;
-import com.digitalpetri.modbus.requests.WriteSingleRegisterRequest;
-import com.digitalpetri.modbus.responses.MaskWriteRegisterResponse;
-import com.digitalpetri.modbus.responses.ReadCoilsResponse;
-import com.digitalpetri.modbus.responses.ReadDiscreteInputsResponse;
-import com.digitalpetri.modbus.responses.ReadHoldingRegistersResponse;
-import com.digitalpetri.modbus.responses.ReadInputRegistersResponse;
-import com.digitalpetri.modbus.responses.WriteMultipleCoilsResponse;
-import com.digitalpetri.modbus.responses.WriteMultipleRegistersResponse;
-import com.digitalpetri.modbus.responses.WriteSingleCoilResponse;
-import com.digitalpetri.modbus.responses.WriteSingleRegisterResponse;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-import org.apache.commons.lang3.RandomStringUtils;
-import org.apache.commons.lang3.tuple.ImmutablePair;
-import org.apache.plc4x.java.api.messages.PlcResponse;
-//import org.apache.plc4x.java.mock.protocol.Plc4XSupportedDataTypes;
-import org.apache.plc4x.java.modbus.util.ModbusPlcFieldHandler;
-import org.apache.plc4x.java.spi.messages.DefaultPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.DefaultPlcWriteRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcReadRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcRequest;
-import org.apache.plc4x.java.spi.messages.InternalPlcResponse;
-import org.apache.plc4x.java.spi.messages.InternalPlcWriteRequest;
-import org.apache.plc4x.java.spi.messages.PlcRequestContainer;
-import org.junit.Before;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-import java.math.BigInteger;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Calendar;
-import java.util.Collection;
-import java.util.GregorianCalendar;
-import java.util.List;
-import java.util.concurrent.CompletableFuture;
-import java.util.stream.Collectors;
-import java.util.stream.Stream;
-
-//import static org.apache.plc4x.java.mock.protocol.Plc4XSupportedDataTypes.streamOfBigEndianDataTypePairs;
-//import static org.apache.plc4x.java.mock.util.Assert.assertByteEquals;
-import static org.hamcrest.Matchers.equalTo;
-import static org.hamcrest.Matchers.hasItem;
-import static org.hamcrest.Matchers.hasSize;
-import static org.hamcrest.Matchers.instanceOf;
-import static org.hamcrest.Matchers.not;
-import static org.junit.Assert.assertThat;
-import static org.junit.Assume.assumeThat;
-
-//@RunWith(Parameterized.class)
-public class Plc4XModbusProtocolTest {
-
-    /*private static final Logger LOGGER = LoggerFactory.getLogger(Plc4XModbusProtocolTest.class);
-
-    private Plc4XModbusProtocol SUT;
-
-    @Rule
-    public ExpectedException expectedException = ExpectedException.none();
-    // TODO: implement these types
-    private List<String> notYetSupportedDataType = Stream.of(
-        String.class
-    ).map(Class::getSimpleName).collect(Collectors.toList());
-
-    @Parameterized.Parameter
-    public String payloadClazzName;
-
-    @Parameterized.Parameter(1)
-    public PlcRequestContainer<InternalPlcRequest, InternalPlcResponse> plcRequestContainer;
-
-    @Parameterized.Parameter(2)
-    public CompletableFuture completableFuture;
-
-    @Parameterized.Parameter(3)
-    public String plcRequestContainerClassName;
-
-    @Parameterized.Parameter(4)
-    public ModbusTcpPayload modbusTcpPayload;
-
-    @Parameterized.Parameter(5)
-    public String modbusPduName;
-
-    @Parameterized.Parameters(name = "{index} Type:{0} {3} {5}")
-    public static Collection<Object[]> data() {
-        return streamOfBigEndianDataTypePairs()
-            .filter(o -> o.getDataTypeClass() == boolean.class
-                || o.getDataTypeClass() == byte[].class
-                || o.getDataTypeClass() == Byte[].class)
-            // Float and Double getting truncated in modbus.
-            .map(dataTypePair -> {
-                if (dataTypePair.getDataTypeClass() == Float.class) {
-                    return Plc4XSupportedDataTypes.DataTypePair.of(1f, new byte[]{0x0, 0x1});
-                } else if (dataTypePair.getDataTypeClass() == Double.class) {
-                    return Plc4XSupportedDataTypes.DataTypePair.of(1d, new byte[]{0x0, 0x1});
-                } else {
-                    return dataTypePair;
-                }
-            })
-            .map(dataTypePair -> Stream.of(
-                producePair(dataTypePair.getDataTypeClass(), "coil:1", new ReadCoilsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x1}))),
-                producePair("coil:1", new WriteSingleCoilResponse(1, 1), mapDataTypePairForCoil(dataTypePair).getValue()),
-                / Read request no supported on maskwrite so how to handle?
-                producePair(pair.getDataTypeClass(), MaskWriteRegisterModbusField.of("maskwrite:1/1/2"), new MaskWriteRegisterResponse(1, 1, 2)),
-                /
-                producePair("maskwrite:1/1/2", new MaskWriteRegisterResponse(1, 1, 2), mapDataTypePairForRegister(dataTypePair).getValue()),
-                producePair(dataTypePair.getDataTypeClass(), "readdiscreteinputs:1", new ReadDiscreteInputsResponse(Unpooled.wrappedBuffer(new byte[]{(byte) 0x01}))),
-                producePair(dataTypePair.getDataTypeClass(), "readholdingregisters:1", new ReadHoldingRegistersResponse(Unpooled.wrappedBuffer(cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())))),
-                producePair(dataTypePair.getDataTypeClass(), "readinputregisters:1", new ReadInputRegistersResponse(Unpooled.wrappedBuffer(cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())))),
-                producePair("coil:1", new WriteMultipleCoilsResponse(1, 3), mapDataTypePairForCoil(dataTypePair).getValue(), mapDataTypePairForCoil(dataTypePair).getValue(), mapDataTypePairForCoil(dataTypePair).getValue()),
-                producePair("register:1", new WriteMultipleRegistersResponse(1, 3), mapDataTypePairForRegister(dataTypePair).getValue(), mapDataTypePairForRegister(dataTypePair).getValue(), mapDataTypePairForRegister(dataTypePair).getValue()),
-                producePair("register:1", new WriteSingleRegisterResponse(1, cutRegister(mapDataTypePairForRegister(dataTypePair).getByteRepresentation())[0]), mapDataTypePairForRegister(dataTypePair).getValue())
-            ))
-            .flatMap(stream -> stream)
-            // TODO: request doesn't know its type anymore... fixme
-            .map(pair -> new Object[]{Object.class.getSimpleName(), pair.left, pair.left.getResponseFuture(), pair.left.getRequest().getClass().getSimpleName(), pair.right, pair.right.getClass().getSimpleName()}).collect(Collectors.toList());
-    }
-
-    private static ImmutablePair<PlcRequestContainer<InternalPlcReadRequest, InternalPlcResponse>, ModbusTcpPayload> producePair(Class type, String field, ModbusPdu modbusPdu) {
-        return ImmutablePair.of(
-            new PlcRequestContainer<>(
-                (InternalPlcReadRequest) new DefaultPlcReadRequest.Builder(null, new ModbusPlcFieldHandler()) // TODO: remove null
-                    .addItem(RandomStringUtils.randomAlphabetic(10), field)
-                    .build(), new CompletableFuture<>()),
-            new ModbusTcpPayload((short) 0, (short) 0, modbusPdu)
-        );
-    }
-
-    @SuppressWarnings("unchecked")
-    private static ImmutablePair<PlcRequestContainer<InternalPlcWriteRequest, InternalPlcResponse>, ModbusTcpPayload> producePair(String field, ModbusPdu modbusPdu, Object... values) {
-        if (values.length == 0) {
-            throw new IllegalArgumentException("At least one value ist required");
-        }
-        if (values.length == 1) {
-            return ImmutablePair.of(
-                new PlcRequestContainer<>(
-                    (InternalPlcWriteRequest) new DefaultPlcWriteRequest.Builder(null, new ModbusPlcFieldHandler()) // TODO: remove null
-                        .addItem(RandomStringUtils.randomAlphabetic(10), field, values[0])
-                        .build(), new CompletableFuture<>()),
-                new ModbusTcpPayload((short) 0, (short) 0, modbusPdu)
-            );
-        } else {
-            return ImmutablePair.of(
-                new PlcRequestContainer<>(
-                    (InternalPlcWriteRequest) new DefaultPlcWriteRequest.Builder(null, new ModbusPlcFieldHandler()) // TODO: remove null
-                        .addItem(RandomStringUtils.randomAlphabetic(10), field, values)
-                        .build(), new CompletableFuture<>()),
-                new ModbusTcpPayload((short) 0, (short) 0, modbusPdu)
-            );
-        }
-    }
-
-    private static byte[] cutRegister(byte[] right) {
-        return new byte[]{right.length > 1 ? right[right.length - 2] : 0x0, right[right.length - 1]};
-    }
-
-    @Before
-    public void setUp() {
-        SUT = new Plc4XModbusProtocol((short) 1);
-    }
-
-    @Test
-    public void encode() throws Exception {
-        assumeThat(payloadClazzName + " not yet implemented", notYetSupportedDataType, not(hasItem(payloadClazzName)));
-        ArrayList<Object> out = new ArrayList<>();
-        SUT.encode(null, plcRequestContainer, out);
-        assertThat(out, hasSize(1));
-        assertThat(out.get(0), instanceOf(ModbusTcpPayload.class));
-        ModbusTcpPayload modbusTcpPayload = (ModbusTcpPayload) out.get(0);
-        ModbusPdu modbusPdu = modbusTcpPayload.getModbusPdu();
-        if (modbusPdu instanceof MaskWriteRegisterRequest) {
-            MaskWriteRegisterRequest maskWriteRegisterRequest = (MaskWriteRegisterRequest) modbusPdu;
-            int address = maskWriteRegisterRequest.getAddress();
-            assertThat(address, equalTo(1));
-            int andMask = maskWriteRegisterRequest.getAndMask();
-            int orMask = maskWriteRegisterRequest.getOrMask();
-            if (payloadClazzName.equals(Boolean.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            } else if (payloadClazzName.equals(Byte.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            } else if (payloadClazzName.equals(Short.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            } else if (payloadClazzName.equals(GregorianCalendar.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            } else if (payloadClazzName.equals(Float.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            } else if (payloadClazzName.equals(Integer.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            } else if (payloadClazzName.equals(BigInteger.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            } else if (payloadClazzName.equals(String.class.getSimpleName())) {
-                assertThat(andMask, equalTo(1));
-                assertThat(orMask, equalTo(2));
-            }
-        } else if (modbusPdu instanceof ReadCoilsRequest) {
-            ReadCoilsRequest readCoilsRequest = (ReadCoilsRequest) modbusPdu;
-            int address = readCoilsRequest.getAddress();
-            int quantity = readCoilsRequest.getQuantity();
-            assertThat(address, equalTo(1));
-            assertThat(quantity, equalTo(1));
-        } else if (modbusPdu instanceof ReadDiscreteInputsRequest) {
-            ReadDiscreteInputsRequest readCoilsRequest = (ReadDiscreteInputsRequest) modbusPdu;
-            int address = readCoilsRequest.getAddress();
-            int quantity = readCoilsRequest.getQuantity();
-            assertThat(address, equalTo(1));
-            assertThat(quantity, equalTo(1));
-        } else if (modbusPdu instanceof ReadHoldingRegistersRequest) {
-            ReadHoldingRegistersRequest readCoilsRequest = (ReadHoldingRegistersRequest) modbusPdu;
-            int address = readCoilsRequest.getAddress();
-            int quantity = readCoilsRequest.getQuantity();
-            assertThat(address, equalTo(1));
-            assertThat(quantity, equalTo(1));
-        } else if (modbusPdu instanceof ReadInputRegistersRequest) {
-            ReadInputRegistersRequest readCoilsRequest = (ReadInputRegistersRequest) modbusPdu;
-            int address = readCoilsRequest.getAddress();
-            int quantity = readCoilsRequest.getQuantity();
-            assertThat(address, equalTo(1));
-            assertThat(quantity, equalTo(1));
-        } else if (modbusPdu instanceof WriteMultipleCoilsRequest) {
-            WriteMultipleCoilsRequest writeMultipleCoilsRequest = (WriteMultipleCoilsRequest) modbusPdu;
-            int address = writeMultipleCoilsRequest.getAddress();
-            assertThat(address, equalTo(1));
-            ByteBuf value = writeMultipleCoilsRequest.getValues();
-            byte[] bytes = new byte[value.readableBytes()];
-            value.readBytes(value);
-            if (payloadClazzName.equals(Boolean.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            } else if (payloadClazzName.equals(Byte.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            } else if (payloadClazzName.equals(Short.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            } else if (payloadClazzName.equals(Calendar.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            } else if (payloadClazzName.equals(Float.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            } else if (payloadClazzName.equals(Integer.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            } else if (payloadClazzName.equals(BigInteger.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            } else if (payloadClazzName.equals(String.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0}, bytes);
-            }
-        } else if (modbusPdu instanceof WriteMultipleRegistersRequest) {
-            WriteMultipleRegistersRequest writeMultipleRegistersRequest = (WriteMultipleRegistersRequest) modbusPdu;
-            int address = writeMultipleRegistersRequest.getAddress();
-            assertThat(address, equalTo(1));
-            ByteBuf value = writeMultipleRegistersRequest.getValues();
-            byte[] bytes = new byte[value.readableBytes()];
-            value.readBytes(value);
-            if (payloadClazzName.equals(Boolean.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            } else if (payloadClazzName.equals(Byte.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            } else if (payloadClazzName.equals(Short.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            } else if (payloadClazzName.equals(Calendar.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            } else if (payloadClazzName.equals(Float.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            } else if (payloadClazzName.equals(Integer.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            } else if (payloadClazzName.equals(BigInteger.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            } else if (payloadClazzName.equals(String.class.getSimpleName())) {
-                assertByteEquals(new byte[]{0x0, 0x0, 0x0, 0x0, 0x0, 0x0}, bytes);
-            }
-        } else if (modbusPdu instanceof WriteSingleCoilRequest) {
-            WriteSingleCoilRequest writeSingleCoilRequest = (WriteSingleCoilRequest) modbusPdu;
-            int address = writeSingleCoilRequest.getAddress();
-            assertThat(address, equalTo(1));
-            int value = writeSingleCoilRequest.getValue();
-            boolean coilValue = value == 0xFF00;
-            if (payloadClazzName.equals(Boolean.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(Byte.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(Short.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(Calendar.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(Float.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(Double.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(Integer.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(BigInteger.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            } else if (payloadClazzName.equals(String.class.getSimpleName())) {
-                assertThat(coilValue, equalTo(true));
-            }
-        } else if (modbusPdu instanceof WriteSingleRegisterRequest) {
-            WriteSingleRegisterRequest writeSingleRegisterRequest = (WriteSingleRegisterRequest) modbusPdu;
-            int address = writeSingleRegisterRequest.getAddress();
-            assertThat(address, equalTo(1));
-            int value = writeSingleRegisterRequest.getValue();
-            if (payloadClazzName.equals(Boolean.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(Byte.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(Short.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(Calendar.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(Float.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(Double.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(Integer.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(BigInteger.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            } else if (payloadClazzName.equals(String.class.getSimpleName())) {
-                assertThat(value, equalTo(1));
-            }
-        }
-    }
-
-    @Test
-    public void decode() throws Exception {
-        assumeThat(payloadClazzName + " not yet implemented", notYetSupportedDataType, not(hasItem(payloadClazzName)));
-        ArrayList<Object> in = new ArrayList<>();
-        SUT.encode(null, plcRequestContainer, in);
-        assertThat(in, hasSize(1));
-        ArrayList<Object> out = new ArrayList<>();
-        SUT.decode(null, modbusTcpPayload, out);
-        assertThat(out, hasSize(0));
-        LOGGER.info("PlcRequestContainer {}", plcRequestContainer);
-        PlcResponse plcResponse = plcRequestContainer.getResponseFuture().get();
-        // TODO: FIXME: this is different now after refactoring
-        //ResponseItem responseItem = (ResponseItem) plcResponse.getResponseItem().get();
-        //LOGGER.info("ResponseItem {}", responseItem);
-        ModbusPdu modbusPdu = modbusTcpPayload.getModbusPdu();
-        if (modbusPdu instanceof MaskWriteRegisterResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcWriteResponseItem writeResponseItem = (PlcWriteResponseItem) responseItem;
-//            assertEquals(PlcResponseCode.OK, writeResponseItem.getResponseCode());
-        } else if (modbusPdu instanceof ReadCoilsResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcReadResponseItem readResponseItem = (PlcReadResponseItem) responseItem;
-//            Object value = readResponseItem.getValues().get(0);
-//            defaultAssert(value, Plc4XModbusProtocolTest::mapDataTypePairForCoil);
-        } else if (modbusPdu instanceof ReadDiscreteInputsResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcReadResponseItem readResponseItem = (PlcReadResponseItem) responseItem;
-//            Object value = readResponseItem.getValues().get(0);
-//            defaultAssert(value, Plc4XModbusProtocolTest::mapDataTypePairForCoil);
-        } else if (modbusPdu instanceof ReadHoldingRegistersResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcReadResponseItem readResponseItem = (PlcReadResponseItem) responseItem;
-//            Object value = readResponseItem.getValues().get(0);
-//            defaultAssert(value, Plc4XModbusProtocolTest::mapDataTypePairForRegister);
-        } else if (modbusPdu instanceof ReadInputRegistersResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcReadResponseItem readResponseItem = (PlcReadResponseItem) responseItem;
-//            Object value = readResponseItem.getValues().get(0);
-//            defaultAssert(value, Plc4XModbusProtocolTest::mapDataTypePairForRegister);
-        } else if (modbusPdu instanceof WriteMultipleCoilsResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcWriteResponseItem writeResponseItem = (PlcWriteResponseItem) responseItem;
-//            assertEquals(PlcResponseCode.OK, writeResponseItem.getResponseCode());
-        } else if (modbusPdu instanceof WriteMultipleRegistersResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcWriteResponseItem writeResponseItem = (PlcWriteResponseItem) responseItem;
-//            assertEquals(PlcResponseCode.OK, writeResponseItem.getResponseCode());
-        } else if (modbusPdu instanceof WriteSingleCoilResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcWriteResponseItem writeResponseItem = (PlcWriteResponseItem) responseItem;
-//            assertEquals(PlcResponseCode.OK, writeResponseItem.getResponseCode());
-        } else if (modbusPdu instanceof WriteSingleRegisterResponse) {
-            // TODO: FIXME: this is different now after refactoring
-//            PlcWriteResponseItem writeResponseItem = (PlcWriteResponseItem) responseItem;
-//            assertEquals(PlcResponseCode.OK, writeResponseItem.getResponseCode());
-        }
-    }
-
-    private static Plc4XSupportedDataTypes.DataTypePair mapDataTypePairForCoil(Plc4XSupportedDataTypes.DataTypePair dataTypePair) {
-        return mapDataTypePairForRegisterOrCoil(dataTypePair, 1);
-    }
-
-    private static Plc4XSupportedDataTypes.DataTypePair mapDataTypePairForRegister(Plc4XSupportedDataTypes.DataTypePair dataTypePair) {
-        return mapDataTypePairForRegisterOrCoil(dataTypePair, 2);
-    }
... 10671 lines suppressed ...


[plc4x] 02/02: - Added some checklists to the release and validation documentation

Posted by cd...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

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

commit 685e7464aecf212553f65a5f9606b7cf5a0900bc
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Tue Feb 18 11:37:56 2020 +0100

    - Added some checklists to the release and validation documentation
---
 src/site/asciidoc/developers/release/release.adoc  | 38 +++++++++++++++++++
 .../asciidoc/developers/release/validation.adoc    | 44 +++++++++++-----------
 2 files changed, 60 insertions(+), 22 deletions(-)

diff --git a/src/site/asciidoc/developers/release/release.adoc b/src/site/asciidoc/developers/release/release.adoc
index 5b43077..bb2117e 100644
--- a/src/site/asciidoc/developers/release/release.adoc
+++ b/src/site/asciidoc/developers/release/release.adoc
@@ -19,6 +19,44 @@
 
 == Releasing PLC4X
 
+=== TL/DR
+
+IMPORTANT: Please be sure to execute the release with a Java version between 1.8 and 11 or the Karaf feature tests will not run.
+
+[%interactive]
+* [ ] Update the `RELEASE_NOTES`
+* [ ] Check year in `NOTICE`
+* [ ] Create release branch:
+[subs="verbatim,attributes"]
+----
+   mvn release:branch -P with-sandbox,with-cpp,with-boost,with-dotnet,with-python,with-proxies,with-logstash -DbranchName=rel/{current-short-version} -DautoVersionSubmodules=true
+----
+[%interactive]
+* [ ] Add a new section to the `RELEASE_NOTES` on `develop`
+* [ ] Prepare the release:
+[subs="verbatim,attributes"]
+----
+   mvn release:prepare -P with-sandbox,with-cpp,with-boost,with-dotnet,with-python,with-proxies,with-logstash -DautoVersionSubmodules=true
+----
+[%interactive]
+* [ ] Perform the release:
+[subs="verbatim,attributes"]
+----
+   mvn release:perform -DreleaseProfiles=apache-release,with-boost,with-proxies,with-logstash
+----
+[%interactive]
+* [ ] Close the staging repo on `Nexus`
+* [ ] Stage the release artifacts in `SVN`
+* [ ] Vote on the mailing list
+* [ ] Move RC to the release section of `SVN`
+* [ ] Remove old releases in `SVN`
+* [ ] Release staging repo on `Nexus`
+* [ ] Add the version to the DOAP file on `develop`
+* [ ] Update Download site
+* [ ] Update Jira
+* [ ] Merge back release version to `master` branch
+* [ ] Send announce email
+
 === Preparing your system for being able to release
 
 As part of the release process, Maven will upload maven release artifacts to a so-called staging repository.
diff --git a/src/site/asciidoc/developers/release/validation.adoc b/src/site/asciidoc/developers/release/validation.adoc
index f96a3b1..8e90c3c 100644
--- a/src/site/asciidoc/developers/release/validation.adoc
+++ b/src/site/asciidoc/developers/release/validation.adoc
@@ -21,46 +21,46 @@
 
 TIP: On MacOS and Linux the first 4 steps can be automated. For details please read the section about tooling after this chapter.
 
-1. Download all staged artifacts under the url specified in the release vote email into a directory we'll now call `download-dir`.
-2. Verify the signature is correct:
+[%interactive]
+* [ ] Download all staged artifacts under the url specified in the release vote email into a directory we'll now call `download-dir`.
+* [ ] Verify the signature is correct:
 Additional Apache tutorial on how to verify downloads can be found http://www.apache.org/info/verification.html[here].
-+
 [subs="attributes"]
 ----
 gpg --verify apache-plc4x-{current-full-version}-source-release.zip.asc apache-plc4x-#{current-full-version}-source-release.zip
 ----
-+
-3. Check if the check is successful.
-4. Check if the signature references an Apache email address.
-5. Verify the SHA512 hashes:
-+
+[%interactive]
+* [ ] Check if the check is successful.
+* [ ] Check if the signature references an Apache email address.
+* [ ] Verify the SHA512 hashes:
 [subs="attributes"]
 ----
 shasum -a512 apache-plc4x-{current-full-version}-source-release.zip
 ----
-+
-6. Unzip the archive:
-+
+[%interactive]
+* [ ] Unzip the archive:
 [subs="attributes"]
 ----
 unzip apache-plc4x-{current-full-version}-source-release.zip
 ----
-+
-7. Verify the existence of `LICENSE`, `NOTICE, `README`, `RELEASE_NOTES` files in the extracted source bundle.
-8. Verify the content of `LICENSE`, `NOTICE`, `README`, `RELEASE_NOTES files in the extracted source bundle.
-** (Especially pay attention to the year in the `NOTICE` file if this is the first release of the year)
-9. [RM] Verify the staged source README, RELEASE_NOTE files correspond to those in the extracted source bundle.
-10. [RM] Run RAT externally to ensure there are no surprises.
+[%interactive]
+* [ ] Verify the existence of `LICENSE`, `NOTICE`, `README`, `RELEASE_NOTES` files in the extracted source bundle.
+* [ ] Verify the content of `LICENSE`, `NOTICE`, `README`, `RELEASE_NOTES` files in the extracted source bundle.
+
+TIP: (Especially pay attention to the year in the `NOTICE` file if this is the first release of the year)
+
+[%interactive]
+* [ ] [RM] Verify the staged source README, RELEASE_NOTE files correspond to those in the extracted source bundle.
+* [ ] [RM] Run RAT externally to ensure there are no surprises.
 ** TODO: Document this.
-11. Search for `SNAPSHOT` references:
-+
+* [ ] Search for `SNAPSHOT` references:
 [subs="attributes"]
 ----
 find . -type f -name 'pom.xml' -exec grep -l "SNAPSHOT" {} \;
 ----
-+
-12. Build the project according to the information in the README.md file.
-** [RM] Build the project with all `with-xyz` profiles and tests enabled and an empty maven local repo: by appendng `-Dmaven.repo.local=../.m2`.
+[%interactive]
+* [ ] Build the project according to the information in the README.md file.
+* [ ] [RM] Build the project with all `with-xyz` profiles and tests enabled and an empty maven local repo: by appendng `-Dmaven.repo.local=../.m2`.
 
 === Release Tooling