You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@plc4x.apache.org by jf...@apache.org on 2018/11/23 09:27:13 UTC

[incubator-plc4x] branch alias-registry-for-opm created (now 8492c21)

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

jfeinauer pushed a change to branch alias-registry-for-opm
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git.


      at 8492c21  - Split up the modbus driver into driver and protocol

This branch includes the following new commits:

     new 1f8f1cb  [OPM] Added AliasRegistry and SimpleAliasRegistry as default impl.
     new c5fbff8  [OPM] Refactoring + Added timeout / cache to PlcField.java Annotation / added the functionality of the annotation.
     new bf89d57  - First attempt to separate the protocol and driver parts - Split up the different levels of the S7 driver into 3 separate protocol layers
     new 172c581  - Split up the modbus driver into driver and protocol
     new 8492c21  - Split up the modbus driver into driver and protocol

The 5 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.



[incubator-plc4x] 03/05: - First attempt to separate the protocol and driver parts - Split up the different levels of the S7 driver into 3 separate protocol layers

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

jfeinauer pushed a commit to branch alias-registry-for-opm
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit bf89d5763cdfaec4391b10e7520f708f75f88b6e
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Wed Nov 21 18:25:49 2018 +0100

    - First attempt to separate the protocol and driver parts
    - Split up the different levels of the S7 driver into 3 separate protocol layers
---
 examples/hello-cloud-azure/pom.xml                 |   9 +-
 examples/hello-cloud-google/pom.xml                |  37 ++++----
 examples/hello-connectivity-kafka/pom.xml          |   8 +-
 examples/hello-connectivity-mqtt/pom.xml           |  13 +--
 examples/hello-integration-edgent/pom.xml          |   4 +-
 examples/hello-opm/pom.xml                         |   8 +-
 examples/hello-storage-elasticsearch/pom.xml       |   4 +-
 examples/hello-world-plc4x/pom.xml                 |  13 +--
 integrations/apache-camel/pom.xml                  |  10 +--
 integrations/apache-edgent/pom.xml                 |   6 --
 integrations/apache-kafka/pom.xml                  |   5 --
 integrations/apache-nifi/nifi-plc4x-nar/pom.xml    |  15 ++--
 .../apache-nifi/nifi-plc4x-processors/pom.xml      |   5 --
 .../org/apache/plc4x/java/PlcDriverManager.java    |   0
 .../api/exceptions/PlcInvalidFieldException.java   |   1 +
 .../apache/plc4x/java/PlcDriverManagerTest.java    |   7 +-
 .../exceptions/PlcFieldRangeExceptionTest.java}    |  28 +++---
 .../exceptions/PlcInvalidFieldExceptionTest.java   |   8 ++
 .../plc4x/java/mock/DuplicateMockDriver.java}      |   9 +-
 .../org/apache/plc4x/java/mock/MockDriver.java     |  55 ++++++++++++
 .../apache/plc4x/java/mock/MockPlcConnection.java} |  11 +--
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   0
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   2 +-
 .../apache/plc4x/java/mock/DoubleMockDriver.java   |  48 -----------
 .../org/apache/plc4x/java/mock/MockConnection.java |  52 -----------
 .../org/apache/plc4x/java/mock/MockDriver.java     |  48 -----------
 .../apache/plc4x/java/mock/PlcMockDriverTest.java  |  74 ----------------
 plc4j/drivers/ads/pom.xml                          |  37 ++++++++
 plc4j/drivers/delta-v/pom.xml                      |  37 ++++++++
 plc4j/{utils/opm => drivers/ethernet-ip}/pom.xml   |  96 +++++++++++----------
 .../plc4x/java/ethernetip/EtherNetIpPlcDriver.java |   4 +-
 .../connection/BaseEtherNetIpPlcConnection.java    |   2 +-
 .../connection/EtherNetIpTcpPlcConnection.java     |   0
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   0
 .../org/apache/plc4x/java/ethernetip/EnipTest.java |  24 +++---
 .../java/ethernetip/ManualPlc4XEtherNetIpTest.java |   0
 .../src/test/resources/read-attribute.pcapng       | Bin
 plc4j/drivers/modbus/pom.xml                       |  37 ++++++++
 plc4j/drivers/pom.xml                              |  44 ++++++++++
 plc4j/{protocols => drivers}/s7/pom.xml            |  93 ++++++++------------
 .../java/org/apache/plc4x/java/s7/S7PlcDriver.java |   4 +-
 .../plc4x/java/s7/connection/S7PlcConnection.java  |  46 +++++-----
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   0
 .../org/apache/plc4x/java/s7/S7PlcDriverTest.java  |   0
 .../java/s7/connection/S7PlcConnectionIT.java      |   0
 .../java/s7/connection/S7PlcConnectionTests.java   |  34 ++++----
 .../java/s7/connection/S7PlcTestConnection.java    |   0
 .../java/s7/connection}/issues/PLC4X47Test.java    |   2 +-
 .../s7/connection/iso-tp-connect-response.pcap     | Bin
 .../s7/connection/s7-cpu-functions-response.pcap   | Bin
 .../java/s7/connection/s7-read-var-request.pcapng  | Bin
 .../java/s7/connection/s7-read-var-response.pcapng | Bin
 .../s7-setup-communication-response.pcap           | Bin
 .../java/s7/connection/s7-write-var-request.pcapng | Bin
 .../s7/connection/s7-write-var-response.pcapng     | Bin
 .../{protocols/test => drivers/simulated}/pom.xml  |  36 ++++----
 .../plc4x/java/simulated/SimulatedPlcDriver.java}  |  46 +++++-----
 .../connection/SimulatedPlcConnection.java}        |  40 ++++-----
 .../java/simulated/connection}/TestDevice.java     |  44 +++++-----
 .../java/simulated/connection}/TestField.java      |  38 ++++----
 .../simulated/connection}/TestFieldHandler.java    |   2 +-
 .../java/simulated/connection}/TestFieldItem.java  |   2 +-
 .../plc4x/java/simulated/connection}/TestType.java |   2 +-
 .../services/org.apache.plc4x.java.spi.PlcDriver   |  38 ++++++++
 .../java/simulated/connection}/TestDeviceTest.java |   4 +-
 plc4j/pom.xml                                      |   2 +-
 plc4j/protocols/ads/pom.xml                        |   6 --
 .../java/ads/api/commands/types/LengthTest.java    |   2 +-
 .../ads/api/commands/types/ReadLengthTest.java     |   2 +-
 .../ads/api/commands/types/SampleSizeTest.java     |   2 +-
 .../java/ads/api/commands/types/SamplesTest.java   |   2 +-
 .../ads/api/commands/types/WriteLengthTest.java    |   2 +-
 .../java/ads/api/generic/types/AmsPortTest.java    |   2 +-
 .../java/ads/api/generic/types/DataLengthTest.java |   2 +-
 .../java/ads/api/generic/types/TcpLengthTest.java  |   2 +-
 .../connection/AdsAbstractPlcConnectionTest.java   |   2 +-
 .../ads/connection/AdsConnectionFactoryTest.java   |   2 +-
 .../protocols/{ethernetip => ethernet-ip}/pom.xml  |  30 +------
 .../java/ethernetip/model/EtherNetIpField.java     |   0
 .../plc4x/java/ethernetip/netty/EnipCodec.java     |   0
 .../ethernetip/netty/Plc4XEtherNetIpProtocol.java  |   0
 .../netty/events/EtherNetIpConnectedEvent.java     |   0
 .../ethernetip/netty/util/EnipPlcFieldHandler.java |   0
 .../src/site/asciidoc/index.adoc                   |   0
 .../src/site/resources/img/WAGO_enip_exporer.png   | Bin
 plc4j/{utils/opm => protocols/iso-on-tcp}/pom.xml  |  59 ++++---------
 .../java/isoontcp/protocol}/IsoOnTcpProtocol.java  |  38 ++++----
 .../isoontcp/protocol/model/IsoOnTcpMessage.java}  |  12 +--
 .../isoontcp/protocol}/IsoOnTcpProtocolTest.java   |  41 +++++----
 plc4j/{core => protocols/iso-tp}/pom.xml           |  61 ++++++-------
 .../plc4x/java/isotp/protocol}/IsoTPProtocol.java  |  50 +++++------
 .../protocol}/events/IsoTPConnectedEvent.java      |   2 +-
 .../java/isotp/protocol}/model/IsoTPMessage.java   |   4 +-
 .../model/params/CalledTsapParameter.java          |   4 +-
 .../model/params/CallingTsapParameter.java         |   4 +-
 .../protocol}/model/params/ChecksumParameter.java  |   4 +-
 .../DisconnectAdditionalInformationParameter.java  |   4 +-
 .../isotp/protocol}/model/params/Parameter.java    |   4 +-
 .../protocol}/model/params/TpduSizeParameter.java  |   6 +-
 .../protocol}/model/params/TsapParameter.java      |   2 +-
 .../model/tpdus/ConnectionConfirmTpdu.java         |   8 +-
 .../model/tpdus/ConnectionRequestTpdu.java         |   8 +-
 .../protocol}/model/tpdus/ConnectionTpdu.java      |   8 +-
 .../isotp/protocol}/model/tpdus/CustomTpdu.java    |   6 +-
 .../java/isotp/protocol}/model/tpdus/DataTpdu.java |   6 +-
 .../model/tpdus/DisconnectConfirmTpdu.java         |   6 +-
 .../model/tpdus/DisconnectRequestTpdu.java         |   8 +-
 .../protocol}/model/tpdus/DisconnectTpdu.java      |   6 +-
 .../isotp/protocol}/model/tpdus/ErrorTpdu.java     |   8 +-
 .../java/isotp/protocol}/model/tpdus/Tpdu.java     |   6 +-
 .../isotp/protocol}/model/types/DeviceGroup.java   |   2 +-
 .../protocol}/model/types/DisconnectReason.java    |   2 +-
 .../isotp/protocol}/model/types/ParameterCode.java |   2 +-
 .../isotp/protocol}/model/types/ProtocolClass.java |   2 +-
 .../isotp/protocol}/model/types/RejectCause.java   |   2 +-
 .../java/isotp/protocol}/model/types/TpduCode.java |   2 +-
 .../java/isotp/protocol}/model/types/TpduSize.java |   2 +-
 .../java/isotp/protocol}/IsoTPProtocolTest.java    |  65 +++++++-------
 .../isotp/protocol}/model/IsoTPMessageTests.java   |  46 +++++-----
 .../protocol}/model/params/ParameterTests.java     |  44 +++++-----
 .../protocol}/model/params/TsapParameterTests.java |  42 ++++-----
 .../protocol}/model/tpdus/IsotpModelTests.java     |  48 +++++------
 .../protocol}/model/types/IsotpTypeTests.java      |  38 ++++----
 plc4j/protocols/modbus/pom.xml                     |   6 --
 .../connection/BaseModbusPlcConnectionTest.java    |   4 +-
 .../connection/ModbusConnectionFactoryTest.java    |   2 +-
 plc4j/protocols/pom.xml                            |   4 +-
 plc4j/protocols/s7/pom.xml                         |  50 +----------
 .../java/isoontcp/netty/model/IsoOnTcpMessage.java |  30 -------
 .../org/apache/plc4x/java/s7/netty/S7Protocol.java |   8 +-
 .../plc4x/java/s7/utils/S7TsapIdEncoder.java       |   2 +-
 .../org/apache/plc4x/java/netty/NettyTestBase.java |  22 -----
 .../org/apache/plc4x/java/s7/S7PlcScanner.java     |  86 ------------------
 .../org/apache/plc4x/java/s7/S7PlcTestConsole.java |  69 ---------------
 .../apache/plc4x/java/s7/S7PlcWriterSample.java    |  63 --------------
 .../plc4x/java/s7/netty/Plc4XS7ProtocolTest.java   |   3 +-
 .../apache/plc4x/java/s7/netty/S7ProtocolTest.java |   5 +-
 .../plc4x/java/s7/utils/S7TsapIdEncoderTest.java   |   2 +-
 ...spockframework.report.IReportCreator.properties |  66 ++++++++++++++
 plc4j/protocols/test/pom.xml                       |   5 --
 .../services/org.apache.plc4x.java.spi.PlcDriver   |   1 -
 plc4j/utils/connection-pool/pom.xml                |   5 --
 plc4j/utils/opm/pom.xml                            |   5 --
 143 files changed, 994 insertions(+), 1356 deletions(-)

diff --git a/examples/hello-cloud-azure/pom.xml b/examples/hello-cloud-azure/pom.xml
index 966d6ff..5439607 100644
--- a/examples/hello-cloud-azure/pom.xml
+++ b/examples/hello-cloud-azure/pom.xml
@@ -39,11 +39,6 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <dependency>
       <groupId>com.microsoft.azure.sdk.iot</groupId>
@@ -59,7 +54,7 @@
 
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -88,7 +83,7 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
           </usedDependencies>
         </configuration>
       </plugin>
diff --git a/examples/hello-cloud-google/pom.xml b/examples/hello-cloud-google/pom.xml
index 7ccb311..7b874d5 100644
--- a/examples/hello-cloud-google/pom.xml
+++ b/examples/hello-cloud-google/pom.xml
@@ -33,32 +33,12 @@
     a PLC and making that available in an the Google Cloud IoT Core.
   </description>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <configuration>
-          <usedDependencies combine.children="append">
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
-            <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
-          </usedDependencies>
-        </configuration>
-      </plugin>
-    </plugins>
-  </build>
-
   <dependencies>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <dependency>
       <groupId>org.eclipse.paho</groupId>
@@ -92,12 +72,27 @@
 
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
   </dependencies>
 
+  <build>
+    <plugins>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-dependency-plugin</artifactId>
+        <configuration>
+          <usedDependencies combine.children="append">
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
+            <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
+          </usedDependencies>
+        </configuration>
+      </plugin>
+    </plugins>
+  </build>
+
   <dependencyManagement>
     <dependencies>
       <dependency>
diff --git a/examples/hello-connectivity-kafka/pom.xml b/examples/hello-connectivity-kafka/pom.xml
index 1dc1852..4703b82 100644
--- a/examples/hello-connectivity-kafka/pom.xml
+++ b/examples/hello-connectivity-kafka/pom.xml
@@ -101,13 +101,13 @@
     <!-- Required driver implementation -->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
+      <artifactId>plc4j-driver-simulated</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -151,8 +151,8 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-test</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
           </usedDependencies>
         </configuration>
       </plugin>
diff --git a/examples/hello-connectivity-mqtt/pom.xml b/examples/hello-connectivity-mqtt/pom.xml
index 57549fd..582f92e 100644
--- a/examples/hello-connectivity-mqtt/pom.xml
+++ b/examples/hello-connectivity-mqtt/pom.xml
@@ -41,11 +41,6 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <!-- TODO: Replace this with a release version or comment this module out before releasing. -->
     <dependency>
@@ -92,13 +87,13 @@
     <!-- Required driver implementation -->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
+      <artifactId>plc4j-driver-simulated</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -111,8 +106,8 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-test</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-simulated</usedDependency>
           </usedDependencies>
         </configuration>
       </plugin>
diff --git a/examples/hello-integration-edgent/pom.xml b/examples/hello-integration-edgent/pom.xml
index e627ef2..672e180 100644
--- a/examples/hello-integration-edgent/pom.xml
+++ b/examples/hello-integration-edgent/pom.xml
@@ -67,7 +67,7 @@
     <!-- Required driver implementation -->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -84,7 +84,7 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
           </usedDependencies>
         </configuration>
       </plugin>
diff --git a/examples/hello-opm/pom.xml b/examples/hello-opm/pom.xml
index 6433738..07d832d 100644
--- a/examples/hello-opm/pom.xml
+++ b/examples/hello-opm/pom.xml
@@ -50,13 +50,13 @@
     <!-- Required driver implementation -->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
+      <artifactId>plc4j-driver-simulated</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -83,8 +83,8 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-test</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/examples/hello-storage-elasticsearch/pom.xml b/examples/hello-storage-elasticsearch/pom.xml
index 5bed942..6d8856d 100644
--- a/examples/hello-storage-elasticsearch/pom.xml
+++ b/examples/hello-storage-elasticsearch/pom.xml
@@ -78,7 +78,7 @@
     <!-- Required driver implementation -->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -105,7 +105,7 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
+            <usedDependency>org.apache.plc4x:plc4j-driver-s7</usedDependency>
             <usedDependency>org.slf4j:log4j-over-slf4j</usedDependency>
           </usedDependencies>
         </configuration>
diff --git a/examples/hello-world-plc4x/pom.xml b/examples/hello-world-plc4x/pom.xml
index 0fdff06..c15ff1a 100644
--- a/examples/hello-world-plc4x/pom.xml
+++ b/examples/hello-world-plc4x/pom.xml
@@ -41,22 +41,17 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <!-- Required driver implementation -->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
+      <artifactId>plc4j-driver-simulated</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>runtime</scope>
     </dependency>
@@ -88,8 +83,8 @@
         <artifactId>maven-dependency-plugin</artifactId>
         <configuration>
           <usedDependencies combine.children="append">
-            <usedDependency>org.apache.plc4x:plc4j-protocol-s7</usedDependency>
-            <usedDependency>org.apache.plc4x:plc4j-protocol-test</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/integrations/apache-camel/pom.xml b/integrations/apache-camel/pom.xml
index e76173c..63dd8be 100644
--- a/integrations/apache-camel/pom.xml
+++ b/integrations/apache-camel/pom.xml
@@ -41,12 +41,6 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <!-- need plc4j-core if we need to use PlcDriverManager -->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <dependency>
       <groupId>org.apache.camel</groupId>
@@ -94,7 +88,7 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-ads</artifactId>
+      <artifactId>plc4j-driver-ads</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
@@ -165,7 +159,7 @@
             <configuration>
               <failOnWarning>true</failOnWarning>
               <ignoredDependencies combine.children="append">
-                <ignoredDependency>org.apache.plc4x:plc4j-protocol-ads</ignoredDependency>
+                <ignoredDependency>org.apache.plc4x:plc4j-driver-ads</ignoredDependency>
               </ignoredDependencies>
             </configuration>
           </execution>
diff --git a/integrations/apache-edgent/pom.xml b/integrations/apache-edgent/pom.xml
index daf7c88..bc27cd6 100644
--- a/integrations/apache-edgent/pom.xml
+++ b/integrations/apache-edgent/pom.xml
@@ -41,12 +41,6 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <!-- need plc4j-core if we need to use PlcDriverManager -->
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <dependency>
       <groupId>org.apache.edgent</groupId>
diff --git a/integrations/apache-kafka/pom.xml b/integrations/apache-kafka/pom.xml
index 295f3be..a878d42 100644
--- a/integrations/apache-kafka/pom.xml
+++ b/integrations/apache-kafka/pom.xml
@@ -41,11 +41,6 @@
       <version>${project.version}</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>${project.version}</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.kafka</groupId>
       <artifactId>kafka-clients</artifactId>
       <version>${kafka.version}</version>
diff --git a/integrations/apache-nifi/nifi-plc4x-nar/pom.xml b/integrations/apache-nifi/nifi-plc4x-nar/pom.xml
index 7f93cbb..b00eb0d 100644
--- a/integrations/apache-nifi/nifi-plc4x-nar/pom.xml
+++ b/integrations/apache-nifi/nifi-plc4x-nar/pom.xml
@@ -42,35 +42,30 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
     <!-- Bundle Drivers -->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-ads</artifactId>
+      <artifactId>plc4j-driver-ads</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-ethernetip</artifactId>
+      <artifactId>plc4j-driver-ethernet-ip</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-modbus</artifactId>
+      <artifactId>plc4j-driver-modbus</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-s7</artifactId>
+      <artifactId>plc4j-driver-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
+      <artifactId>plc4j-driver-simulated</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
   </dependencies>
diff --git a/integrations/apache-nifi/nifi-plc4x-processors/pom.xml b/integrations/apache-nifi/nifi-plc4x-processors/pom.xml
index e4b17e5..48a877f 100644
--- a/integrations/apache-nifi/nifi-plc4x-processors/pom.xml
+++ b/integrations/apache-nifi/nifi-plc4x-processors/pom.xml
@@ -31,11 +31,6 @@
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
       <groupId>org.apache.nifi</groupId>
       <artifactId>nifi-api</artifactId>
     </dependency>
