You are viewing a plain text version of this content. The canonical link for it is here.
Posted to dev@plc4x.apache.org by GitBox <gi...@apache.org> on 2018/11/23 09:29:49 UTC

[GitHub] JulianFeinauer closed pull request #39: Alias registry for opm

JulianFeinauer closed pull request #39: Alias registry for opm
URL: https://github.com/apache/incubator-plc4x/pull/39
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

diff --git a/examples/hello-cloud-azure/pom.xml b/examples/hello-cloud-azure/pom.xml
index 966d6ffdc..543960716 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 7ccb311f9..7b874d5da 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 1dc18522d..4703b826e 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 57549fdf8..582f92e8e 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 e627ef269..672e18066 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 64337383f..07d832d5f 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 5bed94213..6d8856d93 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 0fdff0632..c15ff1a3b 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 e76173cd6..63dd8be7d 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 daf7c88ea..bc27cd6f8 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 295f3be2e..a878d423c 100644
--- a/integrations/apache-kafka/pom.xml
+++ b/integrations/apache-kafka/pom.xml
@@ -40,11 +40,6 @@
       <artifactId>plc4j-api</artifactId>
       <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>
diff --git a/integrations/apache-nifi/nifi-plc4x-nar/pom.xml b/integrations/apache-nifi/nifi-plc4x-nar/pom.xml
index 7f93cbb3c..b00eb0d30 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 e4b17e5af..48a877f27 100644
--- a/integrations/apache-nifi/nifi-plc4x-processors/pom.xml
+++ b/integrations/apache-nifi/nifi-plc4x-processors/pom.xml
@@ -30,11 +30,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.nifi</groupId>
       <artifactId>nifi-api</artifactId>
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 f4238d380..5eba89aec 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 PlcInvalidFieldException(String fieldToBeParsed, Pattern pattern, String
     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 f5f16d16f..38cb8cf59 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 @@ Licensed to the Apache Software Foundation (ASF) under one
     @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 void getExistingDriverTest() throws PlcException {
     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 84e6f262a..afffb5b6f 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  "License"); you may not use this 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  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 bfbf4ae31..f869626d3 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 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 @@ public void simpleFieldStringPatternAndReadableStringConstructor() {
         });
     }
 
+    @Test
+    public void getFieldToBeParsed() {
+        PlcInvalidFieldException ex = new PlcInvalidFieldException("Pattern");
+        assertThat(ex.getFieldToBeParsed(), equalTo("Pattern"));
+    }
+
 }
\ No newline at end of file
diff --git a/plc4j/api/src/test/java/org/apache/plc4x/java/mock/DuplicateMockDriver.java b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/DuplicateMockDriver.java
new file mode 100644
index 000000000..c998aa2e6
--- /dev/null
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/DuplicateMockDriver.java
@@ -0,0 +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.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 000000000..d119b426e
--- /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/api/src/test/java/org/apache/plc4x/java/mock/MockPlcConnection.java b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockPlcConnection.java
new file mode 100644
index 000000000..5258df639
--- /dev/null
+++ b/plc4j/api/src/test/java/org/apache/plc4x/java/mock/MockPlcConnection.java
@@ -0,0 +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.mock;
+
+import org.apache.plc4x.java.api.PlcConnection;
+import org.apache.plc4x.java.api.authentication.PlcAuthentication;
+
+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 e6eec9f58..4211709aa 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 0a180dedb..000000000
--- 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 466248565..000000000
--- 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 5e8b4401c..000000000
--- 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 532e20fe9..000000000
--- 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 000000000..a6f707650
--- /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 000000000..b7692b691
--- /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/drivers/ethernet-ip/pom.xml b/plc4j/drivers/ethernet-ip/pom.xml
new file mode 100644
index 000000000..47bd68d6b
--- /dev/null
+++ b/plc4j/drivers/ethernet-ip/pom.xml
@@ -0,0 +1,112 @@
+<?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-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>
+
+  <properties>
+    <ethernetip-driver.version>1.2.0</ethernetip-driver.version>
+  </properties>
+
+  <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-ethernet-ip</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>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+
+    <dependency>
+      <groupId>com.digitalpetri.enip</groupId>
+      <artifactId>cip-core</artifactId>
+      <version>${ethernetip-driver.version}</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.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>
+  </dependencies>
+
+  <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 47a487b83..41dfc6b25 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 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 8e88331d0..332fd9be1 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 41edb06de..a12f80958 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 000000000..83dd1d909
--- /dev/null
+++ b/plc4j/drivers/modbus/pom.xml
@@ -0,0 +1,100 @@
+<?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>
+    <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 79%
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 30d9091e3..97a9a9f87 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
@@ -1,29 +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.
-*/
+ Licensed to the Apache Software Foundation (ASF) under one
+ or more contributor license agreements.  See the NOTICE file
+ distributed with this work for additional information
+ regarding copyright ownership.  The ASF licenses this file
+ to you under the Apache License, Version 2.0 (the
+ "License"); you may not use this file except in compliance
+ with the License.  You may obtain a copy of the License at
+
+     http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing,
+ software distributed under the License is distributed on an
+ "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ KIND, either express or implied.  See the License for the
+ specific language governing permissions and limitations
+ under the License.
+ */
 package org.apache.plc4x.java.modbus;
 
 import org.apache.commons.lang3.StringUtils;
