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

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


The following commit(s) were added to refs/heads/master by this push:
     new dc095d9  PLC4X-5 - Implement the Modbus Protocol - Implemented a 
skeleton for the Modbus protocol (TCP / Serial) - Added a new Serial 
driver-base usable for implementing protocols using serial ports
dc095d9 is described below

commit dc095d94e17bb09ae1903adebe02ab2050024b34
Author: Christofer Dutz <christofer.d...@c-ware.de>
AuthorDate: Tue Mar 6 14:18:19 2018 +0100

    PLC4X-5 - Implement the Modbus Protocol
    - Implemented a skeleton for the Modbus protocol (TCP / Serial)
    - Added a new Serial driver-base usable for implementing protocols using 
serial ports
    
    PLC4X-3 - Implement a testing framework for protocols
    - Split up the driver-base package into separate modules depending on the 
type of connection being used.
    - Converted the test-code of the base-driver to a "base-driver-test" module 
as relying on a test-jar caused undesired dependency problems.
---
 examples/dummy-driver/pom.xml                      |  7 +-
 .../java/examples/dummydriver/DummyDriver.java     |  9 ++-
 .../dummydriver/connection/DummyConnection.java    | 91 +++------------------
 integrations/apache-edgent/pom.xml                 |  6 ++
 .../apache/plc4x/edgent/mock/MockConnection.java   | 31 ++------
 plc4j/core/pom.xml                                 | 17 ++++
 .../apache/plc4x/java/PlcDriverManagerTest.java    |  2 -
 .../org/apache/plc4x/java/mock/MockConnection.java | 43 ++++------
 plc4j/protocols/ads/pom.xml                        |  5 ++
 .../{driver-base => driver-bases/base}/pom.xml     | 24 +-----
 .../base/connection/AbstractPlcConnection.java     |  0
 .../plc4x/java/base/connection/ChannelFactory.java |  0
 plc4j/protocols/{ => driver-bases}/pom.xml         | 15 ++--
 .../raw-socket}/pom.xml                            | 37 ++++-----
 .../base/connection/RawSocketChannelFactory.java}  | 20 +++--
 .../{driver-base => driver-bases/serial}/pom.xml   | 36 +++------
 .../base/connection/SerialChannelFactory.java}     | 23 +++---
 plc4j/{core => protocols/driver-bases/tcp}/pom.xml | 24 ++++--
 .../base/connection/TcpSocketChannelFactory.java   |  0
 .../{core => protocols/driver-bases/test}/pom.xml  | 24 ++++--
 .../java/base/connection/MockConnection.java}      | 25 ++++--
 .../java/base/connection/TestChannelFactory.java   |  0
 plc4j/protocols/{ads => modbus}/pom.xml            | 30 +++----
 .../plc4x/java/modbus/ModbusSerialPlcDriver.java   | 32 +++++---
 .../plc4x/java/modbus/ModbusTcpPlcDriver.java      | 36 ++++++---
 .../modbus/connection/BaseModbusPlcConnection.java | 93 ++++++++++++++++++++++
 .../connection/ModbusSerialPlcConnection.java      | 58 ++++++++++++++
 .../modbus/connection/ModbusTcpPlcConnection.java  | 58 ++++++++++++++
 .../plc4x/java/modbus/model/ModbusAddress.java}    | 12 +--
 .../plc4x/java/modbus/netty/ModbusProtocol.java}   | 31 +++-----
 .../java/modbus/netty/ModbusSerialProtocol.java}   | 21 +++--
 .../java/modbus/netty/ModbusTcpProtocol.java}      | 21 +++--
 .../java/modbus/netty/Plc4XModbusProtocol.java     | 68 ++++++++++++++++
 .../java/modbus/netty/model/ModbusMessage.java}    | 12 +--
 .../services/org.apache.plc4x.java.api.PlcDriver   | 20 +++++
 plc4j/protocols/pom.xml                            |  5 +-
 plc4j/protocols/s7/pom.xml                         |  8 +-
 pom.xml                                            |  5 ++
 38 files changed, 598 insertions(+), 351 deletions(-)

diff --git a/examples/dummy-driver/pom.xml b/examples/dummy-driver/pom.xml
index fd38c10..058bf20 100644
--- a/examples/dummy-driver/pom.xml
+++ b/examples/dummy-driver/pom.xml
@@ -43,7 +43,12 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-utils-raw-sockets</artifactId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
       <version>0.0.1-SNAPSHOT</version>
     </dependency>
 
diff --git 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
 
b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
index efc42c2..c8ab21a 100644
--- 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
+++ 
b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
@@ -24,6 +24,8 @@ import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.examples.dummydriver.connection.DummyConnection;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
@@ -49,7 +51,12 @@ public class DummyDriver implements PlcDriver {
                 "Connection url doesn't match the format 'dummy://{host|ip}'");
         }
         String host = matcher.group("host");
-        return new DummyConnection(host);
+        try {
+            InetAddress hostAddress = InetAddress.getByName(host);
+            return new DummyConnection(hostAddress);
+        } catch (UnknownHostException e) {
+            throw new PlcConnectionException("Error", e);
+        }
     }
 
     @Override
diff --git 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java
 
b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java
index a61686b..abb3fea 100644
--- 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java
+++ 
b/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/connection/DummyConnection.java
@@ -18,112 +18,43 @@ under the License.
 */
 package org.apache.plc4x.java.examples.dummydriver.connection;
 
+import java.net.InetAddress;
 import java.util.concurrent.CompletableFuture;
-import java.util.concurrent.ExecutionException;
 
-import org.apache.plc4x.java.api.connection.AbstractPlcConnection;
+import io.netty.channel.*;
 import org.apache.plc4x.java.api.connection.PlcReader;
 import org.apache.plc4x.java.api.connection.PlcWriter;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
 import org.apache.plc4x.java.api.messages.PlcRequestContainer;
 import org.apache.plc4x.java.api.messages.PlcWriteRequest;
 import org.apache.plc4x.java.api.messages.PlcWriteResponse;
 import org.apache.plc4x.java.api.model.Address;
+import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
 import org.apache.plc4x.java.examples.dummydriver.model.DummyAddress;
-import org.apache.plc4x.java.examples.dummydriver.netty.DummyProtocol;
-import org.apache.plc4x.java.utils.rawsockets.netty.RawSocketAddress;
-import org.apache.plc4x.java.utils.rawsockets.netty.RawSocketChannel;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import io.netty.bootstrap.Bootstrap;
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
-import io.netty.channel.ChannelInitializer;
-import io.netty.channel.ChannelPipeline;
-import io.netty.channel.DefaultEventLoopGroup;
-import io.netty.channel.EventLoopGroup;
-
 public class DummyConnection extends AbstractPlcConnection implements 