diff --git a/plc4j/core/src/main/java/org/apache/plc4x/java/PlcDriverManager.java b/plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
similarity index 100%
rename from plc4j/core/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
rename to plc4j/api/src/main/java/org/apache/plc4x/java/PlcDriverManager.java
diff --git a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
index f4238d3..5eba89a 100644
--- a/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
+++ b/plc4j/api/src/main/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldException.java
@@ -46,4 +46,5 @@ public class PlcInvalidFieldException extends PlcRuntimeException {
     public String getFieldToBeParsed() {
         return fieldToBeParsed;
     }
+
 }
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java b/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
similarity index 93%
rename from plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
rename to plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
index f5f16d1..38cb8cf 100644
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
@@ -21,7 +21,7 @@ package org.apache.plc4x.java;
 import org.apache.plc4x.java.api.authentication.PlcUsernamePasswordAuthentication;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.exceptions.PlcException;
-import org.apache.plc4x.java.mock.MockConnection;
+import org.apache.plc4x.java.mock.MockPlcConnection;
 import org.apache.plc4x.test.FastTests;
 import org.junit.Test;
 import org.junit.experimental.categories.Category;
@@ -47,7 +47,8 @@ public class PlcDriverManagerTest {
     @Test
     @Category(FastTests.class)
     public void getExistingDriverTest() throws PlcException {
-        MockConnection mockConnection = (MockConnection) new PlcDriverManager().getConnection("spi-mock://some-cool-url");
+        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("spi-mock://some-cool-url");
+
         assertThat(mockConnection.getAuthentication(), nullValue());
         assertThat(mockConnection.isConnected(), is(true));
     }
@@ -62,7 +63,7 @@ public class PlcDriverManagerTest {
     public void getExistingDriverWithAuthenticationTest() throws PlcException {
         PlcUsernamePasswordAuthentication authentication =
             new PlcUsernamePasswordAuthentication("user", "pass");
-        MockConnection mockConnection = (MockConnection) new PlcDriverManager().getConnection("spi-mock://some-cool-url", authentication);
+        MockPlcConnection mockConnection = (MockPlcConnection) new PlcDriverManager().getConnection("spi-mock://some-cool-url", authentication);
 
         assertThat(mockConnection.getAuthentication(), notNullValue());
         assertThat(mockConnection.getAuthentication(), instanceOf(PlcUsernamePasswordAuthentication.class));
diff --git a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/Junit5Backport.java b/plc4j/api/src/test/java/org/apache/plc4x/java/api/exceptions/PlcFieldRangeExceptionTest.java
similarity index 50%
rename from plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/Junit5Backport.java
rename to plc4j/api/src/test/java/org/apache/plc4x/java/api/exceptions/PlcFieldRangeExceptionTest.java
index 84e6f26..afffb5b 100644
--- a/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/util/Junit5Backport.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/api/exceptions/PlcFieldRangeExceptionTest.java
@@ -7,7 +7,7 @@
  "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
+     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
@@ -16,26 +16,20 @@
  specific language governing permissions and limitations
  under the License.
  */
-package org.apache.plc4x.java.base.util;
 
-import static org.junit.Assert.fail;
+package org.apache.plc4x.java.api.exceptions;
 
-public class Junit5Backport {
+import org.junit.jupiter.api.Test;
 
-    public static void assertThrows(Class<? extends Exception> exception, Acceptor<? extends Exception> acceptor) {
-        try {
-            acceptor.accept();
-            fail("Expected exception " + exception + " not thrown.");
-        } catch (Exception e) {
-            if (!exception.isAssignableFrom(e.getClass())) {
-                throw new AssertionError("Unexpected exception type " + e.getClass() + ". Expected " + exception, e);
-            }
-        }
-    }
+import static org.junit.jupiter.api.Assertions.assertThrows;
+
+public class PlcFieldRangeExceptionTest {
 
-    @FunctionalInterface
-    public interface Acceptor<T extends Exception> {
-        void accept() throws T;
+    @Test
+    public void simpleStringConstructor() {
+        assertThrows(PlcFieldRangeException.class,() -> {
+            throw new PlcFieldRangeException(1, 2);
+        });
     }
 
 }
diff --git a/plc4j/api/src/test/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldExceptionTest.java b/plc4j/api/src/test/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldExceptionTest.java
index bfbf4ae..f869626 100644
--- a/plc4j/api/src/test/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldExceptionTest.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/api/exceptions/PlcInvalidFieldExceptionTest.java
@@ -23,6 +23,8 @@ import org.junit.jupiter.api.Test;
 
 import java.util.regex.Pattern;
 
+import static org.hamcrest.core.IsEqual.equalTo;
+import static org.junit.Assert.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 class PlcInvalidFieldExceptionTest {
@@ -48,4 +50,10 @@ class PlcInvalidFieldExceptionTest {
         });
     }
 
+    @Test
+    public void getFieldToBeParsed() {
+        PlcInvalidFieldException ex = new PlcInvalidFieldException("Pattern");
+        assertThat(ex.getFieldToBeParsed(), equalTo("Pattern"));
+    }
+
 }
\ No newline at end of file
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/DuplicateMockDriver.java
similarity index 89%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
copy to plc4j/api/src/test/java/org/apache/plc4x/java/mock/DuplicateMockDriver.java
index 6654bb0..c998aa2 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/DuplicateMockDriver.java
@@ -17,12 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.java.test;
-
-public enum TestType {
-
-    RANDOM,
-    STATE,
-    STDOUT
+package org.apache.plc4x.java.mock;
 
+public class DuplicateMockDriver extends MockDriver {
 }
diff --git a/plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockDriver.java b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockDriver.java
new file mode 100644
index 0000000..d119b42
--- /dev/null
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockDriver.java
@@ -0,0 +1,55 @@
+/*
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     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.mock;
+
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.authentication.PlcAuthentication;
+import org.apache.plc4x.java.spi.PlcDriver;
+
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
+
+public class MockDriver implements PlcDriver {
+
+    @Override
+    public String getProtocolCode() {
+        return "spi-mock";
+    }
+
+    @Override
+    public String getProtocolName() {
+        return "Mock Protocol Implementation";
+    }
+
+    @Override
+    public PlcConnection connect(String url) {
+        MockPlcConnection connection = mock(MockPlcConnection.class);
+        when(connection.isConnected()).thenReturn(true);
+        return connection;
+    }
+
+    @Override
+    public PlcConnection connect(String url, PlcAuthentication authentication) {
+        MockPlcConnection connection = mock(MockPlcConnection.class);
+        when(connection.isConnected()).thenReturn(true);
+        when(connection.getAuthentication()).thenReturn(authentication);
+        return connection;
+    }
+
+}
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockPlcConnection.java
similarity index 75%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
copy to plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockPlcConnection.java
index 6654bb0..5258df6 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockPlcConnection.java
@@ -17,12 +17,13 @@
  under the License.
  */
 
-package org.apache.plc4x.java.test;
+package org.apache.plc4x.java.mock;
 
-public enum TestType {
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 
-    RANDOM,
-    STATE,
-    STDOUT
+public interface MockPlcConnection extends PlcConnection {
+
+    PlcAuthentication getAuthentication();
 
 }
diff --git a/plc4j/core/src/test/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/api/src/test/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
similarity index 100%
rename from plc4j/core/src/test/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
rename to plc4j/api/src/test/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
diff --git a/plc4j/core/src/test/resources/test/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/api/src/test/resources/test/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
similarity index 94%
rename from plc4j/core/src/test/resources/test/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
rename to plc4j/api/src/test/resources/test/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
index e6eec9f..4211709 100644
--- a/plc4j/core/src/test/resources/test/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
+++ b/plc4j/api/src/test/resources/test/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
@@ -16,4 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.plc4x.java.mock.DoubleMockDriver
+org.apache.plc4x.java.mock.DuplicateMockDriver
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/DoubleMockDriver.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/DoubleMockDriver.java
deleted file mode 100644
index 0a180de..0000000
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/DoubleMockDriver.java
+++ /dev/null
@@ -1,48 +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.mock;
-
-import org.apache.plc4x.java.spi.PlcDriver;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-
-public class DoubleMockDriver implements PlcDriver {
-
-    @Override
-    public String getProtocolCode() {
-        return "spi-mock";
-    }
-
-    @Override
-    public String getProtocolName() {
-        return "Mock Protocol Implementation";
-    }
-
-    @Override
-    public PlcConnection connect(String url) {
-        return new PlcMockConnection(null);
-    }
-
-    @Override
-    public PlcConnection connect(String url, PlcAuthentication authentication) {
-        return new PlcMockConnection(authentication);
-    }
-
-}
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.java
deleted file mode 100644
index 4662485..0000000
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockConnection.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.mock;
-
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelInitializer;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.base.connection.NettyPlcConnection;
-import org.apache.plc4x.java.base.connection.TestChannelFactory;
-
-import java.util.concurrent.CompletableFuture;
-
-public class MockConnection extends NettyPlcConnection {
-
-    private final PlcAuthentication authentication;
-
-    MockConnection(PlcAuthentication authentication) {
-        super(new TestChannelFactory());
-        this.authentication = authentication;
-    }
-
-    @Override
-    protected ChannelHandler getChannelHandler(CompletableFuture<Void> sessionSetupCompleteFuture) {
-        return new ChannelInitializer() {
-            @Override
-            protected void initChannel(Channel channel) {
-            }
-        };
-    }
-
-    public PlcAuthentication getAuthentication() {
-        return authentication;
-    }
-
-}
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDriver.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDriver.java
deleted file mode 100644
index 5e8b440..0000000
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/MockDriver.java
+++ /dev/null
@@ -1,48 +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.mock;
-
-import org.apache.plc4x.java.spi.PlcDriver;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-
-public class MockDriver implements PlcDriver {
-
-    @Override
-    public String getProtocolCode() {
-        return "spi-mock";
-    }
-
-    @Override
-    public String getProtocolName() {
-        return "Mock Protocol Implementation";
-    }
-
-    @Override
-    public PlcConnection connect(String url) {
-        return new MockConnection(null);
-    }
-
-    @Override
-    public PlcConnection connect(String url, PlcAuthentication authentication) {
-        return new MockConnection(authentication);
-    }
-
-}
diff --git a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java b/plc4j/core/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.java
deleted file mode 100644
index 532e20f..0000000
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/mock/PlcMockDriverTest.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.mock;
-
-import org.apache.commons.lang3.tuple.Pair;
-import org.apache.plc4x.java.PlcDriverManager;
-import org.apache.plc4x.java.api.PlcConnection;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.types.PlcResponseCode;
-import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
-import org.junit.Test;
-import org.mockito.Mockito;
-
-import static junit.framework.TestCase.assertFalse;
-import static junit.framework.TestCase.assertTrue;
-import static org.mockito.ArgumentMatchers.any;
-import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.times;
-import static org.mockito.Mockito.verify;
-import static org.mockito.Mockito.when;
-
-public class PlcMockDriverTest {
-
-    private final PlcDriverManager driverManager = new PlcDriverManager();
-
-    @Test
-    public void useMockDriver_noDevice_isNotConnected() throws Exception {
-        PlcConnection connection = driverManager.getConnection("mock:dummy");
-
-        assertFalse(connection.isConnected());
-    }
-
-    @Test
-    public void useMockDriver_deviceSet_isConnected() throws Exception {
-        PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:dummy");
-        MockDevice mock = Mockito.mock(MockDevice.class);
-        connection.setDevice(mock);
-
-        assertTrue(connection.isConnected());
-    }
-
-    @Test
-    public void mockDriver_assertSimpleRequest() throws PlcConnectionException {
-        PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:dummy");
-        MockDevice mock = Mockito.mock(MockDevice.class);
-        when(mock.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultLongFieldItem(1L)));
-        connection.setDevice(mock);
-
-        connection.readRequestBuilder()
-            .addItem("item1", "myPlcField")
-            .build()
-            .execute();
-
-        // Verify the call
-        verify(mock, times(1)).read(eq("myPlcField"));
-    }
-}
\ No newline at end of file
diff --git a/plc4j/drivers/ads/pom.xml b/plc4j/drivers/ads/pom.xml
new file mode 100644
index 0000000..a6f7076
--- /dev/null
+++ b/plc4j/drivers/ads/pom.xml
@@ -0,0 +1,37 @@
+<?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-drivers</artifactId>
+    <version>0.3.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>plc4j-driver-ads</artifactId>
+  <name>PLC4J: Driver: ADS</name>
+  <description>Implementation of a PLC4X driver able to speak with Beckhoff devices using the ADS protocol.</description>
+
+  <dependencies>
+  </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/plc4j/drivers/delta-v/pom.xml b/plc4j/drivers/delta-v/pom.xml
new file mode 100644
index 0000000..b7692b6
--- /dev/null
+++ b/plc4j/drivers/delta-v/pom.xml
@@ -0,0 +1,37 @@
+<?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-drivers</artifactId>
+    <version>0.3.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>plc4j-driver-delta-v</artifactId>
+  <name>PLC4J: Driver: DeltaV</name>
+  <description>Implementation of a PLC4X driver able to speak with devices using the DeltaV protocol.</description>
+
+  <dependencies>
+  </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/plc4j/utils/opm/pom.xml b/plc4j/drivers/ethernet-ip/pom.xml
similarity index 56%
copy from plc4j/utils/opm/pom.xml
copy to plc4j/drivers/ethernet-ip/pom.xml
index 2912674..47bd68d 100644
--- a/plc4j/utils/opm/pom.xml
+++ b/plc4j/drivers/ethernet-ip/pom.xml
@@ -8,7 +8,7 @@
   "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
+      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
@@ -22,83 +22,91 @@
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
-    <artifactId>plc4j-utils</artifactId>
     <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4j-drivers</artifactId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-opm</artifactId>
-  <packaging>jar</packaging>
+  <artifactId>plc4j-driver-ethernet-ip</artifactId>
+  <name>PLC4J: Driver: Ethernet/IP</name>
+  <description>Implementation of a PLC4X driver able to speak with devices using the Ethernet/IP protocol.</description>
 
-  <name>PLC4J: Utils: Object PLC Mapping</name>
-  <description>Layer on top of Plc4X that enables mapping between Objects and PLCs.</description>
+  <properties>
+    <ethernetip-driver.version>1.2.0</ethernetip-driver.version>
+  </properties>
 
   <dependencies>
-    <!--Internal Dependencies-->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
+
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
+      <artifactId>plc4j-protocol-ethernet-ip</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-
-    <!-- Utils -->
     <dependency>
-      <groupId>net.bytebuddy</groupId>
-      <artifactId>byte-buddy</artifactId>
-      <version>1.8.15</version>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
     </dependency>
+
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-configuration2</artifactId>
+      <groupId>com.digitalpetri.enip</groupId>
+      <artifactId>cip-core</artifactId>
+      <version>${ethernetip-driver.version}</version>
     </dependency>
 
-    <!--Testing-->
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
-      <scope>test</scope>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-common</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
-      <scope>test</scope>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-buffer</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.digitalpetri.enip</groupId>
+      <artifactId>enip-client</artifactId>
+      <version>${ethernetip-driver.version}</version>
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
+      <groupId>com.digitalpetri.enip</groupId>
+      <artifactId>cip-client</artifactId>
+      <version>${ethernetip-driver.version}</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <!--Currently commented out as the dependency is used "explicitly".-->
-        <!--<configuration>-->
-          <!--<usedDependencies combine.children="append">-->
-            <!--<usedDependency>org.apache.plc4x:plc4j-protocol-test</usedDependency>-->
-          <!--</usedDependencies>-->
-        <!--</configuration>-->
-      </plugin>
-    </plugins>
-  </build>
+  <repositories>
+    <repository>
+      <id>ossrh</id>
+      <url>https://oss.sonatype.org/content/repositories/snapshots</url>
+      <snapshots>
+        <enabled>true</enabled>
+      </snapshots>
+      <releases>
+        <enabled>false</enabled>
+      </releases>
+    </repository>
+  </repositories>
 
 </project>
\ No newline at end of file
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/EtherNetIpPlcDriver.java b/plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/EtherNetIpPlcDriver.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/EtherNetIpPlcDriver.java
rename to plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/EtherNetIpPlcDriver.java
index 47a487b..41dfc6b 100644
--- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/EtherNetIpPlcDriver.java
+++ b/plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/EtherNetIpPlcDriver.java
@@ -18,11 +18,11 @@ under the License.
 */
 package org.apache.plc4x.java.ethernetip;
 
-import org.apache.plc4x.java.spi.PlcDriver;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 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.ethernetip.connection.EtherNetIpTcpPlcConnection;
+import org.apache.plc4x.java.spi.PlcDriver;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java b/plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
rename to plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
index 8e88331..332fd9b 100644
--- a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
+++ b/plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/connection/BaseEtherNetIpPlcConnection.java
@@ -23,8 +23,8 @@ 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.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.ethernetip.netty.util.EnipPlcFieldHandler;
 import org.slf4j.Logger;
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java b/plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java
rename to plc4j/drivers/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/connection/EtherNetIpTcpPlcConnection.java
diff --git a/plc4j/protocols/ethernetip/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/drivers/ethernet-ip/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
rename to plc4j/drivers/ethernet-ip/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
diff --git a/plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/EnipTest.java b/plc4j/drivers/ethernet-ip/src/test/java/org/apache/plc4x/java/ethernetip/EnipTest.java
similarity index 97%
rename from plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/EnipTest.java
rename to plc4j/drivers/ethernet-ip/src/test/java/org/apache/plc4x/java/ethernetip/EnipTest.java
index 41edb06..a12f809 100644
--- a/plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/EnipTest.java
+++ b/plc4j/drivers/ethernet-ip/src/test/java/org/apache/plc4x/java/ethernetip/EnipTest.java
@@ -1,16 +1,3 @@
-package org.apache.plc4x.java.ethernetip;
-
-import com.digitalpetri.enip.EtherNetIpClientConfig;
-import com.digitalpetri.enip.cip.CipClient;
-import com.digitalpetri.enip.cip.epath.EPath;
-import com.digitalpetri.enip.cip.epath.LogicalSegment;
-import com.digitalpetri.enip.cip.epath.PortSegment;
-import com.digitalpetri.enip.cip.services.GetAttributeSingleService;
-import io.netty.buffer.ByteBuf;
-import io.netty.buffer.Unpooled;
-
-import java.time.Duration;
-
 /*
 Licensed to the Apache Software Foundation (ASF) under one
 or more contributor license agreements.  See the NOTICE file
@@ -29,6 +16,17 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
+package org.apache.plc4x.java.ethernetip;
+
+import com.digitalpetri.enip.EtherNetIpClientConfig;
+import com.digitalpetri.enip.cip.CipClient;
+import com.digitalpetri.enip.cip.epath.EPath;
+import com.digitalpetri.enip.cip.epath.LogicalSegment;
+import com.digitalpetri.enip.cip.epath.PortSegment;
+import com.digitalpetri.enip.cip.services.GetAttributeSingleService;
+
+import java.time.Duration;
+
 public class EnipTest {
 
     public static void main(String[] args) throws Exception {
diff --git a/plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java b/plc4j/drivers/ethernet-ip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java
rename to plc4j/drivers/ethernet-ip/src/test/java/org/apache/plc4x/java/ethernetip/ManualPlc4XEtherNetIpTest.java
diff --git a/plc4j/protocols/ethernetip/src/test/resources/read-attribute.pcapng b/plc4j/drivers/ethernet-ip/src/test/resources/read-attribute.pcapng
similarity index 100%
rename from plc4j/protocols/ethernetip/src/test/resources/read-attribute.pcapng
rename to plc4j/drivers/ethernet-ip/src/test/resources/read-attribute.pcapng
diff --git a/plc4j/drivers/modbus/pom.xml b/plc4j/drivers/modbus/pom.xml
new file mode 100644
index 0000000..fad65f8
--- /dev/null
+++ b/plc4j/drivers/modbus/pom.xml
@@ -0,0 +1,37 @@
+<?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-drivers</artifactId>
+    <version>0.3.0-SNAPSHOT</version>
+  </parent>
+
+  <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>
+
+  <dependencies>
+  </dependencies>
+
+</project>
\ No newline at end of file
diff --git a/plc4j/drivers/pom.xml b/plc4j/drivers/pom.xml
new file mode 100644
index 0000000..bce44a0
--- /dev/null
+++ b/plc4j/drivers/pom.xml
@@ -0,0 +1,44 @@
+<?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</artifactId>
+    <version>0.3.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>plc4j-drivers</artifactId>
+  <packaging>pom</packaging>
+
+  <name>PLC4J: Drivers</name>
+  <description>Wrapper project for all PLC4J driver implementations.</description>
+
+  <modules>
+    <module>ads</module>
+    <module>ethernet-ip</module>
+    <module>modbus</module>
+    <module>s7</module>
+    <module>simulated</module>
+  </modules>
+
+</project>
diff --git a/plc4j/protocols/s7/pom.xml b/plc4j/drivers/s7/pom.xml
similarity index 65%
copy from plc4j/protocols/s7/pom.xml
copy to plc4j/drivers/s7/pom.xml
index dd1b82c..c26c989 100644
--- a/plc4j/protocols/s7/pom.xml
+++ b/plc4j/drivers/s7/pom.xml
@@ -1,34 +1,34 @@
 <?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
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.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.
-
--->
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT 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>
+    <artifactId>plc4j-drivers</artifactId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-protocol-s7</artifactId>
-  <name>PLC4J: Protocol: S7</name>
+  <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>
 
   <dependencies>
@@ -37,28 +37,34 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
+
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <artifactId>plc4j-protocol-iso-on-tcp</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <artifactId>plc4j-protocol-iso-tp</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
+      <artifactId>plc4j-protocol-s7</artifactId>
       <version>0.3.0-SNAPSHOT</version>
-      <scope>runtime</scope>
     </dependency>
-
     <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-buffer</artifactId>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
     </dependency>
     <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
       <groupId>io.netty</groupId>
       <artifactId>netty-common</artifactId>
     </dependency>
@@ -68,32 +74,26 @@
     </dependency>
     <dependency>
       <groupId>io.netty</groupId>
-      <artifactId>netty-codec</artifactId>
+      <artifactId>netty-buffer</artifactId>
     </dependency>
 
     <dependency>
       <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
       <artifactId>commons-configuration2</artifactId>
     </dependency>
-
     <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-core</artifactId>
-      <scope>test</scope>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
     </dependency>
-
     <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
-      <scope>test</scope>
     </dependency>
+
     <dependency>
-      <groupId>org.mockito</groupId>
-      <artifactId>mockito-core</artifactId>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-test</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
     <dependency>
@@ -106,31 +106,12 @@
       <artifactId>pcap4j-packetfactory-static</artifactId>
       <scope>test</scope>
     </dependency>
-
-    <dependency>
-      <groupId>org.spockframework</groupId>
-      <artifactId>spock-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.athaydes</groupId>
-      <artifactId>spock-reports</artifactId>
-      <version>1.6.1</version>
-      <scope>test</scope>
-    </dependency>
-
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-utils-test-utils</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-test</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>test</scope>
-    </dependency>
   </dependencies>
 
   <build>
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/S7PlcDriver.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/S7PlcDriver.java
index 839ed30..2ee2b0f 100644
--- a/plc4j/protocols/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
@@ -18,11 +18,11 @@ under the License.
 */
 package org.apache.plc4x.java.s7;
 
-import org.apache.plc4x.java.spi.PlcDriver;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 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.spi.PlcDriver;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
diff --git a/plc4j/protocols/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
similarity index 90%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
rename to plc4j/drivers/s7/src/main/java/org/apache/plc4x/java/s7/connection/S7PlcConnection.java
index beadfa3..a4f5306 100644
--- a/plc4j/protocols/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
@@ -1,21 +1,21 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
 package org.apache.plc4x.java.s7.connection;
 
 import io.netty.channel.*;
@@ -33,12 +33,12 @@ import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
 import org.apache.plc4x.java.base.events.ConnectEvent;
 import org.apache.plc4x.java.base.events.ConnectedEvent;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.isoontcp.netty.IsoOnTcpProtocol;
-import org.apache.plc4x.java.isotp.netty.IsoTPProtocol;
-import org.apache.plc4x.java.isotp.netty.model.tpdus.DisconnectRequestTpdu;
-import org.apache.plc4x.java.isotp.netty.model.types.DeviceGroup;
-import org.apache.plc4x.java.isotp.netty.model.types.DisconnectReason;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduSize;
+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.apache.plc4x.java.s7.netty.Plc4XS7Protocol;
 import org.apache.plc4x.java.s7.netty.S7Protocol;
 import org.apache.plc4x.java.s7.netty.model.types.MemoryArea;
diff --git a/plc4j/protocols/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/drivers/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
similarity index 100%
rename from plc4j/protocols/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
rename to plc4j/drivers/s7/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcDriverTest.java
rename to plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcDriverTest.java
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionIT.java
rename to plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionIT.java
diff --git a/plc4j/protocols/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
similarity index 66%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
rename to plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcConnectionTests.java
index 78ced2e..d4b4a22 100644
--- a/plc4j/protocols/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
@@ -1,35 +1,35 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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
+     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.
-*/
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ 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.PlcUnsupportedOperationException;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduSize;
+import org.apache.plc4x.java.isotp.protocol.model.types.TpduSize;
 import org.apache.plc4x.java.s7.types.S7ControllerType;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 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 {
 
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcTestConnection.java
rename to plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/S7PlcTestConnection.java
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/issues/PLC4X47Test.java
similarity index 97%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java
rename to plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/issues/PLC4X47Test.java
index 3683f83..9509f4f 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/issues/PLC4X47Test.java
+++ b/plc4j/drivers/s7/src/test/java/org/apache/plc4x/java/s7/connection/issues/PLC4X47Test.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.java.s7.issues;
+package org.apache.plc4x.java.s7.connection.issues;
 
 import org.apache.plc4x.java.PlcDriverManager;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/iso-tp-connect-response.pcap
rename to plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/iso-tp-connect-response.pcap
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-cpu-functions-response.pcap
rename to plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-cpu-functions-response.pcap
diff --git a/plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcapng b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcapng
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcapng
rename to plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-request.pcapng
diff --git a/plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcapng b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcapng
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcapng
rename to plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-read-var-response.pcapng
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-setup-communication-response.pcap
rename to plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-setup-communication-response.pcap
diff --git a/plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcapng b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcapng
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcapng
rename to plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-request.pcapng
diff --git a/plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcapng b/plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcapng
similarity index 100%
rename from plc4j/protocols/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcapng
rename to plc4j/drivers/s7/src/test/resources/org/apache/plc4x/java/s7/connection/s7-write-var-response.pcapng
diff --git a/plc4j/protocols/test/pom.xml b/plc4j/drivers/simulated/pom.xml
similarity index 52%
copy from plc4j/protocols/test/pom.xml
copy to plc4j/drivers/simulated/pom.xml
index eb761f4..5716099 100644
--- a/plc4j/protocols/test/pom.xml
+++ b/plc4j/drivers/simulated/pom.xml
@@ -1,35 +1,35 @@
 <?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
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.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.
-
--->
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT 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>
+    <artifactId>plc4j-drivers</artifactId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-protocol-test</artifactId>
-  <name>PLC4J: Protocol: TEST</name>
-  <description>Test implementation of a PLC4X driver.</description>
+  <artifactId>plc4j-driver-simulated</artifactId>
+  <name>PLC4J: Driver: Simulated</name>
+  <description>Implementation of a PLC4X driver able to speak a simulated device.</description>
 
   <dependencies>
     <dependency>
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestPlcDriver.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/SimulatedPlcDriver.java
similarity index 57%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestPlcDriver.java
rename to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/SimulatedPlcDriver.java
index d5cec02..8bfa145 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestPlcDriver.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/SimulatedPlcDriver.java
@@ -1,27 +1,29 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"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.test;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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.simulated;
 
-import org.apache.plc4x.java.spi.PlcDriver;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 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.simulated.connection.SimulatedPlcConnection;
+import org.apache.plc4x.java.simulated.connection.TestDevice;
+import org.apache.plc4x.java.spi.PlcDriver;
 
 /**
  * Test driver holding its state in the client process.
@@ -30,7 +32,7 @@ import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
  * Every device contains a random value generator accessible by address {@code random}.
  * Any value can be stored into test devices, however the state will be gone when connection is closed.
  */
-public class TestPlcDriver implements PlcDriver {
+public class SimulatedPlcDriver implements PlcDriver {
 
     @Override
     public String getProtocolCode() {
@@ -50,7 +52,7 @@ public class TestPlcDriver implements PlcDriver {
             throw new PlcConnectionException("Invalid URL: no device name given.");
         }
         TestDevice device = new TestDevice(deviceName);
-        return new TestConnection(device);
+        return new SimulatedPlcConnection(device);
     }
 
     @Override
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedPlcConnection.java
similarity index 79%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
rename to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedPlcConnection.java
index 50ef026..68969f2 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestConnection.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/SimulatedPlcConnection.java
@@ -1,22 +1,22 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.test;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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.simulated.connection;
 
 import org.apache.commons.lang3.tuple.ImmutablePair;
 import org.apache.commons.lang3.tuple.Pair;
@@ -38,11 +38,11 @@ import java.util.concurrent.CompletableFuture;
  * Connection to a test device.
  * This class is not thread-safe.
  */
-class TestConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
+public class SimulatedPlcConnection extends AbstractPlcConnection implements PlcReader, PlcWriter {
     private final TestDevice device;
     private boolean connected = false;
 
-    TestConnection(TestDevice device) {
+    public SimulatedPlcConnection(TestDevice device) {
         this.device = device;
     }
 
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestDevice.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestDevice.java
similarity index 73%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestDevice.java
rename to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestDevice.java
index c4a4716..e94cc6a 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestDevice.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestDevice.java
@@ -1,22 +1,22 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.test;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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.simulated.connection;
 
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
@@ -26,17 +26,17 @@ import java.util.*;
  * Test device storing its state in memory.
  * Values are stored in a HashMap.
  */
-class TestDevice {
+public class TestDevice {
 
     private final Random random = new Random();
     private final String name;
     private final Map<TestField, BaseDefaultFieldItem> state = new HashMap<>();
 
-    TestDevice(String name) {
+    public TestDevice(String name) {
         this.name = name;
     }
 
-    Optional<BaseDefaultFieldItem> get(TestField field) {
+    public Optional<BaseDefaultFieldItem> get(TestField field) {
         Objects.requireNonNull(field);
         switch(field.getType()) {
             case STATE:
@@ -49,7 +49,7 @@ class TestDevice {
         throw new IllegalArgumentException("Unsupported field type: " + field.getType().name());
     }
 
-    void set(TestField field, BaseDefaultFieldItem value) {
+    public void set(TestField field, BaseDefaultFieldItem value) {
         Objects.requireNonNull(field);
         switch (field.getType()) {
             case STATE:
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestField.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestField.java
similarity index 74%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestField.java
rename to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestField.java
index 89b85b2..619ff2b 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestField.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestField.java
@@ -1,22 +1,22 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.test;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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.simulated.connection;
 
 import org.apache.commons.text.WordUtils;
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
@@ -30,7 +30,7 @@ import java.util.regex.Pattern;
 /**
  * Test address for accessing values in virtual devices.
  */
-class TestField implements PlcField {
+public class TestField implements PlcField {
 
     private static final Logger logger = LoggerFactory.getLogger(TestField.class);
 
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestFieldHandler.java
similarity index 99%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
rename to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestFieldHandler.java
index 4452656..329a28e 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldHandler.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestFieldHandler.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.java.test;
+package org.apache.plc4x.java.simulated.connection;
 
 import org.apache.plc4x.java.api.exceptions.PlcInvalidFieldException;
 import org.apache.plc4x.java.api.exceptions.PlcRuntimeException;
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestFieldItem.java
similarity index 95%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
rename to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestFieldItem.java
index a040a6d..230b7b7 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestFieldItem.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestFieldItem.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.java.test;
+package org.apache.plc4x.java.simulated.connection;
 
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestType.java
similarity index 94%
copy from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
copy to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestType.java
index 6654bb0..d0d8d43 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
+++ b/plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestType.java
@@ -17,7 +17,7 @@
  under the License.
  */
 
-package org.apache.plc4x.java.test;
+package org.apache.plc4x.java.simulated.connection;
 
 public enum TestType {
 
diff --git a/plc4j/drivers/simulated/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/drivers/simulated/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
new file mode 100644
index 0000000..37f9038
--- /dev/null
+++ b/plc4j/drivers/simulated/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
@@ -0,0 +1,38 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#     http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.plc4x.java.simulated.SimulatedPlcDriver
diff --git a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java b/plc4j/drivers/simulated/src/test/java/org/apache/plc4x/java/simulated/connection/TestDeviceTest.java
similarity index 94%
rename from plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
rename to plc4j/drivers/simulated/src/test/java/org/apache/plc4x/java/simulated/connection/TestDeviceTest.java
index 9038e46..a4f2703 100644
--- a/plc4j/protocols/test/src/test/java/org/apache/plc4x/java/test/TestDeviceTest.java
+++ b/plc4j/drivers/simulated/src/test/java/org/apache/plc4x/java/simulated/connection/TestDeviceTest.java
@@ -7,7 +7,7 @@
  "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
+     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
@@ -16,7 +16,7 @@
  specific language governing permissions and limitations
  under the License.
  */
-package org.apache.plc4x.java.test;
+package org.apache.plc4x.java.simulated.connection;
 
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
 import org.apache.plc4x.java.base.messages.items.DefaultLongFieldItem;
diff --git a/plc4j/pom.xml b/plc4j/pom.xml
index 52f446b..f3b8906 100644
--- a/plc4j/pom.xml
+++ b/plc4j/pom.xml
@@ -35,7 +35,7 @@
 
   <modules>
     <module>api</module>
-    <module>core</module>
+    <module>drivers</module>
     <module>protocols</module>
     <module>utils</module>
   </modules>
diff --git a/plc4j/protocols/ads/pom.xml b/plc4j/protocols/ads/pom.xml
index 6ab84a7..cc64139 100644
--- a/plc4j/protocols/ads/pom.xml
+++ b/plc4j/protocols/ads/pom.xml
@@ -53,12 +53,6 @@
       <artifactId>plc4j-protocol-driver-base-serial</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
 
     <dependency>
       <groupId>io.netty</groupId>
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/LengthTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/LengthTest.java
index a982c35..63c0597 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/LengthTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/LengthTest.java
@@ -21,10 +21,10 @@ package org.apache.plc4x.java.ads.api.commands.types;
 import org.apache.commons.codec.binary.Hex;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class LengthTest {
 
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/ReadLengthTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/ReadLengthTest.java
index 746b303..0cc21dd 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/ReadLengthTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/ReadLengthTest.java
@@ -21,10 +21,10 @@ package org.apache.plc4x.java.ads.api.commands.types;
 import org.apache.commons.codec.binary.Hex;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 
 public class ReadLengthTest {
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SampleSizeTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SampleSizeTest.java
index 64d193e..edbd603 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SampleSizeTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SampleSizeTest.java
@@ -21,10 +21,10 @@ package org.apache.plc4x.java.ads.api.commands.types;
 import org.apache.commons.codec.binary.Hex;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class SampleSizeTest {
 
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SamplesTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SamplesTest.java
index 10633f2..9c27fc9 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SamplesTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/SamplesTest.java
@@ -21,10 +21,10 @@ package org.apache.plc4x.java.ads.api.commands.types;
 import org.apache.commons.codec.binary.Hex;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 public class SamplesTest {
 
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/WriteLengthTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/WriteLengthTest.java
index b4b28c1..2964f55 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/WriteLengthTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/commands/types/WriteLengthTest.java
@@ -21,10 +21,10 @@ package org.apache.plc4x.java.ads.api.commands.types;
 import org.apache.commons.codec.binary.Hex;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 
 public class WriteLengthTest {
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/AmsPortTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/AmsPortTest.java
index f37be58..a61b3cf 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/AmsPortTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/AmsPortTest.java
@@ -21,9 +21,9 @@ package org.apache.plc4x.java.ads.api.generic.types;
 import org.apache.commons.codec.binary.Hex;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 
 public class AmsPortTest {
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/DataLengthTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/DataLengthTest.java
index fac0fca..0bcb618 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/DataLengthTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/DataLengthTest.java
@@ -21,10 +21,10 @@ package org.apache.plc4x.java.ads.api.generic.types;
 import org.apache.commons.codec.binary.Hex;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 
 public class DataLengthTest {
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/TcpLengthTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/TcpLengthTest.java
index 4aa2cbd..a840ada 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/TcpLengthTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/api/generic/types/TcpLengthTest.java
@@ -23,10 +23,10 @@ import org.apache.commons.codec.binary.Hex;
 import org.apache.plc4x.java.ads.api.tcp.types.TcpLength;
 import org.junit.Test;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.hamcrest.Matchers.containsString;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertThat;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 
 public class TcpLengthTest {
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java
index c2f30cc..d20df92 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsAbstractPlcConnectionTest.java
@@ -52,8 +52,8 @@ import java.util.Map;
 import java.util.Queue;
 import java.util.concurrent.*;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.junit.Assert.*;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.mockito.Mockito.*;
 
 @SuppressWarnings("unchecked")
diff --git a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java
index 82b4d38..0fdd0c0 100644
--- a/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java
+++ b/plc4j/protocols/ads/src/test/java/org/apache/plc4x/java/ads/connection/AdsConnectionFactoryTest.java
@@ -32,9 +32,9 @@ import org.mockito.junit.MockitoJUnitRunner;
 
 import java.net.InetAddress;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 @RunWith(MockitoJUnitRunner.class)
 public class AdsConnectionFactoryTest {
diff --git a/plc4j/protocols/ethernetip/pom.xml b/plc4j/protocols/ethernet-ip/pom.xml
similarity index 80%
rename from plc4j/protocols/ethernetip/pom.xml
rename to plc4j/protocols/ethernet-ip/pom.xml
index 05f0eb7..70d46b3 100644
--- a/plc4j/protocols/ethernetip/pom.xml
+++ b/plc4j/protocols/ethernet-ip/pom.xml
@@ -27,7 +27,7 @@
     <version>0.3.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-protocol-ethernetip</artifactId>
+  <artifactId>plc4j-protocol-ethernet-ip</artifactId>
   <name>PLC4J: Protocol: Ethernet/IP</name>
   <description>Implementation of a PLC4X driver able to speak with devices using the Ethernet/IP protocol.
   </description>
@@ -47,18 +47,6 @@
       <artifactId>plc4j-protocol-driver-base</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
-
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>test</scope>
-    </dependency>
 
     <dependency>
       <groupId>com.digitalpetri.enip</groupId>
@@ -70,18 +58,6 @@
       <artifactId>enip-core</artifactId>
       <version>${ethernetip-driver.version}</version>
     </dependency>
-    <dependency>
-      <groupId>com.digitalpetri.enip</groupId>
-      <artifactId>enip-client</artifactId>
-      <version>${ethernetip-driver.version}</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>com.digitalpetri.enip</groupId>
-      <artifactId>cip-client</artifactId>
-      <version>${ethernetip-driver.version}</version>
-      <scope>test</scope>
-    </dependency>
 
     <dependency>
       <groupId>io.netty</groupId>
@@ -93,10 +69,6 @@
     </dependency>
     <dependency>
       <groupId>io.netty</groupId>
-      <artifactId>netty-common</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
       <artifactId>netty-transport</artifactId>
     </dependency>
 
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/model/EtherNetIpField.java b/plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/model/EtherNetIpField.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/model/EtherNetIpField.java
rename to plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/model/EtherNetIpField.java
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/EnipCodec.java b/plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/EnipCodec.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/EnipCodec.java
rename to plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/EnipCodec.java
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java b/plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
rename to plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/Plc4XEtherNetIpProtocol.java
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/events/EtherNetIpConnectedEvent.java b/plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/events/EtherNetIpConnectedEvent.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/events/EtherNetIpConnectedEvent.java
rename to plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/events/EtherNetIpConnectedEvent.java
diff --git a/plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java b/plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java
similarity index 100%
rename from plc4j/protocols/ethernetip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java
rename to plc4j/protocols/ethernet-ip/src/main/java/org/apache/plc4x/java/ethernetip/netty/util/EnipPlcFieldHandler.java
diff --git a/plc4j/protocols/ethernetip/src/site/asciidoc/index.adoc b/plc4j/protocols/ethernet-ip/src/site/asciidoc/index.adoc
similarity index 100%
rename from plc4j/protocols/ethernetip/src/site/asciidoc/index.adoc
rename to plc4j/protocols/ethernet-ip/src/site/asciidoc/index.adoc
diff --git a/plc4j/protocols/ethernetip/src/site/resources/img/WAGO_enip_exporer.png b/plc4j/protocols/ethernet-ip/src/site/resources/img/WAGO_enip_exporer.png
similarity index 100%
rename from plc4j/protocols/ethernetip/src/site/resources/img/WAGO_enip_exporer.png
rename to plc4j/protocols/ethernet-ip/src/site/resources/img/WAGO_enip_exporer.png
diff --git a/plc4j/utils/opm/pom.xml b/plc4j/protocols/iso-on-tcp/pom.xml
similarity index 55%
copy from plc4j/utils/opm/pom.xml
copy to plc4j/protocols/iso-on-tcp/pom.xml
index 2912674..78e909b 100644
--- a/plc4j/utils/opm/pom.xml
+++ b/plc4j/protocols/iso-on-tcp/pom.xml
@@ -8,7 +8,7 @@
   "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
+      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
@@ -22,19 +22,16 @@
   <modelVersion>4.0.0</modelVersion>
 
   <parent>
-    <artifactId>plc4j-utils</artifactId>
     <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4j-protocols</artifactId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-opm</artifactId>
-  <packaging>jar</packaging>
-
-  <name>PLC4J: Utils: Object PLC Mapping</name>
-  <description>Layer on top of Plc4X that enables mapping between Objects and PLCs.</description>
+  <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>
-    <!--Internal Dependencies-->
     <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-api</artifactId>
@@ -42,63 +39,37 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
 
-    <!-- Utils -->
-    <dependency>
-      <groupId>net.bytebuddy</groupId>
-      <artifactId>byte-buddy</artifactId>
-      <version>1.8.15</version>
-    </dependency>
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-buffer</artifactId>
     </dependency>
     <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-configuration2</artifactId>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
     </dependency>
 
-    <!--Testing-->
     <dependency>
-      <groupId>junit</groupId>
-      <artifactId>junit</artifactId>
+      <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-protocol-driver-base</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-test</artifactId>
+      <artifactId>plc4j-utils-test-utils</artifactId>
       <version>0.3.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
 
-  <build>
-    <plugins>
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-dependency-plugin</artifactId>
-        <!--Currently commented out as the dependency is used "explicitly".-->
-        <!--<configuration>-->
-          <!--<usedDependencies combine.children="append">-->
-            <!--<usedDependency>org.apache.plc4x:plc4j-protocol-test</usedDependency>-->
-          <!--</usedDependencies>-->
-        <!--</configuration>-->
-      </plugin>
-    </plugins>
-  </build>
-
 </project>
\ No newline at end of file
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isoontcp/netty/IsoOnTcpProtocol.java b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
similarity index 82%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isoontcp/netty/IsoOnTcpProtocol.java
rename to plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
index 1c9a1fe..32648fa 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isoontcp/netty/IsoOnTcpProtocol.java
+++ b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocol.java
@@ -1,22 +1,22 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.netty;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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;
@@ -24,7 +24,7 @@ import io.netty.buffer.Unpooled;
 import io.netty.channel.ChannelHandlerContext;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.base.PlcMessageToMessageCodec;
-import org.apache.plc4x.java.isoontcp.netty.model.IsoOnTcpMessage;
+import org.apache.plc4x.java.isoontcp.protocol.model.IsoOnTcpMessage;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java
similarity index 73%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
rename to plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java
index 6654bb0..1500d80 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
+++ b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java
@@ -16,13 +16,15 @@
  specific language governing permissions and limitations
  under the License.
  */
+package org.apache.plc4x.java.isoontcp.protocol.model;
 
-package org.apache.plc4x.java.test;
+import io.netty.buffer.ByteBuf;
+import org.apache.plc4x.java.base.messages.PlcRawMessage;
 
-public enum TestType {
+public class IsoOnTcpMessage extends PlcRawMessage {
 
-    RANDOM,
-    STATE,
-    STDOUT
+    public IsoOnTcpMessage(ByteBuf userData) {
+        super(userData);
+    }
 
 }
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isoontcp/netty/IsoOnTcpProtocolTest.java b/plc4j/protocols/iso-on-tcp/src/test/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocolTest.java
similarity index 86%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isoontcp/netty/IsoOnTcpProtocolTest.java
rename to plc4j/protocols/iso-on-tcp/src/test/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocolTest.java
index b2ae4b2..8b158e4 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isoontcp/netty/IsoOnTcpProtocolTest.java
+++ b/plc4j/protocols/iso-on-tcp/src/test/java/org/apache/plc4x/java/isoontcp/protocol/IsoOnTcpProtocolTest.java
@@ -1,22 +1,22 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.netty;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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;
@@ -26,8 +26,7 @@ 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.netty.model.IsoOnTcpMessage;
-import org.apache.plc4x.java.netty.NettyTestBase;
+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;
@@ -42,7 +41,7 @@ import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.*;
 
 
-public class IsoOnTcpProtocolTest extends NettyTestBase {
+public class IsoOnTcpProtocolTest {
 
     @Test
     @Category(FastTests.class)
diff --git a/plc4j/core/pom.xml b/plc4j/protocols/iso-tp/pom.xml
similarity index 51%
rename from plc4j/core/pom.xml
rename to plc4j/protocols/iso-tp/pom.xml
index 26b6154..c6eec35 100644
--- a/plc4j/core/pom.xml
+++ b/plc4j/protocols/iso-tp/pom.xml
@@ -1,35 +1,35 @@
 <?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
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.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.
-
--->
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT 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</artifactId>
+    <artifactId>plc4j-protocols</artifactId>
     <version>0.3.0-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-core</artifactId>
-  <name>PLC4J: Core</name>
-  <description>Implementation of the core PLC4J system containing the DriverManger.</description>
+  <artifactId>plc4j-protocol-iso-tp</artifactId>
+  <name>PLC4J: Protocol: ISO TP</name>
+  <description>Implementation of the ISO Transport Protocol layer.</description>
 
   <dependencies>
     <dependency>
@@ -37,33 +37,36 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-utils-test-utils</artifactId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
       <version>0.3.0-SNAPSHOT</version>
-      <scope>test</scope>
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <artifactId>plc4j-protocol-iso-on-tcp</artifactId>
       <version>0.3.0-SNAPSHOT</version>
-      <scope>test</scope>
     </dependency>
+
     <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-test</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>test</scope>
+      <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.commons</groupId>
-      <artifactId>commons-lang3</artifactId>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-utils-test-utils</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocol.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocol.java
similarity index 93%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocol.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocol.java
index a6bdfad..d486a86 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocol.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocol.java
@@ -1,22 +1,22 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.netty;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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;
@@ -26,13 +26,13 @@ import io.netty.channel.ChannelHandlerContext;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolPayloadTooBigException;
 import org.apache.plc4x.java.base.PlcMessageToMessageCodec;
 import org.apache.plc4x.java.base.events.ConnectEvent;
-import org.apache.plc4x.java.isoontcp.netty.IsoOnTcpProtocol;
-import org.apache.plc4x.java.isoontcp.netty.model.IsoOnTcpMessage;
-import org.apache.plc4x.java.isotp.netty.events.IsoTPConnectedEvent;
-import org.apache.plc4x.java.isotp.netty.model.IsoTPMessage;
-import org.apache.plc4x.java.isotp.netty.model.params.*;
-import org.apache.plc4x.java.isotp.netty.model.tpdus.*;
-import org.apache.plc4x.java.isotp.netty.model.types.*;
+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;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/events/IsoTPConnectedEvent.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/events/IsoTPConnectedEvent.java
similarity index 93%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/events/IsoTPConnectedEvent.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/events/IsoTPConnectedEvent.java
index 96a6d1a..4e9401c 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/events/IsoTPConnectedEvent.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/events/IsoTPConnectedEvent.java
@@ -16,7 +16,7 @@ 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.netty.events;
+package org.apache.plc4x.java.isotp.protocol.events;
 
 public class IsoTPConnectedEvent {
 }
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/IsoTPMessage.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessage.java
similarity index 90%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/IsoTPMessage.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessage.java
index 13b554f..7e76ebe 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/IsoTPMessage.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessage.java
@@ -16,11 +16,11 @@ 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.netty.model;
+package org.apache.plc4x.java.isotp.protocol.model;
 
 import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.base.messages.PlcRawMessage;
-import org.apache.plc4x.java.isotp.netty.model.tpdus.Tpdu;
+import org.apache.plc4x.java.isotp.protocol.model.tpdus.Tpdu;
 
 public class IsoTPMessage extends PlcRawMessage {
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/CalledTsapParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CalledTsapParameter.java
similarity index 88%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/CalledTsapParameter.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CalledTsapParameter.java
index a9446f3..de7ce1e 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/CalledTsapParameter.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CalledTsapParameter.java
@@ -16,9 +16,9 @@ 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.netty.model.params;
+package org.apache.plc4x.java.isotp.protocol.model.params;
 
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
+import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
 
 public class CalledTsapParameter extends TsapParameter {
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/CallingTsapParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CallingTsapParameter.java
similarity index 88%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/CallingTsapParameter.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CallingTsapParameter.java
index a4dd393..ffc62dd 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/CallingTsapParameter.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/CallingTsapParameter.java
@@ -16,9 +16,9 @@ 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.netty.model.params;
+package org.apache.plc4x.java.isotp.protocol.model.params;
 
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
+import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
 
 public class CallingTsapParameter extends TsapParameter {
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/ChecksumParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/ChecksumParameter.java
similarity index 89%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/ChecksumParameter.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/ChecksumParameter.java
index bfd2f95..d2b876a 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/ChecksumParameter.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/ChecksumParameter.java
@@ -16,9 +16,9 @@ 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.netty.model.params;
+package org.apache.plc4x.java.isotp.protocol.model.params;
 
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
+import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
 
 public class ChecksumParameter implements Parameter {
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/DisconnectAdditionalInformationParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/DisconnectAdditionalInformationParameter.java
similarity index 89%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/DisconnectAdditionalInformationParameter.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/DisconnectAdditionalInformationParameter.java
index e8ac392..1d47c2d 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/DisconnectAdditionalInformationParameter.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/DisconnectAdditionalInformationParameter.java
@@ -16,10 +16,10 @@ 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.netty.model.params;
+package org.apache.plc4x.java.isotp.protocol.model.params;
 
 
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
+import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
 
 public class DisconnectAdditionalInformationParameter implements Parameter {
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/Parameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/Parameter.java
similarity index 86%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/Parameter.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/Parameter.java
index 4c06fe9..4d1878d 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/Parameter.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/Parameter.java
@@ -16,9 +16,9 @@ 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.netty.model.params;
+package org.apache.plc4x.java.isotp.protocol.model.params;
 
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
+import org.apache.plc4x.java.isotp.protocol.model.types.ParameterCode;
 
 public interface Parameter {
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/TpduSizeParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TpduSizeParameter.java
similarity index 85%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/TpduSizeParameter.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TpduSizeParameter.java
index 146b8ad..7179273 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/TpduSizeParameter.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TpduSizeParameter.java
@@ -16,10 +16,10 @@ 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.netty.model.params;
+package org.apache.plc4x.java.isotp.protocol.model.params;
 
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduSize;
+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 {
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/TsapParameter.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameter.java
similarity index 94%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/TsapParameter.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameter.java
index f521828..c8882fc 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/params/TsapParameter.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameter.java
@@ -16,7 +16,7 @@ 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.netty.model.params;
+package org.apache.plc4x.java.isotp.protocol.model.params;
 
 /**
  * Base class for calling and called TSAPs
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionConfirmTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionConfirmTpdu.java
similarity index 81%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionConfirmTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionConfirmTpdu.java
index b811ff3..3931269 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionConfirmTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionConfirmTpdu.java
@@ -16,12 +16,12 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.ProtocolClass;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+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;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionRequestTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionRequestTpdu.java
similarity index 81%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionRequestTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionRequestTpdu.java
index db93ce5..01218e3 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionRequestTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionRequestTpdu.java
@@ -16,12 +16,12 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.ProtocolClass;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+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;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionTpdu.java
similarity index 86%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionTpdu.java
index dcc7e8d..632effb 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ConnectionTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ConnectionTpdu.java
@@ -16,12 +16,12 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.ProtocolClass;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+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;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/CustomTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/CustomTpdu.java
similarity index 84%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/CustomTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/CustomTpdu.java
index 12739ab..c5cbae1 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/CustomTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/CustomTpdu.java
@@ -16,11 +16,11 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
+import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
 
 import java.util.List;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DataTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DataTpdu.java
similarity index 88%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DataTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DataTpdu.java
index 1134954..129773d 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DataTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DataTpdu.java
@@ -16,12 +16,12 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.base.messages.PlcProtocolMessage;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
+import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
 
 import java.util.List;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectConfirmTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectConfirmTpdu.java
similarity index 85%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectConfirmTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectConfirmTpdu.java
index 1dd3dde..e6d1815 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectConfirmTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectConfirmTpdu.java
@@ -16,11 +16,11 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
+import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
 
 import java.util.List;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectRequestTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectRequestTpdu.java
similarity index 83%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectRequestTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectRequestTpdu.java
index ead47a6..149c366 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectRequestTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectRequestTpdu.java
@@ -16,12 +16,12 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.DisconnectReason;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+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;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectTpdu.java
similarity index 88%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectTpdu.java
index 1c09138..4596d2e 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/DisconnectTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/DisconnectTpdu.java
@@ -16,11 +16,11 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+import org.apache.plc4x.java.isotp.protocol.model.params.Parameter;
+import org.apache.plc4x.java.isotp.protocol.model.types.TpduCode;
 
 import java.util.List;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ErrorTpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ErrorTpdu.java
similarity index 84%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ErrorTpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ErrorTpdu.java
index 0851977..a526f8a 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/ErrorTpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/ErrorTpdu.java
@@ -16,12 +16,12 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.RejectCause;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+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;
 
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/Tpdu.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/Tpdu.java
similarity index 91%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/Tpdu.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/Tpdu.java
index 69e8545..1f49eeb 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/tpdus/Tpdu.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/Tpdu.java
@@ -16,13 +16,13 @@ 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.netty.model.tpdus;
+package org.apache.plc4x.java.isotp.protocol.model.tpdus;
 
 import io.netty.buffer.ByteBuf;
 import org.apache.plc4x.java.base.messages.PlcProtocolMessage;
 import org.apache.plc4x.java.base.messages.PlcRawMessage;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+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;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/DeviceGroup.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DeviceGroup.java
similarity index 95%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/DeviceGroup.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DeviceGroup.java
index 7064e88..a2ce863 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/DeviceGroup.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DeviceGroup.java
@@ -16,7 +16,7 @@ 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.netty.model.types;
+package org.apache.plc4x.java.isotp.protocol.model.types;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/DisconnectReason.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DisconnectReason.java
similarity index 97%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/DisconnectReason.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DisconnectReason.java
index 9eabe89..a776909 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/DisconnectReason.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/DisconnectReason.java
@@ -16,7 +16,7 @@ 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.netty.model.types;
+package org.apache.plc4x.java.isotp.protocol.model.types;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/ParameterCode.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ParameterCode.java
similarity index 97%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/ParameterCode.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ParameterCode.java
index 8e4fe1c..98fdf36 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/ParameterCode.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ParameterCode.java
@@ -16,7 +16,7 @@ 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.netty.model.types;
+package org.apache.plc4x.java.isotp.protocol.model.types;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/ProtocolClass.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ProtocolClass.java
similarity index 96%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/ProtocolClass.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ProtocolClass.java
index f944f69..b8f1c6f 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/ProtocolClass.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/ProtocolClass.java
@@ -16,7 +16,7 @@ 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.netty.model.types;
+package org.apache.plc4x.java.isotp.protocol.model.types;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/RejectCause.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/RejectCause.java
similarity index 96%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/RejectCause.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/RejectCause.java
index 37c2b28..0152bae 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/RejectCause.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/RejectCause.java
@@ -16,7 +16,7 @@ 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.netty.model.types;
+package org.apache.plc4x.java.isotp.protocol.model.types;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/TpduCode.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduCode.java
similarity index 96%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/TpduCode.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduCode.java
index ded9a07..9f63059 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/TpduCode.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduCode.java
@@ -16,7 +16,7 @@ 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.netty.model.types;
+package org.apache.plc4x.java.isotp.protocol.model.types;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/TpduSize.java b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduSize.java
similarity index 97%
rename from plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/TpduSize.java
rename to plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduSize.java
index 5ba90ec..d6386d2 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isotp/netty/model/types/TpduSize.java
+++ b/plc4j/protocols/iso-tp/src/main/java/org/apache/plc4x/java/isotp/protocol/model/types/TpduSize.java
@@ -16,7 +16,7 @@ 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.netty.model.types;
+package org.apache.plc4x.java.isotp.protocol.model.types;
 
 import java.util.HashMap;
 import java.util.Map;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocolTest.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocolTest.java
similarity index 93%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocolTest.java
rename to plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocolTest.java
index a79df5f..d1d0fff 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/IsoTPProtocolTest.java
+++ b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/IsoTPProtocolTest.java
@@ -1,32 +1,31 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.netty;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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.netty.model.IsoOnTcpMessage;
-import org.apache.plc4x.java.isotp.netty.model.IsoTPMessage;
-import org.apache.plc4x.java.isotp.netty.model.params.*;
-import org.apache.plc4x.java.isotp.netty.model.tpdus.*;
-import org.apache.plc4x.java.isotp.netty.model.types.*;
-import org.apache.plc4x.java.s7.utils.S7TsapIdEncoder;
+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;
@@ -312,9 +311,11 @@ public class IsoTPProtocolTest {
     @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
-            S7TsapIdEncoder.encodeS7TsapId(DeviceGroup.PG_OR_PC, (byte) 0x7, (byte) 0xe1));
+            (short) (firstByte | secondByte));
         parmameters.add(callingParameter);
         ErrorTpdu tpdu = new ErrorTpdu((short) 0x1, RejectCause.REASON_NOT_SPECIFIED, parmameters, buf);
 
@@ -504,9 +505,10 @@ public class IsoTPProtocolTest {
         assertThat(errorTpdu.getParameters(), hasSize(1));
         CallingTsapParameter parameter = (CallingTsapParameter) errorTpdu.getParameters().get(0);
         assertThat(parameter.getType(), equalTo(ParameterCode.CALLING_TSAP));
-        assertThat(S7TsapIdEncoder.decodeDeviceGroup(parameter.getTsapId()), equalTo(DeviceGroup.PG_OR_PC));
-        assertThat(S7TsapIdEncoder.decodeRack(parameter.getTsapId()), equalTo(0x1));
-        assertThat(S7TsapIdEncoder.decodeSlot(parameter.getTsapId()), equalTo(0x7));
+        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
@@ -534,9 +536,10 @@ public class IsoTPProtocolTest {
         assertThat(errorTpdu.getParameters(), hasSize(1));
         CalledTsapParameter parameter = (CalledTsapParameter) errorTpdu.getParameters().get(0);
         assertThat(parameter.getType(), equalTo(ParameterCode.CALLED_TSAP));
-        assertThat(S7TsapIdEncoder.decodeDeviceGroup(parameter.getTsapId()), equalTo(DeviceGroup.PG_OR_PC));
-        assertThat(S7TsapIdEncoder.decodeRack(parameter.getTsapId()), equalTo(0x2));
-        assertThat(S7TsapIdEncoder.decodeSlot(parameter.getTsapId()), equalTo(0x3));
+        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
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/IsoTPMessageTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessageTests.java
similarity index 53%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/IsoTPMessageTests.java
rename to plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessageTests.java
index f370239..e02cc26 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/IsoTPMessageTests.java
+++ b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/IsoTPMessageTests.java
@@ -1,30 +1,30 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.plc4x.java.isotp.netty.model;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.tpdus.ErrorTpdu;
-import org.apache.plc4x.java.isotp.netty.model.types.RejectCause;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduCode;
+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;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/params/ParameterTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/ParameterTests.java
similarity index 60%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/params/ParameterTests.java
rename to plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/ParameterTests.java
index 5161593..584a76a 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/params/ParameterTests.java
+++ b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/ParameterTests.java
@@ -1,26 +1,26 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.netty.model.params;
-
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
-import org.apache.plc4x.java.isotp.netty.model.types.TpduSize;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/params/TsapParameterTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameterTests.java
similarity index 55%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/params/TsapParameterTests.java
rename to plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameterTests.java
index 46498d1..bf663d5 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/params/TsapParameterTests.java
+++ b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/params/TsapParameterTests.java
@@ -1,25 +1,25 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.netty.model.params;
-
-import org.apache.plc4x.java.isotp.netty.model.types.ParameterCode;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/tpdus/IsotpModelTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/IsotpModelTests.java
similarity index 86%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/tpdus/IsotpModelTests.java
rename to plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/IsotpModelTests.java
index 311eec4..942ed75 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/tpdus/IsotpModelTests.java
+++ b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/tpdus/IsotpModelTests.java
@@ -1,31 +1,31 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.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.netty.model.tpdus;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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.netty.model.params.CallingTsapParameter;
-import org.apache.plc4x.java.isotp.netty.model.params.ChecksumParameter;
-import org.apache.plc4x.java.isotp.netty.model.params.Parameter;
-import org.apache.plc4x.java.isotp.netty.model.params.TpduSizeParameter;
-import org.apache.plc4x.java.isotp.netty.model.types.*;
+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;
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/types/IsotpTypeTests.java b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/types/IsotpTypeTests.java
similarity index 87%
rename from plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/types/IsotpTypeTests.java
rename to plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/types/IsotpTypeTests.java
index 73676b1..3b88a01 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/isotp/netty/model/types/IsotpTypeTests.java
+++ b/plc4j/protocols/iso-tp/src/test/java/org/apache/plc4x/java/isotp/protocol/model/types/IsotpTypeTests.java
@@ -1,23 +1,23 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
-
-package org.apache.plc4x.java.isotp.netty.model.types;
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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;
diff --git a/plc4j/protocols/modbus/pom.xml b/plc4j/protocols/modbus/pom.xml
index a572d4b..18bc827 100644
--- a/plc4j/protocols/modbus/pom.xml
+++ b/plc4j/protocols/modbus/pom.xml
@@ -57,12 +57,6 @@
       <artifactId>plc4j-protocol-driver-base-serial</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
 
     <dependency>
       <!-- Just for reference can be removed later-->
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java
index 8a4c419..e3e8eb4 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java
@@ -23,9 +23,7 @@ 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.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.base.connection.ChannelFactory;
 import org.apache.plc4x.java.base.messages.InternalPlcReadRequest;
@@ -43,9 +41,9 @@ import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 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;
diff --git a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
index e4dbc97..dd04648 100644
--- a/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
+++ b/plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
@@ -30,8 +30,8 @@ import org.mockito.junit.MockitoJUnitRunner;
 
 import java.net.InetAddress;
 
-import static org.apache.plc4x.java.base.util.Junit5Backport.assertThrows;
 import static org.junit.Assert.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertThrows;
 
 @RunWith(MockitoJUnitRunner.class)
 public class ModbusConnectionFactoryTest {
diff --git a/plc4j/protocols/pom.xml b/plc4j/protocols/pom.xml
index e3638ce..f4cbe1d 100644
--- a/plc4j/protocols/pom.xml
+++ b/plc4j/protocols/pom.xml
@@ -38,7 +38,9 @@
 
     <module>ads</module>
     <module>delta-v</module>
-    <module>ethernetip</module>
+    <module>ethernet-ip</module>
+    <module>iso-on-tcp</module>
+    <module>iso-tp</module>
     <module>modbus</module>
     <module>s7</module>
     <module>test</module>
diff --git a/plc4j/protocols/s7/pom.xml b/plc4j/protocols/s7/pom.xml
index dd1b82c..4c9efb3 100644
--- a/plc4j/protocols/s7/pom.xml
+++ b/plc4j/protocols/s7/pom.xml
@@ -29,7 +29,7 @@
 
   <artifactId>plc4j-protocol-s7</artifactId>
   <name>PLC4J: Protocol: S7</name>
-  <description>Implementation of a PLC4X driver able to speak with S7 devices using the S7 protocol.</description>
+  <description>Implementation of the S7 Protocol layer.</description>
 
   <dependencies>
     <dependency>
@@ -44,15 +44,9 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <artifactId>plc4j-protocol-iso-tp</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>runtime</scope>
-    </dependency>
 
     <dependency>
       <groupId>io.netty</groupId>
@@ -75,16 +69,6 @@
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
-      <artifactId>commons-configuration2</artifactId>
-    </dependency>
-
-    <dependency>
-      <groupId>ch.qos.logback</groupId>
-      <artifactId>logback-core</artifactId>
-      <scope>test</scope>
-    </dependency>
 
     <dependency>
       <groupId>commons-io</groupId>
@@ -96,16 +80,6 @@
       <artifactId>mockito-core</artifactId>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.pcap4j</groupId>
-      <artifactId>pcap4j-core</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
-      <groupId>org.pcap4j</groupId>
-      <artifactId>pcap4j-packetfactory-static</artifactId>
-      <scope>test</scope>
-    </dependency>
 
     <dependency>
       <groupId>org.spockframework</groupId>
@@ -125,26 +99,6 @@
       <version>0.3.0-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-test</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-      <scope>test</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
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isoontcp/netty/model/IsoOnTcpMessage.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isoontcp/netty/model/IsoOnTcpMessage.java
deleted file mode 100644
index c21bbd8..0000000
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/isoontcp/netty/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.netty.model;
-
-import io.netty.buffer.ByteBuf;
-import org.apache.plc4x.java.base.messages.PlcRawMessage;
-
-public class IsoOnTcpMessage extends PlcRawMessage {
-
-    public IsoOnTcpMessage(ByteBuf userData) {
-        super(userData);
-    }
-
-}
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
index 606c1b6..e473056 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/netty/S7Protocol.java
@@ -28,10 +28,10 @@ import io.netty.util.concurrent.PromiseCombiner;
 import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolPayloadTooBigException;
-import org.apache.plc4x.java.isotp.netty.IsoTPProtocol;
-import org.apache.plc4x.java.isotp.netty.events.IsoTPConnectedEvent;
-import org.apache.plc4x.java.isotp.netty.model.IsoTPMessage;
-import org.apache.plc4x.java.isotp.netty.model.tpdus.DataTpdu;
+import org.apache.plc4x.java.isotp.protocol.IsoTPProtocol;
+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.tpdus.DataTpdu;
 import org.apache.plc4x.java.s7.netty.events.S7ConnectedEvent;
 import org.apache.plc4x.java.s7.netty.model.messages.S7Message;
 import org.apache.plc4x.java.s7.netty.model.messages.S7RequestMessage;
diff --git a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoder.java b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoder.java
index 73200a4..c2250b6 100644
--- a/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoder.java
+++ b/plc4j/protocols/s7/src/main/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoder.java
@@ -18,7 +18,7 @@ under the License.
 */
 package org.apache.plc4x.java.s7.utils;
 
-import org.apache.plc4x.java.isotp.netty.model.types.DeviceGroup;
+import org.apache.plc4x.java.isotp.protocol.model.types.DeviceGroup;
 
 public class S7TsapIdEncoder {
 
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/netty/NettyTestBase.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/netty/NettyTestBase.java
deleted file mode 100644
index 16e4f5f..0000000
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/netty/NettyTestBase.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.netty;
-
-public class NettyTestBase {
-}
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcScanner.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcScanner.java
deleted file mode 100644
index c7ddebd..0000000
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcScanner.java
+++ /dev/null
@@ -1,86 +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.junit.jupiter.api.Test;
-import org.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class S7PlcScanner {
-
-    private static final Logger logger = LoggerFactory.getLogger(S7PlcScanner.class);
-
-    @Test
-    public void hurz() {
-
-    }
-
-
-    /**
-     * Example code do demonstrate using the S7 Plc Driver.
-     *
-     * @param args ignored.
-     */
-/*    public static void main(String[] args) {
-        // Create a connection to the S7 PLC (s7://{hostname/ip}/{racknumber}/{slotnumber})
-        logger.info("Connecting");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://10.10.64.20/1/1")) {
-            logger.info("Connected");
-
-            Optional<PlcReader> reader = plcConnection.getReader();
-            // Check if this connection support reading of data.
-            if (reader.isPresent()) {
-                PlcReader plcReader = reader.get();
-
-                for (MemoryArea memoryArea : MemoryArea.values()) {
-                    System.out.println(memoryArea);
-                    System.out.println("------------------------------------------");
-                    for (int i = 0; i < 8959; i++) {
-                        try {
-                            PlcField field;
-                            if (memoryArea == MemoryArea.DATA_BLOCKS) {
-                                field = plcConnection.prepareField("DATA_BLOCKS/1/" + i);
-                            } else {
-                                field = plcConnection.prepareField(memoryArea.name() + "/" + i);
-                            }
-                            TypeSafePlcReadResponse<Byte> plcReadResponse = plcReader.read(
-                                new TypeSafePlcReadRequest<>(Byte.class, field)).get();
-                            Byte data = plcReadResponse.getResponseItem()
-                                .orElseThrow(() -> new IllegalStateException("No response available"))
-                                .getValues().get(0);
-                            if (data != null && data != 0) {
-                                System.out.println(String.format(
-                                    "Response: Memory Area: %s Index: %d Value: %02X", memoryArea.name(), i, data));
-                            }
-                        } catch (Exception e) {
-                            e.printStackTrace();
-                        }
-                    }
-                }
-            }
-        }
-        // Catch any exception or the application won't be able to finish if something goes wrong.
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-        // The application would cleanly terminate after several seconds ... this just speeds things up.
-        System.exit(0);
-    }*/
-
-}
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcTestConsole.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcTestConsole.java
deleted file mode 100644
index f33f563..0000000
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcTestConsole.java
+++ /dev/null
@@ -1,69 +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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class S7PlcTestConsole {
-
-    private static final Logger logger = LoggerFactory.getLogger(S7PlcTestConsole.class);
-
-    /**
-     * Example code do demonstrate using the S7 Plc Driver.
-     *
-     * @param args ignored.
-     */
-/*    public static void main(String[] args) {
-        // Create a connection to the S7 PLC (s7://{hostname/ip}/{racknumber}/{slotnumber})
-        logger.info("Connecting");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://10.10.64.20/1/1")) {
-            logger.info("Connected");
-
-            Optional<PlcReader> reader = plcConnection.getReader();
-            // Check if this connection support reading of data.
-            if (reader.isPresent()) {
-                PlcReader plcReader = reader.get();
-
-                Scanner scanner = new Scanner(System.in);
-                String line;
-                while (!"exit".equalsIgnoreCase(line = scanner.next())) {
-                    try {
-                        PlcField field = plcConnection.prepareField(line);
-                        TypeSafePlcReadResponse<Byte> plcReadResponse = plcReader.read(new TypeSafePlcReadRequest<>(Byte.class, field)).get();
-                        List<Byte> data = plcReadResponse.getResponseItem()
-                            .orElseThrow(() -> new IllegalStateException("No response available"))
-                            .getValues();
-                        System.out.println("Response: " + data.get(0));
-                    } catch (Exception e) {
-                        e.printStackTrace();
-                    }
-                }
-                scanner.close();
-            }
-        }
-        // Catch any exception or the application won't be able to finish if something goes wrong.
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-        // The application would cleanly terminate after several seconds ... this just speeds things up.
-        System.exit(0);
-    }*/
-
-}
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcWriterSample.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcWriterSample.java
deleted file mode 100644
index 48318ed..0000000
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/S7PlcWriterSample.java
+++ /dev/null
@@ -1,63 +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.slf4j.Logger;
-import org.slf4j.LoggerFactory;
-
-public class S7PlcWriterSample {
-
-    private static final Logger logger = LoggerFactory.getLogger(S7PlcWriterSample.class);
-
-    /**
-     * Example code do demonstrate using the S7 Plc Driver.
-     *
-     * @param args ignored.
-     */
-/*    public static void main(String[] args) {
-        // Create a connection to the S7 PLC (s7://{hostname/ip}/{racknumber}/{slotnumber})
-        logger.info("Connecting");
-        try (PlcConnection plcConnection = new PlcDriverManager().getConnection("s7://192.168.0.1/0/0")) {
-            logger.info("Connected");
-
-            Optional<PlcWriter> writer = plcConnection.getWriter();
-            // Check if this connection support reading of data.
-            if (writer.isPresent()) {
-                PlcWriter plcWriter = writer.get();
-                PlcField inputs = plcConnection.prepareField("DATA_BLOCKS/1/2");
-                //////////////////////////////////////////////////////////
-                // Write synchronously ...
-                // NOTICE: the ".get()" immediately lets this thread pause till
-                // the response is processed and available.
-                TypeSafePlcWriteResponse<Float> plcWriteResponse = plcWriter.write(
-                    new TypeSafePlcWriteRequest<>(Float.class, inputs, 2.0f)).get();
-                System.out.println("Written: " + plcWriteResponse.getResponseItem()
-                    .orElseThrow(() -> new IllegalStateException("No response available"))
-                    .getResponseCode().name());
-            }
-        }
-        // Catch any exception or the application won't be able to finish if something goes wrong.
-        catch (Exception e) {
-            e.printStackTrace();
-        }
-        // The application would cleanly terminate after several seconds ... this just speeds things up.
-        System.exit(0);
-    }*/
-
-}
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
index 152fb0f..d4f401b 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/Plc4XS7ProtocolTest.java
@@ -29,7 +29,6 @@ import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.model.PlcField;
 import org.apache.plc4x.java.base.messages.*;
-import org.apache.plc4x.java.netty.NettyTestBase;
 import org.apache.plc4x.java.s7.netty.model.messages.S7Message;
 import org.apache.plc4x.java.s7.netty.model.messages.S7RequestMessage;
 import org.apache.plc4x.java.s7.netty.model.params.VarParameter;
@@ -56,7 +55,7 @@ import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-public class Plc4XS7ProtocolTest extends NettyTestBase {
+public class Plc4XS7ProtocolTest {
 
     private EmbeddedChannel SUT;
     private PlcReadRequest.Builder readRequestBuilder =
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
index 7c8b416..dfeb21e 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/netty/S7ProtocolTest.java
@@ -21,8 +21,7 @@ package org.apache.plc4x.java.s7.netty;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.embedded.EmbeddedChannel;
 import org.apache.plc4x.java.api.exceptions.PlcProtocolException;
-import org.apache.plc4x.java.isotp.netty.model.tpdus.DataTpdu;
-import org.apache.plc4x.java.netty.NettyTestBase;
+import org.apache.plc4x.java.isotp.protocol.model.tpdus.DataTpdu;
 import org.apache.plc4x.java.s7.netty.model.messages.S7RequestMessage;
 import org.apache.plc4x.java.s7.netty.model.messages.SetupCommunicationRequestMessage;
 import org.apache.plc4x.java.s7.netty.model.params.CpuServicesRequestParameter;
@@ -49,7 +48,7 @@ import static org.junit.Assert.assertThat;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
-public class S7ProtocolTest extends NettyTestBase {
+public class S7ProtocolTest {
 
     private EmbeddedChannel SUT;
 
diff --git a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoderTest.java b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoderTest.java
index e0851ee..bae498f 100644
--- a/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoderTest.java
+++ b/plc4j/protocols/s7/src/test/java/org/apache/plc4x/java/s7/utils/S7TsapIdEncoderTest.java
@@ -19,7 +19,7 @@
 
 package org.apache.plc4x.java.s7.utils;
 
-import org.apache.plc4x.java.isotp.netty.model.types.DeviceGroup;
+import org.apache.plc4x.java.isotp.protocol.model.types.DeviceGroup;
 import org.junit.jupiter.api.Test;
 
 import java.lang.reflect.Constructor;
diff --git a/plc4j/protocols/s7/src/test/resources/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties b/plc4j/protocols/s7/src/test/resources/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties
new file mode 100644
index 0000000..0759363
--- /dev/null
+++ b/plc4j/protocols/s7/src/test/resources/META-INF/services/com.athaydes.spockframework.report.IReportCreator.properties
@@ -0,0 +1,66 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.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.
+#
+
+# Name of the implementation class(es) of report creator(s) to enable (separate multiple entries with commas)
+# Currently supported classes are:
+#   1. com.athaydes.spockframework.report.internal.HtmlReportCreator
+#   2. com.athaydes.spockframework.report.template.TemplateReportCreator
+com.athaydes.spockframework.report.IReportCreator=com.athaydes.spockframework.report.internal.HtmlReportCreator
+
+# Set properties of the report creator
+# For the HtmlReportCreator, the only properties available are
+# (the location of the css files is relative to the classpath):
+com.athaydes.spockframework.report.internal.HtmlReportCreator.featureReportCss=spock-feature-report.css
+com.athaydes.spockframework.report.internal.HtmlReportCreator.summaryReportCss=spock-summary-report.css
+com.athaydes.spockframework.report.internal.HtmlReportCreator.printThrowableStackTrace=false
+com.athaydes.spockframework.report.internal.HtmlReportCreator.inlineCss=true
+com.athaydes.spockframework.report.internal.HtmlReportCreator.enabled=true
+# options are: "class_name_and_title", "class_name", "title"
+com.athaydes.spockframework.report.internal.HtmlReportCreator.specSummaryNameOption=class_name_and_title
+
+# exclude Specs Table of Contents
+com.athaydes.spockframework.report.internal.HtmlReportCreator.excludeToc=false
+
+# Output directory (where the spock reports will be created) - relative to working directory
+com.athaydes.spockframework.report.outputDir=target/spock-reports
+
+# Output directory where to store the aggregated JSON report (used to support parallel builds)
+com.athaydes.spockframework.report.aggregatedJsonReportDir=
+
+# If set to true, hides blocks which do not have any description
+com.athaydes.spockframework.report.hideEmptyBlocks=false
+
+# Set the name of the project under test so it can be displayed in the report
+com.athaydes.spockframework.report.projectName=
+
+# Set the version of the project under test so it can be displayed in the report
+com.athaydes.spockframework.report.projectVersion=Unknown
+
+# Show the source code for each block
+com.athaydes.spockframework.report.showCodeBlocks=false
+
+# Set the root location of the Spock test source code (only used if showCodeBlocks is 'true')
+com.athaydes.spockframework.report.testSourceRoots=src/test/groovy
+
+# Set properties specific to the TemplateReportCreator
+com.athaydes.spockframework.report.template.TemplateReportCreator.specTemplateFile=/templateReportCreator/spec-template.md
+com.athaydes.spockframework.report.template.TemplateReportCreator.reportFileExtension=md
+com.athaydes.spockframework.report.template.TemplateReportCreator.summaryTemplateFile=/templateReportCreator/summary-template.md
+com.athaydes.spockframework.report.template.TemplateReportCreator.summaryFileName=summary.md
+com.athaydes.spockframework.report.template.TemplateReportCreator.enabled=true
\ No newline at end of file
diff --git a/plc4j/protocols/test/pom.xml b/plc4j/protocols/test/pom.xml
index eb761f4..d415346 100644
--- a/plc4j/protocols/test/pom.xml
+++ b/plc4j/protocols/test/pom.xml
@@ -44,11 +44,6 @@
     </dependency>
     <dependency>
       <groupId>org.apache.commons</groupId>
-      <artifactId>commons-text</artifactId>
-      <version>1.4</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.commons</groupId>
       <artifactId>commons-lang3</artifactId>
     </dependency>
   </dependencies>
diff --git a/plc4j/protocols/test/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/protocols/test/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
index f145b55..ebff4aa 100644
--- a/plc4j/protocols/test/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
+++ b/plc4j/protocols/test/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
@@ -16,5 +16,4 @@
 # specific language governing permissions and limitations
 # under the License.
 #
-org.apache.plc4x.java.test.TestPlcDriver
 org.apache.plc4x.java.mock.PlcMockDriver
diff --git a/plc4j/utils/connection-pool/pom.xml b/plc4j/utils/connection-pool/pom.xml
index a7ae646..049d960 100644
--- a/plc4j/utils/connection-pool/pom.xml
+++ b/plc4j/utils/connection-pool/pom.xml
@@ -38,11 +38,6 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-     <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
     <dependency>
       <groupId>org.apache.commons</groupId>
       <artifactId>commons-pool2</artifactId>
diff --git a/plc4j/utils/opm/pom.xml b/plc4j/utils/opm/pom.xml
index 2912674..4e25bf7 100644
--- a/plc4j/utils/opm/pom.xml
+++ b/plc4j/utils/opm/pom.xml
@@ -40,11 +40,6 @@
       <artifactId>plc4j-api</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <!-- Utils -->
     <dependency>


[incubator-plc4x] 05/05: - Split up the modbus driver into driver and protocol

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

jfeinauer pushed a commit to branch alias-registry-for-opm
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 8492c2198d55d167dc679bb22e86b30718b5a0a6
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Nov 23 09:50:22 2018 +0100

    - Split up the modbus driver into driver and protocol
---
 .../apache/plc4x/java/modbus/ModbusPlcDriver.java  | 34 +++++++++++-----------
 .../modbus/connection/BaseModbusPlcConnection.java | 30 +++++++++----------
 2 files changed, 32 insertions(+), 32 deletions(-)

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
index 187aa10..97a9a9f 100644
--- 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
@@ -1,21 +1,21 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
-
-  http://www.apache.org/licenses/LICENSE-2.0
-
-Unless required by applicable law or agreed to in writing,
-software distributed under the License is distributed on an
-"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
-KIND, either express or implied.  See the License for the
-specific language governing permissions and limitations
-under the License.
-*/
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
 package org.apache.plc4x.java.modbus;
 
 import org.apache.commons.lang3.StringUtils;
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
index cd85021..713acd5 100644
--- 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
@@ -1,21 +1,21 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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
+     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.
-*/
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ 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;


[incubator-plc4x] 02/05: [OPM] Refactoring + Added timeout / cache to PlcField.java Annotation / added the functionality of the annotation.

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

jfeinauer pushed a commit to branch alias-registry-for-opm
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit c5fbff8582e9147dc5cbc2d61c2dac6a99d05f0b
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Fri Nov 23 00:55:23 2018 +0100

    [OPM] Refactoring + Added timeout / cache to PlcField.java Annotation / added the functionality of the annotation.
---
 .../org/apache/plc4x/java/opm/AliasRegistry.java   |   7 +-
 .../java/org/apache/plc4x/java/opm/OpmUtils.java   |  15 ++-
 .../plc4x/java/opm/PlcEntityInterceptor.java       |  85 +++++++++++----
 .../apache/plc4x/java/opm/PlcEntityManager.java    |  13 ++-
 .../java/org/apache/plc4x/java/opm/PlcField.java   |   2 -
 .../apache/plc4x/java/opm/ConnectedEntityTest.java | 117 +++++++++++++++++++++
 6 files changed, 197 insertions(+), 42 deletions(-)

diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java
index 943a98f..b980fb1 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java
@@ -36,18 +36,13 @@ public interface AliasRegistry {
     boolean canResolve(String connection, String alias);
 
     /**
-     * Resolves an alias to a valid PLC Field Adress
-     * @param alias
-     * @return
+     * Resolves an alias to a valid PLC Field Address
      */
     String resolve(String alias);
 
     /**
      * Resolves an alias to a valid PLC Field based on the connection.
      * This means that the same alias could be resolved to different Addresses for different connections.
-     * @param connection
-     * @param alias
-     * @return
      */
     String resolve(String connection, String alias);
 
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java
index 0791a93..61dfc7c 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java
@@ -25,10 +25,10 @@ import java.util.regex.Pattern;
 /**
  * Utility methods for usage with OPM.
  */
-public final class OpmUtils {
+final class OpmUtils {
 
-    public static final String ADDRESS = "address";
-    static final Pattern pattern = Pattern.compile("^\\$\\{(?<" + ADDRESS + ">.*)\\}$");
+    private static final String ADDRESS = "address";
+    static final Pattern pattern = Pattern.compile("^\\$\\{(?<" + ADDRESS + ">.*)}$");
 
     private OpmUtils() {
         // Util class
@@ -68,12 +68,9 @@ public final class OpmUtils {
     /**
      * Checks whether a given String is a valid OPM Expression, this means
      * either an Address or an alias ${xxx}.
-     *
-     * @param s
-     * @return
      */
     static boolean isValidExpression(String s) {
-        return (s.startsWith("$") && pattern.matcher(s).matches()) || s.startsWith("$") == false;
+        return !s.startsWith("$") || pattern.matcher(s).matches();
     }
 
     static boolean isAlias(String s) {
@@ -82,8 +79,8 @@ public final class OpmUtils {
 
     static String getAlias(String s) {
         Matcher matcher = pattern.matcher(s);
-        if (matcher.matches() == false) {
-            throw new IllegalArgumentException("Invalid Syntax, no Alias found in String '" + s + "'. Synatx is ${xxx}");
+        if (!matcher.matches()) {
+            throw new IllegalArgumentException("Invalid Syntax, no Alias found in String '" + s + "'. Syntax is ${xxx}");
         }
         return matcher.group(ADDRESS);
     }
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
index 2e41155..9f99378 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
@@ -38,10 +38,13 @@ import java.lang.reflect.Field;
 import java.lang.reflect.Method;
 import java.math.BigDecimal;
 import java.math.BigInteger;
+import java.time.Instant;
 import java.time.LocalDate;
 import java.time.LocalDateTime;
 import java.time.LocalTime;
+import java.time.temporal.ChronoUnit;
 import java.util.Arrays;
+import java.util.Map;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeUnit;
@@ -49,7 +52,7 @@ import java.util.concurrent.TimeoutException;
 
 /**
  * Interceptor for dynamic functionality of @{@link PlcEntity}.
- * Basically, its {@link #intercept(Object, Method, Callable, String, PlcDriverManager, AliasRegistry)} method is called for each
+ * Basically, its {@link #intercept(Object, Method, Callable, String, PlcDriverManager, AliasRegistry, Map)} method is called for each
  * invocation of a method on a connected @{@link PlcEntity} and does then the dynamic part.
  *
  * For those not too familiar with the JVM's dispatch on can roughly imagine the intercept method being a "regular"
@@ -71,9 +74,9 @@ public class PlcEntityInterceptor {
     /**
      * Basic Intersector for all methods on the proxy object.
      * It checks if the invoked method is a getter and if so, only retrieves the requested field, forwarding to
-     * the {@link #fetchValueForGetter(Method, PlcDriverManager, String, AliasRegistry)} method.
+     * the {@link #fetchValueForGetter(Object, Method, PlcDriverManager, String, AliasRegistry, Map)} method.
      * <p>
-     * If the field is no getter, then all fields are refreshed by calling {@link #refetchAllFields(Object, PlcDriverManager, String, AliasRegistry)}
+     * If the field is no getter, then all fields are refreshed by calling {@link #refetchAllFields(Object, PlcDriverManager, String, AliasRegistry, Map)}
      * and then, the method is invoked.
      *
      * @param proxy    Object to intercept
@@ -89,7 +92,8 @@ public class PlcEntityInterceptor {
     public static Object intercept(@This Object proxy, @Origin Method method, @SuperCall Callable<?> callable,
                                    @FieldValue(PlcEntityManager.PLC_ADDRESS_FIELD_NAME) String address,
                                    @FieldValue(PlcEntityManager.DRIVER_MANAGER_FIELD_NAME) PlcDriverManager driverManager,
-                                   @FieldValue(PlcEntityManager.ALIAS_REGISTRY) AliasRegistry registry) throws OPMException {
+                                   @FieldValue(PlcEntityManager.ALIAS_REGISTRY) AliasRegistry registry,
+                                   @FieldValue(PlcEntityManager.LAST_FETCHED) Map<String, Instant> lastFetched) throws OPMException {
         LOGGER.trace("Invoked method {} on connected PlcEntity {}", method.getName(), method.getDeclaringClass().getName());
 
         // If "detached" (i.e. _driverManager is null) simply forward the call
@@ -109,7 +113,8 @@ public class PlcEntityInterceptor {
             // Fetch single value
             LOGGER.trace("Invoked method {} is getter, trying to find annotated field and return requested value",
                 method.getName());
-            return fetchValueForGetter(method, driverManager, address, registry);
+
+            return fetchValueForGetter(proxy, method, driverManager, address, registry, lastFetched);
         }
 
         if (method.getName().startsWith("is") && (method.getReturnType() == boolean.class || method.getReturnType() == Boolean.class)) {
@@ -119,13 +124,13 @@ public class PlcEntityInterceptor {
             // Fetch single value
             LOGGER.trace("Invoked method {} is boolean flag method, trying to find annotated field and return requested value",
                 method.getName());
-            return fetchValueForIsGetter(method, driverManager, address, registry);
+            return fetchValueForIsGetter(proxy, method, driverManager, address, registry, lastFetched);
         }
 
         // Fetch all values, than invoke method
         try {
             LOGGER.trace("Invoked method is no getter, refetch all fields and invoke method {} then", method.getName());
-            refetchAllFields(proxy, driverManager, address, registry);
+            refetchAllFields(proxy, driverManager, address, registry, lastFetched);
             return callable.call();
         } catch (Exception e) {
             throw new OPMException("Unable to forward invocation " + method.getName() + " on connected PlcEntity", e);
@@ -136,12 +141,13 @@ public class PlcEntityInterceptor {
      * Renews all values of all Fields that are annotated with {@link PlcEntity}.
      *
      * @param proxy Object to refresh the fields on.
-     * @param driverManager
-     * @param registry
+     * @param driverManager Driver Manager to use
+     * @param registry AliasRegistry to use
+     * @param lastFetched
      * @throws OPMException on various errors.
      */
     @SuppressWarnings("squid:S1141") // Nested try blocks readability is okay, move to other method makes it imho worse
-    static void refetchAllFields(Object proxy, PlcDriverManager driverManager, String address, AliasRegistry registry) throws OPMException {
+    static void refetchAllFields(Object proxy, PlcDriverManager driverManager, String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
         // Don't log o here as this would cause a second request against a plc so don't touch it, or if you log be aware of that
         Class<?> entityClass = proxy.getClass().getSuperclass();
         LOGGER.trace("Refetching all fields on proxy object of class " + entityClass);
@@ -157,9 +163,10 @@ public class PlcEntityInterceptor {
 
             Arrays.stream(entityClass.getDeclaredFields())
                 .filter(field -> field.isAnnotationPresent(PlcField.class))
+                .filter(field -> needsToBeFetched(lastFetched, field))
                 .forEach(field ->
                     requestBuilder.addItem(
-                        field.getDeclaringClass().getName() + "." + field.getName(),
+                        getFqn(field),
                         OpmUtils.getOrResolveAddress(registry, field.getAnnotation(PlcField.class).value())
                     )
                 );
@@ -172,6 +179,9 @@ public class PlcEntityInterceptor {
 
             // Fill all requested fields
             for (String fieldName : response.getFieldNames()) {
+                // Fill into Cache
+                lastFetched.put(fieldName, Instant.now());
+
                 LOGGER.trace("Value for field {}  is {}", fieldName, response.getObject(fieldName));
                 String clazzFieldName = StringUtils.substringAfterLast(fieldName, ".");
                 try {
@@ -187,16 +197,33 @@ public class PlcEntityInterceptor {
         }
     }
 
-    private static Object fetchValueForIsGetter(Method m, PlcDriverManager driverManager, String address, AliasRegistry registry) throws OPMException {
-        return fetchValueForGetter(m, 2, driverManager, address, registry);
+    private static String getFqn(Field field) {
+        return field.getDeclaringClass().getName() + "." + field.getName();
+    }
+
+    /**
+     * Checks if a field needs to be refetched, i.e., the cached values are too old.
+     */
+    private static boolean needsToBeFetched(Map<String, Instant> lastFetched, Field field) {
+        long cacheDurationMillis = field.getAnnotation(PlcField.class).cacheDurationMillis();
+        String fqn = getFqn(field);
+        if (lastFetched.containsKey(fqn)) {
+            Instant last = lastFetched.get(fqn);
+            return Instant.now().minus(cacheDurationMillis, ChronoUnit.MILLIS).isAfter(last);
+        }
+        return true;
+    }
+
+    private static Object fetchValueForIsGetter(Object proxy, Method m, PlcDriverManager driverManager, String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
+        return fetchValueForGetter(proxy, m, 2, driverManager, address, registry, lastFetched);
     }
 
-    private static Object fetchValueForGetter(Method m, PlcDriverManager driverManager, String address, AliasRegistry registry) throws OPMException {
-        return fetchValueForGetter(m, 3, driverManager, address, registry);
+    private static Object fetchValueForGetter(Object proxy, Method m, PlcDriverManager driverManager, String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
+        return fetchValueForGetter(proxy, m, 3, driverManager, address, registry, lastFetched);
     }
 
-    private static Object fetchValueForGetter(Method m, int prefixLength, PlcDriverManager driverManager,
-                                              String address, AliasRegistry registry) throws OPMException {
+    private static Object fetchValueForGetter(Object proxy, Method m, int prefixLength, PlcDriverManager driverManager,
+                                              String address, AliasRegistry registry, Map<String, Instant> lastFetched) throws OPMException {
         String s = m.getName().substring(prefixLength);
         // First char to lower
         String variable = s.substring(0, 1).toLowerCase().concat(s.substring(1));
@@ -209,18 +236,32 @@ public class PlcEntityInterceptor {
         } catch (NoSuchFieldException e) {
             throw new OPMException("Unable to identify field with name '" + variable + "' for call to '" + m.getName() + "'", e);
         }
+
+        // Use Fully qualified Name as field index
+        String fqn = getFqn(field);
+
+        // Check if cache is still active
+        if (!needsToBeFetched(lastFetched, field)) {
+            // Return the current value
+            try {
+                field.setAccessible(true);
+                return field.get(proxy);
+            } catch (IllegalAccessException e) {
+                throw new OPMException("Unable to restore cached (previous) value for field '" + field.getName() + "'", e);
+            }
+        }
         try (PlcConnection connection = driverManager.getConnection(address)) {
             // Catch the exception, if no reader present (see below)
 
-            // Use Fully qualified Name as field index
-            String fqn = field.getDeclaringClass().getName() + "." + field.getName();
-
             PlcReadRequest request = connection.readRequestBuilder()
                 .addItem(fqn, OpmUtils.getOrResolveAddress(registry, annotation.value()))
                 .build();
 
             PlcReadResponse response = getPlcReadResponse(request);
 
+            // Fill into Cache
+            lastFetched.put(field.getName(), Instant.now());
+
             return getTyped(m.getReturnType(), response, fqn);
         } catch (ClassCastException e) {
             throw new OPMException("Unable to return response as suitable type", e);
@@ -238,8 +279,8 @@ public class PlcEntityInterceptor {
      * @param response        Response to fetch the response from
      * @param targetFieldName Name of the field in the object
      * @param sourceFieldName Name of the field in the response
-     * @throws NoSuchFieldException
-     * @throws IllegalAccessException
+     * @throws NoSuchFieldException If a field is not present in entity
+     * @throws IllegalAccessException If a field in the entity cannot be accessed
      */
     static void setField(Class<?> clazz, Object o, PlcReadResponse response, String targetFieldName, String sourceFieldName) throws NoSuchFieldException, IllegalAccessException {
         LOGGER.debug("setField on clazz: {}, Object: {}, response: {}, targetFieldName: {}, sourceFieldName:{} ", clazz, o, response, targetFieldName, sourceFieldName);
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
index a27fed7..81ebbea 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
@@ -35,10 +35,12 @@ import org.slf4j.LoggerFactory;
 
 import java.lang.reflect.InvocationTargetException;
 import java.lang.reflect.Method;
+import java.time.Instant;
 import java.util.Arrays;
+import java.util.HashMap;
+import java.util.Map;
 import java.util.concurrent.Callable;
 
-import static net.bytebuddy.matcher.ElementMatchers.any;
 import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy;
 import static net.bytebuddy.matcher.ElementMatchers.not;
 
@@ -74,7 +76,8 @@ import static net.bytebuddy.matcher.ElementMatchers.not;
  * A connected @{@link PlcEntity} can be disconnected calling {@link #disconnect(Object)}, then it behaves like the
  * regular Pojo it was before.
  * <p>
- * All invocations on the getters are forwarded to the {@link PlcEntityInterceptor#intercept(Object, Method, Callable, String, PlcDriverManager, AliasRegistry)}
+ * All invocations on the getters are forwarded to the
+ * {@link PlcEntityInterceptor#intercept(Object, Method, Callable, String, PlcDriverManager, AliasRegistry, Map)}
  * method.
  */
 public class PlcEntityManager {
@@ -84,6 +87,7 @@ public class PlcEntityManager {
     public static final String PLC_ADDRESS_FIELD_NAME = "_plcAddress";
     static final String DRIVER_MANAGER_FIELD_NAME = "_driverManager";
     static final String ALIAS_REGISTRY = "_aliasRegistry";
+    public static final String LAST_FETCHED = "_lastFetched";
 
     private final PlcDriverManager driverManager;
     private final SimpleAliasRegistry registry;
@@ -164,6 +168,7 @@ public class PlcEntityManager {
                 .defineField(PLC_ADDRESS_FIELD_NAME, String.class, Visibility.PRIVATE)
                 .defineField(DRIVER_MANAGER_FIELD_NAME, PlcDriverManager.class, Visibility.PRIVATE)
                 .defineField(ALIAS_REGISTRY, AliasRegistry.class, Visibility.PRIVATE)
+                .defineField(LAST_FETCHED, Map.class, Visibility.PRIVATE)
                 .method(not(isDeclaredBy(Object.class))).intercept(MethodDelegation.to(PlcEntityInterceptor.class))
                 .make()
                 .load(Thread.currentThread().getContextClassLoader())
@@ -174,9 +179,11 @@ public class PlcEntityManager {
             FieldUtils.writeDeclaredField(instance, PLC_ADDRESS_FIELD_NAME, address, true);
             FieldUtils.writeDeclaredField(instance, DRIVER_MANAGER_FIELD_NAME, driverManager, true);
             FieldUtils.writeDeclaredField(instance, ALIAS_REGISTRY, registry, true);
+            Map<String, Instant> lastFetched = new HashMap<>();
+            FieldUtils.writeDeclaredField(instance, LAST_FETCHED, lastFetched, true);
 
             // Initially fetch all values
-            PlcEntityInterceptor.refetchAllFields(instance, driverManager, address, registry);
+            PlcEntityInterceptor.refetchAllFields(instance, driverManager, address, registry, lastFetched);
 
             return instance;
         } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException | IllegalAccessError e) {
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcField.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcField.java
index cd0474e..f6b499d 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcField.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcField.java
@@ -31,7 +31,5 @@ import java.lang.annotation.Target;
 @Target({ElementType.METHOD, ElementType.FIELD})
 public @interface PlcField {
     String value();
-    // TODO enable both annotation values in the Interceptor / Entitymanager
     long cacheDurationMillis() default 1000;
-    boolean throwOnUnavailable() default true;
 }
diff --git a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java
new file mode 100644
index 0000000..0be09df
--- /dev/null
+++ b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java
@@ -0,0 +1,117 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.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.opm;
+
+import org.apache.commons.lang3.tuple.Pair;
+import org.apache.plc4x.java.PlcDriverManager;
+import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
+import org.apache.plc4x.java.api.types.PlcResponseCode;
+import org.apache.plc4x.java.base.messages.items.DefaultStringFieldItem;
+import org.apache.plc4x.java.mock.MockDevice;
+import org.apache.plc4x.java.mock.PlcMockConnection;
+import org.junit.Test;
+import org.mockito.Mockito;
+
+import java.util.stream.IntStream;
+
+import static org.junit.Assert.assertEquals;
+import static org.mockito.ArgumentMatchers.any;
+import static org.mockito.Mockito.*;
+
+/**
+ * Tests for Connected Entities.
+ */
+public class ConnectedEntityTest {
+
+    @Test
+    public void useCache() throws PlcConnectionException, OPMException {
+        // Mock
+        PlcDriverManager driverManager = new PlcDriverManager();
+        PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:cached");
+        MockDevice mock = Mockito.mock(MockDevice.class);
+        when(mock.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultStringFieldItem("hallo")));
+        connection.setDevice(mock);
+        PlcEntityManager entityManager = new PlcEntityManager(driverManager);
+
+        // Trigger a fetch
+        CachingEntity entity = entityManager.connect(CachingEntity.class, "mock:cached");
+        // Trigger second fetch
+        assertEquals("hallo", entity.getField());
+
+        verify(mock, timeout(1_000).times(1)).read(any());
+    }
+
+    @Test
+    public void useCache_timeout_refetches() throws PlcConnectionException, OPMException, InterruptedException {
+        // Mock
+        PlcDriverManager driverManager = new PlcDriverManager();
+        PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:cached");
+        MockDevice mock = Mockito.mock(MockDevice.class);
+        when(mock.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultStringFieldItem("hallo")));
+        connection.setDevice(mock);
+        PlcEntityManager entityManager = new PlcEntityManager(driverManager);
+
+        // Trigger a fetch
+        CachingEntity entity = entityManager.connect(CachingEntity.class, "mock:cached");
+        Thread.sleep(500);
+        // Trigger second fetch
+        assertEquals("hallo", entity.getField());
+
+        verify(mock, timeout(1_000).times(2)).read(any());
+    }
+
+    @Test
+    public void cache_manyRequests_onlyOneToPlc() throws PlcConnectionException, OPMException {
+        // Mock
+        PlcDriverManager driverManager = new PlcDriverManager();
+        PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:cached");
+        MockDevice mock = Mockito.mock(MockDevice.class);
+        when(mock.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultStringFieldItem("hallo")));
+        connection.setDevice(mock);
+        PlcEntityManager entityManager = new PlcEntityManager(driverManager);
+
+        // Trigger a fetch
+        CachingEntity entity = entityManager.connect(CachingEntity.class, "mock:cached");
+        // Trigger Many Fetches via getter
+        IntStream.range(1,100).forEach(i -> entity.getField());
+        IntStream.range(1,100).forEach(i -> entity.dummyMethod());
+
+        verify(mock, timeout(1_000).times(1)).read(any());
+    }
+
+    @PlcEntity
+    public static class CachingEntity {
+
+        @PlcField(value = "address", cacheDurationMillis = 100)
+        private String field;
+
+        public CachingEntity() {
+            // For OPM
+        }
+
+        public String getField() {
+            return field;
+        }
+
+        public void dummyMethod() {
+            // do nothing
+        }
+    }
+}
\ No newline at end of file


[incubator-plc4x] 01/05: [OPM] Added AliasRegistry and SimpleAliasRegistry as default impl.

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

jfeinauer pushed a commit to branch alias-registry-for-opm
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 1f8f1cb05dce663473169f8c3ec4e281212a3c97
Author: Julian Feinauer <j....@pragmaticminds.de>
AuthorDate: Thu Nov 22 16:41:03 2018 +0100

    [OPM] Added AliasRegistry and SimpleAliasRegistry as default impl.
---
 .../apache/plc4x/java/mock/PlcMockConnection.java  |  19 ++--
 .../org/apache/plc4x/java/opm/AliasRegistry.java   |  54 +++++++++++
 .../java/org/apache/plc4x/java/opm/OpmUtils.java   |  46 ++++++++++
 .../plc4x/java/opm/PlcEntityInterceptor.java       |  38 ++++----
 .../apache/plc4x/java/opm/PlcEntityManager.java    |  27 ++++--
 .../apache/plc4x/java/opm/SimpleAliasRegistry.java |  74 +++++++++++++++
 .../org/apache/plc4x/java/opm/OpmUtilsTest.java    |  64 +++++++++++++
 .../plc4x/java/opm/PlcEntityInterceptorTest.java   |  27 ++++--
 .../plc4x/java/opm/PlcEntityManagerTest.java       | 100 ++++++++++++++++++++-
 .../plc4x/java/opm/SimpleAliasRegistryTest.java    |  76 ++++++++++++++++
 plc4j/utils/opm/src/test/resources/logback.xml     |   2 +-
 11 files changed, 487 insertions(+), 40 deletions(-)

diff --git a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
index 5bf5941..cdd3448 100644
--- a/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
+++ b/plc4j/protocols/test/src/main/java/org/apache/plc4x/java/mock/PlcMockConnection.java
@@ -30,6 +30,8 @@ import org.apache.plc4x.java.base.messages.DefaultPlcReadRequest;
 import org.apache.plc4x.java.base.messages.DefaultPlcReadResponse;
 import org.apache.plc4x.java.base.messages.PlcReader;
 import org.apache.plc4x.java.base.messages.items.BaseDefaultFieldItem;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 import java.util.Map;
 import java.util.concurrent.CompletableFuture;
@@ -39,6 +41,8 @@ import java.util.stream.Collectors;
 
 public class PlcMockConnection implements PlcConnection, PlcReader {
 
+    private static final Logger logger = LoggerFactory.getLogger(PlcMockConnection.class);
+
     private final String name;
     private final PlcAuthentication authentication;
 
@@ -55,6 +59,7 @@ public class PlcMockConnection implements PlcConnection, PlcReader {
     }
 
     public void setDevice(MockDevice device) {
+        logger.info("Set Mock Devie on Mock Connection " + this + " with device " + device);
         this.device = device;
     }
 
@@ -65,14 +70,12 @@ public class PlcMockConnection implements PlcConnection, PlcReader {
 
     @Override
     public boolean isConnected() {
-        // is connected if a device is set
-        return device != null;
+        return true;
     }
 
     @Override
     public void close() {
-        // unset device
-        this.device = null;
+        logger.info("Closing MockConnection with device " + device);
     }
 
     @Override
@@ -103,10 +106,16 @@ public class PlcMockConnection implements PlcConnection, PlcReader {
     @Override
     public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) {
         return CompletableFuture.supplyAsync(new Supplier<PlcReadResponse>() {
+
             @Override
             public PlcReadResponse get() {
+                logger.debug("Sending read request to MockDevice");
                 Map<String, Pair<PlcResponseCode, BaseDefaultFieldItem>> response = readRequest.getFieldNames().stream()
-                    .collect(Collectors.toMap(Function.identity(), name -> device.read(((MockField) readRequest.getField(name)).getFieldQuery())));
+                    .collect(Collectors.toMap(
+                        Function.identity(),
+                        name -> device.read(((MockField) readRequest.getField(name)).getFieldQuery())
+                        )
+                    );
                 return new DefaultPlcReadResponse((DefaultPlcReadRequest)readRequest, response);
             }
         });
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java
new file mode 100644
index 0000000..943a98f
--- /dev/null
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java
@@ -0,0 +1,54 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.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.opm;
+
+/**
+ * This interface can be used to give "aliases" for field names in {@link PlcEntity}s {@link PlcField} strings.
+ * These are then resolved.
+ */
+public interface AliasRegistry {
+
+    /**
+     * Checks if this registry can resolve this alias
+     */
+    boolean canResolve(String alias);
+
+    /**
+     * Checks if this registry can resolve this alias for the given connection.
+     */
+    boolean canResolve(String connection, String alias);
+
+    /**
+     * Resolves an alias to a valid PLC Field Adress
+     * @param alias
+     * @return
+     */
+    String resolve(String alias);
+
+    /**
+     * Resolves an alias to a valid PLC Field based on the connection.
+     * This means that the same alias could be resolved to different Addresses for different connections.
+     * @param connection
+     * @param alias
+     * @return
+     */
+    String resolve(String connection, String alias);
+
+}
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java
index 29ede9c..0791a93 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/OpmUtils.java
@@ -19,11 +19,17 @@
 
 package org.apache.plc4x.java.opm;
 
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
 /**
  * Utility methods for usage with OPM.
  */
 public final class OpmUtils {
 
+    public static final String ADDRESS = "address";
+    static final Pattern pattern = Pattern.compile("^\\$\\{(?<" + ADDRESS + ">.*)\\}$");
+
     private OpmUtils() {
         // Util class
     }
@@ -42,4 +48,44 @@ public final class OpmUtils {
         return annotation;
     }
 
+    static String getOrResolveAddress(AliasRegistry registry, String addressString) {
+        if (!OpmUtils.isValidExpression(addressString)) {
+            throw new IllegalArgumentException("Invalid Syntax, either use field address (no starting $) " +
+                "or an alias with Syntax ${xxx}. But given was '" + addressString + "'");
+        }
+        if (OpmUtils.isAlias(addressString)) {
+            String alias = OpmUtils.getAlias(addressString);
+            if (registry.canResolve(alias)) {
+                return registry.resolve(alias);
+            } else {
+                throw new IllegalArgumentException("Unable to resolve Alias '" + alias + "' in Schema Registry");
+            }
+        } else {
+            return addressString;
+        }
+    }
+
+    /**
+     * Checks whether a given String is a valid OPM Expression, this means
+     * either an Address or an alias ${xxx}.
+     *
+     * @param s
+     * @return
+     */
+    static boolean isValidExpression(String s) {
+        return (s.startsWith("$") && pattern.matcher(s).matches()) || s.startsWith("$") == false;
+    }
+
+    static boolean isAlias(String s) {
+        return s.startsWith("$") && pattern.matcher(s).matches();
+    }
+
+    static String getAlias(String s) {
+        Matcher matcher = pattern.matcher(s);
+        if (matcher.matches() == false) {
+            throw new IllegalArgumentException("Invalid Syntax, no Alias found in String '" + s + "'. Synatx is ${xxx}");
+        }
+        return matcher.group(ADDRESS);
+    }
+
 }
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
index 00c0fe0..2e41155 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityInterceptor.java
@@ -49,7 +49,7 @@ import java.util.concurrent.TimeoutException;
 
 /**
  * Interceptor for dynamic functionality of @{@link PlcEntity}.
- * Basically, its {@link #intercept(Object, Method, Callable, String, PlcDriverManager)} method is called for each
+ * Basically, its {@link #intercept(Object, Method, Callable, String, PlcDriverManager, AliasRegistry)} method is called for each
  * invocation of a method on a connected @{@link PlcEntity} and does then the dynamic part.
  *
  * For those not too familiar with the JVM's dispatch on can roughly imagine the intercept method being a "regular"
@@ -71,9 +71,9 @@ public class PlcEntityInterceptor {
     /**
      * Basic Intersector for all methods on the proxy object.
      * It checks if the invoked method is a getter and if so, only retrieves the requested field, forwarding to
-     * the {@link #fetchValueForGetter(Method, PlcDriverManager,String)} method.
+     * the {@link #fetchValueForGetter(Method, PlcDriverManager, String, AliasRegistry)} method.
      * <p>
-     * If the field is no getter, then all fields are refreshed by calling {@link #refetchAllFields(Object, PlcDriverManager, String)}
+     * If the field is no getter, then all fields are refreshed by calling {@link #refetchAllFields(Object, PlcDriverManager, String, AliasRegistry)}
      * and then, the method is invoked.
      *
      * @param proxy    Object to intercept
@@ -87,8 +87,9 @@ public class PlcEntityInterceptor {
     @SuppressWarnings("unused")
     @RuntimeType
     public static Object intercept(@This Object proxy, @Origin Method method, @SuperCall Callable<?> callable,
-           @FieldValue(PlcEntityManager.PLC_ADDRESS_FIELD_NAME) String address,
-           @FieldValue(PlcEntityManager.DRIVER_MANAGER_FIELD_NAME) PlcDriverManager driverManager) throws OPMException {
+                                   @FieldValue(PlcEntityManager.PLC_ADDRESS_FIELD_NAME) String address,
+                                   @FieldValue(PlcEntityManager.DRIVER_MANAGER_FIELD_NAME) PlcDriverManager driverManager,
+                                   @FieldValue(PlcEntityManager.ALIAS_REGISTRY) AliasRegistry registry) throws OPMException {
         LOGGER.trace("Invoked method {} on connected PlcEntity {}", method.getName(), method.getDeclaringClass().getName());
 
         // If "detached" (i.e. _driverManager is null) simply forward the call
@@ -108,7 +109,7 @@ public class PlcEntityInterceptor {
             // Fetch single value
             LOGGER.trace("Invoked method {} is getter, trying to find annotated field and return requested value",
                 method.getName());
-            return fetchValueForGetter(method, driverManager, address);
+            return fetchValueForGetter(method, driverManager, address, registry);
         }
 
         if (method.getName().startsWith("is") && (method.getReturnType() == boolean.class || method.getReturnType() == Boolean.class)) {
@@ -118,13 +119,13 @@ public class PlcEntityInterceptor {
             // Fetch single value
             LOGGER.trace("Invoked method {} is boolean flag method, trying to find annotated field and return requested value",
                 method.getName());
-            return fetchValueForIsGetter(method, driverManager, address);
+            return fetchValueForIsGetter(method, driverManager, address, registry);
         }
 
         // Fetch all values, than invoke method
         try {
             LOGGER.trace("Invoked method is no getter, refetch all fields and invoke method {} then", method.getName());
-            refetchAllFields(proxy, driverManager, address);
+            refetchAllFields(proxy, driverManager, address, registry);
             return callable.call();
         } catch (Exception e) {
             throw new OPMException("Unable to forward invocation " + method.getName() + " on connected PlcEntity", e);
@@ -136,12 +137,14 @@ public class PlcEntityInterceptor {
      *
      * @param proxy Object to refresh the fields on.
      * @param driverManager
+     * @param registry
      * @throws OPMException on various errors.
      */
     @SuppressWarnings("squid:S1141") // Nested try blocks readability is okay, move to other method makes it imho worse
-    static void refetchAllFields(Object proxy, PlcDriverManager driverManager, String address) throws OPMException {
+    static void refetchAllFields(Object proxy, PlcDriverManager driverManager, String address, AliasRegistry registry) throws OPMException {
         // Don't log o here as this would cause a second request against a plc so don't touch it, or if you log be aware of that
         Class<?> entityClass = proxy.getClass().getSuperclass();
+        LOGGER.trace("Refetching all fields on proxy object of class " + entityClass);
         PlcEntity plcEntity = entityClass.getAnnotation(PlcEntity.class);
         if (plcEntity == null) {
             throw new OPMException("Non PlcEntity supplied");
@@ -157,12 +160,14 @@ public class PlcEntityInterceptor {
                 .forEach(field ->
                     requestBuilder.addItem(
                         field.getDeclaringClass().getName() + "." + field.getName(),
-                        field.getAnnotation(PlcField.class).value()
+                        OpmUtils.getOrResolveAddress(registry, field.getAnnotation(PlcField.class).value())
                     )
                 );
 
             PlcReadRequest request = requestBuilder.build();
 
+            LOGGER.trace("Request for refetch of " + entityClass + " was build and is " + request.toString());
+
             PlcReadResponse response = getPlcReadResponse(request);
 
             // Fill all requested fields
@@ -182,15 +187,16 @@ public class PlcEntityInterceptor {
         }
     }
 
-    private static Object fetchValueForIsGetter(Method m, PlcDriverManager driverManager, String address) throws OPMException {
-        return fetchValueForGetter(m, 2, driverManager, address);
+    private static Object fetchValueForIsGetter(Method m, PlcDriverManager driverManager, String address, AliasRegistry registry) throws OPMException {
+        return fetchValueForGetter(m, 2, driverManager, address, registry);
     }
 
-    private static Object fetchValueForGetter(Method m, PlcDriverManager driverManager, String address) throws OPMException {
-        return fetchValueForGetter(m, 3, driverManager, address);
+    private static Object fetchValueForGetter(Method m, PlcDriverManager driverManager, String address, AliasRegistry registry) throws OPMException {
+        return fetchValueForGetter(m, 3, driverManager, address, registry);
     }
 
-    private static Object fetchValueForGetter(Method m, int prefixLength, PlcDriverManager driverManager, String address) throws OPMException {
+    private static Object fetchValueForGetter(Method m, int prefixLength, PlcDriverManager driverManager,
+                                              String address, AliasRegistry registry) throws OPMException {
         String s = m.getName().substring(prefixLength);
         // First char to lower
         String variable = s.substring(0, 1).toLowerCase().concat(s.substring(1));
@@ -210,7 +216,7 @@ public class PlcEntityInterceptor {
             String fqn = field.getDeclaringClass().getName() + "." + field.getName();
 
             PlcReadRequest request = connection.readRequestBuilder()
-                .addItem(fqn, annotation.value())
+                .addItem(fqn, OpmUtils.getOrResolveAddress(registry, annotation.value()))
                 .build();
 
             PlcReadResponse response = getPlcReadResponse(request);
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
index 0c0b4b2..a27fed7 100644
--- a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcEntityManager.java
@@ -22,8 +22,6 @@ package org.apache.plc4x.java.opm;
 import net.bytebuddy.ByteBuddy;
 import net.bytebuddy.description.modifier.Visibility;
 import net.bytebuddy.implementation.MethodDelegation;
-import org.apache.commons.configuration2.Configuration;
-import org.apache.commons.configuration2.SystemConfiguration;
 import org.apache.commons.lang3.StringUtils;
 import org.apache.commons.lang3.reflect.FieldUtils;
 import org.apache.plc4x.java.PlcDriverManager;
@@ -41,6 +39,8 @@ import java.util.Arrays;
 import java.util.concurrent.Callable;
 
 import static net.bytebuddy.matcher.ElementMatchers.any;
+import static net.bytebuddy.matcher.ElementMatchers.isDeclaredBy;
+import static net.bytebuddy.matcher.ElementMatchers.not;
 
 /**
  * Plc4x equivalent of Jpas EntityManager for implementing Object-Plc-Mapping.
@@ -74,7 +74,7 @@ import static net.bytebuddy.matcher.ElementMatchers.any;
  * A connected @{@link PlcEntity} can be disconnected calling {@link #disconnect(Object)}, then it behaves like the
  * regular Pojo it was before.
  * <p>
- * All invocations on the getters are forwarded to the {@link PlcEntityInterceptor#intercept(Object, Method, Callable, String, PlcDriverManager)}
+ * All invocations on the getters are forwarded to the {@link PlcEntityInterceptor#intercept(Object, Method, Callable, String, PlcDriverManager, AliasRegistry)}
  * method.
  */
 public class PlcEntityManager {
@@ -83,15 +83,22 @@ public class PlcEntityManager {
 
     public static final String PLC_ADDRESS_FIELD_NAME = "_plcAddress";
     static final String DRIVER_MANAGER_FIELD_NAME = "_driverManager";
+    static final String ALIAS_REGISTRY = "_aliasRegistry";
 
     private final PlcDriverManager driverManager;
+    private final SimpleAliasRegistry registry;
 
     public PlcEntityManager() {
-        this.driverManager = new PlcDriverManager();
+        this(new PlcDriverManager());
     }
 
     public PlcEntityManager(PlcDriverManager driverManager) {
+        this(driverManager, new SimpleAliasRegistry());
+    }
+
+    public PlcEntityManager(PlcDriverManager driverManager, SimpleAliasRegistry registry) {
         this.driverManager = driverManager;
+        this.registry = registry;
     }
 
     public <T> T read(Class<T> clazz, String address) throws OPMException {
@@ -109,7 +116,7 @@ public class PlcEntityManager {
                 .forEach(field ->
                     requestBuilder.addItem(
                         field.getDeclaringClass().getName() + "." + field.getName(),
-                        field.getAnnotation(PlcField.class).value()
+                        OpmUtils.getOrResolveAddress(registry, field.getAnnotation(PlcField.class).value())
                     )
                 );
 
@@ -135,7 +142,7 @@ public class PlcEntityManager {
         } catch (InstantiationException | InvocationTargetException | NoSuchMethodException | NoSuchFieldException | IllegalAccessException e) {
             throw new OPMException("Unable to fetch PlcEntity " + clazz.getName(), e);
         } catch (Exception e) {
-            throw new OPMException("Unknown Error", e);
+            throw new OPMException("Unexpected Exception: " + e.getMessage(), e);
         }
     }
 
@@ -156,7 +163,8 @@ public class PlcEntityManager {
                 .subclass(clazz)
                 .defineField(PLC_ADDRESS_FIELD_NAME, String.class, Visibility.PRIVATE)
                 .defineField(DRIVER_MANAGER_FIELD_NAME, PlcDriverManager.class, Visibility.PRIVATE)
-                .method(any()).intercept(MethodDelegation.to(PlcEntityInterceptor.class))
+                .defineField(ALIAS_REGISTRY, AliasRegistry.class, Visibility.PRIVATE)
+                .method(not(isDeclaredBy(Object.class))).intercept(MethodDelegation.to(PlcEntityInterceptor.class))
                 .make()
                 .load(Thread.currentThread().getContextClassLoader())
                 .getLoaded()
@@ -165,9 +173,10 @@ public class PlcEntityManager {
             // Set connection value into the private field
             FieldUtils.writeDeclaredField(instance, PLC_ADDRESS_FIELD_NAME, address, true);
             FieldUtils.writeDeclaredField(instance, DRIVER_MANAGER_FIELD_NAME, driverManager, true);
+            FieldUtils.writeDeclaredField(instance, ALIAS_REGISTRY, registry, true);
 
             // Initially fetch all values
-            PlcEntityInterceptor.refetchAllFields(instance, driverManager, address);
+            PlcEntityInterceptor.refetchAllFields(instance, driverManager, address, registry);
 
             return instance;
         } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException | IllegalAccessError e) {
@@ -193,7 +202,7 @@ public class PlcEntityManager {
             }
             FieldUtils.writeDeclaredField(entity, DRIVER_MANAGER_FIELD_NAME, null, true);
         } catch (IllegalAccessException e) {
-            throw new OPMException("Unbale to fetch driverManager instance on entity instance", e);
+            throw new OPMException("Unable to fetch driverManager instance on entity instance", e);
         }
     }
 
diff --git a/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/SimpleAliasRegistry.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/SimpleAliasRegistry.java
new file mode 100644
index 0000000..10ed5e9
--- /dev/null
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/SimpleAliasRegistry.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.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.opm;
+
+import java.util.HashMap;
+import java.util.Map;
+import java.util.NoSuchElementException;
+
+/**
+ * Simple Map Based Implementation of {@link AliasRegistry}.
+ * It is not connection specific and forwards connection aware methods to the "simple" methods.
+ */
+public class SimpleAliasRegistry implements AliasRegistry {
+
+    /**
+     * Map from alias -> plc field address
+     */
+    private final Map<String, String> aliasMap;
+
+    public SimpleAliasRegistry() {
+        this(new HashMap<>());
+    }
+
+    public SimpleAliasRegistry(Map<String, String> aliasMap) {
+        this.aliasMap = aliasMap;
+    }
+
+    /**
+     * Register an Alias in the Registry.
+     */
+    public void register(String alias, String address) {
+        this.aliasMap.put(alias, address);
+    }
+
+    @Override
+    public boolean canResolve(String connection, String alias) {
+        return canResolve(alias);
+    }
+
+    @Override
+    public String resolve(String connection, String alias) {
+        return resolve(alias);
+    }
+
+    @Override
+    public boolean canResolve(String alias) {
+        return aliasMap.containsKey(alias);
+    }
+
+    @Override
+    public String resolve(String alias) {
+        if (!canResolve(alias)) {
+            throw new NoSuchElementException("Unable to resolve '" + alias + "'");
+        }
+        return aliasMap.get(alias);
+    }
+}
diff --git a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/OpmUtilsTest.java b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/OpmUtilsTest.java
new file mode 100644
index 0000000..27694d4
--- /dev/null
+++ b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/OpmUtilsTest.java
@@ -0,0 +1,64 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.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.opm;
+
+import org.junit.Test;
+
+import static org.junit.Assert.*;
+
+public class OpmUtilsTest {
+
+    @Test
+    public void expression_matches() {
+        assertTrue(OpmUtils.pattern.matcher("${Hallo}").matches());
+        assertTrue(OpmUtils.pattern.matcher("${Hallo:Hallo}").matches());
+        // ...
+        assertTrue(OpmUtils.pattern.matcher("${Ha{}llo}").matches());
+    }
+
+    @Test
+    public void getAlias_matches() {
+        String alias = OpmUtils.getAlias("${hallo}");
+
+        assertEquals("hallo", alias);
+    }
+
+    @Test
+    public void isAlias_bothCases() {
+        // True
+        assertTrue(OpmUtils.isAlias("${hallo}"));
+        assertTrue(OpmUtils.isAlias("${hal{}lo}"));
+        assertTrue(OpmUtils.isAlias("${hallo:hallo}"));
+        // False
+        assertFalse(OpmUtils.isAlias("hallo"));
+        assertFalse(OpmUtils.isAlias("${hallo"));
+        assertFalse(OpmUtils.isAlias("${ha}llo"));
+    }
+
+    @Test
+    public void isValidExpression_startingDollar_false() {
+        assertFalse(OpmUtils.isValidExpression("${hallo"));
+    }
+
+    @Test(expected = IllegalArgumentException.class)
+    public void getAlias_illegalString_throws() {
+        OpmUtils.getAlias("hallo");
+    }
+}
\ No newline at end of file
diff --git a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java
index 7108474..d508690 100644
--- a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java
+++ b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityInterceptorTest.java
@@ -32,8 +32,10 @@ import java.util.Collections;
 import java.util.concurrent.CompletableFuture;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.TimeoutException;
+import java.util.concurrent.atomic.AtomicBoolean;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.anyLong;
 import static org.mockito.Mockito.when;
@@ -49,12 +51,27 @@ public class PlcEntityInterceptorTest {
         PlcEntityInterceptor.getPlcReadResponse(request);
     }
 
-    @Test(expected = OPMException.class)
-    public void getPlcReadResponse_catchesInterruptedException_rethrows() throws OPMException, InterruptedException, ExecutionException, TimeoutException {
-        runGetPlcResponseWIthException(invocation -> {
-            throw new InterruptedException();
+    @Test
+    public void getPlcReadResponse_catchesInterruptedException_rethrows() throws InterruptedException {
+        AtomicBoolean exceptionWasThrown = new AtomicBoolean(false);
+        // Run in different Thread
+        Thread thread = new Thread(new Runnable() {
+            @Override
+            public void run() {
+                try {
+                    runGetPlcResponseWIthException(invocation -> {
+                        throw new InterruptedException();
+                    });
+                } catch (InterruptedException | ExecutionException | TimeoutException e) {
+                    e.printStackTrace();
+                } catch (OPMException e) {
+                    exceptionWasThrown.set(true);
+                }
+            }
         });
-        return;
+        thread.start();
+        thread.join();
+        assertTrue(exceptionWasThrown.get());
     }
 
     @Test(expected = OPMException.class)
diff --git a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
index 429b100..e97bf6e 100644
--- a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
+++ b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/PlcEntityManagerTest.java
@@ -35,13 +35,15 @@ import org.mockito.Mockito;
 import org.mockito.invocation.InvocationOnMock;
 import org.mockito.stubbing.Answer;
 
-import java.util.concurrent.CompletableFuture;
+import java.util.Queue;
+import java.util.concurrent.ConcurrentLinkedQueue;
 
-import static org.junit.Assert.*;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertTrue;
 import static org.mockito.ArgumentMatchers.any;
 import static org.mockito.ArgumentMatchers.eq;
-import static org.mockito.Mockito.mock;
-import static org.mockito.Mockito.when;
+import static org.mockito.Mockito.*;
 
 public class PlcEntityManagerTest {
 
@@ -133,6 +135,66 @@ public class PlcEntityManagerTest {
         UninstantiableEntity entity = entityManager.connect(UninstantiableEntity.class, "mock:test");
     }
 
+    @Test
+    public void read_resolveAlias_works() throws OPMException, PlcConnectionException {
+        SimpleAliasRegistry registry = new SimpleAliasRegistry();
+        registry.register("alias", "real_field");
+
+        // Mock
+        PlcDriverManager driverManager = new PlcDriverManager();
+        PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:test");
+        MockDevice mockDevice = Mockito.mock(MockDevice.class);
+        when(mockDevice.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultStringFieldItem("value")));
+        connection.setDevice(mockDevice);
+
+        PlcEntityManager entityManager = new PlcEntityManager(driverManager, registry);
+        entityManager.read(AliasEntity.class, "mock:test");
+
+        // Assert that "field" was queried
+        verify(mockDevice).read(eq("real_field"));
+    }
+
+    @Test
+    public void connect_resolveAlias_works() throws PlcConnectionException, OPMException {
+        SimpleAliasRegistry registry = new SimpleAliasRegistry();
+        registry.register("alias", "real_field");
+
+        // Mock
+        PlcDriverManager driverManager = new PlcDriverManager();
+        PlcMockConnection connection = (PlcMockConnection) driverManager.getConnection("mock:test");
+        MockDevice mockDevice = Mockito.mock(MockDevice.class);
+        when(mockDevice.read(any())).thenReturn(Pair.of(PlcResponseCode.OK, new DefaultStringFieldItem("value")));
+        connection.setDevice(mockDevice);
+
+        PlcEntityManager entityManager = new PlcEntityManager(driverManager, registry);
+        entityManager.connect(AliasEntity.class, "mock:test");
+
+        // Assert that "field" was queried
+        verify(mockDevice, times(1)).read(eq("real_field"));
+    }
+
+    @Test(expected = OPMException.class)
+    public void read_unknownAlias_throws() throws OPMException {
+        PlcEntityManager entityManager = new PlcEntityManager();
+
+        entityManager.read(AliasEntity.class, "mock:test");
+    }
+
+    @Test
+    public void read_badAlias_throws() {
+        PlcEntityManager entityManager = new PlcEntityManager();
+
+        String message = null;
+        try {
+            entityManager.read(BadAliasEntity.class, "mock:test");
+        } catch (OPMException e) {
+            message = e.getMessage();
+        }
+
+        assertNotNull(message);
+        assertTrue(message.contains("Invalid Syntax, either use field address (no starting $) or an alias with Syntax ${xxx}. But given was"));
+    }
+
     @PlcEntity
     private static class UninstantiableEntity {
 
@@ -157,4 +219,34 @@ public class PlcEntityManagerTest {
         }
     }
 
+    @PlcEntity
+    public static class AliasEntity {
+
+        @PlcField("${alias}")
+        private String aliasedField;
+
+        public AliasEntity() {
+            // for OPM
+        }
+
+        public String getAliasedField() {
+            return aliasedField;
+        }
+    }
+
+    @PlcEntity
+    public static class BadAliasEntity {
+
+        @PlcField("${alias")
+        private String aliasedField;
+
+        public BadAliasEntity() {
+            // for OPM
+        }
+
+        public String getAliasedField() {
+            return aliasedField;
+        }
+    }
+
 }
\ No newline at end of file
diff --git a/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/SimpleAliasRegistryTest.java b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/SimpleAliasRegistryTest.java
new file mode 100644
index 0000000..bc6d8ad
--- /dev/null
+++ b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/SimpleAliasRegistryTest.java
@@ -0,0 +1,76 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   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.opm;
+
+import org.junit.Test;
+
+import java.util.HashMap;
+import java.util.NoSuchElementException;
+
+import static org.junit.Assert.*;
+
+public class SimpleAliasRegistryTest {
+
+    public static final String ADDRESS = "DB2:1234";
+    public static final String ALIAS = "some_field";
+
+    @Test
+    public void register_containsValue() {
+        SimpleAliasRegistry registry = new SimpleAliasRegistry();
+        registry.register(ALIAS, ADDRESS);
+
+        // Perform checks
+        checkMethods(registry);
+    }
+
+    @Test
+    public void defaultMap_containsValue() {
+        HashMap<String, String> map = new HashMap<>();
+        map.put(ALIAS, ADDRESS);
+        SimpleAliasRegistry registry = new SimpleAliasRegistry(map);
+
+        // Perform checks
+        checkMethods(registry);
+    }
+
+    @Test
+    public void canResolve_unknownAlias_returnFalse() {
+        SimpleAliasRegistry registry = new SimpleAliasRegistry();
+
+        assertFalse(registry.canResolve(ALIAS));
+    }
+
+    @Test(expected = NoSuchElementException.class)
+    public void resolve_unknownAlias_throws() {
+        SimpleAliasRegistry registry = new SimpleAliasRegistry();
+
+        registry.resolve(ALIAS);
+    }
+
+    private void checkMethods(SimpleAliasRegistry registry) {
+        // Can Resolve
+        assertTrue(registry.canResolve(ALIAS));
+        assertTrue(registry.canResolve("unknown_connection", ALIAS));
+
+        // Resolve
+        assertEquals(ADDRESS, registry.resolve(ALIAS));
+        assertEquals(ADDRESS, registry.resolve("unknown_connection", ALIAS));
+    }
+}
\ No newline at end of file
diff --git a/plc4j/utils/opm/src/test/resources/logback.xml b/plc4j/utils/opm/src/test/resources/logback.xml
index 8b49981..74570cd 100644
--- a/plc4j/utils/opm/src/test/resources/logback.xml
+++ b/plc4j/utils/opm/src/test/resources/logback.xml
@@ -29,7 +29,7 @@
     </encoder>
   </appender>
 
-  <root level="debug">
+  <root level="trace">
     <appender-ref ref="STDOUT"/>
   </root>
 


[incubator-plc4x] 04/05: - Split up the modbus driver into driver and protocol

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

jfeinauer pushed a commit to branch alias-registry-for-opm
in repository https://gitbox.apache.org/repos/asf/incubator-plc4x.git

commit 172c581a408faac291e6a4c7f04b0133527cc3dc
Author: Christofer Dutz <ch...@c-ware.de>
AuthorDate: Fri Nov 23 09:50:02 2018 +0100

    - Split up the modbus driver into driver and protocol
---
 plc4j/drivers/modbus/pom.xml                       | 63 ++++++++++++++++++++++
 .../apache/plc4x/java/modbus/ModbusPlcDriver.java  |  4 +-
 .../modbus/connection/BaseModbusPlcConnection.java |  2 +-
 .../modbus/connection/ModbusConnectionFactory.java |  0
 .../connection/ModbusSerialPlcConnection.java      |  0
 .../modbus/connection/ModbusTcpPlcConnection.java  | 30 +++++------
 .../services/org.apache.plc4x.java.spi.PlcDriver   |  0
 .../plc4x/java/modbus/ModbusPlcDriverTest.java     |  6 +--
 .../connection/BaseModbusPlcConnectionTest.java    |  0
 .../connection/ModbusConnectionFactoryTest.java    |  0
 .../connection/ModbusSerialPlcConnectionTest.java  |  0
 .../connection/ModbusTcpPlcConnectionTests.java    |  0
 plc4j/protocols/modbus/pom.xml                     | 20 -------
 .../java/modbus/netty/Plc4XModbusProtocol.java     | 30 +++++------
 14 files changed, 99 insertions(+), 56 deletions(-)

diff --git a/plc4j/drivers/modbus/pom.xml b/plc4j/drivers/modbus/pom.xml
index fad65f8..83dd1d9 100644
--- a/plc4j/drivers/modbus/pom.xml
+++ b/plc4j/drivers/modbus/pom.xml
@@ -32,6 +32,69 @@
   <description>Implementation of a PLC4X driver able to speak with devices using the Modbus protocol.</description>
 
   <dependencies>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-api</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-modbus</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-serial</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-common</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-buffer</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>com.digitalpetri.modbus</groupId>
+      <artifactId>modbus-codec</artifactId>
+      <version>1.1.0</version>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-test</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>se.koc</groupId>
+      <artifactId>netty-transport-jserialcomm</artifactId>
+      <version>1.0.0</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusPlcDriver.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusPlcDriver.java
index 30d9091..187aa10 100644
--- a/plc4j/protocols/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
@@ -19,11 +19,11 @@ under the License.
 package org.apache.plc4x.java.modbus;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.plc4x.java.spi.PlcDriver;
-import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 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.spi.PlcDriver;
 
 import java.net.InetAddress;
 import java.net.UnknownHostException;
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
index 055eb3c..cd85021 100644
--- a/plc4j/protocols/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
@@ -23,8 +23,8 @@ 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.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.connection.ChannelFactory;
+import org.apache.plc4x.java.base.connection.NettyPlcConnection;
 import org.apache.plc4x.java.base.messages.*;
 import org.apache.plc4x.java.modbus.util.ModbusPlcFieldHandler;
 import org.slf4j.Logger;
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactory.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactory.java
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
diff --git a/plc4j/protocols/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
similarity index 77%
rename from plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
rename to plc4j/drivers/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
index 2b815a5..d71f087 100644
--- a/plc4j/protocols/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
@@ -1,21 +1,21 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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
+     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.
-*/
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ 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;
diff --git a/plc4j/protocols/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver b/plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
similarity index 100%
rename from plc4j/protocols/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
rename to plc4j/drivers/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.spi.PlcDriver
diff --git a/plc4j/protocols/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
similarity index 97%
rename from plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
rename to plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/ModbusPlcDriverTest.java
index f951877..a8cbfd1 100644
--- a/plc4j/protocols/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
@@ -7,7 +7,7 @@
  "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
+     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
@@ -61,8 +61,8 @@ public class ModbusPlcDriverTest {
     public void testDriverWithCompleteUrls() {
         ModbusPlcDriver SUT = new ModbusPlcDriver(mock(ModbusConnectionFactory.class));
         Stream.of(
-            "modbus:tcp://www.google.de",
-            "modbus:tcp://www.google.de:443",
+            "modbus:tcp://localhost",
+            "modbus:tcp://localhost:443",
             "modbus:serial:///dev/com1",
             "modbus:serial://COM1",
             "modbus:serial:///dev/ttyUSB0"
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java
rename to plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnectionTest.java
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
rename to plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
rename to plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnectionTest.java
diff --git a/plc4j/protocols/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
similarity index 100%
rename from plc4j/protocols/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java
rename to plc4j/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnectionTests.java
diff --git a/plc4j/protocols/modbus/pom.xml b/plc4j/protocols/modbus/pom.xml
index 18bc827..1759532 100644
--- a/plc4j/protocols/modbus/pom.xml
+++ b/plc4j/protocols/modbus/pom.xml
@@ -47,16 +47,6 @@
       <artifactId>plc4j-protocol-driver-base</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
-    <dependency>
-      <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base-serial</artifactId>
-      <version>0.3.0-SNAPSHOT</version>
-    </dependency>
 
     <dependency>
       <!-- Just for reference can be removed later-->
@@ -88,10 +78,6 @@
       <groupId>io.netty</groupId>
       <artifactId>netty-transport</artifactId>
     </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-common</artifactId>
-    </dependency>
 
     <dependency>
       <groupId>commons-io</groupId>
@@ -108,12 +94,6 @@
       <scope>test</scope>
     </dependency>
     <dependency>
-      <groupId>se.koc</groupId>
-      <artifactId>netty-transport-jserialcomm</artifactId>
-      <version>1.0.0</version>
-      <scope>test</scope>
-    </dependency>
-    <dependency>
       <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-protocol-driver-base-test</artifactId>
       <version>0.3.0-SNAPSHOT</version>
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
index bad279f..12be747 100644
--- 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
@@ -1,21 +1,21 @@
 /*
-Licensed to the Apache Software Foundation (ASF) under one
-or more contributor license agreements.  See the NOTICE file
-distributed with this work for additional information
-regarding copyright ownership.  The ASF licenses this file
-to you under the Apache License, Version 2.0 (the
-"License"); you may not use this file except in compliance
-with the License.  You may obtain a copy of the License at
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.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
+     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.
-*/
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ 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;