-import org.apache.plc4x.java.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 81%
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 055eb3cf7..713acd5cd 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
@@ -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;
@@ -23,8 +23,8 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 2b815a5b5..d71f0871c 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 f951877cd..a8cbfd12b 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  "License"); you may not use this 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 void testModbusAddressPattern() {
     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 96%
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
index 8a4c41993..e3e8eb42d 100644
--- 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
@@ -23,9 +23,7 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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/drivers/modbus/src/test/java/org/apache/plc4x/java/modbus/connection/ModbusConnectionFactoryTest.java
similarity index 98%
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
index e4dbc9719..dd0464894 100644
--- 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
@@ -30,8 +30,8 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 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/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/drivers/pom.xml b/plc4j/drivers/pom.xml
new file mode 100644
index 000000000..bce44a090
--- /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/drivers/s7/pom.xml b/plc4j/drivers/s7/pom.xml
new file mode 100644
index 000000000..c26c989d3
--- /dev/null
+++ b/plc4j/drivers/s7/pom.xml
@@ -0,0 +1,131 @@
+<?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-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>
+    <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-iso-on-tcp</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-iso-tp</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-s7</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>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>
+    <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-configuration2</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>commons-io</groupId>
+      <artifactId>commons-io</artifactId>
+    </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>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.apache.plc4x</groupId>
+      <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>
+        <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/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 839ed3036..2ee2b0fec 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 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 beadfa3e1..a4f53069f 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 78ced2e57..d4b4a22c5 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 3683f83c6..9509f4f86 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  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/drivers/simulated/pom.xml b/plc4j/drivers/simulated/pom.xml
new file mode 100644
index 000000000..5716099e9
--- /dev/null
+++ b/plc4j/drivers/simulated/pom.xml
@@ -0,0 +1,56 @@
+<?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-simulated</artifactId>
+  <name>PLC4J: Driver: Simulated</name>
+  <description>Implementation of a PLC4X driver able to speak a simulated device.</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-driver-base</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+    </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>
+
+</project>
\ No newline at end of file
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 d5cec02dd..8bfa14585 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  * 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 PlcConnection connect(String url) throws PlcConnectionException {
             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 50ef026e3..68969f2ed 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  * 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 c4a471652..e94cc6a6d 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  * 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 @@ Licensed to the Apache Software Foundation (ASF) under one
         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 89b85b260..619ff2b64 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 /**
  * 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 44526564d..329a28e74 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  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 a040a6d16..230b7b77d 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  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%
rename from plc4j/protocols/test/src/main/java/org/apache/plc4x/java/test/TestType.java
rename to plc4j/drivers/simulated/src/main/java/org/apache/plc4x/java/simulated/connection/TestType.java
index 6654bb0b4..d0d8d4361 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  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 000000000..37f903847
--- /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 9038e466e..a4f270304 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  "License"); you may not use this 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 @@ Licensed to the Apache Software Foundation (ASF) under one
  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 52f446b36..f3b890679 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 6ab84a7fc..cc6413975 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 a982c3595..63c059704 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 746b303ba..0cc21ddc3 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 64d193ec4..edbd6038b 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 10633f203..9c27fc97b 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 b4b28c1b2..2964f5518 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 f37be58a9..a61b3cff6 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 fac0fca8e..0bcb618de 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 4aa2cbdf6..a840adadd 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 c2f30cc51..d20df9211 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 82b4d3875..0fdd0c003 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 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 05f0eb70c..70d46b308 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>
@@ -91,10 +67,6 @@
       <groupId>io.netty</groupId>
       <artifactId>netty-codec</artifactId>
     </dependency>
-    <dependency>
-      <groupId>io.netty</groupId>
-      <artifactId>netty-common</artifactId>
-    </dependency>
     <dependency>
       <groupId>io.netty</groupId>
       <artifactId>netty-transport</artifactId>
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/protocols/iso-on-tcp/pom.xml b/plc4j/protocols/iso-on-tcp/pom.xml
new file mode 100644
index 000000000..78e909b62
--- /dev/null
+++ b/plc4j/protocols/iso-on-tcp/pom.xml
@@ -0,0 +1,75 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<!--
+  Licensed to the Apache Software Foundation (ASF) under one
+  or more contributor license agreements.  See the NOTICE file
+  distributed with this work for additional information
+  regarding copyright ownership.  The ASF licenses this file
+  to you under the Apache License, Version 2.0 (the
+  "License"); you may not use this file except in compliance
+  with the License.  You may obtain a copy of the License at
+
+      http://www.apache.org/licenses/LICENSE-2.0
+
+  Unless required by applicable law or agreed to in writing,
+  software distributed under the License is distributed on an
+  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+  KIND, either express or implied.  See the License for the
+  specific language governing permissions and limitations
+  under the License.
+  -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <parent>
+    <groupId>org.apache.plc4x</groupId>
+    <artifactId>plc4j-protocols</artifactId>
+    <version>0.3.0-SNAPSHOT</version>
+  </parent>
+
+  <artifactId>plc4j-protocol-iso-on-tcp</artifactId>
+  <name>PLC4J: Protocol: ISO on TCP</name>
+  <description>Implementation of the ISO on TCP protocol layer.</description>
+
+  <dependencies>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-api</artifactId>
+      <version>0.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-buffer</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.mockito</groupId>
+      <artifactId>mockito-core</artifactId>
+      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-utils-test-utils</artifactId>
+      <version>0.3.0-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</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 1c9a1fe41..32648fae2 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java
new file mode 100644
index 000000000..1500d809a
--- /dev/null
+++ b/plc4j/protocols/iso-on-tcp/src/main/java/org/apache/plc4x/java/isoontcp/protocol/model/IsoOnTcpMessage.java
@@ -0,0 +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.isoontcp.protocol.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/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 b2ae4b2be..8b158e40e 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 26b6154b8..c6eec3519 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 a6bdfadf8..d486a86b5 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 96a6d1a49..4e9401c84 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 13b554f62..7e76ebecb 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 a9446f3ed..de7ce1ed2 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 a4dd39314..ffc62dddb 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 bfd2f959a..d2b876a89 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 e8ac3928c..1d47c2d94 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 4c06fe9ef..4d1878d4b 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 146b8ad09..7179273a1 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 f521828b6..c8882fcce 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 b811ff34d..3931269a9 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 db93ce5f6..01218e3ed 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 dcc7e8d69..632effb45 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 12739ab3a..c5cbae1b7 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 1134954d5..129773d17 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 1dd3ddebe..e6d181584 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 ead47a606..149c36620 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 1c0913878..4596d2ee6 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 085197703..a526f8aec 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 69e854546..1f49eebbf 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 7064e8895..a2ce8637a 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 9eabe897e..a776909ef 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 8e4fe1c3d..98fdf3620 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 f944f6968..b8f1c6f31 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 37c2b28f3..0152bae6f 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 ded9a076a..9f63059b3 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 5ba90ec48..d6386d252 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 a79df5fbd..d1d0fff89 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 void encodeError() {
     @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 void decodeCallingParameter() {
         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 void decodeCalledParameter() {
         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 f3702397a..e02cc260c 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 516159365..584a76a7b 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 46498d1e1..bf663d5ab 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 311eec42d..942ed75c5 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 73676b12e..3b88a0185 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 a572d4bf7..17595321e 100644
--- a/plc4j/protocols/modbus/pom.xml
+++ b/plc4j/protocols/modbus/pom.xml
@@ -47,22 +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>
-      <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-->
@@ -94,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>
@@ -113,12 +93,6 @@
       <artifactId>logback-classic</artifactId>
       <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>
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 bad279f23..12be747bb 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;
diff --git a/plc4j/protocols/pom.xml b/plc4j/protocols/pom.xml
index e3638ce61..f4cbe1d73 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 dd1b82c1b..4c9efb399 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 c21bbd82a..000000000
--- 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 606c1b607..e47305638 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 73200a401..c2250b6d6 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 */
 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 16e4f5f3c..000000000
--- 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 c7ddebd9d..000000000
--- 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 f33f563f6..000000000
--- 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 48318eddb..000000000
--- 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 152fb0f85..d4f401b93 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 7c8b41609..dfeb21e0b 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 e0851eebf..bae498f85 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 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 000000000..0759363d0
--- /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 eb761f445..d415346c0 100644
--- a/plc4j/protocols/test/pom.xml
+++ b/plc4j/protocols/test/pom.xml
@@ -42,11 +42,6 @@
       <artifactId>plc4j-protocol-driver-base</artifactId>
       <version>0.3.0-SNAPSHOT</version>
     </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>
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 5bf59414d..cdd3448cb 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 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 MockDevice getDevice() {
     }
 
     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 void connect() {
 
     @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 boolean canSubscribe() {
     @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/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 f145b55d8..ebff4aa15 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 a7ae646c2..049d96011 100644
--- a/plc4j/utils/connection-pool/pom.xml
+++ b/plc4j/utils/connection-pool/pom.xml
@@ -37,11 +37,6 @@
       <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.apache.commons</groupId>
diff --git a/plc4j/utils/opm/pom.xml b/plc4j/utils/opm/pom.xml
index 2912674b0..4e25bf7e6 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>
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 000000000..b980fb104
--- /dev/null
+++ b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/AliasRegistry.java
@@ -0,0 +1,49 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *   http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * 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 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.
+     */
+    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 29ede9cb3..61dfc7c3b 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,10 +19,16 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 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 {
+final class OpmUtils {
+
+    private static final String ADDRESS = "address";
+    static final Pattern pattern = Pattern.compile("^\\$\\{(?<" + ADDRESS + ">.*)}$");
 
     private OpmUtils() {
         // Util class
@@ -42,4 +48,41 @@ private 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}.
+     */
+    static boolean isValidExpression(String s) {
+        return !s.startsWith("$") || pattern.matcher(s).matches();
+    }
+
+    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()) {
+            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 00c0fe04c..9f99378c9 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.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 @@
 
 /**
  * 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, 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 @@ private 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(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)}
+     * 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
@@ -87,8 +90,10 @@ private 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,
+                                   @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
@@ -108,7 +113,8 @@ public static Object intercept(@This Object proxy, @Origin Method method, @Super
             // 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(proxy, method, driverManager, address, registry, lastFetched);
         }
 
         if (method.getName().startsWith("is") && (method.getReturnType() == boolean.class || method.getReturnType() == Boolean.class)) {
@@ -118,13 +124,13 @@ public static Object intercept(@This Object proxy, @Origin Method method, @Super
             // 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(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);
+            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);
@@ -135,13 +141,16 @@ public static Object intercept(@This Object proxy, @Origin Method method, @Super
      * Renews all values of all Fields that are annotated with {@link PlcEntity}.
      *
      * @param proxy Object to refresh the fields on.
-     * @param driverManager
+     * @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) 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);
         PlcEntity plcEntity = entityClass.getAnnotation(PlcEntity.class);
         if (plcEntity == null) {
             throw new OPMException("Non PlcEntity supplied");
@@ -154,19 +163,25 @@ static void refetchAllFields(Object proxy, PlcDriverManager driverManager, Strin
 
             Arrays.stream(entityClass.getDeclaredFields())
                 .filter(field -> field.isAnnotationPresent(PlcField.class))
+                .filter(field -> needsToBeFetched(lastFetched, field))
                 .forEach(field ->
                     requestBuilder.addItem(
-                        field.getDeclaringClass().getName() + "." + field.getName(),
-                        field.getAnnotation(PlcField.class).value()
+                        getFqn(field),
+                        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
             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 {
@@ -182,15 +197,33 @@ static void refetchAllFields(Object proxy, PlcDriverManager driverManager, Strin
         }
     }
 
-    private static Object fetchValueForIsGetter(Method m, PlcDriverManager driverManager, String address) throws OPMException {
-        return fetchValueForGetter(m, 2, driverManager, address);
+    private static String getFqn(Field field) {
+        return field.getDeclaringClass().getName() + "." + field.getName();
     }
 
-    private static Object fetchValueForGetter(Method m, PlcDriverManager driverManager, String address) throws OPMException {
-        return fetchValueForGetter(m, 3, driverManager, address);
+    /**
+     * 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, int prefixLength, PlcDriverManager driverManager, String address) throws OPMException {
+    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(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));
@@ -203,18 +236,32 @@ private static Object fetchValueForGetter(Method m, int prefixLength, PlcDriverM
         } 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, annotation.value())
+                .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);
@@ -232,8 +279,8 @@ private static Object fetchValueForGetter(Method m, int prefixLength, PlcDriverM
      * @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 0c0b4b23a..81ebbeaa6 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 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;
@@ -37,10 +35,14 @@ Licensed to the Apache Software Foundation (ASF) under one
 
 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;
 
 /**
  * Plc4x equivalent of Jpas EntityManager for implementing Object-Plc-Mapping.
@@ -74,7 +76,8 @@ Licensed to the Apache Software Foundation (ASF) under one
  * 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, Map)}
  * method.
  */
 public class PlcEntityManager {
@@ -83,15 +86,23 @@ Licensed to the Apache Software Foundation (ASF) under one
 
     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;
 
     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 +120,7 @@ public PlcEntityManager(PlcDriverManager driverManager) {
                 .forEach(field ->
                     requestBuilder.addItem(
                         field.getDeclaringClass().getName() + "." + field.getName(),
-                        field.getAnnotation(PlcField.class).value()
+                        OpmUtils.getOrResolveAddress(registry, field.getAnnotation(PlcField.class).value())
                     )
                 );
 
@@ -135,7 +146,7 @@ public PlcEntityManager(PlcDriverManager driverManager) {
         } 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 +167,9 @@ public PlcEntityManager(PlcDriverManager driverManager) {
                 .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)
+                .defineField(LAST_FETCHED, Map.class, Visibility.PRIVATE)
+                .method(not(isDeclaredBy(Object.class))).intercept(MethodDelegation.to(PlcEntityInterceptor.class))
                 .make()
                 .load(Thread.currentThread().getContextClassLoader())
                 .getLoaded()
@@ -165,9 +178,12 @@ public PlcEntityManager(PlcDriverManager driverManager) {
             // 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);
+            Map<String, Instant> lastFetched = new HashMap<>();
+            FieldUtils.writeDeclaredField(instance, LAST_FETCHED, lastFetched, true);
 
             // Initially fetch all values
-            PlcEntityInterceptor.refetchAllFields(instance, driverManager, address);
+            PlcEntityInterceptor.refetchAllFields(instance, driverManager, address, registry, lastFetched);
 
             return instance;
         } catch (NoSuchMethodException | InvocationTargetException | InstantiationException | IllegalAccessException | IllegalAccessError e) {
@@ -193,7 +209,7 @@ public void disconnect(Object entity) throws OPMException {
             }
             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/PlcField.java b/plc4j/utils/opm/src/main/java/org/apache/plc4x/java/opm/PlcField.java
index cd0474ee2..f6b499d7e 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 @@ Licensed to the Apache Software Foundation (ASF) under one
 @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/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 000000000..10ed5e94c
--- /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/ConnectedEntityTest.java b/plc4j/utils/opm/src/test/java/org/apache/plc4x/java/opm/ConnectedEntityTest.java
new file mode 100644
index 000000000..0be09df60
--- /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
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 000000000..27694d4f2
--- /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 71084742d..d5086903a 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.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 @@ private void runGetPlcResponseWIthException(Answer a) throws InterruptedExceptio
         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 429b10092..e97bf6e88 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.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 void connect_uninstantiableEntity_throws() throws OPMException {
         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 String getField1() {
         }
     }
 
+    @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 000000000..bc6d8ad5b
--- /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 8b499811e..74570cd4f 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>
 


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
users@infra.apache.org


With regards,
Apache Git Services