PlcReader, PlcWriter {
 
     @SuppressWarnings("unused")
     private static final Logger logger = 
LoggerFactory.getLogger(DummyConnection.class);
 
-    private final String hostName;
-
-    private EventLoopGroup workerGroup;
-    private Channel channel;
     @SuppressWarnings("unused")
     private boolean connected;
 
-    public DummyConnection(String hostName) {
-        this.hostName = hostName;
-        this.connected = false;
-    }
-
-    public String getHostName() {
-        return hostName;
+    public DummyConnection(InetAddress host) {
+        super(new TcpSocketChannelFactory(host, 42));
     }
 
     @Override
-    public void connect() throws PlcConnectionException {
-        workerGroup = new DefaultEventLoopGroup() {
+    protected ChannelHandler getChannelHandler(CompletableFuture<Void> 
sessionSetupCompleteFuture) {
+        return new ChannelInitializer() {
+            @Override
+            protected void initChannel(Channel channel) {
+            }
         };
-
-        try {
-            // As we don't just want to wait till the connection is 
established,
-            // define a future we can use to signal back that the s7 session is
-            // finished initializing.
-            CompletableFuture<Void> sessionSetupCompleteFuture = new 
CompletableFuture<>();
-
-            RawSocketAddress serverSocketAddress = new 
RawSocketAddress(hostName);
-
-            Bootstrap bootstrap = new Bootstrap();
-            bootstrap.group(workerGroup);
-            bootstrap.channel(RawSocketChannel.class);
-            bootstrap.handler(new ChannelInitializer<Channel>() {
-                @Override
-                protected void initChannel(Channel channel) throws Exception {
-                    ChannelPipeline pipeline = channel.pipeline();
-                    pipeline.addLast(new DummyProtocol());
-                }
-            });
-            // Start the client.
-            ChannelFuture f = bootstrap.connect(serverSocketAddress).sync();
-            f.awaitUninterruptibly();
-            // Wait till the session is finished initializing.
-            channel = f.channel();
-
-            sessionSetupCompleteFuture.get();
-
-            connected = true;
-        } catch (InterruptedException e) {
-            Thread.currentThread().interrupt();
-            throw new PlcConnectionException(e);
-        }
-        catch (ExecutionException e) {
-            throw new PlcConnectionException(e);
-        }
-    }
-
-    @Override
-    public void close() throws Exception {
-        if((channel != null) && channel.isOpen()) {
-            channel.closeFuture().await();
-        }
-
-        if (workerGroup != null) {
-            workerGroup.shutdownGracefully();
-        }
-
-        connected = false;
-    }
-
-    @Override
-    public boolean isConnected() {
-        return true;
     }
 
     @Override
diff --git a/integrations/apache-edgent/pom.xml 
b/integrations/apache-edgent/pom.xml
index dd29585..f65db43 100644
--- a/integrations/apache-edgent/pom.xml
+++ b/integrations/apache-edgent/pom.xml
@@ -66,6 +66,12 @@
       <version>0.0.1-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-test</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git 
a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java
 
b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java
index 6500ffe..f0fc069 100644
--- 
a/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java
+++ 
b/integrations/apache-edgent/src/test/java/org/apache/plc4x/edgent/mock/MockConnection.java
@@ -26,11 +26,8 @@ import java.util.Map;
 import java.util.concurrent.CompletableFuture;
 
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
-import org.apache.plc4x.java.api.connection.AbstractPlcConnection;
 import org.apache.plc4x.java.api.connection.PlcReader;
 import org.apache.plc4x.java.api.connection.PlcWriter;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.exceptions.PlcIoException;
 import org.apache.plc4x.java.api.messages.PlcReadRequest;
 import org.apache.plc4x.java.api.messages.PlcReadResponse;
@@ -47,7 +44,7 @@ import 
org.apache.plc4x.java.api.messages.specific.TypeSafePlcWriteResponse;
 import org.apache.plc4x.java.api.model.Address;
 import org.apache.plc4x.java.api.types.ResponseCode;
 
-public class MockConnection extends AbstractPlcConnection implements 
PlcReader, PlcWriter {
+public class MockConnection extends 
org.apache.plc4x.java.base.connection.MockConnection implements PlcReader, 
PlcWriter {
 
     private final String url;
     private final PlcAuthentication authentication;
@@ -65,36 +62,18 @@ public class MockConnection extends AbstractPlcConnection 
implements PlcReader,
     }
 
     public MockConnection(String url, PlcAuthentication authentication) {
+        super();
         this.url = url;
         this.authentication = authentication;
         this.connected = false;
     }
 
-    public PlcAuthentication getAuthentication() {
-        return authentication;
-    }
-
     public String getUrl() {
         return url;
     }
 
     @Override
-    public boolean isConnected() {
-        return connected;
-    }
-
-    @Override
-    public void connect() throws PlcConnectionException {
-        connected = true;
-    }
-
-    @Override
-    public void close() throws Exception {
-        connected = false;
-    }
-
-    @Override
-    public Address parseAddress(String addressString) throws PlcException {
+    public Address parseAddress(String addressString) {
         return new MockAddress(addressString);
     }
 
@@ -119,7 +98,7 @@ public class MockConnection extends AbstractPlcConnection 
implements PlcReader,
         if (readRequest instanceof TypeSafePlcReadRequest) {
             @SuppressWarnings("unchecked")
             TypeSafePlcReadRequest<Object> readReq = 
(TypeSafePlcReadRequest<Object>) readRequest;
-            response = new TypeSafePlcReadResponse<Object>(readReq, 
responseItems);
+            response = new TypeSafePlcReadResponse<>(readReq, responseItems);
         } else {
             response = new PlcReadResponse(readRequest, responseItems);
         }
@@ -146,7 +125,7 @@ public class MockConnection extends AbstractPlcConnection 
implements PlcReader,
         PlcWriteResponse response;
         if (writeRequest instanceof TypeSafePlcWriteRequest) {
             TypeSafePlcWriteRequest<Object> writeReq = 
(TypeSafePlcWriteRequest<Object>) writeRequest;
-            response = new TypeSafePlcWriteResponse<Object>(writeReq, 
responseItems);
+            response = new TypeSafePlcWriteResponse<>(writeReq, responseItems);
         } else {
             response = new PlcWriteResponse(writeRequest, responseItems);
         }
diff --git a/plc4j/core/pom.xml b/plc4j/core/pom.xml
index e39c2ad..1a28641 100644
--- a/plc4j/core/pom.xml
+++ b/plc4j/core/pom.xml
@@ -45,6 +45,23 @@
       <version>0.0.1-SNAPSHOT</version>
       <scope>test</scope>
     </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-base</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-test</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+      <scope>test</scope>
+    </dependency>
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
+      <scope>test</scope>
+    </dependency>
   </dependencies>
 
 </project>
\ No newline at end of file
diff --git 
a/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java 
b/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
index 5897b91..c02e2f9 100644
--- a/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
+++ b/plc4j/core/src/test/java/org/apache/plc4x/java/PlcDriverManagerTest.java
@@ -50,7 +50,6 @@ public class PlcDriverManagerTest {
         MockConnection mockConnection = (MockConnection) new 
PlcDriverManager().getConnection("mock://some-cool-url");
         assertThat(mockConnection.getAuthentication(), nullValue());
         assertThat(mockConnection.isConnected(), is(true));
-        assertThat(mockConnection.isClosed(), is(false));
     }
 
     /**
@@ -68,7 +67,6 @@ public class PlcDriverManagerTest {
         assertThat(mockConnection.getAuthentication(), notNullValue());
         assertThat(mockConnection.getAuthentication(), 
instanceOf(PlcUsernamePasswordAuthentication.class));
         assertThat(mockConnection.isConnected(), is(true));
-        assertThat(mockConnection.isClosed(), is(false));
     }
 
     /**
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
index 83e833e..36c56f8 100644
--- 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
@@ -18,49 +18,40 @@ 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.api.connection.AbstractPlcConnection;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.api.exceptions.PlcException;
 import org.apache.plc4x.java.api.model.Address;
+import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.TestChannelFactory;
+
+import java.util.concurrent.CompletableFuture;
 
 public class MockConnection extends AbstractPlcConnection {
 
     private final PlcAuthentication authentication;
 
-    boolean connected = false;
-    boolean closed = true;
-
     public MockConnection(PlcAuthentication authentication) {
+        super(new TestChannelFactory());
         this.authentication = authentication;
     }
 
-    public PlcAuthentication getAuthentication() {
-        return authentication;
-    }
-
-    public boolean isConnected() {
-        return connected;
-    }
-
-    public boolean isClosed() {
-        return closed;
-    }
-
     @Override
-    public void connect() throws PlcConnectionException {
-        connected = true;
-        closed = false;
+    protected ChannelHandler getChannelHandler(CompletableFuture<Void> 
sessionSetupCompleteFuture) {
+        return new ChannelInitializer() {
+            @Override
+            protected void initChannel(Channel channel) {
+            }
+        };
     }
 
-    @Override
-    public void close() throws Exception {
-        connected = false;
-        closed = true;
+    public PlcAuthentication getAuthentication() {
+        return authentication;
     }
 
     @Override
-    public Address parseAddress(String addressString) throws PlcException {
+    public Address parseAddress(String addressString) {
         return null;
     }
 
diff --git a/plc4j/protocols/ads/pom.xml b/plc4j/protocols/ads/pom.xml
index 3eddb41..fbeacab 100644
--- a/plc4j/protocols/ads/pom.xml
+++ b/plc4j/protocols/ads/pom.xml
@@ -46,6 +46,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-core</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <scope>runtime</scope>
diff --git a/plc4j/protocols/driver-base/pom.xml 
b/plc4j/protocols/driver-bases/base/pom.xml
similarity index 74%
copy from plc4j/protocols/driver-base/pom.xml
copy to plc4j/protocols/driver-bases/base/pom.xml
index b01ae7f..61c0459 100644
--- a/plc4j/protocols/driver-base/pom.xml
+++ b/plc4j/protocols/driver-bases/base/pom.xml
@@ -29,28 +29,8 @@
   </parent>
 
   <artifactId>plc4j-protocol-driver-base</artifactId>
-  <name>PLC4J: Protocol: Driver-Base</name>
-  <description>Base classes needed to implement plc4x drivers.</description>
-
-  <build>
-    <plugins>
-      <!--
-        Also create a jar from the test-code as
-        we use this in other drivers test-suites.
-      -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
+  <name>PLC4J: Protocol: Driver-Base: Base</name>
+  <description>Base classes needed to implement all of the other driver 
bases.</description>
 
   <dependencies>
     <dependency>
diff --git 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
similarity index 100%
rename from 
plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
rename to 
plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/AbstractPlcConnection.java
diff --git 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
 
b/plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
similarity index 100%
copy from 
plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
copy to 
plc4j/protocols/driver-bases/base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
diff --git a/plc4j/protocols/pom.xml b/plc4j/protocols/driver-bases/pom.xml
similarity index 78%
copy from plc4j/protocols/pom.xml
copy to plc4j/protocols/driver-bases/pom.xml
index 49d2965..fb84b30 100644
--- a/plc4j/protocols/pom.xml
+++ b/plc4j/protocols/driver-bases/pom.xml
@@ -28,17 +28,18 @@
     <version>0.0.1-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-protocols</artifactId>
+  <artifactId>plc4j-protocols-driver-bases</artifactId>
   <packaging>pom</packaging>
 
-  <name>PLC4J: Protocols</name>
-  <description>Wrapper project for all PLC4J protocol 
implementations.</description>
+  <name>PLC4J: Protocols: Driver-Bases</name>
+  <description>Collection of base-types for implementing different types of 
drivers.</description>
 
   <modules>
-    <module>ads</module>
-    <module>driver-base</module>
-    <module>s7</module>
-    <module>benchmarks</module>
+    <module>base</module>
+    <module>raw-socket</module>
+    <module>serial</module>
+    <module>tcp</module>
+    <module>test</module>
   </modules>
 
 </project>
\ No newline at end of file
diff --git a/plc4j/protocols/driver-base/pom.xml 
b/plc4j/protocols/driver-bases/raw-socket/pom.xml
similarity index 71%
copy from plc4j/protocols/driver-base/pom.xml
copy to plc4j/protocols/driver-bases/raw-socket/pom.xml
index b01ae7f..44e22b5 100644
--- a/plc4j/protocols/driver-base/pom.xml
+++ b/plc4j/protocols/driver-bases/raw-socket/pom.xml
@@ -28,37 +28,28 @@
     <version>0.0.1-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-protocol-driver-base</artifactId>
-  <name>PLC4J: Protocol: Driver-Base</name>
-  <description>Base classes needed to implement plc4x drivers.</description>
-
-  <build>
-    <plugins>
-      <!--
-        Also create a jar from the test-code as
-        we use this in other drivers test-suites.
-      -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
+  <artifactId>plc4j-protocol-driver-base-raw-socket</artifactId>
+  <name>PLC4J: Protocol: Driver-Base: Raw Socket</name>
+  <description>Base classes needed to implement plc4x drivers based on Raw 
Socket connections.</description>
 
   <dependencies>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-api</artifactId>
       <version>0.0.1-SNAPSHOT</version>
     </dependency>
 
+    <!--dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-utils-raw-sockets</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency-->
+
     <dependency>
       <groupId>io.netty</groupId>
       <artifactId>netty-transport</artifactId>
diff --git 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
 
b/plc4j/protocols/driver-bases/raw-socket/src/main/java/org/apache/plc4x/java/base/connection/RawSocketChannelFactory.java
similarity index 78%
copy from 
plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
copy to 
plc4j/protocols/driver-bases/raw-socket/src/main/java/org/apache/plc4x/java/base/connection/RawSocketChannelFactory.java
index 8cb8d08..a6fe95e 100644
--- 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/raw-socket/src/main/java/org/apache/plc4x/java/base/connection/RawSocketChannelFactory.java
@@ -18,46 +18,44 @@ under the License.
 */
 package org.apache.plc4x.java.base.connection;
 
-import io.netty.bootstrap.Bootstrap;
 import io.netty.channel.Channel;
-import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandler;
-import io.netty.channel.ChannelOption;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioSocketChannel;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 
 import java.net.InetAddress;
 
-public class TcpSocketChannelFactory implements ChannelFactory {
+public class RawSocketChannelFactory implements ChannelFactory {
 
     private final InetAddress address;
     private final int port;
+    private final int protocolId;
 
-    public TcpSocketChannelFactory(InetAddress address, int port) {
+    public RawSocketChannelFactory(InetAddress address, int port, int 
protocolId) {
         this.address = address;
         this.port = port;
+        this.protocolId = protocolId;
     }
 
     @Override
     public Channel createChannel(ChannelHandler channelHandler)
         throws PlcConnectionException {
-        try {
+        /*try {
             Bootstrap bootstrap = new Bootstrap();
             bootstrap.group(new NioEventLoopGroup());
-            bootstrap.channel(NioSocketChannel.class);
+            bootstrap.channel(RawSocketChannel.class);
             bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
             bootstrap.option(ChannelOption.TCP_NODELAY, true);
             bootstrap.handler(channelHandler);
             // Start the client.
-            ChannelFuture f = bootstrap.connect(address, port).sync();
+            ChannelFuture f = bootstrap.connect(address).sync();
             f.awaitUninterruptibly();
             // Wait till the session is finished initializing.
             return f.channel();
         } catch (InterruptedException e) {
             Thread.currentThread().interrupt();
             throw new PlcConnectionException("Error creating channel.", e);
-        }
+        }*/
+        return null;
     }
 
 }
diff --git a/plc4j/protocols/driver-base/pom.xml 
b/plc4j/protocols/driver-bases/serial/pom.xml
similarity index 71%
rename from plc4j/protocols/driver-base/pom.xml
rename to plc4j/protocols/driver-bases/serial/pom.xml
index b01ae7f..833ac06 100644
--- a/plc4j/protocols/driver-base/pom.xml
+++ b/plc4j/protocols/driver-bases/serial/pom.xml
@@ -28,33 +28,18 @@
     <version>0.0.1-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-protocol-driver-base</artifactId>
-  <name>PLC4J: Protocol: Driver-Base</name>
-  <description>Base classes needed to implement plc4x drivers.</description>
-
-  <build>
-    <plugins>
-      <!--
-        Also create a jar from the test-code as
-        we use this in other drivers test-suites.
-      -->
-      <plugin>
-        <groupId>org.apache.maven.plugins</groupId>
-        <artifactId>maven-jar-plugin</artifactId>
-        <executions>
-          <execution>
-            <goals>
-              <goal>test-jar</goal>
-            </goals>
-          </execution>
-        </executions>
-      </plugin>
-    </plugins>
-  </build>
+  <artifactId>plc4j-protocol-driver-base-serial</artifactId>
+  <name>PLC4J: Protocol: Driver-Base: Serial</name>
+  <description>Base classes needed to implement plc4x drivers based on Serial 
connections.</description>
 
   <dependencies>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-api</artifactId>
       <version>0.0.1-SNAPSHOT</version>
     </dependency>
@@ -63,6 +48,11 @@
       <groupId>io.netty</groupId>
       <artifactId>netty-transport</artifactId>
     </dependency>
+    <dependency>
+      <groupId>se.koc</groupId>
+      <artifactId>netty-transport-jserialcomm</artifactId>
+      <version>1.0.0</version>
+    </dependency>
 
     <dependency>
       <groupId>ch.qos.logback</groupId>
diff --git 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
 
b/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java
similarity index 76%
copy from 
plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
copy to 
plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java
index 8cb8d08..5f0c621 100644
--- 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/serial/src/main/java/org/apache/plc4x/java/base/connection/SerialChannelFactory.java
@@ -23,34 +23,33 @@ import io.netty.channel.Channel;
 import io.netty.channel.ChannelFuture;
 import io.netty.channel.ChannelHandler;
 import io.netty.channel.ChannelOption;
-import io.netty.channel.nio.NioEventLoopGroup;
-import io.netty.channel.socket.nio.NioSocketChannel;
+import io.netty.channel.jsc.JSerialCommChannel;
+import io.netty.channel.jsc.JSerialCommDeviceAddress;
+import io.netty.channel.oio.OioEventLoopGroup;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
 
-import java.net.InetAddress;
+public class SerialChannelFactory implements ChannelFactory {
 
-public class TcpSocketChannelFactory implements ChannelFactory {
+    private final String port;
 
-    private final InetAddress address;
-    private final int port;
-
-    public TcpSocketChannelFactory(InetAddress address, int port) {
-        this.address = address;
+    public SerialChannelFactory(String port) {
         this.port = port;
     }
 
     @Override
     public Channel createChannel(ChannelHandler channelHandler)
         throws PlcConnectionException {
+        JSerialCommDeviceAddress address = new JSerialCommDeviceAddress(port);
+
         try {
             Bootstrap bootstrap = new Bootstrap();
-            bootstrap.group(new NioEventLoopGroup());
-            bootstrap.channel(NioSocketChannel.class);
+            bootstrap.group(new OioEventLoopGroup());
+            bootstrap.channel(JSerialCommChannel.class);
             bootstrap.option(ChannelOption.SO_KEEPALIVE, true);
             bootstrap.option(ChannelOption.TCP_NODELAY, true);
             bootstrap.handler(channelHandler);
             // Start the client.
-            ChannelFuture f = bootstrap.connect(address, port).sync();
+            ChannelFuture f = bootstrap.connect(address).sync();
             f.awaitUninterruptibly();
             // Wait till the session is finished initializing.
             return f.channel();
diff --git a/plc4j/core/pom.xml b/plc4j/protocols/driver-bases/tcp/pom.xml
similarity index 72%
copy from plc4j/core/pom.xml
copy to plc4j/protocols/driver-bases/tcp/pom.xml
index e39c2ad..7e9637d 100644
--- a/plc4j/core/pom.xml
+++ b/plc4j/protocols/driver-bases/tcp/pom.xml
@@ -24,26 +24,34 @@
 
   <parent>
     <groupId>org.apache.plc4x</groupId>
-    <artifactId>plc4j</artifactId>
+    <artifactId>plc4j-protocols</artifactId>
     <version>0.0.1-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-driver-base-tcp</artifactId>
+  <name>PLC4J: Protocol: Driver-Base: TCP</name>
+  <description>Base classes needed to implement plc4x drivers based on TCP 
connections.</description>
 
   <dependencies>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-api</artifactId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
       <version>0.0.1-SNAPSHOT</version>
     </dependency>
-
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-utils-test-utils</artifactId>
+      <artifactId>plc4j-api</artifactId>
       <version>0.0.1-SNAPSHOT</version>
-      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
     </dependency>
   </dependencies>
 
diff --git 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
 
b/plc4j/protocols/driver-bases/tcp/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
similarity index 100%
rename from 
plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
rename to 
plc4j/protocols/driver-bases/tcp/src/main/java/org/apache/plc4x/java/base/connection/TcpSocketChannelFactory.java
diff --git a/plc4j/core/pom.xml b/plc4j/protocols/driver-bases/test/pom.xml
similarity index 72%
copy from plc4j/core/pom.xml
copy to plc4j/protocols/driver-bases/test/pom.xml
index e39c2ad..0500a68 100644
--- a/plc4j/core/pom.xml
+++ b/plc4j/protocols/driver-bases/test/pom.xml
@@ -24,26 +24,34 @@
 
   <parent>
     <groupId>org.apache.plc4x</groupId>
-    <artifactId>plc4j</artifactId>
+    <artifactId>plc4j-protocols</artifactId>
     <version>0.0.1-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-driver-base-test</artifactId>
+  <name>PLC4J: Protocol: Driver-Base: Test</name>
+  <description>Base classes needed to implement plc4x drivers for testing 
using internal byte streams.</description>
 
   <dependencies>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-api</artifactId>
+      <artifactId>plc4j-protocol-driver-base</artifactId>
       <version>0.0.1-SNAPSHOT</version>
     </dependency>
-
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-utils-test-utils</artifactId>
+      <artifactId>plc4j-api</artifactId>
       <version>0.0.1-SNAPSHOT</version>
-      <scope>test</scope>
+    </dependency>
+
+    <dependency>
+      <groupId>io.netty</groupId>
+      <artifactId>netty-transport</artifactId>
+    </dependency>
+
+    <dependency>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
     </dependency>
   </dependencies>
 
diff --git 
a/plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
 
b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java
similarity index 56%
copy from 
plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
copy to 
plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java
index 9d8adf5..a21d869 100644
--- 
a/plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
+++ 
b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/MockConnection.java
@@ -18,15 +18,30 @@ under the License.
 */
 package org.apache.plc4x.java.base.connection;
 
-import io.netty.channel.Channel;
 import io.netty.channel.ChannelHandler;
-import io.netty.channel.embedded.EmbeddedChannel;
+import org.apache.plc4x.java.api.exceptions.PlcException;
+import org.apache.plc4x.java.api.model.Address;
 
-public class TestChannelFactory implements ChannelFactory {
+import java.util.concurrent.CompletableFuture;
+
+public class MockConnection extends AbstractPlcConnection {
+
+    public MockConnection() {
+        super(new TestChannelFactory());
+    }
+
+    public MockConnection(boolean awaitSessionSetupComplete) {
+        super(new TestChannelFactory(), awaitSessionSetupComplete);
+    }
+
+    @Override
+    protected ChannelHandler getChannelHandler(CompletableFuture<Void> 
sessionSetupCompleteFuture) {
+        return null;
+    }
 
     @Override
-    public Channel createChannel(ChannelHandler channelHandler) {
-        return new EmbeddedChannel(channelHandler);
+    public Address parseAddress(String addressString) throws PlcException {
+        return null;
     }
 
 }
diff --git 
a/plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
 
b/plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
similarity index 100%
copy from 
plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
copy to 
plc4j/protocols/driver-bases/test/src/main/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
diff --git a/plc4j/protocols/ads/pom.xml b/plc4j/protocols/modbus/pom.xml
similarity index 79%
copy from plc4j/protocols/ads/pom.xml
copy to plc4j/protocols/modbus/pom.xml
index 3eddb41..5dc8759 100644
--- a/plc4j/protocols/ads/pom.xml
+++ b/plc4j/protocols/modbus/pom.xml
@@ -28,10 +28,9 @@
     <version>0.0.1-SNAPSHOT</version>
   </parent>
 
-  <artifactId>plc4j-protocol-ads</artifactId>
-  <name>PLC4J: Protocol: ADS</name>
-  <description>Implementation of a PLC4X driver able to speak with Beckhoff 
ADS devices using the ADS protocol.
-  </description>
+  <artifactId>plc4j-protocol-modbus</artifactId>
+  <name>PLC4J: Protocol: Modbus</name>
+  <description>Implementation of a PLC4X driver able to speak with Modbus 
devices using the Modbus protocol.</description>
 
   <dependencies>
     <dependency>
@@ -46,9 +45,13 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-core</artifactId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-serial</artifactId>
       <version>0.0.1-SNAPSHOT</version>
-      <scope>runtime</scope>
     </dependency>
 
     <dependency>
@@ -70,19 +73,8 @@
     </dependency>
 
     <dependency>
-      <groupId>commons-io</groupId>
-      <artifactId>commons-io</artifactId>
-    </dependency>
-    <dependency>
-      <groupId>commons-codec</groupId>
-      <artifactId>commons-codec</artifactId>
-      <scope>test</scope>
-    </dependency>
-    <!-- Used to create a pcap dump file for wireshark. -->
-    <dependency>
-      <groupId>org.pcap4j</groupId>
-      <artifactId>pcap4j-core</artifactId>
-      <scope>test</scope>
+      <groupId>ch.qos.logback</groupId>
+      <artifactId>logback-classic</artifactId>
     </dependency>
   </dependencies>
 
diff --git 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusSerialPlcDriver.java
similarity index 57%
copy from 
examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
copy to 
plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusSerialPlcDriver.java
index efc42c2..739ebb1 100644
--- 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusSerialPlcDriver.java
@@ -16,45 +16,55 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.examples.dummydriver;
+package org.apache.plc4x.java.modbus;
 
 import org.apache.plc4x.java.api.PlcDriver;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.examples.dummydriver.connection.DummyConnection;
+import org.apache.plc4x.java.modbus.connection.ModbusSerialPlcConnection;
+import org.apache.plc4x.java.modbus.connection.ModbusTcpPlcConnection;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class DummyDriver implements PlcDriver {
+/**
+ * Implementation of the Modbus protocol, based on:
+ * - Modbus Protocol 
(http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf)
+ * - TCP
+ */
+public class ModbusSerialPlcDriver implements PlcDriver {
 
-    private static final Pattern DUMMY_URI_PATTERN = 
Pattern.compile("^dummy://(?<host>.*)");
+    private static final Pattern MODBUS_SERIAL_URI_PATTERN = 
Pattern.compile("^modbus-serial://(?<port>.*)(?<params>\\?.*)?");
 
     @Override
     public String getProtocolCode() {
-        return "dummy";
+        return "modbus-serial";
     }
 
     @Override
     public String getProtocolName() {
-        return "Dummy";
+        return "Modbus (Serial)";
     }
 
     @Override
     public PlcConnection connect(String url) throws PlcConnectionException {
-        Matcher matcher = DUMMY_URI_PATTERN.matcher(url);
+        Matcher matcher = MODBUS_SERIAL_URI_PATTERN.matcher(url);
         if (!matcher.matches()) {
             throw new PlcConnectionException(
-                "Connection url doesn't match the format 'dummy://{host|ip}'");
+                "Connection url doesn't match the format 
'modbus-serial://{port}'");
         }
-        String host = matcher.group("host");
-        return new DummyConnection(host);
+
+        String port = matcher.group("port");
+        String params = matcher.group("params") != null ? 
matcher.group("params").substring(1) : null;
+        return new ModbusSerialPlcConnection(port, params);
     }
 
     @Override
     public PlcConnection connect(String url, PlcAuthentication authentication) 
throws PlcConnectionException {
-        throw new PlcConnectionException("Dummy connections don't support 
authentication.");
+        throw new PlcConnectionException("Modbus connections don't support 
authentication.");
     }
 
 }
diff --git 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusTcpPlcDriver.java
similarity index 52%
copy from 
examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
copy to 
plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusTcpPlcDriver.java
index efc42c2..225429d 100644
--- 
a/examples/dummy-driver/src/main/java/org/apache/plc4x/java/examples/dummydriver/DummyDriver.java
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/ModbusTcpPlcDriver.java
@@ -16,45 +16,61 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.examples.dummydriver;
+package org.apache.plc4x.java.modbus;
 
 import org.apache.plc4x.java.api.PlcDriver;
 import org.apache.plc4x.java.api.authentication.PlcAuthentication;
 import org.apache.plc4x.java.api.connection.PlcConnection;
 import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-import org.apache.plc4x.java.examples.dummydriver.connection.DummyConnection;
+import org.apache.plc4x.java.modbus.connection.ModbusSerialPlcConnection;
+import org.apache.plc4x.java.modbus.connection.ModbusTcpPlcConnection;
 
+import java.net.InetAddress;
+import java.net.UnknownHostException;
 import java.util.regex.Matcher;
 import java.util.regex.Pattern;
 
-public class DummyDriver implements PlcDriver {
+/**
+ * Implementation of the Modbus protocol, based on:
+ * - Modbus Protocol 
(http://www.modbus.org/docs/Modbus_Application_Protocol_V1_1b3.pdf)
+ * - Modbus TCP Protocol 
(http://www.modbus.org/docs/Modbus_Messaging_Implementation_Guide_V1_0b.pdf)
+ * - TCP
+ */
+public class ModbusTcpPlcDriver implements PlcDriver {
 
-    private static final Pattern DUMMY_URI_PATTERN = 
Pattern.compile("^dummy://(?<host>.*)");
+    private static final Pattern MODBUS_TCP_URI_PATTERN = 
Pattern.compile("^modbus-tcp://(?<host>.*)(?<params>\\?.*)?");
 
     @Override
     public String getProtocolCode() {
-        return "dummy";
+        return "modbus-tcp";
     }
 
     @Override
     public String getProtocolName() {
-        return "Dummy";
+        return "Modbus (TCP)";
     }
 
     @Override
     public PlcConnection connect(String url) throws PlcConnectionException {
-        Matcher matcher = DUMMY_URI_PATTERN.matcher(url);
+        Matcher matcher = MODBUS_TCP_URI_PATTERN.matcher(url);
         if (!matcher.matches()) {
             throw new PlcConnectionException(
-                "Connection url doesn't match the format 'dummy://{host|ip}'");
+                "Connection url doesn't match the format 
'modbus-tcp://{host|ip}'");
         }
+
         String host = matcher.group("host");
-        return new DummyConnection(host);
+        String params = matcher.group("params") != null ? 
matcher.group("params").substring(1) : null;
+        try {
+            InetAddress serverInetAddress = InetAddress.getByName(host);
+            return new ModbusTcpPlcConnection(serverInetAddress, params);
+        } catch (UnknownHostException e) {
+            throw new PlcConnectionException("Error parsing address", e);
+        }
     }
 
     @Override
     public PlcConnection connect(String url, PlcAuthentication authentication) 
throws PlcConnectionException {
-        throw new PlcConnectionException("Dummy connections don't support 
authentication.");
+        throw new PlcConnectionException("Modbus connections don't support 
authentication.");
     }
 
 }
diff --git 
a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
new file mode 100644
index 0000000..d2801c8
--- /dev/null
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/BaseModbusPlcConnection.java
@@ -0,0 +1,93 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.java.modbus.connection;
+
+import org.apache.commons.lang3.StringUtils;
+import org.apache.plc4x.java.api.connection.PlcReader;
+import org.apache.plc4x.java.api.connection.PlcWriter;
+import org.apache.plc4x.java.api.exceptions.PlcException;
+import org.apache.plc4x.java.api.messages.*;
+import org.apache.plc4x.java.api.model.Address;
+import org.apache.plc4x.java.base.connection.AbstractPlcConnection;
+import org.apache.plc4x.java.base.connection.ChannelFactory;
+import org.apache.plc4x.java.modbus.model.ModbusAddress;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.CompletableFuture;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
+
+public abstract class BaseModbusPlcConnection extends AbstractPlcConnection 
implements PlcReader, PlcWriter {
+
+    private static final Pattern MODBUS_ADDRESS_PATTERN =
+        
Pattern.compile("^(?<memoryArea>.*?)/(?<byteOffset>\\d{1,4})(?:/(?<bitOffset>\\d))?");
+
+    private static final Logger logger = 
LoggerFactory.getLogger(BaseModbusPlcConnection.class);
+
+    protected BaseModbusPlcConnection(ChannelFactory channelFactory, String 
params) {
+        super(channelFactory, true);
+
+        if (!StringUtils.isEmpty(params)) {
+            for (String param : params.split("&")) {
+                String[] paramElements = param.split("=");
+                String paramName = paramElements[0];
+                if (paramElements.length == 2) {
+                    String paramValue = paramElements[1];
+                    switch (paramName) {
+                        default:
+                            logger.debug("Unknown parameter {} with value {}", 
paramName, paramValue);
+                    }
+                } else {
+                    logger.debug("Unknown no-value parameter {}", paramName);
+                }
+            }
+        }
+    }
+
+    @Override
+    public Address parseAddress(String addressString) throws PlcException {
+        Matcher addressMatcher = MODBUS_ADDRESS_PATTERN.matcher(addressString);
+        if (addressMatcher.matches()) {
+            /*int datablockNumber = 
Integer.parseInt(datablockAddressMatcher.group("blockNumber"));
+            int datablockByteOffset = 
Integer.parseInt(datablockAddressMatcher.group("byteOffset"));*/
+            return new ModbusAddress();
+        }
+        return null;
+    }
+
+    @Override
+    public CompletableFuture<PlcReadResponse> read(PlcReadRequest readRequest) 
{
+        CompletableFuture<PlcReadResponse> readFuture = new 
CompletableFuture<>();
+        PlcRequestContainer<PlcReadRequest, PlcReadResponse> container =
+            new PlcRequestContainer<>(readRequest, readFuture);
+        channel.writeAndFlush(container);
+        return readFuture;
+    }
+
+    @Override
+    public CompletableFuture<PlcWriteResponse> write(PlcWriteRequest 
writeRequest) {
+        CompletableFuture<PlcWriteResponse> writeFuture = new 
CompletableFuture<>();
+        PlcRequestContainer<PlcWriteRequest, PlcWriteResponse> container =
+            new PlcRequestContainer<>(writeRequest, writeFuture);
+        channel.writeAndFlush(container);
+        return writeFuture;
+    }
+
+}
diff --git 
a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
new file mode 100644
index 0000000..696181d
--- /dev/null
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusSerialPlcConnection.java
@@ -0,0 +1,58 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.java.modbus.connection;
+
+import io.netty.channel.Channel;
+import io.netty.channel.ChannelHandler;
+import io.netty.channel.ChannelInitializer;
+import io.netty.channel.ChannelPipeline;
+import org.apache.plc4x.java.base.connection.SerialChannelFactory;
+import org.apache.plc4x.java.modbus.netty.ModbusProtocol;
+import org.apache.plc4x.java.modbus.netty.ModbusSerialProtocol;
+import org.apache.plc4x.java.modbus.netty.Plc4XModbusProtocol;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.util.concurrent.CompletableFuture;
+
+public class ModbusSerialPlcConnection extends BaseModbusPlcConnection {
+
+    private static final Logger logger = 
LoggerFactory.getLogger(ModbusSerialPlcConnection.class);
+
+    public ModbusSerialPlcConnection(String port, String params) {
+        super(new SerialChannelFactory(port), params);
+
+        logger.info("Configured ModbusSerialPlcConnection with: serial-port 
{}", port);
+    }
+
+    @Override
+    protected ChannelHandler getChannelHandler(CompletableFuture<Void> 
sessionSetupCompleteFuture) {
+        return new ChannelInitializer() {
+            @Override
+            protected void initChannel(Channel channel) {
+                // Build the protocol stack for communicating with the s7 
protocol.
+                ChannelPipeline pipeline = channel.pipeline();
+                pipeline.addLast(new ModbusSerialProtocol());
+                pipeline.addLast(new ModbusProtocol());
+                pipeline.addLast(new Plc4XModbusProtocol());
+            }
+        };
+    }
+
+}
diff --git 
a/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
new file mode 100644
index 0000000..fc2a9b2
--- /dev/null
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/connection/ModbusTcpPlcConnection.java
@@ -0,0 +1,58 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+KIND, either express or implied.  See the License for the
+specific language governing permissions and limitations
+under the License.
+*/
+package org.apache.plc4x.java.modbus.connection;
+
+import io.netty.channel.*;
+import org.apache.plc4x.java.base.connection.TcpSocketChannelFactory;
+import org.apache.plc4x.java.modbus.netty.ModbusProtocol;
+import org.apache.plc4x.java.modbus.netty.ModbusTcpProtocol;
+import org.apache.plc4x.java.modbus.netty.Plc4XModbusProtocol;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.net.InetAddress;
+import java.util.concurrent.CompletableFuture;
+
+public class ModbusTcpPlcConnection extends BaseModbusPlcConnection {
+
+    private static final int MODBUS_TCP_PORT = 502;
+
+    private static final Logger logger = 
LoggerFactory.getLogger(ModbusTcpPlcConnection.class);
+
+    public ModbusTcpPlcConnection(InetAddress address, String params) {
+        super(new TcpSocketChannelFactory(address, MODBUS_TCP_PORT), params);
+
+        logger.info("Configured ModbusTcpPlcConnection with: host-name {}", 
address.getHostAddress());
+    }
+
+    @Override
+    protected ChannelHandler getChannelHandler(CompletableFuture<Void> 
sessionSetupCompleteFuture) {
+        return new ChannelInitializer() {
+            @Override
+            protected void initChannel(Channel channel) {
+                // Build the protocol stack for communicating with the s7 
protocol.
+                ChannelPipeline pipeline = channel.pipeline();
+                pipeline.addLast(new ModbusTcpProtocol());
+                pipeline.addLast(new ModbusProtocol());
+                pipeline.addLast(new Plc4XModbusProtocol());
+            }
+        };
+    }
+
+}
diff --git 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ModbusAddress.java
similarity index 70%
copy from 
plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
copy to 
plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ModbusAddress.java
index b3e3e6b..da35302 100644
--- 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/model/ModbusAddress.java
@@ -16,15 +16,9 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.base.connection;
+package org.apache.plc4x.java.modbus.model;
 
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-
-public interface ChannelFactory {
-
-    Channel createChannel(ChannelHandler channelHandler)
-        throws PlcConnectionException;
+import org.apache.plc4x.java.api.model.Address;
 
+public class ModbusAddress implements Address {
 }
diff --git 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/AbstractPlcConnection.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusProtocol.java
similarity index 53%
rename from 
plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/AbstractPlcConnection.java
rename to 
plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusProtocol.java
index 0216091..c5a1aaa 100644
--- 
a/plc4j/api/src/main/java/org/apache/plc4x/java/api/connection/AbstractPlcConnection.java
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusProtocol.java
@@ -16,34 +16,25 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.api.connection;
+package org.apache.plc4x.java.modbus.netty;
 
-import java.util.Optional;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageCodec;
+import org.apache.plc4x.java.modbus.netty.model.ModbusMessage;
 
-public abstract class AbstractPlcConnection implements PlcConnection {
+import java.util.List;
 
-    @Override
-    public Optional<PlcLister> getLister() {
-        if(this instanceof PlcLister) {
-            return Optional.of((PlcLister) this);
-        }
-        return Optional.empty();
-    }
+public class ModbusProtocol extends MessageToMessageCodec<ByteBuf, 
ModbusMessage> {
 
     @Override
-    public Optional<PlcReader> getReader() {
-        if(this instanceof PlcReader) {
-            return Optional.of((PlcReader) this);
-        }
-        return Optional.empty();
+    protected void encode(ChannelHandlerContext ctx, ModbusMessage msg, 
List<Object> out) throws Exception {
+
     }
 
     @Override
-    public Optional<PlcWriter> getWriter() {
-        if(this instanceof PlcWriter) {
-            return Optional.of((PlcWriter) this);
-        }
-        return Optional.empty();
+    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> 
out) throws Exception {
+
     }
 
 }
diff --git 
a/plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusSerialProtocol.java
similarity index 60%
copy from 
plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
copy to 
plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusSerialProtocol.java
index 9d8adf5..3cc5a17 100644
--- 
a/plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusSerialProtocol.java
@@ -16,17 +16,24 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.base.connection;
+package org.apache.plc4x.java.modbus.netty;
 
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.embedded.EmbeddedChannel;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageCodec;
 
-public class TestChannelFactory implements ChannelFactory {
+import java.util.List;
+
+public class ModbusSerialProtocol extends MessageToMessageCodec<ByteBuf, 
ByteBuf> {
+
+    @Override
+    protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> 
out) throws Exception {
+
+    }
 
     @Override
-    public Channel createChannel(ChannelHandler channelHandler) {
-        return new EmbeddedChannel(channelHandler);
+    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> 
out) throws Exception {
+
     }
 
 }
diff --git 
a/plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusTcpProtocol.java
similarity index 60%
rename from 
plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
rename to 
plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusTcpProtocol.java
index 9d8adf5..7131366 100644
--- 
a/plc4j/protocols/driver-base/src/test/java/org/apache/plc4x/java/base/connection/TestChannelFactory.java
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/ModbusTcpProtocol.java
@@ -16,17 +16,24 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.base.connection;
+package org.apache.plc4x.java.modbus.netty;
 
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import io.netty.channel.embedded.EmbeddedChannel;
+import io.netty.buffer.ByteBuf;
+import io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageCodec;
 
-public class TestChannelFactory implements ChannelFactory {
+import java.util.List;
+
+public class ModbusTcpProtocol extends MessageToMessageCodec<ByteBuf, ByteBuf> 
{
+
+    @Override
+    protected void encode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> 
out) throws Exception {
+
+    }
 
     @Override
-    public Channel createChannel(ChannelHandler channelHandler) {
-        return new EmbeddedChannel(channelHandler);
+    protected void decode(ChannelHandlerContext ctx, ByteBuf msg, List<Object> 
out) throws Exception {
+
     }
 
 }
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
new file mode 100644
index 0000000..e217bfb
--- /dev/null
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/Plc4XModbusProtocol.java
@@ -0,0 +1,68 @@
+/*
+Licensed to the Apache Software Foundation (ASF) under one
+or more contributor license agreements.  See the NOTICE file
+distributed with this work for additional information
+regarding copyright ownership.  The ASF licenses this file
+to you under the Apache License, Version 2.0 (the
+"License"); you may not use this file except in compliance
+with the License.  You may obtain a copy of the License at
+
+  http://www.apache.org/licenses/LICENSE-2.0
+
+Unless required by applicable law or agreed to in writing,
+software distributed under the License is distributed on an
+"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+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 io.netty.channel.ChannelHandlerContext;
+import io.netty.handler.codec.MessageToMessageCodec;
+import org.apache.plc4x.java.api.exceptions.PlcException;
+import org.apache.plc4x.java.api.messages.*;
+import org.apache.plc4x.java.modbus.netty.model.ModbusMessage;
+
+import java.util.*;
+
+public class Plc4XModbusProtocol extends MessageToMessageCodec<ModbusMessage, 
PlcRequestContainer> {
+
+    public Plc4XModbusProtocol() {
+    }
+
+    @Override
+    protected void encode(ChannelHandlerContext ctx, PlcRequestContainer msg, 
List<Object> out) throws Exception {
+        PlcRequest request = msg.getRequest();
+        if (request instanceof PlcReadRequest) {
+            encodeReadRequest(msg, out);
+        } else if (request instanceof PlcWriteRequest) {
+            encodeWriteRequest(msg, out);
+        }
+    }
+
+    private void encodeWriteRequest(PlcRequestContainer msg, List<Object> out) 
throws PlcException {
+
+    }
+
+    private void encodeReadRequest(PlcRequestContainer msg, List<Object> out) 
throws PlcException {
+
+    }
+
+    @SuppressWarnings("unchecked")
+    @Override
+    protected void decode(ChannelHandlerContext ctx, ModbusMessage msg, 
List<Object> out) throws Exception {
+
+    }
+
+    
////////////////////////////////////////////////////////////////////////////////
+    // Encoding helpers.
+    
////////////////////////////////////////////////////////////////////////////////
+
+
+    
////////////////////////////////////////////////////////////////////////////////
+    // Decoding helpers.
+    
////////////////////////////////////////////////////////////////////////////////
+
+
+}
diff --git 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/model/ModbusMessage.java
similarity index 70%
rename from 
plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
rename to 
plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/model/ModbusMessage.java
index b3e3e6b..a9fedb5 100644
--- 
a/plc4j/protocols/driver-base/src/main/java/org/apache/plc4x/java/base/connection/ChannelFactory.java
+++ 
b/plc4j/protocols/modbus/src/main/java/org/apache/plc4x/java/modbus/netty/model/ModbusMessage.java
@@ -16,15 +16,7 @@ KIND, either express or implied.  See the License for the
 specific language governing permissions and limitations
 under the License.
 */
-package org.apache.plc4x.java.base.connection;
-
-import io.netty.channel.Channel;
-import io.netty.channel.ChannelHandler;
-import org.apache.plc4x.java.api.exceptions.PlcConnectionException;
-
-public interface ChannelFactory {
-
-    Channel createChannel(ChannelHandler channelHandler)
-        throws PlcConnectionException;
+package org.apache.plc4x.java.modbus.netty.model;
 
+public class ModbusMessage {
 }
diff --git 
a/plc4j/protocols/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
 
b/plc4j/protocols/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
new file mode 100644
index 0000000..a199527
--- /dev/null
+++ 
b/plc4j/protocols/modbus/src/main/resources/META-INF/services/org.apache.plc4x.java.api.PlcDriver
@@ -0,0 +1,20 @@
+#
+# Licensed to the Apache Software Foundation (ASF) under one
+# or more contributor license agreements.  See the NOTICE file
+# distributed with this work for additional information
+# regarding copyright ownership.  The ASF licenses this file
+# to you under the Apache License, Version 2.0 (the
+# "License"); you may not use this file except in compliance
+# with the License.  You may obtain a copy of the License at
+#
+#   http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing,
+# software distributed under the License is distributed on an
+# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+# KIND, either express or implied.  See the License for the
+# specific language governing permissions and limitations
+# under the License.
+#
+org.apache.plc4x.java.modbus.ModbusTcpPlcDriver
+org.apache.plc4x.java.modbus.ModbusSerialPlcDriver
diff --git a/plc4j/protocols/pom.xml b/plc4j/protocols/pom.xml
index 49d2965..292c4ac 100644
--- a/plc4j/protocols/pom.xml
+++ b/plc4j/protocols/pom.xml
@@ -35,9 +35,12 @@
   <description>Wrapper project for all PLC4J protocol 
implementations.</description>
 
   <modules>
+    <module>driver-bases</module>
+
     <module>ads</module>
-    <module>driver-base</module>
+    <module>modbus</module>
     <module>s7</module>
+
     <module>benchmarks</module>
   </modules>
 
diff --git a/plc4j/protocols/s7/pom.xml b/plc4j/protocols/s7/pom.xml
index bbf0c43..a71d552 100644
--- a/plc4j/protocols/s7/pom.xml
+++ b/plc4j/protocols/s7/pom.xml
@@ -45,6 +45,11 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
+      <artifactId>plc4j-protocol-driver-base-tcp</artifactId>
+      <version>0.0.1-SNAPSHOT</version>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.plc4x</groupId>
       <artifactId>plc4j-core</artifactId>
       <version>0.0.1-SNAPSHOT</version>
       <scope>runtime</scope>
@@ -91,9 +96,8 @@
     </dependency>
     <dependency>
       <groupId>org.apache.plc4x</groupId>
-      <artifactId>plc4j-protocol-driver-base</artifactId>
+      <artifactId>plc4j-protocol-driver-base-test</artifactId>
       <version>0.0.1-SNAPSHOT</version>
-      <type>test-jar</type>
       <scope>test</scope>
     </dependency>
   </dependencies>
diff --git a/pom.xml b/pom.xml
index 1e90423..9c1b2f6 100644
--- a/pom.xml
+++ b/pom.xml
@@ -172,6 +172,11 @@
         <version>${netty.version}</version>
       </dependency>
       <dependency>
+        <groupId>io.netty</groupId>
+        <artifactId>netty-transport-rxtx</artifactId>
+        <version>${netty.version}</version>
+      </dependency>
+      <dependency>
         <groupId>junit</groupId>
         <artifactId>junit</artifactId>
         <version>${junit.version}</version>

-- 
To stop receiving notification emails like this one, please contact
cd...@apache.org.

Reply via email to